pax_global_header00006660000000000000000000000064117664044620014524gustar00rootroot0000000000000052 comment=864876c9158b35e468dc3c62f6f9320252ff2a80 md5deep-4.2/000077500000000000000000000000001176640446200127145ustar00rootroot00000000000000md5deep-4.2/AUTHORS000066400000000000000000000001411176640446200137600ustar00rootroot00000000000000md5deep was written by Jesse Kornblum Version 4 includes contributions from Simson L. Garfinkel md5deep-4.2/CONFIGURE_FC.sh000066400000000000000000000116521176640446200151460ustar00rootroot00000000000000#!/bin/sh cat < Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. md5deep-4.2/ChangeLog000066400000000000000000001310651176640446200144740ustar00rootroot000000000000002012-06-09 Jesse Kornblum : * src/tiger.h tiger.c: Replaced with newer code from libgcrypt. * configure.ac: Version bump to 4.2 2012-06-05 Jesse Kornblum : * src/dig.cpp: Cosmetic formatting. Fixed Win32 stat function. * src/display.cpp: Commented out vasprintf, which is now present on mingw * src/hashlist.cpp: Formatting. Revised to handle case where filename is a hash. * src/sha1_version.c: Removed vestigial code 2012-06-04 Jesse Kornblum : * src/hashlist.cpp: Formatting. Addressed bug with filenames with commas in them. 2012-05-20 Jesse Kornblum : * man/md5deep1,hashdeep.1: Fixed typo in -j mode 2012-02-27 Simson Garfinkel * src/dig.cpp (state::decode_file_type): removed from state, since it didn't use any of the instance variables. 2012-02-27 Jesse Kornblum : * main.cpp: Removed -B command line flag from all programs 2012-02-27 Jesse Kornblum : * man/md5deep.1: Added Simson to the AUTHORS section * src/main.cpp: Formatted usage messages * configure.ac: Version bump to 4.1.1 * Makefile.am: Added doc to directories cleaned with make nice 2012-02-26 Simson Garfinkel * src/main.h (d): fixed THREAD typo. * src/display.cpp: changed #if so that it checks for MINGW and not __MINGW_H * configure.ac (MINGW): now explicitly sets MINGW if we are compiling under mingw. 2012-02-10 Jesse Kornblum : * doc/start-hashdeep.html: Clarified how to run the programs. 2012-02-10 Jesse Kornblum : * sample-hashes/sample.{c,jpg}: Added Windows executable with non-executable extension * src/winpe.cpp, main.cpp, dig.cpp: Added comments * configure.ac: Version bump to 4.1 * src/*.cpp: Added $Id$ tags 2012-02-08 Jesse Kornblum : * src/dig.cpp, winpe.h, winpe.cpp, main.cpp: Added check for Windows PE files to expert mode. 2012-01-30 Jesse Kornblum : * src/display.cpp: Reverted previous change, but updated test for presence of vasprintf. 2012-01-29 Jesse Kornblum : * src/dig.cpp: Check for junction points before adding files to queue * src/display.cpp: Removed redefinition of vasprintf. It is apparently now part of the compiler's stdio.h 2012-01-28 Jesse Kornblum : * configure.ac: Version bump to 4.0.2-001 2012-01-28 Simson Garfinkel * src/display.cpp (display::dfxml_write): strange; sstream should have been stringstream. Well, it's fixed now. 2012-01-23 Simson Garfinkel * src/helpers.cpp: successfully removed itos(). 2012-01-22 Jesse Kornblum : * src/threadpool.h: Removed debugging fprintf * configure.ac: Version bump to 4.0.1 * NEWS: Updated for version 4.0.1 2012-01-21 Simson Garfinkel * src/hash.cpp (display::hash_stdin): added setmode stdin to binary on windows 2012-01-18 Jesse Kornblum * CONFIGURE_FC.sh: Removed FC16 checks. It doesn't work. 2012-01-16 Jesse Kornblum * CONFIGURE_FC.sh: Updated for Fedora Core 16. Improved error messages. 2012-01-09 Jesse Kornblum * Makefile.am: The doc files for Win32 were backward. Addresses bug 3471505. 2012-01-06 Jesse Kornblum * Makefile.am: Changed rule for converting man pages to Windows text files 2012-01-06 Jesse Kornblum * configure.ac: Version bump to 4.0.0 * src/hashlist.cpp: Legibility changes only. * doc/Makefile: Updating man page locations * src/common.h: Added NEWLINE definition for Win32 2012-01-05 Jesse Kornblum * doc: Sync'ed files from trunk 2011-12-27 Jesse Kornblum * src/files.cpp: Added spaces to isxdigit macro for OS X compilation. 2011-12-27 Simson Garfinkel * src/hashlist.cpp (hashmap::add_file): now makes a copy of the hex hash and assures that it is lower case. 2011-12-26 Simson Garfinkel * src/main.h (class state): removed h_nsrl15 variable. Now it always looks for nsrl15 files when trying to decode a hash file. 2011-12-20 Simson Garfinkel * tests/testfiles/Makefile.am (testfiles.zip): removed $FILES from release; now testfiles.zip is built as part of the release, and the FILES are in it. 2011-12-17 Simson Garfinkel * src/files.cpp (state::find_hash_in_line): removed ILOOK3 intentional fall through. Now we explicitly do it. * src/display.cpp (display::portable_gmtime): We needed a gmtime() in multiple locaitons that was portable and threadsafe, so we created this from the code that was previously in md5deep_display_hash. (file_data_hasher_t::compute_dfxml): hashdigest indent set to 0 from 2 if piecewise_size is 0 (display::dfxml_write): ctime, mtime, and atime now put in DFXML output. * src/dig.cpp (state::file_type): added support for mtime and atime. * src/main.h: changed fdht->timestamp to fdht->ctime. 2011-12-17 Simson Garfinkel * src/files.cpp (state::md5deep_load_match_file): replaced fprintf(stderr) with a cerr output. * src/hash.cpp (file_data_hasher_t::hash): removed assert(0) for invalid setting of iomode; now displays what the invalid setting is. 2011-12-16 Jesse Kornblum * tests/tests.sh: added test for BSD style hashes, iLook hashes 2011-12-04 Simson Garfinkel * src/display.cpp (dfxml_write): added filesize to DFXML output 2011-11-29 Simson Garfinkel * src/main.h (d): default I/O mode changed from memory-mapped to buffered (the same as the 3.x release.) Memory-mapped should be faster, but for some reason it isn't. Also it makes the memory usage appear quite large (it isn't, but the top and ps commands report mapped memory.) 2011-11-27 Jesse Kornblum : * src/main.cpp (hashdeep_process_command_line): Fixed getopt command so that -c mode takes an argument, but -C does not. The former caused a crash. * src/xml.h: Removed spurrious 'const' 2011-11-17 Simson Garfinkel * src/main.cpp (state::main): -j default was being set after option processing. Moved to before. -j0 now disables threading, -j1 is just one thread. 2011-11-07 Jesse Kornblum * tests/Makefile.am: Corrected test filenames to make dist 2011-11-01 Jesse Kornblum * configure.ac: Version bump to 4.0 beta1 2011-10-28 Simson Garfinkel * configure.ac (HAVE_PTHREAD): fixed for multithreading error on macos and linux (it wasn't turning on) 2011-10-26 Simson Garfinkel * configure.ac: beta counter incremented to beta2 * tests/tests.sh: added code for test 47 to cover new audit mode generating more output. * src/display.cpp (display::audit_update): audit output was going to cerr; should go to cout. * src/threadpool.cpp (ERR): changed from fprintf to cerr; added __noreturn__ attribute. * src/files.cpp (state::md5deep_load_match_file): file_type no longer shadows member of this. * src/xml.cpp (XML::comment): comment no longer shadows local member * src/dig.cpp (print_last_error): now uses cerr instead of fprintf; turns pszMessage into UTF8 * src/main.h (class display): added __attribute__ ((__noreturn__)) to internal_error(). * src/common.h (tstring): somehow we got a ; before the wstring. Removed it. 2011-10-25 Simson Garfinkel * src/dig.cpp (state::dig_self_test): added explicit cast to ft to avoid compiler warning. * src/main.h (class global): renamed class main to class global so that main() doesn't shadow main::main() (which doesn't exist) * src/main.cpp (state::hashdeep_process_command_line): renamed argc and argv to argc_ and argv_ so as not to shadow instance variables. * src/display.cpp (display::finalize_matching): removed known_size() as a local, since we have a function that does it. (display::compute_unused): renamed parameter from display to show_display to avoid compiler warning. * src/main.h (class display): renamed out to out_ so as not to shadow parameter. (std::vector): removed num_columns, as it wasn't being used outside the local function. 2011-10-17 Simson Garfinkel * src/xml.cpp (pop): added flush to out to make it easier for people to undestand status. 2011-10-15 Simson Garfinkel * src/display.cpp: removed #include * src/main.cpp: removed #include 2011-10-09 Simson Garfinkel * tests/tests.sh (TMP): renamed TEST_DIR to TEST_BIN and GOOD_DIR to GOOD_BIN 2011-10-09 Simson Garfinkel * configure.ac (HAVE_PTHREAD): quoted AX_PTHREAD in the configure script 2011-10-09 Simson Garfinkel * configure.ac: version number increased to 4.0.0_beta_001 * src/main.cpp (md5deep_usage): All programs now have a -C option that enables Common Crypto on Mac. It is disabled by default. You can use it if you want. Windows - All tests now pass, with the exception that the windows files now have proper UTF-8 in them rather than the question-mark escaping. You can escape the UTF-8 by providing the flags. You can run the tests.sh script with "--nounicode" to remove the filenames with unicode in them. Tests must be run within cygwin to get the bash script to work, but the md5deep/hashdeep executables themselves do not require cygwin and, in fact, ignore the DLL. Threading now works on windows again. I think that I finally got the configure script right. I have tested the CONFIGURE_FC.sh with a virgin FC15 ISO. You boot the ISO in VMWare and it creates a user called 'user'. You have to create a user that has root access. Once you do this and become root, run CONFIGURE_FC.sh. It will update the yum repository, download the mingw32 and mingw64 compilers, download and build pthreads, and then, just for kicks, it download the SVN repository and build the 32-bit and 64-bit executables. You can now run the executables with the '-hhh' option to print information about the build configuration and environment as well. I've added -B as a verbose flag for both md5deep and hashdeep. (-v is verbose in hashdeep but prints the version number in md5deep) Now, if you are in verbose mode, the DFXML will include the workerid= of the thread that created the results. This is useful for debugging to verify that each thread is actually hashing. 2011-09-27 Simson Garfinkel * src/display.cpp (dfxml_write): now writes workerid as an attribute in the fileobject output. * src/main.h (file_data_t): added worker_id to fdht * src/sha1.c (sha1_finish): added const to avoid casting warnings. 2011-09-25 Simson Garfinkel * src/tiger.c (hash_init_tiger): changed all functions to return void rather than int. * src/md5.c (hash_init_md5): all functions now return void rather than int. * src/whirlpool.c (hash_init_whirlpool): all functions now return void rather than int. * src/sha256.c (hash_final_sha256): all functions now return void rather than int * src/main.h (class algorithm_t): hashing functions modified to return void rather than int 2011-09-16 Simson Garfinkel * src/sha256.c (hash_init_sha256): added casts * configure.ac: added -fast and a ton of more warnings * configure.ac: now removes -fast flag if not optimizing * src/sha256.c (hash_update_sha256): added casts to avoid void *. * src/md5.c (hash_final_md5): added casts to avoid void *. * src/sha1.h: noted that SHA1Transform now takes a const buffer. * src/sha1.c (SHA1Final): added #define SHA1HANDSOFF so that it won't modify the buffer passed in. (hash_final_sha1): added casts to avoid void *. 2011-09-12 Jesse Kornblum * tests/tests.sh: Fixed typo 2011-09-11 Simson Garfinkel * configure.ac (INCLUDE_NP): added define for INCLUDE_NP * src/display.cpp (display_realtime_stats): removed setting shorten variable, since now we simply shorten where it is needed, rather than setting a variable and checking it elsewhere. * src/xml.cpp: moved defines of O_BINARY, et all, out of #ifdef * src/files.cpp (md5deep_load_match_file): removed setting status, because return code is now ignored. (errors in parse_encase_file are no longer reported) 2011-08-24 User * configure.ac: AM_CONFIG_HEADER changes to AC_CONFIG_HEADERS 2011-08-22 Jesse Kornblum * bootstrap-mingw.sh: Added support for mingw on Ubuntu 2011-08-22 Simson Garfinkel * src/display.cpp (display::error_filename): moved lock to around dfxml 2011-08-17 Simson Garfinkel * src/display.cpp (display::error_filename): error_filename now properly prints to DFXML 2011-08-14 Simson Garfinkel * src/main.h (d): added __attribute__ ((format(printf))) to all printf-like functions * src/display.cpp (error): removed print_error(), since it did the same thing that error() did. * src/main.h (d): added __attribute__ ((__noreturn__)) to fatal_error 2011-08-12 Simson Garfinkel * src/display.cpp (error): always puts progname on error now. removed explicit "%s: " and progname from practially every place error was called. 2011-08-09 Simson Garfinkel * src/main.h (std::vector): changed hashmap from a map to a multimap 2011-08-07 Jesse Kornblum * man/md5deep.1: Updated version number * man/hashdeep.1: Restored to earlier version * man/Makefile.am: Corrected clobbering of hashdeep man page * src/Makefile.am: Corrected typo in the symbolic linking * src/ui.cpp: Vestigial file removed 2011-08-01 Simson Garfinkel * src/main.h (class file_data_hasher_t): moved read_offset and read_len from file_data_t to file_data_hasher_t (class file_data_hasher_t): moved timestamp from file_data_t to file_data_hasher_t * src/display.cpp (file_data_hasher_t::compute_dfxml): fdht->dfxml_hash is now a string stream * src/hash.cpp (file_data_hasher_t::hash): whoops; dfxml had old bytes=; replaced with len=; 2011-07-31 Simson Garfinkel * src/hash.cpp (display::hash_stdin): sets stat_bytes to SIZE_T_MAX when hashing stdin. 2011-07-27 Simson Garfinkel * src/main.h (class display): added conditional defines so that wstring stuff isn't compiled on mac 2011-07-27 Simson Garfinkel * configure.ac: now compiles with and without PTHREAD, and on win32 and win64 updated version to 4.0.0_alpha_001 * src/hash.cpp (hash): triage mode no longer works on stdin 2011-07-26 Simson Garfinkel * src/main.cpp (main): main is now a method of state. 2011-07-22 Simson Garfinkel * src/hash.cpp (display::hash_stdin): removed is_stdin because we can just compare handle to stdin. * src/dig.cpp (have_processed_dir): cycle system no longer public; now it's static. (should there be a dig class?) 2011-07-21 Simson Garfinkel * src/files.cpp (shift_string): moved to files.cpp, the only place where it is used. * src/main.cpp (check_wow64): moved to main.cpp * src/files.cpp (find_comma_separated_string): moved from helpers.cpp to files.cpp and made static. * src/main.cpp (state::md5deep_process_command_line): -f option removed sincei t was not properly implemented and doesnt appear to have been used. 2011-07-21 Simson Garfinkel * src/Makefile.am: removed md5deep.h and md5deep_match.h 2011-07-20 Simson Garfinkel * src/main.cpp (state::md5deep_process_command_line): removed mode_piecewise, since it can be determined from picewise_size>0. * src/main.h (class state): moved primary_function into display 2011-07-19 Simson Garfinkel * src/main.h (enum): added status_EXIT_FAILURE to status_t as status_t is now returned. 2011-07-19 Simson Garfinkel * src/display.cpp: the only place that filename shortening was done was in display_realtime_stats, so all of the filename shortening logic was moved there and it was moved out of display_filename everywhere else. The passage of the FILE * to display to was put back in, becuase display_filename was also being used to display error messages. 2011-07-18 Simson Garfinkel * src/main.h (mode_which): changed mode_which to opt_show_matched (which is the default) 2011-07-18 Simson Garfinkel * src/display.cpp (display_size): changed mode_csv to opt_csv 2011-07-14 Simson Garfinkel * src/common.h: removed STRINGS_CASE_EQUAL. 2011-07-13 Simson Garfinkel * src/hash.cpp (hash): successfully removed the state variable from compute_hash. * src/display.cpp (display_realtime_stats): moved output of realtime_stats from file_name_annotation to a seperate output, so that display_realtime_stats can now take a const file_data_hasher. * src/hash.cpp: changed update_display to display_realtime_stats() and moved to display.cpp 2011-07-10 Simson Garfinkel * src/sha1.c: removed copy on all algorithms except sha1; that copy is now done within the sha1 update function, where it should be. * src/md5.h: all update functions modified to take size_t as the length, becuase you can't pass a size larger than size_t. 2011-07-07 Simson Garfinkel * src/dig.cpp (process_dir): modified conditional compilation for WIN32 2011-07-05 Simson Garfinkel * src/helpers.cpp: moved setup_expert_mode to main.cpp, because it's actually helping to parse the command line. removed my_basename, since it is now done on strings in dig.cpp 2011-07-05 Simson Garfinkel * Makefile.am (SUBDIRS): hashdeep subdir renamed to be src, since it is now src for everybody. 2011-07-04 Simson Garfinkel * hashdeep/main.cpp: added conditional to use built-in __progname if compiling under WIN32 * hashdeep/Makefile.am (hashdeep_SOURCES): removed tchar-local.h and added wstring.h * hashdeep/dig.cpp (clean_name): changed mode_relative to opt_relative 2011-07-03 Simson Garfinkel * hashdeep/dig.cpp (should_hash_symlink): changed stat structure from _tstat_t to _tstati64 * configure.ac: added -DWINVER=0x0500 to get Windows UTF-8 conversion. mingw targets for 0x0400 ( * hashdeep/main.h (std::vector): file_type_t changed to hashfile_format, since that describes what it actually is. * hashdeep/Makefile.am (hashdeep_SOURCES): removed cycles.cpp. * hashdeep/dig.cpp (have_processed_dir): moved cycles.cpp into dig.cpp (because it's so much smaller now). 2011-07-01 Simson Garfinkel * hashdeep/display.cpp (state::md5deep_display_hash): now uses gmtime_r for threadsafety * hashdeep/hash.cpp (hash::hash_stdin): hash_file() and hash_stdin() are now methods. 2011-06-29 Simson Garfinkel * hashdeep/common.h: moved sys/cdefs.h from tchar-local.h to common.h; added #ifdef 2011-06-24 Simson Garfinkel * hashdeep/main.h: make_newline changed to print_newline(). No longer takes state. mode_zero changed to opt_zero. 2011-06-24 Simson Garfinkel * tests/tests.sh: now passes all tests * hashdeep/display.cpp (display_match_result): fixed so that it works now. * hashdeep/hashlist.cpp (hashlist::search): fixed search function so that it returns status_no_match when there is no match. 2011-06-22 Simson Garfinkel * hashdeep/main.cpp: removed strsep 2011-06-21 Simson Garfinkel * hashdeep/files.cpp (state::find_plain_hash): although this function takes the approach of hacking C strings with an axe, it seems to work. * hashdeep/main.cpp (algorithm_t::valid_hash): fixed function. 2011-06-20 Simson Garfinkel * hashdeep/hash.cpp (hash_file): eliminated by_basename, instead we now use rfind on the string. 2011-06-19 Simson Garfinkel * hashdeep/Makefile.am (hashdeep_SOURCES): removed md5deep_hashtable.cpp and md5deep_hashtable.h (hashdeep_SOURCES): removed md5deep_match.cpp * hashdeep/md5deep_match.cpp (md5deep_load_match_file): expected_hashes, used in parsing EnCase hash files, is now segregated to the EnCase file parsing routines and no longer in the state variable. 2011-06-18 Simson Garfinkel * hashdeep/Makefile.am (hashdeep_SOURCES): removed strsep; no longer needed. * hashdeep/main.cpp (process_command_line): mode_verbose, mode_more_verbose and mode_insanely_verbose now replaced with a global variable opt_verbose which has value of 0, 1, 2 or 3. * hashdeep/main.h: print_error no longer takes state. * hashdeep/ui.cpp (fatal_error): fatal_error no longer takes state; mode_silent is now a global variable. Otherwise, EVERYTHING that can generate a printout needs to pass a pointer to state, which defeats the purpose of encapsulation. (If we ever want to have two different state instances in memory at the same time, is it likely that they will have different modes? I think not.) (print_error_unicode): no longer takes (state *s) * hashdeep/common.h (filetype_t): moved to hashlist class. * hashdeep/main.h (hashlist): status_t broken up to hashlist::loadstatus_t and hashlist::search_status_t. * hashdeep/main.cpp (process_command_line): load_match_file() call changed to known->load_hash_file() since the database of known hashes is now kept in a hashlist. 2011-06-17 Simson Garfinkel * hashdeep/hash.cpp (hash_file): largely removed s->current_file; it is now a file_data_hasher_t pointer. 2011-06-16 Simson Garfinkel * hashdeep/main.cpp: removed initialize_state(state *s); now it's in the state constructor. (state::load_hashing_algorithms): this is now a method * hashdeep/Makefile.am (hashdeep_SOURCES): removed hashtable.cpp * hashdeep/main.h (class file_data_t): created file_data_hasher_t to hold the actual variables needed to perform the hashing; only file_data_t is stored in the hashmap_t. 2011-06-15 Simson Garfinkel * hashdeep/main.h (class file_data_t): removed full_name, as it is redundent with file_name * hashdeep/multihash.cpp (multihash_update): moved hash_sum and hash_context from algorithm_t structure to file_info_t structure. * hashdeep/main.h: removed state *s backpointer. ALGORITHM_NAME_LENGTH changed to MAX_ALGORITHM_NAME_LENGTH and ALGORITHM_CONTEXT_SIZE changed to MAX_ALGORITHM_CONTEXT_SIZE. 2011-06-14 Simson Garfinkel * hashdeep/main.h: changed hashname_t to hashid_t becuase it is an id number, not a name. 2011-06-14 Simson Garfinkel * hashdeep/main.h: removed __BEGIN_DECLS and __END_DECLS; we are now a C++ program! * hashdeep/hash.cpp: moved shorten_filename to display.cpp becuase the shortened filenames are just used in a particular case. we can set a flag to print them and generate them on the fly. 2011-06-12 Simson Garfinkel * hashdeep/main.cpp (main): s->cwd is now pre-allocated * hashdeep/main.h (class file_data_t): timestamp moved to current_file * hashdeep/multihash.cpp (multihash_update): moved *buffer from dynamic allocation to allocated withn the current_file. * hashdeep/hash.cpp (hash_stdin): moved full_name,short_name and msg into current_file * hashdeep/md5deep_match.cpp (parse_encase_file): increased buffer[] from 19 bytes to 64; why be stingy? It's no longer dynamically allocated. (parse_encase_file): increased result from dynamically allocated at s->hash_length*2 to 1024. 2011-06-11 Jesse Kornblum * display.cpp (display_size) Removed ten character limit on displayed sizes. We now display the full size regardless of mode. 2011-06-07 Simson Garfinkel * hashdeep/files.cpp (hash_file_type): known_fn changed from char * to char[PATH_MAX+1] * hashdeep/main.h (class state): time_str is now a local variable, not in state. * hashdeep/main.cpp (main): state and the other structures defined in main.h are now classes. 2011-06-04 Simson Garfinkel * hashdeep/hash.c (hash): s->full_name and tmp_name are now statically allocated arrays, rather than dynamcially allocated. 2011-06-02 Simson Garfinkel * md5deep/Makefile.am (INCLUDES): removed references to -lm as we no longer use floor. * hashdeep/hashdeep.cpp (main): renamed to main.cpp 2011-06-01 Simson Garfinkel * md5deep/hashTable.c: renamed to hashdeeb/md5deep_hashtable.c * man/Makefile.am: moved all man pages into the man directory. 2011-06-01 Simson Garfinkel * hashdeep/sha1.c: made sha1.c include sha1.h but not main.h 2011-05-31 Simson Garfinkel * configure.ac: changed version number to 4.0.0_alpha_000 * hashdeep/Makefile.am (hashdeep_SOURCES): simplified list of files * hashdeep/common.h: __progname is now always extern; on systems that are not GLIBC we include progname.c * configure.ac: moved all includes from include/* to hashdeep; there is no reason to have an include/ directory since we are not building a library. * configure.ac: added AC_PROG_CXX * hashdeep/Makefile.am (hashdeep_SOURCES): renamed main.c to hashdeep.cpp. Yes, we are now a C++ program! 2011-05-31 Simson Garfinkel * md5deep/display.c: changed #include "main.h" to #include "md5deep.h" * hashdeep/main.c: now includes md5deep.h if compiled for MD5DEEP, and main.h if compiled for hashdeep * md5deep/md5deep.h: to avoid the name conflict, md5deep/main.h was renamed md5deep/md5deep.h * hashdeep/hash.c: changed to use #ifdef MD5DEEP, which is now -D defined by md5deep/Makefile.am * hashdeep/Makefile.am (COMMON_SRC): updated to indicate that hash.c, dig.c, cycles.c, ui.c, helpers.c, md5.c, sha1.c, sha256.c, tiger.c, whirlpool.c now reside in this directory * md5deep/Makefile.am (whirlpooldeep_SOURCES): moved hash.c, dig.c, cycles.c, ui.c, helpers.c, md5.c, sha1.c, sha256.c, tiger.c, whirlpool.c from common/ to hashdeep/. Updated Makefile.am * configure.ac: added initial comments as part of makefile changing. The idea is to move C programs from common/ to hashdeep/ in preparation for removing 'common' and 'md5deep' entirely and folding all of the functionality into the hashdeep program. 2011-05-23 Jesse Kornblum * Resolved bug 3307444 regarding the prefix type for multipliers. We're using IEC multipliers. Also, spelled multipliers correctly. * Fixed a bug in find_bsd_hash, bug 3309339, to address when a file of known hashes has a set of parenthesis. The find_bsd_hash function was munging the line. 2011-04-23 Jesse Kornblum * More cosmetic changes, this time to print correct offsets for a zero-byte file being processed from stdin in piecewise mode. 2011-04-22 Jesse Kornblum * Cosmetic bug fix in hash.c to avoid calling ftell when processing standard input. 2011-04-21 Jesse Kornblum * Released version 3.9 with critical bug fix, 3290190. * Added hashdeep64.exe to the CLEANFILES 2011-04-20 Jesse Kornblum * Version bump to 3.9-001 * Added int _CRT_fmode = _O_BINARY; to hashdeep/main.c to address bug 3290190, regarding processing stdin in hashdeep. 2011-04-01 Jesse Kornblum * Version bump to 3.8-002 * Experimenting with x64 compilation. Changed _tprintf calls in md5deep/display.c to regular printf to fix problem with missing displayed data. * Commented out definition of _WIN32_WINNT in tchar-local.h. The x64 compiler seems to have this already for us. * Attempting to compile with x84_64-w64-mingw32 compiler. 2011-03-22 Jesse Kornblum * Version bump to 3.8-001 * Fixed cosmetic bug for -p mode, SF bug 3234714. 2010-12-15 Jesse Kornblum * Re-engineered how file sizes and reads are computed. The inital guess of a file's size, via stat(2), is now stat_bytes (and stat_megs). For each call of hash(), we record the offset where we started, read_start, and the offset where we ended, read_end. These mostly are for piecewise mode. We also record actual_bytes, the total number of bytes we read and hashes from the disk from the whole file. * Added some error checking to realpath() calls in common/{cycles,helpers}.c 2010-11-29 Jesse Kornblum * Fixed typo in hashdeep audit message 2010-11-23 Jesse Kornblum * Renamed triage mode to more generic version * Modified triage mode to use ASCII, not Unicode tabs * Changed 'make world' directive to be based on Linux Mingw32 compiler, i586-mingw32msvc * Added conditional Unicode defines to tchar-local.h 2010-11-22 Jesse Kornblum * Added Input/Output error to list of fatal errors when reading files. 2010-11-19 Jesse Kornblum * Added -Z flag for Triage mode * Added some more error checking in md5deep/main.c functions * Version bump to 3.7-002 2010-06-24 Jesse Kornblum * Fixed return value in my_basename to reflect no error when the input does not need any modifications. Addresses bug 3014396. * Version bump to 3.7-001 2010-03-23 Jesse Kornblum * Version bump to 3.6 and release * Documented expert mode in hashdeep man page, getting started guide. Also made a few tweaks to the md5deep documentation. * Added some error checking routines to helpers 2010-03-06 Jesse Kornblum * Cleaned up md5deep/main.h comment styles. Also added a field to the state variable to keep track of the file's type. This is was handy for... * Updating file size computation to use results of stat operation normally done anyway during dig phase. 2010-02-26 Jesse Kornblum * Adding 'expert' mode from md5deep to hashdeep. 2010-02-25 Jesse Kornblum * Changed all contact email addresses to research account at jessekornblum.com. The 'md5deep' account will be deprecated. 2010-01-09 Jesse Kornblum * Finished updating download links. Updated and published Hashdeep quick start guide 2009-12-30 Jesse Kornblum * Converting documentation update to use rsync+ssh to upload content 2009-12-29 Jesse Kornblum * Version bump to 3.5.1 * Attempting to fix bug 2922415 involving zero byte files * Added a few items to the TODO list * Started web page cleanup 2009-12-21 Jesse Kornblum * Attempting to fix bug 2919014 regarding hashdeep and its failure to detect when files go missing during an audit if there is another, identical file in a different location * Cleanup on md5deep code for -f mode * Revised list of new features for release 3.5 2009-09-24 Jesse Kornblum * Again revised patch 2855502 to handle the last read of files/stdin when no data is read. This happens when the file size is an exact multiple of the piecewise size. 2009-09-16 Jesse Kornblum * Updated broken link on web page for Whirlpool. 2009-09-09 Jesse Kornblum * Applied a modified version of patch 2855502 to fix file size computation for piecewise hashing of stdin. 2009-07-11 Jesse Kornblum * Added draft of Hashdeep Getting Started guide 2009-07-10 Jesse Kornblum * Fixed method to read list of files to hash from a file. 2009-06-14 Jesse Kornblum * Experimenting with reading list of files to hash from another file in md5deep. 2009-05-22 Jesse Kornblum * Closed search handle in is_junction_point in response to bug 2795587. * Attempting to fix -n mode by removing check in is_known_hash for NULL parameters. 2009-04-10 Jesse Kornblum * Experimenting with stopping file read on "Invalid argument" errors to avoid crashes on Win32. 2009-04-04 Jesse Kornblum * Version bump to 3.3 and released. 2009-03-26 Jesse Kornblum * Updated timestamp code to support 64-bit functions on Windows. 2009-03-01 Jesse Kornblum * Experimenting by skipping *all* junction points on Windows. We'll display a message with 'unknown' status values. * Version bump to 3.3-002. 2009-02-08 Jesse Kornblum * Removed email address from all files. Too many spammers, sorry. 2009-01-26 Jesse Kornblum * Cleaned up code for version 3.2 release. Commented out NTFS junction point detection for now. * Applied patch 2535551 to Makefile.am to use LDADD variable instead of AM_LDFLAGS. 2009-01-25 Jesse Kornblum * Added experimental CSV mode, -c 2009-01-16 Jesse Kornblum * Switching from /* comments to // comments in code to allow for commenting out whole functions when necessary. * Added sanity checking to helper functions, changed some variable names from single character values to more descriptive names. 2009-01-15 Jesse Kornblum * Removed vestigial code from include/md5.h and the other algorithms in that directory. This was code that had been commented out for a while now. * Updated email address in this ChangeLog for all entries. * Added include directory to the 'make preflight' directive 2009-01-14 Jesse Kornblum * Fixed chop_line call against uninitialized variable in hashdeep/match.c. Added sanity checking to chop_line to keep this from happening again. * Added file format documentation for hashdeep. 2009-01-09 Jesse Kornblum * Changed hashdeep to break long command lines into multiple lines in the headers of known files. Not doing so leads to problems with extremely long lines. Those lines end up as (harmless) warnings about bad hashes. See bug report 2496029 for more details. 2009-01-08 Jesse Kornblum * Added detection and avoidance of NTFS Junction Points to avoid infinite loops on Windows systems. See bug report 2492520 for more details. * Updated email address in AUTHORS file. 2008-10-22 Jesse Kornblum * Rewrote the parsing of known files in hashdeep in response to bug 2184219 relating to filenames with commas in them. We now determine the expected number of columns from the header and use that to parse the remainder of the file. This should eventually allow us to remove our dependency on strsep. * Fixed a minor hashdeep bug where hashes were considered invalid if they contained too few characters, but not too many. 2008-09-25 Jesse Kornblum * Updated hashdeep usage message to reflect that MD5 and SHA-256 are the default algorithms used, not SHA-1. 2008-09-23 Jesse Kornblum * Changing stat functions on Windows to handle 64-bit file sizes (i.e. call _tstat64 instead of _tstat) 2008-09-14 Jesse Kornblum * Experimenting with new time estimation calculation 2008-08-13 Jesse Kornblum * Updated contact email addres and reconfigured. * Applied patch 2026326 to fix VPATH build for manpages. 2008-07-27 Jesse Kornblum * Reconfigured with latest tools 2008-07-20 Jesse Kornblum * Removed debugging code accidently left in files.c: find_rigid_hash function. 2008-07-18 Jesse Kornblum * Updated documentation to reflect Cygwin Ports support. * Modified file_type function to record the file size of each file processed. This should eliminate the need to call stat again or the ioctl functions in hash.c and hopefully speed up the program. * Added timestamp to the output for size mode per Feature Request 2014686. This should be the creation time on Win32, change time for all other operating systems. * Removed 'Experimental cast' tags from SHA256 and Tiger hashing code. They appear to be working. * In response to bug 2022302, updated time estimate display to handle large time values, including those more than one day. 2008-07-04 Jesse Kornblum * Added -I mode to display filenames with asterisks for hashes when size is above threshold. Compliments -i mode. 2008-07-04 Jesse Kornblum * Removed SF Community Choice Awards from web page. The nominations are closed. * Added size mode, -i, to only process files smaller than a given size threshold. Reused code from piecewise mode to parse user input. Added to md5deep and hashdeep. Added to SF at Feature Request 2010771. 2008-05-17 Jesse Kornblum * Applied patch 1961973 to fix man page installation. 2008-04-18 Jesse Kornblum * Updated files.c et al to handle iLook version 4 hashes. These are similar enough that we can reuse most of the iLook v3 routines. 2008-04-17 Jesse Kornblum * Updated initial kludge to use iLook version 3 hashsets. * The current version crashed on OpenSolaris during a malloc in main.c. This is confusing as I wasn't working on this code. 2008-04-16 Jesse Kornblum * Updated md5deep to use iLook version 3 hashes. 2008-03-29 Jesse Kornblum * Changed WSTRINGS_EQUAL macro to make case sensitive comparisons Changed case insensitive char comparsion macro to STRINGS_CASE_EQUAL. * Fixed audit mode to return nonzero value for failed audit * Fixed hashdeep known file import to only display errors once 2008-03-28 Jesse Kornblum * Noted WSTRING_EQUAL macro is case insensitive in a spot where we need it to be case sensitive. 2008-03-20 Jesse Kornblum * Added ability for hashdeep to detect and ignore badly formatted lines in files of known hashes. 2008-03-19 Jesse Kornblum * Added phrase "and compare" to manpage description of the programs. This will hopefully reinforce the idea that md5deep cannot be replaced with one line of shell. 2008-03-18 Jesse Kornblum * Added doc directory to hold FAQ and other web pages 2008-03-16 Jesse Kornblum * Added missing space to hash collision message in audit.c * Changed default behavior to always print hash collisions 2008-03-13 Jesse Kornblum * Updated make world directive to make Windows package * Updated COPYING to note more than one file under GPL * Changed md5deep Makefile to explicitly name man man pages in copy operation. * Moved prototypes for process_normal and process_win32 to include/common.h to avoid compiler warnings and repitions. * Cleaned up audit code slightly * Fixed display banner to treat current working directory as a Unicode string. * Enabled and allowed the user load known files that have different kinds of hashes in them. * Version bump to 3.0. I've made so many changes to the common code that it warrants the jump. 2008-03-12 Jesse Kornblum * Added strsep (and appropriate autoconf/automake checks) in place to ugly homebrew code to separate out string values. This is for one instance in match.c, need to update the others. * While reading files on known hashes, convert filenames to Unicode before storing. * Changed NEWLINE on Win32 to be just "\n" instead of "\r\n" There was a problem using files of known hashes and reading the file header. * Fixed parameters to and error checking from call to MultiByteToWideChar in match.c. Not only we were passing in the wrong values, but we were always error'ing out. * Starting to update man page, TODO * Moved piecewise parsing code from md5deep/main.c to common/helpers.c. Enabled piecewise mode in hashdeep. Also moved definition of _state to include/common.h. * Added comments to configure.ac and Makefile.am * Made usage message dynamic to display available algorithms 2008-03-11 Jesse Kornblum * Separated the functions to display positive and negative match results. Cleaned up the function names for this too. Also updated audit mode so that it appears to work. * Documented -M and -X mode in usage message. * Updated file_* types used in include/common.h to avoid the conflict with file_unknown. Moved filetype_t to include/common.h as well. * Starting to write code to load files of known hashes * Fixed obscure bug in md5deep/files.c when checking for EnCase hash files when loading a very small known file. 2008-03-07 Jesse Kornblum * Updating audit mode to not use is_known_file function. This should help make the code cleaner. * Fixed file_data_compare to handle files where the first hash doesn't match but the rest of them do. * Added WSTRINGS_EQUAL(A,B) macro to compare two TCHARs. 2008-03-06 Jesse Kornblum * Reworked hashtable code to return a linked list of file_data_t values, complete with status values. This required me to slightly alter how the program stores the computed hashes. The current version works, but is ugly as all get out. It's a great proof of concept, that's all. 2008-03-04 Jesse Kornblum * Working on hashdeep matching, auditing code * Added a file_data_t, known, to the hashdeep state variable 2008-03-04 Jesse Kornblum * Added spaces to recorded command line in output files. 2008-02-22 Jesse Kornblum * Moved source code from CVS to Subversion repository. This shouldn't create any changes in the code, but should be noted. * Version change to 2.1. No need for -001 anymore. 2007-12-27 Jesse Kornblum * Fixed hashdeep current working directory and filesize display when hashing standard input. 2007-12-11 Jesse Kornblum * Got multihashing working. It turns out that the SHA-1 update code modifies the buffer that its passed. 2007-12-08 Jesse Kornblum * Moved hash.c into the common code directory, adapting it to work with both md5deep and hashdeep code. Moved display code to a separate file. * First working version of hashdeep! 2007-12-08 Jesse Kornblum * Updated hashing headers to only be included once. Included all hashing headers in common.h * Modified hashing code to pass hashing context only into hashing code. This requires void pointers, but avoids the hashing code having to deal with the state at all. * Moved md5deep man pages into the md5deep directory 2007-12-07 Jesse Kornblum * Separated md5deep and hashdeep projects into separate directories. Moved common code into include and common directories. Man pages moved into man. It doesn't all work just yet, but we're getting close. 2007-12-06 Jesse Kornblum * Added common.h and ui.h to Makefile.am so that they are included in a distribution. * Copied more variables from md5deep source code to hashdeep state. * Updated hashdeep usage message * Version bump to 2.1-002 2007-12-05 Jesse Kornblum * Reverting back to main.c and main.h from version 2.0.1. Starting over on code for hashdeep * Moved common header functions to common.h * Created new files ui.h and audit.h to help reuse code in hashdeep * Updated procedure to make README.TXT (Windows distribution readme file) in Makefile.am so that it only has one copy of the man page, not five. 2007-10-31 Jesse Kornblum * Added stub for hashdeep program * Moved state type out of main.h and into deep.h 2007-10-28 Jesse Kornblum * Added additional checks in find_file_size to account for older Linux systems that don't have all of the necessary ioctl calls. 2007-10-16 Jesse Kornblum * Incorporated patch from Yaakov Selkowitz to handle man page copying when build dir is not the same as source dir. (Sourceforge tracker #1814253) 2007-09-26 Jesse Kornblum * Added second ioctl call in Linux version of find_file_size to get the true sector size; don't just assume 512 byte sectors. * Changed fseek call in hash.c to fseeko for large file support * Removed spurrious -u: from getopt call in main.c * Removed function checks from configure.ac. We weren't using them to build support, so we shouldn't waste time checking for them. 2007-09-25 Jesse Kornblum * Created new function print_error_unicode to handle errors encountered while processing files with (possibly) Unicode characters in their filenames. * Added AC_SYS_LARGEFILE to configure script to account for large files on Linux. This fixes the file estimation mode (-e) for Liunx. * Fixed find_file_size for block devices on OS X. 2007-09-24 Jesse Kornblum * Updated error display for Unicode filenames in dig.c * Fixed expert mode due to 64-bit values in int returns 2007-09-23 Jesse Kornblum * Reverted back to old method of installing man pages. When make install is invoked, current md5deep.1 is copied over other man pages, which are all then installed normally. 2007-09-22 Jesse Kornblum * Switched to GNU autotools * Moved list of past changes to NEWS file md5deep-4.2/FILEFORMAT000066400000000000000000000042301176640446200142660ustar00rootroot00000000000000 HASHDEEP FILE FORMAT VERSION 1.0 1. INTRODUCTION This file documents the hashdeep file format. These files are generated by hashdeep and contain a list of names, hashes, and sizes of files. This documentation pertains to version 1.0 of the file format and was last updated on 14 Jan 2009. 2. REVISION HISTORY 14 Jan 2009 - Initial version (jk) 3. FILE HEADER The first line of the file is a header, like this: %%%% HASHDEEP-1.0 This line identifies the version of the file format being used, not necessarily the version of the hashdeep program. The second line starts with four percent signs (%%%%) and then identifies the columns in the remainder of the file. The first column must be the file size and the last column must be the filename. Legal values for the other columns are the names of the supported hash algorithms. These names are: md5, sha1 or sha-1, sha256 or sha-256, whirlpool, and tiger. No other column names are supported. There should be a space between the percent signs and the first column name, but no spaces between the column names themselves. Note also that filename is one word. Here is a sample second line: %%%% size,md5,sha256,filename 4. COMMENTS Any line after the header that begins with a pound sign (#) is considered a comment and ignored. The hashdeep program normally inserts several lines of comments noting from which directory the program was invoked, the command line used to invoke it, and a blank comment line. 5. KNOWN FILES After the comments are the known files. Each line should contain a series of comma separated values corresponding to the columns listed in the file header. Thus the first column must always be the file's size and the last column must be filename. None of the values should be quoted. If there are more commas than expected, the additional commas are considered part of the filename. Using the file header from above, here is a sample set of lines: 3184,bf4956fabeea95b002c53fedbe10204d,49c3a0a53815d1d87bf9f481e96bee6b5e8494f7465653a4c3d45853cfcae7a7,/home/jessek/bar 16382,1ba3d8b07d7a103a3bbc7227a0174f91,b48aa24698f3429467c8c0c1e83c9ef609636803918b661bd03fbede017849d1,/home/jessek/foo md5deep-4.2/INSTALL000066400000000000000000000220241176640446200137450ustar00rootroot00000000000000Copyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== These are generic installation instructions. 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 only 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. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. 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. 4. Type `make install' to install the programs and any data files and documentation. 5. 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. 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=c89 CFLAGS=-O2 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 must use a version of `make' that supports the `VPATH' variable, such as 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 `..'. If you have to use a `make' that does not support the `VPATH' variable, you have 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. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' 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. 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'. Optional Features ================= 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. 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 `--target=TYPE' option 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 will cause the specified gcc to be used as the C compiler (unless it is overridden in the site shell script). `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--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. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. md5deep-4.2/Makefile.am000066400000000000000000000055731176640446200147620ustar00rootroot00000000000000SUBDIRS = src tests man tests/testfiles # These prefixes are for compiling on FC15 CROSS32_PREFIX = i686-w64-mingw32 CROSS64_PREFIX = x86_64-w64-mingw32 # on Mac, you may want this instead: # CROSS_PREFIX = i386-mingw32 EXTRA_DIST = FILEFORMAT config.guess config.sub m4/ax_pthread.m4 CONFIGURE_FC.sh nice: rm -f *~ man/*~ src/*~ doc/*~ preflight: grep RBF */*.{c,cpp,h,1} doc/* AUTHORS README NEWS TODO ChangeLog todo: @grep TODO *.c *.h ${man_MANS} AUTHORS README NEWS ChangeLog @echo @echo From TODO file: @cat TODO win32: make distclean ./configure --host=$(CROSS32_PREFIX) make /bin/rm -f /tmp/strings.txt strings src/md5deep.exe > /tmp/strings.txt if grep pthreadGC2.dll /tmp/strings.txt ; then echo not statically linked ; exit 1; fi win64: make distclean ./configure --host=$(CROSS64_PREFIX) make /bin/rm -f /tmp/strings.txt strings src/md5deep.exe > /tmp/strings.txt if grep pthreadGC2.dll /tmp/strings.txt ; then echo not statically linked ; exit 1; fi mv src/md5deep.exe src/md5deep64.exe mv src/sha1deep.exe src/sha1deep64.exe mv src/sha256deep.exe src/sha256deep64.exe mv src/tigerdeep.exe src/tigerdeep64.exe mv src/whirlpooldeep.exe src/whirlpooldeep64.exe mv src/hashdeep.exe src/hashdeep64.exe strip32: $(CROSS32_PREFIX)-strip src/*.exe src/*.exe strip64: $(CROSS64_PREFIX)-strip src/*64.exe windist: @echo @echo Making win32 @echo svn update rm -rf $(distdir).zip $(distdir) src/*.exe mkdir $(distdir) make win32 make strip32 cp src/*.exe $(distdir) @echo ==================================== @echo @echo Making win32 make win64 make strip64 make man/hashdeep.txt man/md5deep.txt cp src/*.exe $(distdir) @echo ==================================== @echo @echo Creating ZIP archive @echo zip -r9 $(distdir).zip $(distdir) @echo Adding text files to $(distdir).zip cp NEWS $(distdir)/CHANGES.txt cp COPYING $(distdir)/COPYING.txt cp FILEFORMAT $(distdir)/FILEFORMAT.txt cp man/md5deep.txt $(distdir)/MD5DEEP.txt cp man/hashdeep.txt $(distdir)/HASHDEEP.txt rm man/md5deep.txt man/hashdeep.txt zip --to-crlf $(distdir).zip $(distdir)/*.txt rm -rf $(distdir) $(WINDOWSDOCS) MD5DEEP.1 HASHDEEP.1 @echo "*************************" @echo "*** THE WORLD IS MADE ***" @echo "" ls -l $(distdir).* @echo "" @unzip -l $(distdir).zip wintest: @echo Will create md5deep-wintest.zip, a zip file that @echo provides for full testing on Microsoft Windows with Cygwin installed. make windist zip md5deep-wintest.zip -9 $(distdir).zip tests/* tests/*.zip tests/*.sh tests/testfiles/ tests/testfiles/*txt tests/testfiles/*/*txt tests/testfiles/*/*/*txt world: svn update @echo meta-build system. @echo Making both Linux and Windows distributions make distclean ./configure CFLAGS="-Wall -W -g -ggdb -O0" make dist make windist CLEANFILES = man/md5deep.txt man/hashdeep.txt SUFFIXES = .txt .1 .1.txt: man $< > $@ md5deep-4.2/Makefile.in000066400000000000000000000605751176640446200147760ustar00rootroot00000000000000# 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@ subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ TODO config.guess config.sub depcomp install-sh missing \ mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.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 = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = 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 dist dist-all distcheck ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) 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 GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ 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@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ 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@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = src tests man tests/testfiles # These prefixes are for compiling on FC15 CROSS32_PREFIX = i686-w64-mingw32 CROSS64_PREFIX = x86_64-w64-mingw32 # on Mac, you may want this instead: # CROSS_PREFIX = i386-mingw32 EXTRA_DIST = FILEFORMAT config.guess config.sub m4/ax_pthread.m4 CONFIGURE_FC.sh CLEANFILES = man/md5deep.txt man/hashdeep.txt SUFFIXES = .txt .1 all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .txt .1 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): 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 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 # 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) config.h.in $(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) 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: ctags-recursive $(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) $(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 -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 $(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 config.h 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: -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." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr 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 pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ 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 \ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ dist-lzma dist-shar dist-tarZ dist-xz dist-zip distcheck \ distclean distclean-generic distclean-hdr 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 pdf \ pdf-am ps ps-am tags tags-recursive uninstall uninstall-am nice: rm -f *~ man/*~ src/*~ doc/*~ preflight: grep RBF */*.{c,cpp,h,1} doc/* AUTHORS README NEWS TODO ChangeLog todo: @grep TODO *.c *.h ${man_MANS} AUTHORS README NEWS ChangeLog @echo @echo From TODO file: @cat TODO win32: make distclean ./configure --host=$(CROSS32_PREFIX) make /bin/rm -f /tmp/strings.txt strings src/md5deep.exe > /tmp/strings.txt if grep pthreadGC2.dll /tmp/strings.txt ; then echo not statically linked ; exit 1; fi win64: make distclean ./configure --host=$(CROSS64_PREFIX) make /bin/rm -f /tmp/strings.txt strings src/md5deep.exe > /tmp/strings.txt if grep pthreadGC2.dll /tmp/strings.txt ; then echo not statically linked ; exit 1; fi mv src/md5deep.exe src/md5deep64.exe mv src/sha1deep.exe src/sha1deep64.exe mv src/sha256deep.exe src/sha256deep64.exe mv src/tigerdeep.exe src/tigerdeep64.exe mv src/whirlpooldeep.exe src/whirlpooldeep64.exe mv src/hashdeep.exe src/hashdeep64.exe strip32: $(CROSS32_PREFIX)-strip src/*.exe src/*.exe strip64: $(CROSS64_PREFIX)-strip src/*64.exe windist: @echo @echo Making win32 @echo svn update rm -rf $(distdir).zip $(distdir) src/*.exe mkdir $(distdir) make win32 make strip32 cp src/*.exe $(distdir) @echo ==================================== @echo @echo Making win32 make win64 make strip64 make man/hashdeep.txt man/md5deep.txt cp src/*.exe $(distdir) @echo ==================================== @echo @echo Creating ZIP archive @echo zip -r9 $(distdir).zip $(distdir) @echo Adding text files to $(distdir).zip cp NEWS $(distdir)/CHANGES.txt cp COPYING $(distdir)/COPYING.txt cp FILEFORMAT $(distdir)/FILEFORMAT.txt cp man/md5deep.txt $(distdir)/MD5DEEP.txt cp man/hashdeep.txt $(distdir)/HASHDEEP.txt rm man/md5deep.txt man/hashdeep.txt zip --to-crlf $(distdir).zip $(distdir)/*.txt rm -rf $(distdir) $(WINDOWSDOCS) MD5DEEP.1 HASHDEEP.1 @echo "*************************" @echo "*** THE WORLD IS MADE ***" @echo "" ls -l $(distdir).* @echo "" @unzip -l $(distdir).zip wintest: @echo Will create md5deep-wintest.zip, a zip file that @echo provides for full testing on Microsoft Windows with Cygwin installed. make windist zip md5deep-wintest.zip -9 $(distdir).zip tests/* tests/*.zip tests/*.sh tests/testfiles/ tests/testfiles/*txt tests/testfiles/*/*txt tests/testfiles/*/*/*txt world: svn update @echo meta-build system. @echo Making both Linux and Windows distributions make distclean ./configure CFLAGS="-Wall -W -g -ggdb -O0" make dist make windist .1.txt: man $< > $@ # 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: md5deep-4.2/NEWS000066400000000000000000000410221176640446200134120ustar00rootroot00000000000000** Changes in version 4.2 (11 Jun 2012) * Bug Fixes Fixed padding in Tiger hashes for large files ** Changes in version 4.1.1 (5 Jun 2012) * Bug Fixes Fixed hashdeep bug for known files with commas in their names. Cleaned up usage message ** Changes in version 4.1.0 (14 Feb 2012) * New Features Added expert mode option to parse Windows PE files * Bug Fixes Fixed junction point handling on Win32 ** Changes in version 4.0.1 (22 Jan 2012) * Bug Fixes Fixed hang on DFXML generation on Win32 Fixed incorrect hashes via stdin on Win32 Fixed "Too many open files" error on OS X Doc files in Win32 have been corrected. ** Changes in version 4.0 (6 Jan 2012) * New Features Rewrote most of the program in C++. Enabled multiprocessor support on all platforms. Removed ten character limit on file size mode * Bug Fixes Too numerous to count! ** Changes in version 3.9.1 (31 May 2011) * Bug Fixes Fixed a cosmetic bugs regarding processing standard input in piecewise mode. Fixed a bug regarding processing known hash files which have parenthesis in the filename. Clarified documentation regarding multipliers in piecewise mode. They are IEC multipliers, or blocks of 1,024. Side note: also spelled 'multipliers' correctly. ** Changes in version 3.9 (21 Apr 2011) * Bug Fixes Fixed a critical bug in hashdeep regarding processing standard input ** Changes in version 3.8 (15 Apr 2011) * New Features Added -f mode to get the list of input files from a file on the disk. Added 64-bit executables for Windows. * Bug Fixes Fixed a cosmetic bug regarding the error messages for piecewise mode. ** Changes in version 3.7 (18 Dec 2010) * New Features Added triage mode, -Z flag, to compute file size and partial hashes in addition to full file hash. Updated Windows cross-compiler to MinGW-4.2.1 * Bug Fixes Fixed hashdeep piecewise mode to include the correct size of each piece being hashed. This enables audit mode to work correctly. Addressed display problem for time estimates of files with long filenames in the current directory. Added "Input/Output error" to the list of fatal errors when processing files ** Changes in version 3.6 (23 Mar 2010) * New Features Added expert mode found in md5deep to hashdeep. * Bug Fixes Fixed error checking in helper routines. ** Changes in version 3.5.1 (30 Dec 2009) * Bug Fixes Fixed processing of zero byte files. ** Changes in version 3.5 (22 Dec 2009) * New Features Added mode to load list of files to process from a file (-f mode) * Bug Fixes Fixed file size computation for piecewise hashing of standard input. Fixed error when auditing a directory to check for identical copies of a file if one copy is removed. ** Changes in version 3.4 (11 Jun 2009) * Bug Fixes Fixed directory handle leak during recursive parsing on Windows Fixed -n mode (display unused hashes) ** Changes in version 3.3 (4 Apr 2009) * New Features * Bug Fixes Skip all reparse points (symbolic links and junction points) on Windows. Required for sane parsing of Windows Vista or 7 systems. Fixed handling of 64-bit timestamps on Windows. ** Changes in version 3.2 (25 Jan 2009) * New Features Added Comma Separated Value (CSV) mode. * Bug Fixes Fixed support for 64-bit files on Windows Fixed hashdeep input file parsing to allow filenames with commas and properly handle other kinds of errors. Also modified the invocation listing in output files such that even long lines can be successfully parsed. ** Changes in version 3.1 (23 Jul 2008) * New Features Added size threshold modes to only process files smaller than a given size. Added a timestamp mode that records the creation time time for each file on Win32, the change time on all other operating systems. Streamlined file size computation process, which makes the programs about 15% faster. * Bug Fixes Corrected time estimates for large files (e.g. files which require more than one day). ** Changes in version 3.0 (10 May 2008) * New Features Added hashdeep program to support multihashing and hash file auditing Added support for new iLook style hashes * Bug Fixes Fixed obscure bug that caused a crash (double free) when attempting to check a very small file for EnCase hashes ** Changes in version 2.0.1 (31 Oct 2007) * Bug Fixes Added support for older Linux systems that don't have the latest and greatest ioctl functions. ** Changes in version 2.0 (15 Oct 2007) * New Features Using GNU Autotools for configuration and compilation. This should help avoid platform specific issues such as SHA-1 problems previously found on 64-bit versions of AIX. Added support for files with Unicode characters in their filenames on Microsoft Windows. Added support for EnCase hash sets (.hash files). Updated web site and quick start guide Slightly reduced the size of all of the executables by removing duplicated code. * Bug Fixes Fixed time estimation mode for block devices on OS X and Linux Fixed cosmetic error where estimated time remaining mode is being used in conjunction with piecewise hashing. Time estimates are now based on the whole file, not just each piece. Clarified licensing issues in COPYING for tiger.c Changed some data types in hashing functions to C99 standard. Whirlpool seems to be working well enough without changes. Wrapped all of the global variables into the state structure ** Changes in version 1.13 (6 Aug 2007) * New Features Added HP/UX as a support platform Added -S mode to only display warnings for improperly formatted hashes. Created an internal state variable to central program structure. This will help to simplify future development. Also moved md5deep.h to main.h. Moved print functions to ui.c for easier abstraction * Bug Fixes Changed piecewise hashing block size to a 64-bit value. Fixed a cosmetic error regarding newlines in -n mode. Fixed error on Win32 in file estimate mode. Although it appeared to be solely cosmetic, the functions to produce the status message could potentially overwrite other memory and create inconsistencies Removed make macg5 option as it didn't work with new versions of gcc. Updated the maximum line length to 2048 bytes. This should avoid errors reading in files with very long lines. ** Changes in version 1.12 (3 Apr 2006) * New Features Added multipliers for piecewise hashing mode. * Bug Fixes Fixed Gentoo compilation and the use of BLOCK_SIZE in hash.c. Fixed piecewise hashing bugs: filename display, correct offset when block size is larger than file, and ability to handle large block sizes. Version 1.11 - 31 Mar 2006 - Added piecewise mode -p - Added support for using md5deep output while file sizes (-z mode) in matching mode. - Added flush to output after newline generation in helpers.c - Fixed SHA-1 to work on 64-bit platforms (changed unsigned long to uin32_t) - For good measure, eliminated a few other unsigned long references throughout the source code - Added -W to the compiler flags to catch lots of other little bugs, many little fixes. Mostly eliminating comparisons between signed and unsigned. Some warnings, especially "unused paramter" are ok. Version 1.10 - 2 Feb 2006 - Fixed Tiger hashes being displayed in big endian instead of little endian Thanks to Peter Chuenkov (aka ODB) for finding this bug - Fixed cosmetic bug in usage message Version 1.9.3 - 5 Jan 2006 - Added Cygwin as a supported platform - Fixed expert mode to remove a number of logical errors that prevented the program from correctly identifying which files should be hashed. Symbolic links, in particular, were not being chosen or excluded correctly. - Added quiet mode, -q, filename is omitted from the output. - Added Makefile directive macg5 to compile OS X G5 specific code - Fixed comparisons between signed and unsigned variables in helpers.c and dig.c Version 1.9.2 - 14 Nov 2005 - Fixed Makefile to include compiler optimizations for hashing algorithms Version 1.9.1 - 8 Nov 2005 - Fixed bug when processing symlinks to directories introduced in version 1.9 by accidently removing known good code. Oops. Version 1.9 - 7 Nov 2005 - Changed the existing return values and added ones for the matching modes to indicate if any of the input files did not match a known hash and if any hashes were unused. See "RETURN VALUES" section of the manpage. - Added -n mode to display which files from the list of known hashes did not match any of the input files. - Fixed dig.c code to correctly handle links to Solaris doors. - Fixed cosmetic bug that caused the leading slash to be omitted from the output under 'which matching file', or -w mode. - Changed text displayed in matching modes for standard input. Now displays just "stdin" in matching mode - Fixed bug in files.c:valid_hash that caused crash by casting character value into a signed integer. - Fixed bug in BSD hash file importing that caused crash when processing a line with two parenthesis but was shorter than a valid hash. - Fixed cosmetic bug in hash.c:update_display to prevent the first time estimate to be wildly off if it takes more than one second to read the first megabyte of each input file. - Simplified hash.c by removing match_name from hash_info structure - Minor changes to Makefile defines Version 1.8 - 8 Aug 2005 - Added Tiger algorithm to make tigerdeep. - Added -k mode to insert asterisks before filename, like md5sum -b - Fixed a bug that prevented the first BSD style hash from being loaded during any of the matching modes. - Continued to simplify the Makefile. To wit: - Changed checks for __WIN32 to _WIN32, which is defined by the compiler. Removed -D__WIN32 from the Makefile. - Greatly reduced the number of instructions for cross compiling - Simplified rules for building all applications Version 1.7 - 23 May 2005 - Added support to use BSD style hashes in matching modes - Fixed support for Hashkeeper files that have directory information. Matt Kucenski helped to track this down. - While fixing Hashkeeper support, improved support for other hash file formats and generalized the code in files.c - Fixed a bug for displaying the correct matching filename in -w mode (ensured that extra characters are erased) - Fixed cosmetic bug to avoid extra characters on time estimation mode - Removed 32-bit number limitation from Win32 code, which allows the display of file sizes larger than 4GB. (Note that time estimates for files larger than 4GB is still not available on Windows.) - Switched printing of large numbers to C99 style (e.g. PRIu64 et al) - Simplified the operating systems defines in the Makefile. To wit: - Removed -D__MACOSX for Mac. Instead check for __APPLE__, which the compiler defines by default for us. - Removed the -D__UNIX directive. Instead just check the __WIN32 is *not* defined whenever we put in *nix code. Version 1.6 - 4 May 2005 - Added Whirlpool algorithm to make whirlpooldeep. - Fixed bug to prevent trying to access 'busy' files. This happens when trying to access system files on Win32 that are mounted via Samba. Jeff Bryner helped to track this one down - Added -w flag to display, in matching mode, which known hash matched the input file - Added -b flag to remove leading directory information from filenames - Added -a and -A flags to add a single hash to positive and negative matching, respectively - Removed -t as a valid flag, breaking compatibility with md5sum - Enabled control of FIFO pages via expert mode on Windows - Combined all manpages into single md5deep man page - Added error checking to hash table functions - Removed algorithm specific code from hash table code - Fixed __USE_BSD define in md5deep.h to avoid compiler warnings - Fixed minor bug to clean up Windows version of man page - Updated install process to use $(PREFIX) for installed location - Removed macinstall option Version 1.5 - 31 Aug 2004 - Added SHA-256 algorithm to make sha256deep. Special thanks to Christophe Devine his SHA-256 implementation. - Fixed typo in files.c for unsupport file type processing - Fixed typo in sha1deep man page. (Had wrong reference in description.) - Man pages are now installed mode 444 instead of 755. (i.e. non-executable) - Cleaned up Makefile. Yes, again. Version 1.4 - 16 Aug 2004 - Added relative paths mode - Fixed printing of file sizes larger than 9GB for Mac, *BSD. - Changed return values so that always returns 0 on success positive integer on failure (1 = user error, 2 = internal error) - Fixed memory leak on directory open failures in dig.c - Fixed memory leak in directory release code in cycles.c - Fixed potential information leak in md5.c (thanks to Derek Jones) - Removed possible supression of critical error messages in cycles.c - Fixed size computation for standard input - Added support for Win32 logical drives (e.g. \\.\C:) - Changed data structures in hash.c for ease of reading - Added overflow counter for Win32 for files larger than 4GB - Put Windows style newlines in copyright message Version 1.3 - 24 Jun 2004 - Fixed Windows version to handle physical devices and UNC paths (e.g. \\.\PhysicalDrive0 \\.\tape0 \\server\share\file etc) - Removed halting on fatal errors except "Permission Denied" - Added error checking for cycles created by symbolic links - Added -z flag to print file sizes - Added -0 flag to end lines with /0 instead of newlines - Updated documentation regarding Cygwin and Win32 compilation - Cleaned up Makefile, fixed "make windows" Version 1.2 - 16 Apr 2004 - Added sha1deep to compute SHA-1 hashes - Abstracted hash functions to allow other algorithms to be inserted - Windows version now generates output with line feeds AND carriage returns - Fixed printing of error messages for positive and negative matching together - Cleaned up display for matching of standard input Version 1.1 - 25 Mar 2004 - Fixed processing of standard input on Windows - Fixed cosmetic errors with time estimation to now produce a fixed length output and avoid spanning multiple lines Version 1.0 - 15 Mar 2004 (better late than never!) - Moved hierarchy traversal code into separate file, dig.c - Now able to handle symbolic links properly - If no input files are given, uses standard input - Added file read error handling (display an error message, pad missing data with zeros and continue execution). - Added expert mode; allows user to choose which and only which types of files are processed - Added -X and -M to print hashes as well as matches - Errors in files of known hashes are now treated an non-fatal - When estimating completion time, print the filename being processed - Corrected NSRL import code - Cleaned up time estimation calculation - Fixed block device time estimation for *BSD - Switched from unsigned long long to off_t type - Fixed duplicate slashes in filenames from root directory (e.g. //usr/src) - Fixed install process. Generally this meant removing flags from the install command. - Added *BSD-specific includes - Fixed minor data type issue for Gentoo linux - Fixed typos in copyright and error messages Version 0.16 - 7 Mar 2003 Added -x flag for negative matching Made the Makefile nicer Added code for compatibility with FreeBSD, Solaris, and OS X. Added support for symbolic links to files Changed the rules for a valid plain hash such that it only needs to be followed by one space instead of two Version 0.15 - 5 Jan 2003 Added -m flag for matching support Made the help message more helpful ** Changes in version 0.14 (2 Dec 2002) * New Features Added better checks for avoiding symbolic links on *nix Added -V flag for copyright information * Buf Fixes Fixed time estimation for block devices on Linux Program now identifies itself correctly in Windows error messages. ** Changes in version 0.13 (7 Nov 2002) * New Features Added -r and -e flags for recursion and time estimation, respectively. * Bug Fixes Fixed Windows version to generate correct MD5 values. (u_int_32 should have been unsigned long instead of long. Oops.) ** Changes in version 0.12 (1 Nov 2002) * New Features First (internally) published version Added -b and -t switches for compability with md5sum Cleaned up README and man page * Bug Fixes Removed Linux specific code md5deep-4.2/README000066400000000000000000000144011176640446200135740ustar00rootroot00000000000000This is md5deep, a set of cross-platform tools to computer hashes, or message digests, for any number of files while optionally recursively digging through the directory structure. It can also take a list of known hashes and display the filenames of input files whose hashes either do or do not match any of the known hashes. This version supports MD5, SHA-1, SHA-256, Tiger, and Whirlpool hashes. See the file NEWS for a list of changes between releases. See the file COPYING for information about the licensing for this program. See the file INSTALL for (generic) compilation and installation instructions. Here's the short version: $ ./configure $ make $ make install Note that you must be normally root to install to the default location. The sudo command is helpful for doing so. You can specify an alternate installation location using the --prefix option to the configure script. For example, to install to /home/foo/bin, use: $ ./configure --prefix=/home/foo There is complete documentation on how to use the program on the project's homepage, http://md5deep.sourceforge.net/ == md5deep vs. hashdeep == For historical reasons, the program has different options and features when run with the names "hashdeep" and "md5deep." hashdeep has a feature called "audit" which: * Can also use a list of known hashes to audit a set of FILES. Errors are reported to standard error. If no FILES are specified, reads from standard input. -a Audit mode. Each input file is compared against the set of knowns. An audit is said to pass if each input file is matched against exactly one file in set of knowns. Any collisions, new files, or missing files will make the audit fail. Using this flag alone produces a message, either "Audit passed" or "Audit Failed". -v - prints the number of files in each category -v -v = prints all discrepancies -v -v -v = prints the results for every file examined and every known file. -k - The -k option must be used to load the audit file To perform an audit: hashdeep -r dir > /tmp/auditfile # Generate the audit file hashdeep -a k /tmp/auditfile -r dir # test the audit Notice that the audit is performed with a standard hashdeep output file. (Internally, the audit is computed as part of the hashing process.) == Unicode Issues == POSIX-based modern computer systems consider filenames to be a sequence of bytes that are rendered as the application wishes. This means that filenames typically contain ASCII but can contain UTF-8, UTF-16, latin1, or even invalid Unicode codings. Windows-based systems have one set of API calls for ASCII-based filenames and another set for filenames encoded as UCS-2, which "produces a fixed-length format by simply using the code point as the 16-bit code unit and produces exactly the same result as UTF-16 for 63,488 code points in the range 0-0xFFFF" according to wikipedia. (http://en.wikipedia.org/wiki/UTF-16/UCS-2) But wikipedia disputes the factual accuracy of this statement on the talk page. it's pretty clear that nobody is entirely sure that Windows actually does, and Windows itself may not be consistent. Version 3 of this program addressed this issue by using the TCHAR variable to hold filenames on Windowa dn by refusing to print them, priting a "?" instead. Version 4 of this program translates TCHAR strings to std::string strings at the soonest opportunity using the Windows function WideCharToMultiByte (http://msdn.microsoft.com/en-us/library/dd374130%28v=vs.85%29.aspx). Flags have been added escape Unicode when it is printed. There is no way (apparently) on Windows to open a UTF-8 filename; it needs to be converted back to a multi-byte filename with MultiByteToWideChar. Fortunately, we never really need to convert back. Notice that on Windows the files hashed can have unicode characters but the file with the hashes must have an ASCII name. COMPILING FOR WINDOWS: -D_UNICODE causes TCHAR to be defined as 'wchar_t'. COMPILING FOR POSIX: -D_UNICODE is not defined, causing TCHAR to be defined as 'char'. Previously, win32 functions were controlled with #ifdef statements, like this: #ifdef _WIN32 _wfullpath(d_name,fn,PATH_MAX); #else if (NULL == realpath(fn,d_name)) return TRUE; #endif There was also a file called tchar-local.h which actually changed the semantics of functions on different platforms, with things like this: #define _tcsncpy strncpy #define _tstat_t struct stat This made the code very difficult to maintain. With the 4.0 rewrite, we have changed this code with C++ functions that return objects were possible and avoid the use of #defines that so that on _WIN32 systems the function realpath() gets defined prior to its use, and the mainline code lacks the realpath() function. You can see this in cycles.cpp: /* Return the canonicalized absolute pathname in UTF-8 on Windows and POSIX systems */ std::string get_realpath(const TCHAR *fn) { #ifdef _WIN32 /* * expand a relative path to the full path. * http://msdn.microsoft.com/en-us/library/506720ff(v=vs.80).aspx */ TCHAR absPath[PATH_MAX]; if(_fullpath(absPath,fn,PAT_HMAX)==0) return ""; return tchar_to_utf8(absPath); #else char resolved_name[PATH_MAX]; // if(realpath(fn,resolved_name)==0) return ""; return string(resolved_name); #endif } You can install mingw and then simply configure with something like this: $ export PATH=$PATH:/usr/local/i386-mingw32-4.3.0/bin $ ./configure --host=i386-mingw32 == Hash Algorithm References == The MD5 algorithm is defined in RFC 1321: http://www.ietf.org/rfc/rfc1321.txt The SHA1 algorithm is defined in FIPS 180-1: http://www.itl.nist.gov/fipspubs/fip180-1.htm The SHA256 algorithm is defined FIPS 180-2: http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf The Tiger algorithm is defined at: http://www.cs.technion.ac.il/~biham/Reports/Tiger/ The Whirlpool algorithm is defined at: http://planeta.terra.com.br/informatica/paulobarreto/WhirlpoolPage.html ================================================================ Theory of operation. main.cpp - sets up the system. dig.cpp - iterates through the individual directories. - calls hash_file() in hash.cpp for each file to hash hash.cpp - performs the hashing of each file. display.cpp - stores/displays the results. md5deep-4.2/TODO000066400000000000000000000100111176640446200133750ustar00rootroot00000000000000Because I kept ignoring this list of TODO items, I have moved them all to the SourceForge Feature Request Tracker. See https://sourceforge.net/tracker/?group_id=67079&atid=516781 for all current TODO items. October 9, 2011 status report: md5deep/hashdeep: * the same code base * completely rewritten in C++ * multi-threaded (-j4 runs 4 worker threads and one primary thread). - default is 1 worker per CPU. - specify 0 workers to turn off multi-threading * each worker opens the files * Compiles for windows32 and windows64 using mingw on Fedora Core 15 * Full regression testing operational. All known features are now testable and tested. * -hh now prints more help Here's future stuff to do: * Performance tuning: 1 - don't create hash_hex strings for algorithms we don't use. 2 - Currently hashlist is a multimap. It might be better to make it a tr1::unordered_set, but that would require having the buckets be vectors, since a single hash can have more than one file attached to it. * Style: - Currently hashlist is a subclass of a multimap; it should be an opaque object that * Nice graphs showing peformance and speedup. * Test with actual hash collisions of files that have same MD5 but different SHA1 * Add a file pattern option that specifies what files are to be hashed. * Improve usage for -hh prints ALL options. * Memory mapped files: - Figure out why memory-mapped files are slower than unbuffered io. 1- memory-mapped files can generate a SIGSEGV or SIGBUS if the mapped region is not available. http://linux.die.net/man/2/mmap This needs to be explicitly handled with a signal handler. 2-Memory mapped files can be handled on WIndows. - Until we get this, memory-mapped files are off by default. * Should have a better startegy for "Known file not used" in audit_check, because I don't want to modify the map. == Below is a list of what Simson Garfinkel did to bring hashdeep and md5deep from version 3 to version 4: 1 - Start with a new copy of the source 2 - fixed the autoconf files. 3 - migrated to C++ (hashdeep is now hashdeep.cpp) 4 - add DFXML to the multihash program. 5 - added an output mode to the multihash program that exactly matches the output mode of the single hash md5deep, sha1deep, etc. This was done by using md5deep's output functions directly. 6 - added a mode to the multihash program that exactly matches the command-line options, and have that mode be the default when the command name changes. This was done by using md5deep's command line parser. 7 - changed state to a C++ class. 8 - Remove the current_file stuff from state to create another C++ class. 9 - Modified hash() function take the file being hashed and a place to put it. 10 - Start replacing char * arrays with stl::string. Consider replacing TCHAR strings with vector. 11 - Remove hashtable object for the STL map 12 - migrate all hash databases to a single class (hashlist.cpp) 13 - Fixed -k so that it loads into that database 14 - Fix audit mode so that it reads from that database. 15 - Loading hashes should return a string with the set of hashes that were added. 16 - Went through entire program looking for dead code. 17 - migrated to multi-threaded producer/consumer architecture with the file searching (dig) being the producer and hash() being the consumer. (This code was taken from bulk_extractor) 18 - Add "-j" option to control how many threads; -j0 turns off threading. 19 - Made error printing is threadsafe 20 - Remove the file_name_annotation and instead explicitly remembered the piecewise start and stop. 21 - Figured out why threading turns on piecewise problem. Turns out that the SHA1 implementation was not threadsafe; replaced it with a different one. 22 - got hashlist matching working again 23 - Added support for common crypto functions on mac. This makes SHA1 and SHA256 go dramatically faster. ================ Remaining: * - Change all codes to UTF8 in all modes of operation * - Option to include BOM in plain text output mode. md5deep-4.2/aclocal.m4000066400000000000000000001034631176640446200145630ustar00rootroot00000000000000# 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"]) ]) # 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 ]) # Copyright (C) 2003, 2004, 2005, 2006 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_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # 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 md5deep-4.2/config.guess000077500000000000000000001206221176640446200152370ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. timestamp='2003-02-22' # 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., 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. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted 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. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. 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 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 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # 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 -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { 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 ;' # 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 ;; *) 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 __ELF__ >/dev/null 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 0 ;; amiga:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; arc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; hp300:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; macppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvmeppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; pmax:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sgi:OpenBSD:*:*) echo mipseb-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sun3:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; wgrisc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} exit 0 ;; alpha:OSF1:*:*) if test $UNAME_RELEASE = "V4.0"; then UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` fi # 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 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/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit 0 ;; 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 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit 0;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit 0 ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit 0;; 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 0 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; DRS?6000:UNIX_SV:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7 && exit 0 ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; 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 0 ;; 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 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; 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 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; # 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 0 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit 0 ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit 0 ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit 0 ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit 0 ;; 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 \ && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && exit 0 echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit 0 ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit 0 ;; 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 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit 0 ;; ????????: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 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit 0 ;; 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 0 ;; *: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 $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo rs6000-ibm-aix3.2.5 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 0 ;; *:AIX:*:[45]) 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 0 ;; *:AIX:*:*) echo rs6000-ibm-aix exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit 0 ;; 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 # avoid double evaluation of $set_cc_for_build test -n "$CC_FOR_BUILD" || eval $set_cc_for_build if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit 0 ;; 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 && $dummy && exit 0 echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit 0 ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; 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 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; *:UNICOS/mp:*:*) echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; 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 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*) # Determine whether the default compiler uses glibc. eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #if __GLIBC__ >= 2 LIBC=gnu #else LIBC= #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit 0 ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit 0 ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit 0 ;; x86:Interix*:3*) echo i586-pc-interix3 exit 0 ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit 0 ;; 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 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #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 0 ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #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 0 ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit 0 ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit 0 ;; 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 ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit 0 ;; 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 0 ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit 0 ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit 0 ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit 0 ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit 0 ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit 0 ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #ifdef __INTEL_COMPILER LIBC=gnu #else LIBC=gnuaout #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; 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 0 ;; 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 0 ;; 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 0 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit 0 ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit 0 ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit 0 ;; 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 0 ;; i*86:*:5:[78]*) 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 0 ;; 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 0 ;; 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 i386. echo i386-pc-msdosdjgpp exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 exit 0 ;; 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 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit 0 ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit 0 ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit 0 ;; M68*:*:R3V[567]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 3[34]??:*: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) 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 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit 0 ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit 0 ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; *: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 0 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit 0 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit 0 ;; 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 0 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit 0 ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit 0 ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit 0 ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit 0 ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit 0 ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Darwin:*:*) case `uname -p` in *86) UNAME_PROCESSOR=i686 ;; powerpc) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit 0 ;; *: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 0 ;; *:QNX:*:4*) echo i386-pc-qnx exit 0 ;; NSR-[DGKLNPTVW]:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit 0 ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit 0 ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit 0 ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit 0 ;; *: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 0 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit 0 ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit 0 ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit 0 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit 0 ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit 0 ;; *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; 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"); 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 && $dummy && exit 0 # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # 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 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; c34*) echo c34-convex-bsd exit 0 ;; c38*) echo c38-convex-bsd exit 0 ;; c4*) echo c4-convex-bsd exit 0 ;; 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: md5deep-4.2/config.h.in000066400000000000000000000201661176640446200147440ustar00rootroot00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if the `closedir' function returns void instead of `int'. */ #undef CLOSEDIR_VOID /* Define to 1 if you have the `CC_MD5_Init' function. */ #undef HAVE_CC_MD5_INIT /* Define to 1 if you have the `CC_SHA1_Init' function. */ #undef HAVE_CC_SHA1_INIT /* Define to 1 if you have the `CC_SHA256_Init' function. */ #undef HAVE_CC_SHA256_INIT /* Define to 1 if you have the header file. */ #undef HAVE_COMMONCRYPTO_COMMONDIGEST_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ #undef HAVE_DOPRNT /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ #undef HAVE_FSEEKO /* Define to 1 if you have the `fseeko64' function. */ #undef HAVE_FSEEKO64 /* Define to 1 if you have the `ftello64' function. */ #undef HAVE_FTELLO64 /* Define to 1 if you have the `gethostname' function. */ #undef HAVE_GETHOSTNAME /* Define to 1 if you have the `getprogname' function. */ #undef HAVE_GETPROGNAME /* Define to 1 if you have the `getrusage' function. */ #undef HAVE_GETRUSAGE /* Define to 1 if you have the `getuid' function. */ #undef HAVE_GETUID /* Define to 1 if you have the `getwpuid' function. */ #undef HAVE_GETWPUID /* Define to 1 if you have the `gmtime_r' function. */ #undef HAVE_GMTIME_R /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `isxdigit' function. */ #undef HAVE_ISXDIGIT /* Define to 1 if you have the header file. */ #undef HAVE_LIBGEN_H /* Define to 1 if you have the `pthreadGC2' library (-lpthreadGC2). */ #undef HAVE_LIBPTHREADGC2 /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the `localtime_r' function. */ #undef HAVE_LOCALTIME_R /* Define to 1 if `lstat' has the bug that it succeeds when given the zero-length file name argument. */ #undef HAVE_LSTAT_EMPTY_STRING_BUG /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `mkstemp' function. */ #undef HAVE_MKSTEMP /* Define to 1 if you have the `mmap' function. */ #undef HAVE_MMAP /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* define to 1 if program_invocation_name is available */ #undef HAVE_PROGRAM_INVOCATION_NAME /* Defined to POSIX threads for mingw */ #undef HAVE_PTHREAD /* Define to 1 if you have the header file. */ #undef HAVE_PTHREAD_H /* Have PTHREAD_PRIO_INHERIT. */ #undef HAVE_PTHREAD_PRIO_INHERIT /* Define to 1 if you have the `pthread_win32_process_attach_np' function. */ #undef HAVE_PTHREAD_WIN32_PROCESS_ATTACH_NP /* Define to 1 if you have the `pthread_win32_process_detach_np' function. */ #undef HAVE_PTHREAD_WIN32_PROCESS_DETACH_NP /* Define to 1 if you have the `pthread_win32_thread_attach_np' function. */ #undef HAVE_PTHREAD_WIN32_THREAD_ATTACH_NP /* Define to 1 if you have the `pthread_win32_thread_detach_np' function. */ #undef HAVE_PTHREAD_WIN32_THREAD_DETACH_NP /* Define to 1 if you have the header file. */ #undef HAVE_PWD_H /* Define to 1 if `stat' has the bug that it succeeds when given the zero-length file name argument. */ #undef HAVE_STAT_EMPTY_STRING_BUG /* 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 the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if `st_blksize' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_BLKSIZE /* Required for mingw */ #undef HAVE_STRUCT_TIMESPEC /* Define to 1 if you have the header file. */ #undef HAVE_SYS_CDEFS_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_DISK_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MMAN_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MMAP_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MOUNT_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_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_RESOURCE_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_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UTSNAME_H /* Define to 1 if you have the header file. */ #undef HAVE_TIME_H /* 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 `vasprintf' function. */ #undef HAVE_VASPRINTF /* Define to 1 if you have the `vprintf' function. */ #undef HAVE_VPRINTF /* Define to 1 if you have the header file. */ #undef HAVE_WCHAR_H /* Define to 1 if you have the `_gmtime64' function. */ #undef HAVE__GMTIME64 /* Define to 1 if you have the `_gmtime64_s' function. */ #undef HAVE__GMTIME64_S /* Define to 1 if `lstat' dereferences a symlink specified with a trailing slash. */ #undef LSTAT_FOLLOWS_SLASHED_SYMLINK /* We are cross-compiling with MINGW */ #undef MINGW /* 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 /* Define to necessary symbol if this constant uses a non-standard name on your system. */ #undef PTHREAD_CREATE_JOINABLE /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Version number of package */ #undef VERSION /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS /* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ #undef _LARGEFILE_SOURCE /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES /* Define to 1 if on MINIX. */ #undef _MINIX /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ #undef _POSIX_1_SOURCE /* Define to 1 if you need to in order for `stat' and other things to work. */ #undef _POSIX_SOURCE /* Linux operating system functions */ #undef __LINUX__ /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `long int' if does not define. */ #undef off_t /* Define to `unsigned int' if does not define. */ #undef size_t md5deep-4.2/config.sub000077500000000000000000000724251176640446200147110ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. timestamp='2003-02-22' # 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., 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. # Please send patches to . Submit a context # diff and a properly formatted 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. # 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 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 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # 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 0;; * ) 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* | freebsd*-gnu* | netbsd*-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) os= basic_machine=$1 ;; -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 ;; -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/'` ;; -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] \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k \ | m32r | m68000 | m68k | m88k | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | msp430 \ | ns16k | ns32k \ | openrisc | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; # 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-* \ | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* \ | m32r-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | msp430-* \ | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ | xtensa-* \ | ymp-* \ | z8k-*) ;; # 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 ;; 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 ;; 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 ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; 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 ;; crds | unos) basic_machine=m68k-crds ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; 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 ;; 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 ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; 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 ;; mmix*) basic_machine=mmix-knuth os=-mmixware ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; 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 ;; nv1) basic_machine=nv1-cray os=-unicosmp ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; or32 | or32-*) basic_machine=or32-unknown os=-coff ;; 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 ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2) basic_machine=i686-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-*) basic_machine=i686-`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 ;; 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 ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; 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 ;; tic4x | c4x*) basic_machine=tic4x-unknown os=-coff ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; 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 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-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 ;; 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 ;; sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sh64) basic_machine=sh64-unknown ;; sparc | sparcv9 | sparcv9b) 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. -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* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -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*) # 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* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -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 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -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 ;; -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 ;; -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 *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; # 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 ;; 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 ;; *-ibm) os=-aix ;; *-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 ;; -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 ;; -ptx*) vendor=sequent ;; -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 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: md5deep-4.2/configure000077500000000000000000007246301176640446200146370ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for MD5DEEP 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 \$(( 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 $0: research@jessekornblum.com about your system, including $0: any error possibly output before this message. Then $0: install a modern shell, or manually run the script $0: under such a shell if you do 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'" 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='MD5DEEP' PACKAGE_TARNAME='md5deep' PACKAGE_VERSION='4.2' PACKAGE_STRING='MD5DEEP 4.2' PACKAGE_BUGREPORT='research@jessekornblum.com' PACKAGE_URL='' # 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" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS PTHREAD_CFLAGS PTHREAD_LIBS PTHREAD_CC ax_pthread_config LIBOBJS host_os host_vendor host_cpu host build_os build_vendor build_cpu build EGREP GREP CPP am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX 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 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_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 enable_dependency_tracking enable_largefile with_noopt ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CPP' # 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 MD5DEEP 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/md5deep] --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 System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of MD5DEEP 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-largefile omit support for large files Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-noopt Drop -O C flags 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 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 MD5DEEP configure 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_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_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_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 research@jessekornblum.com ## ## ----------------------------------------- ##" ) | 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_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_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_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_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_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_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_c_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_c_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_c_check_type # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- # Tries to find if the field MEMBER exists in type AGGR, after including # INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=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 eval ac_res=\$$4 { $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_member 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 MD5DEEP $as_me 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 ac_config_files="$ac_config_files Makefile src/Makefile man/Makefile tests/Makefile tests/testfiles/Makefile" am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; 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 \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$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. # 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" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P 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. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac 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='md5deep' VERSION='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 config.h" $as_echo "#define _FILE_OFFSET_BITS 64" >>confdefs.h 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 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 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 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 ################################################################ # http://osdir.com/ml/gnu.mingw.devel/2003-09/msg00040.html # Note: Windows 95 WINVER=0x400 # Windows 98 WINVER=0x400 _WIN32_WINDOWS=0x0410 # Windows Me WINVER=0x400 _WIN32_WINDOWS=0x0490 # Windows NT 4.0 WINVER=0x0400 _WIN32_WINNT=0x0400 # Windows NT 4.0 SP3 WINVER=0x0400 _WIN32_WINNT=0x0403 # Windows 2000 WINVER=0x500 _WIN32_WINNT=0x0500 # Windows XP WINVER=0x501 _WIN32_WINNT=0x0501 # Windows Server 2003 WINVER=0x502 _WIN32_WINNT=0x0502 # mingw32 includes i686-w64-mingw32 and x86_64-w64-mingw32 mingw="no" case $host in *-*-*linux*-*) $as_echo "#define __LINUX__ 1" >>confdefs.h ;; *-*-mingw32*) LIBS="-lws2_32 -lgdi32 $LIBS" # previously had -liberty CPPFLAGS="-DUNICODE -D_UNICODE -D__MSVCRT_VERSION__=0x0601 -DWINVER=0x0500 -D_WIN32_WINNT=0x0500 -DHAVE_STRUCT_TIMESPEC $CPPFLAGS" CXXFLAGS="$CXXFLAGS -Wno-format " # compiler mingw-4.3.0 is broken on I64u formats CXXFLAGS="$CXXFLAGS --static" $as_echo "#define MINGW 1" >>confdefs.h mingw="yes" ;; esac # Bring additional directories where things might be found into our # search path. I don't know why autoconf doesn't do this by default if test x"${mingw}" == "xno" ; then for spfx in /usr/local /opt/local /sw ; do echo checking ${spfx}/include if test -d ${spfx}/include; then CPPFLAGS="-I${spfx}/include $CPPFLAGS" LDFLAGS="-L${spfx}/lib $LDFLAGS" fi done 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 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 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 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 ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" if test "x$ac_cv_header_minix_config_h" = xyes; then : MINIX=yes else MINIX= fi if test "$MINIX" = yes; then $as_echo "#define _POSIX_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h $as_echo "#define _MINIX 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } if ${ac_cv_safe_to_define___extensions__+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_safe_to_define___extensions__=yes else ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 $as_echo "$ac_cv_safe_to_define___extensions__" >&6; } test $ac_cv_safe_to_define___extensions__ = yes && $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h $as_echo "#define _ALL_SOURCE 1" >>confdefs.h $as_echo "#define _GNU_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h # 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 ################################################################ ### I am a glutten for punishment and this is security-critical software # Check GCC WARNINGS_TO_TEST="-MD -D_FORTIFY_SOURCE=2 -Wpointer-arith -Wmissing-declarations -Wmissing-prototypes \ -Wshadow -Wwrite-strings -Wcast-align -Waggregate-return \ -Wbad-function-cast -Wcast-qual -Wundef -Wredundant-decls -Wdisabled-optimization \ -Wfloat-equal -Wmissing-format-attribute -Wmultichar -Wc++-compat -Wmissing-noreturn -funit-at-a-time" if test $mingw = "no" ; then # add the warnings we don't want to do on mingw $WARNINGS_TO_TEST="$WARNINGS_TO_TEST -Wall -Wstrict-prototypes -Weffc++" fi for option in $WARNINGS_TO_TEST do SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $option" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc understands $option" >&5 $as_echo_n "checking whether gcc understands $option... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : has_option=yes else has_option=no; CFLAGS="$SAVE_CFLAGS" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $has_option" >&5 $as_echo "$has_option" >&6; } unset has_option unset SAVE_CFLAGS done unset option # Check G++ # We don't use these warnings: # -Waggregate-return -- aggregate returns are GOOD; they simplify code design # We can use these warnings after ZLIB gets upgraded: # -Wundef --- causes problems with zlib # -Wcast-qual # -Wmissing-format-attribute - can't get this one right 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 WARNINGS_TO_TEST="-Wall -MD -D_FORTIFY_SOURCE=2 -Wpointer-arith \ -Wshadow -Wwrite-strings -Wcast-align \ -Wredundant-decls -Wdisabled-optimization \ -Wfloat-equal -Wmultichar -Wmissing-noreturn \ -Wstrict-null-sentinel -Woverloaded-virtual -Wsign-promo -funit-at-a-time" if test $mingw = "no" ; then # add the warnings we don't want to do on mingw $WARNINGS_TO_TEST="$WARNINGS_TO_TEST -Weffc++" fi for option in $WARNINGS_TO_TEST do SAVE_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $option" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether g++ understands $option" >&5 $as_echo_n "checking whether g++ understands $option... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : has_option=yes else has_option=no; CXXFLAGS="$SAVE_CXXFLAGS" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $has_option" >&5 $as_echo "$has_option" >&6; } unset has_option unset SAVE_CXXFLAGS done unset option 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 # ################################################################ # Determine UTC date offset CPPFLAGS="$CPPFLAGS -DUTC_OFFSET=`date +%z`" # Checks for header files. ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_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 opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_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 opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" 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 for ac_header in libgen.h fcntl.h limits.h inttypes.h malloc.h stdint.h stdlib.h string.h \ sys/cdefs.h sys/types.h sys/ioctl.h sys/mmap.h sys/mman.h sys/param.h \ sys/resource.h wchar.h unistd.h sys/stat.h sys/disk.h\ CommonCrypto/CommonDigest.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 # These functions not available everywhere for ac_func in _gmtime64_s _gmtime64 gmtime_r mmap usleep mkstemp vasprintf getrusage getprogname isxdigit do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_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 # This is for Apple's new CommonCrypto (which is FIPS validated) for ac_func in CC_MD5_Init CC_SHA1_Init CC_SHA256_Init do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_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 # These includes are required on FreeBSD for ac_header in sys/mount.h do : ac_fn_c_check_header_compile "$LINENO" "sys/mount.h" "ac_cv_header_sys_mount_h" "#ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_PARAM_H # include #endif " if test "x$ac_cv_header_sys_mount_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_MOUNT_H 1 _ACEOF fi done # http://www.gnu.org/s/hello/manual/autoconf/Particular-Headers.html # # If a program may include both time.h and sys/time.h, define # TIME_WITH_SYS_TIME. On some ancient systems, sys/time.h included # time.h, but time.h was not protected against multiple inclusion, so # programs could not explicitly include both files. This macro is # useful in programs that use, for example, struct timeval as well as # struct tm. It is best used in conjunction with HAVE_SYS_TIME_H, # which can be checked for using AC_CHECK_HEADERS([sys/time.h]). for ac_header in time.h sys/time.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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi ################################################################ # DFXML support for ac_header in sys/cdefs.h sys/resource.h pwd.h sys/utsname.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 for ac_func in localtime_r getuid gethostname getwpuid getrusage do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_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 # Don't think we need this anymore. # AC_C_BIGENDIAN # Checks for typedefs, structures, and compiler characteristics. { $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 ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" if test "x$ac_cv_type_off_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define off_t long int _ACEOF fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi ac_fn_c_check_member "$LINENO" "struct stat" "st_blksize" "ac_cv_member_struct_stat_st_blksize" "$ac_includes_default" if test "x$ac_cv_member_struct_stat_st_blksize" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_BLKSIZE 1 _ACEOF fi # Checks for library functions. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether closedir returns void" >&5 $as_echo_n "checking whether closedir returns void... " >&6; } if ${ac_cv_func_closedir_void+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_closedir_void=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include <$ac_header_dirent> #ifndef __cplusplus int closedir (); #endif int main () { return closedir (opendir (".")) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_closedir_void=no else ac_cv_func_closedir_void=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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_closedir_void" >&5 $as_echo "$ac_cv_func_closedir_void" >&6; } if test $ac_cv_func_closedir_void = yes; then $as_echo "#define CLOSEDIR_VOID 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5 $as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; } if ${ac_cv_sys_largefile_source+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=no; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE 1 #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_sys_largefile_source=1; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_cv_sys_largefile_source=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5 $as_echo "$ac_cv_sys_largefile_source" >&6; } case $ac_cv_sys_largefile_source in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source _ACEOF ;; esac rm -rf conftest* # We used to try defining _XOPEN_SOURCE=500 too, to work around a bug # in glibc 2.1.3, but that breaks too many other things. # If you want fseeko and ftello with glibc, upgrade to a fixed glibc. if test $ac_cv_sys_largefile_source != unknown; then $as_echo "#define HAVE_FSEEKO 1" >>confdefs.h fi # Check whether --enable-largefile was given. if test "${enable_largefile+set}" = set; then : enableval=$enable_largefile; fi if test "$enable_largefile" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 $as_echo_n "checking for special C compiler options needed for large files... " >&6; } if ${ac_cv_sys_largefile_CC+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : break fi rm -f core conftest.err conftest.$ac_objext CC="$CC -n32" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_largefile_CC=' -n32'; break fi rm -f core conftest.err conftest.$ac_objext break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 $as_echo "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 $as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if ${ac_cv_sys_file_offset_bits+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=64; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 $as_echo "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits _ACEOF ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 $as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } if ${ac_cv_sys_large_files+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=1; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 $as_echo "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGE_FILES $ac_cv_sys_large_files _ACEOF ;; esac rm -rf conftest* fi fi if test $ac_cv_c_compiler_gnu = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5 $as_echo_n "checking whether $CC needs -traditional... " >&6; } if ${ac_cv_prog_gcc_traditional+:} false; then : $as_echo_n "(cached) " >&6 else ac_pattern="Autoconf.*'x'" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TIOCGETP _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes else ac_cv_prog_gcc_traditional=no fi rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TCGETA _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes fi rm -f conftest* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5 $as_echo "$ac_cv_prog_gcc_traditional" >&6; } if test $ac_cv_prog_gcc_traditional = yes; then CC="$CC -traditional" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5 $as_echo_n "checking whether lstat correctly handles trailing slash... " >&6; } if ${ac_cv_func_lstat_dereferences_slashed_symlink+:} false; then : $as_echo_n "(cached) " >&6 else rm -f conftest.sym conftest.file echo >conftest.file if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then if test "$cross_compiling" = yes; then : ac_cv_func_lstat_dereferences_slashed_symlink=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; /* Linux will dereference the symlink and fail, as required by POSIX. That is better in the sense that it means we will not have to compile and use the lstat wrapper. */ return lstat ("conftest.sym/", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_lstat_dereferences_slashed_symlink=yes else ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else # If the `ln -s' command failed, then we probably don't even # have an lstat function. ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f conftest.sym conftest.file fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 $as_echo "$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; } test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && cat >>confdefs.h <<_ACEOF #define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 _ACEOF if test "x$ac_cv_func_lstat_dereferences_slashed_symlink" = xno; then case " $LIBOBJS " in *" lstat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat accepts an empty string" >&5 $as_echo_n "checking whether lstat accepts an empty string... " >&6; } if ${ac_cv_func_lstat_empty_string_bug+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_lstat_empty_string_bug=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; return lstat ("", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_lstat_empty_string_bug=no else ac_cv_func_lstat_empty_string_bug=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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_empty_string_bug" >&5 $as_echo "$ac_cv_func_lstat_empty_string_bug" >&6; } if test $ac_cv_func_lstat_empty_string_bug = yes; then case " $LIBOBJS " in *" lstat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; esac cat >>confdefs.h <<_ACEOF #define HAVE_LSTAT_EMPTY_STRING_BUG 1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5 $as_echo_n "checking whether lstat correctly handles trailing slash... " >&6; } if ${ac_cv_func_lstat_dereferences_slashed_symlink+:} false; then : $as_echo_n "(cached) " >&6 else rm -f conftest.sym conftest.file echo >conftest.file if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then if test "$cross_compiling" = yes; then : ac_cv_func_lstat_dereferences_slashed_symlink=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; /* Linux will dereference the symlink and fail, as required by POSIX. That is better in the sense that it means we will not have to compile and use the lstat wrapper. */ return lstat ("conftest.sym/", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_lstat_dereferences_slashed_symlink=yes else ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else # If the `ln -s' command failed, then we probably don't even # have an lstat function. ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f conftest.sym conftest.file fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 $as_echo "$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; } test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && cat >>confdefs.h <<_ACEOF #define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 _ACEOF if test "x$ac_cv_func_lstat_dereferences_slashed_symlink" = xno; then case " $LIBOBJS " in *" lstat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working memcmp" >&5 $as_echo_n "checking for working memcmp... " >&6; } if ${ac_cv_func_memcmp_working+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_memcmp_working=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Some versions of memcmp are not 8-bit clean. */ char c0 = '\100', c1 = '\200', c2 = '\201'; if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0) return 1; /* The Next x86 OpenStep bug shows up only when comparing 16 bytes or more and with at least one buffer not starting on a 4-byte boundary. William Lewis provided this test program. */ { char foo[21]; char bar[21]; int i; for (i = 0; i < 4; i++) { char *a = foo + i; char *b = bar + i; strcpy (a, "--------01111111"); strcpy (b, "--------10000000"); if (memcmp (a, b, 16) >= 0) return 1; } return 0; } ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_memcmp_working=yes else ac_cv_func_memcmp_working=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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_memcmp_working" >&5 $as_echo "$ac_cv_func_memcmp_working" >&6; } test $ac_cv_func_memcmp_working = no && case " $LIBOBJS " in *" memcmp.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS memcmp.$ac_objext" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat accepts an empty string" >&5 $as_echo_n "checking whether stat accepts an empty string... " >&6; } if ${ac_cv_func_stat_empty_string_bug+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_stat_empty_string_bug=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; return stat ("", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_stat_empty_string_bug=no else ac_cv_func_stat_empty_string_bug=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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_stat_empty_string_bug" >&5 $as_echo "$ac_cv_func_stat_empty_string_bug" >&6; } if test $ac_cv_func_stat_empty_string_bug = yes; then case " $LIBOBJS " in *" stat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS stat.$ac_objext" ;; esac cat >>confdefs.h <<_ACEOF #define HAVE_STAT_EMPTY_STRING_BUG 1 _ACEOF fi for ac_func in vprintf do : ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf" if test "x$ac_cv_func_vprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VPRINTF 1 _ACEOF ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" if test "x$ac_cv_func__doprnt" = xyes; then : $as_echo "#define HAVE_DOPRNT 1" >>confdefs.h fi fi done # More permutations of fseek/ftell lossage for ac_func in fseeko64 ftello64 do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_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 # See if program_invocation_name is defined on this system cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { const char *progname = program_invocation_name; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : extern_program_invocation_name=yes else extern_program_invocation_name=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test x"${extern_program_invocation_name}" = x"yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: extern program_invocation_name in errno.h" >&5 $as_echo "$as_me: extern program_invocation_name in errno.h" >&6;} $as_echo "#define HAVE_PROGRAM_INVOCATION_NAME 1" >>confdefs.h fi ################################################################ # PTHREAD support # With special nods to compiling under mingw if test x"$mingw" = x"yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: Checking for pthreads under mingw" >&5 $as_echo "$as_me: Checking for pthreads under mingw" >&6;} $as_echo "#define HAVE_STRUCT_TIMESPEC 1" >>confdefs.h CFLAGS="$CFLAGS -mthreads " CPPFLAGS="-DPTW32_STATIC_LIB $CPPFLAGS" CXXFLAGS="$CXXFLAGS -mthreads " $as_echo "#define HAVE_PTHREAD 1" >>confdefs.h else # =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_pthread.html # =========================================================================== # # SYNOPSIS # # AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) # # DESCRIPTION # # This macro figures out how to build C programs using POSIX threads. It # sets the PTHREAD_LIBS output variable to the threads library and linker # flags, and the PTHREAD_CFLAGS output variable to any special C compiler # flags that are needed. (The user can also force certain compiler # flags/libs to be tested by setting these environment variables.) # # Also sets PTHREAD_CC to any special C compiler that is needed for # multi-threaded programs (defaults to the value of CC otherwise). (This # is necessary on AIX to use the special cc_r compiler alias.) # # NOTE: You are assumed to not only compile your program with these flags, # but also link it with them as well. e.g. you should link with # $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS # # If you are only building threads programs, you may wish to use these # variables in your default LIBS, CFLAGS, and CC: # # LIBS="$PTHREAD_LIBS $LIBS" # CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # CC="$PTHREAD_CC" # # In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant # has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name # (e.g. PTHREAD_CREATE_UNDETACHED on AIX). # # Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the # PTHREAD_PRIO_INHERIT symbol is defined when compiling with # PTHREAD_CFLAGS. # # ACTION-IF-FOUND is a list of shell commands to run if a threads library # is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it # is not found. If ACTION-IF-FOUND is not specified, the default action # will define HAVE_PTHREAD. # # Please let the authors know if this macro fails on any platform, or if # you have any other suggestions or comments. This macro was based on work # by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help # from M. Frigo), as well as ac_pthread and hb_pthread macros posted by # Alejandro Forero Cuervo to the autoconf macro repository. We are also # grateful for the helpful feedback of numerous users. # # Updated for Autoconf 2.68 by Daniel Richard G. # # LICENSE # # Copyright (c) 2008 Steven G. Johnson # Copyright (c) 2011 Daniel Richard G. # # 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 3 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, see . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 16 # This is what autoupdate's m4 run will expand. It fires # the warning (with _au_warn_XXX), outputs it into the # updated configure.ac (with AC_DIAGNOSE), and then outputs # the replacement expansion. # This is an auxiliary macro that is also run when # autoupdate runs m4. It simply calls m4_warning, but # we need a wrapper so that each warning is emitted only # once. We break the quoting in m4_warning's argument in # order to expand this macro's arguments, not AU_DEFUN's. # Finally, this is the expansion that is picked up by # autoconf. It tells the user to run autoupdate, and # then outputs the replacement expansion. We do not care # about autoupdate's warning because that contains # information on what to do *after* running autoupdate. 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 ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 $as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; } 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_join (); int main () { return pthread_join (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_pthread_ok=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 $as_echo "$ax_pthread_ok" >&6; } if test x"$ax_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items starting with a "-" are # C compiler flags, and other items are library names, except for "none" # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) # -pthreads: Solaris/gcc # -mthreads: Mingw32/gcc, Lynx/gcc # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads too; # also defines -D_REENTRANT) # ... -mt is also the pthreads flag for HP/aCC # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case "${host_cpu}-${host_os}" in *solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (We need to link with -pthreads/-mt/ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather # a function called by this macro, so we could check for that, but # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" ;; *-darwin*) ax_pthread_flags="-pthread $ax_pthread_flags" ;; esac if test x"$ax_pthread_ok" = xno; then for flag in $ax_pthread_flags; do case $flag in none) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 $as_echo_n "checking whether pthreads work without any flags... " >&6; } ;; -*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5 $as_echo_n "checking whether pthreads work with $flag... " >&6; } PTHREAD_CFLAGS="$flag" ;; pthread-config) # Extract the first word of "pthread-config", so it can be a program name with args. set dummy pthread-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_prog_ax_pthread_config+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ax_pthread_config"; then ac_cv_prog_ax_pthread_config="$ax_pthread_config" # 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_ax_pthread_config="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_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" fi fi ax_pthread_config=$ac_cv_prog_ax_pthread_config if test -n "$ax_pthread_config"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 $as_echo "$ax_pthread_config" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x"$ax_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5 $as_echo_n "checking for the pthreads library -l$flag... " >&6; } PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include static void routine(void *a) { a = 0; } static void *start_routine(void *a) { return a; } int main () { pthread_t th; pthread_attr_t attr; pthread_create(&th, 0, start_routine, 0); pthread_join(th, 0); pthread_attr_init(&attr); pthread_cleanup_push(routine, 0); pthread_cleanup_pop(0) /* ; */ ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_pthread_ok=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 $as_echo "$ax_pthread_ok" >&6; } if test "x$ax_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Various other checks: if test "x$ax_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 $as_echo_n "checking for joinable pthread attribute... " >&6; } attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int attr = $attr; return attr /* ; */ ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : attr_name=$attr; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5 $as_echo "$attr_name" >&6; } if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then cat >>confdefs.h <<_ACEOF #define PTHREAD_CREATE_JOINABLE $attr_name _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5 $as_echo_n "checking if more special flags are required for pthreads... " >&6; } flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5 $as_echo "${flag}" >&6; } if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 $as_echo_n "checking for PTHREAD_PRIO_INHERIT... " >&6; } if ${ax_cv_PTHREAD_PRIO_INHERIT+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int i = PTHREAD_PRIO_INHERIT; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_PTHREAD_PRIO_INHERIT=yes else ax_cv_PTHREAD_PRIO_INHERIT=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: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 $as_echo "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"; then : $as_echo "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: must compile with xlc_r or cc_r if test x"$GCC" != xyes; then for ac_prog in xlc_r cc_r 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_PTHREAD_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PTHREAD_CC"; then ac_cv_prog_PTHREAD_CC="$PTHREAD_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_PTHREAD_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 PTHREAD_CC=$ac_cv_prog_PTHREAD_CC if test -n "$PTHREAD_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 $as_echo "$PTHREAD_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PTHREAD_CC" && break done test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}" else PTHREAD_CC=$CC fi else PTHREAD_CC="$CC" fi # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$ax_pthread_ok" = xyes; then echo Using settings from AX_PTHREAD macro LIBS="$PTHREAD_LIBS $LIBS" CFLAGS=" $PTHREAD_CFLAGS $CFLAGS" CXXFLAGS="$PTHREAD_CFLAGS $CXXFLAGS " CPPFLAGS="$PTHREAD_CFLAGS $CPPFLAGS " CC="$PTHREAD_CC" $as_echo "#define HAVE_PTHREAD 1" >>confdefs.h : else ax_pthread_ok=no { $as_echo "$as_me:${as_lineno-$LINENO}: pthreads not found by ax_pthread macro" >&5 $as_echo "$as_me: pthreads not found by ax_pthread macro" >&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 fi for ac_header in pthread.h do : ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" if test "x$ac_cv_header_pthread_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTHREAD_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthreadGC2" >&5 $as_echo_n "checking for pthread_create in -lpthreadGC2... " >&6; } if ${ac_cv_lib_pthreadGC2_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthreadGC2 $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_pthreadGC2_pthread_create=yes else ac_cv_lib_pthreadGC2_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_pthreadGC2_pthread_create" >&5 $as_echo "$ac_cv_lib_pthreadGC2_pthread_create" >&6; } if test "x$ac_cv_lib_pthreadGC2_pthread_create" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBPTHREADGC2 1 _ACEOF LIBS="-lpthreadGC2 $LIBS" fi # On mingw, be sure to use the static version and be sure we are using mthread option # (which should be a no-op on later version of G++ anyway) for ac_func in pthread_win32_process_attach_np pthread_win32_process_detach_np pthread_win32_thread_attach_np pthread_win32_thread_detach_np do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_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 # end PTHREAD SUPPORT ################################################################ # This allows us to easily disable optimizations for debugging # Check whether --with-noopt was given. if test "${with_noopt+set}" = set; then : withval=$with_noopt; fi if test x"${AFF_NOOPT}" != "x" ; then with_noopt="yes"; fi if test "${with_noopt}" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: XXXXXXXX DROPPING OPTIMIZATION FLAGS XXXXXXXX" >&5 $as_echo "$as_me: XXXXXXXX DROPPING OPTIMIZATION FLAGS XXXXXXXX" >&6;} CFLAGS=`echo "$CFLAGS" | sed s/-O[0-9]// | sed s/-fast//` # note the double quoting! CXXFLAGS=`echo "$CXXFLAGS" | sed s/-O[0-9]// | sed s/-fast//` fi 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 "${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 : "${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 MD5DEEP $as_me 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="\\ MD5DEEP config.status 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' MKDIR_P='$MKDIR_P' 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" _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 "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; "tests/testfiles/Makefile") CONFIG_FILES="$CONFIG_FILES tests/testfiles/Makefile" ;; "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; *) 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 ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; 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 s&@MKDIR_P@&$ac_MKDIR_P&;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 } ;; 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 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 echo ============================ echo $0 finished at `date` echo PACKAGE_NAME: $PACKAGE_NAME echo PACKAGE_VERSION: $PACKAGE_VERSION echo CC: $CC echo CXX: $CXX echo CPPFLAGS: $CPPFLAGS echo CFLAGS: $CFLAGS echo CXXFLAGS: $CXXFLAGS echo LIBS: $LIBS echo LDFLAGS: $LDFLAGS md5deep-4.2/configure.ac000066400000000000000000000216241176640446200152070ustar00rootroot00000000000000 # configure.ac script for md5deep/hashdeep family of programs. # AC_PREREQ(2.57) AC_INIT([MD5DEEP],[4.2],[research@jessekornblum.com]) AC_CONFIG_FILES([Makefile src/Makefile man/Makefile tests/Makefile tests/testfiles/Makefile ]) AM_INIT_AUTOMAKE AC_CONFIG_HEADERS([config.h]) AC_DEFINE([_FILE_OFFSET_BITS],64,[Make sure we are using 64-bit offsets]) AC_PROG_CC AC_PROG_CXX AC_PROG_INSTALL ################################################################ # http://osdir.com/ml/gnu.mingw.devel/2003-09/msg00040.html # Note: Windows 95 WINVER=0x400 # Windows 98 WINVER=0x400 _WIN32_WINDOWS=0x0410 # Windows Me WINVER=0x400 _WIN32_WINDOWS=0x0490 # Windows NT 4.0 WINVER=0x0400 _WIN32_WINNT=0x0400 # Windows NT 4.0 SP3 WINVER=0x0400 _WIN32_WINNT=0x0403 # Windows 2000 WINVER=0x500 _WIN32_WINNT=0x0500 # Windows XP WINVER=0x501 _WIN32_WINNT=0x0501 # Windows Server 2003 WINVER=0x502 _WIN32_WINNT=0x0502 # mingw32 includes i686-w64-mingw32 and x86_64-w64-mingw32 mingw="no" case $host in *-*-*linux*-*) AC_DEFINE([__LINUX__],1,[Linux operating system functions]) ;; *-*-mingw32*) LIBS="-lws2_32 -lgdi32 $LIBS" # previously had -liberty CPPFLAGS="-DUNICODE -D_UNICODE -D__MSVCRT_VERSION__=0x0601 -DWINVER=0x0500 -D_WIN32_WINNT=0x0500 -DHAVE_STRUCT_TIMESPEC $CPPFLAGS" CXXFLAGS="$CXXFLAGS -Wno-format " # compiler mingw-4.3.0 is broken on I64u formats CXXFLAGS="$CXXFLAGS --static" AC_DEFINE([MINGW],1,[We are cross-compiling with MINGW]) mingw="yes" ;; esac # Bring additional directories where things might be found into our # search path. I don't know why autoconf doesn't do this by default if test x"${mingw}" == "xno" ; then for spfx in /usr/local /opt/local /sw ; do echo checking ${spfx}/include if test -d ${spfx}/include; then CPPFLAGS="-I${spfx}/include $CPPFLAGS" LDFLAGS="-L${spfx}/lib $LDFLAGS" fi done fi # # ################################################################ AC_GNU_SOURCE AC_CANONICAL_HOST ################################################################ ### I am a glutten for punishment and this is security-critical software # Check GCC WARNINGS_TO_TEST="-MD -D_FORTIFY_SOURCE=2 -Wpointer-arith -Wmissing-declarations -Wmissing-prototypes \ -Wshadow -Wwrite-strings -Wcast-align -Waggregate-return \ -Wbad-function-cast -Wcast-qual -Wundef -Wredundant-decls -Wdisabled-optimization \ -Wfloat-equal -Wmissing-format-attribute -Wmultichar -Wc++-compat -Wmissing-noreturn -funit-at-a-time" if test $mingw = "no" ; then # add the warnings we don't want to do on mingw $WARNINGS_TO_TEST="$WARNINGS_TO_TEST -Wall -Wstrict-prototypes -Weffc++" fi for option in $WARNINGS_TO_TEST do SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $option" AC_MSG_CHECKING([whether gcc understands $option]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [has_option=yes], [has_option=no; CFLAGS="$SAVE_CFLAGS"]) AC_MSG_RESULT($has_option) unset has_option unset SAVE_CFLAGS done unset option # Check G++ # We don't use these warnings: # -Waggregate-return -- aggregate returns are GOOD; they simplify code design # We can use these warnings after ZLIB gets upgraded: # -Wundef --- causes problems with zlib # -Wcast-qual # -Wmissing-format-attribute - can't get this one right AC_LANG_PUSH(C++) WARNINGS_TO_TEST="-Wall -MD -D_FORTIFY_SOURCE=2 -Wpointer-arith \ -Wshadow -Wwrite-strings -Wcast-align \ -Wredundant-decls -Wdisabled-optimization \ -Wfloat-equal -Wmultichar -Wmissing-noreturn \ -Wstrict-null-sentinel -Woverloaded-virtual -Wsign-promo -funit-at-a-time" if test $mingw = "no" ; then # add the warnings we don't want to do on mingw $WARNINGS_TO_TEST="$WARNINGS_TO_TEST -Weffc++" fi for option in $WARNINGS_TO_TEST do SAVE_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $option" AC_MSG_CHECKING([whether g++ understands $option]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [has_option=yes], [has_option=no; CXXFLAGS="$SAVE_CXXFLAGS"]) AC_MSG_RESULT($has_option) unset has_option unset SAVE_CXXFLAGS done unset option AC_LANG_POP() # ################################################################ # Determine UTC date offset CPPFLAGS="$CPPFLAGS -DUTC_OFFSET=`date +%z`" # Checks for header files. AC_HEADER_DIRENT AC_HEADER_STDC AC_CHECK_HEADERS([libgen.h fcntl.h limits.h inttypes.h malloc.h stdint.h stdlib.h string.h \ sys/cdefs.h sys/types.h sys/ioctl.h sys/mmap.h sys/mman.h sys/param.h \ sys/resource.h wchar.h unistd.h sys/stat.h sys/disk.h\ CommonCrypto/CommonDigest.h ]) # These functions not available everywhere AC_CHECK_FUNCS([_gmtime64_s _gmtime64 gmtime_r mmap usleep mkstemp vasprintf getrusage getprogname isxdigit]) # This is for Apple's new CommonCrypto (which is FIPS validated) AC_CHECK_FUNCS([CC_MD5_Init CC_SHA1_Init CC_SHA256_Init]) # These includes are required on FreeBSD AC_CHECK_HEADERS([sys/mount.h],[],[], [#ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_PARAM_H # include #endif]) # http://www.gnu.org/s/hello/manual/autoconf/Particular-Headers.html # # If a program may include both time.h and sys/time.h, define # TIME_WITH_SYS_TIME. On some ancient systems, sys/time.h included # time.h, but time.h was not protected against multiple inclusion, so # programs could not explicitly include both files. This macro is # useful in programs that use, for example, struct timeval as well as # struct tm. It is best used in conjunction with HAVE_SYS_TIME_H, # which can be checked for using AC_CHECK_HEADERS([sys/time.h]). AC_CHECK_HEADERS([time.h sys/time.h]) AC_HEADER_TIME ################################################################ # DFXML support AC_CHECK_HEADERS([sys/cdefs.h sys/resource.h pwd.h sys/utsname.h]) AC_CHECK_FUNCS([localtime_r getuid gethostname getwpuid getrusage]) # Don't think we need this anymore. # AC_C_BIGENDIAN # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_TYPE_OFF_T AC_TYPE_SIZE_T AC_CHECK_MEMBERS([struct stat.st_blksize]) # Checks for library functions. AC_FUNC_CLOSEDIR_VOID AC_FUNC_FSEEKO AC_SYS_LARGEFILE AC_PROG_GCC_TRADITIONAL AC_FUNC_LSTAT AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK AC_FUNC_MEMCMP AC_FUNC_STAT AC_FUNC_VPRINTF # More permutations of fseek/ftell lossage AC_CHECK_FUNCS([fseeko64 ftello64]) # See if program_invocation_name is defined on this system AC_TRY_COMPILE([#include ], [const char *progname = program_invocation_name;], extern_program_invocation_name=yes, extern_program_invocation_name=no) if test x"${extern_program_invocation_name}" = x"yes"; then AC_MSG_NOTICE([extern program_invocation_name in errno.h]) AC_DEFINE(HAVE_PROGRAM_INVOCATION_NAME,1,[define to 1 if program_invocation_name is available]) fi ################################################################ # PTHREAD support # With special nods to compiling under mingw if test x"$mingw" = x"yes"; then AC_MSG_NOTICE([Checking for pthreads under mingw]) AC_DEFINE([HAVE_STRUCT_TIMESPEC],1,[Required for mingw]) CFLAGS="$CFLAGS -mthreads " CPPFLAGS="-DPTW32_STATIC_LIB $CPPFLAGS" CXXFLAGS="$CXXFLAGS -mthreads " AC_DEFINE(HAVE_PTHREAD,1,[Defined to POSIX threads for mingw]) else m4_include([m4/ax_pthread.m4]) AX_PTHREAD([ echo Using settings from [AX_PTHREAD] macro LIBS="$PTHREAD_LIBS $LIBS" CFLAGS=" $PTHREAD_CFLAGS $CFLAGS" CXXFLAGS="$PTHREAD_CFLAGS $CXXFLAGS " CPPFLAGS="$PTHREAD_CFLAGS $CPPFLAGS " CC="$PTHREAD_CC" AC_DEFINE(HAVE_PTHREAD,1,[Defined to POSIX threads for mingw]) ],[AC_MSG_NOTICE([pthreads not found by ax_pthread macro])]) fi AC_CHECK_HEADERS([pthread.h]) AC_CHECK_LIB([pthreadGC2],[pthread_create]) # On mingw, be sure to use the static version and be sure we are using mthread option # (which should be a no-op on later version of G++ anyway) AC_CHECK_FUNCS([pthread_win32_process_attach_np pthread_win32_process_detach_np pthread_win32_thread_attach_np pthread_win32_thread_detach_np]) # end PTHREAD SUPPORT ################################################################ # This allows us to easily disable optimizations for debugging AC_ARG_WITH([noopt], AC_HELP_STRING([--with-noopt],[Drop -O C flags])) if test x"${AFF_NOOPT}" != "x" ; then with_noopt="yes"; fi if test "${with_noopt}" = "yes" ; then AC_MSG_NOTICE([XXXXXXXX DROPPING OPTIMIZATION FLAGS XXXXXXXX]) CFLAGS=`echo "$CFLAGS" | sed s/-O[[0-9]]// | sed s/-fast//` # note the double quoting! CXXFLAGS=`echo "$CXXFLAGS" | sed s/-O[[0-9]]// | sed s/-fast//` fi AC_OUTPUT echo ============================ echo $0 finished at `date` echo PACKAGE_NAME: $PACKAGE_NAME echo PACKAGE_VERSION: $PACKAGE_VERSION echo CC: $CC echo CXX: $CXX echo CPPFLAGS: $CPPFLAGS echo CFLAGS: $CFLAGS echo CXXFLAGS: $CXXFLAGS echo LIBS: $LIBS echo LDFLAGS: $LDFLAGS md5deep-4.2/depcomp000077500000000000000000000275331176640446200143030ustar00rootroot00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects # Copyright 1999, 2000 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. # 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 . 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 # `libtool' can also be set to `yes' or `no'. if test -z "$depfile"; then base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'` dir=`echo "$object" | sed 's,/.*$,/,'` if test "$dir" = "$object"; then dir= fi # FIXME: should be _deps on DOS. depfile="$dir.deps/$base" fi 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 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. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" 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. 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. stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" outname="$stripped.o" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi 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,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$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" ;; 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 tmpdepfile1="$dir.libs/$base.lo.d" tmpdepfile2="$dir.libs/$base.d" "$@" -Wc,-MD else tmpdepfile1="$dir$base.o.d" tmpdepfile2="$dir$base.d" "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi if test -f "$tmpdepfile1"; then tmpdepfile="$tmpdepfile1" else tmpdepfile="$tmpdepfile2" fi if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a space and a tab 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 proprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. We will use -o /dev/null later, # however we can't do the remplacement now because # `-o $object' might simply not be used 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 "$@" -o /dev/null $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 $? # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; -*) ;; *) 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 proprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--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 '/^# [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 proprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 md5deep-4.2/install-sh000077500000000000000000000127011176640446200147210ustar00rootroot00000000000000#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, 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. # # 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. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else : fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: chmodcmd="" else instcmd=$mkdirprog fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f "$src" ] || [ -d "$src" ] then : else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else : fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else : fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else : fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else : fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # 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 $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 md5deep-4.2/m4/000077500000000000000000000000001176640446200132345ustar00rootroot00000000000000md5deep-4.2/m4/ax_pthread.m4000066400000000000000000000301621176640446200156170ustar00rootroot00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_pthread.html # =========================================================================== # # SYNOPSIS # # AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) # # DESCRIPTION # # This macro figures out how to build C programs using POSIX threads. It # sets the PTHREAD_LIBS output variable to the threads library and linker # flags, and the PTHREAD_CFLAGS output variable to any special C compiler # flags that are needed. (The user can also force certain compiler # flags/libs to be tested by setting these environment variables.) # # Also sets PTHREAD_CC to any special C compiler that is needed for # multi-threaded programs (defaults to the value of CC otherwise). (This # is necessary on AIX to use the special cc_r compiler alias.) # # NOTE: You are assumed to not only compile your program with these flags, # but also link it with them as well. e.g. you should link with # $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS # # If you are only building threads programs, you may wish to use these # variables in your default LIBS, CFLAGS, and CC: # # LIBS="$PTHREAD_LIBS $LIBS" # CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # CC="$PTHREAD_CC" # # In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant # has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name # (e.g. PTHREAD_CREATE_UNDETACHED on AIX). # # Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the # PTHREAD_PRIO_INHERIT symbol is defined when compiling with # PTHREAD_CFLAGS. # # ACTION-IF-FOUND is a list of shell commands to run if a threads library # is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it # is not found. If ACTION-IF-FOUND is not specified, the default action # will define HAVE_PTHREAD. # # Please let the authors know if this macro fails on any platform, or if # you have any other suggestions or comments. This macro was based on work # by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help # from M. Frigo), as well as ac_pthread and hb_pthread macros posted by # Alejandro Forero Cuervo to the autoconf macro repository. We are also # grateful for the helpful feedback of numerous users. # # Updated for Autoconf 2.68 by Daniel Richard G. # # LICENSE # # Copyright (c) 2008 Steven G. Johnson # Copyright (c) 2011 Daniel Richard G. # # 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 3 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, see . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 16 AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) AC_DEFUN([AX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_LANG_PUSH([C]) ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) AC_TRY_LINK_FUNC(pthread_join, ax_pthread_ok=yes) AC_MSG_RESULT($ax_pthread_ok) if test x"$ax_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items starting with a "-" are # C compiler flags, and other items are library names, except for "none" # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) # -pthreads: Solaris/gcc # -mthreads: Mingw32/gcc, Lynx/gcc # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads too; # also defines -D_REENTRANT) # ... -mt is also the pthreads flag for HP/aCC # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case "${host_cpu}-${host_os}" in *solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (We need to link with -pthreads/-mt/ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather # a function called by this macro, so we could check for that, but # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" ;; *-darwin*) ax_pthread_flags="-pthread $ax_pthread_flags" ;; esac if test x"$ax_pthread_ok" = xno; then for flag in $ax_pthread_flags; do case $flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; -*) AC_MSG_CHECKING([whether pthreads work with $flag]) PTHREAD_CFLAGS="$flag" ;; pthread-config) AC_CHECK_PROG(ax_pthread_config, pthread-config, yes, no) if test x"$ax_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) AC_MSG_CHECKING([for the pthreads library -l$flag]) PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. AC_LINK_IFELSE([AC_LANG_PROGRAM([#include static void routine(void *a) { a = 0; } static void *start_routine(void *a) { return a; }], [pthread_t th; pthread_attr_t attr; pthread_create(&th, 0, start_routine, 0); pthread_join(th, 0); pthread_attr_init(&attr); pthread_cleanup_push(routine, 0); pthread_cleanup_pop(0) /* ; */])], [ax_pthread_ok=yes], []) LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" AC_MSG_RESULT($ax_pthread_ok) if test "x$ax_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Various other checks: if test "x$ax_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. AC_MSG_CHECKING([for joinable pthread attribute]) attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], [int attr = $attr; return attr /* ; */])], [attr_name=$attr; break], []) done AC_MSG_RESULT($attr_name) if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, [Define to necessary symbol if this constant uses a non-standard name on your system.]) fi AC_MSG_CHECKING([if more special flags are required for pthreads]) flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; esac AC_MSG_RESULT(${flag}) if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], ax_cv_PTHREAD_PRIO_INHERIT, [ AC_LINK_IFELSE([ AC_LANG_PROGRAM([[#include ]], [[int i = PTHREAD_PRIO_INHERIT;]])], [ax_cv_PTHREAD_PRIO_INHERIT=yes], [ax_cv_PTHREAD_PRIO_INHERIT=no]) ]) AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"], AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], 1, [Have PTHREAD_PRIO_INHERIT.])) LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: must compile with xlc_r or cc_r if test x"$GCC" != xyes; then AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) else PTHREAD_CC=$CC fi else PTHREAD_CC="$CC" fi AC_SUBST(PTHREAD_LIBS) AC_SUBST(PTHREAD_CFLAGS) AC_SUBST(PTHREAD_CC) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$ax_pthread_ok" = xyes; then ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) : else ax_pthread_ok=no $2 fi AC_LANG_POP ]) dnl AX_PTHREAD md5deep-4.2/man/000077500000000000000000000000001176640446200134675ustar00rootroot00000000000000md5deep-4.2/man/Makefile.am000066400000000000000000000010141176640446200155170ustar00rootroot00000000000000ALL_GOALS={md5,sha1,sha256,tiger,whirlpool,hashdeep} man_MANS=md5deep.1 sha1deep.1 sha256deep.1 tigerdeep.1 whirlpooldeep.1 hashdeep.1 # We erase the old man pages, just in case they might be symbolic links # (symbolic links were used in a previous release) install-man: update-manpages rm -f $(DESTDIR)${man1dir}/${ALL_GOALS}deep.1 $(MAKE) install-man1 update-manpages: md5deep.1 $(INSTALL) $< sha1deep.1 $(INSTALL) $< sha256deep.1 $(INSTALL) $< tigerdeep.1 $(INSTALL) $< whirlpooldeep.1 EXTRA_DIST=${man_MANS} md5deep-4.2/man/Makefile.in000066400000000000000000000314611176640446200155410ustar00rootroot00000000000000# 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@ subdir = man DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/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' man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(man_MANS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ 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@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ 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@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ALL_GOALS = {md5,sha1,sha256,tiger,whirlpool,hashdeep} man_MANS = md5deep.1 sha1deep.1 sha256deep.1 tigerdeep.1 whirlpooldeep.1 hashdeep.1 EXTRA_DIST = ${man_MANS} 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): install-man1: $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list=''; test -n "$(man1dir)" || exit 0; \ { for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[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,^[^1][0-9a-z]*$$,1,;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)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$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)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ test -z "$$files" || { \ echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(man1dir)" && 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)$(man1dir)"; 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." clean: clean-am clean-am: clean-generic 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-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 pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic 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-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am uninstall-man uninstall-man1 # We erase the old man pages, just in case they might be symbolic links # (symbolic links were used in a previous release) install-man: update-manpages rm -f $(DESTDIR)${man1dir}/${ALL_GOALS}deep.1 $(MAKE) install-man1 update-manpages: md5deep.1 $(INSTALL) $< sha1deep.1 $(INSTALL) $< sha256deep.1 $(INSTALL) $< tigerdeep.1 $(INSTALL) $< whirlpooldeep.1 # 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: md5deep-4.2/man/hashdeep.1000066400000000000000000000240121176640446200153310ustar00rootroot00000000000000.TH HASHDEEP "1" "v4.2 \- 11 Jun 2012" "AFOSI" "United States Air Force" .SH NAME hashdeep \- Compute, compare, or audit multiple message digests .SH SYNOPSIS .B hashdeep -V | -h .br .B hashdeep [-c [,]] [-k ] [-i ] [\-f ] [\-o ] [-amxwMXrespblvv] [\-F] [\-j ] [\fBFILES\fR] .SH DESCRIPTION .PP Computes multiple hashes, or message digests, for any number of files while optionally recursively digging through the directory structure. By default the program computes MD5 and SHA-256 hashes, equivalent to \-c md5,sha256. Can also take a list of known hashes and display the filenames of input files whose hashes either do or do not match any of the known hashes. Can also use a list of known hashes to audit a set of FILES. Errors are reported to standard error. If no FILES are specified, reads from standard input. .TP \fB\-c [,...]\fR Computation mode. Compute hashes of FILES using the algorithms specified. Legal values are md5, sha1, sha256, tiger, and whirlpool. .TP \fB\-k \fR Load a file of known hashes. This flag is required when using any of the matching or audit modes (i.e. \-m, \-x, \-M, \-X, or \-a) This flag may be used more than once to add multiple sets of known hashes. Loading sets with different hash algorithms can sometimes generate spurrious hash collisions. For example, let's say we have two hash sets, A and B, which have some overlapping files. For example, the file /usr/bin/bad is in both sets. In A we've recorded the MD5 and SHA-256. In B we've recorded the MD5, SHA-1, and SHA-256. Because these two records are different, they will both be loaded. When the program computes all three hashes and compares them to the set of knowns, we will get an exact match from the record in B and a collision from the record in A. .TP \fB\-a \fR Audit mode. Each input file is compared against the set of knowns. An audit is said to pass if each input file is matched against exactly one file in set of knowns. Any collisions, new files, or missing files will make the audit fail. Using this flag alone produces a message, either "Audit passed" or "Audit Failed". Use the verbose modes, \-v, for more details. Using \-v prints the number of files in each category. Using \-v a second time prints any discrepancies. Using \-v a third time prints the results for every file examined and every known file. .br Due to limitations in the program, any filenames with Unicode characters will appear to have moved during an audit. See the section "UNICODE SUPPORT" below. .TP \fB\-m \fR Positive matching, requires at least one use of the \-k flag. The input files are examined one at a time, and only those files that match the list of known hashes are output. The only acceptable format for known hashes is the output of previous hashdeep runs. .br \fB\fR If standard input is used with the -m flag, displays "stdin" if the input matches one of the hashes in the list of known hashes. If the hash does not match, the program displays no output. .br \fB\fR This flag may not be used in conjunction with the \-x, \-X, or \-a flags. See the section "UNICODE SUPPORT" below. .TP \fB\-x \fR Negative matching. Same as the \-m flag above, but does negative matching. That is, only those files NOT in the list of known hashes are displayed. .br \fB\fR This flag may not be used in conjunction with the \-m, \-M, or \-a flags. See the section "UNICODE SUPPORT" below. .TP \fB\-f\fR Takes a list of files to be hashed from the specified file. Each line is assumed to be a filename. This flag can only be used once per invocation. If it's used a second time, the second instance will clobber the first. .br Note that you can still use other flags, such as the \-m or \-x modes, and submit additional FILES on the command line. .TP \fB\-w \fR When used with positive matching modes (\-m,\-M) displays the filename of the known hash that matched the input file. See the section "UNICODE SUPPORT" below. .TP \fB\-M\fR and \fB-X\fR Same as \-m and \-x above, but displays the hash for each file that does (or does not) match the list of known hashes. .TP \fB\-r\fR Enables recursive mode. All subdirectories are traversed. Please note that recursive mode cannot be used to examine all files of a given file extension. For example, calling hashdeep -r *.txt will examine all files in \fIdirectories\fR that end in .txt. .TP \fB\-e\fR Displays a progress indicator and estimate of time remaining for each file being processed. Time estimates for files larger than 4GB are not available on Windows. This mode may not be used with th \-p mode. .TP \fB\-i \fR Size threshold mode. Only hash files smaller than the given the threshold. Sizes may be specified using IEC multipliers b,k,m,g,t,p, and e. .TP \fB\-o\fR Enables expert mode. Allows the user specify which (and only which) types of files are processed. Directory processing is still controlled with the \-r flag. The expert mode options allowed are: .br f \- Regular files .br b \- Block Devices .br c \- Character Devices .br p \- Named Pipes .br l \- Symbolic Links .br s \- Sockets .br d \- Solaris Doors .br e \- Windows PE executables .TP \fB\-s\fR Enables silent mode. All error messages are supressed. .TP \fB\-p\fR Piecewise mode. Breaks files into chunks before hashing. Chunks may be specified using IEC multipliers b,k,m,g,t,p, and e. (Never let it be said that the author didn’t plan ahead.) .TP \fB\-b\fR Enables bare mode. Strips any leading directory information from displayed filenames. This flag may not be used in conjunction with the \-l flag. .TP \fB\-l\fR Enables relative file paths. Instead of printing the absolute path for each file, displays the relative file path as indicated on the command line. This flag may not be used in conjunction with the \-b flag. .TP \fB\-v\fR Enables verbose mode. Use again to make the program more verbose. This mostly changes the behvaior of the audit mode, \-a. .TP \fB-jnn\fR Controls multi-threading. By default the program will create one producer thread to scan the file system and one hashing thread per CPU core. Multi-threading causes output filenames to be in non-deterministic order, as files that take longer to hash will be delayed while they are hashed. If a deterministic order is required, specify \fB-j0\fR to disable multi-threading .TP \fB-d\fR Output in Digital Forensics XML (DFXML) format. .TP \fB-u\fR Quote Unicode output. For example, the snowman is shown as \fBU+C426\fR. .TP \fB-F\fR Specifies the input mode that is used to read files. The default is \fB-Fb\fR (buffered I/O) which reads files with fopen(). Specifying \fB-Fu\fR will use unbuffered I/O and read the file with open(). Specifying \fB-Fm\fR will use memory-mapped I/O which will be faster on some platforms, but which (currently) will not work with files that produce I/O errors. .TP \fB\-h\fR Show a help screen and exit. .TP \fB\-V\fR Show the version number and exit. .SH UNICODE SUPPORT As of version 3.0 the program supports Unicode characters in filenames on Microsoft Windows systems for filenames specified on the command line with globbing (e.g. *), for files specified with the \fB-f\fR of files to hash, and for files read from directories using the \fB-r\fR option. By default all program input and output should be in UTF-8. The program automatically converts this to UTF-16 for opening files). On Unix/Linux/MacOS, you should use a terminal emulator that supports UTF-8 and UTF-8 characters in filenames will be properly displayed. On Windows, please note that the onsole is not capiable of displaying Unicode characters. You must either redirect output to a file and open the file with Wordpad (which can display Unicode), or you must specify the \fB-u\fR option to quote Unicode using standard \fBU+XXXX\fR notation. Currently the file name of a file containing known hashes may not be specified as a unicode filename, but you can specify the name using tab completition or an asterisk (e.g. md5deep -m *.txt where there is only one file with a .txt extension). .SH RETURN VALUE Returns zero on success, one on error. .SH AUTHOR hashdeep was written by Jesse Kornblum, research@jessekornblum.com, and Simson Garfinkel. .SH KNOWN ISSUES Using the \-r flag cannot be used to recursively process all files of a given extension in a directory. This is a feature, not a bug. If you need to do this, use the \fBfind\fR(1) command. The program will fail if you attempt to compare 2^64 or more input files against a set of known files. .SH REPORTING BUGS We take all bug reports \fIvery\fR seriously. Any bug that jeopardizes the forensic integrity of this program could have serious consequenses on people's lives. When submitting a bug report, please include a description of the problem, how you found it, and your contact information. .PP Send bug reports to the author at the address above. .PP .SH COPYRIGHT This program is a work of the US Government. In accordance with 17 USC 105, copyright protection is not available for any work of the US Government. This program is PUBLIC DOMAIN. Portions of this program contain code that is licensed under the terms of the General Public License (GPL). Those portions retain their original copyright and license. See the file COPYING for more details. .PP There is NO warranty for this program; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH SEE ALSO More information and installation instructions can be found in the README file. Current versions of both documents can be found on the project homepage: http://md5deep.sourceforge.net/ .PP The MD5 specification, RFC 1321, is available at .br http://www.ietf.org/rfc/rfc1321.txt .PP The SHA-1 specification, RFC 3174, is available at .br http://www.faqs.org/rfcs/rfc3174.html .PP The SHA-256 specification, FIPS 180-2, is available at .br http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf .PP The Tiger specification is available at .br http://www.cs.technion.ac.il/~biham/Reports/Tiger/ .PP The Whirlpool specification is available at .br http://planeta.terra.com.br/informatica/paulobarreto/WhirlpoolPage.html md5deep-4.2/man/md5deep.1000066400000000000000000000277041176640446200151060ustar00rootroot00000000000000.TH MD5DEEP "1" "v4.2 \- 11 Jun 2012" "AFOSI" "United States Air Force" .SH NAME md5deep \- Compute and compare MD5 message digests .br sha1deep \- Compute and compare SHA-1 message digests .br sha256deep \- Compute and compare SHA-256 message digests .br tigerdeep \- Compute and compare Tiger message digests .br whirlpooldeep \- Compute and compare Whirlpool message digests .SH SYNOPSIS .B md5deep -v | -V | -h .br .B md5deep [\-m|\-M|\-x|\-X ] [-a|-A ] [\-f ] [\-p ] [\-i ] [\-tnwzresS0lbkqZud] [\-F ] [\-o ] [\-j ] [[\fBFILES\fR] .SH DESCRIPTION .PP Computes the hashes, or message digest, for any number of files while optionally recursively digging through the directory structure. Can also take a list of known hashes and display the filenames of input files whose hashes either do or do not match any of the known hashes. Errors are reported to standard error. If no FILES are specified, reads from standard input. .TP \fB\-p \fR Piecewise mode. Breaks files into chunks before hashing. Chunks may be specified using IEC multipliers b, k, m, g, t, p, or e. (Never let it be said that the author didn't plan ahead!) This mode cannot be used with the \-z mode. .TP \fB\-i|\-I \fR Size threshold mode. Only hash files smaller than the given the threshold. In \-i mode, simply omits those files larger than the threshold. In \-I mode, displays all files, but uses asterisks for the hashes of files larger than the threshold. Sizes may be specified using IEC multipliers b, k, m, g, t, p, or e. .TP \fB\-r\fR Enables recursive mode. All subdirectories are traversed. Please note that recursive mode cannot be used to examine all files of a given file extension. For example, calling md5deep -r *.txt will examine all files in \fIdirectories\fR that end in .txt. .TP \fB\-e\fR Displays a progress indicator and estimate of time remaining for each file being processed. Time estimates for files larger than 4GB are not available on Windows. This mode may not be used with th \-p mode. .TP \fB\-m\fR Enables matching mode. The file given should be a list of known hashes. The input files are examined one at a time, and only those files that match the list of known hashes are output. This flag may be used more than once to add multiple sets of known hashes. Acceptable formats for lists of known hashes are plain (such as those generated by md5deep or md5sum), Hashkeeper files, iLook, and the National Software Reference Library (NSRL) as produced by the National Institute for Standards in Technology. .br \fB\fR If standard input is used with the -m flag, displays "stdin" if the input matches one of the hashes in the list of known hashes. If the hash does not match, the program displays no output. .br \fB\fR This flag may not be used in conjunction with the \-x, \-X, or \-A flags. See the section "UNICODE SUPPORT" below. .TP \fB\-x\fR Same as the \-m flag above, but does negative matching. That is, only those files NOT in the list of known hashes are displayed. .br \fB\fR This flag may not be used in conjunction with the \-m, \-M, or \-a flags. See the section "UNICODE SUPPORT" below. .TP \fB\-M\fR and \fB-X\fR Same as \-m and \-x above, but displays the hash for each file that does (or does not) match the list of known hashes. .TP \fB\-a\fR Adds a single hash to the list of known hashes used for matching mode, and if not already enabled, enables matching mode. Adding single hashes cannot, by itself, be used to print the hashes of matching files like the \-M flag does. When used in conjunction with the \-w flag, the filename displayed is just the hash submitted on the command line. .br \fB\fR This flag may not be used in conjunction with the \-x, \-X, or \-A flags. .TP \fB\-A\fR Same as \-a above, but does negative matching. This flag may not be used in conjunction with the \-m, \-M, or \-A flags. .TP \fB\-f\fR Takes a list of files to be hashed from the specified file. Each line is assumed to be a filename. This flag can only be used once per invocation. If it's used a second time, the second instance will clobber the first. .br Note that you can still use other flags, such as the \-m or \-x modes, and submit additional FILES on the command line. .TP \fB\-w\fR During any of the matching modes (\-m,\-M,\-x,or \-X), displays the filename of the known hash that matched the input file. See the section "UNICODE SUPPORT" below. .TP \fB\-t\fR Display a timestamp in GMT with each result. On Windows this timestamp will be the file's creation time. On all other systems it should be the file's change time. .TP \fB\-n\fR During any of the matching modes (\-m,\-M,\-x,or \-X), displays only the filenames of any known hashes that were not matched by any of the input files. .TP \fB\-s\fR Enables silent mode. All error messages are supressed. .TP \fB\-S\fR Like silent mode, but still displays warnings on improperly formatted hashes in the list of known hashes. .TP \fB\-z\fR Enables file size mode. Prepends the hash with a ten digit representation of the size of each file processed. If the file size is greater than 9999999999 bytes (about 9.3GB) the program displays 9999999999 for the size. .TP \fB\-q\fR Quiet mode. File names are omitted from the output. .TP \fB\-Z\fR Produces output in Triage format. Each line contans the file's size, a tab, a hash of the first 512 bytes, a tab, the hash of the complete file, a tab, and the file name. These values are intended in increasing order of specificity. That is, two files with different sizes cannot possibly match. This is a fast comparison and should be done first. Next, two files with different partial hashes cannot possibly match. This is often faster than hashing the whole file. Finally, if those two pieces align, then it's worth reading and hashing the entire file. .TP \fB\-0\fR Uses a NULL character (/0) to terminate each line instead of a newline. Useful for processing filenames with strange characters. .TP \fB\-l\fR Enables relative file paths. Instead of printing the absolute path for each file, displays the relative file path as indicated on the command line. This flag may not be used in conjunction with the \-b flag. .TP \fB\-b\fR Enables bare mode. Strips any leading directory information from displayed filenames. This flag may not be used in conjunction with the \-l flag. .TP \fB\-k\fR Enables asterisk mode. An asterisk is inserted in lieu of a second space between the filename and the hash, just like md5sum in its binary (\-b) mode. .TP \fB\-c\fR Enables comma separated values output, or CSV mode. This mode has the side effect of removing the 10 digit size limitation from \-z mode. Also note that asterisks from \-k mode are not displayed when in CSV mode. .TP \fB\-o\fR Enables expert mode. Allows the user specify which (and only which) types of files are processed. Directory processing is still controlled with the \-r flag. The expert mode options allowed are: .br f \- Regular files .br b \- Block Devices .br c \- Character Devices .br p \- Named Pipes .br l \- Symbolic Links .br s \- Sockets .br d \- Solaris Doors .br e \- Windows PE executables .TP \fB-jnn\fR Controls multi-threading. By default the program will create one producer thread to scan the file system and one hashing thread per CPU core. Multi-threading causes output filenames to be in non-deterministic order, as files that take longer to hash will be delayed while they are hashed. If a deterministic order is required, specify \fB-j0\fR to disable multi-threading .TP \fB-d\fR Output in Digital Forensics XML (DFXML) format. .TP \fB-u\fR Quote Unicode output. For example, the snowman is shown as \fBU+C426\fR. .TP \fB-F\fR Specifies the input mode that is used to read files. The default is \fB-Fb\fR (buffered I/O) which reads files with fopen(). Specifying \fB-Fu\fR will use unbuffered I/O and read the file with open(). Specifying \fB-Fm\fR will use memory-mapped I/O which will be faster on some platforms, but which (currently) will not work with files that produce I/O errors. .TP \fB\-h\fR Show a help screen and exit. .TP \fB\-v\fR Show the version number and exit. .TP \fB\-V\fR Show copyright information and exit. .SH UNICODE SUPPORT As of version 3.0 the program supports Unicode characters in filenames on Microsoft Windows systems for filenames specified on the command line with globbing (e.g. *), for files specified with the \fB-f\fR of files to hash, and for files read from directories using the \fB-r\fR option. By default all program input and output should be in UTF-8. The program automatically converts this to UTF-16 for opening files). On Unix/Linux/MacOS, you should use a terminal emulator that supports UTF-8 and UTF-8 characters in filenames will be properly displayed. On Windows, please note that the onsole is not capiable of displaying Unicode characters. You must either redirect output to a file and open the file with Wordpad (which can display Unicode), or you must specify the \fB-u\fR option to quote Unicode using standard \fBU+XXXX\fR notation. Currently the file name of a file containing known hashes may not be specified as a unicode filename, but you can specify the name using tab completition or an asterisk (e.g. md5deep -m *.txt where there is only one file with a .txt extension). .SH RETURN VALUE Returns a bit-wise value based on the success of the operation and the status of any matching operations. .PP .TP 0 Success. Note that the program considers itself successful even when it encounters read errors, permission denied errors, or finds directories when not in recursive mode. .TP 1 Unused hashes. Under any of the matching modes, returns this value if one or more of the known hashes was not matched by any of the input files. .TP 2 Unmatched inputs. Under any of the matching modes, returns this value if one or more of the input values did not match any of the known hashes. .TP 64 User error, such as trying to do both positive and negative matching at the same time. .TP 128 Internal error, such as memory corruption or uncaught cycle. All internal errors should be reported to the developer! See the section "Reporting Bugs" below. .SH AUTHOR md5deep was written by Jesse Kornblum, research@jessekornblum.com and Simson Garfinkel. .SH KNOWN ISSUES Using the \-r flag cannot be used to recursively process all files of a given extension in a directory. This is a feature, not a bug. If you need to do this, use the \fBfind\fR(1) command. .SH REPORTING BUGS We take all bug reports \fIvery\fR seriously. Any bug that jeopardizes the forensic integrity of this program could have serious consequenses on people's lives. When submitting a bug report, please include a description of the problem, how you found it, and your contact information. .PP Send bug reports to the author at the address above. .PP .SH COPYRIGHT This program is a work of the US Government. In accordance with 17 USC 105, copyright protection is not available for any work of the US Government. This program is PUBLIC DOMAIN. Portions of this program contain code that is licensed under the terms of the General Public License (GPL). Those portions retain their original copyright and license. See the file COPYING for more details. .PP There is NO warranty for this program; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH SEE ALSO More information and installation instructions can be found in the README file. Current versions of both documents can be found on the project homepage: http://md5deep.sourceforge.net/ .PP The MD5 specification, RFC 1321, is available at .br http://www.ietf.org/rfc/rfc1321.txt .PP The SHA-1 specification, RFC 3174, is available at .br http://www.faqs.org/rfcs/rfc3174.html .PP The SHA-256 specification, FIPS 180-2, is available at .br http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf .PP The Tiger specification is available at .br http://www.cs.technion.ac.il/~biham/Reports/Tiger/ .PP The Whirlpool specification is available at .br http://planeta.terra.com.br/informatica/paulobarreto/WhirlpoolPage.html md5deep-4.2/man/sha1deep.1000066400000000000000000000277041176640446200152550ustar00rootroot00000000000000.TH MD5DEEP "1" "v4.2 \- 11 Jun 2012" "AFOSI" "United States Air Force" .SH NAME md5deep \- Compute and compare MD5 message digests .br sha1deep \- Compute and compare SHA-1 message digests .br sha256deep \- Compute and compare SHA-256 message digests .br tigerdeep \- Compute and compare Tiger message digests .br whirlpooldeep \- Compute and compare Whirlpool message digests .SH SYNOPSIS .B md5deep -v | -V | -h .br .B md5deep [\-m|\-M|\-x|\-X ] [-a|-A ] [\-f ] [\-p ] [\-i ] [\-tnwzresS0lbkqZud] [\-F ] [\-o ] [\-j ] [[\fBFILES\fR] .SH DESCRIPTION .PP Computes the hashes, or message digest, for any number of files while optionally recursively digging through the directory structure. Can also take a list of known hashes and display the filenames of input files whose hashes either do or do not match any of the known hashes. Errors are reported to standard error. If no FILES are specified, reads from standard input. .TP \fB\-p \fR Piecewise mode. Breaks files into chunks before hashing. Chunks may be specified using IEC multipliers b, k, m, g, t, p, or e. (Never let it be said that the author didn't plan ahead!) This mode cannot be used with the \-z mode. .TP \fB\-i|\-I \fR Size threshold mode. Only hash files smaller than the given the threshold. In \-i mode, simply omits those files larger than the threshold. In \-I mode, displays all files, but uses asterisks for the hashes of files larger than the threshold. Sizes may be specified using IEC multipliers b, k, m, g, t, p, or e. .TP \fB\-r\fR Enables recursive mode. All subdirectories are traversed. Please note that recursive mode cannot be used to examine all files of a given file extension. For example, calling md5deep -r *.txt will examine all files in \fIdirectories\fR that end in .txt. .TP \fB\-e\fR Displays a progress indicator and estimate of time remaining for each file being processed. Time estimates for files larger than 4GB are not available on Windows. This mode may not be used with th \-p mode. .TP \fB\-m\fR Enables matching mode. The file given should be a list of known hashes. The input files are examined one at a time, and only those files that match the list of known hashes are output. This flag may be used more than once to add multiple sets of known hashes. Acceptable formats for lists of known hashes are plain (such as those generated by md5deep or md5sum), Hashkeeper files, iLook, and the National Software Reference Library (NSRL) as produced by the National Institute for Standards in Technology. .br \fB\fR If standard input is used with the -m flag, displays "stdin" if the input matches one of the hashes in the list of known hashes. If the hash does not match, the program displays no output. .br \fB\fR This flag may not be used in conjunction with the \-x, \-X, or \-A flags. See the section "UNICODE SUPPORT" below. .TP \fB\-x\fR Same as the \-m flag above, but does negative matching. That is, only those files NOT in the list of known hashes are displayed. .br \fB\fR This flag may not be used in conjunction with the \-m, \-M, or \-a flags. See the section "UNICODE SUPPORT" below. .TP \fB\-M\fR and \fB-X\fR Same as \-m and \-x above, but displays the hash for each file that does (or does not) match the list of known hashes. .TP \fB\-a\fR Adds a single hash to the list of known hashes used for matching mode, and if not already enabled, enables matching mode. Adding single hashes cannot, by itself, be used to print the hashes of matching files like the \-M flag does. When used in conjunction with the \-w flag, the filename displayed is just the hash submitted on the command line. .br \fB\fR This flag may not be used in conjunction with the \-x, \-X, or \-A flags. .TP \fB\-A\fR Same as \-a above, but does negative matching. This flag may not be used in conjunction with the \-m, \-M, or \-A flags. .TP \fB\-f\fR Takes a list of files to be hashed from the specified file. Each line is assumed to be a filename. This flag can only be used once per invocation. If it's used a second time, the second instance will clobber the first. .br Note that you can still use other flags, such as the \-m or \-x modes, and submit additional FILES on the command line. .TP \fB\-w\fR During any of the matching modes (\-m,\-M,\-x,or \-X), displays the filename of the known hash that matched the input file. See the section "UNICODE SUPPORT" below. .TP \fB\-t\fR Display a timestamp in GMT with each result. On Windows this timestamp will be the file's creation time. On all other systems it should be the file's change time. .TP \fB\-n\fR During any of the matching modes (\-m,\-M,\-x,or \-X), displays only the filenames of any known hashes that were not matched by any of the input files. .TP \fB\-s\fR Enables silent mode. All error messages are supressed. .TP \fB\-S\fR Like silent mode, but still displays warnings on improperly formatted hashes in the list of known hashes. .TP \fB\-z\fR Enables file size mode. Prepends the hash with a ten digit representation of the size of each file processed. If the file size is greater than 9999999999 bytes (about 9.3GB) the program displays 9999999999 for the size. .TP \fB\-q\fR Quiet mode. File names are omitted from the output. .TP \fB\-Z\fR Produces output in Triage format. Each line contans the file's size, a tab, a hash of the first 512 bytes, a tab, the hash of the complete file, a tab, and the file name. These values are intended in increasing order of specificity. That is, two files with different sizes cannot possibly match. This is a fast comparison and should be done first. Next, two files with different partial hashes cannot possibly match. This is often faster than hashing the whole file. Finally, if those two pieces align, then it's worth reading and hashing the entire file. .TP \fB\-0\fR Uses a NULL character (/0) to terminate each line instead of a newline. Useful for processing filenames with strange characters. .TP \fB\-l\fR Enables relative file paths. Instead of printing the absolute path for each file, displays the relative file path as indicated on the command line. This flag may not be used in conjunction with the \-b flag. .TP \fB\-b\fR Enables bare mode. Strips any leading directory information from displayed filenames. This flag may not be used in conjunction with the \-l flag. .TP \fB\-k\fR Enables asterisk mode. An asterisk is inserted in lieu of a second space between the filename and the hash, just like md5sum in its binary (\-b) mode. .TP \fB\-c\fR Enables comma separated values output, or CSV mode. This mode has the side effect of removing the 10 digit size limitation from \-z mode. Also note that asterisks from \-k mode are not displayed when in CSV mode. .TP \fB\-o\fR Enables expert mode. Allows the user specify which (and only which) types of files are processed. Directory processing is still controlled with the \-r flag. The expert mode options allowed are: .br f \- Regular files .br b \- Block Devices .br c \- Character Devices .br p \- Named Pipes .br l \- Symbolic Links .br s \- Sockets .br d \- Solaris Doors .br e \- Windows PE executables .TP \fB-jnn\fR Controls multi-threading. By default the program will create one producer thread to scan the file system and one hashing thread per CPU core. Multi-threading causes output filenames to be in non-deterministic order, as files that take longer to hash will be delayed while they are hashed. If a deterministic order is required, specify \fB-j0\fR to disable multi-threading .TP \fB-d\fR Output in Digital Forensics XML (DFXML) format. .TP \fB-u\fR Quote Unicode output. For example, the snowman is shown as \fBU+C426\fR. .TP \fB-F\fR Specifies the input mode that is used to read files. The default is \fB-Fb\fR (buffered I/O) which reads files with fopen(). Specifying \fB-Fu\fR will use unbuffered I/O and read the file with open(). Specifying \fB-Fm\fR will use memory-mapped I/O which will be faster on some platforms, but which (currently) will not work with files that produce I/O errors. .TP \fB\-h\fR Show a help screen and exit. .TP \fB\-v\fR Show the version number and exit. .TP \fB\-V\fR Show copyright information and exit. .SH UNICODE SUPPORT As of version 3.0 the program supports Unicode characters in filenames on Microsoft Windows systems for filenames specified on the command line with globbing (e.g. *), for files specified with the \fB-f\fR of files to hash, and for files read from directories using the \fB-r\fR option. By default all program input and output should be in UTF-8. The program automatically converts this to UTF-16 for opening files). On Unix/Linux/MacOS, you should use a terminal emulator that supports UTF-8 and UTF-8 characters in filenames will be properly displayed. On Windows, please note that the onsole is not capiable of displaying Unicode characters. You must either redirect output to a file and open the file with Wordpad (which can display Unicode), or you must specify the \fB-u\fR option to quote Unicode using standard \fBU+XXXX\fR notation. Currently the file name of a file containing known hashes may not be specified as a unicode filename, but you can specify the name using tab completition or an asterisk (e.g. md5deep -m *.txt where there is only one file with a .txt extension). .SH RETURN VALUE Returns a bit-wise value based on the success of the operation and the status of any matching operations. .PP .TP 0 Success. Note that the program considers itself successful even when it encounters read errors, permission denied errors, or finds directories when not in recursive mode. .TP 1 Unused hashes. Under any of the matching modes, returns this value if one or more of the known hashes was not matched by any of the input files. .TP 2 Unmatched inputs. Under any of the matching modes, returns this value if one or more of the input values did not match any of the known hashes. .TP 64 User error, such as trying to do both positive and negative matching at the same time. .TP 128 Internal error, such as memory corruption or uncaught cycle. All internal errors should be reported to the developer! See the section "Reporting Bugs" below. .SH AUTHOR md5deep was written by Jesse Kornblum, research@jessekornblum.com and Simson Garfinkel. .SH KNOWN ISSUES Using the \-r flag cannot be used to recursively process all files of a given extension in a directory. This is a feature, not a bug. If you need to do this, use the \fBfind\fR(1) command. .SH REPORTING BUGS We take all bug reports \fIvery\fR seriously. Any bug that jeopardizes the forensic integrity of this program could have serious consequenses on people's lives. When submitting a bug report, please include a description of the problem, how you found it, and your contact information. .PP Send bug reports to the author at the address above. .PP .SH COPYRIGHT This program is a work of the US Government. In accordance with 17 USC 105, copyright protection is not available for any work of the US Government. This program is PUBLIC DOMAIN. Portions of this program contain code that is licensed under the terms of the General Public License (GPL). Those portions retain their original copyright and license. See the file COPYING for more details. .PP There is NO warranty for this program; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH SEE ALSO More information and installation instructions can be found in the README file. Current versions of both documents can be found on the project homepage: http://md5deep.sourceforge.net/ .PP The MD5 specification, RFC 1321, is available at .br http://www.ietf.org/rfc/rfc1321.txt .PP The SHA-1 specification, RFC 3174, is available at .br http://www.faqs.org/rfcs/rfc3174.html .PP The SHA-256 specification, FIPS 180-2, is available at .br http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf .PP The Tiger specification is available at .br http://www.cs.technion.ac.il/~biham/Reports/Tiger/ .PP The Whirlpool specification is available at .br http://planeta.terra.com.br/informatica/paulobarreto/WhirlpoolPage.html md5deep-4.2/man/sha256deep.1000066400000000000000000000277041176640446200154310ustar00rootroot00000000000000.TH MD5DEEP "1" "v4.2 \- 11 Jun 2012" "AFOSI" "United States Air Force" .SH NAME md5deep \- Compute and compare MD5 message digests .br sha1deep \- Compute and compare SHA-1 message digests .br sha256deep \- Compute and compare SHA-256 message digests .br tigerdeep \- Compute and compare Tiger message digests .br whirlpooldeep \- Compute and compare Whirlpool message digests .SH SYNOPSIS .B md5deep -v | -V | -h .br .B md5deep [\-m|\-M|\-x|\-X ] [-a|-A ] [\-f ] [\-p ] [\-i ] [\-tnwzresS0lbkqZud] [\-F ] [\-o ] [\-j ] [[\fBFILES\fR] .SH DESCRIPTION .PP Computes the hashes, or message digest, for any number of files while optionally recursively digging through the directory structure. Can also take a list of known hashes and display the filenames of input files whose hashes either do or do not match any of the known hashes. Errors are reported to standard error. If no FILES are specified, reads from standard input. .TP \fB\-p \fR Piecewise mode. Breaks files into chunks before hashing. Chunks may be specified using IEC multipliers b, k, m, g, t, p, or e. (Never let it be said that the author didn't plan ahead!) This mode cannot be used with the \-z mode. .TP \fB\-i|\-I \fR Size threshold mode. Only hash files smaller than the given the threshold. In \-i mode, simply omits those files larger than the threshold. In \-I mode, displays all files, but uses asterisks for the hashes of files larger than the threshold. Sizes may be specified using IEC multipliers b, k, m, g, t, p, or e. .TP \fB\-r\fR Enables recursive mode. All subdirectories are traversed. Please note that recursive mode cannot be used to examine all files of a given file extension. For example, calling md5deep -r *.txt will examine all files in \fIdirectories\fR that end in .txt. .TP \fB\-e\fR Displays a progress indicator and estimate of time remaining for each file being processed. Time estimates for files larger than 4GB are not available on Windows. This mode may not be used with th \-p mode. .TP \fB\-m\fR Enables matching mode. The file given should be a list of known hashes. The input files are examined one at a time, and only those files that match the list of known hashes are output. This flag may be used more than once to add multiple sets of known hashes. Acceptable formats for lists of known hashes are plain (such as those generated by md5deep or md5sum), Hashkeeper files, iLook, and the National Software Reference Library (NSRL) as produced by the National Institute for Standards in Technology. .br \fB\fR If standard input is used with the -m flag, displays "stdin" if the input matches one of the hashes in the list of known hashes. If the hash does not match, the program displays no output. .br \fB\fR This flag may not be used in conjunction with the \-x, \-X, or \-A flags. See the section "UNICODE SUPPORT" below. .TP \fB\-x\fR Same as the \-m flag above, but does negative matching. That is, only those files NOT in the list of known hashes are displayed. .br \fB\fR This flag may not be used in conjunction with the \-m, \-M, or \-a flags. See the section "UNICODE SUPPORT" below. .TP \fB\-M\fR and \fB-X\fR Same as \-m and \-x above, but displays the hash for each file that does (or does not) match the list of known hashes. .TP \fB\-a\fR Adds a single hash to the list of known hashes used for matching mode, and if not already enabled, enables matching mode. Adding single hashes cannot, by itself, be used to print the hashes of matching files like the \-M flag does. When used in conjunction with the \-w flag, the filename displayed is just the hash submitted on the command line. .br \fB\fR This flag may not be used in conjunction with the \-x, \-X, or \-A flags. .TP \fB\-A\fR Same as \-a above, but does negative matching. This flag may not be used in conjunction with the \-m, \-M, or \-A flags. .TP \fB\-f\fR Takes a list of files to be hashed from the specified file. Each line is assumed to be a filename. This flag can only be used once per invocation. If it's used a second time, the second instance will clobber the first. .br Note that you can still use other flags, such as the \-m or \-x modes, and submit additional FILES on the command line. .TP \fB\-w\fR During any of the matching modes (\-m,\-M,\-x,or \-X), displays the filename of the known hash that matched the input file. See the section "UNICODE SUPPORT" below. .TP \fB\-t\fR Display a timestamp in GMT with each result. On Windows this timestamp will be the file's creation time. On all other systems it should be the file's change time. .TP \fB\-n\fR During any of the matching modes (\-m,\-M,\-x,or \-X), displays only the filenames of any known hashes that were not matched by any of the input files. .TP \fB\-s\fR Enables silent mode. All error messages are supressed. .TP \fB\-S\fR Like silent mode, but still displays warnings on improperly formatted hashes in the list of known hashes. .TP \fB\-z\fR Enables file size mode. Prepends the hash with a ten digit representation of the size of each file processed. If the file size is greater than 9999999999 bytes (about 9.3GB) the program displays 9999999999 for the size. .TP \fB\-q\fR Quiet mode. File names are omitted from the output. .TP \fB\-Z\fR Produces output in Triage format. Each line contans the file's size, a tab, a hash of the first 512 bytes, a tab, the hash of the complete file, a tab, and the file name. These values are intended in increasing order of specificity. That is, two files with different sizes cannot possibly match. This is a fast comparison and should be done first. Next, two files with different partial hashes cannot possibly match. This is often faster than hashing the whole file. Finally, if those two pieces align, then it's worth reading and hashing the entire file. .TP \fB\-0\fR Uses a NULL character (/0) to terminate each line instead of a newline. Useful for processing filenames with strange characters. .TP \fB\-l\fR Enables relative file paths. Instead of printing the absolute path for each file, displays the relative file path as indicated on the command line. This flag may not be used in conjunction with the \-b flag. .TP \fB\-b\fR Enables bare mode. Strips any leading directory information from displayed filenames. This flag may not be used in conjunction with the \-l flag. .TP \fB\-k\fR Enables asterisk mode. An asterisk is inserted in lieu of a second space between the filename and the hash, just like md5sum in its binary (\-b) mode. .TP \fB\-c\fR Enables comma separated values output, or CSV mode. This mode has the side effect of removing the 10 digit size limitation from \-z mode. Also note that asterisks from \-k mode are not displayed when in CSV mode. .TP \fB\-o\fR Enables expert mode. Allows the user specify which (and only which) types of files are processed. Directory processing is still controlled with the \-r flag. The expert mode options allowed are: .br f \- Regular files .br b \- Block Devices .br c \- Character Devices .br p \- Named Pipes .br l \- Symbolic Links .br s \- Sockets .br d \- Solaris Doors .br e \- Windows PE executables .TP \fB-jnn\fR Controls multi-threading. By default the program will create one producer thread to scan the file system and one hashing thread per CPU core. Multi-threading causes output filenames to be in non-deterministic order, as files that take longer to hash will be delayed while they are hashed. If a deterministic order is required, specify \fB-j0\fR to disable multi-threading .TP \fB-d\fR Output in Digital Forensics XML (DFXML) format. .TP \fB-u\fR Quote Unicode output. For example, the snowman is shown as \fBU+C426\fR. .TP \fB-F\fR Specifies the input mode that is used to read files. The default is \fB-Fb\fR (buffered I/O) which reads files with fopen(). Specifying \fB-Fu\fR will use unbuffered I/O and read the file with open(). Specifying \fB-Fm\fR will use memory-mapped I/O which will be faster on some platforms, but which (currently) will not work with files that produce I/O errors. .TP \fB\-h\fR Show a help screen and exit. .TP \fB\-v\fR Show the version number and exit. .TP \fB\-V\fR Show copyright information and exit. .SH UNICODE SUPPORT As of version 3.0 the program supports Unicode characters in filenames on Microsoft Windows systems for filenames specified on the command line with globbing (e.g. *), for files specified with the \fB-f\fR of files to hash, and for files read from directories using the \fB-r\fR option. By default all program input and output should be in UTF-8. The program automatically converts this to UTF-16 for opening files). On Unix/Linux/MacOS, you should use a terminal emulator that supports UTF-8 and UTF-8 characters in filenames will be properly displayed. On Windows, please note that the onsole is not capiable of displaying Unicode characters. You must either redirect output to a file and open the file with Wordpad (which can display Unicode), or you must specify the \fB-u\fR option to quote Unicode using standard \fBU+XXXX\fR notation. Currently the file name of a file containing known hashes may not be specified as a unicode filename, but you can specify the name using tab completition or an asterisk (e.g. md5deep -m *.txt where there is only one file with a .txt extension). .SH RETURN VALUE Returns a bit-wise value based on the success of the operation and the status of any matching operations. .PP .TP 0 Success. Note that the program considers itself successful even when it encounters read errors, permission denied errors, or finds directories when not in recursive mode. .TP 1 Unused hashes. Under any of the matching modes, returns this value if one or more of the known hashes was not matched by any of the input files. .TP 2 Unmatched inputs. Under any of the matching modes, returns this value if one or more of the input values did not match any of the known hashes. .TP 64 User error, such as trying to do both positive and negative matching at the same time. .TP 128 Internal error, such as memory corruption or uncaught cycle. All internal errors should be reported to the developer! See the section "Reporting Bugs" below. .SH AUTHOR md5deep was written by Jesse Kornblum, research@jessekornblum.com and Simson Garfinkel. .SH KNOWN ISSUES Using the \-r flag cannot be used to recursively process all files of a given extension in a directory. This is a feature, not a bug. If you need to do this, use the \fBfind\fR(1) command. .SH REPORTING BUGS We take all bug reports \fIvery\fR seriously. Any bug that jeopardizes the forensic integrity of this program could have serious consequenses on people's lives. When submitting a bug report, please include a description of the problem, how you found it, and your contact information. .PP Send bug reports to the author at the address above. .PP .SH COPYRIGHT This program is a work of the US Government. In accordance with 17 USC 105, copyright protection is not available for any work of the US Government. This program is PUBLIC DOMAIN. Portions of this program contain code that is licensed under the terms of the General Public License (GPL). Those portions retain their original copyright and license. See the file COPYING for more details. .PP There is NO warranty for this program; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH SEE ALSO More information and installation instructions can be found in the README file. Current versions of both documents can be found on the project homepage: http://md5deep.sourceforge.net/ .PP The MD5 specification, RFC 1321, is available at .br http://www.ietf.org/rfc/rfc1321.txt .PP The SHA-1 specification, RFC 3174, is available at .br http://www.faqs.org/rfcs/rfc3174.html .PP The SHA-256 specification, FIPS 180-2, is available at .br http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf .PP The Tiger specification is available at .br http://www.cs.technion.ac.il/~biham/Reports/Tiger/ .PP The Whirlpool specification is available at .br http://planeta.terra.com.br/informatica/paulobarreto/WhirlpoolPage.html md5deep-4.2/man/tigerdeep.1000066400000000000000000000277041176640446200155330ustar00rootroot00000000000000.TH MD5DEEP "1" "v4.2 \- 11 Jun 2012" "AFOSI" "United States Air Force" .SH NAME md5deep \- Compute and compare MD5 message digests .br sha1deep \- Compute and compare SHA-1 message digests .br sha256deep \- Compute and compare SHA-256 message digests .br tigerdeep \- Compute and compare Tiger message digests .br whirlpooldeep \- Compute and compare Whirlpool message digests .SH SYNOPSIS .B md5deep -v | -V | -h .br .B md5deep [\-m|\-M|\-x|\-X ] [-a|-A ] [\-f ] [\-p ] [\-i ] [\-tnwzresS0lbkqZud] [\-F ] [\-o ] [\-j ] [[\fBFILES\fR] .SH DESCRIPTION .PP Computes the hashes, or message digest, for any number of files while optionally recursively digging through the directory structure. Can also take a list of known hashes and display the filenames of input files whose hashes either do or do not match any of the known hashes. Errors are reported to standard error. If no FILES are specified, reads from standard input. .TP \fB\-p \fR Piecewise mode. Breaks files into chunks before hashing. Chunks may be specified using IEC multipliers b, k, m, g, t, p, or e. (Never let it be said that the author didn't plan ahead!) This mode cannot be used with the \-z mode. .TP \fB\-i|\-I \fR Size threshold mode. Only hash files smaller than the given the threshold. In \-i mode, simply omits those files larger than the threshold. In \-I mode, displays all files, but uses asterisks for the hashes of files larger than the threshold. Sizes may be specified using IEC multipliers b, k, m, g, t, p, or e. .TP \fB\-r\fR Enables recursive mode. All subdirectories are traversed. Please note that recursive mode cannot be used to examine all files of a given file extension. For example, calling md5deep -r *.txt will examine all files in \fIdirectories\fR that end in .txt. .TP \fB\-e\fR Displays a progress indicator and estimate of time remaining for each file being processed. Time estimates for files larger than 4GB are not available on Windows. This mode may not be used with th \-p mode. .TP \fB\-m\fR Enables matching mode. The file given should be a list of known hashes. The input files are examined one at a time, and only those files that match the list of known hashes are output. This flag may be used more than once to add multiple sets of known hashes. Acceptable formats for lists of known hashes are plain (such as those generated by md5deep or md5sum), Hashkeeper files, iLook, and the National Software Reference Library (NSRL) as produced by the National Institute for Standards in Technology. .br \fB\fR If standard input is used with the -m flag, displays "stdin" if the input matches one of the hashes in the list of known hashes. If the hash does not match, the program displays no output. .br \fB\fR This flag may not be used in conjunction with the \-x, \-X, or \-A flags. See the section "UNICODE SUPPORT" below. .TP \fB\-x\fR Same as the \-m flag above, but does negative matching. That is, only those files NOT in the list of known hashes are displayed. .br \fB\fR This flag may not be used in conjunction with the \-m, \-M, or \-a flags. See the section "UNICODE SUPPORT" below. .TP \fB\-M\fR and \fB-X\fR Same as \-m and \-x above, but displays the hash for each file that does (or does not) match the list of known hashes. .TP \fB\-a\fR Adds a single hash to the list of known hashes used for matching mode, and if not already enabled, enables matching mode. Adding single hashes cannot, by itself, be used to print the hashes of matching files like the \-M flag does. When used in conjunction with the \-w flag, the filename displayed is just the hash submitted on the command line. .br \fB\fR This flag may not be used in conjunction with the \-x, \-X, or \-A flags. .TP \fB\-A\fR Same as \-a above, but does negative matching. This flag may not be used in conjunction with the \-m, \-M, or \-A flags. .TP \fB\-f\fR Takes a list of files to be hashed from the specified file. Each line is assumed to be a filename. This flag can only be used once per invocation. If it's used a second time, the second instance will clobber the first. .br Note that you can still use other flags, such as the \-m or \-x modes, and submit additional FILES on the command line. .TP \fB\-w\fR During any of the matching modes (\-m,\-M,\-x,or \-X), displays the filename of the known hash that matched the input file. See the section "UNICODE SUPPORT" below. .TP \fB\-t\fR Display a timestamp in GMT with each result. On Windows this timestamp will be the file's creation time. On all other systems it should be the file's change time. .TP \fB\-n\fR During any of the matching modes (\-m,\-M,\-x,or \-X), displays only the filenames of any known hashes that were not matched by any of the input files. .TP \fB\-s\fR Enables silent mode. All error messages are supressed. .TP \fB\-S\fR Like silent mode, but still displays warnings on improperly formatted hashes in the list of known hashes. .TP \fB\-z\fR Enables file size mode. Prepends the hash with a ten digit representation of the size of each file processed. If the file size is greater than 9999999999 bytes (about 9.3GB) the program displays 9999999999 for the size. .TP \fB\-q\fR Quiet mode. File names are omitted from the output. .TP \fB\-Z\fR Produces output in Triage format. Each line contans the file's size, a tab, a hash of the first 512 bytes, a tab, the hash of the complete file, a tab, and the file name. These values are intended in increasing order of specificity. That is, two files with different sizes cannot possibly match. This is a fast comparison and should be done first. Next, two files with different partial hashes cannot possibly match. This is often faster than hashing the whole file. Finally, if those two pieces align, then it's worth reading and hashing the entire file. .TP \fB\-0\fR Uses a NULL character (/0) to terminate each line instead of a newline. Useful for processing filenames with strange characters. .TP \fB\-l\fR Enables relative file paths. Instead of printing the absolute path for each file, displays the relative file path as indicated on the command line. This flag may not be used in conjunction with the \-b flag. .TP \fB\-b\fR Enables bare mode. Strips any leading directory information from displayed filenames. This flag may not be used in conjunction with the \-l flag. .TP \fB\-k\fR Enables asterisk mode. An asterisk is inserted in lieu of a second space between the filename and the hash, just like md5sum in its binary (\-b) mode. .TP \fB\-c\fR Enables comma separated values output, or CSV mode. This mode has the side effect of removing the 10 digit size limitation from \-z mode. Also note that asterisks from \-k mode are not displayed when in CSV mode. .TP \fB\-o\fR Enables expert mode. Allows the user specify which (and only which) types of files are processed. Directory processing is still controlled with the \-r flag. The expert mode options allowed are: .br f \- Regular files .br b \- Block Devices .br c \- Character Devices .br p \- Named Pipes .br l \- Symbolic Links .br s \- Sockets .br d \- Solaris Doors .br e \- Windows PE executables .TP \fB-jnn\fR Controls multi-threading. By default the program will create one producer thread to scan the file system and one hashing thread per CPU core. Multi-threading causes output filenames to be in non-deterministic order, as files that take longer to hash will be delayed while they are hashed. If a deterministic order is required, specify \fB-j0\fR to disable multi-threading .TP \fB-d\fR Output in Digital Forensics XML (DFXML) format. .TP \fB-u\fR Quote Unicode output. For example, the snowman is shown as \fBU+C426\fR. .TP \fB-F\fR Specifies the input mode that is used to read files. The default is \fB-Fb\fR (buffered I/O) which reads files with fopen(). Specifying \fB-Fu\fR will use unbuffered I/O and read the file with open(). Specifying \fB-Fm\fR will use memory-mapped I/O which will be faster on some platforms, but which (currently) will not work with files that produce I/O errors. .TP \fB\-h\fR Show a help screen and exit. .TP \fB\-v\fR Show the version number and exit. .TP \fB\-V\fR Show copyright information and exit. .SH UNICODE SUPPORT As of version 3.0 the program supports Unicode characters in filenames on Microsoft Windows systems for filenames specified on the command line with globbing (e.g. *), for files specified with the \fB-f\fR of files to hash, and for files read from directories using the \fB-r\fR option. By default all program input and output should be in UTF-8. The program automatically converts this to UTF-16 for opening files). On Unix/Linux/MacOS, you should use a terminal emulator that supports UTF-8 and UTF-8 characters in filenames will be properly displayed. On Windows, please note that the onsole is not capiable of displaying Unicode characters. You must either redirect output to a file and open the file with Wordpad (which can display Unicode), or you must specify the \fB-u\fR option to quote Unicode using standard \fBU+XXXX\fR notation. Currently the file name of a file containing known hashes may not be specified as a unicode filename, but you can specify the name using tab completition or an asterisk (e.g. md5deep -m *.txt where there is only one file with a .txt extension). .SH RETURN VALUE Returns a bit-wise value based on the success of the operation and the status of any matching operations. .PP .TP 0 Success. Note that the program considers itself successful even when it encounters read errors, permission denied errors, or finds directories when not in recursive mode. .TP 1 Unused hashes. Under any of the matching modes, returns this value if one or more of the known hashes was not matched by any of the input files. .TP 2 Unmatched inputs. Under any of the matching modes, returns this value if one or more of the input values did not match any of the known hashes. .TP 64 User error, such as trying to do both positive and negative matching at the same time. .TP 128 Internal error, such as memory corruption or uncaught cycle. All internal errors should be reported to the developer! See the section "Reporting Bugs" below. .SH AUTHOR md5deep was written by Jesse Kornblum, research@jessekornblum.com and Simson Garfinkel. .SH KNOWN ISSUES Using the \-r flag cannot be used to recursively process all files of a given extension in a directory. This is a feature, not a bug. If you need to do this, use the \fBfind\fR(1) command. .SH REPORTING BUGS We take all bug reports \fIvery\fR seriously. Any bug that jeopardizes the forensic integrity of this program could have serious consequenses on people's lives. When submitting a bug report, please include a description of the problem, how you found it, and your contact information. .PP Send bug reports to the author at the address above. .PP .SH COPYRIGHT This program is a work of the US Government. In accordance with 17 USC 105, copyright protection is not available for any work of the US Government. This program is PUBLIC DOMAIN. Portions of this program contain code that is licensed under the terms of the General Public License (GPL). Those portions retain their original copyright and license. See the file COPYING for more details. .PP There is NO warranty for this program; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH SEE ALSO More information and installation instructions can be found in the README file. Current versions of both documents can be found on the project homepage: http://md5deep.sourceforge.net/ .PP The MD5 specification, RFC 1321, is available at .br http://www.ietf.org/rfc/rfc1321.txt .PP The SHA-1 specification, RFC 3174, is available at .br http://www.faqs.org/rfcs/rfc3174.html .PP The SHA-256 specification, FIPS 180-2, is available at .br http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf .PP The Tiger specification is available at .br http://www.cs.technion.ac.il/~biham/Reports/Tiger/ .PP The Whirlpool specification is available at .br http://planeta.terra.com.br/informatica/paulobarreto/WhirlpoolPage.html md5deep-4.2/man/whirlpooldeep.1000066400000000000000000000277041176640446200164400ustar00rootroot00000000000000.TH MD5DEEP "1" "v4.2 \- 11 Jun 2012" "AFOSI" "United States Air Force" .SH NAME md5deep \- Compute and compare MD5 message digests .br sha1deep \- Compute and compare SHA-1 message digests .br sha256deep \- Compute and compare SHA-256 message digests .br tigerdeep \- Compute and compare Tiger message digests .br whirlpooldeep \- Compute and compare Whirlpool message digests .SH SYNOPSIS .B md5deep -v | -V | -h .br .B md5deep [\-m|\-M|\-x|\-X ] [-a|-A ] [\-f ] [\-p ] [\-i ] [\-tnwzresS0lbkqZud] [\-F ] [\-o ] [\-j ] [[\fBFILES\fR] .SH DESCRIPTION .PP Computes the hashes, or message digest, for any number of files while optionally recursively digging through the directory structure. Can also take a list of known hashes and display the filenames of input files whose hashes either do or do not match any of the known hashes. Errors are reported to standard error. If no FILES are specified, reads from standard input. .TP \fB\-p \fR Piecewise mode. Breaks files into chunks before hashing. Chunks may be specified using IEC multipliers b, k, m, g, t, p, or e. (Never let it be said that the author didn't plan ahead!) This mode cannot be used with the \-z mode. .TP \fB\-i|\-I \fR Size threshold mode. Only hash files smaller than the given the threshold. In \-i mode, simply omits those files larger than the threshold. In \-I mode, displays all files, but uses asterisks for the hashes of files larger than the threshold. Sizes may be specified using IEC multipliers b, k, m, g, t, p, or e. .TP \fB\-r\fR Enables recursive mode. All subdirectories are traversed. Please note that recursive mode cannot be used to examine all files of a given file extension. For example, calling md5deep -r *.txt will examine all files in \fIdirectories\fR that end in .txt. .TP \fB\-e\fR Displays a progress indicator and estimate of time remaining for each file being processed. Time estimates for files larger than 4GB are not available on Windows. This mode may not be used with th \-p mode. .TP \fB\-m\fR Enables matching mode. The file given should be a list of known hashes. The input files are examined one at a time, and only those files that match the list of known hashes are output. This flag may be used more than once to add multiple sets of known hashes. Acceptable formats for lists of known hashes are plain (such as those generated by md5deep or md5sum), Hashkeeper files, iLook, and the National Software Reference Library (NSRL) as produced by the National Institute for Standards in Technology. .br \fB\fR If standard input is used with the -m flag, displays "stdin" if the input matches one of the hashes in the list of known hashes. If the hash does not match, the program displays no output. .br \fB\fR This flag may not be used in conjunction with the \-x, \-X, or \-A flags. See the section "UNICODE SUPPORT" below. .TP \fB\-x\fR Same as the \-m flag above, but does negative matching. That is, only those files NOT in the list of known hashes are displayed. .br \fB\fR This flag may not be used in conjunction with the \-m, \-M, or \-a flags. See the section "UNICODE SUPPORT" below. .TP \fB\-M\fR and \fB-X\fR Same as \-m and \-x above, but displays the hash for each file that does (or does not) match the list of known hashes. .TP \fB\-a\fR Adds a single hash to the list of known hashes used for matching mode, and if not already enabled, enables matching mode. Adding single hashes cannot, by itself, be used to print the hashes of matching files like the \-M flag does. When used in conjunction with the \-w flag, the filename displayed is just the hash submitted on the command line. .br \fB\fR This flag may not be used in conjunction with the \-x, \-X, or \-A flags. .TP \fB\-A\fR Same as \-a above, but does negative matching. This flag may not be used in conjunction with the \-m, \-M, or \-A flags. .TP \fB\-f\fR Takes a list of files to be hashed from the specified file. Each line is assumed to be a filename. This flag can only be used once per invocation. If it's used a second time, the second instance will clobber the first. .br Note that you can still use other flags, such as the \-m or \-x modes, and submit additional FILES on the command line. .TP \fB\-w\fR During any of the matching modes (\-m,\-M,\-x,or \-X), displays the filename of the known hash that matched the input file. See the section "UNICODE SUPPORT" below. .TP \fB\-t\fR Display a timestamp in GMT with each result. On Windows this timestamp will be the file's creation time. On all other systems it should be the file's change time. .TP \fB\-n\fR During any of the matching modes (\-m,\-M,\-x,or \-X), displays only the filenames of any known hashes that were not matched by any of the input files. .TP \fB\-s\fR Enables silent mode. All error messages are supressed. .TP \fB\-S\fR Like silent mode, but still displays warnings on improperly formatted hashes in the list of known hashes. .TP \fB\-z\fR Enables file size mode. Prepends the hash with a ten digit representation of the size of each file processed. If the file size is greater than 9999999999 bytes (about 9.3GB) the program displays 9999999999 for the size. .TP \fB\-q\fR Quiet mode. File names are omitted from the output. .TP \fB\-Z\fR Produces output in Triage format. Each line contans the file's size, a tab, a hash of the first 512 bytes, a tab, the hash of the complete file, a tab, and the file name. These values are intended in increasing order of specificity. That is, two files with different sizes cannot possibly match. This is a fast comparison and should be done first. Next, two files with different partial hashes cannot possibly match. This is often faster than hashing the whole file. Finally, if those two pieces align, then it's worth reading and hashing the entire file. .TP \fB\-0\fR Uses a NULL character (/0) to terminate each line instead of a newline. Useful for processing filenames with strange characters. .TP \fB\-l\fR Enables relative file paths. Instead of printing the absolute path for each file, displays the relative file path as indicated on the command line. This flag may not be used in conjunction with the \-b flag. .TP \fB\-b\fR Enables bare mode. Strips any leading directory information from displayed filenames. This flag may not be used in conjunction with the \-l flag. .TP \fB\-k\fR Enables asterisk mode. An asterisk is inserted in lieu of a second space between the filename and the hash, just like md5sum in its binary (\-b) mode. .TP \fB\-c\fR Enables comma separated values output, or CSV mode. This mode has the side effect of removing the 10 digit size limitation from \-z mode. Also note that asterisks from \-k mode are not displayed when in CSV mode. .TP \fB\-o\fR Enables expert mode. Allows the user specify which (and only which) types of files are processed. Directory processing is still controlled with the \-r flag. The expert mode options allowed are: .br f \- Regular files .br b \- Block Devices .br c \- Character Devices .br p \- Named Pipes .br l \- Symbolic Links .br s \- Sockets .br d \- Solaris Doors .br e \- Windows PE executables .TP \fB-jnn\fR Controls multi-threading. By default the program will create one producer thread to scan the file system and one hashing thread per CPU core. Multi-threading causes output filenames to be in non-deterministic order, as files that take longer to hash will be delayed while they are hashed. If a deterministic order is required, specify \fB-j0\fR to disable multi-threading .TP \fB-d\fR Output in Digital Forensics XML (DFXML) format. .TP \fB-u\fR Quote Unicode output. For example, the snowman is shown as \fBU+C426\fR. .TP \fB-F\fR Specifies the input mode that is used to read files. The default is \fB-Fb\fR (buffered I/O) which reads files with fopen(). Specifying \fB-Fu\fR will use unbuffered I/O and read the file with open(). Specifying \fB-Fm\fR will use memory-mapped I/O which will be faster on some platforms, but which (currently) will not work with files that produce I/O errors. .TP \fB\-h\fR Show a help screen and exit. .TP \fB\-v\fR Show the version number and exit. .TP \fB\-V\fR Show copyright information and exit. .SH UNICODE SUPPORT As of version 3.0 the program supports Unicode characters in filenames on Microsoft Windows systems for filenames specified on the command line with globbing (e.g. *), for files specified with the \fB-f\fR of files to hash, and for files read from directories using the \fB-r\fR option. By default all program input and output should be in UTF-8. The program automatically converts this to UTF-16 for opening files). On Unix/Linux/MacOS, you should use a terminal emulator that supports UTF-8 and UTF-8 characters in filenames will be properly displayed. On Windows, please note that the onsole is not capiable of displaying Unicode characters. You must either redirect output to a file and open the file with Wordpad (which can display Unicode), or you must specify the \fB-u\fR option to quote Unicode using standard \fBU+XXXX\fR notation. Currently the file name of a file containing known hashes may not be specified as a unicode filename, but you can specify the name using tab completition or an asterisk (e.g. md5deep -m *.txt where there is only one file with a .txt extension). .SH RETURN VALUE Returns a bit-wise value based on the success of the operation and the status of any matching operations. .PP .TP 0 Success. Note that the program considers itself successful even when it encounters read errors, permission denied errors, or finds directories when not in recursive mode. .TP 1 Unused hashes. Under any of the matching modes, returns this value if one or more of the known hashes was not matched by any of the input files. .TP 2 Unmatched inputs. Under any of the matching modes, returns this value if one or more of the input values did not match any of the known hashes. .TP 64 User error, such as trying to do both positive and negative matching at the same time. .TP 128 Internal error, such as memory corruption or uncaught cycle. All internal errors should be reported to the developer! See the section "Reporting Bugs" below. .SH AUTHOR md5deep was written by Jesse Kornblum, research@jessekornblum.com and Simson Garfinkel. .SH KNOWN ISSUES Using the \-r flag cannot be used to recursively process all files of a given extension in a directory. This is a feature, not a bug. If you need to do this, use the \fBfind\fR(1) command. .SH REPORTING BUGS We take all bug reports \fIvery\fR seriously. Any bug that jeopardizes the forensic integrity of this program could have serious consequenses on people's lives. When submitting a bug report, please include a description of the problem, how you found it, and your contact information. .PP Send bug reports to the author at the address above. .PP .SH COPYRIGHT This program is a work of the US Government. In accordance with 17 USC 105, copyright protection is not available for any work of the US Government. This program is PUBLIC DOMAIN. Portions of this program contain code that is licensed under the terms of the General Public License (GPL). Those portions retain their original copyright and license. See the file COPYING for more details. .PP There is NO warranty for this program; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH SEE ALSO More information and installation instructions can be found in the README file. Current versions of both documents can be found on the project homepage: http://md5deep.sourceforge.net/ .PP The MD5 specification, RFC 1321, is available at .br http://www.ietf.org/rfc/rfc1321.txt .PP The SHA-1 specification, RFC 3174, is available at .br http://www.faqs.org/rfcs/rfc3174.html .PP The SHA-256 specification, FIPS 180-2, is available at .br http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf .PP The Tiger specification is available at .br http://www.cs.technion.ac.il/~biham/Reports/Tiger/ .PP The Whirlpool specification is available at .br http://planeta.terra.com.br/informatica/paulobarreto/WhirlpoolPage.html md5deep-4.2/missing000077500000000000000000000240361176640446200143200ustar00rootroot00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. # Copyright (C) 1996, 1997, 1999, 2000, 2002 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, 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. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # 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 case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in -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' 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]" ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing 0.4 - GNU automake" ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; aclocal*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. 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) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. 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) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. 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*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. 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) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is needed, and you do not seem to have it handy on your system. You might have modified some files without having the proper tools for further handling them. You can get \`$1Help2man' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` 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' is missing on your system. 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 [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is missing on your system. 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 [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. 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 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then # We have makeinfo, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. 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." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` fi touch $file ;; tar) shift if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 fi # 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 you do not seem to have it handy on your system. 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 prerequirements 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 md5deep-4.2/mkinstalldirs000077500000000000000000000034111176640446200155210ustar00rootroot00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain errstatus=0 dirmode="" usage="\ Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." # process command line arguments while test $# -gt 0 ; do case "${1}" in -h | --help | --h* ) # -h for help echo "${usage}" 1>&2; exit 0 ;; -m ) # -m PERM arg shift test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; } dirmode="${1}" shift ;; -- ) shift; break ;; # stop option processing -* ) echo "${usage}" 1>&2; exit 1 ;; # unknown option * ) break ;; # first non-opt arg esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac case $dirmode in '') if mkdir -p -- . 2>/dev/null; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" fi ;; *) if mkdir -m "$dirmode" -p -- . 2>/dev/null; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" fi ;; esac for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr="" chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp="$pathcomp/" done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 3 # End: # mkinstalldirs ends here md5deep-4.2/src/000077500000000000000000000000001176640446200135035ustar00rootroot00000000000000md5deep-4.2/src/Makefile.am000066400000000000000000000020111176640446200155310ustar00rootroot00000000000000# No need to explicitly add $(EXEEXT) anymore. # # See http://www.gnu.org/s/hello/manual/automake/EXEEXT.html # The algorithms: ALGS=md5.c md5.h sha1.c sha1.h sha256.c sha256.h whirlpool.c whirlpool.h tiger.c tiger.h all_sources = $(ALGS) main.cpp hashlist.cpp multihash.cpp display.cpp \ hash.cpp dig.cpp helpers.cpp xml.cpp xml.h files.cpp common.h main.h \ utf8.h utf8/checked.h utf8/core.h utf8/unchecked.h \ threadpool.h threadpool.cpp winpe.cpp winpe.h hashdeep_SOURCES = $(all_sources) md5deep_SOURCES = $(all_sources) sha1deep_SOURCES = $(all_sources) sha256deep_SOURCES = $(all_sources) whirlpooldeep_SOURCES = $(all_sources) tigerdeep_SOURCES = $(all_sources) bin_PROGRAMS = hashdeep md5deep sha1deep sha256deep whirlpooldeep tigerdeep # Yes, this is gross; it would be better to make them all with hard links. # But this works. That didn't. # A better approach is to define install-exec-hook and uninstall-exec-hook. See extending in the automake manual # http://www.gnu.org/s/hello/manual/automake/Extending.html md5deep-4.2/src/Makefile.in000066400000000000000000000457511176640446200155640ustar00rootroot00000000000000# 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@ # No need to explicitly add $(EXEEXT) anymore. # # See http://www.gnu.org/s/hello/manual/automake/EXEEXT.html # The algorithms: 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@ bin_PROGRAMS = hashdeep$(EXEEXT) md5deep$(EXEEXT) sha1deep$(EXEEXT) \ sha256deep$(EXEEXT) whirlpooldeep$(EXEEXT) tigerdeep$(EXEEXT) subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__objects_1 = md5.$(OBJEXT) sha1.$(OBJEXT) sha256.$(OBJEXT) \ whirlpool.$(OBJEXT) tiger.$(OBJEXT) am__objects_2 = $(am__objects_1) main.$(OBJEXT) hashlist.$(OBJEXT) \ multihash.$(OBJEXT) display.$(OBJEXT) hash.$(OBJEXT) \ dig.$(OBJEXT) helpers.$(OBJEXT) xml.$(OBJEXT) files.$(OBJEXT) \ threadpool.$(OBJEXT) winpe.$(OBJEXT) am_hashdeep_OBJECTS = $(am__objects_2) hashdeep_OBJECTS = $(am_hashdeep_OBJECTS) hashdeep_LDADD = $(LDADD) am_md5deep_OBJECTS = $(am__objects_2) md5deep_OBJECTS = $(am_md5deep_OBJECTS) md5deep_LDADD = $(LDADD) am_sha1deep_OBJECTS = $(am__objects_2) sha1deep_OBJECTS = $(am_sha1deep_OBJECTS) sha1deep_LDADD = $(LDADD) am_sha256deep_OBJECTS = $(am__objects_2) sha256deep_OBJECTS = $(am_sha256deep_OBJECTS) sha256deep_LDADD = $(LDADD) am_tigerdeep_OBJECTS = $(am__objects_2) tigerdeep_OBJECTS = $(am_tigerdeep_OBJECTS) tigerdeep_LDADD = $(LDADD) am_whirlpooldeep_OBJECTS = $(am__objects_2) whirlpooldeep_OBJECTS = $(am_whirlpooldeep_OBJECTS) whirlpooldeep_LDADD = $(LDADD) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ SOURCES = $(hashdeep_SOURCES) $(md5deep_SOURCES) $(sha1deep_SOURCES) \ $(sha256deep_SOURCES) $(tigerdeep_SOURCES) \ $(whirlpooldeep_SOURCES) DIST_SOURCES = $(hashdeep_SOURCES) $(md5deep_SOURCES) \ $(sha1deep_SOURCES) $(sha256deep_SOURCES) $(tigerdeep_SOURCES) \ $(whirlpooldeep_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ 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@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ 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@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ALGS = md5.c md5.h sha1.c sha1.h sha256.c sha256.h whirlpool.c whirlpool.h tiger.c tiger.h all_sources = $(ALGS) main.cpp hashlist.cpp multihash.cpp display.cpp \ hash.cpp dig.cpp helpers.cpp xml.cpp xml.h files.cpp common.h main.h \ utf8.h utf8/checked.h utf8/core.h utf8/unchecked.h \ threadpool.h threadpool.cpp winpe.cpp winpe.h hashdeep_SOURCES = $(all_sources) md5deep_SOURCES = $(all_sources) sha1deep_SOURCES = $(all_sources) sha256deep_SOURCES = $(all_sources) whirlpooldeep_SOURCES = $(all_sources) tigerdeep_SOURCES = $(all_sources) all: all-am .SUFFIXES: .SUFFIXES: .c .cpp .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/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): 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; \ 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) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(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: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) hashdeep$(EXEEXT): $(hashdeep_OBJECTS) $(hashdeep_DEPENDENCIES) @rm -f hashdeep$(EXEEXT) $(CXXLINK) $(hashdeep_OBJECTS) $(hashdeep_LDADD) $(LIBS) md5deep$(EXEEXT): $(md5deep_OBJECTS) $(md5deep_DEPENDENCIES) @rm -f md5deep$(EXEEXT) $(CXXLINK) $(md5deep_OBJECTS) $(md5deep_LDADD) $(LIBS) sha1deep$(EXEEXT): $(sha1deep_OBJECTS) $(sha1deep_DEPENDENCIES) @rm -f sha1deep$(EXEEXT) $(CXXLINK) $(sha1deep_OBJECTS) $(sha1deep_LDADD) $(LIBS) sha256deep$(EXEEXT): $(sha256deep_OBJECTS) $(sha256deep_DEPENDENCIES) @rm -f sha256deep$(EXEEXT) $(CXXLINK) $(sha256deep_OBJECTS) $(sha256deep_LDADD) $(LIBS) tigerdeep$(EXEEXT): $(tigerdeep_OBJECTS) $(tigerdeep_DEPENDENCIES) @rm -f tigerdeep$(EXEEXT) $(CXXLINK) $(tigerdeep_OBJECTS) $(tigerdeep_LDADD) $(LIBS) whirlpooldeep$(EXEEXT): $(whirlpooldeep_OBJECTS) $(whirlpooldeep_DEPENDENCIES) @rm -f whirlpooldeep$(EXEEXT) $(CXXLINK) $(whirlpooldeep_OBJECTS) $(whirlpooldeep_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dig.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/display.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/files.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hashlist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/helpers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multihash.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha256.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/threadpool.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiger.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/whirlpool.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/winpe.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml.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) '$<'` .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) '$<'` 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." clean: clean-am clean-am: clean-binPROGRAMS clean-generic 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 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 ctags distclean distclean-compile \ distclean-generic 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 pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS # Yes, this is gross; it would be better to make them all with hard links. # But this works. That didn't. # A better approach is to define install-exec-hook and uninstall-exec-hook. See extending in the automake manual # http://www.gnu.org/s/hello/manual/automake/Extending.html # 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: md5deep-4.2/src/common.h000066400000000000000000000161321176640446200151470ustar00rootroot00000000000000/** * $Id: common.h 579 2012-01-06 12:37:01Z jessekornblum $ * * This file provides common include files but no specifics for the hashdeep/md5deep system. * * The version information, VERSION, is defined in config.h * AUTHOR and COPYRIGHT moved to main.cpp * */ #ifndef __COMMON_H #define __COMMON_H #include "config.h" #define TRUE 1 #define FALSE 0 #define ONE_MEGABYTE 1048576 #define MAX_ALGORITHM_RESIDUE_SIZE 256 #define MAX_ALGORITHM_CONTEXT_SIZE 256 #ifdef _WIN32 /* For some reason this doesn't work properly with mingw */ #undef HAVE_EXTERN_PROGNAME #endif #include #include #include #include #include #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_LIMITS_H # include #endif #ifdef HAVE_DIRENT_H # include #endif #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_UNISTD_H # include #endif #ifdef HAVE_SYS_TIME_H #include #endif #ifdef HAVE_TIME_H #include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_SYS_IOCTL_H # include #endif #ifdef HAVE_SYS_MOUNT_H # include #endif #ifdef HAVE_SYS_DISK_H # include #endif #ifdef HAVE_LIBGEN_H # include #endif #ifdef HAVE_SYS_CDEFS_H # include #endif #ifdef HAVE_PTHREAD_H # include #endif // This allows us to open standard input in binary mode by default // See http://gnuwin32.sourceforge.net/compile.html for more #ifdef HAVE_FCNTL_H # include #endif /* If we are including inttypes.h, mmake sure __STDC_FORMAT_MACROS is defined */ #ifdef HAVE_INTTYPES_H #ifndef __STDC_FORMAT_MACROS #define __STDC_FORMAT_MACROS #endif # include #else // This should really have been caught during configuration, but just in case... # error Unable to work without inttypes.h! #endif #ifdef HAVE_STDINT_H #include #endif // A few operating systems (e.g. versions of OpenBSD) don't meet the // C99 standard and don't define the PRI??? macros we use to display // large numbers. We have to do something to help those systems, so // we guess. This snippet was copied from the FreeBSD source tree, // so hopefully it should work on the other BSDs too. #ifndef PRIu64 #define PRIu64 "llu" #endif // Strings have to be long enough to handle inputs from matched hashing files. // The NSRL is already larger than 256 bytes. We go longer to be safer. #define MAX_STRING_LENGTH 2048 #define MAX_TIME_STRING_LENGTH 31 // This denotes when we don't know the file size. #define UNKNOWN_FILE_SIZE 0xfffffffffffffffeLL // LINE_LENGTH is different between UNIX and WIN32 and is defined below #define MAX_FILENAME_LENGTH LINE_LENGTH - 41 #ifdef HAVE_MMAP_H #include #endif #ifdef HAVE_SYS_MMAN_H #include #endif #if defined(__cplusplus) #include #include #include #include #include #include #include /* Some nice C++ manipulation routines */ inline std::string makelower(const std::string &a) { std::string ret(a); std::transform(ret.begin(), ret.end(), ret.begin(), ::tolower); return ret; } inline std::string makeupper(const std::string &a) { std::string ret(a); std::transform(ret.begin(), ret.end(), ret.begin(), ::toupper); return ret; } inline bool STRINGS_EQUAL(const std::string &a,const std::string &b) { return a==b; } #endif #ifdef _WIN32 /***************************************************************** *** Windows support. *** Previously in tchar-local.h. *** Moved here for simplicity * TCHAR: * * On POSIX systems, TCHAR is defined to be char. * On WIN32 systems, TCHAR is wchar_t. * * TCHAR is used for filenames of files to hash. * * We can convert this to UTF-8 using the GNU utf8 package from sourceforce. * * */ /* * __MSVCRT_VERSION__ specifies which version of Microsoft's DLL we require. * Mingw defines this to be 0x0600 by default. * * We want version 0x0601 by default to get 64-bit stat functions and _gmtime64. * This is defined in configure.ac. * * If we aren't compiling under mingw, define it by hand. * (Perhaps some poor soul was forced to port this project to VC++.) */ #ifndef __MSVCRT_VERSION__ #define __MSVCRT_VERSION__ 0x0601 #endif /* For reasons I don't understand we typedef wchar_t TCHAR doesn't * work for some reasons for mingw, so we use this. */ #ifndef _TCHAR_DEFINED #define TCHAR wchar_t #define _TCHAR wchar_t #define _TCHAR_DEFINED #endif #include #include #include #include #if defined(__cplusplus) #include /* * Internally we use tstring. * ON WIN32: we get a std::wstring. * ON POSIX: we get a std::string. */ #define tstring std::wstring #endif // The current cross compiler for OS X->Windows does not support a few // critical error codes normally defined in errno.h. Because we need // these to detect fatal errors while reading files, we have them here. // These will hopefully get wrapped into the Windows API sometime soon. #ifndef ENOTBLK #define ENOTBLK 15 // Not a block device #endif #ifndef ETXTBSY #define ETXTBSY 26 // Text file busy #endif #ifndef EAGAIN #define EAGAIN 35 // Resource temporarily unavailable #endif #ifndef EALREADY #define EALREADY 37 // Operation already in progress #endif #define NEWLINE "\n" #define CMD_PROMPT "C:\\>" #define DIR_SEPARATOR '\\' #define LINE_LENGTH 72 #define ftello ftello64 /* use the 64-bit version */ #define fseeko fseeko64 /* use the 64-bit version */ #define off_t off64_t #define tlstat64(path,buf) _wstat64(path,buf) // on windows, use _wstat64 #endif // Set up the environment for the *nix operating systems (Mac, Linux, // BSD, Solaris, and really everybody except Microsoft Windows) // // Do this by faking the wide-character functions #ifndef _WIN32 /* The next few paragraphs are similar to tchar.h when UNICODE * is not defined---that is, in the absence of a wide-char mode, * all become the standard char * functions. * tstring is then typedef'ed to be a std::string. * This works just fine on Linux and OS X */ typedef char TCHAR; // no TCHAR on POSIX; use CHAR #define _TDIR DIR // no _TDIR, use dir... #define _TEXT(A) A #define _T(A) A #define _tfopen fopen #define _topen open #define _topendir opendir #define _treaddir readdir #define _tdirent dirent #define _tclosedir closedir #define _lstat lstat #define _wstat64(path,buf) stat(path,buf) #define __stat64 stat #if defined(__cplusplus) typedef std::string tstring; #endif # define CMD_PROMPT "$" # define DIR_SEPARATOR '/' # define NEWLINE "\n" # define LINE_LENGTH 74 # ifndef HAVE_FSEEKO # define fseeko fseek # define ftello ftell # endif #endif #ifndef __BEGIN_DECLS #if defined(__cplusplus) #define __BEGIN_DECLS extern "C" { #define __END_DECLS } #else #define __BEGIN_DECLS #define __END_DECLS #endif #endif /* End Win32 */ #endif /* ifndef __COMMON_H */ md5deep-4.2/src/dig.cpp000066400000000000000000000575021176640446200147630ustar00rootroot00000000000000// MD5DEEP - dig.c // // By Jesse Kornblum and Simson Garfinkel // // This is a work of the US Government. In accordance with 17 USC 105, // copyright protection is not available for any work of the US Government. // // 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. // /* The functions in this file will recurse through a directory * and call hash_file(fn) for every file that needs to be hashes. */ // $Id: dig.cpp 632 2012-06-05 11:00:58Z jessekornblum $ #include "main.h" #include "winpe.h" #include /* * file stat system */ // Use a stat function to look up while kind of file this is // and determine its size if possible #ifdef _WIN32 #define TSTAT(path,buf) _wstat64(path,buf) #define TLSTAT(path,buf) _wstat64(path,buf) // no lstat on windows #else #define TSTAT(path,buf) stat(path,buf) #define TLSTAT(path,buf) lstat(path,buf) #endif // Returns TRUE if the directory is '.' or '..', otherwise FALSE static bool is_special_dir(const tstring &d) { return global::make_utf8(d)=="." || global::make_utf8(d)==".."; } /* Determine the file type of a structure * called by file_type() and should_hash_symlink() */ file_types file_metadata_t::decode_file_type(const struct __stat64 &sb) { if (S_ISREG(sb.st_mode)) return stat_regular; if (S_ISDIR(sb.st_mode)) return stat_directory; if (S_ISBLK(sb.st_mode)) return stat_block; if (S_ISCHR(sb.st_mode)) return stat_character; if (S_ISFIFO(sb.st_mode)) return stat_pipe; #ifdef S_ISSOCK if (S_ISSOCK(sb.st_mode)) return stat_socket; // not present on WIN32 #endif #ifdef S_ISLNK if (S_ISLNK(sb.st_mode)) return stat_symlink; // not present on WIN32 #endif #ifdef S_ISDOOR // Solaris doors are an inter-process communications facility present in Solaris 2.6 // http://en.wikipedia.org/wiki/Doors_(computing) if (S_ISDOOR(sb.st_mode)) return stat_door; #endif return stat_unknown; } /** * stat a file and return the appropriate object * This would better be done on an open file handle */ int file_metadata_t::stat(const tstring &fn, file_metadata_t *m, class display &ocb) { struct __stat64 sb; if (::TSTAT(fn.c_str(),&sb)) { ocb.error_filename(fn,"%s",strerror(errno)); return -1; } m->fileid.dev = sb.st_dev; #ifdef _WIN32 BY_HANDLE_FILE_INFORMATION fileinfo; HANDLE filehandle = CreateFile(fn.c_str(), 0, // desired access FILE_SHARE_READ, NULL, OPEN_EXISTING, (FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS), NULL); // RBF - Error check CreateFile (void)GetFileInformationByHandle(filehandle, &fileinfo); CloseHandle(filehandle); m->fileid.ino = (((uint64_t)fileinfo.nFileIndexHigh)<<32) | (fileinfo.nFileIndexLow); #else m->fileid.ino = sb.st_ino; #endif m->nlink = sb.st_nlink; m->size = sb.st_size; m->ctime = sb.st_ctime; m->mtime = sb.st_mtime; m->atime = sb.st_atime; return 0; } /* Return the 'decoded' file type of a file. * If an error is found and ocb is provided, send the error to ocb. * If filesize and ctime are provided, give them. * Also return the file size and modification time (may be used elsewhere). */ file_types state::file_type(const tstring &fn,display *ocb,uint64_t *filesize, timestamp_t *ctime,timestamp_t *mtime,timestamp_t *atime) { struct __stat64 sb; memset(&sb,0,sizeof(sb)); if (TLSTAT(fn.c_str(),&sb)) { if(ocb) ocb->error_filename(fn,"%s", strerror(errno)); return stat_unknown; } if(ctime) *ctime = sb.st_ctime; if(mtime) *mtime = sb.st_mtime; if(atime) *atime = sb.st_atime; if(filesize){ if(sb.st_size!=0){ *filesize = sb.st_size; } else { /* * The stat() function does not return file size for raw devices. * If we have no file size, try to use the find_file_size function, * which calls ioctl. */ FILE *f = _tfopen(fn.c_str(),_TEXT("rb")); if(f){ *filesize = find_file_size(f,ocb); fclose(f); f = 0; } } } return file_metadata_t::decode_file_type(sb); } /**************************************************************** *** database of directories we've seen. *** originally in cycles.c. *** so much smaller now, we put it here. ****************************************************************/ void state::done_processing_dir(const tstring &fn_) { tstring fn = global::get_realpath(fn_); dir_table_t::iterator pos = dir_table.find(fn); if(pos==dir_table.end()){ ocb.internal_error("%s: Directory '%s' not found in done_processing_dir", progname.c_str(), fn.c_str()); // will not be reached. } dir_table.erase(pos); } void state::processing_dir(const tstring &fn_) { tstring fn = global::get_realpath(fn_); if (dir_table.find(fn)!=dir_table.end()) { ocb.internal_error("%s: Attempt to add existing %s in processing_dir", progname.c_str(), fn.c_str()); // will not be reached. } dir_table.insert(fn); } bool state::have_processed_dir(const tstring &fn_) { tstring fn = global::get_realpath(fn_); return dir_table.find(fn)!=dir_table.end(); } /**************************************************************** *** end of cycle processing. ****************************************************************/ #ifdef _WIN32 /**************************************************************** *** WIN32 specific code follows. ****************************************************************/ /* * On Win32 systems directories are handled... differently * Attempting to process d: causes an error, but d:\ does not. * Conversely, if you have a directory "foo", * attempting to process d:\foo\ causes an error, but d:\foo does not. * The following turns d: into d:\ and d:\foo\ into d:\foo * It also leaves d:\ as d:\ */ static void clean_name_win32(std::wstring &fn) { if (fn.size()<2) return; if (fn.size()==2 && fn[1]==_TEXT(':')){ fn.push_back(_TEXT(DIR_SEPARATOR)); return; } if (fn.size()==3 && fn[1]==_TEXT(':')){ return; } if (fn[fn.size()-1] == _TEXT(DIR_SEPARATOR)){ fn.erase(fn.size()-1); } } static int is_win32_device_file(const std::wstring &fn) { // Specifications for device files came from // http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx // Physical devices (like hard drives) are // \\.\PhysicalDriveX where X is a digit from 0 to 9 // Tape devices are \\.\tapeX where X is a digit from 0 to 9 // Logical volumes are \\.\X: where X is a letter */ if (!_wcsnicmp(fn.c_str(), _TEXT("\\\\.\\physicaldrive"),17) && (fn.size() == 18) && iswdigit(fn[17])) return TRUE; if (!_wcsnicmp(fn.c_str(), _TEXT("\\\\.\\tape"),8) && (fn.size() == 9) && iswdigit(fn[8])) return TRUE; if ((!_wcsnicmp(fn.c_str(),_TEXT("\\\\.\\"),4)) && (fn.size() == 6) && (iswalpha(fn[4])) && (fn[5] == ':')) return TRUE; return FALSE; } // Debugging function void print_last_error(char *function_name) { // Copied from http://msdn.microsoft.com/en-us/library/ms680582(VS.85).aspx // Retrieve the system error message for the last-error code LPTSTR pszMessage; DWORD dwLastError = GetLastError(); FormatMessage((FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS), NULL, dwLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &pszMessage, 0, NULL ); // Display the error message and exit the process std::cerr << function_name << "failed with error " << dwLastError << ":" << global::make_utf8(pszMessage) << "\n"; LocalFree(pszMessage); } // An NTFS Junction Point is like a hard link on *nix but only works // on the same filesystem and only for directories. Unfortunately they // can also create infinite loops for programs that recurse filesystems. // See http://blogs.msdn.com/oldnewthing/archive/2004/12/27/332704.aspx // for an example of such an infinite loop. // // This function detects junction points and returns TRUE if the // given filename is a junction point. Otherwise it returns FALSE. bool state::is_junction_point(const std::wstring &fn) { int status = false; WIN32_FIND_DATA FindFileData; HANDLE hFind; hFind = FindFirstFile(fn.c_str(), &FindFileData); if (INVALID_HANDLE_VALUE != hFind) { if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) { // We're going to skip this reparse point no matter what, // but we may want to display a message just in case. // TODO: Maybe have the option to follow symbolic links? status = true; if (IO_REPARSE_TAG_MOUNT_POINT == FindFileData.dwReserved0) { ocb.error_filename(fn,"Junction point, skipping"); } else if (IO_REPARSE_TAG_SYMLINK == FindFileData.dwReserved0) { ocb.error_filename(fn,"Symbolic link, skipping"); } else { ocb.error_filename(fn,"Unknown reparse point 0x%"PRIx32", skipping", FindFileData.dwReserved0); } } // We don't error check this call as there's nothing to do differently // if it fails. FindClose(hFind); } return status; } // This is experimental code for reparse point process // We don't use it yet, but I don't want to delete it // until I know what I'm doing. (jk 1 Mar 2009) /* #include if (status) { HANDLE hFile = CreateFile(fn, 0, // desired access FILE_SHARE_READ, NULL, OPEN_EXISTING, (FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS), NULL); if (INVALID_HANDLE_VALUE == hFile) { print_last_error(L"CreateFile"); } else { print_status("Opened ok!"); REPARSE_DATA_BUFFER buf; uint8_t bytesReturned; LPOVERLAPPED ov; int rc = DeviceIoControl(hFile, FSCTL_GET_REPARSE_POINT, NULL, 0, &buf, MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &bytesReturned, ov); if (!rc) { print_last_error(L"DeviceIoControl"); } CloseHandle(hFile); } } FindClose(hFind); */ #endif /**************************************************************** *** End of WIN32 specific code. ****************************************************************/ /* POSIX version of clean_name */ static void remove_double_slash(tstring &fn) { tstring search; search.push_back(DIR_SEPARATOR); search.push_back(DIR_SEPARATOR); #ifdef _WIN32 // On Windows, we have to allow the first two characters to be slashes // to account for UNC paths. e.g. \\SERVER\dir\path // So on windows we ignore the first character size_t start = 1; #else size_t start = 0; #endif while(true){ size_t loc = fn.find(search,start); if(loc==tstring::npos) break; // no more to find fn.erase(loc,1); // erase one of the two slashes } } /* * remove any /./ */ static void remove_single_dirs(tstring &fn) { tstring search; search.push_back(DIR_SEPARATOR); search.push_back('.'); search.push_back(DIR_SEPARATOR); while(true){ size_t loc = fn.find(search); if(loc==tstring::npos) break; // no more to find fn.erase(fn.begin()+loc,fn.begin()+loc+2); // erase } } // Removes all "../" references from the absolute path fn // If string contains f/d/e/../a replace it with f/d/a/ static void remove_double_dirs(tstring &fn) { tstring search; search.push_back(DIR_SEPARATOR); search.push_back('.'); search.push_back('.'); search.push_back(DIR_SEPARATOR); while(true){ size_t loc = fn.rfind(search); if(loc==tstring::npos) break; /* See if there is another dir separator */ size_t before = fn.rfind(DIR_SEPARATOR,loc-1); if(before==tstring::npos) break; /* Now delete all between before+1 and loc+3 */ fn.erase(fn.begin()+before+1,fn.begin()+loc+4); } } #ifndef _WIN32 void state::clean_name_posix(std::string &fn) { // We don't need to call these functions when running in Windows // as we've already called real_path() on them in main.c. These // functions are necessary in *nix so that we can clean up the // path names without removing the names of symbolic links. They // are also called when the user has specified an absolute path // but has included extra double dots or such. // // TODO: See if Windows Vista's symbolic links create problems if (!ocb.opt_relative) { remove_double_slash(fn); remove_single_dirs(fn); remove_double_dirs(fn); } } #endif void state::process_dir(const tstring &fn) { _TDIR *current_dir; struct _tdirent *entry; if(opt_debug) std::cerr << "*** process_dir(" << global::make_utf8(fn) << ")\n"; if (have_processed_dir(fn)) { ocb.error_filename(fn,"symlink creates cycle"); return ; } if ((current_dir = _topendir(fn.c_str())) == NULL) { ocb.error_filename(fn,"%s", strerror(errno)); return ; } /* 2011-SEP-15 New logic: * 1. Open directory. * 2. Get a list of all the dir entries. * 3. Close the directory. * 4. Process them. */ std::vector dir_entries; while ((entry = _treaddir(current_dir)) != NULL) { // ignore . and .. if (is_special_dir(entry->d_name)) continue; // compute full path // don't append if the DIR_SEPARATOR if there is already one there tstring new_file = fn; if (0 == new_file.size() || new_file[new_file.size()-1]!=DIR_SEPARATOR) { new_file.push_back(DIR_SEPARATOR); } new_file.append(entry->d_name); #ifdef _WIN32 /// Windows Junction points if (is_junction_point(new_file)){ continue; } #endif dir_entries.push_back(new_file); } _tclosedir(current_dir); // done with this directory processing_dir(fn); // note that we are now processing a directory for(std::vector::const_iterator it = dir_entries.begin();it!=dir_entries.end();it++){ dig_normal(*it); } done_processing_dir(fn); // note that we are done with this directory return ; } /* Deterine if a symlink should be hashed or not. * Returns TRUE if a symlink should be hashed. */ bool state::should_hash_symlink(const tstring &fn, file_types *link_type) { /** * We must look at what this symlink points to before we process it. * The file_type() function uses lstat to examine the file. * Here we use the normal stat to examine what this symlink points to. */ struct __stat64 sb; if (TSTAT(fn.c_str(),&sb)) { ocb.error_filename(fn,"%s",strerror(errno)); return false; } file_types type = file_metadata_t::decode_file_type(sb); if (type == stat_directory) { if (mode_recursive){ process_dir(fn); } else { ocb.error_filename(fn,"Is a directory"); } return false; } if (link_type) *link_type = type; return true; } /// Returns true if the filename fn is a Windows PE executable /// /// If the filename is a PE executable but does not have an executable /// extension, displays an error message. If the file cannot be read, /// returns false. /// /// @param fn Filename to examine bool state::should_hash_winpe(const tstring &fn) { bool executable_extension = has_executable_extension(fn); FILE * handle = _tfopen(fn.c_str(),_TEXT("rb")); if (NULL == handle) { ocb.error_filename(fn,"%s", strerror(errno)); return false; } unsigned char buffer[PETEST_BUFFER_SIZE] = {0}; size_t size = fread(buffer,1,PETEST_BUFFER_SIZE,handle); fclose(handle); bool status = is_pe_file(buffer, size); if (status and not executable_extension) ocb.error_filename(fn,"Is Windows executable but does not have executable extension"); return status; } /* * Type should be the result of calling lstat on the file. * We want to know what this file is, not what it points to * This expert calls itself recursively. The dir_table * makes sure that we do not loop. */ bool state::should_hash_expert(const tstring &fn, file_types type) { file_types link_type=stat_unknown; if (stat_directory == type) { if (mode_recursive){ process_dir(fn); } else { ocb.error_filename(fn,"Is a directory"); } return false; } if (mode_winpe) { // The user could have requested PE files *and* something else // therefore we don't return false here if the file is not a PE. // Note that we have to check for directories first! if (should_hash_winpe(fn)){ return true; } } switch(type) { // We can't just return s->mode & mode_X because mode_X is // a 64-bit value. When that value gets converted back to int, // the high part of it is lost. #define RETURN_IF_MODE(A) if (A) return true; break; case stat_directory: // This case should be handled above. This statement is // here to avoid compiler warnings ocb.internal_error("Did not handle directory entry in should_hash_expert()"); case stat_regular: RETURN_IF_MODE(mode_regular); case stat_block: RETURN_IF_MODE(mode_block); case stat_character: RETURN_IF_MODE(mode_character); case stat_pipe: RETURN_IF_MODE(mode_pipe); case stat_socket: RETURN_IF_MODE(mode_socket); case stat_door: RETURN_IF_MODE(mode_door); case stat_symlink: // Although it might appear that we need nothing more than // return (s->mode & mode_symlink); // that doesn't work. That logic gets into trouble when we're // running in recursive mode on a symlink to a directory. // The program attempts to open the directory entry itself // and gets into an infinite loop. if (!(mode_symlink)) return false; if (should_hash_symlink(fn,&link_type)) { return should_hash_expert(fn,link_type); } return false; case stat_unknown: ocb.error_filename(fn,"unknown file type"); return false; } return false; } /* * should_hash confusingly returns true if a file should be hashed, * but if it is called with a directory it recursively hashes it. */ bool state::should_hash(const tstring &fn) { file_types type = state::file_type(fn,&ocb,0,0,0,0); if (mode_expert) return should_hash_expert(fn,type); if (type == stat_directory) { if (mode_recursive){ process_dir(fn); } else { ocb.error_filename(fn,"Is a directory"); } return false; } if (type == stat_symlink){ return should_hash_symlink(fn,NULL); } if (type == stat_unknown){ return false; } // By default we hash anything we can't identify as a "bad thing" return true; } // Search through a directory and its subdirectory for files to hash void state::dig_normal(const tstring &fn_) { // local copy will be modified tstring fn(fn_); if (opt_debug) ocb.status("*** state::dig_normal(%s)",global::make_utf8(fn).c_str()); #ifdef _WIN32 clean_name_win32(fn); #else clean_name_posix(fn); #endif if (opt_debug) ocb.status("*** cleaned:%s",global::make_utf8(fn).c_str()); if (should_hash(fn)) ocb.hash_file(fn); } #ifdef _WIN32 /** * Extract the directory name from a string and return it. * Do not include the final */ std::wstring win32_dirname(const std::wstring &fn) { size_t loc = fn.rfind(DIR_SEPARATOR); if (loc==tstring::npos) { return tstring(); // return empty string } return fn.substr(0,loc); } /** * dig_win32 ensures the program processes files with Unicode filenames. * They are not processed using the standard opendir/readdir commands. * It also handles the case of asterisks on the command line being used to refer to files with * Unicode filenames. */ void state::dig_win32(const std::wstring &fn) { WIN32_FIND_DATA FindFileData; HANDLE hFind; if(opt_debug) ocb.status("*** state::dig_win32(%s)", global::make_utf8(fn).c_str()); if (is_win32_device_file(fn)){ ocb.hash_file(fn); return ; } // Filenames without wildcards can be processed by the // normal recursion code. size_t asterisk = fn.find(L'*'); size_t question = fn.find(fn,L'?'); if (asterisk==std::wstring::npos && question==std::wstring::npos){ dig_normal(fn); return; } hFind = FindFirstFile(fn.c_str(), &FindFileData); if (INVALID_HANDLE_VALUE == hFind) { ocb.error_filename(fn,"No such file or directory"); return; } #define FATAL_ERROR_UNK(A) if (NULL == A) fatal_error("%s: %s", progname.c_str(), strerror(errno)); #define FATAL_ERROR_MEM(A) if (NULL == A) fatal_error("%s: Out of memory",progname.c_str()); tstring dirname = win32_dirname(fn); if(dirname.size()>0) dirname += _TEXT(DIR_SEPARATOR); int rc = 1; while (rc!=0) { if (!(is_special_dir(FindFileData.cFileName))) { // The filename we've found doesn't include any path information. // We have to add it back in manually. Thankfully Windows doesn't // allow wildcards in the early part of the path. For example, // we will never see: c:\bin\*\tools // // Because the wildcard is always in the last part of the input // (e.g. c:\bin\*.exe) we can use the original dirname, combined // with the filename we've found, to make the new filename. std::wstring new_fn; new_fn = dirname + FindFileData.cFileName; if (!ocb.opt_relative) { new_fn = global::get_realpath(new_fn); } if (!(is_junction_point(new_fn))) dig_normal(new_fn); } rc = FindNextFile(hFind, &FindFileData); } // rc now equals zero, we can't find the next file if (ERROR_NO_MORE_FILES != GetLastError()) { // The Windows API for getting an intelligible error message // is beserk. Rather than play their silly games, we // acknowledge that an unknown error occured and hope we // can continue. ocb.error_filename(fn,"Unknown error while expanding wildcard"); return; } rc = FindClose(hFind); if (0 == rc) { ocb.error_filename(fn,"Unknown error while cleaning up wildcard expansion"); } if(opt_debug) ocb.status("state::dig_win32(%s)",global::make_utf8(fn).c_str()); } #endif /** * Test the string manipulation routines. */ inline std::ostream & operator << (std::ostream &os,const struct __stat64 sb) { os << "size=" << sb.st_size << " ctime=" << sb.st_ctime ; return os; } void state::dig_self_test() { struct __stat64 sb; std::cerr << "dig_self_test\n"; memset(&sb,0,sizeof(sb)); std::cerr << "check stat 1: " << TLSTAT(_T("z:\\simsong on my mac\\md5deep\\branches\\version4\\hashdeep\\md5.cpp"),&sb) << " " << sb << "\n"; memset(&sb,0,sizeof(sb)); std::cerr << "check stat 2: " << TLSTAT(_T("c:\\autoexec.bat"),&sb) << " " << sb << "\n"; memset(&sb,0,sizeof(sb)); std::cerr << "check stat 3: " << TLSTAT(_T("/etc/resolv.conf"),&sb) << " " << sb << "\n"; tstring fn(_T("this is")); fn.push_back(DIR_SEPARATOR); fn.push_back(DIR_SEPARATOR); fn += _T("a test"); tstring fn2(fn); remove_double_slash(fn2); std::cerr << "remove_double_slash(" << fn << ")="<0;i++){ uint64_t stat_bytes; timestamp_t ctime; timestamp_t mtime; timestamp_t atime; file_types ft = s.file_type(names[i],&s.ocb,&stat_bytes,&ctime,&mtime,&atime); std::cerr << "file_type(" << names[i] << ")=" << (int)ft << " size=" << stat_bytes << " ctime=" << ctime << "\n"; } } md5deep-4.2/src/display.cpp000066400000000000000000000526751176640446200156730ustar00rootroot00000000000000#include "main.h" #include "utf8.h" #include // $Id: display.cpp 632 2012-06-05 11:00:58Z jessekornblum $ /** * * display.cpp: * Manages user output. * All output is in UTF-8. * * If opt_escape8 is set, then non-ASCII UTF-8 characters are turned * into U+XXXX notation. * * NOTE WITH MINGW GCC-4.3.0: * You will get a warning from the format. IGNORE IT. * See http://lists.gnu.org/archive/html/qemu-devel/2009-01/msg01979.html * * All output is threadsafe. */ /**************************************************************** ** Support routines ****************************************************************/ void display::set_outfilename(std::string outfilename) { myoutstream.open(outfilename.c_str(),std::ios::out|std::ios::binary); if(!myoutstream.is_open()){ fatal_error("%s: Cannot open: ",opt_outfilename.c_str()); } out = &myoutstream; } void display::writeln(std::ostream *os,const std::string &str) { lock(); (*os) << str; if (opt_zero){ (*os) << '\000'; } else { (*os) << std::endl; } os->flush(); unlock(); } /* special handling for vasprintf under mingw. * Sometimes the function prototype is missing. Sometimes the entire function is missing! */ #if defined(HAVE_VASPRINTF) && defined(MINGW) extern "C" { int vasprintf(char **ret,const char *fmt,va_list ap); } #endif /* * If we don't have vasprintf, bring it in. */ /* #if !defined(HAVE_VASPRINTF) extern "C" { // // We do not have vasprintf. // We have determined that vsnprintf() does not perform properly on windows. // So we just allocate a huge buffer and then strdup() and hope! // int vasprintf(char **ret,const char *fmt,va_list ap) { // Figure out how long the result will be char buf[65536]; int size = vsnprintf(buf,sizeof(buf),fmt,ap); if(size<0) return size; // Now allocate the memory *ret = (char *)strdup(buf); return size; } } #endif */ void display::status(const char *fmt,...) { va_list(ap); va_start(ap,fmt); char *ret = 0; if(vasprintf(&ret,fmt,ap) < 0){ (*out) << progname << ": " << strerror(errno); exit(EXIT_FAILURE); } writeln(out,ret); free(ret); va_end(ap); } void display::error(const char *fmt,...) { if(opt_silent) return; va_list(ap); va_start(ap,fmt); char *ret = 0; if (vasprintf(&ret,fmt,ap) < 0) { (*out) << progname << ": " << strerror(errno); exit(EXIT_FAILURE); } lock(); std::cerr << progname << ": " << ret << std::endl; unlock(); va_end(ap); } void display::try_msg(void) { writeln(&std::cerr,std::string("Try `") + progname + " -h` for more information."); } void display::fatal_error(const char *fmt,...) { va_list(ap); va_start(ap,fmt); char *ret = 0; if(vasprintf(&ret,fmt,ap) < 0){ (*out) << progname << ": " << strerror(errno); exit(EXIT_FAILURE); } writeln(&std::cerr,progname + ": " + ret); free(ret); va_end(ap); exit(1); } void display::internal_error(const char *fmt,...) { va_list(ap); va_start(ap,fmt); char *ret = 0; if(vasprintf(&ret,fmt,ap) < 0){ (*out) << progname << ": " << strerror(errno); exit(EXIT_FAILURE); } writeln(&std::cerr,ret); writeln(&std::cerr,progname+": Internal error. Contact developer!"); va_end(ap); free(ret); exit(1); } void display::print_debug(const char *fmt, ... ) { #ifdef __DEBUG va_list(ap); va_start(ap,fmt); char *ret = 0; if(vasprintf(&ret,fmt,ap) < 0){ (*out) << progname << ": " << strerror(errno); exit(EXIT_FAILURE); } writeln(&std::cerr,std::string("DEBUG:" ) + ret); free(ret); va_end(ap); #endif } /** * output the string, typically a fn, optionally performing unicode escaping */ std::string display::fmt_filename(const std::string &fn) const { if(opt_unicode_escape){ return global::escape_utf8(fn); } else { return fn; // assumed to be utf8 } } #ifdef _WIN32 std::string display::fmt_filename(const std::wstring &fn) const { if(opt_unicode_escape){ return global::escape_utf8(global::make_utf8(fn)); } else { return global::make_utf8(fn); } } #endif void display::error_filename(const std::string &fn,const char *fmt, ...) { if(opt_silent) return; va_list(ap); va_start(ap,fmt); char *ret = 0; if(vasprintf(&ret,fmt,ap) < 0){ (*out) << progname << ": " << strerror(errno); exit(EXIT_FAILURE); } if(dfxml){ lock(); dfxml->push("fileobject"); dfxml->xmlout("filename",fn); dfxml->xmlout("error",ret); dfxml->pop(); unlock(); } else { writeln(&std::cerr,fmt_filename(fn) + ": " + ret); } free(ret); va_end(ap); } #ifdef _WIN32 void display::error_filename(const std::wstring &fn,const char *fmt, ...) { if(opt_silent) return; va_list(ap); va_start(ap,fmt); char *ret = 0; if(vasprintf(&ret,fmt,ap) < 0){ (*out) << progname << ": " << strerror(errno); exit(EXIT_FAILURE); } writeln(&std::cerr,fmt_filename(fn) + ": " + ret); free(ret); va_end(ap); } #endif void display::clear_realtime_stats() { lock(); std::cerr << "\r"; for(int i=0;ifile_name; if (fn.size() > MAX_FILENAME_LENGTH){ /* Shorten from the middle */ size_t half = (MAX_FILENAME_LENGTH)/2; fn = fn.substr(0,half) + "..." + fn.substr(fn.size()-half,half); } ss << fmt_filename(fn) << " "; // If we've read less than one MB, then the computed value for mb_read // will be zero. Later on we may need to divide the total file size, // total_megs, by mb_read. Dividing by zero can create... problems if (hc->read_len < ONE_MEGABYTE){ mb_read = 1; } else { mb_read = hc->read_len / ONE_MEGABYTE; } if (fdht->stat_megs()==0 || opt_estimate==false) { ss << mb_read << "MB done. Unable to estimate remaining time."; } else { // Estimate the number of seconds using only integer math. // // We now compute the number of bytes read per second and then // use that to determine how long the whole file should take. // By subtracting the number of elapsed seconds from that, we should // get a good estimate of how many seconds remain. uint64_t seconds = (fdht->stat_bytes / (fdht->file_bytes / elapsed)) - elapsed; // We don't care if the remaining time is more than one day. // If you're hashing something that big, to quote the movie Jaws: // // "We're gonna need a bigger boat." uint64_t hour = seconds / 3600; seconds -= (hour * 3600); uint64_t min = seconds/60; seconds -= min * 60; ss << mb_read << "MB of " << fdht->stat_megs() << "MB done, "; char msg[64]; snprintf(msg,sizeof(msg),"%02"PRIu64":%02"PRIu64":%02"PRIu64" left", hour, min, seconds); ss << msg; } ss << "\r"; lock(); std::cerr << ss.str() << "\r"; unlock(); } void display::display_banner_if_needed() { if(this->dfxml!=0) return; // output is in DFXML; no banner lock(); if(banner_displayed==false){ (*out) << utf8_banner; banner_displayed=true; } unlock(); } void file_data_hasher_t::dfxml_write_hashes(std::string hex_hashes[],int indent) { for(int i=0;idfxml_hash << ' '; } this->dfxml_hash << "" << hex_hashes[i] <<"\n"; } } } void file_data_hasher_t::compute_dfxml(bool known_hash,const hash_context_obj *hc) { int indent=0; if(hc && this->ocb->piecewise_size>0){ this->dfxml_hash << " \n"; indent=2; } this->dfxml_write_hashes(this->hash_hex,indent); if(known_hash){ this->dfxml_hash << "1"; } if(hc && this->ocb->piecewise_size){ this->dfxml_hash << "\n"; } } /** * Return the number of entries in the hashlist that have used==0 * Optionally display them, optionally with additional output. */ uint64_t display::compute_unused(bool show_display, std::string annotation) { uint64_t count=0; /* This is the only place we iterate through known. * We make a list of all the filenames so we can get out of the lock fast. */ std::vector filelist; lock(); for(hashlist::const_iterator i = known.begin(); i != known.end(); i++){ if((*i)->matched_file_number==0){ count++; if (show_display || opt_verbose >= MORE_VERBOSE) { filelist.push_back((*i)->file_name); } } } unlock(); for(std::vector::const_iterator i = filelist.begin(); i!= filelist.end(); i++){ std::string line = *i + annotation; writeln(out,line); } return count; } /** * perform an audit */ int display::audit_check() { /* Count the number of unused */ match.unused = compute_unused(false,": Known file not used"); return (0 == this->match.unused && 0 == this->match.unknown && 0 == this->match.moved); } void display::display_audit_results() { if (audit_check()==0) { status("%s: Audit failed", progname.c_str()); set_return_code(status_t::status_EXIT_FAILURE); } else { status("%s: Audit passed", progname.c_str()); } if (opt_verbose) { if(opt_verbose >= MORE_VERBOSE){ status(" Input files examined: %"PRIu64, this->match.total); status(" Known files expecting: %"PRIu64, this->match.expect); } status(" Files matched: %"PRIu64, this->match.exact); status("Files partially matched: %"PRIu64, this->match.partial); status(" Files moved: %"PRIu64, this->match.moved); status(" New files found: %"PRIu64, this->match.unknown); status(" Known files not found: %"PRIu64, this->match.unused); } } std::string display::fmt_size(const file_data_t *fdt) const { if (opt_display_size) { std::stringstream ss; ss.width(10); ss.fill(' '); ss << fdt->file_bytes; ss.width(1); ss << (opt_csv ? ", " : " "); return ss.str(); } return std::string(); } /* The old display_match_result from md5deep */ void display::md5deep_display_match_result(file_data_hasher_t *fdht,const hash_context_obj *hc) { lock(); const file_data_t *fs = known.find_hash(opt_md5deep_mode_algorithm, fdht->hash_hex[opt_md5deep_mode_algorithm], fdht->file_name, fdht->file_number); unlock(); int known_hash = fs ? 1 : 0; if ((known_hash && opt_mode_match) || (!known_hash && opt_mode_match_neg)) { if(dfxml){ fdht->compute_dfxml(opt_show_matched || known_hash,hc); return ; } std::stringstream line; line << fmt_size(fdht); if (opt_display_hash) { line << fdht->hash_hex[opt_md5deep_mode_algorithm]; if (opt_csv) { line << ","; } else if (opt_asterisk) { line << " *"; } else { line << " "; } } if (opt_show_matched) { if (known_hash && (opt_mode_match)) { line << fdht->file_name << " matched " << fs->file_name; } else { line << fdht->file_name << " does NOT match"; } } else{ line << fdht->file_name; if(piecewise_size) { line << " offset " << hc->read_offset << "-" << hc->read_offset + hc->read_len - 1; } } writeln(out,line.str()); } } /* The original display_match_result from md5deep. * This should probably be merged with the function above. * This function is very similar to audit_update(), which follows */ void display::display_match_result(file_data_hasher_t *fdht,const hash_context_obj *hc) { file_data_t *matched_fdt = NULL; int should_display = (primary_match_neg == primary_function); lock(); // protects the search and the printing hashlist::searchstatus_t m = known.search(fdht,&matched_fdt); unlock(); std::stringstream line1; switch(m){ // If only the name is different, it's still really a match // as far as we're concerned. case hashlist::status_file_name_mismatch: case hashlist::status_match: should_display = (primary_match_neg != primary_function); break; case hashlist::status_file_size_mismatch: line1 << fmt_filename(fdht) << ": Hash collision with " << fmt_filename(matched_fdt); writeln(&std::cerr,line1.str()); break; case hashlist::status_partial_match: line1 << fmt_filename(fdht) << ": partial hash match with " << fmt_filename(matched_fdt); writeln(&std::cerr,line1.str()); break; default: break; } if (should_display) { std::stringstream line2; if (opt_display_hash){ display_hash_simple(fdht,hc); } else { line2 << fmt_filename(fdht); if (opt_show_matched && primary_match == primary_function) { line2 << " matches "; if (NULL == matched_fdt) { line2 << "(unknown file)"; } else { line2 << fmt_filename(matched_fdt); } } writeln(out,line2.str()); } } } /** * Called after every file is hashed by display_hash * when primary_function==primary_audit * Records every file seen in the 'seen' structure, referencing the 'known' structure. */ int display::audit_update(file_data_hasher_t *fdht) { file_data_t *matched_fdht=0; lock(); // protects the search and the printing hashlist::searchstatus_t m = known.search(fdht,&matched_fdht); unlock(); std::string line; switch(m){ case hashlist::status_match: case hashlist::searchstatus_ok: this->match.exact++; if (opt_verbose >= INSANELY_VERBOSE) { line = fmt_filename(fdht) + ": Ok"; } break; case hashlist::status_no_match: this->match.unknown++; if (opt_verbose >= MORE_VERBOSE) { line = fmt_filename(fdht) + ": No match"; } break; case hashlist::status_file_name_mismatch: this->match.moved++; if (opt_verbose >= MORE_VERBOSE) { line = fmt_filename(fdht) + ": Moved from " + fmt_filename(matched_fdht); } break; case hashlist::status_partial_match: case hashlist::status_file_size_mismatch: this->match.partial++; // We only record the hash collision if it wasn't anything else. // At the same time, however, a collision is such a significant // event that we print it no matter what. line = fmt_filename(fdht) + ": Hash collision with " + fmt_filename(matched_fdht); } if(line.size()>0){ writeln(&std::cout,line); } return FALSE; } /** * Examines the hash table and determines if any known hashes have not * been used or if any input files did not match the known hashes. If * requested, displays any unused known hashes. Returns a status variable */ void display::finalize_matching() { /* Could the total matched */ lock(); uint64_t total_matched = known.total_matched(); unlock(); if (total_matched!=known_size()){ return_code.add(status_t::STATUS_UNUSED_HASHES); // were there any unmatched? } if (total_matched==0){ return_code.add(status_t::STATUS_INPUT_DID_NOT_MATCH); // were they all unmatched? } if (mode_not_matched){ // should we display those that were not matched? compute_unused(true,""); } } mutex_t display::portable_gmtime_mutex; struct tm *display::portable_gmtime(struct tm *my_time,const timestamp_t *t) { memset(my_time,0,sizeof(*my_time)); // clear it out #ifdef HAVE_GMTIME_R gmtime_r(t,my_time); return my_time; #endif #ifdef HAVE__GMTIME64 // This is not threadsafe, hence the lock portable_gmtime_mutex.lock(); *my_time = *_gmtime64(t); portable_gmtime_mutex.unlock(); //we tried this: //_gmtime64_s(&fdht->timestamp,&my_time); //but it had problems on mingw64 return my_time; #endif #if !defined(HAVE__GMTIME64) && !defined(HAVE_GMTIME_R) #error This program requires either _gmtime64 or gmtime_r for compilation #endif } /* The old display_hash from the md5deep program, with modifications * to build the line before outputing it. * * needs hasher because of triage mode */ void display::md5deep_display_hash(file_data_hasher_t *fdht,const hash_context_obj *hc) { /** * We can't call display_size here because we don't know if we're * going to display *anything* yet. If we're in matching mode, we * have to evaluate if there was a match first. */ if (opt_mode_match || opt_mode_match_neg){ md5deep_display_match_result(fdht,hc); return; } if(this->dfxml){ fdht->compute_dfxml(opt_show_matched,hc); return; } std::stringstream line; if (mode_triage) { line << fdht->triage_info << "\t"; } line << fmt_size(fdht) << fdht->hash_hex[opt_md5deep_mode_algorithm]; if (mode_quiet){ line << " "; } else { if ((fdht->ocb->piecewise_size) || (fdht->is_stdin()==false)) { if (mode_timestamp) { struct tm my_time; portable_gmtime(&my_time,&fdht->ctime); char time_str[MAX_TIME_STRING_LENGTH]; // The format is four digit year, two digit month, // two digit hour, two digit minute, two digit second strftime(time_str, sizeof(time_str), "%Y:%m:%d:%H:%M:%S", &my_time); line << (opt_csv ? ",":" ") << time_str; } if (opt_csv) { line << ","; } else if (opt_asterisk) { line << " *"; } else if (mode_triage) { line << "\t"; } else { line << " "; } line << fmt_filename(fdht); } } if(hc && fdht->ocb->piecewise_size > 0){ uint64_t len = (hc->read_offset+hc->read_len-1); if(hc->read_offset==0 && hc->read_len==0) len=0; line << " offset " << hc->read_offset << "-" << len; } writeln(out,line.str()); } /* * Externally called to display a simple hash */ void display::display_hash_simple(file_data_hasher_t *fdht,const hash_context_obj *hc) { if(this->dfxml){ fdht->compute_dfxml(opt_show_matched,hc); return; } /* Old comment: * In piecewise mode the size of each 'file' is the size * of the block it came from. This is important when doing an * audit in piecewise mode. In all other cases we use the * total number of bytes from the file we *actually* read * * New comment: * read_len is always correct. * In piecewise mode its the size of the piece, * In normal mode it's the size of the file. * * NOTE: Ignore the warning in the format when running on mingw with GCC-4.3.0 * see http://lists.gnu.org/archive/html/qemu-devel/2009-01/msg01979.html * */ display_banner_if_needed(); std::stringstream line; line << hc->read_len << ","; for (int i = 0 ; i < NUM_ALGORITHMS ; ++i) { if (hashes[i].inuse){ line << fdht->hash_hex[i] << ","; } } line << fmt_filename(fdht); if(fdht->ocb->piecewise_size > 0){ std::stringstream ss; uint64_t len = (hc->read_offset+hc->read_len-1); if(hc->read_offset==0 && hc->read_len==0) len=0; line << " offset " << hc->read_offset << "-" << len; } writeln(out,line.str()); } /** * Called by hash() in hash.c when the hashing operation is complete. * Display the hash and perform any auditing steps. */ void display::display_hash(file_data_hasher_t *fdht,const hash_context_obj *hc) { switch (primary_function) { case primary_compute: display_hash_simple(fdht,hc); break; case primary_match: case primary_match_neg: display_match_result(fdht,hc); break; case primary_audit: audit_update(fdht); break; } } void display::dfxml_startup(int argc,char **argv) { if(dfxml){ lock(); dfxml->push("dfxml","xmloutputversion='1.0'"); dfxml->push("metadata", "\n xmlns='http://md5deep.sourceforge.net/md5deep/' " "\n xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " "\n xmlns:dc='http://purl.org/dc/elements/1.1/'" ); dfxml->xmlout("dc:type","Hash List","",false); dfxml->pop(); dfxml->add_DFXML_creator(PACKAGE_NAME,PACKAGE_VERSION,XML::make_command_line(argc,argv)); dfxml->push("configuration"); dfxml->push("algorithms"); for(int i=0;imake_indent(); dfxml->printf("\n", hashes[i].name.c_str(),hashes[i].inuse); } dfxml->pop(); // algorithms dfxml->pop(); // configuration unlock(); } } void display::dfxml_timeout(const std::string &tag,const timestamp_t &val) { char buf[256]; struct tm tm; strftime(buf,sizeof(buf),"%FT%TZ",portable_gmtime(&tm,&val)); dfxml->xmlout(tag,buf); } void display::dfxml_write(file_data_hasher_t *fdht) { if(dfxml){ std::string attrs; if(opt_verbose && fdht->workerid>=0){ std::stringstream ss; ss << "workerid='" << fdht->workerid << "'"; attrs = ss.str(); } lock(); dfxml->push("fileobject",attrs); dfxml->xmlout("filename",fdht->file_name); dfxml->xmlout("filesize",(int64_t)fdht->stat_bytes); if(fdht->ctime) dfxml_timeout("ctime",fdht->ctime); if(fdht->mtime) dfxml_timeout("mtime",fdht->mtime); if(fdht->atime) dfxml_timeout("atime",fdht->atime); dfxml->writexml(fdht->dfxml_hash.str()); dfxml->pop(); unlock(); } } void display::dfxml_shutdown() { if(dfxml){ lock(); dfxml->add_rusage(); dfxml->pop(); // outermost dfxml->close(); delete dfxml; dfxml = 0; unlock(); } } md5deep-4.2/src/files.cpp000066400000000000000000000444301176640446200153160ustar00rootroot00000000000000/** * MD5DEEP - files.cpp * * By Jesse Kornblum * Substantially modified by Simson Garfinkel. * * This is a work of the US Government. In accordance with 17 USC 105, * copyright protection is not available for any work of the US Government. * * 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. * * $Id: files.cpp 571 2011-12-29 09:46:10Z xchatty $ * * files.cpp was originally just part of the md5deep-family programs, not hashdeep. * It reads hash database files and incorporates them into the in-memory database. * Because it was designed for md5deep/sha1deep/etc, it would only look for a * single hash per line. * * The original program had variables named h_ilook, h_ilook3 and h_ilook4. * These variables were set to the variable number of the hash algorithm being looked for in each line. * */ #include "main.h" #include "common.h" #ifndef HAVE_ISXDIGIT bool isxdigit(char ch) { return isdigit(ch) || (ch >= 'a' && ch <= 'f') || (ch => 'A' && ch <= 'F'); } #endif /* --------------------------------------------------------------------- How to add more file types that we can read known hashes from: 1. Add a definition of TYPE_[fileType] to main.h. Ex: for type "cows", you would want to define TYPE_COWS. 2. If your filetype has a rigid header, you should define a HEADER variable to make comparisons easier. 3. Add a check for your file type to the identify_hash_file_type() function. 4. Create a method to find a valid hash and filename in a line of your file. You are encouraged to use find_plain_hash and find_rigid_hash if possible! 5. Add this method to the find_hash_in_line() function. 6. Add a variable to the state in main.h to indicate if each filetype supports this hash. The variable can be used to denote a position if necessary. Look for h_[name] variables for examples. 7. Each hashing algorithm should set this variable in the setup_hashing_algorithm function. ---------------------------------------------------------------------- */ typedef struct _ENCASE_HASH_HEADER { /* 000 */ char Signature[8]; /* 008 */ uint32_t Version; /* 00c */ uint32_t Padding; /* 010 */ uint32_t NumHashes; } ENCASE_HASH_HEADER; #define ENCASE_HEADER "HASH\x0d\x0a\xff\x00" #define ILOOK_HEADER \ "V1Hash,HashType,SetDescription,FileName,FilePath,FileSize" #define ILOOK3_HEADER \ "V3Hash,HashSHA1,FileName,FilePath,FileSize,HashSHA256,HashSHA384,HashSHA512" #define ILOOK4_HEADER \ "V4Hash,HashSHA1,FileName,FilePath,FileSize,HashSHA256,HashSHA384,HashSHA512,CreateTime,ModTime,LastAccessTime" #define NSRL_15_HEADER \ "\"SHA-1\",\"FileName\",\"FileSize\",\"ProductCode\",\"OpSystemCode\",\"MD4\",\"MD5\",\"CRC32\",\"SpecialCode\"" #define NSRL_20_HEADER \ "\"SHA-1\",\"MD5\",\"CRC32\",\"FileName\",\"FileSize\",\"ProductCode\",\"OpSystemCode\",\"SpecialCode\"" #define HASHKEEPER_HEADER \ "\"file_id\",\"hashset_id\",\"file_name\",\"directory\",\"hash\",\"file_size\",\"date_modified\",\"time_modified\",\"time_zone\",\"comments\",\"date_accessed\",\"time_accessed\"" #define HASH_STRING_LENGTH (hashes[opt_md5deep_mode_algorithm].bit_length/4) /**************************************************************** *** SUpport ****************************************************************/ // Find the index of the next comma in the string str starting at index start. // quotes cause commas to be ingored until you are out of the quote. // If there is no next comma, returns -1. static int find_next_comma(char *str, unsigned int start) { assert(str); size_t size = strlen(str); unsigned int pos = start; int in_quote = FALSE; while (pos < size) { switch (str[pos]) { case '"': in_quote = !in_quote; break; case ',': if (in_quote) break; // Although it's potentially unwise to cast an unsigned int back // to an int, problems will only occur when the value is beyond // the range of int. Because we're working with the index of a // string that is probably less than 32,000 characters, we should // be okay. return (int)pos; } ++pos; } return -1; } // Shift the contents of a string so that the values after 'new_start' // will now begin at location 'start' void shift_string(char *fn, size_t start, size_t new_start) { assert(fn!=0); // TODO: Can shift_string be replaced with memmove? if (start > strlen(fn) || new_start < start) return; while (new_start < strlen(fn)) { fn[start] = fn[new_start]; new_start++; start++; } fn[start] = 0; } // Returns the string after the nth comma in the string str. If that // string is quoted, the quotes are removed. If there is no valid // string to be found, returns TRUE. Otherwise, returns FALSE static int find_comma_separated_string(char *str, unsigned int n) { if (NULL == str) return TRUE; int start = 0, end; unsigned int count = 0; while (count < n) { if ((start = find_next_comma(str,start)) == -1) return TRUE; ++count; // Advance the pointer past the current comma ++start; } // It's okay if there is no next comma, it just means that this is // the last comma separated value in the string if ((end = find_next_comma(str,start)) == -1) end = strlen(str); // Strip off the quotation marks, if necessary. We don't have to worry // about uneven quotation marks (i.e quotes at the start but not the end // as they are handled by the the find_next_comma function. if (str[start] == '"') ++start; if (str[end - 1] == '"') end--; str[end] = 0; shift_string(str,0,start); return FALSE; } /** * looks for a valid hash in the provided buffer. * returns TRUE if one is present. * @param buf - input is the hash and the filename; the hash is left here. * @param known_fn - the filename is copied there */ int state::find_plain_hash(char *buf, char *known_fn) { size_t p = HASH_STRING_LENGTH; if ((strlen(buf) < HASH_STRING_LENGTH) || (buf[HASH_STRING_LENGTH] != ' ')) return FALSE; if (known_fn != NULL) { strncpy(known_fn,buf,PATH_MAX); // Starting at the end of the hash, find the start of the filename while(p < strlen(known_fn) && isspace(known_fn[p])){ ++p; } shift_string(known_fn,0,p); chop_line(known_fn); } buf[HASH_STRING_LENGTH] = 0; /* We have to include a validity check here so that we don't mistake SHA-1 hashes for MD5 hashes, among other things */ return algorithm_t::valid_hash(opt_md5deep_mode_algorithm,buf); } /** * detect the md5deep_size_hash file type, which has a size, a hash, and a filename. */ int state::find_md5deep_size_hash(char *buf, char *known_fn) { size_t pos; if (NULL == buf) return FALSE; // Extra 12 chars for size and space if (strlen(buf) < HASH_STRING_LENGTH + 12) return FALSE; // Check for size. Spaces are legal here (e.g. " 20") for (pos = 0 ; pos < 10 ; ++pos) if (!(isdigit(buf[pos]) || 0x20 == buf[pos])) return FALSE; if (buf[10] != 0x20 && buf[11] != 0x20) return FALSE; shift_string(buf,0,12);; return find_plain_hash(buf,known_fn); } /** * Look for a hash in a bsd-style buffer. * @param buf - input buffer; set to hash on output. * @param fn - gets filename * * bsd hash lines look like this: * MD5 (copying.txt) = 555b3e940c86b35d6e0c9976a05b3aa5 */ int state::find_bsd_hash(char *buf, char *fn) { size_t buf_len = strlen(buf); unsigned int hash_len = HASH_STRING_LENGTH; assert(buf!=0); if (buf_len < hash_len) return FALSE; char *open = strchr(buf,'('); char *close = strchr(buf,')'); char *equal = strchr(buf,'='); if(open==0 || close==0 || equal==0) return FALSE; // not properly formatted *close = '\000'; // termiante the string strncpy(fn,open+1,PATH_MAX); /* Scan past the equal sign for the beginning of the hash */ equal++; while(*equal!='\000' && !isxdigit(*equal)) equal++; /* Copy over buffer; */ char *dest = buf; while(isxdigit(*equal)){ *dest = *equal; dest++; equal++; } *dest = 0; // terminate return algorithm_t::valid_hex(buf); } /* This is a generic function to find the filename and hash from a rigid (i.e. comma separated value) file format. Values may be quoted, but the quotes are removed before values are returned. The location variables refer to how many commas preceed the entry. For example, to get the hash out of: filename,junk,stuff,hash,stuff you should call find_rigid_hash(buf,fn,1,4); Note that columns start with #1, not zero. */ int state::find_rigid_hash(char *buf, char *fn, unsigned int fn_location, unsigned int hash_location) { char *temp = strdup(buf); if (temp == NULL) return FALSE; if (find_comma_separated_string(temp,fn_location-1)) { free(temp); return FALSE; } strncpy(fn, temp, strlen(fn)); free(temp); if (find_comma_separated_string(buf,hash_location-1)){ return FALSE; } return algorithm_t::valid_hash(opt_md5deep_mode_algorithm,buf); } #ifdef WORDS_BIGENDIAN uint32_t byte_reverse(uint32_t n) { uint32_t res = 0, count, bytes[5]; for (count = 0 ; count < 4 ; count++) { bytes[count] = (n & (0xff << (count * 8))) >> (count * 8); res |= bytes[count] << (24 - (count * 8)); } return res; } #endif /* iLook files have the MD5 hash as the first 32 characters. As a result, we can just treat these files like plain hash files */ int state::find_ilook_hash(char *buf, char *known_fn) { return (find_plain_hash(buf,known_fn)); } int state::check_for_encase(FILE *f,uint32_t *expected_hashes) { ENCASE_HASH_HEADER *h = (ENCASE_HASH_HEADER *)malloc(sizeof(ENCASE_HASH_HEADER)); if (NULL == h) ocb.fatal_error("Out of memory"); if (sizeof(ENCASE_HASH_HEADER) != fread(h,1,sizeof(ENCASE_HASH_HEADER),f)) { free(h); return FALSE; } if (memcmp(h->Signature,ENCASE_HEADER,8)) { rewind(f); free(h); return FALSE; } #ifdef WORDS_BIGENDIAN h->NumHashes = byte_reverse(h->NumHashes); #endif *expected_hashes = h->NumHashes; return TRUE; } int state::identify_hash_file_type(FILE *f,uint32_t *expected_hashes) { char known_fn[PATH_MAX+1]; char buf[MAX_STRING_LENGTH + 1]; rewind(f); /* The "rigid" file types all have their headers in the * first line of the file. We check them first */ if (opt_md5deep_mode_algorithm == alg_md5 && check_for_encase(f,expected_hashes)) return TYPE_ENCASE; if ((fgets(buf,MAX_STRING_LENGTH,f)) == NULL) { return TYPE_UNKNOWN; } if (strlen(buf) > HASH_STRING_LENGTH) { chop_line(buf); /* Check for the algorithms that only have MD5 */ if (opt_md5deep_mode_algorithm == alg_md5){ if(STRINGS_EQUAL(buf,HASHKEEPER_HEADER)) return TYPE_HASHKEEPER; if (STRINGS_EQUAL(buf,ILOOK_HEADER)) return TYPE_ILOOK; } /* Check for those that have md5 or sha1 */ if (opt_md5deep_mode_algorithm == alg_md5 || opt_md5deep_mode_algorithm == alg_sha1) { if (STRINGS_EQUAL(buf,NSRL_15_HEADER)) return TYPE_NSRL_15; if (STRINGS_EQUAL(buf,NSRL_20_HEADER)) return TYPE_NSRL_20; } /* Check for those that have md5 or sha1 or sha256 */ if (opt_md5deep_mode_algorithm == alg_md5 || opt_md5deep_mode_algorithm == alg_sha1 || opt_md5deep_mode_algorithm == alg_sha256) { if (STRINGS_EQUAL(buf,ILOOK3_HEADER)) return TYPE_ILOOK3; if (STRINGS_EQUAL(buf,ILOOK4_HEADER)) return TYPE_ILOOK3; } } /* Plain files can have comments, so the first line(s) may not * contain a valid hash. But if we should process this file * if we can find even *one* valid hash */ do { if (find_bsd_hash(buf,known_fn)) return TYPE_BSD; if (find_md5deep_size_hash(buf,known_fn)) return TYPE_MD5DEEP_SIZE; if (find_plain_hash(buf,known_fn)) return TYPE_PLAIN; } while ((fgets(buf,MAX_STRING_LENGTH,f)) != NULL); return TYPE_UNKNOWN; } /** * Given an input string buf and the type of file it came from, finds * the hash specified in the line if there is one and returns TRUE. * If there is no valid hash in the line, returns FALSE. All * functions called from here are required to check that the hash is * valid before returning! */ int state::find_hash_in_line(char *buf, int fileType, char *fn) { switch(fileType) { case TYPE_PLAIN: return find_plain_hash(buf,fn); case TYPE_BSD: return find_bsd_hash(buf,fn); case TYPE_HASHKEEPER: return find_rigid_hash(buf,fn,3,h_hashkeeper); case TYPE_NSRL_15: if(opt_md5deep_mode_algorithm == alg_md5) return find_rigid_hash(buf,fn,2,7); if(opt_md5deep_mode_algorithm == alg_sha1) return find_rigid_hash(buf,fn,2,1); return FALSE; // NSRL_15 only hash md5 and sha1 case TYPE_NSRL_20: if(opt_md5deep_mode_algorithm == alg_md5) return find_rigid_hash(buf,fn,4,2); if(opt_md5deep_mode_algorithm == alg_sha1) return find_rigid_hash(buf,fn,4,1); return FALSE; case TYPE_ILOOK: return find_ilook_hash(buf,fn); case TYPE_ILOOK3: if(opt_md5deep_mode_algorithm == alg_md5) return find_rigid_hash(buf,fn,3,1); if(opt_md5deep_mode_algorithm == alg_sha1) return find_rigid_hash(buf,fn,3,2); if(opt_md5deep_mode_algorithm == alg_sha256) return find_rigid_hash(buf,fn,3,6); return FALSE; // ilook3 only has md5, sha1 and sha256 case TYPE_ILOOK4: if(opt_md5deep_mode_algorithm == alg_md5) return find_rigid_hash(buf,fn,3,1); if(opt_md5deep_mode_algorithm == alg_sha1) return find_rigid_hash(buf,fn,3,2); if(opt_md5deep_mode_algorithm == alg_sha256) return find_rigid_hash(buf,fn,3,6); return FALSE; // ilook4 only has md5, sha1 and sha256 case TYPE_MD5DEEP_SIZE: return find_md5deep_size_hash(buf,fn); } return FALSE; } /** * explicitly add a hash that will be matched or not matched. * @param h - The hash (in hex) * @param fn - The file name (although -a and -A actually provide the hash again) */ void state::md5deep_add_hash(char *h, char *fn) { class file_data_t *fdt = new file_data_t(); fdt->hash_hex[opt_md5deep_mode_algorithm] = h; fdt->file_name = fn; ocb.add_fdt(fdt); } /* from md5deep_match.cpp */ int input_not_matched = FALSE; int file_type_without_header(int file_type) { return (file_type == TYPE_PLAIN || file_type == TYPE_MD5DEEP_SIZE || file_type == TYPE_BSD); } #define ENCASE_START_HASHES 0x480 #define hash_length md5deep_mode_hash_length int state::parse_encase_file(const char *fn, FILE *handle,uint32_t expected_hashes) { unsigned char buffer[64]; char result[1024]; // must be at least s->hash_length*2 uint32_t count = 0; // Each hash entry is 18 bytes. 16 bytes for the hash and // two \0 characters at the end. We reserve 19 characters // as fread will append an extra \0 to the string if (fseeko(handle,ENCASE_START_HASHES,SEEK_SET)) { ocb.error("%s: Unable to seek to start of hashes", fn); return status_t::STATUS_USER_ERROR; } while (!feof(handle)){ // if (18 != fread(buffer,sizeof(unsigned char),18,handle)) { if (feof(handle)) continue; // Users expect the line numbers to start at one, not zero. if ((!ocb.opt_silent) || (mode_warn_only)) { ocb.error("%s: No hash found in line %"PRIu32, fn, count + 1); ocb.error("%s: %s", fn, strerror(errno)); return status_t::STATUS_USER_ERROR; } } ++count; snprintf(result,sizeof(result), "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7], buffer[8], buffer[9], buffer[10], buffer[11], buffer[12], buffer[13], buffer[14], buffer[15]); class file_data_t *fdt = new file_data_t(); fdt->hash_hex[opt_md5deep_mode_algorithm] = result; fdt->file_name = fn; ocb.add_fdt(fdt); } if (expected_hashes != count){ ocb.error("%s: Expecting %"PRIu32" hashes, found %"PRIu32"\n", fn, expected_hashes, count); } return status_t::status_ok; } /** * Load an md5deep-style match file. * Previously this returned FALSE if failure and TRUE if success. * The return value was always ignored, so now we don't return anything. */ void state::md5deep_load_match_file(const char *fn) { uint64_t line_number = 0; uint32_t expected_hashes=0; FILE *f= fopen(fn,"rb"); if (f == NULL) { ocb.error("%s: %s", fn,strerror(errno)); return; } int ftype = identify_hash_file_type(f,&expected_hashes); if (ftype == TYPE_UNKNOWN) { ocb.error("%s: Unable to find any hashes in file, skipped.", fn); fclose(f); f = 0; return; } if (TYPE_ENCASE == ftype) { // We can't use the normal file reading code which is based on // a one-line-at-a-time approach. Encase files are binary records parse_encase_file(fn,f,expected_hashes); fclose(f); f = 0; return; } // We skip the first line in every file type except plain files. // All other file types have a header line that we need to ignore. if (file_type_without_header(ftype)){ rewind(f); } else { ++line_number; } char buf[MAX_STRING_LENGTH + 1]; while (fgets(buf,MAX_STRING_LENGTH,f)) { char *cc; char known_fn[PATH_MAX+1]; // set to be the filename from the buffer if((cc=strchr(buf,'\n'))!=0) *cc = 0; // remove \n at end of line if((cc=strchr(buf,'\r'))!=0) *cc = 0; // remove \r at end of line ++line_number; memset(known_fn,0,PATH_MAX); /* This looks odd. The function find_hash_in_line modifies 'buf' so that it * begins with the hash, and copies the filename to known_fn. */ if (!find_hash_in_line(buf,ftype,known_fn)) { if ((!ocb.opt_silent) || (mode_warn_only)) { std::cerr << progname << ": " << fn << ": No hash found in line " << line_number << std::endl; } } else { // Invalid hashes are caught above file_data_t *fdt = new file_data_t(); fdt->hash_hex[opt_md5deep_mode_algorithm] = buf; // the hex hash fdt->file_name = known_fn; // the filename ocb.add_fdt(fdt); } } fclose(f); f = 0; } md5deep-4.2/src/hash.cpp000066400000000000000000000352661176640446200151460ustar00rootroot00000000000000/* * By Jesse Kornblum and Simson Garfinkel * * This is a work of the US Government. In accordance with 17 USC 105, * copyright protection is not available for any work of the US Government. * * 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. * * $Id: hash.cpp 627 2012-02-28 04:31:29Z xchatty $ * * 2011 JUN 1 - SLG - Removed #ifdef MD5DEEP, since we now have a single binary for both MD5DEEP and HASHDEEP */ #include "main.h" /**************************************************************** *** Service routines ****************************************************************/ /* * Returns TRUE if errno is currently set to a fatal error. That is, * an error that can't possibly be fixed while trying to read this file */ static int file_fatal_error() { switch(errno) { case EINVAL: // Invalid argument (happens on Windows) case EACCES: // Permission denied case ENODEV: // Operation not supported (e.g. trying to read // a write only device such as a printer) case EBADF: // Bad file descriptor case EFBIG: // File too big case ETXTBSY: // Text file busy // The file is being written to by another process. // This happens with Windows system files case EIO: // Input/Output error // Added 22 Nov 2010 in response to user email return TRUE; } return FALSE; } static std::string make_stars(int count) { std::string ret; for(int i=0;ib) return a; return b; } /* * Compute the hash on fdht and store the results in the display ocb. * returns true if successful, flase if failure. * Doesn't need to seek because the caller handles it. */ /** * compute_hash is where the data gets read and hashed. */ bool file_data_hasher_t::compute_hash(uint64_t request_start,uint64_t request_len, hash_context_obj *hc1,hash_context_obj *hc2) { /* Shortcut; If no hash algorithms are specified, just advance the pointer and return */ if(algorithm_t::algorithms_in_use_count()==0){ eof = true; // read everything return true; // done hashing } /* * We may need to read multiple times; don't read more than * file_data_hasher_t::MD5DEEP_IDEAL_BLOCK_SIZE * at a time. */ hc1->read_offset = request_start; hc1->read_len = 0; // so far while (request_len>0){ // Clear the buffer in case we hit an error and need to pad the hash // The use of MD5DEEP_IDEAL_BLOCK_SIZE means that we loop even for memory-mapped // files. That's okay, becuase our super-fast SHA1 implementation // actually corrupts its input buffer, forcing a copy... unsigned char buffer_[file_data_hasher_t::MD5DEEP_IDEAL_BLOCK_SIZE]; const unsigned char *buffer = buffer_; uint64_t toread = min(request_len,file_data_hasher_t::MD5DEEP_IDEAL_BLOCK_SIZE); // and shrink if(this->base==0){ // not mmap, so clear buffer memset(buffer_,0,sizeof(buffer_)); } ssize_t current_read_bytes = 0; // read the data into buffer if(this->handle){ current_read_bytes = fread(buffer_, 1, toread, this->handle); } else { assert(this->fd!=0); if(this->base){ buffer = this->base + request_start; current_read_bytes = min(toread,this->bounds - request_start); // can't read more than this if(hc1->read_offset+current_read_bytes==this->bounds){ this->eof = true; // we hit the end } } else { current_read_bytes = read(this->fd,buffer_,toread); } } // If an error occured, display a message and see if we need to quit. if ((current_read_bytes<0) || (this->handle && ferror(this->handle))){ ocb->error_filename(this->file_name,"error at offset %"PRIu64": %s", request_start, strerror(errno)); if (file_fatal_error()){ this->ocb->set_return_code(status_t::status_EXIT_FAILURE); return false; // error } if(this->handle) clearerr(this->handle); // The file pointer's position is now undefined. We have to manually // advance it to the start of the next buffer to read. if(this->is_stdin()==false){ if(this->handle) fseeko(this->handle,request_start,SEEK_SET); if(this->fd) lseek(this->fd,request_start,SEEK_SET); } } /* Update the pointers and the hash */ if(current_read_bytes>0){ this->file_bytes += current_read_bytes; hc1->read_len += current_read_bytes; hc1->multihash_update(buffer,current_read_bytes); // hash in the non-error if(hc2) hc2->multihash_update(buffer,current_read_bytes); // hash in the non-error } // If we are printing estimates, update the time if (ocb->opt_estimate) { time_t current_time = time(0); // We only update the display only if a full second has elapsed if (this->last_time != current_time) { this->last_time = current_time; ocb->display_realtime_stats(this,hc1,current_time - this->start_time); } } // If we are at the end of the file, break if((current_read_bytes==0) || (this->handle && feof(this->handle))){ this->eof = true; break; } // Get set up for the next read request_start += toread; request_len -= toread; } if (ocb->opt_estimate) ocb->clear_realtime_stats(); if (this->file_bytes == this->stat_bytes) this->eof = true; // end of the file return true; // done hashing! } /** * * THIS IS IT!!!! * * hash() * * This function is called to hash each file. * Calls: * - compute_hash() to hash the file or the file segment * - display_hash() to display each hash after it is computed. * * Called by: hash_stdin and hash_file. * * Triage Mode: First computes the hash on the first 512-bytes * Piecewise Mode: Calls pieceiwse hasher iteratively * In the case of piecewise hashing, * This routine is made multi-threaded to make the system run faster. */ #ifndef O_BINARY #define O_BINARY 0 #endif mutex_t file_data_hasher_t::fdh_lock; void file_data_hasher_t::hash() { file_data_hasher_t *fdht = this; /* * If the handle is set, we are probably hashing stdin. * If not, figure out file size and full file name for the handle */ if(fdht->handle==0){ /* Open the file and print an error if we can't */ // stat the file to get the bytes and ctime //state::file_type(fdht->file_name_to_hash,ocb,&fdht->stat_bytes, //&fdht->ctime,&fdht->mtime,&fdht->atime); file_metadata_t m; file_metadata_t::stat(fdht->file_name_to_hash,&m,*ocb); fdht->stat_bytes = m.size; fdht->ctime = m.ctime; fdht->mtime = m.mtime; fdht->atime = m.atime; if(ocb->opt_verbose>=MORE_VERBOSE){ errno = 0; // no error } fdht->file_name = global::make_utf8(fdht->file_name_to_hash); fdht->file_bytes = 0; // actual number of bytes we have read if (ocb->mode_barename) { /* Convert fdht->file_name to its basename */ /* The basename function kept misbehaving on OS X, so Jesse rewrote it. * This approach isn't perfect, nor is it designed to be. Because * we're guarenteed to be working with a file here, there's no way * that str will end with a DIR_SEPARATOR (e.g. /foo/bar/). This function * will not work properly for a string that ends in a DIR_SEPARATOR */ size_t delim = fdht->file_name.rfind(DIR_SEPARATOR); if(delim!=std::string::npos){ fdht->file_name = fdht->file_name.substr(delim+1); } } switch(ocb->opt_iomode){ case iomode::buffered: assert(fdht->handle==0); /* Corrects bug 3476412 on MacOS 10.6 * in which the 'too many files' error was generated when two threads * tried to run fopen() simultaneously. This bug was apparently fixed * in MacOS 10.7. There is only minimal overhead with the lock, however, * and there is a chance that other platforms may have a similar bug, * so we always do it, just to be safe. * Simson L. Garfinkel, Jan 21, 2012 */ fdh_lock.lock(); fdht->handle = _tfopen(file_name_to_hash.c_str(),_TEXT("rb")); fdh_lock.unlock(); if(fdht->handle==0){ ocb->error_filename(fdht->file_name_to_hash,"%s", strerror(errno)); return; } break; case iomode::unbuffered: assert(fdht->fd==-1); fdht->fd = _topen(file_name_to_hash.c_str(),O_BINARY|O_RDONLY,0); if(fdht->fd<0){ ocb->error_filename(fdht->file_name_to_hash,"%s", strerror(errno)); return; } break; case iomode::mmapped: fdht->fd = _topen(file_name_to_hash.c_str(),O_BINARY|O_RDONLY,0); if(fdht->fd<0){ ocb->error_filename(fdht->file_name_to_hash,"%s", strerror(errno)); return; } #ifdef HAVE_MMAP fdht->base = (uint8_t *)mmap(0,fdht->stat_bytes,PROT_READ,MAP_FILE|MAP_SHARED,fd,0); if(fdht->base>0){ /* mmap is successful, so set the bounds. * if it is not successful, we default to reading the fd */ fdht->bounds = fdht->stat_bytes; } #endif break; default: ocb->fatal_error("hash.cpp: iomode setting invalid (%d)",ocb->opt_iomode); } /* * If this file is above the size threshold set by the user, skip it * and set the hash to be stars */ if ((ocb->mode_size) && (fdht->stat_bytes > ocb->size_threshold)) { if (ocb->mode_size_all) { for (int i = 0 ; i < NUM_ALGORITHMS ; ++i) { if (hashes[i].inuse){ fdht->hash_hex[i] = make_stars(hashes[i].bit_length/4); } } if(md5deep_mode){ fdht->ocb->md5deep_display_hash(fdht,0); // no hash } else { fdht->ocb->display_hash(fdht,0); } } return ; // close will happend when the fdht is killed } } if (ocb->opt_estimate) { time(&(fdht->start_time)); fdht->last_time = fdht->start_time; } if (fdht->ocb->mode_triage && fdht->is_stdin()==false) { /* * Triage mode output consists of file size, hash of the first 512 bytes, then hash of the whole file. * * We use the piecewise mode to get a partial hash of the first * 512 bytes of the file. But we'll have to remove piecewise mode * before returning to the main hashing code. * * Triage mode is only available for md5deep series programs. * * Disabled for stdin becuase we can't seek back and search again. */ hash_context_obj hc_triage; hc_triage.multihash_initialize(); bool success = fdht->compute_hash(0,512,&hc_triage,0); hc_triage.multihash_finalize(this->hash_hex); // finalize and save the results if(success){ std::stringstream ss; ss << fdht->stat_bytes << "\t" << fdht->hash_hex[opt_md5deep_mode_algorithm]; fdht->triage_info = ss.str(); } /* * Rather than muck about with updating the state of the input * file, just reset everything and process it normally. */ fdht->file_bytes = 0; if(fdht->handle) fseeko(fdht->handle, 0, SEEK_SET); if(fdht->fd){ lseek(this->fd,0,SEEK_SET); } fdht->eof = false; // } /* * Read the file, handling piecewise hashing as necessary */ uint64_t request_start = 0; hash_context_obj *hc_file= 0; // if we are doing picewise hashing, this stores the file context if(fdht->ocb->piecewise_size>0){ hc_file = new hash_context_obj(); hc_file->multihash_initialize(); } while (fdht->eof==false) { uint64_t request_len = fdht->stat_bytes; // by default, hash the file if ( fdht->ocb->piecewise_size>0 ) { request_len = fdht->ocb->piecewise_size; } /** * call compute_hash(), which computes the hash of the full file, or next next piecewise hashe. * It returns FALSE if there is a failure. */ hash_context_obj hc_piece; hc_piece.multihash_initialize(); bool r = fdht->compute_hash(request_start,request_len,&hc_piece,hc_file); hc_piece.multihash_finalize(this->hash_hex); // finalize and save the results if (r==false) { break; } request_start += request_len; /* * We should only display a hash if we've processed some * data during this read OR if the whole file is zero bytes long. * If the file is zero bytes, we won't have read anything, but * still need to display a hash. */ if (hc_piece.read_len > 0 || fdht->stat_bytes==0 || fdht->is_stdin()) { if(md5deep_mode){ /** * Under not matched mode, we only display those known hashes that * didn't match any input files. Thus, we don't display anything now. * The lookup is to mark those known hashes that we do encounter. * searching for the hash will cause matched_file_number to be set */ if (ocb->mode_not_matched){ ocb->find_hash(opt_md5deep_mode_algorithm, fdht->hash_hex[opt_md5deep_mode_algorithm], fdht->file_name, fdht->file_number); } else { ocb->md5deep_display_hash(this,&hc_piece); } } else { ocb->display_hash(fdht,&hc_piece); } } } /** * If we had an additional hash context for the file, * then we must be in DFXML mode and doing piecewise hashing. * We want both the hash of the file and of the context. */ if(hc_file){ std::string file_hashes[NUM_ALGORITHMS]; hc_file->multihash_finalize(file_hashes); this->dfxml_write_hashes(file_hashes,0); } ocb->dfxml_write(this); if(hc_file) delete hc_file; } #ifdef HAVE_PTHREAD /* Here is where we tie-in to the threadpool system. */ void worker::do_work(file_data_hasher_t *fdht) { fdht->set_workerid(workerid); fdht->hash(); delete fdht; } #endif /** * Primary entry point for a file being hashed. * Given a file name: * 1 - create a minimal fdht and pass it off to either schedule_work() or hash(). * * hash() will * 1 - open the file (or print an error message if it can't). * 2 - hash the fdht * 3 - record it in stdout using display. */ void display::hash_file(const tstring &fn) { file_data_hasher_t *fdht = new file_data_hasher_t(this); fdht->file_name_to_hash = fn; /** * If we are using a thread pool, hash in another thread * with do_work */ #ifdef HAVE_PTHREAD if(tp){ tp->schedule_work(fdht); return; } #endif /* no threading; just work normally */ fdht->hash(); delete fdht; } /* Hashing stdin can only be done with buffered I/O. * Note that it is only hashed in the main thread. * No reason to hash stdin in other threads, since we * are only hashing one file. */ void display::hash_stdin() { file_data_hasher_t *fdht = new file_data_hasher_t(this); fdht->file_name_to_hash = _T("stdin"); fdht->file_name = "stdin"; fdht->handle = stdin; #ifdef _WIN32 /* see http://support.microsoft.com/kb/58427 */ if (setmode(fileno(stdin),O_BINARY) == -1 ){ fatal_error("Cannot set stdin to binary mode"); } #endif #ifdef SIZE_T_MAX fdht->stat_bytes = SIZE_T_MAX; #else fdht->stat_bytes = 0x7fffffffffffffffLL; #endif fdht->hash(); delete fdht; } md5deep-4.2/src/hashlist.cpp000066400000000000000000000273471176640446200160430ustar00rootroot00000000000000// $Id: hashlist.cpp 631 2012-06-05 10:26:56Z jessekornblum $ /** hashlist.cpp * Implements a list of hashes for local database, searching, etc. * Currently done with a map; could be done with an unordered set. * Contains the logic for performing the audit. * Formerly this code was in audit.cpp and match.cpp. */ #include "main.h" #include #include /* Add a fi to the hash list. * Be sure that the hash is all lower case, because that's what we use internally. */ void hashlist::hashmap::add_file(file_data_t *fi,int alg_num) { if(fi->hash_hex[alg_num].size()){ std::string hexhash = fi->hash_hex[alg_num]; for(std::string::iterator it = hexhash.begin();it!=hexhash.end();it++){ if(isupper(*it)) *it = tolower(*it); } insert(std::pair(hexhash,fi)); } } /** * Adds a file_data_t pointer to the hashlist. * Does not copy the object. * Object will be modified if there is a match. */ void hashlist::add_fdt(file_data_t *fi) { push_back(fi); // retain our copy for(int i=0;i2) std::cerr << "find_hash alg=" << alg << " hash_hex=" << hash_hex << " fn=" << file_name << " file_number=" << file_number; std::pair match = this->hashmaps[alg].equal_range(hash_hex); if(match.first==match.second) { if(opt_debug>2) std::cerr << " RETURNS 0\n"; return 0; // nothing found } for (hashmap::iterator it = match.first; it!=match.second; ++it) { if((*it).second->file_name == file_name) { if (file_number) (*it).second->matched_file_number = file_number; if (opt_debug) std::cerr << " RETURNS EXACT MATCH " << file_number << "\n"; return (*it).second; } } /* No exact matches; return the first match */ if (file_number) (*match.first).second->matched_file_number = file_number; if (opt_debug) std::cerr << " RETURNS FIRST MATCH " << file_number << "\n"; return (*match.first).second; } /** * Search for the provided fdt in the hashlist and return the status of the match. * Match on name if possible; otherwise match on just the hash codes. */ hashlist::searchstatus_t hashlist::search(const file_data_hasher_t *fdht,file_data_t ** matched_) { /* Iterate through each of the hashes in the haslist until we find a match. */ for (int alg = 0 ; alg < NUM_ALGORITHMS ; ++alg) { /* Only search hash functions that are in use and hashes that are in the fdt */ if (hashes[alg].inuse==0 || fdht->hash_hex[alg].size()==0){ continue; } /* Find the best match using find_hash */ file_data_t *matched = find_hash((hashid_t)alg, fdht->hash_hex[alg],fdht->file_name,fdht->file_number); if (!matched) { continue; // no match } if(matched_) *matched_ = matched; // note the match /* Verify that all of the other hash functions for *it match fdt as well, * but only for the cases when we have a hash for both the master file * and the target file. */ for(int j=0;jhash_hex[j].size() && matched->hash_hex[j].size()){ if(fdht->hash_hex[j] != matched->hash_hex[j]){ /* Amazing. We found a match on one hash a a non-match on another. * Call the newspapers! This is a newsorthy event. */ return status_partial_match; } } } /* If we got here we matched on all of the hashes. * Which is to be expected. * Check to see if the sizes are the same. */ if(fdht->file_bytes != matched->file_bytes){ /* Amazing. We found two files that have the same hash but different * file sizes. This has never happened before in the history of the world. * Call the newspapers! */ return status_file_size_mismatch; } /* See if the hashes are the same but the name changed. */ if(fdht->file_name != matched->file_name){ return status_file_name_mismatch; } /* If we get here, then all of the hash matches for all of the algorithms have been * checked and found to be equal if present. */ return status_match; } /* If we get here, nothing ever matched. Kind of sad. */ return status_no_match; } /** * Returns the file type of a given input file. * fn is provided so that error messages can be printed. */ hashlist::hashfile_format hashlist::identify_format(class display *ocb,const std::string &fn,FILE *handle) { char buf[MAX_STRING_LENGTH]; // Find the header if ((fgets(buf,MAX_STRING_LENGTH,handle)) == NULL) { return file_unknown; } chop_line(buf); if ( ! STRINGS_EQUAL(buf,HASHDEEP_HEADER_10)) { return file_unknown; } // Find which hashes are in this file if ((fgets(buf,MAX_STRING_LENGTH,handle)) == NULL) { return file_unknown; } chop_line(buf); // We don't use STRINGS_EQUAL here because we only care about // the first ten characters for right now. if (strncasecmp("%%%% size,",buf,10)) { return file_unknown; } /** * Remember previously loaded hashes. */ std::string previously_enabled_algorithms = last_enabled_algorithms; // Skip the "%%%% size," when parsing the list of hashes enable_hashing_algorithms_from_hashdeep_file(ocb,fn,buf + 10); // If the set of hashes now in use doesn't match those previously in use, // give a warning. if (previously_enabled_algorithms.size()>0 && previously_enabled_algorithms != last_enabled_algorithms){ if(ocb) ocb->error("%s: Hashes not in same format as previously loaded", fn.c_str()); } return file_hashdeep_10; } /* * Examine the list of hashing algorithms in the file, * enable them and note their order. If the last algorithm is 'filename', ignore it. */ void hashlist::enable_hashing_algorithms_from_hashdeep_file(class display *ocb,const std::string &fn,std::string val) { // The first position is always the file size, so we start with an // the first position of one. uint8_t num_columns = 1; last_enabled_algorithms = val; std::vector algs = split(val,','); for(std::vector::iterator it = algs.begin(); it!=algs.end(); it++){ std::string name = *it; lowercase(name); if(name=="filename") { // Special value to denote the filename filename_column = num_columns; continue; } hashid_t id = algorithm_t::get_hashid_for_name(name); if(id==alg_unknown){ if(ocb){ ocb->error("%s: Badly formatted file", fn.c_str()); ocb->try_msg(); } exit(EXIT_FAILURE); } /* Found a known algorithm */ hashes[id].inuse = TRUE; hash_column[num_columns] = id; num_columns++; } } void hashlist::dump_hashlist() { std::cout << "md5,sha1,bytes,filename matched\n"; for(hashlist::const_iterator it = begin(); it!=end(); it++){ std::cout << (*it)->hash_hex[alg_md5] << "," << (*it)->hash_hex[alg_sha1] << "," << (*it)->file_bytes << "," << (*it)->file_name << "\tmatched=" << (*it)->matched_file_number << "\n"; } } uint64_t hashlist::total_matched() { uint64_t total = 0; for(hashlist::const_iterator it = begin(); it!=end(); it++){ if( (*it)->matched_file_number > 0) total++; } return total; } // // Loads a file of known hashes. // First identifies the file type, then reads the file. // hashlist::loadstatus_t hashlist::load_hash_file(display *ocb,const std::string &fn) { loadstatus_t status = loadstatus_ok; hashfile_format type; FILE *hl_handle = fopen(fn.c_str(),"rb"); if (NULL == hl_handle) { if (ocb) ocb->error("%s: %s", fn.c_str(), strerror(errno)); return status_file_error; } type = identify_format(ocb,fn,hl_handle); if (file_unknown == type) { if (ocb) ocb->error("%s: Unable to identify file format", fn.c_str()); fclose(hl_handle); hl_handle = 0; return status_unknown_filetype; } bool contains_bad_lines = false; bool record_valid; // We start our counter at line number two for the two lines // of header we've already read uint64_t line_number = 2; // TODO: Read the line directly into a std::string char line[MAX_STRING_LENGTH]; while (fgets(line,MAX_STRING_LENGTH,hl_handle)) { line_number++; // Lines starting with a pound sign are comments and can be ignored if ('#' == line[0]) continue; // C++ typically fails with a bad_alloc, but you can make it return null // http://www.cplusplus.com/reference/std/new/bad_alloc/ // http://www.cplusplus.com/reference/std/new/nothrow/ file_data_t *t = new (std::nothrow) file_data_t(); if (NULL == t) { ocb->fatal_error("%s: Out of memory in line %"PRIu64, fn.c_str(), line_number); } chop_line(line); record_valid = true; // Convert the input line to a string for easier manipulations std::string line_as_string(line); std::vector fields = split(line_as_string,','); size_t column_number; for (column_number=0 ; column_numberfile_bytes = (uint64_t)strtoll(word.c_str(),NULL,10); continue; } if (column_number == filename_column) { // If the filename contained commas, it was split // incorrectly by the 'split' statememt above. The filename // will be split across more than one column. // As such we need to 'find' everything // in the string starting with the current location. // The result should be closer to the end of the string than // the start, so we can use rfind. (This also avoids a problem // when the filename is the same as one of the hashes, which // happens now and again.) size_t start = line_as_string.rfind(word); t->file_name = line_as_string.substr(start,std::string::npos); // This should be the last column, so we break out now. break; } // All other columns should contain a valid hash in hex if ( !algorithm_t::valid_hash(hash_column[column_number],word)) { if (ocb) ocb->error("%s: Invalid %s hash in line %"PRIu64, fn.c_str(), hashes[hash_column[column_number]].name.c_str(), line_number); contains_bad_lines = true; record_valid = false; // Break out (done = true) and then process the next line break; } // Convert the hash to a std::string and save it lowercase(word); t->hash_hex[hash_column[column_number]] = word; } if (record_valid) add_fdt(t); } fclose(hl_handle); hl_handle = 0; if (contains_bad_lines) return status_contains_bad_hashes; return status; } /** * We don't use this function anymore, but it's handy to have just in case */ const char *hashlist::searchstatus_to_str(searchstatus_t val) { switch (val) { case searchstatus_ok: return "ok"; case status_match: return "complete match"; case status_partial_match: return "partial match"; case status_file_size_mismatch: return "file size mismatch"; case status_file_name_mismatch: return "file name mismatch"; case status_no_match: return "no match"; default: return "unknown"; } } md5deep-4.2/src/helpers.cpp000066400000000000000000000131271176640446200156550ustar00rootroot00000000000000 // MD5DEEP - helpers.c // // By Jesse Kornblum // // This is a work of the US Government. In accordance with 17 USC 105, // copyright protection is not available for any work of the US Government. // // 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. // // $Id: helpers.cpp 601 2012-01-24 17:45:03Z xchatty $ #include "main.h" // Remove the newlines, if any. Works on both DOS and *nix newlines void chop_line(char *s) { while(true){ size_t pos = strlen(s); if(pos>0){ if(s[pos-1]=='\r' || s[pos-1]=='\n'){ s[pos-1]='\000'; continue; } return; } if(pos==0) break; } } // Return the size, in bytes of an open file stream. On error, return 0 #ifndef _WIN32 #if defined (__LINUX__) off_t find_file_size(FILE *f,class display *ocb) { off_t num_sectors = 0, sector_size = 0; int fd = fileno(f); struct stat sb; if (fstat(fd,&sb)) return 0; if (S_ISREG(sb.st_mode) || S_ISDIR(sb.st_mode)) return sb.st_size; #ifdef HAVE_SYS_IOCTL_H #ifdef HAVE_SYS_MOUNT_H if (S_ISCHR(sb.st_mode) || S_ISBLK(sb.st_mode)) { #if defined(_IO) && defined(BLKGETSIZE) if (ioctl(fd, BLKGETSIZE, &num_sectors)) { if(ocb) ocb->print_debug("ioctl BLKGETSIZE failed: %s", strerror(errno)); return 0; } #else // If we can't run the ioctl call, we can't do anything here return 0; #endif // ifdefined _IO and BLKGETSIZE #if defined(_IO) && defined(BLKSSZGET) if (ioctl(fd, BLKSSZGET, §or_size)) { if(ocb) ocb->print_debug("ioctl BLKSSZGET failed: %s", strerror(errno)); return 0; } if (0 == sector_size) sector_size = 512; #else sector_size = 512; #endif // ifdef _IO and BLKSSZGET return (num_sectors * sector_size); } #endif // #ifdef HAVE_SYS_MOUNT_H #endif // #ifdef HAVE_SYS_IOCTL_H return 0; } #elif defined (__APPLE__) off_t find_file_size(FILE *f,class display *ocb) { struct stat info; off_t total = 0; off_t original = ftello(f); int fd = fileno(f); uint32_t blocksize = 0; uint64_t blockcount = 0; // I'd prefer not to use fstat as it will follow symbolic links. We don't // follow symbolic links. That being said, all symbolic links *should* // have been caught before we got here. if (fstat(fd, &info)) { if(ocb) ocb->status("%s: %s", progname.c_str(),strerror(errno)); return 0; } #ifdef HAVE_SYS_IOCTL_H // Block devices, like /dev/hda, don't return a normal filesize. // If we are working with a block device, we have to ask the operating // system to tell us the true size of the device. // // This isn't the recommended way to do check for block devices, // but using S_ISBLK(info.stmode) wasn't working. if (info.st_mode & S_IFBLK) { // Get the block size if (ioctl(fd, DKIOCGETBLOCKSIZE,&blocksize) < 0) { if(ocb) ocb->print_debug("ioctl DKIOCGETBLOCKSIZE failed: %s", strerror(errno)); return 0; } // Get the number of blocks if (ioctl(fd, DKIOCGETBLOCKCOUNT, &blockcount) < 0) { if(ocb) ocb->print_debug("ioctl DKIOCGETBLOCKCOUNT failed: %s", strerror(errno)); } total = blocksize * blockcount; } #endif // ifdef HAVE_IOCTL_H else { if ((fseeko(f,0,SEEK_END))) return 0; total = ftello(f); if ((fseeko(f,original,SEEK_SET))) return 0; } return (total - original); } #else // ifdef __APPLE__ // This is code for general UNIX systems // (e.g. NetBSD, FreeBSD, OpenBSD, etc) static off_t midpoint (off_t a, off_t b, long blksize) { off_t aprime = a / blksize; off_t bprime = b / blksize; off_t c, cprime; cprime = (bprime - aprime) / 2 + aprime; c = cprime * blksize; return c; } off_t find_dev_size(int fd, int blk_size) { off_t curr = 0, amount = 0; void *buf; if (blk_size == 0) return 0; buf = malloc(blk_size); for (;;) { ssize_t nread; lseek(fd, curr, SEEK_SET); nread = read(fd, buf, blk_size); if (nread < blk_size) { if (nread <= 0) { if (curr == amount) { free(buf); lseek(fd, 0, SEEK_SET); return amount; } curr = midpoint(amount, curr, blk_size); } else { // 0 < nread < blk_size free(buf); lseek(fd, 0, SEEK_SET); return amount + nread; } } else { amount = curr + blk_size; curr = amount * 2; } } free(buf); lseek(fd, 0, SEEK_SET); return amount; } off_t find_file_size(FILE *f,class display *ocb) { // The error checking for this is above. If f is not NULL // fd should be vald. int fd = fileno(f); struct stat sb; if (fstat(fd,&sb)) return 0; if (S_ISREG(sb.st_mode) || S_ISDIR(sb.st_mode)) return sb.st_size; else if (S_ISCHR(sb.st_mode) || S_ISBLK(sb.st_mode)) return find_dev_size(fd,sb.st_blksize); return 0; } #endif // ifdef __LINUX__ #endif // ifndef _WIN32 #if defined(_WIN32) off_t find_file_size(FILE *f,class display *ocb) { off_t total = 0, original = ftello(f); // Windows does not support running fstat on block devices, // so there's no point in mucking about with them. // // TODO: Find a way to estimate device sizes on Windows // Perhaps an IOTCL_DISK_GET_DRIVE_GEOMETRY_EX would work? // RBF - We don't really have the fseeko and ftello functions // on windows. They are functions like _ftelli64 or some such // RBF - Fix find_file_size for large files on Win32 if ((fseeko(f,0,SEEK_END))) return 0; total = ftello(f); if ((fseeko(f,original,SEEK_SET))) return 0; return total; } #endif // ifdef _WIN32 md5deep-4.2/src/main.cpp000066400000000000000000001230551176640446200151410ustar00rootroot00000000000000/* * * $Id: main.cpp 626 2012-02-28 02:50:32Z jessekornblum $ * * This is the main() function and support functions for hashdeep and md5deep. * * This is a work of the US Government. In accordance with 17 USC 105, * copyright protection is not available for any work of the US Government. * * 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. * * Original program by Jesse Kornblum. * Significantly modified by Simson Garfinkel. */ #include "main.h" #include #include #include #include #include "utf8.h" #include "md5.h" #include "sha1.h" #include "sha256.h" #include "tiger.h" #include "whirlpool.h" using namespace std; std::string progname; #define AUTHOR "Jesse Kornblum and Simson Garfinkel" #define COPYRIGHT "This program is a work of the US Government. "\ "In accordance with 17 USC 105,\n"\ "copyright protection is not available for any work of the US Government.\n"\ "This is free software; see the source for copying conditions. There is NO\n"\ "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" #ifdef _WIN32 // This can't go in main.h or we get multiple definitions of it // Allows us to open standard input in binary mode by default // See http://gnuwin32.sourceforge.net/compile.html for more int _CRT_fmode = _O_BINARY; #endif /* The only remaining global options */ bool md5deep_mode = false; int opt_debug = 0; // debug mode; 1 is self-test hashid_t opt_md5deep_mode_algorithm = alg_unknown; /**************************************************************** ** Various helper functions. ****************************************************************/ uint64_t file_data_hasher_t::next_file_number = 0; // needs to live somewhere /* This is the one place we allow a printf, becuase we are about to exit, and we call it before we multithread */ static void try_msg(void) { std::cerr << "Try `" << progname << " -h` for more information." << std::endl; } void state::sanity_check(int condition, const char *msg) { if (condition) { if (!ocb.opt_silent) { ocb.error("%s",msg); try_msg(); } exit (status_t::STATUS_USER_ERROR); } } static int is_absolute_path(const tstring &fn) { #ifdef _WIN32 return FALSE; #endif return (fn.size()>0 && fn[0] == DIR_SEPARATOR); } /** * return the full pathname for a filename. */ tstring state::generate_filename(const tstring &input) { if ((ocb.opt_relative) || is_absolute_path(input)){ return tstring(input); } // Windows systems don't have symbolic links, so we don't // have to worry about carefully preserving the paths // they follow. Just use the system command to resolve the paths // // Actually, they can have symbolic links... #ifdef _WIN32 wchar_t fn[PATH_MAX]; memset(fn,0,sizeof(fn)); _wfullpath(fn,input.c_str(),PATH_MAX); return tstring(fn); #else char buf[PATH_MAX+1]; std::string cwd = global::getcwd(); if (cwd=="") { // If we can't get the current working directory, we're not // going to be able to build the relative path to this file anyway. // So we just call realpath and make the best of things if (realpath(input.c_str(),buf)==0){ ocb.internal_error("Error calling realpath in generate_filename"); } return string(buf); } return cwd + DIR_SEPARATOR + input; #endif } // So that the usage message fits in a standard DOS window, this // function should produce no more than 22 lines of text. void state::usage() { if (1 == usage_count) { ocb.status("%s version %s by %s.",progname.c_str(),VERSION,AUTHOR); ocb.status("%s %s [OPTION]... [FILES]...",CMD_PROMPT,progname.c_str()); // Make a list of the hashes ocb.status("-c - Compute hashes only. Defaults are MD5 and SHA-256"); fprintf(stdout," legal values: "); for (int i = 0 ; i < NUM_ALGORITHMS ; i++) { fprintf(stdout,"%s%s",hashes[i].name.c_str(),(i+1 - piecewise mode. Files are broken into blocks for hashing"); ocb.status("-r - recursive mode. All subdirectories are traversed"); ocb.status("-d - output in DFXML (Digital Forensics XML)"); ocb.status("-k - add a file of known hashes"); ocb.status("-a - audit mode. Validates FILES against known hashes. Requires -k"); ocb.status("-m - matching mode. Requires -k"); ocb.status("-x - negative matching mode. Requires -k"); ocb.status("-w - in -m mode, displays which known file was matched"); ocb.status("-M and -X act like -m and -x, but display hashes of matching files"); ocb.status("-e - compute estimated time remaining for each file"); ocb.status("-s - silent mode. Suppress all error messages"); ocb.status("-b - prints only the bare name of files; all path information is omitted"); ocb.status("-l - print relative paths for filenames"); ocb.status("-i - only process files smaller than the given threshold"); ocb.status("-o - only process certain types of files. See README/manpage"); ocb.status("-v - verbose mode. Use again to be more verbose"); ocb.status("-d - output in DFXML; -W FILE - write to FILE."); #ifdef HAVE_PTHREAD ocb.status("-j - use num threads (default %d)",threadpool::numCPU()); #else ocb.status("-j - ignored (compiled without pthreads)"); #endif } // -hh makes us more verbose if (2 == usage_count) { ocb.status("-V - display version number and exit"); ocb.status("-0 - use a NUL (\\0) for newline."); ocb.status("-u - escape Unicode"); ocb.status("-B - verbose mode; repeat for more verbosity"); ocb.status("-C - OS X only --- use Common Crypto hash functions"); ocb.status("-Fb - I/O mode buffered; -Fu unbuffered; -Fm memory-mapped"); ocb.status("-o[bcpflsde] - Expert mode. only process certain types of files:"); ocb.status(" b=block dev; c=character dev; p=named pipe"); ocb.status(" f=regular file; l=symlink; s=socket; d=door e=Windows PE"); ocb.status("-D - set debug level"); } /// -hhh mode includes debugging information. if (3 == usage_count) { ocb.status("sizeof(off_t)= %d",sizeof(off_t)); #ifdef HAVE_PTHREAD ocb.status("HAVE_PTHREAD"); #endif #ifdef HAVE_PTHREAD_H ocb.status("HAVE_PTHREAD_H"); #endif #ifdef HAVE_PTHREAD_WIN32_PROCESS_ATTACH_NP ocb.status("HAVE_PTHREAD_WIN32_PROCESS_ATTACH_NP"); #endif } } // So that the usage message fits in a standard DOS window, this // function should produce no more than 22 lines of text. void state::md5deep_usage(void) { if(usage_count==1){ ocb.status("%s version %s by %s.",progname.c_str(),VERSION,AUTHOR); ocb.status("%s %s [OPTION]... [FILES]...",CMD_PROMPT,progname.c_str()); ocb.status("See the man page or README.txt file or use -hh for the full list of options"); ocb.status("-p - piecewise mode. Files are broken into blocks for hashing"); ocb.status("-r - recursive mode. All subdirectories are traversed"); ocb.status("-e - show estimated time remaining for each file"); ocb.status("-s - silent mode. Suppress all error messages"); ocb.status("-z - display file size before hash"); ocb.status("-m - enables matching mode. See README/man page"); ocb.status("-x - enables negative matching mode. See README/man page"); ocb.status("-M and -X are the same as -m and -x but also print hashes of each file"); ocb.status("-w - displays which known file generated a match"); ocb.status("-n - displays known hashes that did not match any input files"); ocb.status("-a and -A add a single hash to the positive or negative matching set"); ocb.status("-b - prints only the bare name of files; all path information is omitted"); ocb.status("-l - print relative paths for filenames"); ocb.status("-t - print GMT timestamp (ctime)"); ocb.status("-i/I - only process files smaller/larger than SIZE"); ocb.status("-v - display version number and exit"); ocb.status("-d - output in DFXML; -u - Escape Unicode; -W FILE - write to FILE."); #ifdef HAVE_PTHREAD ocb.status("-j - use num threads (default %d)",threadpool::numCPU()); #else ocb.status("-j - ignored (compiled without pthreads)"); #endif ocb.status("-Z - triage mode; -h - help; -hh - full help"); } if(usage_count==2){ // -hh ocb.status("-S - Silent mode, but warn on bad hashes"); ocb.status("-0 - use a NUL (\\0) for newline."); ocb.status("-k - print asterisk before filename"); ocb.status("-u - escape Unicode characters in filenames"); ocb.status("-B - verbose mode; repeat for more verbosity"); ocb.status("-C - OS X only --- use Common Crypto hash functions"); ocb.status("-Fb - I/O mode buffered; -Fu unbuffered; -Fm memory-mapped"); ocb.status("-f - take list of files to hash from filename"); ocb.status("-o[bcpflsde] - expert mode. Only process certain types of files:"); ocb.status(" b=block dev; c=character dev; p=named pipe"); ocb.status(" f=regular file; l=symlink; s=socket; d=door e=Windows PE"); ocb.status("-D - set debug level to nn"); } if(usage_count==3){ // -hhh ocb.status("sizeof(off_t)= %d",sizeof(off_t)); #ifdef HAVE_PTHREAD ocb.status("HAVE_PTHREAD"); #endif #ifdef HAVE_PTHREAD_H ocb.status("HAVE_PTHREAD_H"); #endif #ifdef HAVE_PTHREAD_WIN32_PROCESS_ATTACH_NP ocb.status("HAVE_PTHREAD_WIN32_PROCESS_ATTACH_NP"); #endif } } void state::check_flags_okay() { sanity_check( (((ocb.primary_function & primary_match) || (ocb.primary_function & primary_match_neg) || (ocb.primary_function & primary_audit)) && !hashes_loaded()), "Unable to load any matching files."); sanity_check( (ocb.opt_relative) && (ocb.mode_barename), "Relative paths and bare filenames are mutally exclusive."); /* Additional sanity checks will go here as needed... */ } /**************************************************************** ** Hash algorithms database. ****************************************************************/ algorithm_t hashes[NUM_ALGORITHMS]; // which hash algorithms are available and in use /** * Add a hash algorithm. This could be table driven, but it isn't. */ void algorithm_t::add_algorithm( hashid_t pos, const char *name, uint16_t bits, void ( *func_init)(void *ctx), void ( *func_update)(void *ctx, const unsigned char *buf, size_t buflen), void ( *func_finalize)(void *ctx, unsigned char *), int inuse) { hashes[pos].name = name; hashes[pos].f_init = func_init; hashes[pos].f_update = func_update; hashes[pos].f_finalize = func_finalize; hashes[pos].bit_length = bits; hashes[pos].inuse = inuse; hashes[pos].id = pos; } extern "C" { int sha1_init(void * md); int sha1_process(void *md, const unsigned char *buf,uint64_t); int sha1_done(void * md, unsigned char *out); }; #ifdef POLARSSL_SHA1_H void hash_init_sha1(void * ctx) { assert(sizeof(sha1_context) < MAX_ALGORITHM_CONTEXT_SIZE); sha1_starts((sha1_context *)ctx); } void hash_update_sha1(void * ctx, const unsigned char *buf, size_t len) { sha1_update((sha1_context *)ctx,buf,len); } void hash_final_sha1(void * ctx, unsigned char *sum) { sha1_finish((sha1_context *)ctx,sum); } #endif #if defined(HAVE_COMMONCRYPTO_COMMONDIGEST_H) #include #endif bool opt_enable_mac_cc=false; // enable mac common crypto #ifdef HAVE_CC_SHA1_INIT /* These are to overcome C++ cast issues */ void cc_md5_init(void * ctx) { if(opt_enable_mac_cc){ CC_MD5_Init((CC_MD5_CTX *)ctx); } else { hash_init_md5(ctx); } } void cc_sha1_init(void * ctx) { if(opt_enable_mac_cc){ CC_SHA1_Init((CC_SHA1_CTX *)ctx); } else { hash_init_sha1(ctx); } } void cc_sha256_init(void * ctx) { if(opt_enable_mac_cc){ CC_SHA256_Init((CC_SHA256_CTX *)ctx); } else { hash_init_sha256(ctx); } } void cc_md5_update(void *ctx, const unsigned char *buf, size_t len) { if(opt_enable_mac_cc){ CC_MD5_Update((CC_MD5_CTX *)ctx,buf,len); } else { hash_update_md5(ctx,buf,len); } } void cc_sha1_update(void *ctx, const unsigned char *buf, size_t len) { if(opt_enable_mac_cc){ CC_SHA1_Update((CC_SHA1_CTX *)ctx,buf,len); } else { hash_update_sha1(ctx,buf,len); } } void cc_sha256_update(void *ctx, const unsigned char *buf, size_t len) { if(opt_enable_mac_cc){ CC_SHA256_Update((CC_SHA256_CTX *)ctx,buf,len); } else { hash_update_sha256(ctx,buf,len); } } /* These swap argument orders, which are different for Apple and our implementation */ void cc_md5_final(void *ctx, unsigned char *digest) { if(opt_enable_mac_cc){ CC_MD5_Final(digest,(CC_MD5_CTX *)ctx); } else { hash_final_md5(ctx,digest); } } void cc_sha1_final(void *ctx, unsigned char *digest) { if(opt_enable_mac_cc){ CC_SHA1_Final(digest,(CC_SHA1_CTX *)ctx); } else { hash_final_sha1(ctx,digest); } } void cc_sha256_final(void *ctx, unsigned char *digest) { if(opt_enable_mac_cc){ CC_SHA256_Final(digest,(CC_SHA256_CTX *)ctx); } else { hash_final_sha256(ctx,digest); } } #endif /* * Load the hashing algorithms array. */ void algorithm_t::load_hashing_algorithms() { /* The DEFAULT_ENABLE variables are in main.h */ #if defined(HAVE_CC_SHA1_INIT) /* Use the Apple's validated Common Crypto for SHA1 and SHA256 */ assert(sizeof(struct CC_MD5state_st) &split(const std::string &s, char delim, std::vector &elems) { std::stringstream ss(s); std::string item; while(std::getline(ss, item, delim)) { elems.push_back(item); } return elems; } std::vector split(const std::string &s, char delim) { std::vector elems; return split(s, delim, elems); } void lowercase(std::string &s) { std::transform(s.begin(), s.end(), s.begin(), ::tolower); } /* * Set inuse for each of the algorithms in the argument. */ void algorithm_t::enable_hashing_algorithms(std::string var) { /* convert name to lowercase and remove any dashes */ std::transform(var.begin(), var.end(), var.begin(), ::tolower); /* Split on the commas */ std::vectoralgs = split(var,','); for(std::vector::const_iterator it = algs.begin();it!=algs.end();it++){ hashid_t id = get_hashid_for_name(*it); if(id==alg_unknown){ /* Check to see if *i is "all" */ if(*it == "all"){ for(int j=0;j INSANELY_VERBOSE) ocb.error("User request for insane verbosity denied"); break; case 'V': ocb.status("%s", VERSION); exit(EXIT_SUCCESS); case 'W': ocb.set_outfilename(optarg); break; case '0': ocb.opt_zero = true; break; case 'u': ocb.opt_unicode_escape = true;break; case 'j': ocb.opt_threadcount = atoi(optarg); break; case 'F': ocb.opt_iomode = iomode::toiomode(optarg);break; case 'h': usage_count++; usage(); did_usage = true; break; case 'D': opt_debug = atoi(optarg);break; default: try_msg(); exit(EXIT_FAILURE); } } if(did_usage ) exit(EXIT_SUCCESS); check_flags_okay(); return FALSE; } #ifdef _WIN32 /** * WIN32 requires the argv in wchar_t format to allow the program to get UTF16 * filenames resulting from star expansion. */ int state::prepare_windows_command_line() { this->argv = CommandLineToArgvW(GetCommandLineW(),&this->argc); return FALSE; } #endif class uni32str:public vector {}; std::string global::escape_utf8(const std::string &utf8) { uni32str utf32_line; std::string ret; utf8::utf8to32(utf8.begin(),utf8.end(),back_inserter(utf32_line)); for(uni32str::const_iterator it = utf32_line.begin(); it!=utf32_line.end(); it++){ if((*it) < 256){ ret.push_back(*it); } else { char buf[16]; snprintf(buf,sizeof(buf),"U+%04X",*it); ret.append(buf); } } return ret; } #ifdef _WIN32 /** * We only need make_utf8 on windows because on POSIX systems * all filenames are assumed to be UTF8. */ std::string global::make_utf8(const tstring &str) { if(str.size()==0) return std::string(); // nothing to convert /* Figure out how many bytes req required */ size_t len = WideCharToMultiByte(CP_UTF8,0,str.c_str(),str.size(),0,0,0,0); if(len==0){ switch(GetLastError()){ case ERROR_INSUFFICIENT_BUFFER: std::cerr << "ERROR_INSUFFICIENT_BUFFER\n";break; case ERROR_INVALID_FLAGS: std::cerr << "ERROR_INVALID_FLAGS\n";break; case ERROR_INVALID_PARAMETER: std::cerr << "ERROR_INVALID_PARAMETER\n";break; case ERROR_NO_UNICODE_TRANSLATION: std::cerr << "ERROR_NO_UNICODE_TRANSLATION\n";break; } std::cerr << "WideCharToMultiByte failed\n"; return std::string(""); } /* allocate the space we need (plus one for null-termination */ char *buf = new char[len+1]; /* Perform the conversion */ len = WideCharToMultiByte(CP_UTF8,0,str.c_str(),str.size(),buf,len,0,0); if(len==0){ return std::string(""); // nothing to return } buf[len] = 0; // be sure it is null-terminated std::string s2(buf); // Make a STL string delete [] buf; // Delete the buffern return s2; // return the string } #endif tstring global::getcwd() { #ifdef _WIN32 wchar_t buf[MAX_PATH]; memset(buf,0,sizeof(buf)); _wgetcwd(buf,MAX_PATH); tstring ret = tstring(buf); return ret; #else char buf[PATH_MAX+1]; memset(buf,0,sizeof(buf)); ::getcwd(buf,sizeof(buf)); return std::string(buf); #endif } #if 0 // See http://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html tstring global::getcwd() { std::string path; typedef std::pair file_id; bool success = false; int start_fd = open(".", O_RDONLY); //Keep track of start directory, so can jump back to it later if (start_fd == -1) { fprintf(stderr,"global::getcwd(): Cannot open '.': %s\n",strerror(errno)); exit(1); } struct stat sb; if (fstat(start_fd, &sb)==0) { file_id current_id(sb.st_dev, sb.st_ino); if (!stat("/", &sb)){ //Get info for root directory, so we can determine when we hit it std::vector path_components; file_id root_id(sb.st_dev, sb.st_ino); // while we are not at the root, keep going up... while (current_id != root_id){ bool pushed = false; if (!chdir("..")){ //Keep recursing towards root each iteration DIR *dir = opendir("."); if (dir) { dirent *entry; while ((entry = readdir(dir))){ //We loop through each entry trying to find where we came from if (strcmp(entry->d_name,".")==0) continue; // ignore . if (strcmp(entry->d_name,"..")==0) continue; if (lstat(entry->d_name, &sb)==0){ file_id child_id(sb.st_dev, sb.st_ino); if (child_id == current_id){ //We found where we came from, add its name to the list path_components.push_back(entry->d_name); pushed = true; break; } } } closedir(dir); if (pushed && !stat(".", &sb)){ //If we have a reason to continue, we update the current dir id current_id = file_id(sb.st_dev, sb.st_ino); } } //Else, Uh oh, can't read information at this level } if (!pushed) { break; } //If we didn't obtain any info this pass, no reason to continue } if (current_id == root_id){ //Unless they're equal, we failed above //Built the path, will always end with a slash path = "/"; for (std::vector::reverse_iterator i = path_components.rbegin(); i != path_components.rend(); ++i){ path += *i+"/"; } success = true; } fchdir(start_fd); } } close(start_fd); return path; } #endif /* Return the canonicalized absolute pathname in UTF-8 on Windows and POSIX systems */ tstring global::get_realpath(const tstring &fn) { #ifdef _WIN32 /* * expand a relative path to the full path. * http://msdn.microsoft.com/en-us/library/506720ff(v=vs.80).aspx */ wchar_t absPath[PATH_MAX]; if(_wfullpath(absPath,fn.c_str(),PATH_MAX)==0) tstring(); // fullpath failed... return tstring(absPath); #else char resolved_name[PATH_MAX]; // if(realpath(fn.c_str(),resolved_name)==0) return ""; if(opt_debug) std::cout << "global::get_realpath(" << fn << ")=" << resolved_name << "\n"; return tstring(resolved_name); #endif } std::string global::get_realpath8(const tstring &fn) { return global::make_utf8(global::get_realpath(fn)); } #ifdef _WIN32 /** * Detect if we are a 32-bit program running on a 64-bit system. * * Running a 32-bit program on a 64-bit system is problematic because WoW64 * changes the program's view of critical directories. An affected * program does not see the true %WINDIR%, but instead gets a mapped * version. Thus the user cannot get an accurate picture of their system. * See http://jessekornblum.livejournal.com/273084.html for an example. * * The following is adapted from * http://msdn.microsoft.com/en-us/library/ms684139(v=VS.85).aspx */ typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); LPFN_ISWOW64PROCESS fnIsWow64Process; void state::check_wow64() { BOOL result; fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(GetModuleHandle(TEXT("kernel32")), "IsWow64Process"); // If this system doesn't have the function IsWow64Process then // it's definitely not running under WoW64. if (NULL == fnIsWow64Process) return; if (! fnIsWow64Process(GetCurrentProcess(), &result)) { // The function failed? WTF? Well, let's not worry about it. return; } if (result) { ocb.error("WARNING: You are running a 32-bit program on a 64-bit system."); ocb.error("You probably want to use the 64-bit version of this program."); } } #endif // ifdef _WIN32 /**************************************************************** * Legacy code from md5deep follows.... * ****************************************************************/ void state::md5deep_check_flags_okay() { sanity_check(((ocb.opt_mode_match) || (ocb.opt_mode_match_neg)) && hashes_loaded()==0, "Unable to load any matching files."); sanity_check((ocb.opt_relative) && (ocb.mode_barename), "Relative paths and bare filenames are mutally exclusive."); sanity_check((ocb.piecewise_size>0) && (ocb.opt_display_size), "Piecewise mode and file size display is just plain silly."); /* If we try to display non-matching files but haven't initialized the list of matching files in the first place, bad things will happen. */ sanity_check((ocb.mode_not_matched) && ! ((ocb.opt_mode_match) || (ocb.opt_mode_match_neg)), "Matching or negative matching must be enabled to display non-matching files."); sanity_check(ocb.opt_show_matched && ! ((ocb.opt_mode_match) || (ocb.opt_mode_match_neg)), "Matching or negative matching must be enabled to display which file matched."); } void state::md5deep_check_matching_modes() { sanity_check((ocb.opt_mode_match) && (ocb.opt_mode_match_neg), "Regular and negative matching are mutually exclusive."); } int state::md5deep_process_command_line(int argc_, char **argv_) { bool did_usage = false; int i; while ((i = getopt(argc_, argv_, "A:a:bcCdeF:f:I:i:M:X:x:m:o:tnwzsSp:rhvV0lkqZW:D:uj:")) != -1) { switch (i) { case 'C': opt_enable_mac_cc = true; break; case 'D': opt_debug = atoi(optarg); break; case 'd': ocb.xml_open(stdout); break; case 'f': opt_input_list = optarg; break; case 'I': ocb.mode_size_all=true; // Note that there is no break here case 'i': ocb.mode_size=true; ocb.size_threshold = find_block_size(optarg); if (ocb.size_threshold==0) { ocb.error("Requested size threshold implies not hashing anything."); exit(status_t::STATUS_USER_ERROR); } break; case 'p': ocb.piecewise_size = find_block_size(optarg); if (ocb.piecewise_size==0) { ocb.error("Illegal size value for piecewise mode."); exit(status_t::STATUS_USER_ERROR); } break; case 'Z': ocb.mode_triage = true; break; case 't': ocb.mode_timestamp = true; break; case 'n': ocb.mode_not_matched = true; break; case 'w': ocb.opt_show_matched = true; break; // display which known hash generated match case 'j': ocb.opt_threadcount = atoi(optarg); break; case 'F': ocb.opt_iomode = iomode::toiomode(optarg);break; case 'a': ocb.opt_mode_match=true; md5deep_check_matching_modes(); md5deep_add_hash(optarg,optarg); break; case 'A': ocb.opt_mode_match_neg=true; md5deep_check_matching_modes(); md5deep_add_hash(optarg,optarg); break; case 'o': mode_expert=true; setup_expert_mode(optarg); break; case 'M': // match mode ocb.opt_display_hash=true; /* Intentional fall through */ case 'm': ocb.opt_mode_match=true; md5deep_check_matching_modes(); md5deep_load_match_file(optarg); break; case 'X': ocb.opt_display_hash=true; case 'x': ocb.opt_mode_match_neg=true; md5deep_check_matching_modes(); md5deep_load_match_file(optarg); break; case 'c': ocb.opt_csv = true; break; case 'z': ocb.opt_display_size = true; break; case '0': ocb.opt_zero = true; break; case 'S': mode_warn_only = true; ocb.opt_silent = true; break; case 's': ocb.opt_silent = true; break; case 'e': ocb.opt_estimate = true; break; case 'r': mode_recursive = true; break; case 'k': ocb.opt_asterisk = true; break; case 'b': ocb.mode_barename=true; break; case 'l': ocb.opt_relative = true; break; case 'q': ocb.mode_quiet = true; break; case 'W': ocb.set_outfilename(optarg); break; case 'u': ocb.opt_unicode_escape = true;break; case 'h': usage_count++; md5deep_usage(); did_usage = true; break; case 'v': ocb.status("%s",VERSION); exit (EXIT_SUCCESS); case 'V': // COPYRIGHT is a format string, complete with newlines ocb.status(COPYRIGHT); exit (EXIT_SUCCESS); default: try_msg(); exit (status_t::STATUS_USER_ERROR); } } if(did_usage) exit (EXIT_SUCCESS); md5deep_check_flags_okay(); return EXIT_SUCCESS; } /****************************************************************/ /* Make the UTF8 banner in case we need it * Only hashdeep has a header. */ std::string state::make_banner() { std::string utf8_banner; utf8_banner = HASHDEEP_HEADER_10 + std::string(NEWLINE); utf8_banner += HASHDEEP_PREFIX; utf8_banner += "size,"; for (int i = 0 ; i < NUM_ALGORITHMS ; ++i) { if (hashes[i].inuse){ utf8_banner += hashes[i].name + std::string(","); } } utf8_banner += std::string("filename") + NEWLINE; utf8_banner += "## Invoked from: " + global::make_utf8(global::getcwd()) + NEWLINE; utf8_banner += "## "; #ifdef _WIN32 std::wstring cwd = global::getcwd(); std::string cwd8 = global::make_utf8(cwd); utf8_banner += cwd8 + ">"; #else utf8_banner += (geteuid()==0) ? "#" : "$"; #endif // Accounts for '## ', command prompt, and space before first argument size_t bytes_written = 8; for (int largc = 0 ; largc < this->argc ; ++largc) { utf8_banner += " "; bytes_written++; // We are going to print the string. It's either ASCII or UTF16 // convert it to a tstring and then to UTF8 string. tstring arg_t = tstring(this->argv[largc]); std::string arg_utf8 = global::make_utf8(arg_t); size_t current_bytes = arg_utf8.size(); // The extra 32 bytes is a fudge factor if (current_bytes + bytes_written + 32 > MAX_STRING_LENGTH) { utf8_banner += std::string(NEWLINE) + "## "; bytes_written = 3; } utf8_banner += arg_utf8; bytes_written += current_bytes; } utf8_banner += std::string(NEWLINE) + "## " + NEWLINE; return utf8_banner; /****************************************************************/ } uint64_t state::find_block_size(std::string input_str) { if(input_str.size()==0) return 0; // no input??? uint64_t multiplier = 1; char last_char = input_str[input_str.size()-1]; // There are deliberately no break statements in this switch switch (tolower(last_char)) { case 'e': multiplier *= 1024; case 'p': multiplier *= 1024; case 't': multiplier *= 1024; case 'g': multiplier *= 1024; case 'm': multiplier *= 1024; case 'k': multiplier *= 1024; case 'b': input_str.erase(input_str.size()-1,1); // erase the last character break; default: ocb.error("Improper piecewise multiplier ignored."); break; case '0':case '1':case '2':case '3':case '4': case '5':case '6':case '7':case '8':case '9': break; } #ifdef __HPUX return (strtoumax ( input_str.c_str(), (char**)0, 10) * multiplier); #else return (atoll(input_str.c_str()) * multiplier); #endif } int main(int argc, char **argv) { /* Because the main() function can handle wchar_t arguments on Win32, * we need a way to reference those values. Thus we make a duplciate * of the argc and argv values. */ // Initialize the plugable algorithm system and create the state object! assert(sizeof(off_t)==8); // be sure that we were compiled correctly algorithm_t::load_hashing_algorithms(); state *s = new state(); exit(s->main(argc,argv)); } int state::main(int _argc,char **_argv) { /** * Originally this program was two sets of progarms: * 'hashdeep' with the new interface, and 'md5deep', 'sha1deep', etc * with the old interface. Now we are a single program and we figure out * which interface to use based on how we are started. */ /* Get the program name */ progname = _argv[0]; // default #ifdef HAVE_GETPROGNAME progname = getprogname(); // possibly better #endif #ifdef HAVE_PROGRAM_INVOCATION_NAME progname = program_invocation_name; // possibly better #endif #ifdef HAVE_PTHREAD threadpool::win32_init(); // ocb.opt_threadcount = threadpool::numCPU(); // be sure it's set #endif /* There are two versions of basename, so use our own */ size_t delim = progname.rfind(DIR_SEPARATOR); if(delim!=std::string::npos) progname.erase(0,delim+1); /* Convert progname to lower case */ std::transform(progname.begin(), progname.end(), progname.begin(), ::tolower); std::string algname = progname.substr(0,progname.find("deep")); if(algname=="hash"){ // we are hashdeep hashdeep_process_command_line(_argc,_argv); } else { algorithm_t::clear_algorithms_inuse(); char buf[256]; strcpy(buf,algname.c_str()); algorithm_t::enable_hashing_algorithms(buf); for(int i=0;i0){ ocb.tp = new threadpool(ocb.opt_threadcount); } #endif if(opt_debug>2){ std::cout << "dump hashlist before matching:\n"; ocb.dump_hashlist(); } /* If we were given an input list, process it */ if(opt_input_list!=""){ std::ifstream in; in.open(opt_input_list.c_str()); if(!in.is_open()){ std::cerr << "Cannot open " << opt_input_list << ": " << strerror(errno) << "\n"; exit(1); } while(!in.eof()){ std::string line; std::getline(in,line); /* Remove any possible \r\n or \n */ if(line.size()>0 && line[line.size()-1]=='\n') line.erase(line.size()-1); if(line.size()>0 && line[line.size()-1]=='\r') line.erase(line.size()-1); if(line.size()==0) continue; /* If we are running on Windows, turn it into a UTF-16 filename */ #ifdef _WIN32 /* I think that this will work, but it needs to be tested */ std::wstring wstr; utf8::utf8to16(line.begin(),line.end(),back_inserter(wstr)); dig_win32(wstr); #else dig_normal(line.c_str()); #endif } in.close(); } /* * Anything left on the command line at this point is a file * or directory we're supposed to process. If there's nothing * specified, we should hash standard input */ if (optind == argc && opt_input_list==""){ if(ocb.mode_triage){ ocb.fatal_error("Processing stdin not supported in Triage mode"); } ocb.hash_stdin(); } else { for(int i=optind;iargv[i]); #ifdef _WIN32 dig_win32(fn); #else dig_normal(fn); #endif } } /* If we are multi-threading, wait for all threads to finish */ #ifdef HAVE_PTHREAD if(ocb.tp) ocb.tp->wait_till_all_free(); #endif if(opt_debug>2){ std::cout << "\ndump hashlist after matching:\n"; ocb.dump_hashlist(); } /* If we were auditing, display the audit results */ if (ocb.primary_function == primary_audit){ ocb.display_audit_results(); } /* We only have to worry about checking for unused hashes if one * of the matching modes was enabled. We let the display_not_matched * function determine if it needs to display anything. The function * also sets our return values in terms of inputs not being matched * or known hashes not being used */ if (ocb.opt_mode_match || ocb.opt_mode_match_neg){ ocb.finalize_matching(); } /* If we were generating DFXML, finish the job */ if(opt_debug>1) std::cerr << "*** main calling dfxml_shutdown\n"; ocb.dfxml_shutdown(); /* On windows, do a hard exit * * "If one of the terminated threads in the process holds a lock * and the DLL detach code in one of the loaded DLLs attempts to * acquire the same lock, then calling ExitProcess results in a * deadlock. In contrast, if a process terminates by calling * TerminateProcess, the DLLs that the process is attached to are * not notified of the process termination. Therefore, if you do * not know the state of all threads in your process, it is better * to call TerminateProcess than ExitProcess. Note that returning * from the main function of an application results in a call to * ExitProcess." * * http://msdn.microsoft.com/en-us/library/ms682658(v=vs.85).aspx */ #if defined(_WIN32) TerminateProcess(GetCurrentProcess(),ocb.get_return_code()); #endif return ocb.get_return_code(); } md5deep-4.2/src/main.h000066400000000000000000001000021176640446200145710ustar00rootroot00000000000000/* * main.h: * * This is the main file included by all other modules in md5deep/hashdeep/etc. * * It includes: * common.h - the common system include files * xml.h - the C++ XML system. * hash function headers * * C++ STL stuff. * * It then creates all the C++ classes and structures used. * * $Id: main.h 630 2012-06-05 00:32:45Z jessekornblum $ */ #ifndef __MAIN_H #define __MAIN_H #include "common.h" #include "xml.h" #ifdef HAVE_PTHREAD #include "threadpool.h" #endif #include #include #if !defined(VERSION) && defined(PACKAGE_VERSION) #define VERSION PACKAGE_VERSION #endif #define VERBOSE 1 #define MORE_VERBOSE 2 #define INSANELY_VERBOSE 3 /* These describe the version of the file format being used, not * the version of the program. */ #define HASHDEEP_PREFIX "%%%% " #define HASHDEEP_HEADER_10 "%%%% HASHDEEP-1.0" /* HOW TO ADD A NEW HASHING ALGORITHM * Add a value for the algorithm to the hashid_t enumeration * Add the functions to compute the hashes. There should be three functions, an initialization route, an update routine, and a finalize routine. The convention, for an algorithm "foo", is foo_init, foo_update, and foo_final. * Add your new code to Makefile.am under hashdeep_SOURCES * Add a call to insert the algorithm in state::load_hashing_algorithms * See if you need to increase MAX_ALGORITHM_NAME_LENGTH or MAX_ALGORITHM_CONTEXT_SIZE for your algorithm in common.h * Update the usage function and man page to include the function */ typedef enum { alg_md5=0, alg_sha1, alg_sha256, alg_tiger, alg_whirlpool, /* alg_unknown must always be last in this list. It's used as a loop terminator in many functions. */ alg_unknown } hashid_t; inline std::ostream & operator << (std::ostream &os,const hashid_t &h) { switch(h){ case alg_md5: os << "alg_md5" ; break ; case alg_sha1: os << "alg_sha1" ; break ; case alg_sha256: os << "alg_sha256" ; break ; case alg_tiger: os << "alg_tige" ; break ; case alg_whirlpool: os << "alg_whirlpool" ; break ; case alg_unknown: os << "alg_unknown" ; break ; } return os; } #define NUM_ALGORITHMS alg_unknown /* Which ones are enabled by default */ #define DEFAULT_ENABLE_MD5 TRUE #define DEFAULT_ENABLE_SHA1 FALSE #define DEFAULT_ENABLE_SHA256 TRUE #define DEFAULT_ENABLE_TIGER FALSE #define DEFAULT_ENABLE_WHIRLPOOL FALSE class iomode { public:; static const int buffered=0; // use fopen, fread, fclose static const int unbuffered=1; // use open, read, close static const int mmapped=2; // use open, mmap, close static int toiomode(const std::string &str){ if(str=="0" || str[0]=='b') return iomode::buffered; if(str=="1" || str[0]=='u') return iomode::unbuffered; if(str=="2" || str[0]=='m') return iomode::mmapped; std::cerr << "Invalid iomode '" << str << "'"; assert(0); return iomode::unbuffered; // default } }; /* This class holds the information known about each hash algorithm. * It's sort of like the EVP system in OpenSSL. * * In version 3 the list of known hashes was stored here as well. * That has been moved to the hashlist database (further down). * * Right now we are using some global variables; the better way to do this * would be with a C++ singleton. * * Perhaps the correct way to do this would be a global C++ vector of objects? */ class algorithm_t { public: bool inuse; // true if we are using this algorithm std::string name; // name of algorithm size_t bit_length; // 128 for MD5 hashid_t id; // usually the position in the array... /* The hashing functions */ void ( *f_init)(void *ctx); void ( *f_update)(void *ctx, const unsigned char *buf, size_t len ); void ( *f_finalize)(void *ctx, unsigned char *); /* The methods */ static void add_algorithm(hashid_t pos, const char *name, uint16_t bits, void ( *func_init)(void *ctx), void ( *func_update)(void *ctx, const unsigned char *buf, size_t len ), void ( *func_finalize)(void *ctx, unsigned char *), int inuse); static void load_hashing_algorithms(); static void clear_algorithms_inuse(); static void enable_hashing_algorithms(std::string var); // enable the algorithms in 'var'; var can be 'all' static hashid_t get_hashid_for_name(std::string name); // return the hashid_t for 'name' static bool valid_hex(const std::string &buf); // returns true if buf contains only hex characters static bool valid_hash(hashid_t alg,const std::string &buf); // returns true if buf is a valid hash for hashid_t a static int algorithms_in_use_count(); // returns count of algorithms in use }; extern algorithm_t hashes[NUM_ALGORITHMS]; // which hash algorithms are available and in use /** status_t describes exit codes for the program * */ class status_t { private: int32_t code; public:; status_t():code(0){}; static const int32_t status_ok = EXIT_SUCCESS; // 0 static const int32_t status_EXIT_FAILURE = EXIT_FAILURE; static const int32_t status_out_of_memory = -2; static const int32_t status_invalid_hash = -3; static const int32_t status_unknown_error = -4; static const int32_t status_omg_ponies = -5; /* * Return values for the program * RBF - Document these return values for hashdeep * A successful run has these or'ed together */ static const int32_t STATUS_UNUSED_HASHES = 1; static const int32_t STATUS_INPUT_DID_NOT_MATCH = 2; static const int32_t STATUS_USER_ERROR = 64; static const int32_t STATUS_INTERNAL_ERROR = 128; void add(int32_t val){ code |= val; } void set(int32_t val){ code = val; } int32_t get_status(){ return code; } bool operator==(int32_t v){ return this->code==v; } bool operator!=(int32_t v){ return this->code!=v; } }; #ifdef _WIN32 typedef __time64_t timestamp_t; typedef std::wstring filename_t; #else typedef time_t timestamp_t; typedef std::string filename_t; #endif /** * file_metadata_t contains metadata information about a file. * It also includes a stat call that returns the inode information * and link count even on windows, where the API is different than stat. * Note that we only include information we care about in this program * * this is in dig.cpp. */ /* strangely, we define our own file types */ typedef enum { stat_regular=0, stat_directory, stat_door, stat_block, stat_character, stat_pipe, stat_socket, stat_symlink, stat_unknown=254 } file_types; class file_metadata_t { public: static file_types decode_file_type(const struct __stat64 &sb); // stat a file, print an error and return -1 if it fails, otherwise return 0 static int stat(const filename_t &path,file_metadata_t *m,class display &ocb); class fileid_t { // uniquely defines a file on this system public: fileid_t():dev(0),ino(0){}; fileid_t(uint64_t dev_,uint64_t ino_):dev(dev_),ino(ino_){}; uint64_t dev; // device number uint64_t ino; // inode number }; file_metadata_t():fileid(),nlink(0),size(0),ctime(0),mtime(0),atime(0){}; file_metadata_t(fileid_t fileid_,uint64_t nlink_,uint64_t size_,timestamp_t ctime_,timestamp_t mtime_, timestamp_t atime_):fileid(fileid_),nlink(nlink_),size(size_),ctime(ctime_),mtime(mtime_),atime(atime_){}; fileid_t fileid; uint64_t nlink; uint64_t size; timestamp_t ctime; timestamp_t mtime; timestamp_t atime; }; /** file_data_t contains information about a file. * It can be created by hashing an actual file, or by reading a hash file a file of hashes. * The object is simple so that the built in C++ shallow copy will make a proper copy of it. * Note that all hashes are currently stored as a hex string. That incurs a 2x memory overhead. * This will be changed. */ class file_data_t { public: file_data_t():file_bytes(0),matched_file_number(0){ }; virtual ~file_data_t(){} // required because we subclass std::string hash_hex[NUM_ALGORITHMS]; // the hash in hex of the entire file std::string hash512_hex[NUM_ALGORITHMS]; // hash of the first 512 bytes, for triage mode std::string file_name; // just the file_name; native on POSIX; UTF-8 on Windows. uint64_t file_bytes; // how many bytes were actually read uint64_t matched_file_number; // file number that we matched.; 0 if no match }; /** * hash_context stores information for a specific hash. * which may for a piece of a file or an entire file */ class hash_context_obj { public:; hash_context_obj():read_offset(0),read_len(0){} /* Information for the hashing underway */ uint8_t hash_context[NUM_ALGORITHMS][MAX_ALGORITHM_CONTEXT_SIZE]; /* The actual hashing */ void multihash_initialize(); void multihash_update(const unsigned char *buffer,size_t bufsize); void multihash_finalize(std::string dest[]); // for piecewise hashing: where this segment was actually read uint64_t read_offset; // where the segment we read started uint64_t read_len; // how many bytes were read and hashed }; /** file_data_hasher_t is a subclass of file_data_t. * It contains additional information necessary to actually hash a file. */ class file_data_hasher_t : public file_data_t { private: static uint64_t next_file_number; static mutex_t fdh_lock; public: uint64_t stat_megs() const { // return how many megabytes is the file in MB? return stat_bytes / ONE_MEGABYTE; } static const size_t MD5DEEP_IDEAL_BLOCK_SIZE = 8192; file_data_hasher_t(class display *ocb_): ocb(ocb_), // where we put results handle(0), fd(-1), base(0),bounds(0), // for mmap file_number(0),ctime(0),mtime(0),atime(0),stat_bytes(0), start_time(0),last_time(0),eof(false),workerid(-1){ file_number = ++next_file_number; }; virtual ~file_data_hasher_t(){ if(handle){ fclose(handle); handle = 0; } if(fd){ #ifdef HAVE_MMAP if(base) munmap((void *)base,bounds); #endif close(fd); fd = 0; } } bool is_stdin(){ return handle==stdin; } /* The actual file to hash */ filename_t file_name_to_hash; /* Where the results go */ class display *ocb; /* How we read the data */ FILE *handle; // the file we are reading int fd; // fd used for unbuffered and mmap const unsigned char *base; // base of mapped file size_t bounds; // size of the mapped file std::string triage_info; // if true, must print on output std::stringstream dfxml_hash; // the DFXML hash digest for the piece just hashed; // used to build piecewise uint64_t file_number; void append_dfxml_for_byterun(); void compute_dfxml(bool known_hash,const hash_context_obj *hc); timestamp_t ctime; // ctime; previously 'timestamp' timestamp_t mtime; timestamp_t atime; // How many bytes (and megs) we think are in the file, via stat(2) // and how many bytes we've actually read in the file uint64_t stat_bytes; // how much stat returned /* When we started the hashing, and when was the last time a display was printed, * for printing status updates. */ time_t start_time, last_time; // of hashing bool eof; // end of file encountered while reading int workerid; // my worker id, or -1 if there is none void set_workerid(int id){workerid=id;} /* multithreaded hash implementation is these functions in hash.cpp. * hash() is called to hash each file and record the results. * Return codes are both stored in display return_code and returned * 0 - for success, -1 for error */ // called to actually do the computation; returns true if successful // and fills in the read_offset and read_len void dfxml_timeout(const std::string &tag,const timestamp_t &val); void dfxml_write_hashes(std::string hex_hashes[],int indent); bool compute_hash(uint64_t request_start,uint64_t request_len,hash_context_obj *segment,hash_context_obj *file); void hash(); // called to hash each file and record results }; /** The hashlist holds a list of file_data_t objects. * state->known is used to hold the audit file that is loaded. * state->seen is used to hold the hashes seen on the current run. * We store multiple maps for each algorithm number which map the hash hex code * to the pointer as well. * * the hashlist.cpp file contains the implementation. It's largely taken * from the v3 audit.cpp and match.cpp files. */ class hashlist : public std::vector { /** * The largest number of columns we can expect in a file of hashes * (knowns). Normally this should be the number of hash * algorithms plus a column for file size, file name, and, well, * some fudge factors. Any values after this number will be * ignored. For example, if the user invokes the program as: * * hashdeep -c md5,md5,md5,md5,...,md5,md5,md5,md5,md5,md5,md5,whirlpool * * the whirlpool will not be registered. */ public:; static const int MAX_KNOWN_COLUMNS= NUM_ALGORITHMS+ 6; typedef enum { /* return codes from loading a hash list */ loadstatus_ok = 0, status_unknown_filetype, status_contains_bad_hashes, status_contains_no_hashes, status_file_error } loadstatus_t; typedef enum { searchstatus_ok = 0, /* Matching hashes */ status_match, // all hashes match status_partial_match, /* One or more hashes match, but not all */ status_file_size_mismatch, /* Implies all hashes match */ status_file_name_mismatch, /* Implies all hashes and file size match */ status_no_match /* Implies none of the hashes match */ } searchstatus_t; static const char *searchstatus_to_str(searchstatus_t val); // Types of files that contain known hashes typedef enum { file_plain, file_bsd, file_hashkeeper, file_nsrl_15, file_nsrl_20, file_encase3, file_encase4, file_ilook, // Files generated by md5deep with the ten digit filesize at the start // of each line file_md5deep_size, file_hashdeep_10, file_unknown } hashfile_format; class hashmap : public std::multimap { public:; void add_file(file_data_t *fi,int alg_num); }; hashmap hashmaps[NUM_ALGORITHMS]; /**************************************************************** ** Search functions follow ** It's not entirely clear why we have two search functions, but we do. ** Perhaps one is from md5deep and the other is from hashdeep ****************************************************************/ /** * hashlist.cpp * find_hash finds the 'best match', which ideally is a match for both the hash and the filename. */ file_data_t *find_hash(hashid_t alg,const std::string &hash_hex, const std::string &file_name, uint64_t file_number); /** * look up a fdt by hash code(s) and return if it is present or not. * optionally return a pointer to it as well. */ searchstatus_t search(const file_data_hasher_t *fdht, file_data_t ** matched) ; uint64_t total_matched(); // return the total matched from all calls to search() /****************************************************************/ /** * Figure out the format of a hashlist file and load it. * Both of these functions take the file name and the open handle. * They read from the handle and just use the filename for printing error messages. */ void enable_hashing_algorithms_from_hashdeep_file(class display *ocb, const std::string &fn,std::string val); std::string last_enabled_algorithms; // a string with the algorithms that were enabled last hashid_t hash_column[NUM_ALGORITHMS]; // maps a column number to a hashid; // the order columns appear in the file being loaded. uint8_t filename_column; // Column number which should contain the filename hashfile_format identify_format(class display *ocb,const std::string &fn,FILE *handle); loadstatus_t load_hash_file(class display *ocb,const std::string &fn); // not tstring! always ASCII void dump_hashlist(); // send contents to stdout /** * add_fdt adds a file_data_t record to the hashlist, and its hashes to all the hashmaps. * @param fi - a file_data_t to add. Don't erase it; we're going to use it (and modify it) */ void add_fdt(file_data_t *fi); }; /* Primary modes of operation (primary_function) */ typedef enum { primary_compute=0, primary_match=1, primary_match_neg=2, primary_audit=3 } primary_t; // These are the types of files that we can match against #define TYPE_PLAIN 0 #define TYPE_BSD 1 #define TYPE_HASHKEEPER 2 #define TYPE_NSRL_15 3 #define TYPE_NSRL_20 4 #define TYPE_ILOOK 5 #define TYPE_ILOOK3 6 #define TYPE_ILOOK4 7 #define TYPE_MD5DEEP_SIZE 8 #define TYPE_ENCASE 9 #define TYPE_UNKNOWN 254 /* audit mode stats */ class audit_stats { public: audit_stats():exact(0), expect(0), partial(0), moved(0), unused(0), unknown(0), total(0){ }; /* For audit mode, the number of each type of file */ uint64_t exact, expect, partial; // uint64_t moved, unused, unknown, total; // void clear(){ exact = 0; expect = 0; partial = 0; moved = 0; unused = 0; unknown = 0; total = 0; } }; /** display describes how information is output. * There is only one OCB (it is a singleton). * It needs to be mutex protected. * * The hashing happens in lots of threads and then calls the output * classes in output_control_block to actually do the outputing. The * problem here is that one of the things that is done is looking up, * so the searches into "known" and "seen" also need to be * protected. Hence "known" and "seen" appear in the * output_control_block, and not elsewhere, and all of the access to * them needs to be mediated. * * It also needs to maintain all of the state for audit mode. * Finally, it maintains options for reading * (e.g. buffered, unbuffered, or memory-mapped I/O) * * It is a class because it is protected and is passed around. */ class display { private: mutable mutex_t M; // lock for anything in output section void lock() const { M.lock(); } void unlock() const { M.unlock(); } /* all display state variables are protected by M and must be private */ std::ostream *out; // where things get sent std::ofstream myoutstream; // if we open it std::string utf8_banner; // banner to be displayed bool banner_displayed; // has the header been shown (text output) XML *dfxml; /* output in DFXML */ /* The set of known values; typically read from the audit file */ hashlist known; // hashes read from the -k file hashlist seen; // hashes seen on this hashing run; from the command line class audit_stats match; // for the audit mode status_t return_code; // prevously returned by hash() and dig(). public: display(): out(&std::cout), banner_displayed(0),dfxml(0), mode_triage(false), mode_not_matched(false),mode_quiet(false),mode_timestamp(false), mode_barename(false), mode_size(false),mode_size_all(false), opt_silent(false), opt_verbose(0), opt_estimate(false), opt_relative(false), opt_unicode_escape(false), opt_mode_match(false), opt_mode_match_neg(false), opt_csv(false), opt_asterisk(false), opt_zero(false), opt_display_size(false), opt_display_hash(false), opt_show_matched(false), opt_iomode(iomode::buffered), // by default, use buffered #ifdef HAVE_PTHREAD opt_threadcount(threadpool::numCPU()), tp(0), #else opt_threadcount(0), #endif size_threshold(0), piecewise_size(0), primary_function(primary_compute){ } /* These variables are read-only after threading starts */ bool mode_triage; bool mode_not_matched; bool mode_quiet; bool mode_timestamp; bool mode_barename; bool mode_size; bool mode_size_all; std::string opt_outfilename; bool opt_silent; int opt_verbose; bool opt_estimate; bool opt_relative; bool opt_unicode_escape; bool opt_mode_match; bool opt_mode_match_neg; bool opt_csv; bool opt_asterisk; bool opt_zero; bool opt_display_size; bool opt_display_hash; bool opt_show_matched; int opt_iomode; int opt_threadcount; #ifdef HAVE_PTHREAD threadpool *tp; #endif // When only hashing files larger/smaller than a given threshold uint64_t size_threshold; uint64_t piecewise_size; // non-zero for piecewise mode primary_t primary_function; /* what do we want to do? */ /* Functions for working */ void set_outfilename(std::string outfilename); /* Return code support */ int32_t get_return_code(){ lock(); int ret = return_code.get_status(); unlock(); return ret; } void set_return_code(status_t code){ lock(); return_code = code; unlock(); } void set_return_code(int32_t code){ lock(); return_code.set(code); unlock(); } void set_return_code_if_not_ok(status_t code){ lock(); if(code!=status_t::status_ok) return_code = code; unlock(); } /* DFXML support */ void xml_open(FILE *out_){ lock(); dfxml = new XML(out_); unlock(); } void dfxml_startup(int argc,char **argv); void dfxml_shutdown(); void dfxml_timeout(const std::string &tag,const timestamp_t &val); void dfxml_write(file_data_hasher_t *fdht); /* Known hash database interface */ /* Display the unused files and return the count */ uint64_t compute_unused(bool show_display,std::string annotation); void set_utf8_banner(std::string utf8_banner_){ utf8_banner = utf8_banner_; } static mutex_t portable_gmtime_mutex; struct tm *portable_gmtime(struct tm *my_time,const timestamp_t *t); void try_msg(void); void display_banner_if_needed(); void display_match_result(file_data_hasher_t *fdht,const hash_context_obj *hc); void md5deep_display_match_result(file_data_hasher_t *fdht,const hash_context_obj *hc); void md5deep_display_hash(file_data_hasher_t *fdht,const hash_context_obj *hc); void display_hash(file_data_hasher_t *fdht,const hash_context_obj *hc); void display_hash_simple(file_data_hasher_t *fdt,const hash_context_obj *hc); /* The following routines are for printing and outputing filenames. * * fmt_filename formats the filename. * On Windows this version outputs as UTF-8 unless unicode quoting is requested, * in which case Unicode characters are emited as U+xxxx. * For example, the Unicode smiley character ☺ is output as U+263A. * */ std::string fmt_size(const file_data_t *fdh) const; std::string fmt_filename(const std::string &fn) const; #ifdef _WIN32 std::string fmt_filename(const std::wstring &fn) const; #endif std::string fmt_filename(const file_data_t *fdt) const { return fmt_filename(fdt->file_name); } void writeln(std::ostream *s,const std::string &str); // writes a line with NEWLINE and locking // Display an ordinary message with newline added void status(const char *fmt, ...) __attribute__((format(printf, 2, 0))); // note that 1 is 'self' // Display an error message if not in silent mode void error(const char *fmt, ...) __attribute__((format(printf, 2, 0))); // Display an error message if not in silent mode and exit void fatal_error(const char *fmt, ...) __attribute__((format(printf, 2, 0))) __attribute__ ((__noreturn__)); // Display an error message, ask user to contact the developer, void internal_error(const char *fmt, ...) __attribute__((format(printf, 2, 0))) __attribute__ ((__noreturn__)); void print_debug(const char *fmt, ...) __attribute__((format(printf, 2, 0))); void error_filename(const std::string &fn, const char *fmt, ...) __attribute__((format(printf, 3, 0))) ; #ifdef _WIN32 void error_filename(const std::wstring &fn, const char *fmt, ...) __attribute__((format(printf, 3, 0))); #endif /* these versions extract the filename and the annotation if it is present. */ /* known hash database and realtime stats. * Note that this is not locked() and unlocked(). * It can only be run from the main thread before fork. */ hashlist::loadstatus_t load_hash_file(const std::string &fn){ hashlist::loadstatus_t ret = known.load_hash_file(this,fn); return ret; } /** These are multi-threaded */ uint64_t known_size() const { lock(); uint64_t ret= known.size(); unlock(); return ret; } const file_data_t *find_hash(hashid_t alg,const std::string &hash_hex, const std::string &file_name, uint64_t file_number){ lock(); const file_data_t *ret = known.find_hash(alg,hash_hex,file_name,file_number); unlock(); return ret; } void clear_realtime_stats(); void display_realtime_stats(const file_data_hasher_t *fdht,const hash_context_obj *hc,time_t elapsed); bool hashes_loaded() const{ lock(); bool ret = known.size()>0; unlock(); return ret; } void add_fdt(file_data_t *fdt){ lock(); known.add_fdt(fdt); unlock(); } /* audit mode */ int audit_update(file_data_hasher_t *fdt); int audit_check(); // performs an audit; return 0 if pass, -1 if fail void display_audit_results(); // sets return code if fails void finalize_matching(); /* hash.cpp: Actually trigger the hashing. */ void hash_file(const tstring &file_name); void hash_stdin(); void dump_hashlist(){ lock(); known.dump_hashlist(); unlock(); } }; /** * The 'state' class holds the state of the hashdeep/md5deep program. * This includes: * startup parameters * known - the list of hashes in the hash database. * seen - the list of hashes that have been seen this time through. */ class global { public: static tstring getcwd(); // returns the current directory static tstring get_realpath(const tstring &fn); // returns the full path static std::string get_realpath8(const tstring &fn); // returns the full path in UTF-8 static std::string escape_utf8(const std::string &fn); // turns "⦿" to "U+29BF" #ifdef _WIN32 static std::string make_utf8(const std::wstring &tfn) ; #endif static std::string make_utf8(const std::string &tfn){return tfn;} }; /* On Win32, allow output of wstr's by converting them to UTF-8 */ #ifdef _WIN32 inline std::ostream & operator <<(std::ostream &os,const std::wstring &wstr) { os << global::make_utf8(wstr); return os; } #endif class state { public:; state():mode_recursive(false), // do we recurse? mode_warn_only(false), // for loading hash files // these determine which files get hashed mode_expert(false), mode_regular(false), mode_directory(false), mode_door(false), mode_block(false), mode_character(false), mode_pipe(false), mode_socket(false), mode_symlink(false), mode_winpe(false), // command line argument argc(0),argv(0), // these have something to do with hash files that are loaded h_field(0), h_plain(0),h_bsd(0), h_md5deep_size(0), h_hashkeeper(0),h_ilook(0),h_ilook3(0),h_ilook4(0), h_nsrl20(0), h_encase(0), usage_count(0) // allows -hh to print extra help {}; bool mode_recursive; bool mode_warn_only; // which files do we hash. bool mode_expert; bool mode_regular; bool mode_directory; bool mode_door; bool mode_block; bool mode_character; bool mode_pipe; bool mode_socket; bool mode_symlink; bool mode_winpe; /* Command line arguments */ std::string opt_input_list; // file with a list of files to read int argc; #ifdef _WIN32 wchar_t **argv; // never allocated, never freed #else char **argv; #endif /* configuration and output */ display ocb; // output control block // Which filetypes this algorithm supports and their position in the file uint8_t h_field; // which field to extract from a hash file. uint8_t h_plain, h_bsd, h_md5deep_size, h_hashkeeper; uint8_t h_ilook, h_ilook3, h_ilook4, h_nsrl20, h_encase; void md5deep_add_hash(char *h, char *fn); // explicitly add a hash void setup_expert_mode(char *arg); /* main.cpp */ uint64_t find_block_size(std::string input_str); int usage_count; bool opt_enable_mac_cc; tstring generate_filename(const tstring &input); void usage(); std::string make_banner(); void md5deep_usage(); void check_flags_okay(); void check_wow64(); void md5deep_check_flags_okay(); int hashdeep_process_command_line(int argc,char **argv); void md5deep_check_matching_modes(); int md5deep_process_command_line(int argc,char **argv); #ifdef _WIN32 int prepare_windows_command_line(); #endif /* files.cpp * Not quite sure what to do with this stuff yet... */ void md5deep_load_match_file(const char *fn); int find_hash_in_line(char *buf, int fileType, char *filename); int parse_encase_file(const char *fn,FILE *f,uint32_t num_expected_hashes); int find_plain_hash(char *buf,char *known_fn); // returns FALSE if error int find_md5deep_size_hash(char *buf, char *known_fn); int find_bsd_hash(char *buf, char *fn); int find_rigid_hash(char *buf, char *fn, unsigned int fn_location, unsigned int hash_location); int find_ilook_hash(char *buf, char *known_fn); int check_for_encase(FILE *f,uint32_t *expected_hashes); /* dig.cpp * * Note the file typing system needs to be able to display errors... */ class dir_table_t : public std::set{ }; dir_table_t dir_table; void done_processing_dir(const tstring &fn_); void processing_dir(const tstring &fn_); bool have_processed_dir(const tstring &fn_); int identify_hash_file_type(FILE *f,uint32_t *expected_hashes); // identify the hash file type bool should_hash_symlink(const tstring &fn,file_types *link_type); bool should_hash_winpe(const tstring &fn); bool should_hash_expert(const tstring &fn, file_types type); bool should_hash(const tstring &fn); /* file_type returns the file type of a string. * If an error is found and ocb is provided, send the error to ocb. * If filesize and timestamp are provided, give them. */ static file_types file_type(const filename_t &fn,class display *ocb,uint64_t *filesize, timestamp_t *ctime,timestamp_t *mtime,timestamp_t *atime); #ifdef _WIN32 bool is_junction_point(const std::wstring &fn); #endif void clean_name_posix(std::string &fn); void process_dir(const tstring &path); void dig_normal(const tstring &path); // posix & win32 void dig_win32(const tstring &path); // win32 only; calls dig_normal static void dig_self_test(); bool hashes_loaded(){ return ocb.hashes_loaded(); } int main(int argc,char **argv); // main void sanity_check(int condition,const char *msg); }; /** * the files class knows how to read various hash file types */ /* Due to an inadvertant code fork several years ago, this program has different usage * and output when run as 'md5deep' then when run as 'hashdeep'. We call this the * 'md5deep_mode' and track it with the variables below. */ /* main.cpp */ extern bool md5deep_mode; // if true, then we were run as md5deep, sha1deep, etc. extern int opt_debug; // for debugging extern hashid_t opt_md5deep_mode_algorithm; // for when we are in MD5DEEP mode std::vector &split(const std::string &s, char delim, std::vector &elems); std::vector split(const std::string &s, char delim); void lowercase(std::string &s); extern std::string progname; // formerly const char *__progname // ------------------------------------------------------------------ // HELPER FUNCTIONS // // helper.cpp // ------------------------------------------------------------------ void chop_line(char *s); off_t find_file_size(FILE *f,class display *ocb); // Return the size, in bytes of an open file stream. On error, return -1 // ------------------------------------------------------------------ // MAIN PROCESSING // ------------------------------------------------------------------ /* dig.cpp */ void dig_self_test(); // check the string-processing #endif /* ifndef __MAIN_H */ md5deep-4.2/src/md5.c000066400000000000000000000307631176640446200143450ustar00rootroot00000000000000/* * This code implements the MD5 message-digest algorithm. * The algorithm was written by Ron Rivest. This code was * written by Colin Plumb in 1993, our understanding is * that no copyright is claimed and that * this code is in the public domain. * * Equivalent code is available from RSA Data Security, Inc. * This code has been tested against that, and is * functionally equivalent, * * 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. */ #include "md5.h" /* If we haven't brought in an accelerated MD5, use our own */ #ifndef WORDS_BIGENDIAN #define byteReverse(buf, len) /* Nothing */ #else void byteReverse(unsigned char *buf, unsigned longs); #ifndef ASM_MD5 /* * Note: this code is harmless on little-endian machines. */ void byteReverse(unsigned char *buf, unsigned longs) { uint32_t t; do { t = (uint32_t) ((unsigned) buf[3] << 8 | buf[2]) << 16 | ((unsigned) buf[1] << 8 | buf[0]); *(uint32_t *) buf = t; buf += 4; } while (--longs); } #endif // ifndef ASM_MD5 #endif // ifndef WORDS_BIGENDIAN /* * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious * initialization constants. */ void MD5Init(context_md5_t *ctx) { ctx->buf[0] = 0x67452301; ctx->buf[1] = 0xefcdab89; ctx->buf[2] = 0x98badcfe; ctx->buf[3] = 0x10325476; ctx->bits[0] = 0; ctx->bits[1] = 0; } /* * Update context to reflect the concatenation of another buffer full * of bytes. */ void MD5Update(context_md5_t *ctx, const unsigned char *buf, size_t len) { uint32_t t; /* Update bitcount */ t = ctx->bits[0]; if ((ctx->bits[0] = t + ((uint32_t) len << 3)) < t) ctx->bits[1]++; /* Carry from low to high */ ctx->bits[1] += len >> 29; t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ /* Handle any leading odd-sized chunks */ if (t) { unsigned char *p = (unsigned char *) ctx->in + t; t = 64 - t; if (len < t) { memcpy(p, buf, len); return; } memcpy(p, buf, t); byteReverse(ctx->in, 16); MD5Transform(ctx->buf, (uint32_t *) ctx->in); buf += t; len -= t; } /* Process data in 64-byte chunks */ while (len >= 64) { memcpy(ctx->in, buf, 64); byteReverse(ctx->in, 16); MD5Transform(ctx->buf, (uint32_t *) ctx->in); buf += 64; len -= 64; } /* Handle any remaining bytes of data. */ memcpy(ctx->in, buf, len); } /* * Final wrapup - pad to 64-byte boundary with the bit pattern * 1 0* (64-bit count of bits processed, MSB-first) */ void MD5Final(unsigned char digest[16], context_md5_t *ctx) { unsigned count; unsigned char *p; /* Compute number of bytes mod 64 */ count = (ctx->bits[0] >> 3) & 0x3F; /* Set the first char of padding to 0x80. This is safe since there is always at least one byte free */ p = ctx->in + count; *p++ = 0x80; /* Bytes of padding needed to make 64 bytes */ count = 64 - 1 - count; /* Pad out to 56 mod 64 */ if (count < 8) { /* Two lots of padding: Pad the first block to 64 bytes */ memset(p, 0, count); byteReverse(ctx->in, 16); MD5Transform(ctx->buf, (uint32_t *) ctx->in); /* Now fill the next block with 56 bytes */ memset(ctx->in, 0, 56); } else { /* Pad block to 56 bytes */ memset(p, 0, count - 8); } byteReverse(ctx->in, 14); /* Append length in bits and transform */ ((uint32_t *) ctx->in)[14] = ctx->bits[0]; ((uint32_t *) ctx->in)[15] = ctx->bits[1]; MD5Transform(ctx->buf, (uint32_t *) ctx->in); byteReverse((unsigned char *) ctx->buf, 4); memcpy(digest, ctx->buf, 16); memset(ctx, 0, sizeof(* ctx)); /* In case it's sensitive */ /* The original version of this code omitted the asterisk. In effect, only the first part of ctx was wiped with zeros, not the whole thing. Bug found by Derek Jones. Original line: */ // memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */ } #ifndef ASM_MD5 /* The four core functions - F1 is optimized somewhat */ /* #define F1(x, y, z) (x & y | ~x & z) */ #define F1(x, y, z) (z ^ (x & (y ^ z))) #define F2(x, y, z) F1(z, x, y) #define F3(x, y, z) (x ^ y ^ z) #define F4(x, y, z) (y ^ (x | ~z)) /* This is the central step in the MD5 algorithm. */ #ifdef __PUREC__ #define MD5STEP(f, w, x, y, z, data, s) \ ( w += f /*(x, y, z)*/ + data, w = w<>(32-s), w += x ) #else #define MD5STEP(f, w, x, y, z, data, s) \ ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) #endif /* * The core of the MD5 algorithm, this alters an existing MD5 hash to * reflect the addition of 16 longwords of new data. MD5Update blocks * the data and converts bytes into longwords for this routine. */ void MD5Transform(uint32_t buf[4], uint32_t const in[16]) { register uint32_t a, b, c, d; a = buf[0]; b = buf[1]; c = buf[2]; d = buf[3]; #ifdef __PUREC__ /* PureC Weirdness... (GG) */ MD5STEP(F1(b,c,d), a, b, c, d, in[0] + 0xd76aa478L, 7); MD5STEP(F1(a,b,c), d, a, b, c, in[1] + 0xe8c7b756L, 12); MD5STEP(F1(d,a,b), c, d, a, b, in[2] + 0x242070dbL, 17); MD5STEP(F1(c,d,a), b, c, d, a, in[3] + 0xc1bdceeeL, 22); MD5STEP(F1(b,c,d), a, b, c, d, in[4] + 0xf57c0fafL, 7); MD5STEP(F1(a,b,c), d, a, b, c, in[5] + 0x4787c62aL, 12); MD5STEP(F1(d,a,b), c, d, a, b, in[6] + 0xa8304613L, 17); MD5STEP(F1(c,d,a), b, c, d, a, in[7] + 0xfd469501L, 22); MD5STEP(F1(b,c,d), a, b, c, d, in[8] + 0x698098d8L, 7); MD5STEP(F1(a,b,c), d, a, b, c, in[9] + 0x8b44f7afL, 12); MD5STEP(F1(d,a,b), c, d, a, b, in[10] + 0xffff5bb1L, 17); MD5STEP(F1(c,d,a), b, c, d, a, in[11] + 0x895cd7beL, 22); MD5STEP(F1(b,c,d), a, b, c, d, in[12] + 0x6b901122L, 7); MD5STEP(F1(a,b,c), d, a, b, c, in[13] + 0xfd987193L, 12); MD5STEP(F1(d,a,b), c, d, a, b, in[14] + 0xa679438eL, 17); MD5STEP(F1(c,d,a), b, c, d, a, in[15] + 0x49b40821L, 22); MD5STEP(F2(b,c,d), a, b, c, d, in[1] + 0xf61e2562L, 5); MD5STEP(F2(a,b,c), d, a, b, c, in[6] + 0xc040b340L, 9); MD5STEP(F2(d,a,b), c, d, a, b, in[11] + 0x265e5a51L, 14); MD5STEP(F2(c,d,a), b, c, d, a, in[0] + 0xe9b6c7aaL, 20); MD5STEP(F2(b,c,d), a, b, c, d, in[5] + 0xd62f105dL, 5); MD5STEP(F2(a,b,c), d, a, b, c, in[10] + 0x02441453L, 9); MD5STEP(F2(d,a,b), c, d, a, b, in[15] + 0xd8a1e681L, 14); MD5STEP(F2(c,d,a), b, c, d, a, in[4] + 0xe7d3fbc8L, 20); MD5STEP(F2(b,c,d), a, b, c, d, in[9] + 0x21e1cde6L, 5); MD5STEP(F2(a,b,c), d, a, b, c, in[14] + 0xc33707d6L, 9); MD5STEP(F2(d,a,b), c, d, a, b, in[3] + 0xf4d50d87L, 14); MD5STEP(F2(c,d,a), b, c, d, a, in[8] + 0x455a14edL, 20); MD5STEP(F2(b,c,d), a, b, c, d, in[13] + 0xa9e3e905L, 5); MD5STEP(F2(a,b,c), d, a, b, c, in[2] + 0xfcefa3f8L, 9); MD5STEP(F2(d,a,b), c, d, a, b, in[7] + 0x676f02d9L, 14); MD5STEP(F2(c,d,a), b, c, d, a, in[12] + 0x8d2a4c8aL, 20); MD5STEP(F3(b,c,d), a, b, c, d, in[5] + 0xfffa3942L, 4); MD5STEP(F3(a,b,c), d, a, b, c, in[8] + 0x8771f681L, 11); MD5STEP(F3(d,a,b), c, d, a, b, in[11] + 0x6d9d6122L, 16); MD5STEP(F3(c,d,a), b, c, d, a, in[14] + 0xfde5380cL, 23); MD5STEP(F3(b,c,d), a, b, c, d, in[1] + 0xa4beea44L, 4); MD5STEP(F3(a,b,c), d, a, b, c, in[4] + 0x4bdecfa9L, 11); MD5STEP(F3(d,a,b), c, d, a, b, in[7] + 0xf6bb4b60L, 16); MD5STEP(F3(c,d,a), b, c, d, a, in[10] + 0xbebfbc70L, 23); MD5STEP(F3(b,c,d), a, b, c, d, in[13] + 0x289b7ec6L, 4); MD5STEP(F3(a,b,c), d, a, b, c, in[0] + 0xeaa127faL, 11); MD5STEP(F3(d,a,b), c, d, a, b, in[3] + 0xd4ef3085L, 16); MD5STEP(F3(c,d,a), b, c, d, a, in[6] + 0x04881d05L, 23); MD5STEP(F3(b,c,d), a, b, c, d, in[9] + 0xd9d4d039L, 4); MD5STEP(F3(a,b,c), d, a, b, c, in[12] + 0xe6db99e5L, 11); MD5STEP(F3(d,a,b), c, d, a, b, in[15] + 0x1fa27cf8L, 16); MD5STEP(F3(c,d,a), b, c, d, a, in[2] + 0xc4ac5665L, 23); MD5STEP(F4(b,c,d), a, b, c, d, in[0] + 0xf4292244L, 6); MD5STEP(F4(a,b,c), d, a, b, c, in[7] + 0x432aff97L, 10); MD5STEP(F4(d,a,b), c, d, a, b, in[14] + 0xab9423a7L, 15); MD5STEP(F4(c,d,a), b, c, d, a, in[5] + 0xfc93a039L, 21); MD5STEP(F4(b,c,d), a, b, c, d, in[12] + 0x655b59c3L, 6); MD5STEP(F4(a,b,c), d, a, b, c, in[3] + 0x8f0ccc92L, 10); MD5STEP(F4(d,a,b), c, d, a, b, in[10] + 0xffeff47dL, 15); MD5STEP(F4(c,d,a), b, c, d, a, in[1] + 0x85845dd1L, 21); MD5STEP(F4(b,c,d), a, b, c, d, in[8] + 0x6fa87e4fL, 6); MD5STEP(F4(a,b,c), d, a, b, c, in[15] + 0xfe2ce6e0L, 10); MD5STEP(F4(d,a,b), c, d, a, b, in[6] + 0xa3014314L, 15); MD5STEP(F4(c,d,a), b, c, d, a, in[13] + 0x4e0811a1L, 21); MD5STEP(F4(b,c,d), a, b, c, d, in[4] + 0xf7537e82L, 6); MD5STEP(F4(a,b,c), d, a, b, c, in[11] + 0xbd3af235L, 10); MD5STEP(F4(d,a,b), c, d, a, b, in[2] + 0x2ad7d2bbL, 15); MD5STEP(F4(c,d,a), b, c, d, a, in[9] + 0xeb86d391L, 21); #else MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); #endif buf[0] += a; buf[1] += b; buf[2] += c; buf[3] += d; } #endif void hash_init_md5(void * ctx) { MD5Init((context_md5_t *)ctx); } void hash_update_md5(void *ctx, const unsigned char *buf, size_t len) { MD5Update((context_md5_t *)ctx,buf,len); } void hash_final_md5(void *ctx, unsigned char *digest) { MD5Final(digest,(context_md5_t *)ctx); } md5deep-4.2/src/md5.h000066400000000000000000000024011176640446200143360ustar00rootroot00000000000000 /* MD5DEEP - md5.h * * By Jesse Kornblum * * This is a work of the US Government. In accordance with 17 USC 105, * copyright protection is not available for any work of the US Government. * * 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. * */ /* $Id: md5.h 501 2011-09-25 17:12:27Z xchatty $ */ #ifndef __MD5_H #define __MD5_H #include "common.h" // -------------------------------------------------------------- // After this is the algorithm itself. You shouldn't change these __BEGIN_DECLS typedef struct { uint32_t buf[4]; uint32_t bits[2]; unsigned char in[64]; } context_md5_t; // This is needed to make RSAREF happy on some MS-DOS compilers typedef context_md5_t MD5_CTX; void MD5Init(context_md5_t *ctx); void MD5Update(context_md5_t *context, const unsigned char *buf, size_t len); void MD5Final(unsigned char digest[16], context_md5_t *context); void MD5Transform(uint32_t buf[4], uint32_t const in[16]); void hash_init_md5(void * ctx); void hash_update_md5(void *ctx, const unsigned char *buf, size_t len); void hash_final_md5(void *ctx, unsigned char *digest); __END_DECLS #endif /* ifndef __MD5_H */ md5deep-4.2/src/multihash.cpp000066400000000000000000000025701176640446200162110ustar00rootroot00000000000000 /* $Id: multihash.cpp 494 2011-09-16 21:21:40Z xchatty $ */ #include "main.h" void hash_context_obj::multihash_initialize() { for (int i = 0 ; i < NUM_ALGORITHMS ; ++i) { if (hashes[i].inuse) { hashes[i].f_init(this->hash_context[i]); } } } void hash_context_obj::multihash_update(const unsigned char *buf, size_t len) { /* * We no longer have to copy the data being hashed from the buffer we were * passed into another structure because the SHA-1 update * routine now copies its own data. */ for (int i = 0 ; i < NUM_ALGORITHMS ; ++i) { if (hashes[i].inuse) { hashes[i].f_update(this->hash_context[i],buf,len); } } } /** * multihash_finalizes finalizes each algorithm and converts to hex. * Only the hex is preserved. */ void hash_context_obj::multihash_finalize(std::string dest[]) { uint16_t j; static char hex[] = "0123456789abcdef"; for (int i = 0 ; i < NUM_ALGORITHMS ; ++i) { dest[i]=""; if (hashes[i].inuse) { /* Calculate the residue and convert to hex */ uint8_t residue[MAX_ALGORITHM_RESIDUE_SIZE]; hashes[i].f_finalize(this->hash_context[i], residue); for (j = 0; j < hashes[i].bit_length/8 ; j++) { dest[i].push_back(hex[(residue[j] >> 4) & 0xf]); dest[i].push_back(hex[residue[j] & 0xf]); } } } // old code //this->file_size = this->bytes_read; } md5deep-4.2/src/sha1.c000066400000000000000000000377731176640446200145240ustar00rootroot00000000000000/* * FIPS-180-1 compliant SHA-1 implementation * * Copyright (C) 2006-2010, Brainspark B.V. * * This file is part of PolarSSL (http://www.polarssl.org) * Lead Maintainer: Paul Bakker * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* * The SHA-1 standard was published by NIST in 1993. * * http://www.itl.nist.gov/fipspubs/fip180-1.htm */ //#include "polarssl/config.h" //#if defined(POLARSSL_SHA1_C) //#include "polarssl/sha1.h" #include "sha1.h" /* modified for md5deep */ #if defined(POLARSSL_FS_IO) || defined(POLARSSL_SELF_TEST) #include #endif /* * 32-bit integer manipulation macros (big endian) */ #ifndef GET_ULONG_BE #define GET_ULONG_BE(n,b,i) \ { \ (n) = ( (unsigned long) (b)[(i) ] << 24 ) \ | ( (unsigned long) (b)[(i) + 1] << 16 ) \ | ( (unsigned long) (b)[(i) + 2] << 8 ) \ | ( (unsigned long) (b)[(i) + 3] ); \ } #endif #ifndef PUT_ULONG_BE #define PUT_ULONG_BE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ (b)[(i) + 3] = (unsigned char) ( (n) ); \ } #endif /* * SHA-1 context setup */ void sha1_starts( sha1_context *ctx ) { ctx->total[0] = 0; ctx->total[1] = 0; ctx->state[0] = 0x67452301; ctx->state[1] = 0xEFCDAB89; ctx->state[2] = 0x98BADCFE; ctx->state[3] = 0x10325476; ctx->state[4] = 0xC3D2E1F0; } static void sha1_process( sha1_context *ctx, const unsigned char data[64] ) { unsigned long temp, W[16], A, B, C, D, E; GET_ULONG_BE( W[ 0], data, 0 ); GET_ULONG_BE( W[ 1], data, 4 ); GET_ULONG_BE( W[ 2], data, 8 ); GET_ULONG_BE( W[ 3], data, 12 ); GET_ULONG_BE( W[ 4], data, 16 ); GET_ULONG_BE( W[ 5], data, 20 ); GET_ULONG_BE( W[ 6], data, 24 ); GET_ULONG_BE( W[ 7], data, 28 ); GET_ULONG_BE( W[ 8], data, 32 ); GET_ULONG_BE( W[ 9], data, 36 ); GET_ULONG_BE( W[10], data, 40 ); GET_ULONG_BE( W[11], data, 44 ); GET_ULONG_BE( W[12], data, 48 ); GET_ULONG_BE( W[13], data, 52 ); GET_ULONG_BE( W[14], data, 56 ); GET_ULONG_BE( W[15], data, 60 ); #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) #define R(t) \ ( \ temp = W[(t - 3) & 0x0F] ^ W[(t - 8) & 0x0F] ^ \ W[(t - 14) & 0x0F] ^ W[ t & 0x0F], \ ( W[t & 0x0F] = S(temp,1) ) \ ) #define P(a,b,c,d,e,x) \ { \ e += S(a,5) + F(b,c,d) + K + x; b = S(b,30); \ } A = ctx->state[0]; B = ctx->state[1]; C = ctx->state[2]; D = ctx->state[3]; E = ctx->state[4]; #define F(x,y,z) (z ^ (x & (y ^ z))) #define K 0x5A827999 P( A, B, C, D, E, W[0] ); P( E, A, B, C, D, W[1] ); P( D, E, A, B, C, W[2] ); P( C, D, E, A, B, W[3] ); P( B, C, D, E, A, W[4] ); P( A, B, C, D, E, W[5] ); P( E, A, B, C, D, W[6] ); P( D, E, A, B, C, W[7] ); P( C, D, E, A, B, W[8] ); P( B, C, D, E, A, W[9] ); P( A, B, C, D, E, W[10] ); P( E, A, B, C, D, W[11] ); P( D, E, A, B, C, W[12] ); P( C, D, E, A, B, W[13] ); P( B, C, D, E, A, W[14] ); P( A, B, C, D, E, W[15] ); P( E, A, B, C, D, R(16) ); P( D, E, A, B, C, R(17) ); P( C, D, E, A, B, R(18) ); P( B, C, D, E, A, R(19) ); #undef K #undef F #define F(x,y,z) (x ^ y ^ z) #define K 0x6ED9EBA1 P( A, B, C, D, E, R(20) ); P( E, A, B, C, D, R(21) ); P( D, E, A, B, C, R(22) ); P( C, D, E, A, B, R(23) ); P( B, C, D, E, A, R(24) ); P( A, B, C, D, E, R(25) ); P( E, A, B, C, D, R(26) ); P( D, E, A, B, C, R(27) ); P( C, D, E, A, B, R(28) ); P( B, C, D, E, A, R(29) ); P( A, B, C, D, E, R(30) ); P( E, A, B, C, D, R(31) ); P( D, E, A, B, C, R(32) ); P( C, D, E, A, B, R(33) ); P( B, C, D, E, A, R(34) ); P( A, B, C, D, E, R(35) ); P( E, A, B, C, D, R(36) ); P( D, E, A, B, C, R(37) ); P( C, D, E, A, B, R(38) ); P( B, C, D, E, A, R(39) ); #undef K #undef F #define F(x,y,z) ((x & y) | (z & (x | y))) #define K 0x8F1BBCDC P( A, B, C, D, E, R(40) ); P( E, A, B, C, D, R(41) ); P( D, E, A, B, C, R(42) ); P( C, D, E, A, B, R(43) ); P( B, C, D, E, A, R(44) ); P( A, B, C, D, E, R(45) ); P( E, A, B, C, D, R(46) ); P( D, E, A, B, C, R(47) ); P( C, D, E, A, B, R(48) ); P( B, C, D, E, A, R(49) ); P( A, B, C, D, E, R(50) ); P( E, A, B, C, D, R(51) ); P( D, E, A, B, C, R(52) ); P( C, D, E, A, B, R(53) ); P( B, C, D, E, A, R(54) ); P( A, B, C, D, E, R(55) ); P( E, A, B, C, D, R(56) ); P( D, E, A, B, C, R(57) ); P( C, D, E, A, B, R(58) ); P( B, C, D, E, A, R(59) ); #undef K #undef F #define F(x,y,z) (x ^ y ^ z) #define K 0xCA62C1D6 P( A, B, C, D, E, R(60) ); P( E, A, B, C, D, R(61) ); P( D, E, A, B, C, R(62) ); P( C, D, E, A, B, R(63) ); P( B, C, D, E, A, R(64) ); P( A, B, C, D, E, R(65) ); P( E, A, B, C, D, R(66) ); P( D, E, A, B, C, R(67) ); P( C, D, E, A, B, R(68) ); P( B, C, D, E, A, R(69) ); P( A, B, C, D, E, R(70) ); P( E, A, B, C, D, R(71) ); P( D, E, A, B, C, R(72) ); P( C, D, E, A, B, R(73) ); P( B, C, D, E, A, R(74) ); P( A, B, C, D, E, R(75) ); P( E, A, B, C, D, R(76) ); P( D, E, A, B, C, R(77) ); P( C, D, E, A, B, R(78) ); P( B, C, D, E, A, R(79) ); #undef K #undef F ctx->state[0] += A; ctx->state[1] += B; ctx->state[2] += C; ctx->state[3] += D; ctx->state[4] += E; } /* * SHA-1 process buffer */ void sha1_update( sha1_context *ctx, const unsigned char *input, size_t ilen ) { size_t fill; unsigned long left; if( ilen <= 0 ) return; left = ctx->total[0] & 0x3F; fill = 64 - left; ctx->total[0] += (unsigned long) ilen; ctx->total[0] &= 0xFFFFFFFF; if( ctx->total[0] < (unsigned long) ilen ) ctx->total[1]++; if( left && ilen >= fill ) { memcpy( (void *) (ctx->buffer + left), (const void *) input, fill ); sha1_process( ctx, ctx->buffer ); input += fill; ilen -= fill; left = 0; } while( ilen >= 64 ) { sha1_process( ctx, input ); input += 64; ilen -= 64; } if( ilen > 0 ) { memcpy( (void *) (ctx->buffer + left), (const void *) input, ilen ); } } static const unsigned char sha1_padding[64] = { 0x80, 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, 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 }; /* * SHA-1 final digest */ void sha1_finish( sha1_context *ctx, unsigned char output[20] ) { unsigned long last, padn; unsigned long high, low; unsigned char msglen[8]; high = ( ctx->total[0] >> 29 ) | ( ctx->total[1] << 3 ); low = ( ctx->total[0] << 3 ); PUT_ULONG_BE( high, msglen, 0 ); PUT_ULONG_BE( low, msglen, 4 ); last = ctx->total[0] & 0x3F; padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last ); sha1_update( ctx, (const unsigned char *) sha1_padding, padn ); sha1_update( ctx, msglen, 8 ); PUT_ULONG_BE( ctx->state[0], output, 0 ); PUT_ULONG_BE( ctx->state[1], output, 4 ); PUT_ULONG_BE( ctx->state[2], output, 8 ); PUT_ULONG_BE( ctx->state[3], output, 12 ); PUT_ULONG_BE( ctx->state[4], output, 16 ); } /* * output = SHA-1( input buffer ) */ void sha1( const unsigned char *input, size_t ilen, unsigned char output[20] ) { sha1_context ctx; sha1_starts( &ctx ); sha1_update( &ctx, input, ilen ); sha1_finish( &ctx, output ); memset( &ctx, 0, sizeof( sha1_context ) ); } #if defined(POLARSSL_FS_IO) /* * output = SHA-1( file contents ) */ int sha1_file( const char *path, unsigned char output[20] ) { FILE *f; size_t n; sha1_context ctx; unsigned char buf[1024]; if( ( f = fopen( path, "rb" ) ) == NULL ) return( 1 ); sha1_starts( &ctx ); while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 ) sha1_update( &ctx, buf, n ); sha1_finish( &ctx, output ); memset( &ctx, 0, sizeof( sha1_context ) ); if( ferror( f ) != 0 ) { fclose( f ); return( 2 ); } fclose( f ); return( 0 ); } #endif /* POLARSSL_FS_IO */ /* * SHA-1 HMAC context setup */ void sha1_hmac_starts( sha1_context *ctx, const unsigned char *key, size_t keylen ) { size_t i; unsigned char sum[20]; if( keylen > 64 ) { sha1( key, keylen, sum ); keylen = 20; key = sum; } memset( ctx->ipad, 0x36, 64 ); memset( ctx->opad, 0x5C, 64 ); for( i = 0; i < keylen; i++ ) { ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] ); ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] ); } sha1_starts( ctx ); sha1_update( ctx, ctx->ipad, 64 ); memset( sum, 0, sizeof( sum ) ); } /* * SHA-1 HMAC process buffer */ void sha1_hmac_update( sha1_context *ctx, const unsigned char *input, size_t ilen ) { sha1_update( ctx, input, ilen ); } /* * SHA-1 HMAC final digest */ void sha1_hmac_finish( sha1_context *ctx, unsigned char output[20] ) { unsigned char tmpbuf[20]; sha1_finish( ctx, tmpbuf ); sha1_starts( ctx ); sha1_update( ctx, ctx->opad, 64 ); sha1_update( ctx, tmpbuf, 20 ); sha1_finish( ctx, output ); memset( tmpbuf, 0, sizeof( tmpbuf ) ); } /* * SHA1 HMAC context reset */ void sha1_hmac_reset( sha1_context *ctx ) { sha1_starts( ctx ); sha1_update( ctx, ctx->ipad, 64 ); } /* * output = HMAC-SHA-1( hmac key, input buffer ) */ void sha1_hmac( const unsigned char *key, size_t keylen, const unsigned char *input, size_t ilen, unsigned char output[20] ) { sha1_context ctx; sha1_hmac_starts( &ctx, key, keylen ); sha1_hmac_update( &ctx, input, ilen ); sha1_hmac_finish( &ctx, output ); memset( &ctx, 0, sizeof( sha1_context ) ); } #if defined(POLARSSL_SELF_TEST) /* * FIPS-180-1 test vectors */ static unsigned char sha1_test_buf[3][57] = { { "abc" }, { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" }, { "" } }; static const int sha1_test_buflen[3] = { 3, 56, 1000 }; static const unsigned char sha1_test_sum[3][20] = { { 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, 0xBA, 0x3E, 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0, 0xD8, 0x9D }, { 0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E, 0xBA, 0xAE, 0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, 0xE5, 0x46, 0x70, 0xF1 }, { 0x34, 0xAA, 0x97, 0x3C, 0xD4, 0xC4, 0xDA, 0xA4, 0xF6, 0x1E, 0xEB, 0x2B, 0xDB, 0xAD, 0x27, 0x31, 0x65, 0x34, 0x01, 0x6F } }; /* * RFC 2202 test vectors */ static unsigned char sha1_hmac_test_key[7][26] = { { "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B" "\x0B\x0B\x0B\x0B" }, { "Jefe" }, { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" "\xAA\xAA\xAA\xAA" }, { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10" "\x11\x12\x13\x14\x15\x16\x17\x18\x19" }, { "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C" "\x0C\x0C\x0C\x0C" }, { "" }, /* 0xAA 80 times */ { "" } }; static const int sha1_hmac_test_keylen[7] = { 20, 4, 20, 25, 20, 80, 80 }; static unsigned char sha1_hmac_test_buf[7][74] = { { "Hi There" }, { "what do ya want for nothing?" }, { "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" }, { "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" }, { "Test With Truncation" }, { "Test Using Larger Than Block-Size Key - Hash Key First" }, { "Test Using Larger Than Block-Size Key and Larger" " Than One Block-Size Data" } }; static const int sha1_hmac_test_buflen[7] = { 8, 28, 50, 50, 20, 54, 73 }; static const unsigned char sha1_hmac_test_sum[7][20] = { { 0xB6, 0x17, 0x31, 0x86, 0x55, 0x05, 0x72, 0x64, 0xE2, 0x8B, 0xC0, 0xB6, 0xFB, 0x37, 0x8C, 0x8E, 0xF1, 0x46, 0xBE, 0x00 }, { 0xEF, 0xFC, 0xDF, 0x6A, 0xE5, 0xEB, 0x2F, 0xA2, 0xD2, 0x74, 0x16, 0xD5, 0xF1, 0x84, 0xDF, 0x9C, 0x25, 0x9A, 0x7C, 0x79 }, { 0x12, 0x5D, 0x73, 0x42, 0xB9, 0xAC, 0x11, 0xCD, 0x91, 0xA3, 0x9A, 0xF4, 0x8A, 0xA1, 0x7B, 0x4F, 0x63, 0xF1, 0x75, 0xD3 }, { 0x4C, 0x90, 0x07, 0xF4, 0x02, 0x62, 0x50, 0xC6, 0xBC, 0x84, 0x14, 0xF9, 0xBF, 0x50, 0xC8, 0x6C, 0x2D, 0x72, 0x35, 0xDA }, { 0x4C, 0x1A, 0x03, 0x42, 0x4B, 0x55, 0xE0, 0x7F, 0xE7, 0xF2, 0x7B, 0xE1 }, { 0xAA, 0x4A, 0xE5, 0xE1, 0x52, 0x72, 0xD0, 0x0E, 0x95, 0x70, 0x56, 0x37, 0xCE, 0x8A, 0x3B, 0x55, 0xED, 0x40, 0x21, 0x12 }, { 0xE8, 0xE9, 0x9D, 0x0F, 0x45, 0x23, 0x7D, 0x78, 0x6D, 0x6B, 0xBA, 0xA7, 0x96, 0x5C, 0x78, 0x08, 0xBB, 0xFF, 0x1A, 0x91 } }; /* * Checkup routine */ int sha1_self_test( int verbose ) { int i, j, buflen; unsigned char buf[1024]; unsigned char sha1sum[20]; sha1_context ctx; /* * SHA-1 */ for( i = 0; i < 3; i++ ) { if( verbose != 0 ) printf( " SHA-1 test #%d: ", i + 1 ); sha1_starts( &ctx ); if( i == 2 ) { memset( buf, 'a', buflen = 1000 ); for( j = 0; j < 1000; j++ ) sha1_update( &ctx, buf, buflen ); } else sha1_update( &ctx, sha1_test_buf[i], sha1_test_buflen[i] ); sha1_finish( &ctx, sha1sum ); if( memcmp( sha1sum, sha1_test_sum[i], 20 ) != 0 ) { if( verbose != 0 ) printf( "failed\n" ); return( 1 ); } if( verbose != 0 ) printf( "passed\n" ); } if( verbose != 0 ) printf( "\n" ); for( i = 0; i < 7; i++ ) { if( verbose != 0 ) printf( " HMAC-SHA-1 test #%d: ", i + 1 ); if( i == 5 || i == 6 ) { memset( buf, '\xAA', buflen = 80 ); sha1_hmac_starts( &ctx, buf, buflen ); } else sha1_hmac_starts( &ctx, sha1_hmac_test_key[i], sha1_hmac_test_keylen[i] ); sha1_hmac_update( &ctx, sha1_hmac_test_buf[i], sha1_hmac_test_buflen[i] ); sha1_hmac_finish( &ctx, sha1sum ); buflen = ( i == 4 ) ? 12 : 20; if( memcmp( sha1sum, sha1_hmac_test_sum[i], buflen ) != 0 ) { if( verbose != 0 ) printf( "failed\n" ); return( 1 ); } if( verbose != 0 ) printf( "passed\n" ); } if( verbose != 0 ) printf( "\n" ); return( 0 ); } #endif //#endif md5deep-4.2/src/sha1.h000066400000000000000000000101411176640446200145050ustar00rootroot00000000000000/** * \file sha1.h * * \brief SHA-1 cryptographic hash function * * Copyright (C) 2006-2010, Brainspark B.V. * * This file is part of PolarSSL (http://www.polarssl.org) * Lead Maintainer: Paul Bakker * * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef POLARSSL_SHA1_H #define POLARSSL_SHA1_H #include /** * \brief SHA-1 context structure */ typedef struct { unsigned long total[2]; /*!< number of bytes processed */ unsigned long state[5]; /*!< intermediate digest state */ unsigned char buffer[64]; /*!< data block being processed */ unsigned char ipad[64]; /*!< HMAC: inner padding */ unsigned char opad[64]; /*!< HMAC: outer padding */ } sha1_context; #ifdef __cplusplus extern "C" { #endif /** * \brief SHA-1 context setup * * \param ctx context to be initialized */ void sha1_starts( sha1_context *ctx ); /** * \brief SHA-1 process buffer * * \param ctx SHA-1 context * \param input buffer holding the data * \param ilen length of the input data */ void sha1_update( sha1_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief SHA-1 final digest * * \param ctx SHA-1 context * \param output SHA-1 checksum result */ void sha1_finish( sha1_context *ctx, unsigned char output[20] ); /** * \brief Output = SHA-1( input buffer ) * * \param input buffer holding the data * \param ilen length of the input data * \param output SHA-1 checksum result */ void sha1( const unsigned char *input, size_t ilen, unsigned char output[20] ); /** * \brief Output = SHA-1( file contents ) * * \param path input file name * \param output SHA-1 checksum result * * \return 0 if successful, 1 if fopen failed, * or 2 if fread failed */ int sha1_file( const char *path, unsigned char output[20] ); /** * \brief SHA-1 HMAC context setup * * \param ctx HMAC context to be initialized * \param key HMAC secret key * \param keylen length of the HMAC key */ void sha1_hmac_starts( sha1_context *ctx, const unsigned char *key, size_t keylen ); /** * \brief SHA-1 HMAC process buffer * * \param ctx HMAC context * \param input buffer holding the data * \param ilen length of the input data */ void sha1_hmac_update( sha1_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief SHA-1 HMAC final digest * * \param ctx HMAC context * \param output SHA-1 HMAC checksum result */ void sha1_hmac_finish( sha1_context *ctx, unsigned char output[20] ); /** * \brief SHA-1 HMAC context reset * * \param ctx HMAC context to be reset */ void sha1_hmac_reset( sha1_context *ctx ); /** * \brief Output = HMAC-SHA-1( hmac key, input buffer ) * * \param key HMAC secret key * \param keylen length of the HMAC key * \param input buffer holding the data * \param ilen length of the input data * \param output HMAC-SHA-1 result */ void sha1_hmac( const unsigned char *key, size_t keylen, const unsigned char *input, size_t ilen, unsigned char output[20] ); /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed */ int sha1_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* sha1.h */ md5deep-4.2/src/sha256.c000066400000000000000000000250171176640446200146640ustar00rootroot00000000000000/* * FIPS-180-2 compliant SHA-256 implementation * written by Christophe Devine * * This code has been distributed as PUBLIC DOMAIN. * * Although normally licensed under the GPL on the author's web site, * he has given me permission to distribute it as public domain as * part of md5deep. THANK YOU! Software authors are encouraged to * use the GPL'ed version of this code available at: * http://www.cr0.net:8040/code/crypto/sha256/ whenever possible. */ /* $Id: sha256.c 501 2011-09-25 17:12:27Z xchatty $ */ #include #include "sha256.h" void hash_init_sha256(void * ctx) { sha256_starts((context_sha256_t *)ctx); } void hash_update_sha256(void * ctx, const unsigned char *buf, size_t len) { sha256_update((context_sha256_t *)ctx,buf,(uint32_t) len); } void hash_final_sha256(void * ctx, unsigned char *digest) { sha256_finish((context_sha256_t *)ctx, digest); } #define GET_UINT32(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ | ( (uint32_t) (b)[(i) + 1] << 16 ) \ | ( (uint32_t) (b)[(i) + 2] << 8 ) \ | ( (uint32_t) (b)[(i) + 3] ); \ } #define PUT_UINT32(n,b,i) \ { \ (b)[(i) ] = (uint8_t) ( (n) >> 24 ); \ (b)[(i) + 1] = (uint8_t) ( (n) >> 16 ); \ (b)[(i) + 2] = (uint8_t) ( (n) >> 8 ); \ (b)[(i) + 3] = (uint8_t) ( (n) ); \ } void sha256_starts( context_sha256_t *ctx ) { ctx->total[0] = 0; ctx->total[1] = 0; ctx->state[0] = 0x6A09E667; ctx->state[1] = 0xBB67AE85; ctx->state[2] = 0x3C6EF372; ctx->state[3] = 0xA54FF53A; ctx->state[4] = 0x510E527F; ctx->state[5] = 0x9B05688C; ctx->state[6] = 0x1F83D9AB; ctx->state[7] = 0x5BE0CD19; } void sha256_process( context_sha256_t *ctx, const uint8_t data[64] ); void sha256_process( context_sha256_t *ctx, const uint8_t data[64] ) { uint32_t temp1, temp2, W[64]; uint32_t A, B, C, D, E, F, G, H; GET_UINT32( W[0], data, 0 ); GET_UINT32( W[1], data, 4 ); GET_UINT32( W[2], data, 8 ); GET_UINT32( W[3], data, 12 ); GET_UINT32( W[4], data, 16 ); GET_UINT32( W[5], data, 20 ); GET_UINT32( W[6], data, 24 ); GET_UINT32( W[7], data, 28 ); GET_UINT32( W[8], data, 32 ); GET_UINT32( W[9], data, 36 ); GET_UINT32( W[10], data, 40 ); GET_UINT32( W[11], data, 44 ); GET_UINT32( W[12], data, 48 ); GET_UINT32( W[13], data, 52 ); GET_UINT32( W[14], data, 56 ); GET_UINT32( W[15], data, 60 ); #define SHR(x,n) ((x & 0xFFFFFFFF) >> n) #define ROTR(x,n) (SHR(x,n) | (x << (32 - n))) #define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3)) #define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10)) #define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22)) #define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25)) #define F0(x,y,z) ((x & y) | (z & (x | y))) #define F1(x,y,z) (z ^ (x & (y ^ z))) #define R(t) \ ( \ W[t] = S1(W[t - 2]) + W[t - 7] + \ S0(W[t - 15]) + W[t - 16] \ ) #define P(a,b,c,d,e,f,g,h,x,K) \ { \ temp1 = h + S3(e) + F1(e,f,g) + K + x; \ temp2 = S2(a) + F0(a,b,c); \ d += temp1; h = temp1 + temp2; \ } A = ctx->state[0]; B = ctx->state[1]; C = ctx->state[2]; D = ctx->state[3]; E = ctx->state[4]; F = ctx->state[5]; G = ctx->state[6]; H = ctx->state[7]; P( A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98 ); P( H, A, B, C, D, E, F, G, W[ 1], 0x71374491 ); P( G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF ); P( F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5 ); P( E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B ); P( D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1 ); P( C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4 ); P( B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5 ); P( A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98 ); P( H, A, B, C, D, E, F, G, W[ 9], 0x12835B01 ); P( G, H, A, B, C, D, E, F, W[10], 0x243185BE ); P( F, G, H, A, B, C, D, E, W[11], 0x550C7DC3 ); P( E, F, G, H, A, B, C, D, W[12], 0x72BE5D74 ); P( D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE ); P( C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7 ); P( B, C, D, E, F, G, H, A, W[15], 0xC19BF174 ); P( A, B, C, D, E, F, G, H, R(16), 0xE49B69C1 ); P( H, A, B, C, D, E, F, G, R(17), 0xEFBE4786 ); P( G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6 ); P( F, G, H, A, B, C, D, E, R(19), 0x240CA1CC ); P( E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F ); P( D, E, F, G, H, A, B, C, R(21), 0x4A7484AA ); P( C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC ); P( B, C, D, E, F, G, H, A, R(23), 0x76F988DA ); P( A, B, C, D, E, F, G, H, R(24), 0x983E5152 ); P( H, A, B, C, D, E, F, G, R(25), 0xA831C66D ); P( G, H, A, B, C, D, E, F, R(26), 0xB00327C8 ); P( F, G, H, A, B, C, D, E, R(27), 0xBF597FC7 ); P( E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3 ); P( D, E, F, G, H, A, B, C, R(29), 0xD5A79147 ); P( C, D, E, F, G, H, A, B, R(30), 0x06CA6351 ); P( B, C, D, E, F, G, H, A, R(31), 0x14292967 ); P( A, B, C, D, E, F, G, H, R(32), 0x27B70A85 ); P( H, A, B, C, D, E, F, G, R(33), 0x2E1B2138 ); P( G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC ); P( F, G, H, A, B, C, D, E, R(35), 0x53380D13 ); P( E, F, G, H, A, B, C, D, R(36), 0x650A7354 ); P( D, E, F, G, H, A, B, C, R(37), 0x766A0ABB ); P( C, D, E, F, G, H, A, B, R(38), 0x81C2C92E ); P( B, C, D, E, F, G, H, A, R(39), 0x92722C85 ); P( A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1 ); P( H, A, B, C, D, E, F, G, R(41), 0xA81A664B ); P( G, H, A, B, C, D, E, F, R(42), 0xC24B8B70 ); P( F, G, H, A, B, C, D, E, R(43), 0xC76C51A3 ); P( E, F, G, H, A, B, C, D, R(44), 0xD192E819 ); P( D, E, F, G, H, A, B, C, R(45), 0xD6990624 ); P( C, D, E, F, G, H, A, B, R(46), 0xF40E3585 ); P( B, C, D, E, F, G, H, A, R(47), 0x106AA070 ); P( A, B, C, D, E, F, G, H, R(48), 0x19A4C116 ); P( H, A, B, C, D, E, F, G, R(49), 0x1E376C08 ); P( G, H, A, B, C, D, E, F, R(50), 0x2748774C ); P( F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5 ); P( E, F, G, H, A, B, C, D, R(52), 0x391C0CB3 ); P( D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A ); P( C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F ); P( B, C, D, E, F, G, H, A, R(55), 0x682E6FF3 ); P( A, B, C, D, E, F, G, H, R(56), 0x748F82EE ); P( H, A, B, C, D, E, F, G, R(57), 0x78A5636F ); P( G, H, A, B, C, D, E, F, R(58), 0x84C87814 ); P( F, G, H, A, B, C, D, E, R(59), 0x8CC70208 ); P( E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA ); P( D, E, F, G, H, A, B, C, R(61), 0xA4506CEB ); P( C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7 ); P( B, C, D, E, F, G, H, A, R(63), 0xC67178F2 ); ctx->state[0] += A; ctx->state[1] += B; ctx->state[2] += C; ctx->state[3] += D; ctx->state[4] += E; ctx->state[5] += F; ctx->state[6] += G; ctx->state[7] += H; } void sha256_update( context_sha256_t *ctx, const uint8_t *input, uint32_t length ) { uint32_t left, fill; if( ! length ) return; left = ctx->total[0] & 0x3F; fill = 64 - left; ctx->total[0] += length; ctx->total[0] &= 0xFFFFFFFF; if( ctx->total[0] < length ) ctx->total[1]++; if( left && length >= fill ) { memcpy( (void *) (ctx->buffer + left), (const void *) input, fill ); sha256_process( ctx, ctx->buffer ); length -= fill; input += fill; left = 0; } while( length >= 64 ) { sha256_process( ctx, input ); length -= 64; input += 64; } if( length ) { memcpy( (void *) (ctx->buffer + left), (const void *) input, length ); } } static uint8_t sha256_padding[64] = { 0x80, 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, 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 }; void sha256_finish( context_sha256_t *ctx, uint8_t digest[32] ) { uint32_t last, padn; uint32_t high, low; uint8_t msglen[8]; high = ( ctx->total[0] >> 29 ) | ( ctx->total[1] << 3 ); low = ( ctx->total[0] << 3 ); PUT_UINT32( high, msglen, 0 ); PUT_UINT32( low, msglen, 4 ); last = ctx->total[0] & 0x3F; padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last ); sha256_update( ctx, sha256_padding, padn ); sha256_update( ctx, msglen, 8 ); PUT_UINT32( ctx->state[0], digest, 0 ); PUT_UINT32( ctx->state[1], digest, 4 ); PUT_UINT32( ctx->state[2], digest, 8 ); PUT_UINT32( ctx->state[3], digest, 12 ); PUT_UINT32( ctx->state[4], digest, 16 ); PUT_UINT32( ctx->state[5], digest, 20 ); PUT_UINT32( ctx->state[6], digest, 24 ); PUT_UINT32( ctx->state[7], digest, 28 ); } #ifdef TEST #include #include /* * those are the standard FIPS-180-2 test vectors */ static char *msg[] = { "abc", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", NULL }; static char *val[] = { "ba7816bf8f01cfea414140de5dae2223" \ "b00361a396177a9cb410ff61f20015ad", "248d6a61d20638b8e5c026930c3e6039" \ "a33ce45964ff2167f6ecedd419db06c1", "cdc76e5c9914fb9281a1c7e284d73e67" \ "f1809a48a497200e046d39ccc7112cd0" }; int main( int argc, char *argv[] ) { FILE *f; int i, j; char output[65]; context_sha256_t ctx; unsigned char buf[1000]; unsigned char sha256sum[32]; if( argc < 2 ) { printf( "\n SHA-256 Validation Tests:\n\n" ); for( i = 0; i < 3; i++ ) { printf( " Test %d ", i + 1 ); sha256_starts( &ctx ); if( i < 2 ) { sha256_update( &ctx, (uint8_t *) msg[i], strlen( msg[i] ) ); } else { memset( buf, 'a', 1000 ); for( j = 0; j < 1000; j++ ) { sha256_update( &ctx, (uint8_t *) buf, 1000 ); } } sha256_finish( &ctx, sha256sum ); for( j = 0; j < 32; j++ ) { sprintf( output + j * 2, "%02x", sha256sum[j] ); } if( memcmp( output, val[i], 64 ) ) { printf( "failed!\n" ); return( 1 ); } printf( "passed.\n" ); } printf( "\n" ); } else { if( ! ( f = fopen( argv[1], "rb" ) ) ) { perror( "fopen" ); return( 1 ); } sha256_starts( &ctx ); while( ( i = fread( buf, 1, sizeof( buf ), f ) ) > 0 ) { sha256_update( &ctx, buf, i ); } sha256_finish( &ctx, sha256sum ); for( j = 0; j < 32; j++ ) { printf( "%02x", sha256sum[j] ); } printf( " %s\n", argv[1] ); } return( 0 ); } #endif md5deep-4.2/src/sha256.h000066400000000000000000000020051176640446200146610ustar00rootroot00000000000000 /* MD5DEEP - sha256.h * * By Jesse Kornblum * * This is a work of the US Government. In accordance with 17 USC 105, * copyright protection is not available for any work of the US Government. * * 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. * */ /* $Id: sha256.h 501 2011-09-25 17:12:27Z xchatty $ */ #ifndef _SHA256_H #define _SHA256_H #include "common.h" __BEGIN_DECLS typedef struct { uint32_t total[2]; uint32_t state[8]; uint8_t buffer[64]; } context_sha256_t; void sha256_starts( context_sha256_t *ctx ); void sha256_update( context_sha256_t *ctx, const uint8_t *input, uint32_t length ); void sha256_finish( context_sha256_t *ctx, uint8_t digest[32] ); void hash_init_sha256(void * ctx); void hash_update_sha256(void * ctx, const unsigned char *buf, size_t len); void hash_final_sha256(void * ctx, unsigned char *digest); __END_DECLS #endif /* sha256.h */ md5deep-4.2/src/threadpool.cpp000066400000000000000000000145121176640446200163530ustar00rootroot00000000000000/**************************************************************** *** THREADING SUPPORT ****************************************************************/ // $Id: threadpool.cpp 623 2012-02-26 13:56:12Z xchatty $ #include "main.h" #ifdef HAVE_PTHREAD #include "threadpool.h" /** * http://stackoverflow.com/questions/4264460/wait-for-one-of-several-threads-to-finish * Here is the algorithm to run the thread pool with a work queue: * * main: * set freethreads to numthreads * init mutex M, condvars TOMAIN and TOWORKER * start N worker threads * while true: * wait for work item * claim M * while freethreads == 0: * cond-wait TOMAIN, M * put work item in queue * decrement freethreads * cond-signal TOWORKER * release M * * worker: * init * while true: * claim M * while no work in queue: * cond-wait TOWORKER, M * get work to local storage * release M * do work * claim M * increment freethreads * cond-signal TOMAIN * release M */ /* Return the number of CPUs we have on various architectures. * From http://stackoverflow.com/questions/150355/programmatically-find-the-number-of-cores-on-a-machine */ int threadpool::numCPU() { int numCPU=1; // default #ifdef WIN32 SYSTEM_INFO sysinfo; GetSystemInfo( &sysinfo ); numCPU = sysinfo.dwNumberOfProcessors; #endif #if defined(HW_AVAILCPU) && defined(HW_NCPU) int mib[4]; size_t len=sizeof(numCPU); /* set the mib for hw.ncpu */ memset(mib,0,sizeof(mib)); mib[0] = CTL_HW; mib[1] = HW_AVAILCPU; // alternatively, try HW_NCPU; /* get the number of CPUs from the system */ if(sysctl(mib, 2, &numCPU, &len, NULL, 0)){ perror("sysctl"); } if( numCPU <= 1 ) { mib[1] = HW_NCPU; sysctl( mib, 2, &numCPU, &len, NULL, 0 ); if( numCPU < 1 ) { numCPU = 1; } } #endif #ifdef _SC_NPROCESSORS_ONLN numCPU = sysconf(_SC_NPROCESSORS_ONLN); #endif return numCPU; } /* * ERR prints an error message, gets it out and then quits. */ void ERR(int val,const char *msg) __attribute__ ((__noreturn__)); void ERR(int val,const char *msg) { std::cerr << msg << "\n"; std::cerr.flush(); exit(val); } /* Run non-portable pthread win32 startup */ void threadpool::win32_init() { #ifdef WIN32 static bool initialized = false; if(initialized==false){ pthread_win32_process_attach_np(); pthread_win32_thread_attach_np(); initialized=true; } #endif } /** * Create the thread pool. * Each thread has its own feature_recorder_set. * * From the pthreads readme for mingw: * Define PTW32_STATIC_LIB when building your application. Also, your * application must call a two non-portable routines to initialise the * some state on startup and cleanup before exit. One other routine needs * to be called to cleanup after any Win32 threads have called POSIX API * routines. See README.NONPORTABLE or the html reference manual pages for * details on these routines: * * BOOL pthread_win32_process_attach_np (void); * BOOL pthread_win32_process_detach_np (void); * BOOL pthread_win32_thread_attach_np (void); // Currently a no-op * BOOL pthread_win32_thread_detach_np (void); */ threadpool::threadpool(int numworkers_) { numworkers = numworkers_; freethreads = numworkers; if(pthread_cond_init(&TOMAIN,NULL)) ERR(1,"pthread_cond_init #1 failed"); if(pthread_cond_init(&TOWORKER,NULL)) ERR(1,"pthread_cond_init #2 failed"); // lock while I create the threads M.lock(); for(unsigned int i=0;ithread,NULL,worker::start_worker,(void *)w); } M.unlock(); } threadpool::~threadpool() { /* We previously sent the termination message to all of the sub-threads here. * However, their terminating caused wacky problems with the malloc library. * So we just leave them floating around now. Doesn't matter much, because * the main process will die soon enough. */ kill_all_workers(); /* Release our resources */ pthread_cond_destroy(&TOMAIN); pthread_cond_destroy(&TOWORKER); #ifdef WIN32 pthread_win32_process_detach_np(); pthread_win32_thread_detach_np(); #endif } /* * Send the message to kill the workers through */ void threadpool::kill_all_workers() { M.lock(); int worker_count = numworkers; M.unlock(); while(worker_count>0){ this->schedule_work(0); worker_count--; } } /** * work is delivered in sbufs. * This blocks the caller if there are no free workers. */ void threadpool::schedule_work(file_data_hasher_t *fdht) { M.lock(); while(freethreads==0){ // wait until a thread is free (doesn't matter which) if(pthread_cond_wait(&TOMAIN,&M.mutex)){ ERR(1,"threadpool::schedule_work pthread_cond_wait failed"); } } work_queue.push(fdht); freethreads--; pthread_cond_signal(&TOWORKER); M.unlock(); } unsigned int threadpool::get_free_count() { M.lock(); unsigned int ret = freethreads; M.unlock(); return ret; } /* Run the worker. * Each worker runs run... */ void *worker::run() { while(true){ /* Get the lock, then wait for the queue to be empty. * If it is not empty, wait for the lock again. */ master->M.lock(); while(master->work_queue.empty()){ /* I didn't get any work; go back to sleep */ if(pthread_cond_wait(&master->TOWORKER,&master->M.mutex)){ fprintf(stderr,"pthread_cond_wait error=%d\n",errno); exit(1); } } file_data_hasher_t *fdht = master->work_queue.front(); // get the sbuf master->work_queue.pop(); // pop from the list master->M.unlock(); if(fdht==0) { break; // told to exit } do_work(fdht); master->M.lock(); master->freethreads++; pthread_cond_signal(&master->TOMAIN); // tell the master that we are free! master->M.unlock(); } master->M.lock(); master->numworkers--; master->M.unlock(); return 0; } bool threadpool::all_free() { return numworkers == get_free_count(); } unsigned int threadpool::num_workers() { M.lock(); unsigned int ret = numworkers; M.unlock(); return ret; } void threadpool::wait_till_all_free() { while(all_free()==false){ #ifdef HAVE_USLEEP usleep(50); #else sleep(1); #endif } } #endif md5deep-4.2/src/threadpool.h000066400000000000000000000041161176640446200160170ustar00rootroot00000000000000/**************************************************************** *** THREADING SUPPORT ****************************************************************/ #ifndef THREADPOOL_H #define THREADPOOL_H #include #include #include #include #include class mutex_t { public: mutable pthread_mutex_t mutex; mutex_t(){ if(pthread_mutex_init(&mutex,NULL)){ perror("pthread_mutex_init failed"); exit(1); } } ~mutex_t(){ /* * note that we do not destroy the mutex. * On windows this seems to cause problems, so we just don't bother. * * if(pthread_mutex_destroy(&mutex)){ * perror("pthread_mutex_destroy failed"); * exit(1); * } */ } void lock() const{ if(pthread_mutex_lock(&mutex)){ perror("pthread_mutex_lock failed"); exit(1); } } void unlock() const{ if(pthread_mutex_unlock(&mutex)){ perror("pthread_mutex_unlock failed"); exit(1); } } }; class threadpool: public std::vector { public: static void win32_init(); // must be called under win32 to initialize posix threads mutex_t M; // protects the following variables volatile unsigned int numworkers; volatile unsigned int freethreads; pthread_cond_t TOMAIN; pthread_cond_t TOWORKER; std::queue work_queue; unsigned int get_free_count(); void schedule_work(class file_data_hasher_t *); bool all_free() ; void wait_till_all_free(); void kill_all_workers(); static int numCPU(); threadpool(int numworkers); ~threadpool(); unsigned int num_workers(); }; class worker { public: static void * start_worker(void *arg){return ((worker *)arg)->run();}; worker(class threadpool *master_,int workerid_): master(master_),workerid(workerid_){} class threadpool *master; // my master pthread_t thread; // my thread; set when I am created int workerid; // my workerID, numbered 0 through numworkers-1 void *run(); void do_work(class file_data_hasher_t *); // must delete fdht when done }; #endif md5deep-4.2/src/tiger.c000066400000000000000000001304051176640446200147640ustar00rootroot00000000000000/* tiger.c - The TIGER hash function * Copyright (C) 1998, 2001, 2002, 2003, 2010 Free Software Foundation, Inc. * * This file is part of Libgcrypt. * * Libgcrypt 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. * * Libgcrypt 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 program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ /* See http://www.cs.technion.ac.il/~biham/Reports/Tiger/ */ #include "common.h" #include "tiger.h" // Code copied from libgcrypt, version 1.5.0 // http://directory.fsf.org/wiki/Libgcrypt // http://www.gnupg.org/download/#libgcrypt // Test vectors for the "Fixed" Tiger algorithm // Source: http://www.cs.technion.ac.il/~biham/Reports/Tiger/test-vectors-nessie-format.dat // Inserted by Jesse Kornblum // // Set 1, vector# 0: // message="" (empty string) // hash=3293AC630C13F0245F92BBB1766E16167A4E58492DDE73F3 // // Set 1, vector# 1: // message="a" // hash=77BEFBEF2E7EF8AB2EC8F93BF587A7FC613E247F5F247809 // // Set 1, vector# 2: // message="abc" // hash=2AAB1484E8C158F2BFB8C5FF41B57A525129131C957B5F93 // // Set 1, vector# 3: // message="message digest" // hash=D981F8CB78201A950DCF3048751E441C517FCA1AA55A29F6 // // Set 1, vector# 4: // message="abcdefghijklmnopqrstuvwxyz" // hash=1714A472EEE57D30040412BFCC55032A0B11602FF37BEEE9 static uint64_t sbox1[256] = { 0x02aab17cf7e90c5eLL /* 0 */, 0xac424b03e243a8ecLL /* 1 */, 0x72cd5be30dd5fcd3LL /* 2 */, 0x6d019b93f6f97f3aLL /* 3 */, 0xcd9978ffd21f9193LL /* 4 */, 0x7573a1c9708029e2LL /* 5 */, 0xb164326b922a83c3LL /* 6 */, 0x46883eee04915870LL /* 7 */, 0xeaace3057103ece6LL /* 8 */, 0xc54169b808a3535cLL /* 9 */, 0x4ce754918ddec47cLL /* 10 */, 0x0aa2f4dfdc0df40cLL /* 11 */, 0x10b76f18a74dbefaLL /* 12 */, 0xc6ccb6235ad1ab6aLL /* 13 */, 0x13726121572fe2ffLL /* 14 */, 0x1a488c6f199d921eLL /* 15 */, 0x4bc9f9f4da0007caLL /* 16 */, 0x26f5e6f6e85241c7LL /* 17 */, 0x859079dbea5947b6LL /* 18 */, 0x4f1885c5c99e8c92LL /* 19 */, 0xd78e761ea96f864bLL /* 20 */, 0x8e36428c52b5c17dLL /* 21 */, 0x69cf6827373063c1LL /* 22 */, 0xb607c93d9bb4c56eLL /* 23 */, 0x7d820e760e76b5eaLL /* 24 */, 0x645c9cc6f07fdc42LL /* 25 */, 0xbf38a078243342e0LL /* 26 */, 0x5f6b343c9d2e7d04LL /* 27 */, 0xf2c28aeb600b0ec6LL /* 28 */, 0x6c0ed85f7254bcacLL /* 29 */, 0x71592281a4db4fe5LL /* 30 */, 0x1967fa69ce0fed9fLL /* 31 */, 0xfd5293f8b96545dbLL /* 32 */, 0xc879e9d7f2a7600bLL /* 33 */, 0x860248920193194eLL /* 34 */, 0xa4f9533b2d9cc0b3LL /* 35 */, 0x9053836c15957613LL /* 36 */, 0xdb6dcf8afc357bf1LL /* 37 */, 0x18beea7a7a370f57LL /* 38 */, 0x037117ca50b99066LL /* 39 */, 0x6ab30a9774424a35LL /* 40 */, 0xf4e92f02e325249bLL /* 41 */, 0x7739db07061ccae1LL /* 42 */, 0xd8f3b49ceca42a05LL /* 43 */, 0xbd56be3f51382f73LL /* 44 */, 0x45faed5843b0bb28LL /* 45 */, 0x1c813d5c11bf1f83LL /* 46 */, 0x8af0e4b6d75fa169LL /* 47 */, 0x33ee18a487ad9999LL /* 48 */, 0x3c26e8eab1c94410LL /* 49 */, 0xb510102bc0a822f9LL /* 50 */, 0x141eef310ce6123bLL /* 51 */, 0xfc65b90059ddb154LL /* 52 */, 0xe0158640c5e0e607LL /* 53 */, 0x884e079826c3a3cfLL /* 54 */, 0x930d0d9523c535fdLL /* 55 */, 0x35638d754e9a2b00LL /* 56 */, 0x4085fccf40469dd5LL /* 57 */, 0xc4b17ad28be23a4cLL /* 58 */, 0xcab2f0fc6a3e6a2eLL /* 59 */, 0x2860971a6b943fcdLL /* 60 */, 0x3dde6ee212e30446LL /* 61 */, 0x6222f32ae01765aeLL /* 62 */, 0x5d550bb5478308feLL /* 63 */, 0xa9efa98da0eda22aLL /* 64 */, 0xc351a71686c40da7LL /* 65 */, 0x1105586d9c867c84LL /* 66 */, 0xdcffee85fda22853LL /* 67 */, 0xccfbd0262c5eef76LL /* 68 */, 0xbaf294cb8990d201LL /* 69 */, 0xe69464f52afad975LL /* 70 */, 0x94b013afdf133e14LL /* 71 */, 0x06a7d1a32823c958LL /* 72 */, 0x6f95fe5130f61119LL /* 73 */, 0xd92ab34e462c06c0LL /* 74 */, 0xed7bde33887c71d2LL /* 75 */, 0x79746d6e6518393eLL /* 76 */, 0x5ba419385d713329LL /* 77 */, 0x7c1ba6b948a97564LL /* 78 */, 0x31987c197bfdac67LL /* 79 */, 0xde6c23c44b053d02LL /* 80 */, 0x581c49fed002d64dLL /* 81 */, 0xdd474d6338261571LL /* 82 */, 0xaa4546c3e473d062LL /* 83 */, 0x928fce349455f860LL /* 84 */, 0x48161bbacaab94d9LL /* 85 */, 0x63912430770e6f68LL /* 86 */, 0x6ec8a5e602c6641cLL /* 87 */, 0x87282515337ddd2bLL /* 88 */, 0x2cda6b42034b701bLL /* 89 */, 0xb03d37c181cb096dLL /* 90 */, 0xe108438266c71c6fLL /* 91 */, 0x2b3180c7eb51b255LL /* 92 */, 0xdf92b82f96c08bbcLL /* 93 */, 0x5c68c8c0a632f3baLL /* 94 */, 0x5504cc861c3d0556LL /* 95 */, 0xabbfa4e55fb26b8fLL /* 96 */, 0x41848b0ab3baceb4LL /* 97 */, 0xb334a273aa445d32LL /* 98 */, 0xbca696f0a85ad881LL /* 99 */, 0x24f6ec65b528d56cLL /* 100 */, 0x0ce1512e90f4524aLL /* 101 */, 0x4e9dd79d5506d35aLL /* 102 */, 0x258905fac6ce9779LL /* 103 */, 0x2019295b3e109b33LL /* 104 */, 0xf8a9478b73a054ccLL /* 105 */, 0x2924f2f934417eb0LL /* 106 */, 0x3993357d536d1bc4LL /* 107 */, 0x38a81ac21db6ff8bLL /* 108 */, 0x47c4fbf17d6016bfLL /* 109 */, 0x1e0faadd7667e3f5LL /* 110 */, 0x7abcff62938beb96LL /* 111 */, 0xa78dad948fc179c9LL /* 112 */, 0x8f1f98b72911e50dLL /* 113 */, 0x61e48eae27121a91LL /* 114 */, 0x4d62f7ad31859808LL /* 115 */, 0xeceba345ef5ceaebLL /* 116 */, 0xf5ceb25ebc9684ceLL /* 117 */, 0xf633e20cb7f76221LL /* 118 */, 0xa32cdf06ab8293e4LL /* 119 */, 0x985a202ca5ee2ca4LL /* 120 */, 0xcf0b8447cc8a8fb1LL /* 121 */, 0x9f765244979859a3LL /* 122 */, 0xa8d516b1a1240017LL /* 123 */, 0x0bd7ba3ebb5dc726LL /* 124 */, 0xe54bca55b86adb39LL /* 125 */, 0x1d7a3afd6c478063LL /* 126 */, 0x519ec608e7669eddLL /* 127 */, 0x0e5715a2d149aa23LL /* 128 */, 0x177d4571848ff194LL /* 129 */, 0xeeb55f3241014c22LL /* 130 */, 0x0f5e5ca13a6e2ec2LL /* 131 */, 0x8029927b75f5c361LL /* 132 */, 0xad139fabc3d6e436LL /* 133 */, 0x0d5df1a94ccf402fLL /* 134 */, 0x3e8bd948bea5dfc8LL /* 135 */, 0xa5a0d357bd3ff77eLL /* 136 */, 0xa2d12e251f74f645LL /* 137 */, 0x66fd9e525e81a082LL /* 138 */, 0x2e0c90ce7f687a49LL /* 139 */, 0xc2e8bcbeba973bc5LL /* 140 */, 0x000001bce509745fLL /* 141 */, 0x423777bbe6dab3d6LL /* 142 */, 0xd1661c7eaef06eb5LL /* 143 */, 0xa1781f354daacfd8LL /* 144 */, 0x2d11284a2b16affcLL /* 145 */, 0xf1fc4f67fa891d1fLL /* 146 */, 0x73ecc25dcb920adaLL /* 147 */, 0xae610c22c2a12651LL /* 148 */, 0x96e0a810d356b78aLL /* 149 */, 0x5a9a381f2fe7870fLL /* 150 */, 0xd5ad62ede94e5530LL /* 151 */, 0xd225e5e8368d1427LL /* 152 */, 0x65977b70c7af4631LL /* 153 */, 0x99f889b2de39d74fLL /* 154 */, 0x233f30bf54e1d143LL /* 155 */, 0x9a9675d3d9a63c97LL /* 156 */, 0x5470554ff334f9a8LL /* 157 */, 0x166acb744a4f5688LL /* 158 */, 0x70c74caab2e4aeadLL /* 159 */, 0xf0d091646f294d12LL /* 160 */, 0x57b82a89684031d1LL /* 161 */, 0xefd95a5a61be0b6bLL /* 162 */, 0x2fbd12e969f2f29aLL /* 163 */, 0x9bd37013feff9fe8LL /* 164 */, 0x3f9b0404d6085a06LL /* 165 */, 0x4940c1f3166cfe15LL /* 166 */, 0x09542c4dcdf3defbLL /* 167 */, 0xb4c5218385cd5ce3LL /* 168 */, 0xc935b7dc4462a641LL /* 169 */, 0x3417f8a68ed3b63fLL /* 170 */, 0xb80959295b215b40LL /* 171 */, 0xf99cdaef3b8c8572LL /* 172 */, 0x018c0614f8fcb95dLL /* 173 */, 0x1b14accd1a3acdf3LL /* 174 */, 0x84d471f200bb732dLL /* 175 */, 0xc1a3110e95e8da16LL /* 176 */, 0x430a7220bf1a82b8LL /* 177 */, 0xb77e090d39df210eLL /* 178 */, 0x5ef4bd9f3cd05e9dLL /* 179 */, 0x9d4ff6da7e57a444LL /* 180 */, 0xda1d60e183d4a5f8LL /* 181 */, 0xb287c38417998e47LL /* 182 */, 0xfe3edc121bb31886LL /* 183 */, 0xc7fe3ccc980ccbefLL /* 184 */, 0xe46fb590189bfd03LL /* 185 */, 0x3732fd469a4c57dcLL /* 186 */, 0x7ef700a07cf1ad65LL /* 187 */, 0x59c64468a31d8859LL /* 188 */, 0x762fb0b4d45b61f6LL /* 189 */, 0x155baed099047718LL /* 190 */, 0x68755e4c3d50baa6LL /* 191 */, 0xe9214e7f22d8b4dfLL /* 192 */, 0x2addbf532eac95f4LL /* 193 */, 0x32ae3909b4bd0109LL /* 194 */, 0x834df537b08e3450LL /* 195 */, 0xfa209da84220728dLL /* 196 */, 0x9e691d9b9efe23f7LL /* 197 */, 0x0446d288c4ae8d7fLL /* 198 */, 0x7b4cc524e169785bLL /* 199 */, 0x21d87f0135ca1385LL /* 200 */, 0xcebb400f137b8aa5LL /* 201 */, 0x272e2b66580796beLL /* 202 */, 0x3612264125c2b0deLL /* 203 */, 0x057702bdad1efbb2LL /* 204 */, 0xd4babb8eacf84be9LL /* 205 */, 0x91583139641bc67bLL /* 206 */, 0x8bdc2de08036e024LL /* 207 */, 0x603c8156f49f68edLL /* 208 */, 0xf7d236f7dbef5111LL /* 209 */, 0x9727c4598ad21e80LL /* 210 */, 0xa08a0896670a5fd7LL /* 211 */, 0xcb4a8f4309eba9cbLL /* 212 */, 0x81af564b0f7036a1LL /* 213 */, 0xc0b99aa778199abdLL /* 214 */, 0x959f1ec83fc8e952LL /* 215 */, 0x8c505077794a81b9LL /* 216 */, 0x3acaaf8f056338f0LL /* 217 */, 0x07b43f50627a6778LL /* 218 */, 0x4a44ab49f5eccc77LL /* 219 */, 0x3bc3d6e4b679ee98LL /* 220 */, 0x9cc0d4d1cf14108cLL /* 221 */, 0x4406c00b206bc8a0LL /* 222 */, 0x82a18854c8d72d89LL /* 223 */, 0x67e366b35c3c432cLL /* 224 */, 0xb923dd61102b37f2LL /* 225 */, 0x56ab2779d884271dLL /* 226 */, 0xbe83e1b0ff1525afLL /* 227 */, 0xfb7c65d4217e49a9LL /* 228 */, 0x6bdbe0e76d48e7d4LL /* 229 */, 0x08df828745d9179eLL /* 230 */, 0x22ea6a9add53bd34LL /* 231 */, 0xe36e141c5622200aLL /* 232 */, 0x7f805d1b8cb750eeLL /* 233 */, 0xafe5c7a59f58e837LL /* 234 */, 0xe27f996a4fb1c23cLL /* 235 */, 0xd3867dfb0775f0d0LL /* 236 */, 0xd0e673de6e88891aLL /* 237 */, 0x123aeb9eafb86c25LL /* 238 */, 0x30f1d5d5c145b895LL /* 239 */, 0xbb434a2dee7269e7LL /* 240 */, 0x78cb67ecf931fa38LL /* 241 */, 0xf33b0372323bbf9cLL /* 242 */, 0x52d66336fb279c74LL /* 243 */, 0x505f33ac0afb4eaaLL /* 244 */, 0xe8a5cd99a2cce187LL /* 245 */, 0x534974801e2d30bbLL /* 246 */, 0x8d2d5711d5876d90LL /* 247 */, 0x1f1a412891bc038eLL /* 248 */, 0xd6e2e71d82e56648LL /* 249 */, 0x74036c3a497732b7LL /* 250 */, 0x89b67ed96361f5abLL /* 251 */, 0xffed95d8f1ea02a2LL /* 252 */, 0xe72b3bd61464d43dLL /* 253 */, 0xa6300f170bdc4820LL /* 254 */, 0xebc18760ed78a77aLL /* 255 */ }; static uint64_t sbox2[256] = { 0xe6a6be5a05a12138LL /* 256 */, 0xb5a122a5b4f87c98LL /* 257 */, 0x563c6089140b6990LL /* 258 */, 0x4c46cb2e391f5dd5LL /* 259 */, 0xd932addbc9b79434LL /* 260 */, 0x08ea70e42015aff5LL /* 261 */, 0xd765a6673e478cf1LL /* 262 */, 0xc4fb757eab278d99LL /* 263 */, 0xdf11c6862d6e0692LL /* 264 */, 0xddeb84f10d7f3b16LL /* 265 */, 0x6f2ef604a665ea04LL /* 266 */, 0x4a8e0f0ff0e0dfb3LL /* 267 */, 0xa5edeef83dbcba51LL /* 268 */, 0xfc4f0a2a0ea4371eLL /* 269 */, 0xe83e1da85cb38429LL /* 270 */, 0xdc8ff882ba1b1ce2LL /* 271 */, 0xcd45505e8353e80dLL /* 272 */, 0x18d19a00d4db0717LL /* 273 */, 0x34a0cfeda5f38101LL /* 274 */, 0x0be77e518887caf2LL /* 275 */, 0x1e341438b3c45136LL /* 276 */, 0xe05797f49089ccf9LL /* 277 */, 0xffd23f9df2591d14LL /* 278 */, 0x543dda228595c5cdLL /* 279 */, 0x661f81fd99052a33LL /* 280 */, 0x8736e641db0f7b76LL /* 281 */, 0x15227725418e5307LL /* 282 */, 0xe25f7f46162eb2faLL /* 283 */, 0x48a8b2126c13d9feLL /* 284 */, 0xafdc541792e76eeaLL /* 285 */, 0x03d912bfc6d1898fLL /* 286 */, 0x31b1aafa1b83f51bLL /* 287 */, 0xf1ac2796e42ab7d9LL /* 288 */, 0x40a3a7d7fcd2ebacLL /* 289 */, 0x1056136d0afbbcc5LL /* 290 */, 0x7889e1dd9a6d0c85LL /* 291 */, 0xd33525782a7974aaLL /* 292 */, 0xa7e25d09078ac09bLL /* 293 */, 0xbd4138b3eac6edd0LL /* 294 */, 0x920abfbe71eb9e70LL /* 295 */, 0xa2a5d0f54fc2625cLL /* 296 */, 0xc054e36b0b1290a3LL /* 297 */, 0xf6dd59ff62fe932bLL /* 298 */, 0x3537354511a8ac7dLL /* 299 */, 0xca845e9172fadcd4LL /* 300 */, 0x84f82b60329d20dcLL /* 301 */, 0x79c62ce1cd672f18LL /* 302 */, 0x8b09a2add124642cLL /* 303 */, 0xd0c1e96a19d9e726LL /* 304 */, 0x5a786a9b4ba9500cLL /* 305 */, 0x0e020336634c43f3LL /* 306 */, 0xc17b474aeb66d822LL /* 307 */, 0x6a731ae3ec9baac2LL /* 308 */, 0x8226667ae0840258LL /* 309 */, 0x67d4567691caeca5LL /* 310 */, 0x1d94155c4875adb5LL /* 311 */, 0x6d00fd985b813fdfLL /* 312 */, 0x51286efcb774cd06LL /* 313 */, 0x5e8834471fa744afLL /* 314 */, 0xf72ca0aee761ae2eLL /* 315 */, 0xbe40e4cdaee8e09aLL /* 316 */, 0xe9970bbb5118f665LL /* 317 */, 0x726e4beb33df1964LL /* 318 */, 0x703b000729199762LL /* 319 */, 0x4631d816f5ef30a7LL /* 320 */, 0xb880b5b51504a6beLL /* 321 */, 0x641793c37ed84b6cLL /* 322 */, 0x7b21ed77f6e97d96LL /* 323 */, 0x776306312ef96b73LL /* 324 */, 0xae528948e86ff3f4LL /* 325 */, 0x53dbd7f286a3f8f8LL /* 326 */, 0x16cadce74cfc1063LL /* 327 */, 0x005c19bdfa52c6ddLL /* 328 */, 0x68868f5d64d46ad3LL /* 329 */, 0x3a9d512ccf1e186aLL /* 330 */, 0x367e62c2385660aeLL /* 331 */, 0xe359e7ea77dcb1d7LL /* 332 */, 0x526c0773749abe6eLL /* 333 */, 0x735ae5f9d09f734bLL /* 334 */, 0x493fc7cc8a558ba8LL /* 335 */, 0xb0b9c1533041ab45LL /* 336 */, 0x321958ba470a59bdLL /* 337 */, 0x852db00b5f46c393LL /* 338 */, 0x91209b2bd336b0e5LL /* 339 */, 0x6e604f7d659ef19fLL /* 340 */, 0xb99a8ae2782ccb24LL /* 341 */, 0xccf52ab6c814c4c7LL /* 342 */, 0x4727d9afbe11727bLL /* 343 */, 0x7e950d0c0121b34dLL /* 344 */, 0x756f435670ad471fLL /* 345 */, 0xf5add442615a6849LL /* 346 */, 0x4e87e09980b9957aLL /* 347 */, 0x2acfa1df50aee355LL /* 348 */, 0xd898263afd2fd556LL /* 349 */, 0xc8f4924dd80c8fd6LL /* 350 */, 0xcf99ca3d754a173aLL /* 351 */, 0xfe477bacaf91bf3cLL /* 352 */, 0xed5371f6d690c12dLL /* 353 */, 0x831a5c285e687094LL /* 354 */, 0xc5d3c90a3708a0a4LL /* 355 */, 0x0f7f903717d06580LL /* 356 */, 0x19f9bb13b8fdf27fLL /* 357 */, 0xb1bd6f1b4d502843LL /* 358 */, 0x1c761ba38fff4012LL /* 359 */, 0x0d1530c4e2e21f3bLL /* 360 */, 0x8943ce69a7372c8aLL /* 361 */, 0xe5184e11feb5ce66LL /* 362 */, 0x618bdb80bd736621LL /* 363 */, 0x7d29bad68b574d0bLL /* 364 */, 0x81bb613e25e6fe5bLL /* 365 */, 0x071c9c10bc07913fLL /* 366 */, 0xc7beeb7909ac2d97LL /* 367 */, 0xc3e58d353bc5d757LL /* 368 */, 0xeb017892f38f61e8LL /* 369 */, 0xd4effb9c9b1cc21aLL /* 370 */, 0x99727d26f494f7abLL /* 371 */, 0xa3e063a2956b3e03LL /* 372 */, 0x9d4a8b9a4aa09c30LL /* 373 */, 0x3f6ab7d500090fb4LL /* 374 */, 0x9cc0f2a057268ac0LL /* 375 */, 0x3dee9d2dedbf42d1LL /* 376 */, 0x330f49c87960a972LL /* 377 */, 0xc6b2720287421b41LL /* 378 */, 0x0ac59ec07c00369cLL /* 379 */, 0xef4eac49cb353425LL /* 380 */, 0xf450244eef0129d8LL /* 381 */, 0x8acc46e5caf4deb6LL /* 382 */, 0x2ffeab63989263f7LL /* 383 */, 0x8f7cb9fe5d7a4578LL /* 384 */, 0x5bd8f7644e634635LL /* 385 */, 0x427a7315bf2dc900LL /* 386 */, 0x17d0c4aa2125261cLL /* 387 */, 0x3992486c93518e50LL /* 388 */, 0xb4cbfee0a2d7d4c3LL /* 389 */, 0x7c75d6202c5ddd8dLL /* 390 */, 0xdbc295d8e35b6c61LL /* 391 */, 0x60b369d302032b19LL /* 392 */, 0xce42685fdce44132LL /* 393 */, 0x06f3ddb9ddf65610LL /* 394 */, 0x8ea4d21db5e148f0LL /* 395 */, 0x20b0fce62fcd496fLL /* 396 */, 0x2c1b912358b0ee31LL /* 397 */, 0xb28317b818f5a308LL /* 398 */, 0xa89c1e189ca6d2cfLL /* 399 */, 0x0c6b18576aaadbc8LL /* 400 */, 0xb65deaa91299fae3LL /* 401 */, 0xfb2b794b7f1027e7LL /* 402 */, 0x04e4317f443b5bebLL /* 403 */, 0x4b852d325939d0a6LL /* 404 */, 0xd5ae6beefb207ffcLL /* 405 */, 0x309682b281c7d374LL /* 406 */, 0xbae309a194c3b475LL /* 407 */, 0x8cc3f97b13b49f05LL /* 408 */, 0x98a9422ff8293967LL /* 409 */, 0x244b16b01076ff7cLL /* 410 */, 0xf8bf571c663d67eeLL /* 411 */, 0x1f0d6758eee30da1LL /* 412 */, 0xc9b611d97adeb9b7LL /* 413 */, 0xb7afd5887b6c57a2LL /* 414 */, 0x6290ae846b984fe1LL /* 415 */, 0x94df4cdeacc1a5fdLL /* 416 */, 0x058a5bd1c5483affLL /* 417 */, 0x63166cc142ba3c37LL /* 418 */, 0x8db8526eb2f76f40LL /* 419 */, 0xe10880036f0d6d4eLL /* 420 */, 0x9e0523c9971d311dLL /* 421 */, 0x45ec2824cc7cd691LL /* 422 */, 0x575b8359e62382c9LL /* 423 */, 0xfa9e400dc4889995LL /* 424 */, 0xd1823ecb45721568LL /* 425 */, 0xdafd983b8206082fLL /* 426 */, 0xaa7d29082386a8cbLL /* 427 */, 0x269fcd4403b87588LL /* 428 */, 0x1b91f5f728bdd1e0LL /* 429 */, 0xe4669f39040201f6LL /* 430 */, 0x7a1d7c218cf04adeLL /* 431 */, 0x65623c29d79ce5ceLL /* 432 */, 0x2368449096c00bb1LL /* 433 */, 0xab9bf1879da503baLL /* 434 */, 0xbc23ecb1a458058eLL /* 435 */, 0x9a58df01bb401eccLL /* 436 */, 0xa070e868a85f143dLL /* 437 */, 0x4ff188307df2239eLL /* 438 */, 0x14d565b41a641183LL /* 439 */, 0xee13337452701602LL /* 440 */, 0x950e3dcf3f285e09LL /* 441 */, 0x59930254b9c80953LL /* 442 */, 0x3bf299408930da6dLL /* 443 */, 0xa955943f53691387LL /* 444 */, 0xa15edecaa9cb8784LL /* 445 */, 0x29142127352be9a0LL /* 446 */, 0x76f0371fff4e7afbLL /* 447 */, 0x0239f450274f2228LL /* 448 */, 0xbb073af01d5e868bLL /* 449 */, 0xbfc80571c10e96c1LL /* 450 */, 0xd267088568222e23LL /* 451 */, 0x9671a3d48e80b5b0LL /* 452 */, 0x55b5d38ae193bb81LL /* 453 */, 0x693ae2d0a18b04b8LL /* 454 */, 0x5c48b4ecadd5335fLL /* 455 */, 0xfd743b194916a1caLL /* 456 */, 0x2577018134be98c4LL /* 457 */, 0xe77987e83c54a4adLL /* 458 */, 0x28e11014da33e1b9LL /* 459 */, 0x270cc59e226aa213LL /* 460 */, 0x71495f756d1a5f60LL /* 461 */, 0x9be853fb60afef77LL /* 462 */, 0xadc786a7f7443dbfLL /* 463 */, 0x0904456173b29a82LL /* 464 */, 0x58bc7a66c232bd5eLL /* 465 */, 0xf306558c673ac8b2LL /* 466 */, 0x41f639c6b6c9772aLL /* 467 */, 0x216defe99fda35daLL /* 468 */, 0x11640cc71c7be615LL /* 469 */, 0x93c43694565c5527LL /* 470 */, 0xea038e6246777839LL /* 471 */, 0xf9abf3ce5a3e2469LL /* 472 */, 0x741e768d0fd312d2LL /* 473 */, 0x0144b883ced652c6LL /* 474 */, 0xc20b5a5ba33f8552LL /* 475 */, 0x1ae69633c3435a9dLL /* 476 */, 0x97a28ca4088cfdecLL /* 477 */, 0x8824a43c1e96f420LL /* 478 */, 0x37612fa66eeea746LL /* 479 */, 0x6b4cb165f9cf0e5aLL /* 480 */, 0x43aa1c06a0abfb4aLL /* 481 */, 0x7f4dc26ff162796bLL /* 482 */, 0x6cbacc8e54ed9b0fLL /* 483 */, 0xa6b7ffefd2bb253eLL /* 484 */, 0x2e25bc95b0a29d4fLL /* 485 */, 0x86d6a58bdef1388cLL /* 486 */, 0xded74ac576b6f054LL /* 487 */, 0x8030bdbc2b45805dLL /* 488 */, 0x3c81af70e94d9289LL /* 489 */, 0x3eff6dda9e3100dbLL /* 490 */, 0xb38dc39fdfcc8847LL /* 491 */, 0x123885528d17b87eLL /* 492 */, 0xf2da0ed240b1b642LL /* 493 */, 0x44cefadcd54bf9a9LL /* 494 */, 0x1312200e433c7ee6LL /* 495 */, 0x9ffcc84f3a78c748LL /* 496 */, 0xf0cd1f72248576bbLL /* 497 */, 0xec6974053638cfe4LL /* 498 */, 0x2ba7b67c0cec4e4cLL /* 499 */, 0xac2f4df3e5ce32edLL /* 500 */, 0xcb33d14326ea4c11LL /* 501 */, 0xa4e9044cc77e58bcLL /* 502 */, 0x5f513293d934fcefLL /* 503 */, 0x5dc9645506e55444LL /* 504 */, 0x50de418f317de40aLL /* 505 */, 0x388cb31a69dde259LL /* 506 */, 0x2db4a83455820a86LL /* 507 */, 0x9010a91e84711ae9LL /* 508 */, 0x4df7f0b7b1498371LL /* 509 */, 0xd62a2eabc0977179LL /* 510 */, 0x22fac097aa8d5c0eLL /* 511 */ }; static uint64_t sbox3[256] = { 0xf49fcc2ff1daf39bLL /* 512 */, 0x487fd5c66ff29281LL /* 513 */, 0xe8a30667fcdca83fLL /* 514 */, 0x2c9b4be3d2fcce63LL /* 515 */, 0xda3ff74b93fbbbc2LL /* 516 */, 0x2fa165d2fe70ba66LL /* 517 */, 0xa103e279970e93d4LL /* 518 */, 0xbecdec77b0e45e71LL /* 519 */, 0xcfb41e723985e497LL /* 520 */, 0xb70aaa025ef75017LL /* 521 */, 0xd42309f03840b8e0LL /* 522 */, 0x8efc1ad035898579LL /* 523 */, 0x96c6920be2b2abc5LL /* 524 */, 0x66af4163375a9172LL /* 525 */, 0x2174abdcca7127fbLL /* 526 */, 0xb33ccea64a72ff41LL /* 527 */, 0xf04a4933083066a5LL /* 528 */, 0x8d970acdd7289af5LL /* 529 */, 0x8f96e8e031c8c25eLL /* 530 */, 0xf3fec02276875d47LL /* 531 */, 0xec7bf310056190ddLL /* 532 */, 0xf5adb0aebb0f1491LL /* 533 */, 0x9b50f8850fd58892LL /* 534 */, 0x4975488358b74de8LL /* 535 */, 0xa3354ff691531c61LL /* 536 */, 0x0702bbe481d2c6eeLL /* 537 */, 0x89fb24057deded98LL /* 538 */, 0xac3075138596e902LL /* 539 */, 0x1d2d3580172772edLL /* 540 */, 0xeb738fc28e6bc30dLL /* 541 */, 0x5854ef8f63044326LL /* 542 */, 0x9e5c52325add3bbeLL /* 543 */, 0x90aa53cf325c4623LL /* 544 */, 0xc1d24d51349dd067LL /* 545 */, 0x2051cfeea69ea624LL /* 546 */, 0x13220f0a862e7e4fLL /* 547 */, 0xce39399404e04864LL /* 548 */, 0xd9c42ca47086fcb7LL /* 549 */, 0x685ad2238a03e7ccLL /* 550 */, 0x066484b2ab2ff1dbLL /* 551 */, 0xfe9d5d70efbf79ecLL /* 552 */, 0x5b13b9dd9c481854LL /* 553 */, 0x15f0d475ed1509adLL /* 554 */, 0x0bebcd060ec79851LL /* 555 */, 0xd58c6791183ab7f8LL /* 556 */, 0xd1187c5052f3eee4LL /* 557 */, 0xc95d1192e54e82ffLL /* 558 */, 0x86eea14cb9ac6ca2LL /* 559 */, 0x3485beb153677d5dLL /* 560 */, 0xdd191d781f8c492aLL /* 561 */, 0xf60866baa784ebf9LL /* 562 */, 0x518f643ba2d08c74LL /* 563 */, 0x8852e956e1087c22LL /* 564 */, 0xa768cb8dc410ae8dLL /* 565 */, 0x38047726bfec8e1aLL /* 566 */, 0xa67738b4cd3b45aaLL /* 567 */, 0xad16691cec0dde19LL /* 568 */, 0xc6d4319380462e07LL /* 569 */, 0xc5a5876d0ba61938LL /* 570 */, 0x16b9fa1fa58fd840LL /* 571 */, 0x188ab1173ca74f18LL /* 572 */, 0xabda2f98c99c021fLL /* 573 */, 0x3e0580ab134ae816LL /* 574 */, 0x5f3b05b773645abbLL /* 575 */, 0x2501a2be5575f2f6LL /* 576 */, 0x1b2f74004e7e8ba9LL /* 577 */, 0x1cd7580371e8d953LL /* 578 */, 0x7f6ed89562764e30LL /* 579 */, 0xb15926ff596f003dLL /* 580 */, 0x9f65293da8c5d6b9LL /* 581 */, 0x6ecef04dd690f84cLL /* 582 */, 0x4782275fff33af88LL /* 583 */, 0xe41433083f820801LL /* 584 */, 0xfd0dfe409a1af9b5LL /* 585 */, 0x4325a3342cdb396bLL /* 586 */, 0x8ae77e62b301b252LL /* 587 */, 0xc36f9e9f6655615aLL /* 588 */, 0x85455a2d92d32c09LL /* 589 */, 0xf2c7dea949477485LL /* 590 */, 0x63cfb4c133a39ebaLL /* 591 */, 0x83b040cc6ebc5462LL /* 592 */, 0x3b9454c8fdb326b0LL /* 593 */, 0x56f56a9e87ffd78cLL /* 594 */, 0x2dc2940d99f42bc6LL /* 595 */, 0x98f7df096b096e2dLL /* 596 */, 0x19a6e01e3ad852bfLL /* 597 */, 0x42a99ccbdbd4b40bLL /* 598 */, 0xa59998af45e9c559LL /* 599 */, 0x366295e807d93186LL /* 600 */, 0x6b48181bfaa1f773LL /* 601 */, 0x1fec57e2157a0a1dLL /* 602 */, 0x4667446af6201ad5LL /* 603 */, 0xe615ebcacfb0f075LL /* 604 */, 0xb8f31f4f68290778LL /* 605 */, 0x22713ed6ce22d11eLL /* 606 */, 0x3057c1a72ec3c93bLL /* 607 */, 0xcb46acc37c3f1f2fLL /* 608 */, 0xdbb893fd02aaf50eLL /* 609 */, 0x331fd92e600b9fcfLL /* 610 */, 0xa498f96148ea3ad6LL /* 611 */, 0xa8d8426e8b6a83eaLL /* 612 */, 0xa089b274b7735cdcLL /* 613 */, 0x87f6b3731e524a11LL /* 614 */, 0x118808e5cbc96749LL /* 615 */, 0x9906e4c7b19bd394LL /* 616 */, 0xafed7f7e9b24a20cLL /* 617 */, 0x6509eadeeb3644a7LL /* 618 */, 0x6c1ef1d3e8ef0edeLL /* 619 */, 0xb9c97d43e9798fb4LL /* 620 */, 0xa2f2d784740c28a3LL /* 621 */, 0x7b8496476197566fLL /* 622 */, 0x7a5be3e6b65f069dLL /* 623 */, 0xf96330ed78be6f10LL /* 624 */, 0xeee60de77a076a15LL /* 625 */, 0x2b4bee4aa08b9bd0LL /* 626 */, 0x6a56a63ec7b8894eLL /* 627 */, 0x02121359ba34fef4LL /* 628 */, 0x4cbf99f8283703fcLL /* 629 */, 0x398071350caf30c8LL /* 630 */, 0xd0a77a89f017687aLL /* 631 */, 0xf1c1a9eb9e423569LL /* 632 */, 0x8c7976282dee8199LL /* 633 */, 0x5d1737a5dd1f7abdLL /* 634 */, 0x4f53433c09a9fa80LL /* 635 */, 0xfa8b0c53df7ca1d9LL /* 636 */, 0x3fd9dcbc886ccb77LL /* 637 */, 0xc040917ca91b4720LL /* 638 */, 0x7dd00142f9d1dcdfLL /* 639 */, 0x8476fc1d4f387b58LL /* 640 */, 0x23f8e7c5f3316503LL /* 641 */, 0x032a2244e7e37339LL /* 642 */, 0x5c87a5d750f5a74bLL /* 643 */, 0x082b4cc43698992eLL /* 644 */, 0xdf917becb858f63cLL /* 645 */, 0x3270b8fc5bf86ddaLL /* 646 */, 0x10ae72bb29b5dd76LL /* 647 */, 0x576ac94e7700362bLL /* 648 */, 0x1ad112dac61efb8fLL /* 649 */, 0x691bc30ec5faa427LL /* 650 */, 0xff246311cc327143LL /* 651 */, 0x3142368e30e53206LL /* 652 */, 0x71380e31e02ca396LL /* 653 */, 0x958d5c960aad76f1LL /* 654 */, 0xf8d6f430c16da536LL /* 655 */, 0xc8ffd13f1be7e1d2LL /* 656 */, 0x7578ae66004ddbe1LL /* 657 */, 0x05833f01067be646LL /* 658 */, 0xbb34b5ad3bfe586dLL /* 659 */, 0x095f34c9a12b97f0LL /* 660 */, 0x247ab64525d60ca8LL /* 661 */, 0xdcdbc6f3017477d1LL /* 662 */, 0x4a2e14d4decad24dLL /* 663 */, 0xbdb5e6d9be0a1eebLL /* 664 */, 0x2a7e70f7794301abLL /* 665 */, 0xdef42d8a270540fdLL /* 666 */, 0x01078ec0a34c22c1LL /* 667 */, 0xe5de511af4c16387LL /* 668 */, 0x7ebb3a52bd9a330aLL /* 669 */, 0x77697857aa7d6435LL /* 670 */, 0x004e831603ae4c32LL /* 671 */, 0xe7a21020ad78e312LL /* 672 */, 0x9d41a70c6ab420f2LL /* 673 */, 0x28e06c18ea1141e6LL /* 674 */, 0xd2b28cbd984f6b28LL /* 675 */, 0x26b75f6c446e9d83LL /* 676 */, 0xba47568c4d418d7fLL /* 677 */, 0xd80badbfe6183d8eLL /* 678 */, 0x0e206d7f5f166044LL /* 679 */, 0xe258a43911cbca3eLL /* 680 */, 0x723a1746b21dc0bcLL /* 681 */, 0xc7caa854f5d7cdd3LL /* 682 */, 0x7cac32883d261d9cLL /* 683 */, 0x7690c26423ba942cLL /* 684 */, 0x17e55524478042b8LL /* 685 */, 0xe0be477656a2389fLL /* 686 */, 0x4d289b5e67ab2da0LL /* 687 */, 0x44862b9c8fbbfd31LL /* 688 */, 0xb47cc8049d141365LL /* 689 */, 0x822c1b362b91c793LL /* 690 */, 0x4eb14655fb13dfd8LL /* 691 */, 0x1ecbba0714e2a97bLL /* 692 */, 0x6143459d5cde5f14LL /* 693 */, 0x53a8fbf1d5f0ac89LL /* 694 */, 0x97ea04d81c5e5b00LL /* 695 */, 0x622181a8d4fdb3f3LL /* 696 */, 0xe9bcd341572a1208LL /* 697 */, 0x1411258643cce58aLL /* 698 */, 0x9144c5fea4c6e0a4LL /* 699 */, 0x0d33d06565cf620fLL /* 700 */, 0x54a48d489f219ca1LL /* 701 */, 0xc43e5eac6d63c821LL /* 702 */, 0xa9728b3a72770dafLL /* 703 */, 0xd7934e7b20df87efLL /* 704 */, 0xe35503b61a3e86e5LL /* 705 */, 0xcae321fbc819d504LL /* 706 */, 0x129a50b3ac60bfa6LL /* 707 */, 0xcd5e68ea7e9fb6c3LL /* 708 */, 0xb01c90199483b1c7LL /* 709 */, 0x3de93cd5c295376cLL /* 710 */, 0xaed52edf2ab9ad13LL /* 711 */, 0x2e60f512c0a07884LL /* 712 */, 0xbc3d86a3e36210c9LL /* 713 */, 0x35269d9b163951ceLL /* 714 */, 0x0c7d6e2ad0cdb5faLL /* 715 */, 0x59e86297d87f5733LL /* 716 */, 0x298ef221898db0e7LL /* 717 */, 0x55000029d1a5aa7eLL /* 718 */, 0x8bc08ae1b5061b45LL /* 719 */, 0xc2c31c2b6c92703aLL /* 720 */, 0x94cc596baf25ef42LL /* 721 */, 0x0a1d73db22540456LL /* 722 */, 0x04b6a0f9d9c4179aLL /* 723 */, 0xeffdafa2ae3d3c60LL /* 724 */, 0xf7c8075bb49496c4LL /* 725 */, 0x9cc5c7141d1cd4e3LL /* 726 */, 0x78bd1638218e5534LL /* 727 */, 0xb2f11568f850246aLL /* 728 */, 0xedfabcfa9502bc29LL /* 729 */, 0x796ce5f2da23051bLL /* 730 */, 0xaae128b0dc93537cLL /* 731 */, 0x3a493da0ee4b29aeLL /* 732 */, 0xb5df6b2c416895d7LL /* 733 */, 0xfcabbd25122d7f37LL /* 734 */, 0x70810b58105dc4b1LL /* 735 */, 0xe10fdd37f7882a90LL /* 736 */, 0x524dcab5518a3f5cLL /* 737 */, 0x3c9e85878451255bLL /* 738 */, 0x4029828119bd34e2LL /* 739 */, 0x74a05b6f5d3ceccbLL /* 740 */, 0xb610021542e13ecaLL /* 741 */, 0x0ff979d12f59e2acLL /* 742 */, 0x6037da27e4f9cc50LL /* 743 */, 0x5e92975a0df1847dLL /* 744 */, 0xd66de190d3e623feLL /* 745 */, 0x5032d6b87b568048LL /* 746 */, 0x9a36b7ce8235216eLL /* 747 */, 0x80272a7a24f64b4aLL /* 748 */, 0x93efed8b8c6916f7LL /* 749 */, 0x37ddbff44cce1555LL /* 750 */, 0x4b95db5d4b99bd25LL /* 751 */, 0x92d3fda169812fc0LL /* 752 */, 0xfb1a4a9a90660bb6LL /* 753 */, 0x730c196946a4b9b2LL /* 754 */, 0x81e289aa7f49da68LL /* 755 */, 0x64669a0f83b1a05fLL /* 756 */, 0x27b3ff7d9644f48bLL /* 757 */, 0xcc6b615c8db675b3LL /* 758 */, 0x674f20b9bcebbe95LL /* 759 */, 0x6f31238275655982LL /* 760 */, 0x5ae488713e45cf05LL /* 761 */, 0xbf619f9954c21157LL /* 762 */, 0xeabac46040a8eae9LL /* 763 */, 0x454c6fe9f2c0c1cdLL /* 764 */, 0x419cf6496412691cLL /* 765 */, 0xd3dc3bef265b0f70LL /* 766 */, 0x6d0e60f5c3578a9eLL /* 767 */ }; static uint64_t sbox4[256] = { 0x5b0e608526323c55LL /* 768 */, 0x1a46c1a9fa1b59f5LL /* 769 */, 0xa9e245a17c4c8ffaLL /* 770 */, 0x65ca5159db2955d7LL /* 771 */, 0x05db0a76ce35afc2LL /* 772 */, 0x81eac77ea9113d45LL /* 773 */, 0x528ef88ab6ac0a0dLL /* 774 */, 0xa09ea253597be3ffLL /* 775 */, 0x430ddfb3ac48cd56LL /* 776 */, 0xc4b3a67af45ce46fLL /* 777 */, 0x4ececfd8fbe2d05eLL /* 778 */, 0x3ef56f10b39935f0LL /* 779 */, 0x0b22d6829cd619c6LL /* 780 */, 0x17fd460a74df2069LL /* 781 */, 0x6cf8cc8e8510ed40LL /* 782 */, 0xd6c824bf3a6ecaa7LL /* 783 */, 0x61243d581a817049LL /* 784 */, 0x048bacb6bbc163a2LL /* 785 */, 0xd9a38ac27d44cc32LL /* 786 */, 0x7fddff5baaf410abLL /* 787 */, 0xad6d495aa804824bLL /* 788 */, 0xe1a6a74f2d8c9f94LL /* 789 */, 0xd4f7851235dee8e3LL /* 790 */, 0xfd4b7f886540d893LL /* 791 */, 0x247c20042aa4bfdaLL /* 792 */, 0x096ea1c517d1327cLL /* 793 */, 0xd56966b4361a6685LL /* 794 */, 0x277da5c31221057dLL /* 795 */, 0x94d59893a43acff7LL /* 796 */, 0x64f0c51ccdc02281LL /* 797 */, 0x3d33bcc4ff6189dbLL /* 798 */, 0xe005cb184ce66af1LL /* 799 */, 0xff5ccd1d1db99beaLL /* 800 */, 0xb0b854a7fe42980fLL /* 801 */, 0x7bd46a6a718d4b9fLL /* 802 */, 0xd10fa8cc22a5fd8cLL /* 803 */, 0xd31484952be4bd31LL /* 804 */, 0xc7fa975fcb243847LL /* 805 */, 0x4886ed1e5846c407LL /* 806 */, 0x28cddb791eb70b04LL /* 807 */, 0xc2b00be2f573417fLL /* 808 */, 0x5c9590452180f877LL /* 809 */, 0x7a6bddfff370eb00LL /* 810 */, 0xce509e38d6d9d6a4LL /* 811 */, 0xebeb0f00647fa702LL /* 812 */, 0x1dcc06cf76606f06LL /* 813 */, 0xe4d9f28ba286ff0aLL /* 814 */, 0xd85a305dc918c262LL /* 815 */, 0x475b1d8732225f54LL /* 816 */, 0x2d4fb51668ccb5feLL /* 817 */, 0xa679b9d9d72bba20LL /* 818 */, 0x53841c0d912d43a5LL /* 819 */, 0x3b7eaa48bf12a4e8LL /* 820 */, 0x781e0e47f22f1ddfLL /* 821 */, 0xeff20ce60ab50973LL /* 822 */, 0x20d261d19dffb742LL /* 823 */, 0x16a12b03062a2e39LL /* 824 */, 0x1960eb2239650495LL /* 825 */, 0x251c16fed50eb8b8LL /* 826 */, 0x9ac0c330f826016eLL /* 827 */, 0xed152665953e7671LL /* 828 */, 0x02d63194a6369570LL /* 829 */, 0x5074f08394b1c987LL /* 830 */, 0x70ba598c90b25ce1LL /* 831 */, 0x794a15810b9742f6LL /* 832 */, 0x0d5925e9fcaf8c6cLL /* 833 */, 0x3067716cd868744eLL /* 834 */, 0x910ab077e8d7731bLL /* 835 */, 0x6a61bbdb5ac42f61LL /* 836 */, 0x93513efbf0851567LL /* 837 */, 0xf494724b9e83e9d5LL /* 838 */, 0xe887e1985c09648dLL /* 839 */, 0x34b1d3c675370cfdLL /* 840 */, 0xdc35e433bc0d255dLL /* 841 */, 0xd0aab84234131be0LL /* 842 */, 0x08042a50b48b7eafLL /* 843 */, 0x9997c4ee44a3ab35LL /* 844 */, 0x829a7b49201799d0LL /* 845 */, 0x263b8307b7c54441LL /* 846 */, 0x752f95f4fd6a6ca6LL /* 847 */, 0x927217402c08c6e5LL /* 848 */, 0x2a8ab754a795d9eeLL /* 849 */, 0xa442f7552f72943dLL /* 850 */, 0x2c31334e19781208LL /* 851 */, 0x4fa98d7ceaee6291LL /* 852 */, 0x55c3862f665db309LL /* 853 */, 0xbd0610175d53b1f3LL /* 854 */, 0x46fe6cb840413f27LL /* 855 */, 0x3fe03792df0cfa59LL /* 856 */, 0xcfe700372eb85e8fLL /* 857 */, 0xa7be29e7adbce118LL /* 858 */, 0xe544ee5cde8431ddLL /* 859 */, 0x8a781b1b41f1873eLL /* 860 */, 0xa5c94c78a0d2f0e7LL /* 861 */, 0x39412e2877b60728LL /* 862 */, 0xa1265ef3afc9a62cLL /* 863 */, 0xbcc2770c6a2506c5LL /* 864 */, 0x3ab66dd5dce1ce12LL /* 865 */, 0xe65499d04a675b37LL /* 866 */, 0x7d8f523481bfd216LL /* 867 */, 0x0f6f64fcec15f389LL /* 868 */, 0x74efbe618b5b13c8LL /* 869 */, 0xacdc82b714273e1dLL /* 870 */, 0xdd40bfe003199d17LL /* 871 */, 0x37e99257e7e061f8LL /* 872 */, 0xfa52626904775aaaLL /* 873 */, 0x8bbbf63a463d56f9LL /* 874 */, 0xf0013f1543a26e64LL /* 875 */, 0xa8307e9f879ec898LL /* 876 */, 0xcc4c27a4150177ccLL /* 877 */, 0x1b432f2cca1d3348LL /* 878 */, 0xde1d1f8f9f6fa013LL /* 879 */, 0x606602a047a7ddd6LL /* 880 */, 0xd237ab64cc1cb2c7LL /* 881 */, 0x9b938e7225fcd1d3LL /* 882 */, 0xec4e03708e0ff476LL /* 883 */, 0xfeb2fbda3d03c12dLL /* 884 */, 0xae0bced2ee43889aLL /* 885 */, 0x22cb8923ebfb4f43LL /* 886 */, 0x69360d013cf7396dLL /* 887 */, 0x855e3602d2d4e022LL /* 888 */, 0x073805bad01f784cLL /* 889 */, 0x33e17a133852f546LL /* 890 */, 0xdf4874058ac7b638LL /* 891 */, 0xba92b29c678aa14aLL /* 892 */, 0x0ce89fc76cfaadcdLL /* 893 */, 0x5f9d4e0908339e34LL /* 894 */, 0xf1afe9291f5923b9LL /* 895 */, 0x6e3480f60f4a265fLL /* 896 */, 0xeebf3a2ab29b841cLL /* 897 */, 0xe21938a88f91b4adLL /* 898 */, 0x57dfeff845c6d3c3LL /* 899 */, 0x2f006b0bf62caaf2LL /* 900 */, 0x62f479ef6f75ee78LL /* 901 */, 0x11a55ad41c8916a9LL /* 902 */, 0xf229d29084fed453LL /* 903 */, 0x42f1c27b16b000e6LL /* 904 */, 0x2b1f76749823c074LL /* 905 */, 0x4b76eca3c2745360LL /* 906 */, 0x8c98f463b91691bdLL /* 907 */, 0x14bcc93cf1ade66aLL /* 908 */, 0x8885213e6d458397LL /* 909 */, 0x8e177df0274d4711LL /* 910 */, 0xb49b73b5503f2951LL /* 911 */, 0x10168168c3f96b6bLL /* 912 */, 0x0e3d963b63cab0aeLL /* 913 */, 0x8dfc4b5655a1db14LL /* 914 */, 0xf789f1356e14de5cLL /* 915 */, 0x683e68af4e51dac1LL /* 916 */, 0xc9a84f9d8d4b0fd9LL /* 917 */, 0x3691e03f52a0f9d1LL /* 918 */, 0x5ed86e46e1878e80LL /* 919 */, 0x3c711a0e99d07150LL /* 920 */, 0x5a0865b20c4e9310LL /* 921 */, 0x56fbfc1fe4f0682eLL /* 922 */, 0xea8d5de3105edf9bLL /* 923 */, 0x71abfdb12379187aLL /* 924 */, 0x2eb99de1bee77b9cLL /* 925 */, 0x21ecc0ea33cf4523LL /* 926 */, 0x59a4d7521805c7a1LL /* 927 */, 0x3896f5eb56ae7c72LL /* 928 */, 0xaa638f3db18f75dcLL /* 929 */, 0x9f39358dabe9808eLL /* 930 */, 0xb7defa91c00b72acLL /* 931 */, 0x6b5541fd62492d92LL /* 932 */, 0x6dc6dee8f92e4d5bLL /* 933 */, 0x353f57abc4beea7eLL /* 934 */, 0x735769d6da5690ceLL /* 935 */, 0x0a234aa642391484LL /* 936 */, 0xf6f9508028f80d9dLL /* 937 */, 0xb8e319a27ab3f215LL /* 938 */, 0x31ad9c1151341a4dLL /* 939 */, 0x773c22a57bef5805LL /* 940 */, 0x45c7561a07968633LL /* 941 */, 0xf913da9e249dbe36LL /* 942 */, 0xda652d9b78a64c68LL /* 943 */, 0x4c27a97f3bc334efLL /* 944 */, 0x76621220e66b17f4LL /* 945 */, 0x967743899acd7d0bLL /* 946 */, 0xf3ee5bcae0ed6782LL /* 947 */, 0x409f753600c879fcLL /* 948 */, 0x06d09a39b5926db6LL /* 949 */, 0x6f83aeb0317ac588LL /* 950 */, 0x01e6ca4a86381f21LL /* 951 */, 0x66ff3462d19f3025LL /* 952 */, 0x72207c24ddfd3bfbLL /* 953 */, 0x4af6b6d3e2ece2ebLL /* 954 */, 0x9c994dbec7ea08deLL /* 955 */, 0x49ace597b09a8bc4LL /* 956 */, 0xb38c4766cf0797baLL /* 957 */, 0x131b9373c57c2a75LL /* 958 */, 0xb1822cce61931e58LL /* 959 */, 0x9d7555b909ba1c0cLL /* 960 */, 0x127fafdd937d11d2LL /* 961 */, 0x29da3badc66d92e4LL /* 962 */, 0xa2c1d57154c2ecbcLL /* 963 */, 0x58c5134d82f6fe24LL /* 964 */, 0x1c3ae3515b62274fLL /* 965 */, 0xe907c82e01cb8126LL /* 966 */, 0xf8ed091913e37fcbLL /* 967 */, 0x3249d8f9c80046c9LL /* 968 */, 0x80cf9bede388fb63LL /* 969 */, 0x1881539a116cf19eLL /* 970 */, 0x5103f3f76bd52457LL /* 971 */, 0x15b7e6f5ae47f7a8LL /* 972 */, 0xdbd7c6ded47e9ccfLL /* 973 */, 0x44e55c410228bb1aLL /* 974 */, 0xb647d4255edb4e99LL /* 975 */, 0x5d11882bb8aafc30LL /* 976 */, 0xf5098bbb29d3212aLL /* 977 */, 0x8fb5ea14e90296b3LL /* 978 */, 0x677b942157dd025aLL /* 979 */, 0xfb58e7c0a390acb5LL /* 980 */, 0x89d3674c83bd4a01LL /* 981 */, 0x9e2da4df4bf3b93bLL /* 982 */, 0xfcc41e328cab4829LL /* 983 */, 0x03f38c96ba582c52LL /* 984 */, 0xcad1bdbd7fd85db2LL /* 985 */, 0xbbb442c16082ae83LL /* 986 */, 0xb95fe86ba5da9ab0LL /* 987 */, 0xb22e04673771a93fLL /* 988 */, 0x845358c9493152d8LL /* 989 */, 0xbe2a488697b4541eLL /* 990 */, 0x95a2dc2dd38e6966LL /* 991 */, 0xc02c11ac923c852bLL /* 992 */, 0x2388b1990df2a87bLL /* 993 */, 0x7c8008fa1b4f37beLL /* 994 */, 0x1f70d0c84d54e503LL /* 995 */, 0x5490adec7ece57d4LL /* 996 */, 0x002b3c27d9063a3aLL /* 997 */, 0x7eaea3848030a2bfLL /* 998 */, 0xc602326ded2003c0LL /* 999 */, 0x83a7287d69a94086LL /* 1000 */, 0xc57a5fcb30f57a8aLL /* 1001 */, 0xb56844e479ebe779LL /* 1002 */, 0xa373b40f05dcbce9LL /* 1003 */, 0xd71a786e88570ee2LL /* 1004 */, 0x879cbacdbde8f6a0LL /* 1005 */, 0x976ad1bcc164a32fLL /* 1006 */, 0xab21e25e9666d78bLL /* 1007 */, 0x901063aae5e5c33cLL /* 1008 */, 0x9818b34448698d90LL /* 1009 */, 0xe36487ae3e1e8abbLL /* 1010 */, 0xafbdf931893bdcb4LL /* 1011 */, 0x6345a0dc5fbbd519LL /* 1012 */, 0x8628fe269b9465caLL /* 1013 */, 0x1e5d01603f9c51ecLL /* 1014 */, 0x4de44006a15049b7LL /* 1015 */, 0xbf6c70e5f776cbb1LL /* 1016 */, 0x411218f2ef552bedLL /* 1017 */, 0xcb0c0708705a36a3LL /* 1018 */, 0xe74d14754f986044LL /* 1019 */, 0xcd56d9430ea8280eLL /* 1020 */, 0xc12591d7535f5065LL /* 1021 */, 0xc83223f1720aef96LL /* 1022 */, 0xc3a0396f7363a51fLL /* 1023 */ }; // Inserted code // From libgcrypt, g10lib.h #define wipememory2(_ptr,_set,_len) do { \ volatile char *_vptr=(volatile char *)(_ptr); \ size_t _vlen=(_len); \ while(_vlen) { *_vptr=(_set); _vptr++; _vlen--; } \ } while(0) #define wipememory(_ptr,_len) wipememory2(_ptr,0,_len) void _gcry_burn_stack(int bytes); // Inserted code // From libgcrypt, misc.c void _gcry_burn_stack (int bytes) { char buf[64]; wipememory (buf, sizeof buf); bytes -= sizeof buf; if (bytes > 0) _gcry_burn_stack (bytes); } // libgcrypt, tiger.c typedef struct { uint64_t a, b, c; unsigned char buf[64]; int count; uint32_t nblocks; int variant; /* 0 = old code, 1 = fixed code, 2 - TIGER2. */ } TIGER_CONTEXT; static void do_init (void *context, int variant) { TIGER_CONTEXT *hd = (TIGER_CONTEXT *)context; hd->a = 0x0123456789abcdefLL; hd->b = 0xfedcba9876543210LL; hd->c = 0xf096a5b4c3b2e187LL; hd->nblocks = 0; hd->count = 0; hd->variant = variant; } static void tiger_init (void *context) { do_init (context, 0); } static void tiger1_init (void *context) { do_init (context, 1); } static void tiger2_init (void *context) { do_init (context, 2); } static void tiger_round( uint64_t *ra, uint64_t *rb, uint64_t *rc, uint64_t x, int mul ) { uint64_t a = *ra; uint64_t b = *rb; uint64_t c = *rc; c ^= x; a -= ( sbox1[ c & 0xff ] ^ sbox2[ (c >> 16) & 0xff ] ^ sbox3[ (c >> 32) & 0xff ] ^ sbox4[ (c >> 48) & 0xff ]); b += ( sbox4[ (c >> 8) & 0xff ] ^ sbox3[ (c >> 24) & 0xff ] ^ sbox2[ (c >> 40) & 0xff ] ^ sbox1[ (c >> 56) & 0xff ]); b *= mul; *ra = a; *rb = b; *rc = c; } static void pass( uint64_t *ra, uint64_t *rb, uint64_t *rc, uint64_t *x, int mul ) { uint64_t a = *ra; uint64_t b = *rb; uint64_t c = *rc; tiger_round( &a, &b, &c, x[0], mul ); tiger_round( &b, &c, &a, x[1], mul ); tiger_round( &c, &a, &b, x[2], mul ); tiger_round( &a, &b, &c, x[3], mul ); tiger_round( &b, &c, &a, x[4], mul ); tiger_round( &c, &a, &b, x[5], mul ); tiger_round( &a, &b, &c, x[6], mul ); tiger_round( &b, &c, &a, x[7], mul ); *ra = a; *rb = b; *rc = c; } static void key_schedule( uint64_t *x ) { x[0] -= x[7] ^ 0xa5a5a5a5a5a5a5a5LL; x[1] ^= x[0]; x[2] += x[1]; x[3] -= x[2] ^ ((~x[1]) << 19 ); x[4] ^= x[3]; x[5] += x[4]; x[6] -= x[5] ^ ((~x[4]) >> 23 ); x[7] ^= x[6]; x[0] += x[7]; x[1] -= x[0] ^ ((~x[7]) << 19 ); x[2] ^= x[1]; x[3] += x[2]; x[4] -= x[3] ^ ((~x[2]) >> 23 ); x[5] ^= x[4]; x[6] += x[5]; x[7] -= x[6] ^ 0x0123456789abcdefLL; } /**************** * Transform the message DATA which consists of 512 bytes (8 words) */ static void transform ( TIGER_CONTEXT *hd, const unsigned char *data ) { uint64_t a,b,c,aa,bb,cc; uint64_t x[8]; #ifdef WORDS_BIGENDIAN #define MKWORD(d,n) \ ( ((uint64_t)(d)[8*(n)+7]) << 56 | ((uint64_t)(d)[8*(n)+6]) << 48 \ | ((uint64_t)(d)[8*(n)+5]) << 40 | ((uint64_t)(d)[8*(n)+4]) << 32 \ | ((uint64_t)(d)[8*(n)+3]) << 24 | ((uint64_t)(d)[8*(n)+2]) << 16 \ | ((uint64_t)(d)[8*(n)+1]) << 8 | ((uint64_t)(d)[8*(n) ]) ) x[0] = MKWORD(data, 0); x[1] = MKWORD(data, 1); x[2] = MKWORD(data, 2); x[3] = MKWORD(data, 3); x[4] = MKWORD(data, 4); x[5] = MKWORD(data, 5); x[6] = MKWORD(data, 6); x[7] = MKWORD(data, 7); #undef MKWORD #else memcpy( &x[0], data, 64 ); #endif /* save */ a = aa = hd->a; b = bb = hd->b; c = cc = hd->c; pass( &a, &b, &c, x, 5); key_schedule( x ); pass( &c, &a, &b, x, 7); key_schedule( x ); pass( &b, &c, &a, x, 9); /* feedforward */ a ^= aa; b -= bb; c += cc; /* store */ hd->a = a; hd->b = b; hd->c = c; } /* Update the message digest with the contents * of INBUF with length INLEN. */ static void tiger_write ( void *context, const void *inbuf_arg, size_t inlen) { const unsigned char *inbuf = (const unsigned char *)inbuf_arg; TIGER_CONTEXT *hd = (TIGER_CONTEXT *)context; if( hd->count == 64) /* flush the buffer */ { transform( hd, hd->buf ); _gcry_burn_stack (21*8+11*sizeof(void*)); hd->count = 0; hd->nblocks++; } if( !inbuf ) return; if( hd->count ) { for( ; inlen && hd->count < 64; inlen-- ) hd->buf[hd->count++] = *inbuf++; tiger_write( hd, NULL, 0 ); if( !inlen ) return; } while( inlen >= 64 ) { transform( hd, inbuf ); hd->count = 0; hd->nblocks++; inlen -= 64; inbuf += 64; } _gcry_burn_stack (21*8+11*sizeof(void*)); for( ; inlen && hd->count < 64; inlen-- ) hd->buf[hd->count++] = *inbuf++; } /* The routine terminates the computation */ static void tiger_final( void *context ) { TIGER_CONTEXT *hd = (TIGER_CONTEXT *)context; uint32_t t, msb, lsb; unsigned char *p; unsigned char pad = hd->variant == 2? 0x80 : 0x01; tiger_write(hd, NULL, 0); /* flush */; t = hd->nblocks; /* multiply by 64 to make a byte count */ lsb = t << 6; msb = t >> 26; /* add the count */ t = lsb; if( (lsb += hd->count) < t ) msb++; /* multiply by 8 to make a bit count */ t = lsb; lsb <<= 3; msb <<= 3; msb |= t >> 29; if( hd->count < 56 ) /* enough room */ { hd->buf[hd->count++] = pad; while( hd->count < 56 ) hd->buf[hd->count++] = 0; /* pad */ } else /* need one extra block */ { hd->buf[hd->count++] = pad; /* pad character */ while( hd->count < 64 ) hd->buf[hd->count++] = 0; tiger_write(hd, NULL, 0); /* flush */; memset(hd->buf, 0, 56 ); /* fill next block with zeroes */ } /* append the 64 bit count */ hd->buf[56] = lsb ; hd->buf[57] = lsb >> 8; hd->buf[58] = lsb >> 16; hd->buf[59] = lsb >> 24; hd->buf[60] = msb ; hd->buf[61] = msb >> 8; hd->buf[62] = msb >> 16; hd->buf[63] = msb >> 24; transform( hd, hd->buf ); _gcry_burn_stack (21*8+11*sizeof(void*)); p = hd->buf; #ifdef WORDS_BIGENDIAN #define X(a) do { *(uint64_t*)p = hd->a ; p += 8; } while(0) #else /* little endian */ #define X(a) do { *p++ = hd->a >> 56; *p++ = hd->a >> 48; \ *p++ = hd->a >> 40; *p++ = hd->a >> 32; \ *p++ = hd->a >> 24; *p++ = hd->a >> 16; \ *p++ = hd->a >> 8; *p++ = hd->a; } while(0) #endif #define Y(a) do { *p++ = hd->a ; *p++ = hd->a >> 8; \ *p++ = hd->a >> 16; *p++ = hd->a >> 24; \ *p++ = hd->a >> 32; *p++ = hd->a >> 40; \ *p++ = hd->a >> 48; *p++ = hd->a >> 56; } while(0) if (hd->variant == 0) { X(a); X(b); X(c); } else { Y(a); Y(b); Y(c); } #undef X #undef Y } static unsigned char * tiger_read( void *context ) { TIGER_CONTEXT *hd = (TIGER_CONTEXT *)context; return hd->buf; } // ------------------------------------------------------------------ // End Libgcrypt code // ------------------------------------------------------------------ void hash_init_tiger(void * ctx) { // Variant 0, Unknown // tiger_init(ctx) // Variant 1, Tiger tiger1_init(ctx); // Variant 2, The Tiger2 Hash // http://www.cs.technion.ac.il/~biham/Reports/Tiger/tiger2-test-vectors-nessie-format.dat // tiger2_init(ctx); } void hash_update_tiger(void * ctx, const unsigned char *buf, size_t len) { tiger_write(ctx,buf,len); } void hash_final_tiger(void * ctx, unsigned char *sum) { tiger_final(ctx); unsigned char * tmp = tiger_read(ctx); memcpy(sum,tmp,64); } md5deep-4.2/src/tiger.h000066400000000000000000000013661176640446200147740ustar00rootroot00000000000000 /* MD5DEEP - tiger.h * * By Jesse Kornblum * * This is a work of the US Government. In accordance with 17 USC 105, * copyright protection is not available for any work of the US Government. * * 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. * */ /* $Id: tiger.h 636 2012-06-09 13:16:59Z jessekornblum $ */ #ifndef __TIGER_H #define __TIGER_H __BEGIN_DECLS void hash_init_tiger(void * ctx); void hash_update_tiger(void * ctx, const unsigned char *buf, size_t len); void hash_final_tiger(void * ctx, unsigned char *sum); #define context_tiger_t TIGER_CONTEXT __END_DECLS #endif /* ifndef __TIGER_H */ md5deep-4.2/src/utf8.h000066400000000000000000000030231176640446200145400ustar00rootroot00000000000000// Copyright 2006 Nemanja Trifunovic /* Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731 #define UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731 #include "utf8/checked.h" #include "utf8/unchecked.h" #endif // header guard md5deep-4.2/src/utf8/000077500000000000000000000000001176640446200143715ustar00rootroot00000000000000md5deep-4.2/src/utf8/checked.h000066400000000000000000000272761176640446200161460ustar00rootroot00000000000000// Copyright 2006 Nemanja Trifunovic /* Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #define UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #include "core.h" #include namespace utf8 { // Base for the exceptions that may be thrown from the library class exception : public std::exception { }; // Exceptions that may be thrown from the library functions. class invalid_code_point : public exception { uint32_t cp; public: invalid_code_point(uint32_t cp_) : cp(cp_) {} virtual const char* what() const throw() { return "Invalid code point"; } uint32_t code_point() const {return cp;} }; class invalid_utf8 : public exception { uint8_t u8; public: invalid_utf8 (uint8_t u) : u8(u) {} virtual const char* what() const throw() { return "Invalid UTF-8"; } uint8_t utf8_octet() const {return u8;} }; class invalid_utf16 : public exception { uint16_t u16; public: invalid_utf16 (uint16_t u) : u16(u) {} virtual const char* what() const throw() { return "Invalid UTF-16"; } uint16_t utf16_word() const {return u16;} }; class not_enough_room : public exception { public: virtual const char* what() const throw() { return "Not enough space"; } }; /// The library API - functions intended to be called by the users template output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement) { while (start != end) { octet_iterator sequence_start = start; internal::utf_error err_code = internal::validate_next(start, end); switch (err_code) { case internal::UTF8_OK : for (octet_iterator it = sequence_start; it != start; ++it) *out++ = *it; break; case internal::NOT_ENOUGH_ROOM: throw not_enough_room(); case internal::INVALID_LEAD: append (replacement, out); ++start; break; case internal::INCOMPLETE_SEQUENCE: case internal::OVERLONG_SEQUENCE: case internal::INVALID_CODE_POINT: append (replacement, out); ++start; // just one replacement mark for the sequence while (internal::is_trail(*start) && start != end) ++start; break; } } return out; } template inline output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out) { static const uint32_t replacement_marker = internal::mask16(0xfffd); return replace_invalid(start, end, out, replacement_marker); } template octet_iterator append(uint32_t cp, octet_iterator result) { if (!internal::is_code_point_valid(cp)) throw invalid_code_point(cp); if (cp < 0x80) // one octet *(result++) = static_cast(cp); else if (cp < 0x800) { // two octets *(result++) = static_cast((cp >> 6) | 0xc0); *(result++) = static_cast((cp & 0x3f) | 0x80); } else if (cp < 0x10000) { // three octets *(result++) = static_cast((cp >> 12) | 0xe0); *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); *(result++) = static_cast((cp & 0x3f) | 0x80); } else { // four octets *(result++) = static_cast((cp >> 18) | 0xf0); *(result++) = static_cast(((cp >> 12) & 0x3f) | 0x80); *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); *(result++) = static_cast((cp & 0x3f) | 0x80); } return result; } template uint32_t next(octet_iterator& it, octet_iterator end) { uint32_t cp = 0; internal::utf_error err_code = internal::validate_next(it, end, &cp); switch (err_code) { case internal::UTF8_OK : break; case internal::NOT_ENOUGH_ROOM : throw not_enough_room(); case internal::INVALID_LEAD : case internal::INCOMPLETE_SEQUENCE : case internal::OVERLONG_SEQUENCE : throw invalid_utf8(*it); case internal::INVALID_CODE_POINT : throw invalid_code_point(cp); } return cp; } template uint32_t peek_next(octet_iterator it, octet_iterator end) { return next(it, end); } template uint32_t prior(octet_iterator& it, octet_iterator start) { // can't do much if it == start if (it == start) throw not_enough_room(); octet_iterator end = it; // Go back until we hit either a lead octet or start while (internal::is_trail(*(--it))) if (it == start) throw invalid_utf8(*it); // error - no lead byte in the sequence return peek_next(it, end); } /// Deprecated in versions that include "prior" template uint32_t previous(octet_iterator& it, octet_iterator pass_start) { octet_iterator end = it; while (internal::is_trail(*(--it))) if (it == pass_start) throw invalid_utf8(*it); // error - no lead byte in the sequence octet_iterator temp = it; return next(temp, end); } template void advance (octet_iterator& it, distance_type n, octet_iterator end) { for (distance_type i = 0; i < n; ++i) next(it, end); } template typename std::iterator_traits::difference_type distance (octet_iterator first, octet_iterator last) { typename std::iterator_traits::difference_type dist; for (dist = 0; first < last; ++dist) next(first, last); return dist; } template octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result) { while (start != end) { uint32_t cp = internal::mask16(*start++); // Take care of surrogate pairs first if (internal::is_lead_surrogate(cp)) { if (start != end) { uint32_t trail_surrogate = internal::mask16(*start++); if (internal::is_trail_surrogate(trail_surrogate)) cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET; else throw invalid_utf16(static_cast(trail_surrogate)); } else throw invalid_utf16(static_cast(cp)); } // Lone trail surrogate else if (internal::is_trail_surrogate(cp)) throw invalid_utf16(static_cast(cp)); result = append(cp, result); } return result; } template u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result) { while (start != end) { uint32_t cp = next(start, end); if (cp > 0xffff) { //make a surrogate pair *result++ = static_cast((cp >> 10) + internal::LEAD_OFFSET); *result++ = static_cast((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN); } else *result++ = static_cast(cp); } return result; } template octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result) { while (start != end) result = append(*(start++), result); return result; } template u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result) { while (start != end) (*result++) = next(start, end); return result; } // The iterator class template class iterator : public std::iterator { octet_iterator it; octet_iterator range_start; octet_iterator range_end; public: iterator () {}; explicit iterator (const octet_iterator& octet_it, const octet_iterator& range_start_, const octet_iterator& range_end_) : it(octet_it), range_start(range_start_), range_end(range_end_) { if (it < range_start || it > range_end) throw std::out_of_range("Invalid utf-8 iterator position"); } // the default "big three" are OK octet_iterator base () const { return it; } uint32_t operator * () const { octet_iterator temp = it; return next(temp, range_end); } bool operator == (const iterator& rhs) const { if (range_start != rhs.range_start || range_end != rhs.range_end) throw std::logic_error("Comparing utf-8 iterators defined with different ranges"); return (it == rhs.it); } bool operator != (const iterator& rhs) const { return !(operator == (rhs)); } iterator& operator ++ () { next(it, range_end); return *this; } iterator operator ++ (int) { iterator temp = *this; next(it, range_end); return temp; } iterator& operator -- () { prior(it, range_start); return *this; } iterator operator -- (int) { iterator temp = *this; prior(it, range_start); return temp; } }; // class iterator } // namespace utf8 #endif //header guard md5deep-4.2/src/utf8/core.h000066400000000000000000000267711176640446200155070ustar00rootroot00000000000000// Copyright 2006 Nemanja Trifunovic /* Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #define UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #include namespace utf8 { // The typedefs for 8-bit, 16-bit and 32-bit unsigned integers // You may need to change them to match your system. // These typedefs have the same names as ones from cstdint, or boost/cstdint typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; // Helper code - not intended to be directly called by the library users. May be changed at any time namespace internal { // Unicode constants // Leading (high) surrogates: 0xd800 - 0xdbff // Trailing (low) surrogates: 0xdc00 - 0xdfff const uint16_t LEAD_SURROGATE_MIN = 0xd800u; const uint16_t LEAD_SURROGATE_MAX = 0xdbffu; const uint16_t TRAIL_SURROGATE_MIN = 0xdc00u; const uint16_t TRAIL_SURROGATE_MAX = 0xdfffu; const uint16_t LEAD_OFFSET = LEAD_SURROGATE_MIN - (0x10000 >> 10); const uint32_t SURROGATE_OFFSET = 0x10000u - (LEAD_SURROGATE_MIN << 10) - TRAIL_SURROGATE_MIN; // Maximum valid value for a Unicode code point const uint32_t CODE_POINT_MAX = 0x0010ffffu; template inline uint8_t mask8(octet_type oc) { return static_cast(0xff & oc); } template inline uint16_t mask16(u16_type oc) { return static_cast(0xffff & oc); } template inline bool is_trail(octet_type oc) { return ((mask8(oc) >> 6) == 0x2); } template inline bool is_lead_surrogate(u16 cp) { return (cp >= LEAD_SURROGATE_MIN && cp <= LEAD_SURROGATE_MAX); } template inline bool is_trail_surrogate(u16 cp) { return (cp >= TRAIL_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX); } template inline bool is_surrogate(u16 cp) { return (cp >= LEAD_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX); } template inline bool is_code_point_valid(u32 cp) { return (cp <= CODE_POINT_MAX && !is_surrogate(cp)); } template inline typename std::iterator_traits::difference_type sequence_length(octet_iterator lead_it) { uint8_t lead = mask8(*lead_it); if (lead < 0x80) return 1; else if ((lead >> 5) == 0x6) return 2; else if ((lead >> 4) == 0xe) return 3; else if ((lead >> 3) == 0x1e) return 4; else return 0; } template inline bool is_overlong_sequence(uint32_t cp, octet_difference_type length) { if (cp < 0x80) { if (length != 1) return true; } else if (cp < 0x800) { if (length != 2) return true; } else if (cp < 0x10000) { if (length != 3) return true; } return false; } enum utf_error {UTF8_OK, NOT_ENOUGH_ROOM, INVALID_LEAD, INCOMPLETE_SEQUENCE, OVERLONG_SEQUENCE, INVALID_CODE_POINT}; /// get_sequence_x functions decode utf-8 sequences of the length x template utf_error get_sequence_1(octet_iterator& it, octet_iterator end, uint32_t* code_point) { if (it != end) { if (code_point) *code_point = mask8(*it); return UTF8_OK; } return NOT_ENOUGH_ROOM; } template utf_error get_sequence_2(octet_iterator& it, octet_iterator end, uint32_t* code_point) { utf_error ret_code = NOT_ENOUGH_ROOM; if (it != end) { uint32_t cp = mask8(*it); if (++it != end) { if (is_trail(*it)) { cp = ((cp << 6) & 0x7ff) + ((*it) & 0x3f); if (code_point) *code_point = cp; ret_code = UTF8_OK; } else ret_code = INCOMPLETE_SEQUENCE; } else ret_code = NOT_ENOUGH_ROOM; } return ret_code; } template utf_error get_sequence_3(octet_iterator& it, octet_iterator end, uint32_t* code_point) { utf_error ret_code = NOT_ENOUGH_ROOM; if (it != end) { uint32_t cp = mask8(*it); if (++it != end) { if (is_trail(*it)) { cp = ((cp << 12) & 0xffff) + ((mask8(*it) << 6) & 0xfff); if (++it != end) { if (is_trail(*it)) { cp += (*it) & 0x3f; if (code_point) *code_point = cp; ret_code = UTF8_OK; } else ret_code = INCOMPLETE_SEQUENCE; } else ret_code = NOT_ENOUGH_ROOM; } else ret_code = INCOMPLETE_SEQUENCE; } else ret_code = NOT_ENOUGH_ROOM; } return ret_code; } template utf_error get_sequence_4(octet_iterator& it, octet_iterator end, uint32_t* code_point) { utf_error ret_code = NOT_ENOUGH_ROOM; if (it != end) { uint32_t cp = mask8(*it); if (++it != end) { if (is_trail(*it)) { cp = ((cp << 18) & 0x1fffff) + ((mask8(*it) << 12) & 0x3ffff); if (++it != end) { if (is_trail(*it)) { cp += (mask8(*it) << 6) & 0xfff; if (++it != end) { if (is_trail(*it)) { cp += (*it) & 0x3f; if (code_point) *code_point = cp; ret_code = UTF8_OK; } else ret_code = INCOMPLETE_SEQUENCE; } else ret_code = NOT_ENOUGH_ROOM; } else ret_code = INCOMPLETE_SEQUENCE; } else ret_code = NOT_ENOUGH_ROOM; } else ret_code = INCOMPLETE_SEQUENCE; } else ret_code = NOT_ENOUGH_ROOM; } return ret_code; } template utf_error validate_next(octet_iterator& it, octet_iterator end, uint32_t* code_point) { // Save the original value of it so we can go back in case of failure // Of course, it does not make much sense with i.e. stream iterators octet_iterator original_it = it; uint32_t cp = 0; // Determine the sequence length based on the lead octet typedef typename std::iterator_traits::difference_type octet_difference_type; octet_difference_type length = sequence_length(it); if (length == 0) return INVALID_LEAD; // Now that we have a valid sequence length, get trail octets and calculate the code point utf_error err = UTF8_OK; switch (length) { case 1: err = get_sequence_1(it, end, &cp); break; case 2: err = get_sequence_2(it, end, &cp); break; case 3: err = get_sequence_3(it, end, &cp); break; case 4: err = get_sequence_4(it, end, &cp); break; } if (err == UTF8_OK) { // Decoding succeeded. Now, security checks... if (is_code_point_valid(cp)) { if (!is_overlong_sequence(cp, length)){ // Passed! Return here. if (code_point) *code_point = cp; ++it; return UTF8_OK; } else err = OVERLONG_SEQUENCE; } else err = INVALID_CODE_POINT; } // Failure branch - restore the original value of the iterator it = original_it; return err; } template inline utf_error validate_next(octet_iterator& it, octet_iterator end) { return validate_next(it, end, 0); } } // namespace internal /// The library API - functions intended to be called by the users // Byte order mark const uint8_t bom[] = {0xef, 0xbb, 0xbf}; template octet_iterator find_invalid(octet_iterator start, octet_iterator end) { octet_iterator result = start; while (result != end) { internal::utf_error err_code = internal::validate_next(result, end); if (err_code != internal::UTF8_OK) return result; } return result; } template inline bool is_valid(octet_iterator start, octet_iterator end) { return (find_invalid(start, end) == end); } template inline bool starts_with_bom (octet_iterator it, octet_iterator end) { return ( ((it != end) && (internal::mask8(*it++)) == bom[0]) && ((it != end) && (internal::mask8(*it++)) == bom[1]) && ((it != end) && (internal::mask8(*it)) == bom[2]) ); } //Deprecated in release 2.3 template inline bool is_bom (octet_iterator it) { return ( (internal::mask8(*it++)) == bom[0] && (internal::mask8(*it++)) == bom[1] && (internal::mask8(*it)) == bom[2] ); } } // namespace utf8 #endif // header guard md5deep-4.2/src/utf8/unchecked.h000066400000000000000000000207001176640446200164720ustar00rootroot00000000000000// Copyright 2006 Nemanja Trifunovic /* Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #define UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #include "core.h" namespace utf8 { namespace unchecked { template octet_iterator append(uint32_t cp, octet_iterator result) { if (cp < 0x80) // one octet *(result++) = static_cast(cp); else if (cp < 0x800) { // two octets *(result++) = static_cast((cp >> 6) | 0xc0); *(result++) = static_cast((cp & 0x3f) | 0x80); } else if (cp < 0x10000) { // three octets *(result++) = static_cast((cp >> 12) | 0xe0); *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); *(result++) = static_cast((cp & 0x3f) | 0x80); } else { // four octets *(result++) = static_cast((cp >> 18) | 0xf0); *(result++) = static_cast(((cp >> 12) & 0x3f)| 0x80); *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); *(result++) = static_cast((cp & 0x3f) | 0x80); } return result; } template uint32_t next(octet_iterator& it) { uint32_t cp = internal::mask8(*it); typename std::iterator_traits::difference_type length = utf8::internal::sequence_length(it); switch (length) { case 1: break; case 2: it++; cp = ((cp << 6) & 0x7ff) + ((*it) & 0x3f); break; case 3: ++it; cp = ((cp << 12) & 0xffff) + ((internal::mask8(*it) << 6) & 0xfff); ++it; cp += (*it) & 0x3f; break; case 4: ++it; cp = ((cp << 18) & 0x1fffff) + ((internal::mask8(*it) << 12) & 0x3ffff); ++it; cp += (internal::mask8(*it) << 6) & 0xfff; ++it; cp += (*it) & 0x3f; break; } ++it; return cp; } template uint32_t peek_next(octet_iterator it) { return next(it); } template uint32_t prior(octet_iterator& it) { while (internal::is_trail(*(--it))) ; octet_iterator temp = it; return next(temp); } // Deprecated in versions that include prior, but only for the sake of consistency (see utf8::previous) template inline uint32_t previous(octet_iterator& it) { return prior(it); } template void advance (octet_iterator& it, distance_type n) { for (distance_type i = 0; i < n; ++i) next(it); } template typename std::iterator_traits::difference_type distance (octet_iterator first, octet_iterator last) { typename std::iterator_traits::difference_type dist; for (dist = 0; first < last; ++dist) next(first); return dist; } template octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result) { while (start != end) { uint32_t cp = internal::mask16(*start++); // Take care of surrogate pairs first if (internal::is_lead_surrogate(cp)) { uint32_t trail_surrogate = internal::mask16(*start++); cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET; } result = append(cp, result); } return result; } template u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result) { while (start < end) { uint32_t cp = next(start); if (cp > 0xffff) { //make a surrogate pair *result++ = static_cast((cp >> 10) + internal::LEAD_OFFSET); *result++ = static_cast((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN); } else *result++ = static_cast(cp); } return result; } template octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result) { while (start != end) result = append(*(start++), result); return result; } template u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result) { while (start < end) (*result++) = next(start); return result; } // The iterator class template class iterator : public std::iterator { octet_iterator it; public: iterator () {}; explicit iterator (const octet_iterator& octet_it): it(octet_it) {} // the default "big three" are OK octet_iterator base () const { return it; } uint32_t operator * () const { octet_iterator temp = it; return next(temp); } bool operator == (const iterator& rhs) const { return (it == rhs.it); } bool operator != (const iterator& rhs) const { return !(operator == (rhs)); } iterator& operator ++ () { std::advance(it, internal::sequence_length(it)); return *this; } iterator operator ++ (int) { iterator temp = *this; std::advance(it, internal::sequence_length(it)); return temp; } iterator& operator -- () { prior(it); return *this; } iterator operator -- (int) { iterator temp = *this; prior(it); return temp; } }; // class iterator } // namespace utf8::unchecked } // namespace utf8 #endif // header guard md5deep-4.2/src/whirlpool.c000066400000000000000000003642141176640446200157000ustar00rootroot00000000000000/** * The Whirlpool hashing function. * *

* References * *

* The Whirlpool algorithm was developed by * Paulo S. L. M. Barreto and * Vincent Rijmen. * * See * P.S.L.M. Barreto, V. Rijmen, * ``The Whirlpool hashing function,'' * NESSIE submission, 2000 (tweaked version, 2001), * * * @author Paulo S.L.M. Barreto * @author Vincent Rijmen. * * @version 3.0 (2003.03.12) * * ============================================================================= * * Differences from version 2.1: * * - Suboptimal diffusion matrix replaced by cir(1, 1, 4, 1, 8, 5, 2, 9). * * ============================================================================= * * Differences from version 2.0: * * - Generation of ISO/IEC 10118-3 test vectors. * - Bug fix: nonzero carry was ignored when tallying the data length * (this bug apparently only manifested itself when feeding data * in pieces rather than in a single chunk at once). * - Support for MS Visual C++ 64-bit integer arithmetic. * * Differences from version 1.0: * * - Original S-box replaced by the tweaked, hardware-efficient version. * * ============================================================================= * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''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 AUTHORS 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. * */ /* $Id: whirlpool.c 501 2011-09-25 17:12:27Z xchatty $ */ //#include "main.h" #include "whirlpool.h" void hash_init_whirlpool(void * ctx) { NESSIEinit((struct NESSIEstruct *)ctx); } void hash_update_whirlpool(void * ctx, const unsigned char *buf, size_t len) { NESSIEadd(buf,len * 8,(struct NESSIEstruct *)ctx); } void hash_final_whirlpool(void * ctx, unsigned char *digest) { NESSIEfinalize((struct NESSIEstruct *)ctx,digest); } /* #define TRACE_INTERMEDIATE_VALUES */ /* * The number of rounds of the internal dedicated block cipher. */ #define R 10 /* * Though Whirlpool is endianness-neutral, the encryption tables are listed * in BIG-ENDIAN format, which is adopted throughout this implementation * (but little-endian notation would be equally suitable if consistently * employed). */ static const u64 C0[256] = { LL(0x18186018c07830d8), LL(0x23238c2305af4626), LL(0xc6c63fc67ef991b8), LL(0xe8e887e8136fcdfb), LL(0x878726874ca113cb), LL(0xb8b8dab8a9626d11), LL(0x0101040108050209), LL(0x4f4f214f426e9e0d), LL(0x3636d836adee6c9b), LL(0xa6a6a2a6590451ff), LL(0xd2d26fd2debdb90c), LL(0xf5f5f3f5fb06f70e), LL(0x7979f979ef80f296), LL(0x6f6fa16f5fcede30), LL(0x91917e91fcef3f6d), LL(0x52525552aa07a4f8), LL(0x60609d6027fdc047), LL(0xbcbccabc89766535), LL(0x9b9b569baccd2b37), LL(0x8e8e028e048c018a), LL(0xa3a3b6a371155bd2), LL(0x0c0c300c603c186c), LL(0x7b7bf17bff8af684), LL(0x3535d435b5e16a80), LL(0x1d1d741de8693af5), LL(0xe0e0a7e05347ddb3), LL(0xd7d77bd7f6acb321), LL(0xc2c22fc25eed999c), LL(0x2e2eb82e6d965c43), LL(0x4b4b314b627a9629), LL(0xfefedffea321e15d), LL(0x575741578216aed5), LL(0x15155415a8412abd), LL(0x7777c1779fb6eee8), LL(0x3737dc37a5eb6e92), LL(0xe5e5b3e57b56d79e), LL(0x9f9f469f8cd92313), LL(0xf0f0e7f0d317fd23), LL(0x4a4a354a6a7f9420), LL(0xdada4fda9e95a944), LL(0x58587d58fa25b0a2), LL(0xc9c903c906ca8fcf), LL(0x2929a429558d527c), LL(0x0a0a280a5022145a), LL(0xb1b1feb1e14f7f50), LL(0xa0a0baa0691a5dc9), LL(0x6b6bb16b7fdad614), LL(0x85852e855cab17d9), LL(0xbdbdcebd8173673c), LL(0x5d5d695dd234ba8f), LL(0x1010401080502090), LL(0xf4f4f7f4f303f507), LL(0xcbcb0bcb16c08bdd), LL(0x3e3ef83eedc67cd3), LL(0x0505140528110a2d), LL(0x676781671fe6ce78), LL(0xe4e4b7e47353d597), LL(0x27279c2725bb4e02), LL(0x4141194132588273), LL(0x8b8b168b2c9d0ba7), LL(0xa7a7a6a7510153f6), LL(0x7d7de97dcf94fab2), LL(0x95956e95dcfb3749), LL(0xd8d847d88e9fad56), LL(0xfbfbcbfb8b30eb70), LL(0xeeee9fee2371c1cd), LL(0x7c7ced7cc791f8bb), LL(0x6666856617e3cc71), LL(0xdddd53dda68ea77b), LL(0x17175c17b84b2eaf), LL(0x4747014702468e45), LL(0x9e9e429e84dc211a), LL(0xcaca0fca1ec589d4), LL(0x2d2db42d75995a58), LL(0xbfbfc6bf9179632e), LL(0x07071c07381b0e3f), LL(0xadad8ead012347ac), LL(0x5a5a755aea2fb4b0), LL(0x838336836cb51bef), LL(0x3333cc3385ff66b6), LL(0x636391633ff2c65c), LL(0x02020802100a0412), LL(0xaaaa92aa39384993), LL(0x7171d971afa8e2de), LL(0xc8c807c80ecf8dc6), LL(0x19196419c87d32d1), LL(0x494939497270923b), LL(0xd9d943d9869aaf5f), LL(0xf2f2eff2c31df931), LL(0xe3e3abe34b48dba8), LL(0x5b5b715be22ab6b9), LL(0x88881a8834920dbc), LL(0x9a9a529aa4c8293e), LL(0x262698262dbe4c0b), LL(0x3232c8328dfa64bf), LL(0xb0b0fab0e94a7d59), LL(0xe9e983e91b6acff2), LL(0x0f0f3c0f78331e77), LL(0xd5d573d5e6a6b733), LL(0x80803a8074ba1df4), LL(0xbebec2be997c6127), LL(0xcdcd13cd26de87eb), LL(0x3434d034bde46889), LL(0x48483d487a759032), LL(0xffffdbffab24e354), LL(0x7a7af57af78ff48d), LL(0x90907a90f4ea3d64), LL(0x5f5f615fc23ebe9d), LL(0x202080201da0403d), LL(0x6868bd6867d5d00f), LL(0x1a1a681ad07234ca), LL(0xaeae82ae192c41b7), LL(0xb4b4eab4c95e757d), LL(0x54544d549a19a8ce), LL(0x93937693ece53b7f), LL(0x222288220daa442f), LL(0x64648d6407e9c863), LL(0xf1f1e3f1db12ff2a), LL(0x7373d173bfa2e6cc), LL(0x12124812905a2482), LL(0x40401d403a5d807a), LL(0x0808200840281048), LL(0xc3c32bc356e89b95), LL(0xecec97ec337bc5df), LL(0xdbdb4bdb9690ab4d), LL(0xa1a1bea1611f5fc0), LL(0x8d8d0e8d1c830791), LL(0x3d3df43df5c97ac8), LL(0x97976697ccf1335b), LL(0x0000000000000000), LL(0xcfcf1bcf36d483f9), LL(0x2b2bac2b4587566e), LL(0x7676c57697b3ece1), LL(0x8282328264b019e6), LL(0xd6d67fd6fea9b128), LL(0x1b1b6c1bd87736c3), LL(0xb5b5eeb5c15b7774), LL(0xafaf86af112943be), LL(0x6a6ab56a77dfd41d), LL(0x50505d50ba0da0ea), LL(0x45450945124c8a57), LL(0xf3f3ebf3cb18fb38), LL(0x3030c0309df060ad), LL(0xefef9bef2b74c3c4), LL(0x3f3ffc3fe5c37eda), LL(0x55554955921caac7), LL(0xa2a2b2a2791059db), LL(0xeaea8fea0365c9e9), LL(0x656589650fecca6a), LL(0xbabad2bab9686903), LL(0x2f2fbc2f65935e4a), LL(0xc0c027c04ee79d8e), LL(0xdede5fdebe81a160), LL(0x1c1c701ce06c38fc), LL(0xfdfdd3fdbb2ee746), LL(0x4d4d294d52649a1f), LL(0x92927292e4e03976), LL(0x7575c9758fbceafa), LL(0x06061806301e0c36), LL(0x8a8a128a249809ae), LL(0xb2b2f2b2f940794b), LL(0xe6e6bfe66359d185), LL(0x0e0e380e70361c7e), LL(0x1f1f7c1ff8633ee7), LL(0x6262956237f7c455), LL(0xd4d477d4eea3b53a), LL(0xa8a89aa829324d81), LL(0x96966296c4f43152), LL(0xf9f9c3f99b3aef62), LL(0xc5c533c566f697a3), LL(0x2525942535b14a10), LL(0x59597959f220b2ab), LL(0x84842a8454ae15d0), LL(0x7272d572b7a7e4c5), LL(0x3939e439d5dd72ec), LL(0x4c4c2d4c5a619816), LL(0x5e5e655eca3bbc94), LL(0x7878fd78e785f09f), LL(0x3838e038ddd870e5), LL(0x8c8c0a8c14860598), LL(0xd1d163d1c6b2bf17), LL(0xa5a5aea5410b57e4), LL(0xe2e2afe2434dd9a1), LL(0x616199612ff8c24e), LL(0xb3b3f6b3f1457b42), LL(0x2121842115a54234), LL(0x9c9c4a9c94d62508), LL(0x1e1e781ef0663cee), LL(0x4343114322528661), LL(0xc7c73bc776fc93b1), LL(0xfcfcd7fcb32be54f), LL(0x0404100420140824), LL(0x51515951b208a2e3), LL(0x99995e99bcc72f25), LL(0x6d6da96d4fc4da22), LL(0x0d0d340d68391a65), LL(0xfafacffa8335e979), LL(0xdfdf5bdfb684a369), LL(0x7e7ee57ed79bfca9), LL(0x242490243db44819), LL(0x3b3bec3bc5d776fe), LL(0xabab96ab313d4b9a), LL(0xcece1fce3ed181f0), LL(0x1111441188552299), LL(0x8f8f068f0c890383), LL(0x4e4e254e4a6b9c04), LL(0xb7b7e6b7d1517366), LL(0xebeb8beb0b60cbe0), LL(0x3c3cf03cfdcc78c1), LL(0x81813e817cbf1ffd), LL(0x94946a94d4fe3540), LL(0xf7f7fbf7eb0cf31c), LL(0xb9b9deb9a1676f18), LL(0x13134c13985f268b), LL(0x2c2cb02c7d9c5851), LL(0xd3d36bd3d6b8bb05), LL(0xe7e7bbe76b5cd38c), LL(0x6e6ea56e57cbdc39), LL(0xc4c437c46ef395aa), LL(0x03030c03180f061b), LL(0x565645568a13acdc), LL(0x44440d441a49885e), LL(0x7f7fe17fdf9efea0), LL(0xa9a99ea921374f88), LL(0x2a2aa82a4d825467), LL(0xbbbbd6bbb16d6b0a), LL(0xc1c123c146e29f87), LL(0x53535153a202a6f1), LL(0xdcdc57dcae8ba572), LL(0x0b0b2c0b58271653), LL(0x9d9d4e9d9cd32701), LL(0x6c6cad6c47c1d82b), LL(0x3131c43195f562a4), LL(0x7474cd7487b9e8f3), LL(0xf6f6fff6e309f115), LL(0x464605460a438c4c), LL(0xacac8aac092645a5), LL(0x89891e893c970fb5), LL(0x14145014a04428b4), LL(0xe1e1a3e15b42dfba), LL(0x16165816b04e2ca6), LL(0x3a3ae83acdd274f7), LL(0x6969b9696fd0d206), LL(0x09092409482d1241), LL(0x7070dd70a7ade0d7), LL(0xb6b6e2b6d954716f), LL(0xd0d067d0ceb7bd1e), LL(0xeded93ed3b7ec7d6), LL(0xcccc17cc2edb85e2), LL(0x424215422a578468), LL(0x98985a98b4c22d2c), LL(0xa4a4aaa4490e55ed), LL(0x2828a0285d885075), LL(0x5c5c6d5cda31b886), LL(0xf8f8c7f8933fed6b), LL(0x8686228644a411c2), }; static const u64 C1[256] = { LL(0xd818186018c07830), LL(0x2623238c2305af46), LL(0xb8c6c63fc67ef991), LL(0xfbe8e887e8136fcd), LL(0xcb878726874ca113), LL(0x11b8b8dab8a9626d), LL(0x0901010401080502), LL(0x0d4f4f214f426e9e), LL(0x9b3636d836adee6c), LL(0xffa6a6a2a6590451), LL(0x0cd2d26fd2debdb9), LL(0x0ef5f5f3f5fb06f7), LL(0x967979f979ef80f2), LL(0x306f6fa16f5fcede), LL(0x6d91917e91fcef3f), LL(0xf852525552aa07a4), LL(0x4760609d6027fdc0), LL(0x35bcbccabc897665), LL(0x379b9b569baccd2b), LL(0x8a8e8e028e048c01), LL(0xd2a3a3b6a371155b), LL(0x6c0c0c300c603c18), LL(0x847b7bf17bff8af6), LL(0x803535d435b5e16a), LL(0xf51d1d741de8693a), LL(0xb3e0e0a7e05347dd), LL(0x21d7d77bd7f6acb3), LL(0x9cc2c22fc25eed99), LL(0x432e2eb82e6d965c), LL(0x294b4b314b627a96), LL(0x5dfefedffea321e1), LL(0xd5575741578216ae), LL(0xbd15155415a8412a), LL(0xe87777c1779fb6ee), LL(0x923737dc37a5eb6e), LL(0x9ee5e5b3e57b56d7), LL(0x139f9f469f8cd923), LL(0x23f0f0e7f0d317fd), LL(0x204a4a354a6a7f94), LL(0x44dada4fda9e95a9), LL(0xa258587d58fa25b0), LL(0xcfc9c903c906ca8f), LL(0x7c2929a429558d52), LL(0x5a0a0a280a502214), LL(0x50b1b1feb1e14f7f), LL(0xc9a0a0baa0691a5d), LL(0x146b6bb16b7fdad6), LL(0xd985852e855cab17), LL(0x3cbdbdcebd817367), LL(0x8f5d5d695dd234ba), LL(0x9010104010805020), LL(0x07f4f4f7f4f303f5), LL(0xddcbcb0bcb16c08b), LL(0xd33e3ef83eedc67c), LL(0x2d0505140528110a), LL(0x78676781671fe6ce), LL(0x97e4e4b7e47353d5), LL(0x0227279c2725bb4e), LL(0x7341411941325882), LL(0xa78b8b168b2c9d0b), LL(0xf6a7a7a6a7510153), LL(0xb27d7de97dcf94fa), LL(0x4995956e95dcfb37), LL(0x56d8d847d88e9fad), LL(0x70fbfbcbfb8b30eb), LL(0xcdeeee9fee2371c1), LL(0xbb7c7ced7cc791f8), LL(0x716666856617e3cc), LL(0x7bdddd53dda68ea7), LL(0xaf17175c17b84b2e), LL(0x454747014702468e), LL(0x1a9e9e429e84dc21), LL(0xd4caca0fca1ec589), LL(0x582d2db42d75995a), LL(0x2ebfbfc6bf917963), LL(0x3f07071c07381b0e), LL(0xacadad8ead012347), LL(0xb05a5a755aea2fb4), LL(0xef838336836cb51b), LL(0xb63333cc3385ff66), LL(0x5c636391633ff2c6), LL(0x1202020802100a04), LL(0x93aaaa92aa393849), LL(0xde7171d971afa8e2), LL(0xc6c8c807c80ecf8d), LL(0xd119196419c87d32), LL(0x3b49493949727092), LL(0x5fd9d943d9869aaf), LL(0x31f2f2eff2c31df9), LL(0xa8e3e3abe34b48db), LL(0xb95b5b715be22ab6), LL(0xbc88881a8834920d), LL(0x3e9a9a529aa4c829), LL(0x0b262698262dbe4c), LL(0xbf3232c8328dfa64), LL(0x59b0b0fab0e94a7d), LL(0xf2e9e983e91b6acf), LL(0x770f0f3c0f78331e), LL(0x33d5d573d5e6a6b7), LL(0xf480803a8074ba1d), LL(0x27bebec2be997c61), LL(0xebcdcd13cd26de87), LL(0x893434d034bde468), LL(0x3248483d487a7590), LL(0x54ffffdbffab24e3), LL(0x8d7a7af57af78ff4), LL(0x6490907a90f4ea3d), LL(0x9d5f5f615fc23ebe), LL(0x3d202080201da040), LL(0x0f6868bd6867d5d0), LL(0xca1a1a681ad07234), LL(0xb7aeae82ae192c41), LL(0x7db4b4eab4c95e75), LL(0xce54544d549a19a8), LL(0x7f93937693ece53b), LL(0x2f222288220daa44), LL(0x6364648d6407e9c8), LL(0x2af1f1e3f1db12ff), LL(0xcc7373d173bfa2e6), LL(0x8212124812905a24), LL(0x7a40401d403a5d80), LL(0x4808082008402810), LL(0x95c3c32bc356e89b), LL(0xdfecec97ec337bc5), LL(0x4ddbdb4bdb9690ab), LL(0xc0a1a1bea1611f5f), LL(0x918d8d0e8d1c8307), LL(0xc83d3df43df5c97a), LL(0x5b97976697ccf133), LL(0x0000000000000000), LL(0xf9cfcf1bcf36d483), LL(0x6e2b2bac2b458756), LL(0xe17676c57697b3ec), LL(0xe68282328264b019), LL(0x28d6d67fd6fea9b1), LL(0xc31b1b6c1bd87736), LL(0x74b5b5eeb5c15b77), LL(0xbeafaf86af112943), LL(0x1d6a6ab56a77dfd4), LL(0xea50505d50ba0da0), LL(0x5745450945124c8a), LL(0x38f3f3ebf3cb18fb), LL(0xad3030c0309df060), LL(0xc4efef9bef2b74c3), LL(0xda3f3ffc3fe5c37e), LL(0xc755554955921caa), LL(0xdba2a2b2a2791059), LL(0xe9eaea8fea0365c9), LL(0x6a656589650fecca), LL(0x03babad2bab96869), LL(0x4a2f2fbc2f65935e), LL(0x8ec0c027c04ee79d), LL(0x60dede5fdebe81a1), LL(0xfc1c1c701ce06c38), LL(0x46fdfdd3fdbb2ee7), LL(0x1f4d4d294d52649a), LL(0x7692927292e4e039), LL(0xfa7575c9758fbcea), LL(0x3606061806301e0c), LL(0xae8a8a128a249809), LL(0x4bb2b2f2b2f94079), LL(0x85e6e6bfe66359d1), LL(0x7e0e0e380e70361c), LL(0xe71f1f7c1ff8633e), LL(0x556262956237f7c4), LL(0x3ad4d477d4eea3b5), LL(0x81a8a89aa829324d), LL(0x5296966296c4f431), LL(0x62f9f9c3f99b3aef), LL(0xa3c5c533c566f697), LL(0x102525942535b14a), LL(0xab59597959f220b2), LL(0xd084842a8454ae15), LL(0xc57272d572b7a7e4), LL(0xec3939e439d5dd72), LL(0x164c4c2d4c5a6198), LL(0x945e5e655eca3bbc), LL(0x9f7878fd78e785f0), LL(0xe53838e038ddd870), LL(0x988c8c0a8c148605), LL(0x17d1d163d1c6b2bf), LL(0xe4a5a5aea5410b57), LL(0xa1e2e2afe2434dd9), LL(0x4e616199612ff8c2), LL(0x42b3b3f6b3f1457b), LL(0x342121842115a542), LL(0x089c9c4a9c94d625), LL(0xee1e1e781ef0663c), LL(0x6143431143225286), LL(0xb1c7c73bc776fc93), LL(0x4ffcfcd7fcb32be5), LL(0x2404041004201408), LL(0xe351515951b208a2), LL(0x2599995e99bcc72f), LL(0x226d6da96d4fc4da), LL(0x650d0d340d68391a), LL(0x79fafacffa8335e9), LL(0x69dfdf5bdfb684a3), LL(0xa97e7ee57ed79bfc), LL(0x19242490243db448), LL(0xfe3b3bec3bc5d776), LL(0x9aabab96ab313d4b), LL(0xf0cece1fce3ed181), LL(0x9911114411885522), LL(0x838f8f068f0c8903), LL(0x044e4e254e4a6b9c), LL(0x66b7b7e6b7d15173), LL(0xe0ebeb8beb0b60cb), LL(0xc13c3cf03cfdcc78), LL(0xfd81813e817cbf1f), LL(0x4094946a94d4fe35), LL(0x1cf7f7fbf7eb0cf3), LL(0x18b9b9deb9a1676f), LL(0x8b13134c13985f26), LL(0x512c2cb02c7d9c58), LL(0x05d3d36bd3d6b8bb), LL(0x8ce7e7bbe76b5cd3), LL(0x396e6ea56e57cbdc), LL(0xaac4c437c46ef395), LL(0x1b03030c03180f06), LL(0xdc565645568a13ac), LL(0x5e44440d441a4988), LL(0xa07f7fe17fdf9efe), LL(0x88a9a99ea921374f), LL(0x672a2aa82a4d8254), LL(0x0abbbbd6bbb16d6b), LL(0x87c1c123c146e29f), LL(0xf153535153a202a6), LL(0x72dcdc57dcae8ba5), LL(0x530b0b2c0b582716), LL(0x019d9d4e9d9cd327), LL(0x2b6c6cad6c47c1d8), LL(0xa43131c43195f562), LL(0xf37474cd7487b9e8), LL(0x15f6f6fff6e309f1), LL(0x4c464605460a438c), LL(0xa5acac8aac092645), LL(0xb589891e893c970f), LL(0xb414145014a04428), LL(0xbae1e1a3e15b42df), LL(0xa616165816b04e2c), LL(0xf73a3ae83acdd274), LL(0x066969b9696fd0d2), LL(0x4109092409482d12), LL(0xd77070dd70a7ade0), LL(0x6fb6b6e2b6d95471), LL(0x1ed0d067d0ceb7bd), LL(0xd6eded93ed3b7ec7), LL(0xe2cccc17cc2edb85), LL(0x68424215422a5784), LL(0x2c98985a98b4c22d), LL(0xeda4a4aaa4490e55), LL(0x752828a0285d8850), LL(0x865c5c6d5cda31b8), LL(0x6bf8f8c7f8933fed), LL(0xc28686228644a411), }; static const u64 C2[256] = { LL(0x30d818186018c078), LL(0x462623238c2305af), LL(0x91b8c6c63fc67ef9), LL(0xcdfbe8e887e8136f), LL(0x13cb878726874ca1), LL(0x6d11b8b8dab8a962), LL(0x0209010104010805), LL(0x9e0d4f4f214f426e), LL(0x6c9b3636d836adee), LL(0x51ffa6a6a2a65904), LL(0xb90cd2d26fd2debd), LL(0xf70ef5f5f3f5fb06), LL(0xf2967979f979ef80), LL(0xde306f6fa16f5fce), LL(0x3f6d91917e91fcef), LL(0xa4f852525552aa07), LL(0xc04760609d6027fd), LL(0x6535bcbccabc8976), LL(0x2b379b9b569baccd), LL(0x018a8e8e028e048c), LL(0x5bd2a3a3b6a37115), LL(0x186c0c0c300c603c), LL(0xf6847b7bf17bff8a), LL(0x6a803535d435b5e1), LL(0x3af51d1d741de869), LL(0xddb3e0e0a7e05347), LL(0xb321d7d77bd7f6ac), LL(0x999cc2c22fc25eed), LL(0x5c432e2eb82e6d96), LL(0x96294b4b314b627a), LL(0xe15dfefedffea321), LL(0xaed5575741578216), LL(0x2abd15155415a841), LL(0xeee87777c1779fb6), LL(0x6e923737dc37a5eb), LL(0xd79ee5e5b3e57b56), LL(0x23139f9f469f8cd9), LL(0xfd23f0f0e7f0d317), LL(0x94204a4a354a6a7f), LL(0xa944dada4fda9e95), LL(0xb0a258587d58fa25), LL(0x8fcfc9c903c906ca), LL(0x527c2929a429558d), LL(0x145a0a0a280a5022), LL(0x7f50b1b1feb1e14f), LL(0x5dc9a0a0baa0691a), LL(0xd6146b6bb16b7fda), LL(0x17d985852e855cab), LL(0x673cbdbdcebd8173), LL(0xba8f5d5d695dd234), LL(0x2090101040108050), LL(0xf507f4f4f7f4f303), LL(0x8bddcbcb0bcb16c0), LL(0x7cd33e3ef83eedc6), LL(0x0a2d050514052811), LL(0xce78676781671fe6), LL(0xd597e4e4b7e47353), LL(0x4e0227279c2725bb), LL(0x8273414119413258), LL(0x0ba78b8b168b2c9d), LL(0x53f6a7a7a6a75101), LL(0xfab27d7de97dcf94), LL(0x374995956e95dcfb), LL(0xad56d8d847d88e9f), LL(0xeb70fbfbcbfb8b30), LL(0xc1cdeeee9fee2371), LL(0xf8bb7c7ced7cc791), LL(0xcc716666856617e3), LL(0xa77bdddd53dda68e), LL(0x2eaf17175c17b84b), LL(0x8e45474701470246), LL(0x211a9e9e429e84dc), LL(0x89d4caca0fca1ec5), LL(0x5a582d2db42d7599), LL(0x632ebfbfc6bf9179), LL(0x0e3f07071c07381b), LL(0x47acadad8ead0123), LL(0xb4b05a5a755aea2f), LL(0x1bef838336836cb5), LL(0x66b63333cc3385ff), LL(0xc65c636391633ff2), LL(0x041202020802100a), LL(0x4993aaaa92aa3938), LL(0xe2de7171d971afa8), LL(0x8dc6c8c807c80ecf), LL(0x32d119196419c87d), LL(0x923b494939497270), LL(0xaf5fd9d943d9869a), LL(0xf931f2f2eff2c31d), LL(0xdba8e3e3abe34b48), LL(0xb6b95b5b715be22a), LL(0x0dbc88881a883492), LL(0x293e9a9a529aa4c8), LL(0x4c0b262698262dbe), LL(0x64bf3232c8328dfa), LL(0x7d59b0b0fab0e94a), LL(0xcff2e9e983e91b6a), LL(0x1e770f0f3c0f7833), LL(0xb733d5d573d5e6a6), LL(0x1df480803a8074ba), LL(0x6127bebec2be997c), LL(0x87ebcdcd13cd26de), LL(0x68893434d034bde4), LL(0x903248483d487a75), LL(0xe354ffffdbffab24), LL(0xf48d7a7af57af78f), LL(0x3d6490907a90f4ea), LL(0xbe9d5f5f615fc23e), LL(0x403d202080201da0), LL(0xd00f6868bd6867d5), LL(0x34ca1a1a681ad072), LL(0x41b7aeae82ae192c), LL(0x757db4b4eab4c95e), LL(0xa8ce54544d549a19), LL(0x3b7f93937693ece5), LL(0x442f222288220daa), LL(0xc86364648d6407e9), LL(0xff2af1f1e3f1db12), LL(0xe6cc7373d173bfa2), LL(0x248212124812905a), LL(0x807a40401d403a5d), LL(0x1048080820084028), LL(0x9b95c3c32bc356e8), LL(0xc5dfecec97ec337b), LL(0xab4ddbdb4bdb9690), LL(0x5fc0a1a1bea1611f), LL(0x07918d8d0e8d1c83), LL(0x7ac83d3df43df5c9), LL(0x335b97976697ccf1), LL(0x0000000000000000), LL(0x83f9cfcf1bcf36d4), LL(0x566e2b2bac2b4587), LL(0xece17676c57697b3), LL(0x19e68282328264b0), LL(0xb128d6d67fd6fea9), LL(0x36c31b1b6c1bd877), LL(0x7774b5b5eeb5c15b), LL(0x43beafaf86af1129), LL(0xd41d6a6ab56a77df), LL(0xa0ea50505d50ba0d), LL(0x8a5745450945124c), LL(0xfb38f3f3ebf3cb18), LL(0x60ad3030c0309df0), LL(0xc3c4efef9bef2b74), LL(0x7eda3f3ffc3fe5c3), LL(0xaac755554955921c), LL(0x59dba2a2b2a27910), LL(0xc9e9eaea8fea0365), LL(0xca6a656589650fec), LL(0x6903babad2bab968), LL(0x5e4a2f2fbc2f6593), LL(0x9d8ec0c027c04ee7), LL(0xa160dede5fdebe81), LL(0x38fc1c1c701ce06c), LL(0xe746fdfdd3fdbb2e), LL(0x9a1f4d4d294d5264), LL(0x397692927292e4e0), LL(0xeafa7575c9758fbc), LL(0x0c3606061806301e), LL(0x09ae8a8a128a2498), LL(0x794bb2b2f2b2f940), LL(0xd185e6e6bfe66359), LL(0x1c7e0e0e380e7036), LL(0x3ee71f1f7c1ff863), LL(0xc4556262956237f7), LL(0xb53ad4d477d4eea3), LL(0x4d81a8a89aa82932), LL(0x315296966296c4f4), LL(0xef62f9f9c3f99b3a), LL(0x97a3c5c533c566f6), LL(0x4a102525942535b1), LL(0xb2ab59597959f220), LL(0x15d084842a8454ae), LL(0xe4c57272d572b7a7), LL(0x72ec3939e439d5dd), LL(0x98164c4c2d4c5a61), LL(0xbc945e5e655eca3b), LL(0xf09f7878fd78e785), LL(0x70e53838e038ddd8), LL(0x05988c8c0a8c1486), LL(0xbf17d1d163d1c6b2), LL(0x57e4a5a5aea5410b), LL(0xd9a1e2e2afe2434d), LL(0xc24e616199612ff8), LL(0x7b42b3b3f6b3f145), LL(0x42342121842115a5), LL(0x25089c9c4a9c94d6), LL(0x3cee1e1e781ef066), LL(0x8661434311432252), LL(0x93b1c7c73bc776fc), LL(0xe54ffcfcd7fcb32b), LL(0x0824040410042014), LL(0xa2e351515951b208), LL(0x2f2599995e99bcc7), LL(0xda226d6da96d4fc4), LL(0x1a650d0d340d6839), LL(0xe979fafacffa8335), LL(0xa369dfdf5bdfb684), LL(0xfca97e7ee57ed79b), LL(0x4819242490243db4), LL(0x76fe3b3bec3bc5d7), LL(0x4b9aabab96ab313d), LL(0x81f0cece1fce3ed1), LL(0x2299111144118855), LL(0x03838f8f068f0c89), LL(0x9c044e4e254e4a6b), LL(0x7366b7b7e6b7d151), LL(0xcbe0ebeb8beb0b60), LL(0x78c13c3cf03cfdcc), LL(0x1ffd81813e817cbf), LL(0x354094946a94d4fe), LL(0xf31cf7f7fbf7eb0c), LL(0x6f18b9b9deb9a167), LL(0x268b13134c13985f), LL(0x58512c2cb02c7d9c), LL(0xbb05d3d36bd3d6b8), LL(0xd38ce7e7bbe76b5c), LL(0xdc396e6ea56e57cb), LL(0x95aac4c437c46ef3), LL(0x061b03030c03180f), LL(0xacdc565645568a13), LL(0x885e44440d441a49), LL(0xfea07f7fe17fdf9e), LL(0x4f88a9a99ea92137), LL(0x54672a2aa82a4d82), LL(0x6b0abbbbd6bbb16d), LL(0x9f87c1c123c146e2), LL(0xa6f153535153a202), LL(0xa572dcdc57dcae8b), LL(0x16530b0b2c0b5827), LL(0x27019d9d4e9d9cd3), LL(0xd82b6c6cad6c47c1), LL(0x62a43131c43195f5), LL(0xe8f37474cd7487b9), LL(0xf115f6f6fff6e309), LL(0x8c4c464605460a43), LL(0x45a5acac8aac0926), LL(0x0fb589891e893c97), LL(0x28b414145014a044), LL(0xdfbae1e1a3e15b42), LL(0x2ca616165816b04e), LL(0x74f73a3ae83acdd2), LL(0xd2066969b9696fd0), LL(0x124109092409482d), LL(0xe0d77070dd70a7ad), LL(0x716fb6b6e2b6d954), LL(0xbd1ed0d067d0ceb7), LL(0xc7d6eded93ed3b7e), LL(0x85e2cccc17cc2edb), LL(0x8468424215422a57), LL(0x2d2c98985a98b4c2), LL(0x55eda4a4aaa4490e), LL(0x50752828a0285d88), LL(0xb8865c5c6d5cda31), LL(0xed6bf8f8c7f8933f), LL(0x11c28686228644a4), }; static const u64 C3[256] = { LL(0x7830d818186018c0), LL(0xaf462623238c2305), LL(0xf991b8c6c63fc67e), LL(0x6fcdfbe8e887e813), LL(0xa113cb878726874c), LL(0x626d11b8b8dab8a9), LL(0x0502090101040108), LL(0x6e9e0d4f4f214f42), LL(0xee6c9b3636d836ad), LL(0x0451ffa6a6a2a659), LL(0xbdb90cd2d26fd2de), LL(0x06f70ef5f5f3f5fb), LL(0x80f2967979f979ef), LL(0xcede306f6fa16f5f), LL(0xef3f6d91917e91fc), LL(0x07a4f852525552aa), LL(0xfdc04760609d6027), LL(0x766535bcbccabc89), LL(0xcd2b379b9b569bac), LL(0x8c018a8e8e028e04), LL(0x155bd2a3a3b6a371), LL(0x3c186c0c0c300c60), LL(0x8af6847b7bf17bff), LL(0xe16a803535d435b5), LL(0x693af51d1d741de8), LL(0x47ddb3e0e0a7e053), LL(0xacb321d7d77bd7f6), LL(0xed999cc2c22fc25e), LL(0x965c432e2eb82e6d), LL(0x7a96294b4b314b62), LL(0x21e15dfefedffea3), LL(0x16aed55757415782), LL(0x412abd15155415a8), LL(0xb6eee87777c1779f), LL(0xeb6e923737dc37a5), LL(0x56d79ee5e5b3e57b), LL(0xd923139f9f469f8c), LL(0x17fd23f0f0e7f0d3), LL(0x7f94204a4a354a6a), LL(0x95a944dada4fda9e), LL(0x25b0a258587d58fa), LL(0xca8fcfc9c903c906), LL(0x8d527c2929a42955), LL(0x22145a0a0a280a50), LL(0x4f7f50b1b1feb1e1), LL(0x1a5dc9a0a0baa069), LL(0xdad6146b6bb16b7f), LL(0xab17d985852e855c), LL(0x73673cbdbdcebd81), LL(0x34ba8f5d5d695dd2), LL(0x5020901010401080), LL(0x03f507f4f4f7f4f3), LL(0xc08bddcbcb0bcb16), LL(0xc67cd33e3ef83eed), LL(0x110a2d0505140528), LL(0xe6ce78676781671f), LL(0x53d597e4e4b7e473), LL(0xbb4e0227279c2725), LL(0x5882734141194132), LL(0x9d0ba78b8b168b2c), LL(0x0153f6a7a7a6a751), LL(0x94fab27d7de97dcf), LL(0xfb374995956e95dc), LL(0x9fad56d8d847d88e), LL(0x30eb70fbfbcbfb8b), LL(0x71c1cdeeee9fee23), LL(0x91f8bb7c7ced7cc7), LL(0xe3cc716666856617), LL(0x8ea77bdddd53dda6), LL(0x4b2eaf17175c17b8), LL(0x468e454747014702), LL(0xdc211a9e9e429e84), LL(0xc589d4caca0fca1e), LL(0x995a582d2db42d75), LL(0x79632ebfbfc6bf91), LL(0x1b0e3f07071c0738), LL(0x2347acadad8ead01), LL(0x2fb4b05a5a755aea), LL(0xb51bef838336836c), LL(0xff66b63333cc3385), LL(0xf2c65c636391633f), LL(0x0a04120202080210), LL(0x384993aaaa92aa39), LL(0xa8e2de7171d971af), LL(0xcf8dc6c8c807c80e), LL(0x7d32d119196419c8), LL(0x70923b4949394972), LL(0x9aaf5fd9d943d986), LL(0x1df931f2f2eff2c3), LL(0x48dba8e3e3abe34b), LL(0x2ab6b95b5b715be2), LL(0x920dbc88881a8834), LL(0xc8293e9a9a529aa4), LL(0xbe4c0b262698262d), LL(0xfa64bf3232c8328d), LL(0x4a7d59b0b0fab0e9), LL(0x6acff2e9e983e91b), LL(0x331e770f0f3c0f78), LL(0xa6b733d5d573d5e6), LL(0xba1df480803a8074), LL(0x7c6127bebec2be99), LL(0xde87ebcdcd13cd26), LL(0xe468893434d034bd), LL(0x75903248483d487a), LL(0x24e354ffffdbffab), LL(0x8ff48d7a7af57af7), LL(0xea3d6490907a90f4), LL(0x3ebe9d5f5f615fc2), LL(0xa0403d202080201d), LL(0xd5d00f6868bd6867), LL(0x7234ca1a1a681ad0), LL(0x2c41b7aeae82ae19), LL(0x5e757db4b4eab4c9), LL(0x19a8ce54544d549a), LL(0xe53b7f93937693ec), LL(0xaa442f222288220d), LL(0xe9c86364648d6407), LL(0x12ff2af1f1e3f1db), LL(0xa2e6cc7373d173bf), LL(0x5a24821212481290), LL(0x5d807a40401d403a), LL(0x2810480808200840), LL(0xe89b95c3c32bc356), LL(0x7bc5dfecec97ec33), LL(0x90ab4ddbdb4bdb96), LL(0x1f5fc0a1a1bea161), LL(0x8307918d8d0e8d1c), LL(0xc97ac83d3df43df5), LL(0xf1335b97976697cc), LL(0x0000000000000000), LL(0xd483f9cfcf1bcf36), LL(0x87566e2b2bac2b45), LL(0xb3ece17676c57697), LL(0xb019e68282328264), LL(0xa9b128d6d67fd6fe), LL(0x7736c31b1b6c1bd8), LL(0x5b7774b5b5eeb5c1), LL(0x2943beafaf86af11), LL(0xdfd41d6a6ab56a77), LL(0x0da0ea50505d50ba), LL(0x4c8a574545094512), LL(0x18fb38f3f3ebf3cb), LL(0xf060ad3030c0309d), LL(0x74c3c4efef9bef2b), LL(0xc37eda3f3ffc3fe5), LL(0x1caac75555495592), LL(0x1059dba2a2b2a279), LL(0x65c9e9eaea8fea03), LL(0xecca6a656589650f), LL(0x686903babad2bab9), LL(0x935e4a2f2fbc2f65), LL(0xe79d8ec0c027c04e), LL(0x81a160dede5fdebe), LL(0x6c38fc1c1c701ce0), LL(0x2ee746fdfdd3fdbb), LL(0x649a1f4d4d294d52), LL(0xe0397692927292e4), LL(0xbceafa7575c9758f), LL(0x1e0c360606180630), LL(0x9809ae8a8a128a24), LL(0x40794bb2b2f2b2f9), LL(0x59d185e6e6bfe663), LL(0x361c7e0e0e380e70), LL(0x633ee71f1f7c1ff8), LL(0xf7c4556262956237), LL(0xa3b53ad4d477d4ee), LL(0x324d81a8a89aa829), LL(0xf4315296966296c4), LL(0x3aef62f9f9c3f99b), LL(0xf697a3c5c533c566), LL(0xb14a102525942535), LL(0x20b2ab59597959f2), LL(0xae15d084842a8454), LL(0xa7e4c57272d572b7), LL(0xdd72ec3939e439d5), LL(0x6198164c4c2d4c5a), LL(0x3bbc945e5e655eca), LL(0x85f09f7878fd78e7), LL(0xd870e53838e038dd), LL(0x8605988c8c0a8c14), LL(0xb2bf17d1d163d1c6), LL(0x0b57e4a5a5aea541), LL(0x4dd9a1e2e2afe243), LL(0xf8c24e616199612f), LL(0x457b42b3b3f6b3f1), LL(0xa542342121842115), LL(0xd625089c9c4a9c94), LL(0x663cee1e1e781ef0), LL(0x5286614343114322), LL(0xfc93b1c7c73bc776), LL(0x2be54ffcfcd7fcb3), LL(0x1408240404100420), LL(0x08a2e351515951b2), LL(0xc72f2599995e99bc), LL(0xc4da226d6da96d4f), LL(0x391a650d0d340d68), LL(0x35e979fafacffa83), LL(0x84a369dfdf5bdfb6), LL(0x9bfca97e7ee57ed7), LL(0xb44819242490243d), LL(0xd776fe3b3bec3bc5), LL(0x3d4b9aabab96ab31), LL(0xd181f0cece1fce3e), LL(0x5522991111441188), LL(0x8903838f8f068f0c), LL(0x6b9c044e4e254e4a), LL(0x517366b7b7e6b7d1), LL(0x60cbe0ebeb8beb0b), LL(0xcc78c13c3cf03cfd), LL(0xbf1ffd81813e817c), LL(0xfe354094946a94d4), LL(0x0cf31cf7f7fbf7eb), LL(0x676f18b9b9deb9a1), LL(0x5f268b13134c1398), LL(0x9c58512c2cb02c7d), LL(0xb8bb05d3d36bd3d6), LL(0x5cd38ce7e7bbe76b), LL(0xcbdc396e6ea56e57), LL(0xf395aac4c437c46e), LL(0x0f061b03030c0318), LL(0x13acdc565645568a), LL(0x49885e44440d441a), LL(0x9efea07f7fe17fdf), LL(0x374f88a9a99ea921), LL(0x8254672a2aa82a4d), LL(0x6d6b0abbbbd6bbb1), LL(0xe29f87c1c123c146), LL(0x02a6f153535153a2), LL(0x8ba572dcdc57dcae), LL(0x2716530b0b2c0b58), LL(0xd327019d9d4e9d9c), LL(0xc1d82b6c6cad6c47), LL(0xf562a43131c43195), LL(0xb9e8f37474cd7487), LL(0x09f115f6f6fff6e3), LL(0x438c4c464605460a), LL(0x2645a5acac8aac09), LL(0x970fb589891e893c), LL(0x4428b414145014a0), LL(0x42dfbae1e1a3e15b), LL(0x4e2ca616165816b0), LL(0xd274f73a3ae83acd), LL(0xd0d2066969b9696f), LL(0x2d12410909240948), LL(0xade0d77070dd70a7), LL(0x54716fb6b6e2b6d9), LL(0xb7bd1ed0d067d0ce), LL(0x7ec7d6eded93ed3b), LL(0xdb85e2cccc17cc2e), LL(0x578468424215422a), LL(0xc22d2c98985a98b4), LL(0x0e55eda4a4aaa449), LL(0x8850752828a0285d), LL(0x31b8865c5c6d5cda), LL(0x3fed6bf8f8c7f893), LL(0xa411c28686228644), }; static const u64 C4[256] = { LL(0xc07830d818186018), LL(0x05af462623238c23), LL(0x7ef991b8c6c63fc6), LL(0x136fcdfbe8e887e8), LL(0x4ca113cb87872687), LL(0xa9626d11b8b8dab8), LL(0x0805020901010401), LL(0x426e9e0d4f4f214f), LL(0xadee6c9b3636d836), LL(0x590451ffa6a6a2a6), LL(0xdebdb90cd2d26fd2), LL(0xfb06f70ef5f5f3f5), LL(0xef80f2967979f979), LL(0x5fcede306f6fa16f), LL(0xfcef3f6d91917e91), LL(0xaa07a4f852525552), LL(0x27fdc04760609d60), LL(0x89766535bcbccabc), LL(0xaccd2b379b9b569b), LL(0x048c018a8e8e028e), LL(0x71155bd2a3a3b6a3), LL(0x603c186c0c0c300c), LL(0xff8af6847b7bf17b), LL(0xb5e16a803535d435), LL(0xe8693af51d1d741d), LL(0x5347ddb3e0e0a7e0), LL(0xf6acb321d7d77bd7), LL(0x5eed999cc2c22fc2), LL(0x6d965c432e2eb82e), LL(0x627a96294b4b314b), LL(0xa321e15dfefedffe), LL(0x8216aed557574157), LL(0xa8412abd15155415), LL(0x9fb6eee87777c177), LL(0xa5eb6e923737dc37), LL(0x7b56d79ee5e5b3e5), LL(0x8cd923139f9f469f), LL(0xd317fd23f0f0e7f0), LL(0x6a7f94204a4a354a), LL(0x9e95a944dada4fda), LL(0xfa25b0a258587d58), LL(0x06ca8fcfc9c903c9), LL(0x558d527c2929a429), LL(0x5022145a0a0a280a), LL(0xe14f7f50b1b1feb1), LL(0x691a5dc9a0a0baa0), LL(0x7fdad6146b6bb16b), LL(0x5cab17d985852e85), LL(0x8173673cbdbdcebd), LL(0xd234ba8f5d5d695d), LL(0x8050209010104010), LL(0xf303f507f4f4f7f4), LL(0x16c08bddcbcb0bcb), LL(0xedc67cd33e3ef83e), LL(0x28110a2d05051405), LL(0x1fe6ce7867678167), LL(0x7353d597e4e4b7e4), LL(0x25bb4e0227279c27), LL(0x3258827341411941), LL(0x2c9d0ba78b8b168b), LL(0x510153f6a7a7a6a7), LL(0xcf94fab27d7de97d), LL(0xdcfb374995956e95), LL(0x8e9fad56d8d847d8), LL(0x8b30eb70fbfbcbfb), LL(0x2371c1cdeeee9fee), LL(0xc791f8bb7c7ced7c), LL(0x17e3cc7166668566), LL(0xa68ea77bdddd53dd), LL(0xb84b2eaf17175c17), LL(0x02468e4547470147), LL(0x84dc211a9e9e429e), LL(0x1ec589d4caca0fca), LL(0x75995a582d2db42d), LL(0x9179632ebfbfc6bf), LL(0x381b0e3f07071c07), LL(0x012347acadad8ead), LL(0xea2fb4b05a5a755a), LL(0x6cb51bef83833683), LL(0x85ff66b63333cc33), LL(0x3ff2c65c63639163), LL(0x100a041202020802), LL(0x39384993aaaa92aa), LL(0xafa8e2de7171d971), LL(0x0ecf8dc6c8c807c8), LL(0xc87d32d119196419), LL(0x7270923b49493949), LL(0x869aaf5fd9d943d9), LL(0xc31df931f2f2eff2), LL(0x4b48dba8e3e3abe3), LL(0xe22ab6b95b5b715b), LL(0x34920dbc88881a88), LL(0xa4c8293e9a9a529a), LL(0x2dbe4c0b26269826), LL(0x8dfa64bf3232c832), LL(0xe94a7d59b0b0fab0), LL(0x1b6acff2e9e983e9), LL(0x78331e770f0f3c0f), LL(0xe6a6b733d5d573d5), LL(0x74ba1df480803a80), LL(0x997c6127bebec2be), LL(0x26de87ebcdcd13cd), LL(0xbde468893434d034), LL(0x7a75903248483d48), LL(0xab24e354ffffdbff), LL(0xf78ff48d7a7af57a), LL(0xf4ea3d6490907a90), LL(0xc23ebe9d5f5f615f), LL(0x1da0403d20208020), LL(0x67d5d00f6868bd68), LL(0xd07234ca1a1a681a), LL(0x192c41b7aeae82ae), LL(0xc95e757db4b4eab4), LL(0x9a19a8ce54544d54), LL(0xece53b7f93937693), LL(0x0daa442f22228822), LL(0x07e9c86364648d64), LL(0xdb12ff2af1f1e3f1), LL(0xbfa2e6cc7373d173), LL(0x905a248212124812), LL(0x3a5d807a40401d40), LL(0x4028104808082008), LL(0x56e89b95c3c32bc3), LL(0x337bc5dfecec97ec), LL(0x9690ab4ddbdb4bdb), LL(0x611f5fc0a1a1bea1), LL(0x1c8307918d8d0e8d), LL(0xf5c97ac83d3df43d), LL(0xccf1335b97976697), LL(0x0000000000000000), LL(0x36d483f9cfcf1bcf), LL(0x4587566e2b2bac2b), LL(0x97b3ece17676c576), LL(0x64b019e682823282), LL(0xfea9b128d6d67fd6), LL(0xd87736c31b1b6c1b), LL(0xc15b7774b5b5eeb5), LL(0x112943beafaf86af), LL(0x77dfd41d6a6ab56a), LL(0xba0da0ea50505d50), LL(0x124c8a5745450945), LL(0xcb18fb38f3f3ebf3), LL(0x9df060ad3030c030), LL(0x2b74c3c4efef9bef), LL(0xe5c37eda3f3ffc3f), LL(0x921caac755554955), LL(0x791059dba2a2b2a2), LL(0x0365c9e9eaea8fea), LL(0x0fecca6a65658965), LL(0xb9686903babad2ba), LL(0x65935e4a2f2fbc2f), LL(0x4ee79d8ec0c027c0), LL(0xbe81a160dede5fde), LL(0xe06c38fc1c1c701c), LL(0xbb2ee746fdfdd3fd), LL(0x52649a1f4d4d294d), LL(0xe4e0397692927292), LL(0x8fbceafa7575c975), LL(0x301e0c3606061806), LL(0x249809ae8a8a128a), LL(0xf940794bb2b2f2b2), LL(0x6359d185e6e6bfe6), LL(0x70361c7e0e0e380e), LL(0xf8633ee71f1f7c1f), LL(0x37f7c45562629562), LL(0xeea3b53ad4d477d4), LL(0x29324d81a8a89aa8), LL(0xc4f4315296966296), LL(0x9b3aef62f9f9c3f9), LL(0x66f697a3c5c533c5), LL(0x35b14a1025259425), LL(0xf220b2ab59597959), LL(0x54ae15d084842a84), LL(0xb7a7e4c57272d572), LL(0xd5dd72ec3939e439), LL(0x5a6198164c4c2d4c), LL(0xca3bbc945e5e655e), LL(0xe785f09f7878fd78), LL(0xddd870e53838e038), LL(0x148605988c8c0a8c), LL(0xc6b2bf17d1d163d1), LL(0x410b57e4a5a5aea5), LL(0x434dd9a1e2e2afe2), LL(0x2ff8c24e61619961), LL(0xf1457b42b3b3f6b3), LL(0x15a5423421218421), LL(0x94d625089c9c4a9c), LL(0xf0663cee1e1e781e), LL(0x2252866143431143), LL(0x76fc93b1c7c73bc7), LL(0xb32be54ffcfcd7fc), LL(0x2014082404041004), LL(0xb208a2e351515951), LL(0xbcc72f2599995e99), LL(0x4fc4da226d6da96d), LL(0x68391a650d0d340d), LL(0x8335e979fafacffa), LL(0xb684a369dfdf5bdf), LL(0xd79bfca97e7ee57e), LL(0x3db4481924249024), LL(0xc5d776fe3b3bec3b), LL(0x313d4b9aabab96ab), LL(0x3ed181f0cece1fce), LL(0x8855229911114411), LL(0x0c8903838f8f068f), LL(0x4a6b9c044e4e254e), LL(0xd1517366b7b7e6b7), LL(0x0b60cbe0ebeb8beb), LL(0xfdcc78c13c3cf03c), LL(0x7cbf1ffd81813e81), LL(0xd4fe354094946a94), LL(0xeb0cf31cf7f7fbf7), LL(0xa1676f18b9b9deb9), LL(0x985f268b13134c13), LL(0x7d9c58512c2cb02c), LL(0xd6b8bb05d3d36bd3), LL(0x6b5cd38ce7e7bbe7), LL(0x57cbdc396e6ea56e), LL(0x6ef395aac4c437c4), LL(0x180f061b03030c03), LL(0x8a13acdc56564556), LL(0x1a49885e44440d44), LL(0xdf9efea07f7fe17f), LL(0x21374f88a9a99ea9), LL(0x4d8254672a2aa82a), LL(0xb16d6b0abbbbd6bb), LL(0x46e29f87c1c123c1), LL(0xa202a6f153535153), LL(0xae8ba572dcdc57dc), LL(0x582716530b0b2c0b), LL(0x9cd327019d9d4e9d), LL(0x47c1d82b6c6cad6c), LL(0x95f562a43131c431), LL(0x87b9e8f37474cd74), LL(0xe309f115f6f6fff6), LL(0x0a438c4c46460546), LL(0x092645a5acac8aac), LL(0x3c970fb589891e89), LL(0xa04428b414145014), LL(0x5b42dfbae1e1a3e1), LL(0xb04e2ca616165816), LL(0xcdd274f73a3ae83a), LL(0x6fd0d2066969b969), LL(0x482d124109092409), LL(0xa7ade0d77070dd70), LL(0xd954716fb6b6e2b6), LL(0xceb7bd1ed0d067d0), LL(0x3b7ec7d6eded93ed), LL(0x2edb85e2cccc17cc), LL(0x2a57846842421542), LL(0xb4c22d2c98985a98), LL(0x490e55eda4a4aaa4), LL(0x5d8850752828a028), LL(0xda31b8865c5c6d5c), LL(0x933fed6bf8f8c7f8), LL(0x44a411c286862286), }; static const u64 C5[256] = { LL(0x18c07830d8181860), LL(0x2305af462623238c), LL(0xc67ef991b8c6c63f), LL(0xe8136fcdfbe8e887), LL(0x874ca113cb878726), LL(0xb8a9626d11b8b8da), LL(0x0108050209010104), LL(0x4f426e9e0d4f4f21), LL(0x36adee6c9b3636d8), LL(0xa6590451ffa6a6a2), LL(0xd2debdb90cd2d26f), LL(0xf5fb06f70ef5f5f3), LL(0x79ef80f2967979f9), LL(0x6f5fcede306f6fa1), LL(0x91fcef3f6d91917e), LL(0x52aa07a4f8525255), LL(0x6027fdc04760609d), LL(0xbc89766535bcbcca), LL(0x9baccd2b379b9b56), LL(0x8e048c018a8e8e02), LL(0xa371155bd2a3a3b6), LL(0x0c603c186c0c0c30), LL(0x7bff8af6847b7bf1), LL(0x35b5e16a803535d4), LL(0x1de8693af51d1d74), LL(0xe05347ddb3e0e0a7), LL(0xd7f6acb321d7d77b), LL(0xc25eed999cc2c22f), LL(0x2e6d965c432e2eb8), LL(0x4b627a96294b4b31), LL(0xfea321e15dfefedf), LL(0x578216aed5575741), LL(0x15a8412abd151554), LL(0x779fb6eee87777c1), LL(0x37a5eb6e923737dc), LL(0xe57b56d79ee5e5b3), LL(0x9f8cd923139f9f46), LL(0xf0d317fd23f0f0e7), LL(0x4a6a7f94204a4a35), LL(0xda9e95a944dada4f), LL(0x58fa25b0a258587d), LL(0xc906ca8fcfc9c903), LL(0x29558d527c2929a4), LL(0x0a5022145a0a0a28), LL(0xb1e14f7f50b1b1fe), LL(0xa0691a5dc9a0a0ba), LL(0x6b7fdad6146b6bb1), LL(0x855cab17d985852e), LL(0xbd8173673cbdbdce), LL(0x5dd234ba8f5d5d69), LL(0x1080502090101040), LL(0xf4f303f507f4f4f7), LL(0xcb16c08bddcbcb0b), LL(0x3eedc67cd33e3ef8), LL(0x0528110a2d050514), LL(0x671fe6ce78676781), LL(0xe47353d597e4e4b7), LL(0x2725bb4e0227279c), LL(0x4132588273414119), LL(0x8b2c9d0ba78b8b16), LL(0xa7510153f6a7a7a6), LL(0x7dcf94fab27d7de9), LL(0x95dcfb374995956e), LL(0xd88e9fad56d8d847), LL(0xfb8b30eb70fbfbcb), LL(0xee2371c1cdeeee9f), LL(0x7cc791f8bb7c7ced), LL(0x6617e3cc71666685), LL(0xdda68ea77bdddd53), LL(0x17b84b2eaf17175c), LL(0x4702468e45474701), LL(0x9e84dc211a9e9e42), LL(0xca1ec589d4caca0f), LL(0x2d75995a582d2db4), LL(0xbf9179632ebfbfc6), LL(0x07381b0e3f07071c), LL(0xad012347acadad8e), LL(0x5aea2fb4b05a5a75), LL(0x836cb51bef838336), LL(0x3385ff66b63333cc), LL(0x633ff2c65c636391), LL(0x02100a0412020208), LL(0xaa39384993aaaa92), LL(0x71afa8e2de7171d9), LL(0xc80ecf8dc6c8c807), LL(0x19c87d32d1191964), LL(0x497270923b494939), LL(0xd9869aaf5fd9d943), LL(0xf2c31df931f2f2ef), LL(0xe34b48dba8e3e3ab), LL(0x5be22ab6b95b5b71), LL(0x8834920dbc88881a), LL(0x9aa4c8293e9a9a52), LL(0x262dbe4c0b262698), LL(0x328dfa64bf3232c8), LL(0xb0e94a7d59b0b0fa), LL(0xe91b6acff2e9e983), LL(0x0f78331e770f0f3c), LL(0xd5e6a6b733d5d573), LL(0x8074ba1df480803a), LL(0xbe997c6127bebec2), LL(0xcd26de87ebcdcd13), LL(0x34bde468893434d0), LL(0x487a75903248483d), LL(0xffab24e354ffffdb), LL(0x7af78ff48d7a7af5), LL(0x90f4ea3d6490907a), LL(0x5fc23ebe9d5f5f61), LL(0x201da0403d202080), LL(0x6867d5d00f6868bd), LL(0x1ad07234ca1a1a68), LL(0xae192c41b7aeae82), LL(0xb4c95e757db4b4ea), LL(0x549a19a8ce54544d), LL(0x93ece53b7f939376), LL(0x220daa442f222288), LL(0x6407e9c86364648d), LL(0xf1db12ff2af1f1e3), LL(0x73bfa2e6cc7373d1), LL(0x12905a2482121248), LL(0x403a5d807a40401d), LL(0x0840281048080820), LL(0xc356e89b95c3c32b), LL(0xec337bc5dfecec97), LL(0xdb9690ab4ddbdb4b), LL(0xa1611f5fc0a1a1be), LL(0x8d1c8307918d8d0e), LL(0x3df5c97ac83d3df4), LL(0x97ccf1335b979766), LL(0x0000000000000000), LL(0xcf36d483f9cfcf1b), LL(0x2b4587566e2b2bac), LL(0x7697b3ece17676c5), LL(0x8264b019e6828232), LL(0xd6fea9b128d6d67f), LL(0x1bd87736c31b1b6c), LL(0xb5c15b7774b5b5ee), LL(0xaf112943beafaf86), LL(0x6a77dfd41d6a6ab5), LL(0x50ba0da0ea50505d), LL(0x45124c8a57454509), LL(0xf3cb18fb38f3f3eb), LL(0x309df060ad3030c0), LL(0xef2b74c3c4efef9b), LL(0x3fe5c37eda3f3ffc), LL(0x55921caac7555549), LL(0xa2791059dba2a2b2), LL(0xea0365c9e9eaea8f), LL(0x650fecca6a656589), LL(0xbab9686903babad2), LL(0x2f65935e4a2f2fbc), LL(0xc04ee79d8ec0c027), LL(0xdebe81a160dede5f), LL(0x1ce06c38fc1c1c70), LL(0xfdbb2ee746fdfdd3), LL(0x4d52649a1f4d4d29), LL(0x92e4e03976929272), LL(0x758fbceafa7575c9), LL(0x06301e0c36060618), LL(0x8a249809ae8a8a12), LL(0xb2f940794bb2b2f2), LL(0xe66359d185e6e6bf), LL(0x0e70361c7e0e0e38), LL(0x1ff8633ee71f1f7c), LL(0x6237f7c455626295), LL(0xd4eea3b53ad4d477), LL(0xa829324d81a8a89a), LL(0x96c4f43152969662), LL(0xf99b3aef62f9f9c3), LL(0xc566f697a3c5c533), LL(0x2535b14a10252594), LL(0x59f220b2ab595979), LL(0x8454ae15d084842a), LL(0x72b7a7e4c57272d5), LL(0x39d5dd72ec3939e4), LL(0x4c5a6198164c4c2d), LL(0x5eca3bbc945e5e65), LL(0x78e785f09f7878fd), LL(0x38ddd870e53838e0), LL(0x8c148605988c8c0a), LL(0xd1c6b2bf17d1d163), LL(0xa5410b57e4a5a5ae), LL(0xe2434dd9a1e2e2af), LL(0x612ff8c24e616199), LL(0xb3f1457b42b3b3f6), LL(0x2115a54234212184), LL(0x9c94d625089c9c4a), LL(0x1ef0663cee1e1e78), LL(0x4322528661434311), LL(0xc776fc93b1c7c73b), LL(0xfcb32be54ffcfcd7), LL(0x0420140824040410), LL(0x51b208a2e3515159), LL(0x99bcc72f2599995e), LL(0x6d4fc4da226d6da9), LL(0x0d68391a650d0d34), LL(0xfa8335e979fafacf), LL(0xdfb684a369dfdf5b), LL(0x7ed79bfca97e7ee5), LL(0x243db44819242490), LL(0x3bc5d776fe3b3bec), LL(0xab313d4b9aabab96), LL(0xce3ed181f0cece1f), LL(0x1188552299111144), LL(0x8f0c8903838f8f06), LL(0x4e4a6b9c044e4e25), LL(0xb7d1517366b7b7e6), LL(0xeb0b60cbe0ebeb8b), LL(0x3cfdcc78c13c3cf0), LL(0x817cbf1ffd81813e), LL(0x94d4fe354094946a), LL(0xf7eb0cf31cf7f7fb), LL(0xb9a1676f18b9b9de), LL(0x13985f268b13134c), LL(0x2c7d9c58512c2cb0), LL(0xd3d6b8bb05d3d36b), LL(0xe76b5cd38ce7e7bb), LL(0x6e57cbdc396e6ea5), LL(0xc46ef395aac4c437), LL(0x03180f061b03030c), LL(0x568a13acdc565645), LL(0x441a49885e44440d), LL(0x7fdf9efea07f7fe1), LL(0xa921374f88a9a99e), LL(0x2a4d8254672a2aa8), LL(0xbbb16d6b0abbbbd6), LL(0xc146e29f87c1c123), LL(0x53a202a6f1535351), LL(0xdcae8ba572dcdc57), LL(0x0b582716530b0b2c), LL(0x9d9cd327019d9d4e), LL(0x6c47c1d82b6c6cad), LL(0x3195f562a43131c4), LL(0x7487b9e8f37474cd), LL(0xf6e309f115f6f6ff), LL(0x460a438c4c464605), LL(0xac092645a5acac8a), LL(0x893c970fb589891e), LL(0x14a04428b4141450), LL(0xe15b42dfbae1e1a3), LL(0x16b04e2ca6161658), LL(0x3acdd274f73a3ae8), LL(0x696fd0d2066969b9), LL(0x09482d1241090924), LL(0x70a7ade0d77070dd), LL(0xb6d954716fb6b6e2), LL(0xd0ceb7bd1ed0d067), LL(0xed3b7ec7d6eded93), LL(0xcc2edb85e2cccc17), LL(0x422a578468424215), LL(0x98b4c22d2c98985a), LL(0xa4490e55eda4a4aa), LL(0x285d8850752828a0), LL(0x5cda31b8865c5c6d), LL(0xf8933fed6bf8f8c7), LL(0x8644a411c2868622), }; static const u64 C6[256] = { LL(0x6018c07830d81818), LL(0x8c2305af46262323), LL(0x3fc67ef991b8c6c6), LL(0x87e8136fcdfbe8e8), LL(0x26874ca113cb8787), LL(0xdab8a9626d11b8b8), LL(0x0401080502090101), LL(0x214f426e9e0d4f4f), LL(0xd836adee6c9b3636), LL(0xa2a6590451ffa6a6), LL(0x6fd2debdb90cd2d2), LL(0xf3f5fb06f70ef5f5), LL(0xf979ef80f2967979), LL(0xa16f5fcede306f6f), LL(0x7e91fcef3f6d9191), LL(0x5552aa07a4f85252), LL(0x9d6027fdc0476060), LL(0xcabc89766535bcbc), LL(0x569baccd2b379b9b), LL(0x028e048c018a8e8e), LL(0xb6a371155bd2a3a3), LL(0x300c603c186c0c0c), LL(0xf17bff8af6847b7b), LL(0xd435b5e16a803535), LL(0x741de8693af51d1d), LL(0xa7e05347ddb3e0e0), LL(0x7bd7f6acb321d7d7), LL(0x2fc25eed999cc2c2), LL(0xb82e6d965c432e2e), LL(0x314b627a96294b4b), LL(0xdffea321e15dfefe), LL(0x41578216aed55757), LL(0x5415a8412abd1515), LL(0xc1779fb6eee87777), LL(0xdc37a5eb6e923737), LL(0xb3e57b56d79ee5e5), LL(0x469f8cd923139f9f), LL(0xe7f0d317fd23f0f0), LL(0x354a6a7f94204a4a), LL(0x4fda9e95a944dada), LL(0x7d58fa25b0a25858), LL(0x03c906ca8fcfc9c9), LL(0xa429558d527c2929), LL(0x280a5022145a0a0a), LL(0xfeb1e14f7f50b1b1), LL(0xbaa0691a5dc9a0a0), LL(0xb16b7fdad6146b6b), LL(0x2e855cab17d98585), LL(0xcebd8173673cbdbd), LL(0x695dd234ba8f5d5d), LL(0x4010805020901010), LL(0xf7f4f303f507f4f4), LL(0x0bcb16c08bddcbcb), LL(0xf83eedc67cd33e3e), LL(0x140528110a2d0505), LL(0x81671fe6ce786767), LL(0xb7e47353d597e4e4), LL(0x9c2725bb4e022727), LL(0x1941325882734141), LL(0x168b2c9d0ba78b8b), LL(0xa6a7510153f6a7a7), LL(0xe97dcf94fab27d7d), LL(0x6e95dcfb37499595), LL(0x47d88e9fad56d8d8), LL(0xcbfb8b30eb70fbfb), LL(0x9fee2371c1cdeeee), LL(0xed7cc791f8bb7c7c), LL(0x856617e3cc716666), LL(0x53dda68ea77bdddd), LL(0x5c17b84b2eaf1717), LL(0x014702468e454747), LL(0x429e84dc211a9e9e), LL(0x0fca1ec589d4caca), LL(0xb42d75995a582d2d), LL(0xc6bf9179632ebfbf), LL(0x1c07381b0e3f0707), LL(0x8ead012347acadad), LL(0x755aea2fb4b05a5a), LL(0x36836cb51bef8383), LL(0xcc3385ff66b63333), LL(0x91633ff2c65c6363), LL(0x0802100a04120202), LL(0x92aa39384993aaaa), LL(0xd971afa8e2de7171), LL(0x07c80ecf8dc6c8c8), LL(0x6419c87d32d11919), LL(0x39497270923b4949), LL(0x43d9869aaf5fd9d9), LL(0xeff2c31df931f2f2), LL(0xabe34b48dba8e3e3), LL(0x715be22ab6b95b5b), LL(0x1a8834920dbc8888), LL(0x529aa4c8293e9a9a), LL(0x98262dbe4c0b2626), LL(0xc8328dfa64bf3232), LL(0xfab0e94a7d59b0b0), LL(0x83e91b6acff2e9e9), LL(0x3c0f78331e770f0f), LL(0x73d5e6a6b733d5d5), LL(0x3a8074ba1df48080), LL(0xc2be997c6127bebe), LL(0x13cd26de87ebcdcd), LL(0xd034bde468893434), LL(0x3d487a7590324848), LL(0xdbffab24e354ffff), LL(0xf57af78ff48d7a7a), LL(0x7a90f4ea3d649090), LL(0x615fc23ebe9d5f5f), LL(0x80201da0403d2020), LL(0xbd6867d5d00f6868), LL(0x681ad07234ca1a1a), LL(0x82ae192c41b7aeae), LL(0xeab4c95e757db4b4), LL(0x4d549a19a8ce5454), LL(0x7693ece53b7f9393), LL(0x88220daa442f2222), LL(0x8d6407e9c8636464), LL(0xe3f1db12ff2af1f1), LL(0xd173bfa2e6cc7373), LL(0x4812905a24821212), LL(0x1d403a5d807a4040), LL(0x2008402810480808), LL(0x2bc356e89b95c3c3), LL(0x97ec337bc5dfecec), LL(0x4bdb9690ab4ddbdb), LL(0xbea1611f5fc0a1a1), LL(0x0e8d1c8307918d8d), LL(0xf43df5c97ac83d3d), LL(0x6697ccf1335b9797), LL(0x0000000000000000), LL(0x1bcf36d483f9cfcf), LL(0xac2b4587566e2b2b), LL(0xc57697b3ece17676), LL(0x328264b019e68282), LL(0x7fd6fea9b128d6d6), LL(0x6c1bd87736c31b1b), LL(0xeeb5c15b7774b5b5), LL(0x86af112943beafaf), LL(0xb56a77dfd41d6a6a), LL(0x5d50ba0da0ea5050), LL(0x0945124c8a574545), LL(0xebf3cb18fb38f3f3), LL(0xc0309df060ad3030), LL(0x9bef2b74c3c4efef), LL(0xfc3fe5c37eda3f3f), LL(0x4955921caac75555), LL(0xb2a2791059dba2a2), LL(0x8fea0365c9e9eaea), LL(0x89650fecca6a6565), LL(0xd2bab9686903baba), LL(0xbc2f65935e4a2f2f), LL(0x27c04ee79d8ec0c0), LL(0x5fdebe81a160dede), LL(0x701ce06c38fc1c1c), LL(0xd3fdbb2ee746fdfd), LL(0x294d52649a1f4d4d), LL(0x7292e4e039769292), LL(0xc9758fbceafa7575), LL(0x1806301e0c360606), LL(0x128a249809ae8a8a), LL(0xf2b2f940794bb2b2), LL(0xbfe66359d185e6e6), LL(0x380e70361c7e0e0e), LL(0x7c1ff8633ee71f1f), LL(0x956237f7c4556262), LL(0x77d4eea3b53ad4d4), LL(0x9aa829324d81a8a8), LL(0x6296c4f431529696), LL(0xc3f99b3aef62f9f9), LL(0x33c566f697a3c5c5), LL(0x942535b14a102525), LL(0x7959f220b2ab5959), LL(0x2a8454ae15d08484), LL(0xd572b7a7e4c57272), LL(0xe439d5dd72ec3939), LL(0x2d4c5a6198164c4c), LL(0x655eca3bbc945e5e), LL(0xfd78e785f09f7878), LL(0xe038ddd870e53838), LL(0x0a8c148605988c8c), LL(0x63d1c6b2bf17d1d1), LL(0xaea5410b57e4a5a5), LL(0xafe2434dd9a1e2e2), LL(0x99612ff8c24e6161), LL(0xf6b3f1457b42b3b3), LL(0x842115a542342121), LL(0x4a9c94d625089c9c), LL(0x781ef0663cee1e1e), LL(0x1143225286614343), LL(0x3bc776fc93b1c7c7), LL(0xd7fcb32be54ffcfc), LL(0x1004201408240404), LL(0x5951b208a2e35151), LL(0x5e99bcc72f259999), LL(0xa96d4fc4da226d6d), LL(0x340d68391a650d0d), LL(0xcffa8335e979fafa), LL(0x5bdfb684a369dfdf), LL(0xe57ed79bfca97e7e), LL(0x90243db448192424), LL(0xec3bc5d776fe3b3b), LL(0x96ab313d4b9aabab), LL(0x1fce3ed181f0cece), LL(0x4411885522991111), LL(0x068f0c8903838f8f), LL(0x254e4a6b9c044e4e), LL(0xe6b7d1517366b7b7), LL(0x8beb0b60cbe0ebeb), LL(0xf03cfdcc78c13c3c), LL(0x3e817cbf1ffd8181), LL(0x6a94d4fe35409494), LL(0xfbf7eb0cf31cf7f7), LL(0xdeb9a1676f18b9b9), LL(0x4c13985f268b1313), LL(0xb02c7d9c58512c2c), LL(0x6bd3d6b8bb05d3d3), LL(0xbbe76b5cd38ce7e7), LL(0xa56e57cbdc396e6e), LL(0x37c46ef395aac4c4), LL(0x0c03180f061b0303), LL(0x45568a13acdc5656), LL(0x0d441a49885e4444), LL(0xe17fdf9efea07f7f), LL(0x9ea921374f88a9a9), LL(0xa82a4d8254672a2a), LL(0xd6bbb16d6b0abbbb), LL(0x23c146e29f87c1c1), LL(0x5153a202a6f15353), LL(0x57dcae8ba572dcdc), LL(0x2c0b582716530b0b), LL(0x4e9d9cd327019d9d), LL(0xad6c47c1d82b6c6c), LL(0xc43195f562a43131), LL(0xcd7487b9e8f37474), LL(0xfff6e309f115f6f6), LL(0x05460a438c4c4646), LL(0x8aac092645a5acac), LL(0x1e893c970fb58989), LL(0x5014a04428b41414), LL(0xa3e15b42dfbae1e1), LL(0x5816b04e2ca61616), LL(0xe83acdd274f73a3a), LL(0xb9696fd0d2066969), LL(0x2409482d12410909), LL(0xdd70a7ade0d77070), LL(0xe2b6d954716fb6b6), LL(0x67d0ceb7bd1ed0d0), LL(0x93ed3b7ec7d6eded), LL(0x17cc2edb85e2cccc), LL(0x15422a5784684242), LL(0x5a98b4c22d2c9898), LL(0xaaa4490e55eda4a4), LL(0xa0285d8850752828), LL(0x6d5cda31b8865c5c), LL(0xc7f8933fed6bf8f8), LL(0x228644a411c28686), }; static const u64 C7[256] = { LL(0x186018c07830d818), LL(0x238c2305af462623), LL(0xc63fc67ef991b8c6), LL(0xe887e8136fcdfbe8), LL(0x8726874ca113cb87), LL(0xb8dab8a9626d11b8), LL(0x0104010805020901), LL(0x4f214f426e9e0d4f), LL(0x36d836adee6c9b36), LL(0xa6a2a6590451ffa6), LL(0xd26fd2debdb90cd2), LL(0xf5f3f5fb06f70ef5), LL(0x79f979ef80f29679), LL(0x6fa16f5fcede306f), LL(0x917e91fcef3f6d91), LL(0x525552aa07a4f852), LL(0x609d6027fdc04760), LL(0xbccabc89766535bc), LL(0x9b569baccd2b379b), LL(0x8e028e048c018a8e), LL(0xa3b6a371155bd2a3), LL(0x0c300c603c186c0c), LL(0x7bf17bff8af6847b), LL(0x35d435b5e16a8035), LL(0x1d741de8693af51d), LL(0xe0a7e05347ddb3e0), LL(0xd77bd7f6acb321d7), LL(0xc22fc25eed999cc2), LL(0x2eb82e6d965c432e), LL(0x4b314b627a96294b), LL(0xfedffea321e15dfe), LL(0x5741578216aed557), LL(0x155415a8412abd15), LL(0x77c1779fb6eee877), LL(0x37dc37a5eb6e9237), LL(0xe5b3e57b56d79ee5), LL(0x9f469f8cd923139f), LL(0xf0e7f0d317fd23f0), LL(0x4a354a6a7f94204a), LL(0xda4fda9e95a944da), LL(0x587d58fa25b0a258), LL(0xc903c906ca8fcfc9), LL(0x29a429558d527c29), LL(0x0a280a5022145a0a), LL(0xb1feb1e14f7f50b1), LL(0xa0baa0691a5dc9a0), LL(0x6bb16b7fdad6146b), LL(0x852e855cab17d985), LL(0xbdcebd8173673cbd), LL(0x5d695dd234ba8f5d), LL(0x1040108050209010), LL(0xf4f7f4f303f507f4), LL(0xcb0bcb16c08bddcb), LL(0x3ef83eedc67cd33e), LL(0x05140528110a2d05), LL(0x6781671fe6ce7867), LL(0xe4b7e47353d597e4), LL(0x279c2725bb4e0227), LL(0x4119413258827341), LL(0x8b168b2c9d0ba78b), LL(0xa7a6a7510153f6a7), LL(0x7de97dcf94fab27d), LL(0x956e95dcfb374995), LL(0xd847d88e9fad56d8), LL(0xfbcbfb8b30eb70fb), LL(0xee9fee2371c1cdee), LL(0x7ced7cc791f8bb7c), LL(0x66856617e3cc7166), LL(0xdd53dda68ea77bdd), LL(0x175c17b84b2eaf17), LL(0x47014702468e4547), LL(0x9e429e84dc211a9e), LL(0xca0fca1ec589d4ca), LL(0x2db42d75995a582d), LL(0xbfc6bf9179632ebf), LL(0x071c07381b0e3f07), LL(0xad8ead012347acad), LL(0x5a755aea2fb4b05a), LL(0x8336836cb51bef83), LL(0x33cc3385ff66b633), LL(0x6391633ff2c65c63), LL(0x020802100a041202), LL(0xaa92aa39384993aa), LL(0x71d971afa8e2de71), LL(0xc807c80ecf8dc6c8), LL(0x196419c87d32d119), LL(0x4939497270923b49), LL(0xd943d9869aaf5fd9), LL(0xf2eff2c31df931f2), LL(0xe3abe34b48dba8e3), LL(0x5b715be22ab6b95b), LL(0x881a8834920dbc88), LL(0x9a529aa4c8293e9a), LL(0x2698262dbe4c0b26), LL(0x32c8328dfa64bf32), LL(0xb0fab0e94a7d59b0), LL(0xe983e91b6acff2e9), LL(0x0f3c0f78331e770f), LL(0xd573d5e6a6b733d5), LL(0x803a8074ba1df480), LL(0xbec2be997c6127be), LL(0xcd13cd26de87ebcd), LL(0x34d034bde4688934), LL(0x483d487a75903248), LL(0xffdbffab24e354ff), LL(0x7af57af78ff48d7a), LL(0x907a90f4ea3d6490), LL(0x5f615fc23ebe9d5f), LL(0x2080201da0403d20), LL(0x68bd6867d5d00f68), LL(0x1a681ad07234ca1a), LL(0xae82ae192c41b7ae), LL(0xb4eab4c95e757db4), LL(0x544d549a19a8ce54), LL(0x937693ece53b7f93), LL(0x2288220daa442f22), LL(0x648d6407e9c86364), LL(0xf1e3f1db12ff2af1), LL(0x73d173bfa2e6cc73), LL(0x124812905a248212), LL(0x401d403a5d807a40), LL(0x0820084028104808), LL(0xc32bc356e89b95c3), LL(0xec97ec337bc5dfec), LL(0xdb4bdb9690ab4ddb), LL(0xa1bea1611f5fc0a1), LL(0x8d0e8d1c8307918d), LL(0x3df43df5c97ac83d), LL(0x976697ccf1335b97), LL(0x0000000000000000), LL(0xcf1bcf36d483f9cf), LL(0x2bac2b4587566e2b), LL(0x76c57697b3ece176), LL(0x82328264b019e682), LL(0xd67fd6fea9b128d6), LL(0x1b6c1bd87736c31b), LL(0xb5eeb5c15b7774b5), LL(0xaf86af112943beaf), LL(0x6ab56a77dfd41d6a), LL(0x505d50ba0da0ea50), LL(0x450945124c8a5745), LL(0xf3ebf3cb18fb38f3), LL(0x30c0309df060ad30), LL(0xef9bef2b74c3c4ef), LL(0x3ffc3fe5c37eda3f), LL(0x554955921caac755), LL(0xa2b2a2791059dba2), LL(0xea8fea0365c9e9ea), LL(0x6589650fecca6a65), LL(0xbad2bab9686903ba), LL(0x2fbc2f65935e4a2f), LL(0xc027c04ee79d8ec0), LL(0xde5fdebe81a160de), LL(0x1c701ce06c38fc1c), LL(0xfdd3fdbb2ee746fd), LL(0x4d294d52649a1f4d), LL(0x927292e4e0397692), LL(0x75c9758fbceafa75), LL(0x061806301e0c3606), LL(0x8a128a249809ae8a), LL(0xb2f2b2f940794bb2), LL(0xe6bfe66359d185e6), LL(0x0e380e70361c7e0e), LL(0x1f7c1ff8633ee71f), LL(0x62956237f7c45562), LL(0xd477d4eea3b53ad4), LL(0xa89aa829324d81a8), LL(0x966296c4f4315296), LL(0xf9c3f99b3aef62f9), LL(0xc533c566f697a3c5), LL(0x25942535b14a1025), LL(0x597959f220b2ab59), LL(0x842a8454ae15d084), LL(0x72d572b7a7e4c572), LL(0x39e439d5dd72ec39), LL(0x4c2d4c5a6198164c), LL(0x5e655eca3bbc945e), LL(0x78fd78e785f09f78), LL(0x38e038ddd870e538), LL(0x8c0a8c148605988c), LL(0xd163d1c6b2bf17d1), LL(0xa5aea5410b57e4a5), LL(0xe2afe2434dd9a1e2), LL(0x6199612ff8c24e61), LL(0xb3f6b3f1457b42b3), LL(0x21842115a5423421), LL(0x9c4a9c94d625089c), LL(0x1e781ef0663cee1e), LL(0x4311432252866143), LL(0xc73bc776fc93b1c7), LL(0xfcd7fcb32be54ffc), LL(0x0410042014082404), LL(0x515951b208a2e351), LL(0x995e99bcc72f2599), LL(0x6da96d4fc4da226d), LL(0x0d340d68391a650d), LL(0xfacffa8335e979fa), LL(0xdf5bdfb684a369df), LL(0x7ee57ed79bfca97e), LL(0x2490243db4481924), LL(0x3bec3bc5d776fe3b), LL(0xab96ab313d4b9aab), LL(0xce1fce3ed181f0ce), LL(0x1144118855229911), LL(0x8f068f0c8903838f), LL(0x4e254e4a6b9c044e), LL(0xb7e6b7d1517366b7), LL(0xeb8beb0b60cbe0eb), LL(0x3cf03cfdcc78c13c), LL(0x813e817cbf1ffd81), LL(0x946a94d4fe354094), LL(0xf7fbf7eb0cf31cf7), LL(0xb9deb9a1676f18b9), LL(0x134c13985f268b13), LL(0x2cb02c7d9c58512c), LL(0xd36bd3d6b8bb05d3), LL(0xe7bbe76b5cd38ce7), LL(0x6ea56e57cbdc396e), LL(0xc437c46ef395aac4), LL(0x030c03180f061b03), LL(0x5645568a13acdc56), LL(0x440d441a49885e44), LL(0x7fe17fdf9efea07f), LL(0xa99ea921374f88a9), LL(0x2aa82a4d8254672a), LL(0xbbd6bbb16d6b0abb), LL(0xc123c146e29f87c1), LL(0x535153a202a6f153), LL(0xdc57dcae8ba572dc), LL(0x0b2c0b582716530b), LL(0x9d4e9d9cd327019d), LL(0x6cad6c47c1d82b6c), LL(0x31c43195f562a431), LL(0x74cd7487b9e8f374), LL(0xf6fff6e309f115f6), LL(0x4605460a438c4c46), LL(0xac8aac092645a5ac), LL(0x891e893c970fb589), LL(0x145014a04428b414), LL(0xe1a3e15b42dfbae1), LL(0x165816b04e2ca616), LL(0x3ae83acdd274f73a), LL(0x69b9696fd0d20669), LL(0x092409482d124109), LL(0x70dd70a7ade0d770), LL(0xb6e2b6d954716fb6), LL(0xd067d0ceb7bd1ed0), LL(0xed93ed3b7ec7d6ed), LL(0xcc17cc2edb85e2cc), LL(0x4215422a57846842), LL(0x985a98b4c22d2c98), LL(0xa4aaa4490e55eda4), LL(0x28a0285d88507528), LL(0x5c6d5cda31b8865c), LL(0xf8c7f8933fed6bf8), LL(0x86228644a411c286), }; #ifdef OBSOLETE static const u64 C0[256] = { LL(0x1818281878c0d878), LL(0x23236523af0526af), LL(0xc6c657c6f97eb8f9), LL(0xe8e825e86f13fb6f), LL(0x87879487a14ccba1), LL(0xb8b8d5b862a91162), LL(0x0101030105080905), LL(0x4f4fd14f6e420d6e), LL(0x36365a36eead9bee), LL(0xa6a6f7a60459ff04), LL(0xd2d26bd2bdde0cbd), LL(0xf5f502f506fb0e06), LL(0x79798b7980ef9680), LL(0x6f6fb16fce5f30ce), LL(0x9191ae91effc6def), LL(0x5252f65207aaf807), LL(0x6060a060fd2747fd), LL(0xbcbcd9bc76893576), LL(0x9b9bb09bcdac37cd), LL(0x8e8e8f8e8c048a8c), LL(0xa3a3f8a31571d215), LL(0x0c0c140c3c606c3c), LL(0x7b7b8d7b8aff848a), LL(0x35355f35e1b580e1), LL(0x1d1d271d69e8f569), LL(0xe0e03de04753b347), LL(0xd7d764d7acf621ac), LL(0xc2c25bc2ed5e9ced), LL(0x2e2e722e966d4396), LL(0x4b4bdd4b7a62297a), LL(0xfefe1ffe21a35d21), LL(0x5757f9571682d516), LL(0x15153f1541a8bd41), LL(0x77779977b69fe8b6), LL(0x37375937eba592eb), LL(0xe5e532e5567b9e56), LL(0x9f9fbc9fd98c13d9), LL(0xf0f00df017d32317), LL(0x4a4ade4a7f6a207f), LL(0xdada73da959e4495), LL(0x5858e85825faa225), LL(0xc9c946c9ca06cfca), LL(0x29297b298d557c8d), LL(0x0a0a1e0a22505a22), LL(0xb1b1ceb14fe1504f), LL(0xa0a0fda01a69c91a), LL(0x6b6bbd6bda7f14da), LL(0x85859285ab5cd9ab), LL(0xbdbddabd73813c73), LL(0x5d5de75d34d28f34), LL(0x1010301050809050), LL(0xf4f401f403f30703), LL(0xcbcb40cbc016ddc0), LL(0x3e3e423ec6edd3c6), LL(0x05050f0511282d11), LL(0x6767a967e61f78e6), LL(0xe4e431e453739753), LL(0x27276927bb2502bb), LL(0x4141c34158327358), LL(0x8b8b808b9d2ca79d), LL(0xa7a7f4a70151f601), LL(0x7d7d877d94cfb294), LL(0x9595a295fbdc49fb), LL(0xd8d875d89f8e569f), LL(0xfbfb10fb308b7030), LL(0xeeee2fee7123cd71), LL(0x7c7c847c91c7bb91), LL(0x6666aa66e31771e3), LL(0xdddd7add8ea67b8e), LL(0x171739174bb8af4b), LL(0x4747c94746024546), LL(0x9e9ebf9edc841adc), LL(0xcaca43cac51ed4c5), LL(0x2d2d772d99755899), LL(0xbfbfdcbf79912e79), LL(0x070709071b383f1b), LL(0xadadeaad2301ac23), LL(0x5a5aee5a2feab02f), LL(0x83839883b56cefb5), LL(0x33335533ff85b6ff), LL(0x6363a563f23f5cf2), LL(0x020206020a10120a), LL(0xaaaae3aa38399338), LL(0x71719371a8afdea8), LL(0xc8c845c8cf0ec6cf), LL(0x19192b197dc8d17d), LL(0x4949db4970723b70), LL(0xd9d976d99a865f9a), LL(0xf2f20bf21dc3311d), LL(0xe3e338e3484ba848), LL(0x5b5bed5b2ae2b92a), LL(0x888885889234bc92), LL(0x9a9ab39ac8a43ec8), LL(0x26266a26be2d0bbe), LL(0x32325632fa8dbffa), LL(0xb0b0cdb04ae9594a), LL(0xe9e926e96a1bf26a), LL(0x0f0f110f33787733), LL(0xd5d562d5a6e633a6), LL(0x80809d80ba74f4ba), LL(0xbebedfbe7c99277c), LL(0xcdcd4acdde26ebde), LL(0x34345c34e4bd89e4), LL(0x4848d848757a3275), LL(0xffff1cff24ab5424), LL(0x7a7a8e7a8ff78d8f), LL(0x9090ad90eaf464ea), LL(0x5f5fe15f3ec29d3e), LL(0x20206020a01d3da0), LL(0x6868b868d5670fd5), LL(0x1a1a2e1a72d0ca72), LL(0xaeaeefae2c19b72c), LL(0xb4b4c1b45ec97d5e), LL(0x5454fc54199ace19), LL(0x9393a893e5ec7fe5), LL(0x22226622aa0d2faa), LL(0x6464ac64e90763e9), LL(0xf1f10ef112db2a12), LL(0x73739573a2bfcca2), LL(0x121236125a90825a), LL(0x4040c0405d3a7a5d), LL(0x0808180828404828), LL(0xc3c358c3e85695e8), LL(0xecec29ec7b33df7b), LL(0xdbdb70db90964d90), LL(0xa1a1fea11f61c01f), LL(0x8d8d8a8d831c9183), LL(0x3d3d473dc9f5c8c9), LL(0x9797a497f1cc5bf1), LL(0x0000000000000000), LL(0xcfcf4ccfd436f9d4), LL(0x2b2b7d2b87456e87), LL(0x76769a76b397e1b3), LL(0x82829b82b064e6b0), LL(0xd6d667d6a9fe28a9), LL(0x1b1b2d1b77d8c377), LL(0xb5b5c2b55bc1745b), LL(0xafafecaf2911be29), LL(0x6a6abe6adf771ddf), LL(0x5050f0500dbaea0d), LL(0x4545cf454c12574c), LL(0xf3f308f318cb3818), LL(0x30305030f09dadf0), LL(0xefef2cef742bc474), LL(0x3f3f413fc3e5dac3), LL(0x5555ff551c92c71c), LL(0xa2a2fba21079db10), LL(0xeaea23ea6503e965), LL(0x6565af65ec0f6aec), LL(0xbabad3ba68b90368), LL(0x2f2f712f93654a93), LL(0xc0c05dc0e74e8ee7), LL(0xdede7fde81be6081), LL(0x1c1c241c6ce0fc6c), LL(0xfdfd1afd2ebb462e), LL(0x4d4dd74d64521f64), LL(0x9292ab92e0e476e0), LL(0x75759f75bc8ffabc), LL(0x06060a061e30361e), LL(0x8a8a838a9824ae98), LL(0xb2b2cbb240f94b40), LL(0xe6e637e659638559), LL(0x0e0e120e36707e36), LL(0x1f1f211f63f8e763), LL(0x6262a662f73755f7), LL(0xd4d461d4a3ee3aa3), LL(0xa8a8e5a832298132), LL(0x9696a796f4c452f4), LL(0xf9f916f93a9b623a), LL(0xc5c552c5f666a3f6), LL(0x25256f25b13510b1), LL(0x5959eb5920f2ab20), LL(0x84849184ae54d0ae), LL(0x72729672a7b7c5a7), LL(0x39394b39ddd5ecdd), LL(0x4c4cd44c615a1661), LL(0x5e5ee25e3bca943b), LL(0x7878887885e79f85), LL(0x38384838d8dde5d8), LL(0x8c8c898c86149886), LL(0xd1d16ed1b2c617b2), LL(0xa5a5f2a50b41e40b), LL(0xe2e23be24d43a14d), LL(0x6161a361f82f4ef8), LL(0xb3b3c8b345f14245), LL(0x21216321a51534a5), LL(0x9c9cb99cd69408d6), LL(0x1e1e221e66f0ee66), LL(0x4343c54352226152), LL(0xc7c754c7fc76b1fc), LL(0xfcfc19fc2bb34f2b), LL(0x04040c0414202414), LL(0x5151f35108b2e308), LL(0x9999b699c7bc25c7), LL(0x6d6db76dc44f22c4), LL(0x0d0d170d39686539), LL(0xfafa13fa35837935), LL(0xdfdf7cdf84b66984), LL(0x7e7e827e9bd7a99b), LL(0x24246c24b43d19b4), LL(0x3b3b4d3bd7c5fed7), LL(0xababe0ab3d319a3d), LL(0xcece4fced13ef0d1), LL(0x1111331155889955), LL(0x8f8f8c8f890c8389), LL(0x4e4ed24e6b4a046b), LL(0xb7b7c4b751d16651), LL(0xebeb20eb600be060), LL(0x3c3c443cccfdc1cc), LL(0x81819e81bf7cfdbf), LL(0x9494a194fed440fe), LL(0xf7f704f70ceb1c0c), LL(0xb9b9d6b967a11867), LL(0x131335135f988b5f), LL(0x2c2c742c9c7d519c), LL(0xd3d368d3b8d605b8), LL(0xe7e734e75c6b8c5c), LL(0x6e6eb26ecb5739cb), LL(0xc4c451c4f36eaaf3), LL(0x030305030f181b0f), LL(0x5656fa56138adc13), LL(0x4444cc44491a5e49), LL(0x7f7f817f9edfa09e), LL(0xa9a9e6a937218837), LL(0x2a2a7e2a824d6782), LL(0xbbbbd0bb6db10a6d), LL(0xc1c15ec1e24687e2), LL(0x5353f55302a2f102), LL(0xdcdc79dc8bae728b), LL(0x0b0b1d0b27585327), LL(0x9d9dba9dd39c01d3), LL(0x6c6cb46cc1472bc1), LL(0x31315331f595a4f5), LL(0x74749c74b987f3b9), LL(0xf6f607f609e31509), LL(0x4646ca46430a4c43), LL(0xacace9ac2609a526), LL(0x89898689973cb597), LL(0x14143c1444a0b444), LL(0xe1e13ee1425bba42), LL(0x16163a164eb0a64e), LL(0x3a3a4e3ad2cdf7d2), LL(0x6969bb69d06f06d0), LL(0x09091b092d48412d), LL(0x70709070ada7d7ad), LL(0xb6b6c7b654d96f54), LL(0xd0d06dd0b7ce1eb7), LL(0xeded2aed7e3bd67e), LL(0xcccc49ccdb2ee2db), LL(0x4242c642572a6857), LL(0x9898b598c2b42cc2), LL(0xa4a4f1a40e49ed0e), LL(0x28287828885d7588), LL(0x5c5ce45c31da8631), LL(0xf8f815f83f936b3f), LL(0x86869786a444c2a4), }; static const u64 C1[256] = { LL(0x781818281878c0d8), LL(0xaf23236523af0526), LL(0xf9c6c657c6f97eb8), LL(0x6fe8e825e86f13fb), LL(0xa187879487a14ccb), LL(0x62b8b8d5b862a911), LL(0x0501010301050809), LL(0x6e4f4fd14f6e420d), LL(0xee36365a36eead9b), LL(0x04a6a6f7a60459ff), LL(0xbdd2d26bd2bdde0c), LL(0x06f5f502f506fb0e), LL(0x8079798b7980ef96), LL(0xce6f6fb16fce5f30), LL(0xef9191ae91effc6d), LL(0x075252f65207aaf8), LL(0xfd6060a060fd2747), LL(0x76bcbcd9bc768935), LL(0xcd9b9bb09bcdac37), LL(0x8c8e8e8f8e8c048a), LL(0x15a3a3f8a31571d2), LL(0x3c0c0c140c3c606c), LL(0x8a7b7b8d7b8aff84), LL(0xe135355f35e1b580), LL(0x691d1d271d69e8f5), LL(0x47e0e03de04753b3), LL(0xacd7d764d7acf621), LL(0xedc2c25bc2ed5e9c), LL(0x962e2e722e966d43), LL(0x7a4b4bdd4b7a6229), LL(0x21fefe1ffe21a35d), LL(0x165757f9571682d5), LL(0x4115153f1541a8bd), LL(0xb677779977b69fe8), LL(0xeb37375937eba592), LL(0x56e5e532e5567b9e), LL(0xd99f9fbc9fd98c13), LL(0x17f0f00df017d323), LL(0x7f4a4ade4a7f6a20), LL(0x95dada73da959e44), LL(0x255858e85825faa2), LL(0xcac9c946c9ca06cf), LL(0x8d29297b298d557c), LL(0x220a0a1e0a22505a), LL(0x4fb1b1ceb14fe150), LL(0x1aa0a0fda01a69c9), LL(0xda6b6bbd6bda7f14), LL(0xab85859285ab5cd9), LL(0x73bdbddabd73813c), LL(0x345d5de75d34d28f), LL(0x5010103010508090), LL(0x03f4f401f403f307), LL(0xc0cbcb40cbc016dd), LL(0xc63e3e423ec6edd3), LL(0x1105050f0511282d), LL(0xe66767a967e61f78), LL(0x53e4e431e4537397), LL(0xbb27276927bb2502), LL(0x584141c341583273), LL(0x9d8b8b808b9d2ca7), LL(0x01a7a7f4a70151f6), LL(0x947d7d877d94cfb2), LL(0xfb9595a295fbdc49), LL(0x9fd8d875d89f8e56), LL(0x30fbfb10fb308b70), LL(0x71eeee2fee7123cd), LL(0x917c7c847c91c7bb), LL(0xe36666aa66e31771), LL(0x8edddd7add8ea67b), LL(0x4b171739174bb8af), LL(0x464747c947460245), LL(0xdc9e9ebf9edc841a), LL(0xc5caca43cac51ed4), LL(0x992d2d772d997558), LL(0x79bfbfdcbf79912e), LL(0x1b070709071b383f), LL(0x23adadeaad2301ac), LL(0x2f5a5aee5a2feab0), LL(0xb583839883b56cef), LL(0xff33335533ff85b6), LL(0xf26363a563f23f5c), LL(0x0a020206020a1012), LL(0x38aaaae3aa383993), LL(0xa871719371a8afde), LL(0xcfc8c845c8cf0ec6), LL(0x7d19192b197dc8d1), LL(0x704949db4970723b), LL(0x9ad9d976d99a865f), LL(0x1df2f20bf21dc331), LL(0x48e3e338e3484ba8), LL(0x2a5b5bed5b2ae2b9), LL(0x92888885889234bc), LL(0xc89a9ab39ac8a43e), LL(0xbe26266a26be2d0b), LL(0xfa32325632fa8dbf), LL(0x4ab0b0cdb04ae959), LL(0x6ae9e926e96a1bf2), LL(0x330f0f110f337877), LL(0xa6d5d562d5a6e633), LL(0xba80809d80ba74f4), LL(0x7cbebedfbe7c9927), LL(0xdecdcd4acdde26eb), LL(0xe434345c34e4bd89), LL(0x754848d848757a32), LL(0x24ffff1cff24ab54), LL(0x8f7a7a8e7a8ff78d), LL(0xea9090ad90eaf464), LL(0x3e5f5fe15f3ec29d), LL(0xa020206020a01d3d), LL(0xd56868b868d5670f), LL(0x721a1a2e1a72d0ca), LL(0x2caeaeefae2c19b7), LL(0x5eb4b4c1b45ec97d), LL(0x195454fc54199ace), LL(0xe59393a893e5ec7f), LL(0xaa22226622aa0d2f), LL(0xe96464ac64e90763), LL(0x12f1f10ef112db2a), LL(0xa273739573a2bfcc), LL(0x5a121236125a9082), LL(0x5d4040c0405d3a7a), LL(0x2808081808284048), LL(0xe8c3c358c3e85695), LL(0x7becec29ec7b33df), LL(0x90dbdb70db90964d), LL(0x1fa1a1fea11f61c0), LL(0x838d8d8a8d831c91), LL(0xc93d3d473dc9f5c8), LL(0xf19797a497f1cc5b), LL(0x0000000000000000), LL(0xd4cfcf4ccfd436f9), LL(0x872b2b7d2b87456e), LL(0xb376769a76b397e1), LL(0xb082829b82b064e6), LL(0xa9d6d667d6a9fe28), LL(0x771b1b2d1b77d8c3), LL(0x5bb5b5c2b55bc174), LL(0x29afafecaf2911be), LL(0xdf6a6abe6adf771d), LL(0x0d5050f0500dbaea), LL(0x4c4545cf454c1257), LL(0x18f3f308f318cb38), LL(0xf030305030f09dad), LL(0x74efef2cef742bc4), LL(0xc33f3f413fc3e5da), LL(0x1c5555ff551c92c7), LL(0x10a2a2fba21079db), LL(0x65eaea23ea6503e9), LL(0xec6565af65ec0f6a), LL(0x68babad3ba68b903), LL(0x932f2f712f93654a), LL(0xe7c0c05dc0e74e8e), LL(0x81dede7fde81be60), LL(0x6c1c1c241c6ce0fc), LL(0x2efdfd1afd2ebb46), LL(0x644d4dd74d64521f), LL(0xe09292ab92e0e476), LL(0xbc75759f75bc8ffa), LL(0x1e06060a061e3036), LL(0x988a8a838a9824ae), LL(0x40b2b2cbb240f94b), LL(0x59e6e637e6596385), LL(0x360e0e120e36707e), LL(0x631f1f211f63f8e7), LL(0xf76262a662f73755), LL(0xa3d4d461d4a3ee3a), LL(0x32a8a8e5a8322981), LL(0xf49696a796f4c452), LL(0x3af9f916f93a9b62), LL(0xf6c5c552c5f666a3), LL(0xb125256f25b13510), LL(0x205959eb5920f2ab), LL(0xae84849184ae54d0), LL(0xa772729672a7b7c5), LL(0xdd39394b39ddd5ec), LL(0x614c4cd44c615a16), LL(0x3b5e5ee25e3bca94), LL(0x857878887885e79f), LL(0xd838384838d8dde5), LL(0x868c8c898c861498), LL(0xb2d1d16ed1b2c617), LL(0x0ba5a5f2a50b41e4), LL(0x4de2e23be24d43a1), LL(0xf86161a361f82f4e), LL(0x45b3b3c8b345f142), LL(0xa521216321a51534), LL(0xd69c9cb99cd69408), LL(0x661e1e221e66f0ee), LL(0x524343c543522261), LL(0xfcc7c754c7fc76b1), LL(0x2bfcfc19fc2bb34f), LL(0x1404040c04142024), LL(0x085151f35108b2e3), LL(0xc79999b699c7bc25), LL(0xc46d6db76dc44f22), LL(0x390d0d170d396865), LL(0x35fafa13fa358379), LL(0x84dfdf7cdf84b669), LL(0x9b7e7e827e9bd7a9), LL(0xb424246c24b43d19), LL(0xd73b3b4d3bd7c5fe), LL(0x3dababe0ab3d319a), LL(0xd1cece4fced13ef0), LL(0x5511113311558899), LL(0x898f8f8c8f890c83), LL(0x6b4e4ed24e6b4a04), LL(0x51b7b7c4b751d166), LL(0x60ebeb20eb600be0), LL(0xcc3c3c443cccfdc1), LL(0xbf81819e81bf7cfd), LL(0xfe9494a194fed440), LL(0x0cf7f704f70ceb1c), LL(0x67b9b9d6b967a118), LL(0x5f131335135f988b), LL(0x9c2c2c742c9c7d51), LL(0xb8d3d368d3b8d605), LL(0x5ce7e734e75c6b8c), LL(0xcb6e6eb26ecb5739), LL(0xf3c4c451c4f36eaa), LL(0x0f030305030f181b), LL(0x135656fa56138adc), LL(0x494444cc44491a5e), LL(0x9e7f7f817f9edfa0), LL(0x37a9a9e6a9372188), LL(0x822a2a7e2a824d67), LL(0x6dbbbbd0bb6db10a), LL(0xe2c1c15ec1e24687), LL(0x025353f55302a2f1), LL(0x8bdcdc79dc8bae72), LL(0x270b0b1d0b275853), LL(0xd39d9dba9dd39c01), LL(0xc16c6cb46cc1472b), LL(0xf531315331f595a4), LL(0xb974749c74b987f3), LL(0x09f6f607f609e315), LL(0x434646ca46430a4c), LL(0x26acace9ac2609a5), LL(0x9789898689973cb5), LL(0x4414143c1444a0b4), LL(0x42e1e13ee1425bba), LL(0x4e16163a164eb0a6), LL(0xd23a3a4e3ad2cdf7), LL(0xd06969bb69d06f06), LL(0x2d09091b092d4841), LL(0xad70709070ada7d7), LL(0x54b6b6c7b654d96f), LL(0xb7d0d06dd0b7ce1e), LL(0x7eeded2aed7e3bd6), LL(0xdbcccc49ccdb2ee2), LL(0x574242c642572a68), LL(0xc29898b598c2b42c), LL(0x0ea4a4f1a40e49ed), LL(0x8828287828885d75), LL(0x315c5ce45c31da86), LL(0x3ff8f815f83f936b), LL(0xa486869786a444c2), }; static const u64 C2[256] = { LL(0xd8781818281878c0), LL(0x26af23236523af05), LL(0xb8f9c6c657c6f97e), LL(0xfb6fe8e825e86f13), LL(0xcba187879487a14c), LL(0x1162b8b8d5b862a9), LL(0x0905010103010508), LL(0x0d6e4f4fd14f6e42), LL(0x9bee36365a36eead), LL(0xff04a6a6f7a60459), LL(0x0cbdd2d26bd2bdde), LL(0x0e06f5f502f506fb), LL(0x968079798b7980ef), LL(0x30ce6f6fb16fce5f), LL(0x6def9191ae91effc), LL(0xf8075252f65207aa), LL(0x47fd6060a060fd27), LL(0x3576bcbcd9bc7689), LL(0x37cd9b9bb09bcdac), LL(0x8a8c8e8e8f8e8c04), LL(0xd215a3a3f8a31571), LL(0x6c3c0c0c140c3c60), LL(0x848a7b7b8d7b8aff), LL(0x80e135355f35e1b5), LL(0xf5691d1d271d69e8), LL(0xb347e0e03de04753), LL(0x21acd7d764d7acf6), LL(0x9cedc2c25bc2ed5e), LL(0x43962e2e722e966d), LL(0x297a4b4bdd4b7a62), LL(0x5d21fefe1ffe21a3), LL(0xd5165757f9571682), LL(0xbd4115153f1541a8), LL(0xe8b677779977b69f), LL(0x92eb37375937eba5), LL(0x9e56e5e532e5567b), LL(0x13d99f9fbc9fd98c), LL(0x2317f0f00df017d3), LL(0x207f4a4ade4a7f6a), LL(0x4495dada73da959e), LL(0xa2255858e85825fa), LL(0xcfcac9c946c9ca06), LL(0x7c8d29297b298d55), LL(0x5a220a0a1e0a2250), LL(0x504fb1b1ceb14fe1), LL(0xc91aa0a0fda01a69), LL(0x14da6b6bbd6bda7f), LL(0xd9ab85859285ab5c), LL(0x3c73bdbddabd7381), LL(0x8f345d5de75d34d2), LL(0x9050101030105080), LL(0x0703f4f401f403f3), LL(0xddc0cbcb40cbc016), LL(0xd3c63e3e423ec6ed), LL(0x2d1105050f051128), LL(0x78e66767a967e61f), LL(0x9753e4e431e45373), LL(0x02bb27276927bb25), LL(0x73584141c3415832), LL(0xa79d8b8b808b9d2c), LL(0xf601a7a7f4a70151), LL(0xb2947d7d877d94cf), LL(0x49fb9595a295fbdc), LL(0x569fd8d875d89f8e), LL(0x7030fbfb10fb308b), LL(0xcd71eeee2fee7123), LL(0xbb917c7c847c91c7), LL(0x71e36666aa66e317), LL(0x7b8edddd7add8ea6), LL(0xaf4b171739174bb8), LL(0x45464747c9474602), LL(0x1adc9e9ebf9edc84), LL(0xd4c5caca43cac51e), LL(0x58992d2d772d9975), LL(0x2e79bfbfdcbf7991), LL(0x3f1b070709071b38), LL(0xac23adadeaad2301), LL(0xb02f5a5aee5a2fea), LL(0xefb583839883b56c), LL(0xb6ff33335533ff85), LL(0x5cf26363a563f23f), LL(0x120a020206020a10), LL(0x9338aaaae3aa3839), LL(0xdea871719371a8af), LL(0xc6cfc8c845c8cf0e), LL(0xd17d19192b197dc8), LL(0x3b704949db497072), LL(0x5f9ad9d976d99a86), LL(0x311df2f20bf21dc3), LL(0xa848e3e338e3484b), LL(0xb92a5b5bed5b2ae2), LL(0xbc92888885889234), LL(0x3ec89a9ab39ac8a4), LL(0x0bbe26266a26be2d), LL(0xbffa32325632fa8d), LL(0x594ab0b0cdb04ae9), LL(0xf26ae9e926e96a1b), LL(0x77330f0f110f3378), LL(0x33a6d5d562d5a6e6), LL(0xf4ba80809d80ba74), LL(0x277cbebedfbe7c99), LL(0xebdecdcd4acdde26), LL(0x89e434345c34e4bd), LL(0x32754848d848757a), LL(0x5424ffff1cff24ab), LL(0x8d8f7a7a8e7a8ff7), LL(0x64ea9090ad90eaf4), LL(0x9d3e5f5fe15f3ec2), LL(0x3da020206020a01d), LL(0x0fd56868b868d567), LL(0xca721a1a2e1a72d0), LL(0xb72caeaeefae2c19), LL(0x7d5eb4b4c1b45ec9), LL(0xce195454fc54199a), LL(0x7fe59393a893e5ec), LL(0x2faa22226622aa0d), LL(0x63e96464ac64e907), LL(0x2a12f1f10ef112db), LL(0xcca273739573a2bf), LL(0x825a121236125a90), LL(0x7a5d4040c0405d3a), LL(0x4828080818082840), LL(0x95e8c3c358c3e856), LL(0xdf7becec29ec7b33), LL(0x4d90dbdb70db9096), LL(0xc01fa1a1fea11f61), LL(0x91838d8d8a8d831c), LL(0xc8c93d3d473dc9f5), LL(0x5bf19797a497f1cc), LL(0x0000000000000000), LL(0xf9d4cfcf4ccfd436), LL(0x6e872b2b7d2b8745), LL(0xe1b376769a76b397), LL(0xe6b082829b82b064), LL(0x28a9d6d667d6a9fe), LL(0xc3771b1b2d1b77d8), LL(0x745bb5b5c2b55bc1), LL(0xbe29afafecaf2911), LL(0x1ddf6a6abe6adf77), LL(0xea0d5050f0500dba), LL(0x574c4545cf454c12), LL(0x3818f3f308f318cb), LL(0xadf030305030f09d), LL(0xc474efef2cef742b), LL(0xdac33f3f413fc3e5), LL(0xc71c5555ff551c92), LL(0xdb10a2a2fba21079), LL(0xe965eaea23ea6503), LL(0x6aec6565af65ec0f), LL(0x0368babad3ba68b9), LL(0x4a932f2f712f9365), LL(0x8ee7c0c05dc0e74e), LL(0x6081dede7fde81be), LL(0xfc6c1c1c241c6ce0), LL(0x462efdfd1afd2ebb), LL(0x1f644d4dd74d6452), LL(0x76e09292ab92e0e4), LL(0xfabc75759f75bc8f), LL(0x361e06060a061e30), LL(0xae988a8a838a9824), LL(0x4b40b2b2cbb240f9), LL(0x8559e6e637e65963), LL(0x7e360e0e120e3670), LL(0xe7631f1f211f63f8), LL(0x55f76262a662f737), LL(0x3aa3d4d461d4a3ee), LL(0x8132a8a8e5a83229), LL(0x52f49696a796f4c4), LL(0x623af9f916f93a9b), LL(0xa3f6c5c552c5f666), LL(0x10b125256f25b135), LL(0xab205959eb5920f2), LL(0xd0ae84849184ae54), LL(0xc5a772729672a7b7), LL(0xecdd39394b39ddd5), LL(0x16614c4cd44c615a), LL(0x943b5e5ee25e3bca), LL(0x9f857878887885e7), LL(0xe5d838384838d8dd), LL(0x98868c8c898c8614), LL(0x17b2d1d16ed1b2c6), LL(0xe40ba5a5f2a50b41), LL(0xa14de2e23be24d43), LL(0x4ef86161a361f82f), LL(0x4245b3b3c8b345f1), LL(0x34a521216321a515), LL(0x08d69c9cb99cd694), LL(0xee661e1e221e66f0), LL(0x61524343c5435222), LL(0xb1fcc7c754c7fc76), LL(0x4f2bfcfc19fc2bb3), LL(0x241404040c041420), LL(0xe3085151f35108b2), LL(0x25c79999b699c7bc), LL(0x22c46d6db76dc44f), LL(0x65390d0d170d3968), LL(0x7935fafa13fa3583), LL(0x6984dfdf7cdf84b6), LL(0xa99b7e7e827e9bd7), LL(0x19b424246c24b43d), LL(0xfed73b3b4d3bd7c5), LL(0x9a3dababe0ab3d31), LL(0xf0d1cece4fced13e), LL(0x9955111133115588), LL(0x83898f8f8c8f890c), LL(0x046b4e4ed24e6b4a), LL(0x6651b7b7c4b751d1), LL(0xe060ebeb20eb600b), LL(0xc1cc3c3c443cccfd), LL(0xfdbf81819e81bf7c), LL(0x40fe9494a194fed4), LL(0x1c0cf7f704f70ceb), LL(0x1867b9b9d6b967a1), LL(0x8b5f131335135f98), LL(0x519c2c2c742c9c7d), LL(0x05b8d3d368d3b8d6), LL(0x8c5ce7e734e75c6b), LL(0x39cb6e6eb26ecb57), LL(0xaaf3c4c451c4f36e), LL(0x1b0f030305030f18), LL(0xdc135656fa56138a), LL(0x5e494444cc44491a), LL(0xa09e7f7f817f9edf), LL(0x8837a9a9e6a93721), LL(0x67822a2a7e2a824d), LL(0x0a6dbbbbd0bb6db1), LL(0x87e2c1c15ec1e246), LL(0xf1025353f55302a2), LL(0x728bdcdc79dc8bae), LL(0x53270b0b1d0b2758), LL(0x01d39d9dba9dd39c), LL(0x2bc16c6cb46cc147), LL(0xa4f531315331f595), LL(0xf3b974749c74b987), LL(0x1509f6f607f609e3), LL(0x4c434646ca46430a), LL(0xa526acace9ac2609), LL(0xb59789898689973c), LL(0xb44414143c1444a0), LL(0xba42e1e13ee1425b), LL(0xa64e16163a164eb0), LL(0xf7d23a3a4e3ad2cd), LL(0x06d06969bb69d06f), LL(0x412d09091b092d48), LL(0xd7ad70709070ada7), LL(0x6f54b6b6c7b654d9), LL(0x1eb7d0d06dd0b7ce), LL(0xd67eeded2aed7e3b), LL(0xe2dbcccc49ccdb2e), LL(0x68574242c642572a), LL(0x2cc29898b598c2b4), LL(0xed0ea4a4f1a40e49), LL(0x758828287828885d), LL(0x86315c5ce45c31da), LL(0x6b3ff8f815f83f93), LL(0xc2a486869786a444), }; static const u64 C3[256] = { LL(0xc0d8781818281878), LL(0x0526af23236523af), LL(0x7eb8f9c6c657c6f9), LL(0x13fb6fe8e825e86f), LL(0x4ccba187879487a1), LL(0xa91162b8b8d5b862), LL(0x0809050101030105), LL(0x420d6e4f4fd14f6e), LL(0xad9bee36365a36ee), LL(0x59ff04a6a6f7a604), LL(0xde0cbdd2d26bd2bd), LL(0xfb0e06f5f502f506), LL(0xef968079798b7980), LL(0x5f30ce6f6fb16fce), LL(0xfc6def9191ae91ef), LL(0xaaf8075252f65207), LL(0x2747fd6060a060fd), LL(0x893576bcbcd9bc76), LL(0xac37cd9b9bb09bcd), LL(0x048a8c8e8e8f8e8c), LL(0x71d215a3a3f8a315), LL(0x606c3c0c0c140c3c), LL(0xff848a7b7b8d7b8a), LL(0xb580e135355f35e1), LL(0xe8f5691d1d271d69), LL(0x53b347e0e03de047), LL(0xf621acd7d764d7ac), LL(0x5e9cedc2c25bc2ed), LL(0x6d43962e2e722e96), LL(0x62297a4b4bdd4b7a), LL(0xa35d21fefe1ffe21), LL(0x82d5165757f95716), LL(0xa8bd4115153f1541), LL(0x9fe8b677779977b6), LL(0xa592eb37375937eb), LL(0x7b9e56e5e532e556), LL(0x8c13d99f9fbc9fd9), LL(0xd32317f0f00df017), LL(0x6a207f4a4ade4a7f), LL(0x9e4495dada73da95), LL(0xfaa2255858e85825), LL(0x06cfcac9c946c9ca), LL(0x557c8d29297b298d), LL(0x505a220a0a1e0a22), LL(0xe1504fb1b1ceb14f), LL(0x69c91aa0a0fda01a), LL(0x7f14da6b6bbd6bda), LL(0x5cd9ab85859285ab), LL(0x813c73bdbddabd73), LL(0xd28f345d5de75d34), LL(0x8090501010301050), LL(0xf30703f4f401f403), LL(0x16ddc0cbcb40cbc0), LL(0xedd3c63e3e423ec6), LL(0x282d1105050f0511), LL(0x1f78e66767a967e6), LL(0x739753e4e431e453), LL(0x2502bb27276927bb), LL(0x3273584141c34158), LL(0x2ca79d8b8b808b9d), LL(0x51f601a7a7f4a701), LL(0xcfb2947d7d877d94), LL(0xdc49fb9595a295fb), LL(0x8e569fd8d875d89f), LL(0x8b7030fbfb10fb30), LL(0x23cd71eeee2fee71), LL(0xc7bb917c7c847c91), LL(0x1771e36666aa66e3), LL(0xa67b8edddd7add8e), LL(0xb8af4b171739174b), LL(0x0245464747c94746), LL(0x841adc9e9ebf9edc), LL(0x1ed4c5caca43cac5), LL(0x7558992d2d772d99), LL(0x912e79bfbfdcbf79), LL(0x383f1b070709071b), LL(0x01ac23adadeaad23), LL(0xeab02f5a5aee5a2f), LL(0x6cefb583839883b5), LL(0x85b6ff33335533ff), LL(0x3f5cf26363a563f2), LL(0x10120a020206020a), LL(0x399338aaaae3aa38), LL(0xafdea871719371a8), LL(0x0ec6cfc8c845c8cf), LL(0xc8d17d19192b197d), LL(0x723b704949db4970), LL(0x865f9ad9d976d99a), LL(0xc3311df2f20bf21d), LL(0x4ba848e3e338e348), LL(0xe2b92a5b5bed5b2a), LL(0x34bc928888858892), LL(0xa43ec89a9ab39ac8), LL(0x2d0bbe26266a26be), LL(0x8dbffa32325632fa), LL(0xe9594ab0b0cdb04a), LL(0x1bf26ae9e926e96a), LL(0x7877330f0f110f33), LL(0xe633a6d5d562d5a6), LL(0x74f4ba80809d80ba), LL(0x99277cbebedfbe7c), LL(0x26ebdecdcd4acdde), LL(0xbd89e434345c34e4), LL(0x7a32754848d84875), LL(0xab5424ffff1cff24), LL(0xf78d8f7a7a8e7a8f), LL(0xf464ea9090ad90ea), LL(0xc29d3e5f5fe15f3e), LL(0x1d3da020206020a0), LL(0x670fd56868b868d5), LL(0xd0ca721a1a2e1a72), LL(0x19b72caeaeefae2c), LL(0xc97d5eb4b4c1b45e), LL(0x9ace195454fc5419), LL(0xec7fe59393a893e5), LL(0x0d2faa22226622aa), LL(0x0763e96464ac64e9), LL(0xdb2a12f1f10ef112), LL(0xbfcca273739573a2), LL(0x90825a121236125a), LL(0x3a7a5d4040c0405d), LL(0x4048280808180828), LL(0x5695e8c3c358c3e8), LL(0x33df7becec29ec7b), LL(0x964d90dbdb70db90), LL(0x61c01fa1a1fea11f), LL(0x1c91838d8d8a8d83), LL(0xf5c8c93d3d473dc9), LL(0xcc5bf19797a497f1), LL(0x0000000000000000), LL(0x36f9d4cfcf4ccfd4), LL(0x456e872b2b7d2b87), LL(0x97e1b376769a76b3), LL(0x64e6b082829b82b0), LL(0xfe28a9d6d667d6a9), LL(0xd8c3771b1b2d1b77), LL(0xc1745bb5b5c2b55b), LL(0x11be29afafecaf29), LL(0x771ddf6a6abe6adf), LL(0xbaea0d5050f0500d), LL(0x12574c4545cf454c), LL(0xcb3818f3f308f318), LL(0x9dadf030305030f0), LL(0x2bc474efef2cef74), LL(0xe5dac33f3f413fc3), LL(0x92c71c5555ff551c), LL(0x79db10a2a2fba210), LL(0x03e965eaea23ea65), LL(0x0f6aec6565af65ec), LL(0xb90368babad3ba68), LL(0x654a932f2f712f93), LL(0x4e8ee7c0c05dc0e7), LL(0xbe6081dede7fde81), LL(0xe0fc6c1c1c241c6c), LL(0xbb462efdfd1afd2e), LL(0x521f644d4dd74d64), LL(0xe476e09292ab92e0), LL(0x8ffabc75759f75bc), LL(0x30361e06060a061e), LL(0x24ae988a8a838a98), LL(0xf94b40b2b2cbb240), LL(0x638559e6e637e659), LL(0x707e360e0e120e36), LL(0xf8e7631f1f211f63), LL(0x3755f76262a662f7), LL(0xee3aa3d4d461d4a3), LL(0x298132a8a8e5a832), LL(0xc452f49696a796f4), LL(0x9b623af9f916f93a), LL(0x66a3f6c5c552c5f6), LL(0x3510b125256f25b1), LL(0xf2ab205959eb5920), LL(0x54d0ae84849184ae), LL(0xb7c5a772729672a7), LL(0xd5ecdd39394b39dd), LL(0x5a16614c4cd44c61), LL(0xca943b5e5ee25e3b), LL(0xe79f857878887885), LL(0xdde5d838384838d8), LL(0x1498868c8c898c86), LL(0xc617b2d1d16ed1b2), LL(0x41e40ba5a5f2a50b), LL(0x43a14de2e23be24d), LL(0x2f4ef86161a361f8), LL(0xf14245b3b3c8b345), LL(0x1534a521216321a5), LL(0x9408d69c9cb99cd6), LL(0xf0ee661e1e221e66), LL(0x2261524343c54352), LL(0x76b1fcc7c754c7fc), LL(0xb34f2bfcfc19fc2b), LL(0x20241404040c0414), LL(0xb2e3085151f35108), LL(0xbc25c79999b699c7), LL(0x4f22c46d6db76dc4), LL(0x6865390d0d170d39), LL(0x837935fafa13fa35), LL(0xb66984dfdf7cdf84), LL(0xd7a99b7e7e827e9b), LL(0x3d19b424246c24b4), LL(0xc5fed73b3b4d3bd7), LL(0x319a3dababe0ab3d), LL(0x3ef0d1cece4fced1), LL(0x8899551111331155), LL(0x0c83898f8f8c8f89), LL(0x4a046b4e4ed24e6b), LL(0xd16651b7b7c4b751), LL(0x0be060ebeb20eb60), LL(0xfdc1cc3c3c443ccc), LL(0x7cfdbf81819e81bf), LL(0xd440fe9494a194fe), LL(0xeb1c0cf7f704f70c), LL(0xa11867b9b9d6b967), LL(0x988b5f131335135f), LL(0x7d519c2c2c742c9c), LL(0xd605b8d3d368d3b8), LL(0x6b8c5ce7e734e75c), LL(0x5739cb6e6eb26ecb), LL(0x6eaaf3c4c451c4f3), LL(0x181b0f030305030f), LL(0x8adc135656fa5613), LL(0x1a5e494444cc4449), LL(0xdfa09e7f7f817f9e), LL(0x218837a9a9e6a937), LL(0x4d67822a2a7e2a82), LL(0xb10a6dbbbbd0bb6d), LL(0x4687e2c1c15ec1e2), LL(0xa2f1025353f55302), LL(0xae728bdcdc79dc8b), LL(0x5853270b0b1d0b27), LL(0x9c01d39d9dba9dd3), LL(0x472bc16c6cb46cc1), LL(0x95a4f531315331f5), LL(0x87f3b974749c74b9), LL(0xe31509f6f607f609), LL(0x0a4c434646ca4643), LL(0x09a526acace9ac26), LL(0x3cb5978989868997), LL(0xa0b44414143c1444), LL(0x5bba42e1e13ee142), LL(0xb0a64e16163a164e), LL(0xcdf7d23a3a4e3ad2), LL(0x6f06d06969bb69d0), LL(0x48412d09091b092d), LL(0xa7d7ad70709070ad), LL(0xd96f54b6b6c7b654), LL(0xce1eb7d0d06dd0b7), LL(0x3bd67eeded2aed7e), LL(0x2ee2dbcccc49ccdb), LL(0x2a68574242c64257), LL(0xb42cc29898b598c2), LL(0x49ed0ea4a4f1a40e), LL(0x5d75882828782888), LL(0xda86315c5ce45c31), LL(0x936b3ff8f815f83f), LL(0x44c2a486869786a4), }; static const u64 C4[256] = { LL(0x78c0d87818182818), LL(0xaf0526af23236523), LL(0xf97eb8f9c6c657c6), LL(0x6f13fb6fe8e825e8), LL(0xa14ccba187879487), LL(0x62a91162b8b8d5b8), LL(0x0508090501010301), LL(0x6e420d6e4f4fd14f), LL(0xeead9bee36365a36), LL(0x0459ff04a6a6f7a6), LL(0xbdde0cbdd2d26bd2), LL(0x06fb0e06f5f502f5), LL(0x80ef968079798b79), LL(0xce5f30ce6f6fb16f), LL(0xeffc6def9191ae91), LL(0x07aaf8075252f652), LL(0xfd2747fd6060a060), LL(0x76893576bcbcd9bc), LL(0xcdac37cd9b9bb09b), LL(0x8c048a8c8e8e8f8e), LL(0x1571d215a3a3f8a3), LL(0x3c606c3c0c0c140c), LL(0x8aff848a7b7b8d7b), LL(0xe1b580e135355f35), LL(0x69e8f5691d1d271d), LL(0x4753b347e0e03de0), LL(0xacf621acd7d764d7), LL(0xed5e9cedc2c25bc2), LL(0x966d43962e2e722e), LL(0x7a62297a4b4bdd4b), LL(0x21a35d21fefe1ffe), LL(0x1682d5165757f957), LL(0x41a8bd4115153f15), LL(0xb69fe8b677779977), LL(0xeba592eb37375937), LL(0x567b9e56e5e532e5), LL(0xd98c13d99f9fbc9f), LL(0x17d32317f0f00df0), LL(0x7f6a207f4a4ade4a), LL(0x959e4495dada73da), LL(0x25faa2255858e858), LL(0xca06cfcac9c946c9), LL(0x8d557c8d29297b29), LL(0x22505a220a0a1e0a), LL(0x4fe1504fb1b1ceb1), LL(0x1a69c91aa0a0fda0), LL(0xda7f14da6b6bbd6b), LL(0xab5cd9ab85859285), LL(0x73813c73bdbddabd), LL(0x34d28f345d5de75d), LL(0x5080905010103010), LL(0x03f30703f4f401f4), LL(0xc016ddc0cbcb40cb), LL(0xc6edd3c63e3e423e), LL(0x11282d1105050f05), LL(0xe61f78e66767a967), LL(0x53739753e4e431e4), LL(0xbb2502bb27276927), LL(0x583273584141c341), LL(0x9d2ca79d8b8b808b), LL(0x0151f601a7a7f4a7), LL(0x94cfb2947d7d877d), LL(0xfbdc49fb9595a295), LL(0x9f8e569fd8d875d8), LL(0x308b7030fbfb10fb), LL(0x7123cd71eeee2fee), LL(0x91c7bb917c7c847c), LL(0xe31771e36666aa66), LL(0x8ea67b8edddd7add), LL(0x4bb8af4b17173917), LL(0x460245464747c947), LL(0xdc841adc9e9ebf9e), LL(0xc51ed4c5caca43ca), LL(0x997558992d2d772d), LL(0x79912e79bfbfdcbf), LL(0x1b383f1b07070907), LL(0x2301ac23adadeaad), LL(0x2feab02f5a5aee5a), LL(0xb56cefb583839883), LL(0xff85b6ff33335533), LL(0xf23f5cf26363a563), LL(0x0a10120a02020602), LL(0x38399338aaaae3aa), LL(0xa8afdea871719371), LL(0xcf0ec6cfc8c845c8), LL(0x7dc8d17d19192b19), LL(0x70723b704949db49), LL(0x9a865f9ad9d976d9), LL(0x1dc3311df2f20bf2), LL(0x484ba848e3e338e3), LL(0x2ae2b92a5b5bed5b), LL(0x9234bc9288888588), LL(0xc8a43ec89a9ab39a), LL(0xbe2d0bbe26266a26), LL(0xfa8dbffa32325632), LL(0x4ae9594ab0b0cdb0), LL(0x6a1bf26ae9e926e9), LL(0x337877330f0f110f), LL(0xa6e633a6d5d562d5), LL(0xba74f4ba80809d80), LL(0x7c99277cbebedfbe), LL(0xde26ebdecdcd4acd), LL(0xe4bd89e434345c34), LL(0x757a32754848d848), LL(0x24ab5424ffff1cff), LL(0x8ff78d8f7a7a8e7a), LL(0xeaf464ea9090ad90), LL(0x3ec29d3e5f5fe15f), LL(0xa01d3da020206020), LL(0xd5670fd56868b868), LL(0x72d0ca721a1a2e1a), LL(0x2c19b72caeaeefae), LL(0x5ec97d5eb4b4c1b4), LL(0x199ace195454fc54), LL(0xe5ec7fe59393a893), LL(0xaa0d2faa22226622), LL(0xe90763e96464ac64), LL(0x12db2a12f1f10ef1), LL(0xa2bfcca273739573), LL(0x5a90825a12123612), LL(0x5d3a7a5d4040c040), LL(0x2840482808081808), LL(0xe85695e8c3c358c3), LL(0x7b33df7becec29ec), LL(0x90964d90dbdb70db), LL(0x1f61c01fa1a1fea1), LL(0x831c91838d8d8a8d), LL(0xc9f5c8c93d3d473d), LL(0xf1cc5bf19797a497), LL(0x0000000000000000), LL(0xd436f9d4cfcf4ccf), LL(0x87456e872b2b7d2b), LL(0xb397e1b376769a76), LL(0xb064e6b082829b82), LL(0xa9fe28a9d6d667d6), LL(0x77d8c3771b1b2d1b), LL(0x5bc1745bb5b5c2b5), LL(0x2911be29afafecaf), LL(0xdf771ddf6a6abe6a), LL(0x0dbaea0d5050f050), LL(0x4c12574c4545cf45), LL(0x18cb3818f3f308f3), LL(0xf09dadf030305030), LL(0x742bc474efef2cef), LL(0xc3e5dac33f3f413f), LL(0x1c92c71c5555ff55), LL(0x1079db10a2a2fba2), LL(0x6503e965eaea23ea), LL(0xec0f6aec6565af65), LL(0x68b90368babad3ba), LL(0x93654a932f2f712f), LL(0xe74e8ee7c0c05dc0), LL(0x81be6081dede7fde), LL(0x6ce0fc6c1c1c241c), LL(0x2ebb462efdfd1afd), LL(0x64521f644d4dd74d), LL(0xe0e476e09292ab92), LL(0xbc8ffabc75759f75), LL(0x1e30361e06060a06), LL(0x9824ae988a8a838a), LL(0x40f94b40b2b2cbb2), LL(0x59638559e6e637e6), LL(0x36707e360e0e120e), LL(0x63f8e7631f1f211f), LL(0xf73755f76262a662), LL(0xa3ee3aa3d4d461d4), LL(0x32298132a8a8e5a8), LL(0xf4c452f49696a796), LL(0x3a9b623af9f916f9), LL(0xf666a3f6c5c552c5), LL(0xb13510b125256f25), LL(0x20f2ab205959eb59), LL(0xae54d0ae84849184), LL(0xa7b7c5a772729672), LL(0xddd5ecdd39394b39), LL(0x615a16614c4cd44c), LL(0x3bca943b5e5ee25e), LL(0x85e79f8578788878), LL(0xd8dde5d838384838), LL(0x861498868c8c898c), LL(0xb2c617b2d1d16ed1), LL(0x0b41e40ba5a5f2a5), LL(0x4d43a14de2e23be2), LL(0xf82f4ef86161a361), LL(0x45f14245b3b3c8b3), LL(0xa51534a521216321), LL(0xd69408d69c9cb99c), LL(0x66f0ee661e1e221e), LL(0x522261524343c543), LL(0xfc76b1fcc7c754c7), LL(0x2bb34f2bfcfc19fc), LL(0x1420241404040c04), LL(0x08b2e3085151f351), LL(0xc7bc25c79999b699), LL(0xc44f22c46d6db76d), LL(0x396865390d0d170d), LL(0x35837935fafa13fa), LL(0x84b66984dfdf7cdf), LL(0x9bd7a99b7e7e827e), LL(0xb43d19b424246c24), LL(0xd7c5fed73b3b4d3b), LL(0x3d319a3dababe0ab), LL(0xd13ef0d1cece4fce), LL(0x5588995511113311), LL(0x890c83898f8f8c8f), LL(0x6b4a046b4e4ed24e), LL(0x51d16651b7b7c4b7), LL(0x600be060ebeb20eb), LL(0xccfdc1cc3c3c443c), LL(0xbf7cfdbf81819e81), LL(0xfed440fe9494a194), LL(0x0ceb1c0cf7f704f7), LL(0x67a11867b9b9d6b9), LL(0x5f988b5f13133513), LL(0x9c7d519c2c2c742c), LL(0xb8d605b8d3d368d3), LL(0x5c6b8c5ce7e734e7), LL(0xcb5739cb6e6eb26e), LL(0xf36eaaf3c4c451c4), LL(0x0f181b0f03030503), LL(0x138adc135656fa56), LL(0x491a5e494444cc44), LL(0x9edfa09e7f7f817f), LL(0x37218837a9a9e6a9), LL(0x824d67822a2a7e2a), LL(0x6db10a6dbbbbd0bb), LL(0xe24687e2c1c15ec1), LL(0x02a2f1025353f553), LL(0x8bae728bdcdc79dc), LL(0x275853270b0b1d0b), LL(0xd39c01d39d9dba9d), LL(0xc1472bc16c6cb46c), LL(0xf595a4f531315331), LL(0xb987f3b974749c74), LL(0x09e31509f6f607f6), LL(0x430a4c434646ca46), LL(0x2609a526acace9ac), LL(0x973cb59789898689), LL(0x44a0b44414143c14), LL(0x425bba42e1e13ee1), LL(0x4eb0a64e16163a16), LL(0xd2cdf7d23a3a4e3a), LL(0xd06f06d06969bb69), LL(0x2d48412d09091b09), LL(0xada7d7ad70709070), LL(0x54d96f54b6b6c7b6), LL(0xb7ce1eb7d0d06dd0), LL(0x7e3bd67eeded2aed), LL(0xdb2ee2dbcccc49cc), LL(0x572a68574242c642), LL(0xc2b42cc29898b598), LL(0x0e49ed0ea4a4f1a4), LL(0x885d758828287828), LL(0x31da86315c5ce45c), LL(0x3f936b3ff8f815f8), LL(0xa444c2a486869786), }; static const u64 C5[256] = { LL(0x1878c0d878181828), LL(0x23af0526af232365), LL(0xc6f97eb8f9c6c657), LL(0xe86f13fb6fe8e825), LL(0x87a14ccba1878794), LL(0xb862a91162b8b8d5), LL(0x0105080905010103), LL(0x4f6e420d6e4f4fd1), LL(0x36eead9bee36365a), LL(0xa60459ff04a6a6f7), LL(0xd2bdde0cbdd2d26b), LL(0xf506fb0e06f5f502), LL(0x7980ef968079798b), LL(0x6fce5f30ce6f6fb1), LL(0x91effc6def9191ae), LL(0x5207aaf8075252f6), LL(0x60fd2747fd6060a0), LL(0xbc76893576bcbcd9), LL(0x9bcdac37cd9b9bb0), LL(0x8e8c048a8c8e8e8f), LL(0xa31571d215a3a3f8), LL(0x0c3c606c3c0c0c14), LL(0x7b8aff848a7b7b8d), LL(0x35e1b580e135355f), LL(0x1d69e8f5691d1d27), LL(0xe04753b347e0e03d), LL(0xd7acf621acd7d764), LL(0xc2ed5e9cedc2c25b), LL(0x2e966d43962e2e72), LL(0x4b7a62297a4b4bdd), LL(0xfe21a35d21fefe1f), LL(0x571682d5165757f9), LL(0x1541a8bd4115153f), LL(0x77b69fe8b6777799), LL(0x37eba592eb373759), LL(0xe5567b9e56e5e532), LL(0x9fd98c13d99f9fbc), LL(0xf017d32317f0f00d), LL(0x4a7f6a207f4a4ade), LL(0xda959e4495dada73), LL(0x5825faa2255858e8), LL(0xc9ca06cfcac9c946), LL(0x298d557c8d29297b), LL(0x0a22505a220a0a1e), LL(0xb14fe1504fb1b1ce), LL(0xa01a69c91aa0a0fd), LL(0x6bda7f14da6b6bbd), LL(0x85ab5cd9ab858592), LL(0xbd73813c73bdbdda), LL(0x5d34d28f345d5de7), LL(0x1050809050101030), LL(0xf403f30703f4f401), LL(0xcbc016ddc0cbcb40), LL(0x3ec6edd3c63e3e42), LL(0x0511282d1105050f), LL(0x67e61f78e66767a9), LL(0xe453739753e4e431), LL(0x27bb2502bb272769), LL(0x41583273584141c3), LL(0x8b9d2ca79d8b8b80), LL(0xa70151f601a7a7f4), LL(0x7d94cfb2947d7d87), LL(0x95fbdc49fb9595a2), LL(0xd89f8e569fd8d875), LL(0xfb308b7030fbfb10), LL(0xee7123cd71eeee2f), LL(0x7c91c7bb917c7c84), LL(0x66e31771e36666aa), LL(0xdd8ea67b8edddd7a), LL(0x174bb8af4b171739), LL(0x47460245464747c9), LL(0x9edc841adc9e9ebf), LL(0xcac51ed4c5caca43), LL(0x2d997558992d2d77), LL(0xbf79912e79bfbfdc), LL(0x071b383f1b070709), LL(0xad2301ac23adadea), LL(0x5a2feab02f5a5aee), LL(0x83b56cefb5838398), LL(0x33ff85b6ff333355), LL(0x63f23f5cf26363a5), LL(0x020a10120a020206), LL(0xaa38399338aaaae3), LL(0x71a8afdea8717193), LL(0xc8cf0ec6cfc8c845), LL(0x197dc8d17d19192b), LL(0x4970723b704949db), LL(0xd99a865f9ad9d976), LL(0xf21dc3311df2f20b), LL(0xe3484ba848e3e338), LL(0x5b2ae2b92a5b5bed), LL(0x889234bc92888885), LL(0x9ac8a43ec89a9ab3), LL(0x26be2d0bbe26266a), LL(0x32fa8dbffa323256), LL(0xb04ae9594ab0b0cd), LL(0xe96a1bf26ae9e926), LL(0x0f337877330f0f11), LL(0xd5a6e633a6d5d562), LL(0x80ba74f4ba80809d), LL(0xbe7c99277cbebedf), LL(0xcdde26ebdecdcd4a), LL(0x34e4bd89e434345c), LL(0x48757a32754848d8), LL(0xff24ab5424ffff1c), LL(0x7a8ff78d8f7a7a8e), LL(0x90eaf464ea9090ad), LL(0x5f3ec29d3e5f5fe1), LL(0x20a01d3da0202060), LL(0x68d5670fd56868b8), LL(0x1a72d0ca721a1a2e), LL(0xae2c19b72caeaeef), LL(0xb45ec97d5eb4b4c1), LL(0x54199ace195454fc), LL(0x93e5ec7fe59393a8), LL(0x22aa0d2faa222266), LL(0x64e90763e96464ac), LL(0xf112db2a12f1f10e), LL(0x73a2bfcca2737395), LL(0x125a90825a121236), LL(0x405d3a7a5d4040c0), LL(0x0828404828080818), LL(0xc3e85695e8c3c358), LL(0xec7b33df7becec29), LL(0xdb90964d90dbdb70), LL(0xa11f61c01fa1a1fe), LL(0x8d831c91838d8d8a), LL(0x3dc9f5c8c93d3d47), LL(0x97f1cc5bf19797a4), LL(0x0000000000000000), LL(0xcfd436f9d4cfcf4c), LL(0x2b87456e872b2b7d), LL(0x76b397e1b376769a), LL(0x82b064e6b082829b), LL(0xd6a9fe28a9d6d667), LL(0x1b77d8c3771b1b2d), LL(0xb55bc1745bb5b5c2), LL(0xaf2911be29afafec), LL(0x6adf771ddf6a6abe), LL(0x500dbaea0d5050f0), LL(0x454c12574c4545cf), LL(0xf318cb3818f3f308), LL(0x30f09dadf0303050), LL(0xef742bc474efef2c), LL(0x3fc3e5dac33f3f41), LL(0x551c92c71c5555ff), LL(0xa21079db10a2a2fb), LL(0xea6503e965eaea23), LL(0x65ec0f6aec6565af), LL(0xba68b90368babad3), LL(0x2f93654a932f2f71), LL(0xc0e74e8ee7c0c05d), LL(0xde81be6081dede7f), LL(0x1c6ce0fc6c1c1c24), LL(0xfd2ebb462efdfd1a), LL(0x4d64521f644d4dd7), LL(0x92e0e476e09292ab), LL(0x75bc8ffabc75759f), LL(0x061e30361e06060a), LL(0x8a9824ae988a8a83), LL(0xb240f94b40b2b2cb), LL(0xe659638559e6e637), LL(0x0e36707e360e0e12), LL(0x1f63f8e7631f1f21), LL(0x62f73755f76262a6), LL(0xd4a3ee3aa3d4d461), LL(0xa832298132a8a8e5), LL(0x96f4c452f49696a7), LL(0xf93a9b623af9f916), LL(0xc5f666a3f6c5c552), LL(0x25b13510b125256f), LL(0x5920f2ab205959eb), LL(0x84ae54d0ae848491), LL(0x72a7b7c5a7727296), LL(0x39ddd5ecdd39394b), LL(0x4c615a16614c4cd4), LL(0x5e3bca943b5e5ee2), LL(0x7885e79f85787888), LL(0x38d8dde5d8383848), LL(0x8c861498868c8c89), LL(0xd1b2c617b2d1d16e), LL(0xa50b41e40ba5a5f2), LL(0xe24d43a14de2e23b), LL(0x61f82f4ef86161a3), LL(0xb345f14245b3b3c8), LL(0x21a51534a5212163), LL(0x9cd69408d69c9cb9), LL(0x1e66f0ee661e1e22), LL(0x43522261524343c5), LL(0xc7fc76b1fcc7c754), LL(0xfc2bb34f2bfcfc19), LL(0x041420241404040c), LL(0x5108b2e3085151f3), LL(0x99c7bc25c79999b6), LL(0x6dc44f22c46d6db7), LL(0x0d396865390d0d17), LL(0xfa35837935fafa13), LL(0xdf84b66984dfdf7c), LL(0x7e9bd7a99b7e7e82), LL(0x24b43d19b424246c), LL(0x3bd7c5fed73b3b4d), LL(0xab3d319a3dababe0), LL(0xced13ef0d1cece4f), LL(0x1155889955111133), LL(0x8f890c83898f8f8c), LL(0x4e6b4a046b4e4ed2), LL(0xb751d16651b7b7c4), LL(0xeb600be060ebeb20), LL(0x3cccfdc1cc3c3c44), LL(0x81bf7cfdbf81819e), LL(0x94fed440fe9494a1), LL(0xf70ceb1c0cf7f704), LL(0xb967a11867b9b9d6), LL(0x135f988b5f131335), LL(0x2c9c7d519c2c2c74), LL(0xd3b8d605b8d3d368), LL(0xe75c6b8c5ce7e734), LL(0x6ecb5739cb6e6eb2), LL(0xc4f36eaaf3c4c451), LL(0x030f181b0f030305), LL(0x56138adc135656fa), LL(0x44491a5e494444cc), LL(0x7f9edfa09e7f7f81), LL(0xa937218837a9a9e6), LL(0x2a824d67822a2a7e), LL(0xbb6db10a6dbbbbd0), LL(0xc1e24687e2c1c15e), LL(0x5302a2f1025353f5), LL(0xdc8bae728bdcdc79), LL(0x0b275853270b0b1d), LL(0x9dd39c01d39d9dba), LL(0x6cc1472bc16c6cb4), LL(0x31f595a4f5313153), LL(0x74b987f3b974749c), LL(0xf609e31509f6f607), LL(0x46430a4c434646ca), LL(0xac2609a526acace9), LL(0x89973cb597898986), LL(0x1444a0b44414143c), LL(0xe1425bba42e1e13e), LL(0x164eb0a64e16163a), LL(0x3ad2cdf7d23a3a4e), LL(0x69d06f06d06969bb), LL(0x092d48412d09091b), LL(0x70ada7d7ad707090), LL(0xb654d96f54b6b6c7), LL(0xd0b7ce1eb7d0d06d), LL(0xed7e3bd67eeded2a), LL(0xccdb2ee2dbcccc49), LL(0x42572a68574242c6), LL(0x98c2b42cc29898b5), LL(0xa40e49ed0ea4a4f1), LL(0x28885d7588282878), LL(0x5c31da86315c5ce4), LL(0xf83f936b3ff8f815), LL(0x86a444c2a4868697), }; static const u64 C6[256] = { LL(0x281878c0d8781818), LL(0x6523af0526af2323), LL(0x57c6f97eb8f9c6c6), LL(0x25e86f13fb6fe8e8), LL(0x9487a14ccba18787), LL(0xd5b862a91162b8b8), LL(0x0301050809050101), LL(0xd14f6e420d6e4f4f), LL(0x5a36eead9bee3636), LL(0xf7a60459ff04a6a6), LL(0x6bd2bdde0cbdd2d2), LL(0x02f506fb0e06f5f5), LL(0x8b7980ef96807979), LL(0xb16fce5f30ce6f6f), LL(0xae91effc6def9191), LL(0xf65207aaf8075252), LL(0xa060fd2747fd6060), LL(0xd9bc76893576bcbc), LL(0xb09bcdac37cd9b9b), LL(0x8f8e8c048a8c8e8e), LL(0xf8a31571d215a3a3), LL(0x140c3c606c3c0c0c), LL(0x8d7b8aff848a7b7b), LL(0x5f35e1b580e13535), LL(0x271d69e8f5691d1d), LL(0x3de04753b347e0e0), LL(0x64d7acf621acd7d7), LL(0x5bc2ed5e9cedc2c2), LL(0x722e966d43962e2e), LL(0xdd4b7a62297a4b4b), LL(0x1ffe21a35d21fefe), LL(0xf9571682d5165757), LL(0x3f1541a8bd411515), LL(0x9977b69fe8b67777), LL(0x5937eba592eb3737), LL(0x32e5567b9e56e5e5), LL(0xbc9fd98c13d99f9f), LL(0x0df017d32317f0f0), LL(0xde4a7f6a207f4a4a), LL(0x73da959e4495dada), LL(0xe85825faa2255858), LL(0x46c9ca06cfcac9c9), LL(0x7b298d557c8d2929), LL(0x1e0a22505a220a0a), LL(0xceb14fe1504fb1b1), LL(0xfda01a69c91aa0a0), LL(0xbd6bda7f14da6b6b), LL(0x9285ab5cd9ab8585), LL(0xdabd73813c73bdbd), LL(0xe75d34d28f345d5d), LL(0x3010508090501010), LL(0x01f403f30703f4f4), LL(0x40cbc016ddc0cbcb), LL(0x423ec6edd3c63e3e), LL(0x0f0511282d110505), LL(0xa967e61f78e66767), LL(0x31e453739753e4e4), LL(0x6927bb2502bb2727), LL(0xc341583273584141), LL(0x808b9d2ca79d8b8b), LL(0xf4a70151f601a7a7), LL(0x877d94cfb2947d7d), LL(0xa295fbdc49fb9595), LL(0x75d89f8e569fd8d8), LL(0x10fb308b7030fbfb), LL(0x2fee7123cd71eeee), LL(0x847c91c7bb917c7c), LL(0xaa66e31771e36666), LL(0x7add8ea67b8edddd), LL(0x39174bb8af4b1717), LL(0xc947460245464747), LL(0xbf9edc841adc9e9e), LL(0x43cac51ed4c5caca), LL(0x772d997558992d2d), LL(0xdcbf79912e79bfbf), LL(0x09071b383f1b0707), LL(0xeaad2301ac23adad), LL(0xee5a2feab02f5a5a), LL(0x9883b56cefb58383), LL(0x5533ff85b6ff3333), LL(0xa563f23f5cf26363), LL(0x06020a10120a0202), LL(0xe3aa38399338aaaa), LL(0x9371a8afdea87171), LL(0x45c8cf0ec6cfc8c8), LL(0x2b197dc8d17d1919), LL(0xdb4970723b704949), LL(0x76d99a865f9ad9d9), LL(0x0bf21dc3311df2f2), LL(0x38e3484ba848e3e3), LL(0xed5b2ae2b92a5b5b), LL(0x85889234bc928888), LL(0xb39ac8a43ec89a9a), LL(0x6a26be2d0bbe2626), LL(0x5632fa8dbffa3232), LL(0xcdb04ae9594ab0b0), LL(0x26e96a1bf26ae9e9), LL(0x110f337877330f0f), LL(0x62d5a6e633a6d5d5), LL(0x9d80ba74f4ba8080), LL(0xdfbe7c99277cbebe), LL(0x4acdde26ebdecdcd), LL(0x5c34e4bd89e43434), LL(0xd848757a32754848), LL(0x1cff24ab5424ffff), LL(0x8e7a8ff78d8f7a7a), LL(0xad90eaf464ea9090), LL(0xe15f3ec29d3e5f5f), LL(0x6020a01d3da02020), LL(0xb868d5670fd56868), LL(0x2e1a72d0ca721a1a), LL(0xefae2c19b72caeae), LL(0xc1b45ec97d5eb4b4), LL(0xfc54199ace195454), LL(0xa893e5ec7fe59393), LL(0x6622aa0d2faa2222), LL(0xac64e90763e96464), LL(0x0ef112db2a12f1f1), LL(0x9573a2bfcca27373), LL(0x36125a90825a1212), LL(0xc0405d3a7a5d4040), LL(0x1808284048280808), LL(0x58c3e85695e8c3c3), LL(0x29ec7b33df7becec), LL(0x70db90964d90dbdb), LL(0xfea11f61c01fa1a1), LL(0x8a8d831c91838d8d), LL(0x473dc9f5c8c93d3d), LL(0xa497f1cc5bf19797), LL(0x0000000000000000), LL(0x4ccfd436f9d4cfcf), LL(0x7d2b87456e872b2b), LL(0x9a76b397e1b37676), LL(0x9b82b064e6b08282), LL(0x67d6a9fe28a9d6d6), LL(0x2d1b77d8c3771b1b), LL(0xc2b55bc1745bb5b5), LL(0xecaf2911be29afaf), LL(0xbe6adf771ddf6a6a), LL(0xf0500dbaea0d5050), LL(0xcf454c12574c4545), LL(0x08f318cb3818f3f3), LL(0x5030f09dadf03030), LL(0x2cef742bc474efef), LL(0x413fc3e5dac33f3f), LL(0xff551c92c71c5555), LL(0xfba21079db10a2a2), LL(0x23ea6503e965eaea), LL(0xaf65ec0f6aec6565), LL(0xd3ba68b90368baba), LL(0x712f93654a932f2f), LL(0x5dc0e74e8ee7c0c0), LL(0x7fde81be6081dede), LL(0x241c6ce0fc6c1c1c), LL(0x1afd2ebb462efdfd), LL(0xd74d64521f644d4d), LL(0xab92e0e476e09292), LL(0x9f75bc8ffabc7575), LL(0x0a061e30361e0606), LL(0x838a9824ae988a8a), LL(0xcbb240f94b40b2b2), LL(0x37e659638559e6e6), LL(0x120e36707e360e0e), LL(0x211f63f8e7631f1f), LL(0xa662f73755f76262), LL(0x61d4a3ee3aa3d4d4), LL(0xe5a832298132a8a8), LL(0xa796f4c452f49696), LL(0x16f93a9b623af9f9), LL(0x52c5f666a3f6c5c5), LL(0x6f25b13510b12525), LL(0xeb5920f2ab205959), LL(0x9184ae54d0ae8484), LL(0x9672a7b7c5a77272), LL(0x4b39ddd5ecdd3939), LL(0xd44c615a16614c4c), LL(0xe25e3bca943b5e5e), LL(0x887885e79f857878), LL(0x4838d8dde5d83838), LL(0x898c861498868c8c), LL(0x6ed1b2c617b2d1d1), LL(0xf2a50b41e40ba5a5), LL(0x3be24d43a14de2e2), LL(0xa361f82f4ef86161), LL(0xc8b345f14245b3b3), LL(0x6321a51534a52121), LL(0xb99cd69408d69c9c), LL(0x221e66f0ee661e1e), LL(0xc543522261524343), LL(0x54c7fc76b1fcc7c7), LL(0x19fc2bb34f2bfcfc), LL(0x0c04142024140404), LL(0xf35108b2e3085151), LL(0xb699c7bc25c79999), LL(0xb76dc44f22c46d6d), LL(0x170d396865390d0d), LL(0x13fa35837935fafa), LL(0x7cdf84b66984dfdf), LL(0x827e9bd7a99b7e7e), LL(0x6c24b43d19b42424), LL(0x4d3bd7c5fed73b3b), LL(0xe0ab3d319a3dabab), LL(0x4fced13ef0d1cece), LL(0x3311558899551111), LL(0x8c8f890c83898f8f), LL(0xd24e6b4a046b4e4e), LL(0xc4b751d16651b7b7), LL(0x20eb600be060ebeb), LL(0x443cccfdc1cc3c3c), LL(0x9e81bf7cfdbf8181), LL(0xa194fed440fe9494), LL(0x04f70ceb1c0cf7f7), LL(0xd6b967a11867b9b9), LL(0x35135f988b5f1313), LL(0x742c9c7d519c2c2c), LL(0x68d3b8d605b8d3d3), LL(0x34e75c6b8c5ce7e7), LL(0xb26ecb5739cb6e6e), LL(0x51c4f36eaaf3c4c4), LL(0x05030f181b0f0303), LL(0xfa56138adc135656), LL(0xcc44491a5e494444), LL(0x817f9edfa09e7f7f), LL(0xe6a937218837a9a9), LL(0x7e2a824d67822a2a), LL(0xd0bb6db10a6dbbbb), LL(0x5ec1e24687e2c1c1), LL(0xf55302a2f1025353), LL(0x79dc8bae728bdcdc), LL(0x1d0b275853270b0b), LL(0xba9dd39c01d39d9d), LL(0xb46cc1472bc16c6c), LL(0x5331f595a4f53131), LL(0x9c74b987f3b97474), LL(0x07f609e31509f6f6), LL(0xca46430a4c434646), LL(0xe9ac2609a526acac), LL(0x8689973cb5978989), LL(0x3c1444a0b4441414), LL(0x3ee1425bba42e1e1), LL(0x3a164eb0a64e1616), LL(0x4e3ad2cdf7d23a3a), LL(0xbb69d06f06d06969), LL(0x1b092d48412d0909), LL(0x9070ada7d7ad7070), LL(0xc7b654d96f54b6b6), LL(0x6dd0b7ce1eb7d0d0), LL(0x2aed7e3bd67eeded), LL(0x49ccdb2ee2dbcccc), LL(0xc642572a68574242), LL(0xb598c2b42cc29898), LL(0xf1a40e49ed0ea4a4), LL(0x7828885d75882828), LL(0xe45c31da86315c5c), LL(0x15f83f936b3ff8f8), LL(0x9786a444c2a48686), }; static const u64 C7[256] = { LL(0x18281878c0d87818), LL(0x236523af0526af23), LL(0xc657c6f97eb8f9c6), LL(0xe825e86f13fb6fe8), LL(0x879487a14ccba187), LL(0xb8d5b862a91162b8), LL(0x0103010508090501), LL(0x4fd14f6e420d6e4f), LL(0x365a36eead9bee36), LL(0xa6f7a60459ff04a6), LL(0xd26bd2bdde0cbdd2), LL(0xf502f506fb0e06f5), LL(0x798b7980ef968079), LL(0x6fb16fce5f30ce6f), LL(0x91ae91effc6def91), LL(0x52f65207aaf80752), LL(0x60a060fd2747fd60), LL(0xbcd9bc76893576bc), LL(0x9bb09bcdac37cd9b), LL(0x8e8f8e8c048a8c8e), LL(0xa3f8a31571d215a3), LL(0x0c140c3c606c3c0c), LL(0x7b8d7b8aff848a7b), LL(0x355f35e1b580e135), LL(0x1d271d69e8f5691d), LL(0xe03de04753b347e0), LL(0xd764d7acf621acd7), LL(0xc25bc2ed5e9cedc2), LL(0x2e722e966d43962e), LL(0x4bdd4b7a62297a4b), LL(0xfe1ffe21a35d21fe), LL(0x57f9571682d51657), LL(0x153f1541a8bd4115), LL(0x779977b69fe8b677), LL(0x375937eba592eb37), LL(0xe532e5567b9e56e5), LL(0x9fbc9fd98c13d99f), LL(0xf00df017d32317f0), LL(0x4ade4a7f6a207f4a), LL(0xda73da959e4495da), LL(0x58e85825faa22558), LL(0xc946c9ca06cfcac9), LL(0x297b298d557c8d29), LL(0x0a1e0a22505a220a), LL(0xb1ceb14fe1504fb1), LL(0xa0fda01a69c91aa0), LL(0x6bbd6bda7f14da6b), LL(0x859285ab5cd9ab85), LL(0xbddabd73813c73bd), LL(0x5de75d34d28f345d), LL(0x1030105080905010), LL(0xf401f403f30703f4), LL(0xcb40cbc016ddc0cb), LL(0x3e423ec6edd3c63e), LL(0x050f0511282d1105), LL(0x67a967e61f78e667), LL(0xe431e453739753e4), LL(0x276927bb2502bb27), LL(0x41c3415832735841), LL(0x8b808b9d2ca79d8b), LL(0xa7f4a70151f601a7), LL(0x7d877d94cfb2947d), LL(0x95a295fbdc49fb95), LL(0xd875d89f8e569fd8), LL(0xfb10fb308b7030fb), LL(0xee2fee7123cd71ee), LL(0x7c847c91c7bb917c), LL(0x66aa66e31771e366), LL(0xdd7add8ea67b8edd), LL(0x1739174bb8af4b17), LL(0x47c9474602454647), LL(0x9ebf9edc841adc9e), LL(0xca43cac51ed4c5ca), LL(0x2d772d997558992d), LL(0xbfdcbf79912e79bf), LL(0x0709071b383f1b07), LL(0xadeaad2301ac23ad), LL(0x5aee5a2feab02f5a), LL(0x839883b56cefb583), LL(0x335533ff85b6ff33), LL(0x63a563f23f5cf263), LL(0x0206020a10120a02), LL(0xaae3aa38399338aa), LL(0x719371a8afdea871), LL(0xc845c8cf0ec6cfc8), LL(0x192b197dc8d17d19), LL(0x49db4970723b7049), LL(0xd976d99a865f9ad9), LL(0xf20bf21dc3311df2), LL(0xe338e3484ba848e3), LL(0x5bed5b2ae2b92a5b), LL(0x8885889234bc9288), LL(0x9ab39ac8a43ec89a), LL(0x266a26be2d0bbe26), LL(0x325632fa8dbffa32), LL(0xb0cdb04ae9594ab0), LL(0xe926e96a1bf26ae9), LL(0x0f110f337877330f), LL(0xd562d5a6e633a6d5), LL(0x809d80ba74f4ba80), LL(0xbedfbe7c99277cbe), LL(0xcd4acdde26ebdecd), LL(0x345c34e4bd89e434), LL(0x48d848757a327548), LL(0xff1cff24ab5424ff), LL(0x7a8e7a8ff78d8f7a), LL(0x90ad90eaf464ea90), LL(0x5fe15f3ec29d3e5f), LL(0x206020a01d3da020), LL(0x68b868d5670fd568), LL(0x1a2e1a72d0ca721a), LL(0xaeefae2c19b72cae), LL(0xb4c1b45ec97d5eb4), LL(0x54fc54199ace1954), LL(0x93a893e5ec7fe593), LL(0x226622aa0d2faa22), LL(0x64ac64e90763e964), LL(0xf10ef112db2a12f1), LL(0x739573a2bfcca273), LL(0x1236125a90825a12), LL(0x40c0405d3a7a5d40), LL(0x0818082840482808), LL(0xc358c3e85695e8c3), LL(0xec29ec7b33df7bec), LL(0xdb70db90964d90db), LL(0xa1fea11f61c01fa1), LL(0x8d8a8d831c91838d), LL(0x3d473dc9f5c8c93d), LL(0x97a497f1cc5bf197), LL(0x0000000000000000), LL(0xcf4ccfd436f9d4cf), LL(0x2b7d2b87456e872b), LL(0x769a76b397e1b376), LL(0x829b82b064e6b082), LL(0xd667d6a9fe28a9d6), LL(0x1b2d1b77d8c3771b), LL(0xb5c2b55bc1745bb5), LL(0xafecaf2911be29af), LL(0x6abe6adf771ddf6a), LL(0x50f0500dbaea0d50), LL(0x45cf454c12574c45), LL(0xf308f318cb3818f3), LL(0x305030f09dadf030), LL(0xef2cef742bc474ef), LL(0x3f413fc3e5dac33f), LL(0x55ff551c92c71c55), LL(0xa2fba21079db10a2), LL(0xea23ea6503e965ea), LL(0x65af65ec0f6aec65), LL(0xbad3ba68b90368ba), LL(0x2f712f93654a932f), LL(0xc05dc0e74e8ee7c0), LL(0xde7fde81be6081de), LL(0x1c241c6ce0fc6c1c), LL(0xfd1afd2ebb462efd), LL(0x4dd74d64521f644d), LL(0x92ab92e0e476e092), LL(0x759f75bc8ffabc75), LL(0x060a061e30361e06), LL(0x8a838a9824ae988a), LL(0xb2cbb240f94b40b2), LL(0xe637e659638559e6), LL(0x0e120e36707e360e), LL(0x1f211f63f8e7631f), LL(0x62a662f73755f762), LL(0xd461d4a3ee3aa3d4), LL(0xa8e5a832298132a8), LL(0x96a796f4c452f496), LL(0xf916f93a9b623af9), LL(0xc552c5f666a3f6c5), LL(0x256f25b13510b125), LL(0x59eb5920f2ab2059), LL(0x849184ae54d0ae84), LL(0x729672a7b7c5a772), LL(0x394b39ddd5ecdd39), LL(0x4cd44c615a16614c), LL(0x5ee25e3bca943b5e), LL(0x78887885e79f8578), LL(0x384838d8dde5d838), LL(0x8c898c861498868c), LL(0xd16ed1b2c617b2d1), LL(0xa5f2a50b41e40ba5), LL(0xe23be24d43a14de2), LL(0x61a361f82f4ef861), LL(0xb3c8b345f14245b3), LL(0x216321a51534a521), LL(0x9cb99cd69408d69c), LL(0x1e221e66f0ee661e), LL(0x43c5435222615243), LL(0xc754c7fc76b1fcc7), LL(0xfc19fc2bb34f2bfc), LL(0x040c041420241404), LL(0x51f35108b2e30851), LL(0x99b699c7bc25c799), LL(0x6db76dc44f22c46d), LL(0x0d170d396865390d), LL(0xfa13fa35837935fa), LL(0xdf7cdf84b66984df), LL(0x7e827e9bd7a99b7e), LL(0x246c24b43d19b424), LL(0x3b4d3bd7c5fed73b), LL(0xabe0ab3d319a3dab), LL(0xce4fced13ef0d1ce), LL(0x1133115588995511), LL(0x8f8c8f890c83898f), LL(0x4ed24e6b4a046b4e), LL(0xb7c4b751d16651b7), LL(0xeb20eb600be060eb), LL(0x3c443cccfdc1cc3c), LL(0x819e81bf7cfdbf81), LL(0x94a194fed440fe94), LL(0xf704f70ceb1c0cf7), LL(0xb9d6b967a11867b9), LL(0x1335135f988b5f13), LL(0x2c742c9c7d519c2c), LL(0xd368d3b8d605b8d3), LL(0xe734e75c6b8c5ce7), LL(0x6eb26ecb5739cb6e), LL(0xc451c4f36eaaf3c4), LL(0x0305030f181b0f03), LL(0x56fa56138adc1356), LL(0x44cc44491a5e4944), LL(0x7f817f9edfa09e7f), LL(0xa9e6a937218837a9), LL(0x2a7e2a824d67822a), LL(0xbbd0bb6db10a6dbb), LL(0xc15ec1e24687e2c1), LL(0x53f55302a2f10253), LL(0xdc79dc8bae728bdc), LL(0x0b1d0b275853270b), LL(0x9dba9dd39c01d39d), LL(0x6cb46cc1472bc16c), LL(0x315331f595a4f531), LL(0x749c74b987f3b974), LL(0xf607f609e31509f6), LL(0x46ca46430a4c4346), LL(0xace9ac2609a526ac), LL(0x898689973cb59789), LL(0x143c1444a0b44414), LL(0xe13ee1425bba42e1), LL(0x163a164eb0a64e16), LL(0x3a4e3ad2cdf7d23a), LL(0x69bb69d06f06d069), LL(0x091b092d48412d09), LL(0x709070ada7d7ad70), LL(0xb6c7b654d96f54b6), LL(0xd06dd0b7ce1eb7d0), LL(0xed2aed7e3bd67eed), LL(0xcc49ccdb2ee2dbcc), LL(0x42c642572a685742), LL(0x98b598c2b42cc298), LL(0xa4f1a40e49ed0ea4), LL(0x287828885d758828), LL(0x5ce45c31da86315c), LL(0xf815f83f936b3ff8), LL(0x869786a444c2a486), }; #endif /* OBSOLETE */ static const u64 rc[R + 1] = { LL(0x0000000000000000), LL(0x1823c6e887b8014f), LL(0x36a6d2f5796f9152), LL(0x60bc9b8ea30c7b35), LL(0x1de0d7c22e4bfe57), LL(0x157737e59ff04ada), LL(0x58c9290ab1a06b85), LL(0xbd5d10f4cb3e0567), LL(0xe427418ba77d95d8), LL(0xfbee7c66dd17479e), LL(0xca2dbf07ad5a8333), }; /** * The core Whirlpool transform. */ static void processBuffer(struct NESSIEstruct * const structpointer) { int i, r; u64 K[8]; /* the round key */ u64 block[8]; /* mu(buffer) */ u64 state[8]; /* the cipher state */ u64 L[8]; u8 *buffer = structpointer->buffer; #ifdef TRACE_INTERMEDIATE_VALUES printf("The 8x8 matrix Z' derived from the data-string is as follows.\n"); for (i = 0; i < WBLOCKBYTES/8; i++) { printf(" %02X %02X %02X %02X %02X %02X %02X %02X\n", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7]); buffer += 8; } printf("\n"); buffer = structpointer->buffer; #endif /* ?TRACE_INTERMEDIATE_VALUES */ /* * map the buffer to a block: */ for (i = 0; i < 8; i++, buffer += 8) { block[i] = (((u64)buffer[0] ) << 56) ^ (((u64)buffer[1] & 0xffL) << 48) ^ (((u64)buffer[2] & 0xffL) << 40) ^ (((u64)buffer[3] & 0xffL) << 32) ^ (((u64)buffer[4] & 0xffL) << 24) ^ (((u64)buffer[5] & 0xffL) << 16) ^ (((u64)buffer[6] & 0xffL) << 8) ^ (((u64)buffer[7] & 0xffL) ); } /* * compute and apply K^0 to the cipher state: */ state[0] = block[0] ^ (K[0] = structpointer->hash[0]); state[1] = block[1] ^ (K[1] = structpointer->hash[1]); state[2] = block[2] ^ (K[2] = structpointer->hash[2]); state[3] = block[3] ^ (K[3] = structpointer->hash[3]); state[4] = block[4] ^ (K[4] = structpointer->hash[4]); state[5] = block[5] ^ (K[5] = structpointer->hash[5]); state[6] = block[6] ^ (K[6] = structpointer->hash[6]); state[7] = block[7] ^ (K[7] = structpointer->hash[7]); #ifdef TRACE_INTERMEDIATE_VALUES printf("The K_0 matrix (from the initialization value IV) and X'' matrix are as follows.\n"); for (i = 0; i < DIGESTBYTES/8; i++) { printf( " %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", (u8)(K[i] >> 56), (u8)(K[i] >> 48), (u8)(K[i] >> 40), (u8)(K[i] >> 32), (u8)(K[i] >> 24), (u8)(K[i] >> 16), (u8)(K[i] >> 8), (u8)(K[i] ), (u8)(state[i] >> 56), (u8)(state[i] >> 48), (u8)(state[i] >> 40), (u8)(state[i] >> 32), (u8)(state[i] >> 24), (u8)(state[i] >> 16), (u8)(state[i] >> 8), (u8)(state[i] )); } printf("\n"); printf("The following are (hexadecimal representations of) the successive values of the variables K_i for i = 1 to 10 and W'.\n"); printf("\n"); #endif /* ?TRACE_INTERMEDIATE_VALUES */ /* * iterate over all rounds: */ for (r = 1; r <= R; r++) { /* * compute K^r from K^{r-1}: */ L[0] = C0[(int)(K[0] >> 56) ] ^ C1[(int)(K[7] >> 48) & 0xff] ^ C2[(int)(K[6] >> 40) & 0xff] ^ C3[(int)(K[5] >> 32) & 0xff] ^ C4[(int)(K[4] >> 24) & 0xff] ^ C5[(int)(K[3] >> 16) & 0xff] ^ C6[(int)(K[2] >> 8) & 0xff] ^ C7[(int)(K[1] ) & 0xff] ^ rc[r]; L[1] = C0[(int)(K[1] >> 56) ] ^ C1[(int)(K[0] >> 48) & 0xff] ^ C2[(int)(K[7] >> 40) & 0xff] ^ C3[(int)(K[6] >> 32) & 0xff] ^ C4[(int)(K[5] >> 24) & 0xff] ^ C5[(int)(K[4] >> 16) & 0xff] ^ C6[(int)(K[3] >> 8) & 0xff] ^ C7[(int)(K[2] ) & 0xff]; L[2] = C0[(int)(K[2] >> 56) ] ^ C1[(int)(K[1] >> 48) & 0xff] ^ C2[(int)(K[0] >> 40) & 0xff] ^ C3[(int)(K[7] >> 32) & 0xff] ^ C4[(int)(K[6] >> 24) & 0xff] ^ C5[(int)(K[5] >> 16) & 0xff] ^ C6[(int)(K[4] >> 8) & 0xff] ^ C7[(int)(K[3] ) & 0xff]; L[3] = C0[(int)(K[3] >> 56) ] ^ C1[(int)(K[2] >> 48) & 0xff] ^ C2[(int)(K[1] >> 40) & 0xff] ^ C3[(int)(K[0] >> 32) & 0xff] ^ C4[(int)(K[7] >> 24) & 0xff] ^ C5[(int)(K[6] >> 16) & 0xff] ^ C6[(int)(K[5] >> 8) & 0xff] ^ C7[(int)(K[4] ) & 0xff]; L[4] = C0[(int)(K[4] >> 56) ] ^ C1[(int)(K[3] >> 48) & 0xff] ^ C2[(int)(K[2] >> 40) & 0xff] ^ C3[(int)(K[1] >> 32) & 0xff] ^ C4[(int)(K[0] >> 24) & 0xff] ^ C5[(int)(K[7] >> 16) & 0xff] ^ C6[(int)(K[6] >> 8) & 0xff] ^ C7[(int)(K[5] ) & 0xff]; L[5] = C0[(int)(K[5] >> 56) ] ^ C1[(int)(K[4] >> 48) & 0xff] ^ C2[(int)(K[3] >> 40) & 0xff] ^ C3[(int)(K[2] >> 32) & 0xff] ^ C4[(int)(K[1] >> 24) & 0xff] ^ C5[(int)(K[0] >> 16) & 0xff] ^ C6[(int)(K[7] >> 8) & 0xff] ^ C7[(int)(K[6] ) & 0xff]; L[6] = C0[(int)(K[6] >> 56) ] ^ C1[(int)(K[5] >> 48) & 0xff] ^ C2[(int)(K[4] >> 40) & 0xff] ^ C3[(int)(K[3] >> 32) & 0xff] ^ C4[(int)(K[2] >> 24) & 0xff] ^ C5[(int)(K[1] >> 16) & 0xff] ^ C6[(int)(K[0] >> 8) & 0xff] ^ C7[(int)(K[7] ) & 0xff]; L[7] = C0[(int)(K[7] >> 56) ] ^ C1[(int)(K[6] >> 48) & 0xff] ^ C2[(int)(K[5] >> 40) & 0xff] ^ C3[(int)(K[4] >> 32) & 0xff] ^ C4[(int)(K[3] >> 24) & 0xff] ^ C5[(int)(K[2] >> 16) & 0xff] ^ C6[(int)(K[1] >> 8) & 0xff] ^ C7[(int)(K[0] ) & 0xff]; K[0] = L[0]; K[1] = L[1]; K[2] = L[2]; K[3] = L[3]; K[4] = L[4]; K[5] = L[5]; K[6] = L[6]; K[7] = L[7]; /* * apply the r-th round transformation: */ L[0] = C0[(int)(state[0] >> 56) ] ^ C1[(int)(state[7] >> 48) & 0xff] ^ C2[(int)(state[6] >> 40) & 0xff] ^ C3[(int)(state[5] >> 32) & 0xff] ^ C4[(int)(state[4] >> 24) & 0xff] ^ C5[(int)(state[3] >> 16) & 0xff] ^ C6[(int)(state[2] >> 8) & 0xff] ^ C7[(int)(state[1] ) & 0xff] ^ K[0]; L[1] = C0[(int)(state[1] >> 56) ] ^ C1[(int)(state[0] >> 48) & 0xff] ^ C2[(int)(state[7] >> 40) & 0xff] ^ C3[(int)(state[6] >> 32) & 0xff] ^ C4[(int)(state[5] >> 24) & 0xff] ^ C5[(int)(state[4] >> 16) & 0xff] ^ C6[(int)(state[3] >> 8) & 0xff] ^ C7[(int)(state[2] ) & 0xff] ^ K[1]; L[2] = C0[(int)(state[2] >> 56) ] ^ C1[(int)(state[1] >> 48) & 0xff] ^ C2[(int)(state[0] >> 40) & 0xff] ^ C3[(int)(state[7] >> 32) & 0xff] ^ C4[(int)(state[6] >> 24) & 0xff] ^ C5[(int)(state[5] >> 16) & 0xff] ^ C6[(int)(state[4] >> 8) & 0xff] ^ C7[(int)(state[3] ) & 0xff] ^ K[2]; L[3] = C0[(int)(state[3] >> 56) ] ^ C1[(int)(state[2] >> 48) & 0xff] ^ C2[(int)(state[1] >> 40) & 0xff] ^ C3[(int)(state[0] >> 32) & 0xff] ^ C4[(int)(state[7] >> 24) & 0xff] ^ C5[(int)(state[6] >> 16) & 0xff] ^ C6[(int)(state[5] >> 8) & 0xff] ^ C7[(int)(state[4] ) & 0xff] ^ K[3]; L[4] = C0[(int)(state[4] >> 56) ] ^ C1[(int)(state[3] >> 48) & 0xff] ^ C2[(int)(state[2] >> 40) & 0xff] ^ C3[(int)(state[1] >> 32) & 0xff] ^ C4[(int)(state[0] >> 24) & 0xff] ^ C5[(int)(state[7] >> 16) & 0xff] ^ C6[(int)(state[6] >> 8) & 0xff] ^ C7[(int)(state[5] ) & 0xff] ^ K[4]; L[5] = C0[(int)(state[5] >> 56) ] ^ C1[(int)(state[4] >> 48) & 0xff] ^ C2[(int)(state[3] >> 40) & 0xff] ^ C3[(int)(state[2] >> 32) & 0xff] ^ C4[(int)(state[1] >> 24) & 0xff] ^ C5[(int)(state[0] >> 16) & 0xff] ^ C6[(int)(state[7] >> 8) & 0xff] ^ C7[(int)(state[6] ) & 0xff] ^ K[5]; L[6] = C0[(int)(state[6] >> 56) ] ^ C1[(int)(state[5] >> 48) & 0xff] ^ C2[(int)(state[4] >> 40) & 0xff] ^ C3[(int)(state[3] >> 32) & 0xff] ^ C4[(int)(state[2] >> 24) & 0xff] ^ C5[(int)(state[1] >> 16) & 0xff] ^ C6[(int)(state[0] >> 8) & 0xff] ^ C7[(int)(state[7] ) & 0xff] ^ K[6]; L[7] = C0[(int)(state[7] >> 56) ] ^ C1[(int)(state[6] >> 48) & 0xff] ^ C2[(int)(state[5] >> 40) & 0xff] ^ C3[(int)(state[4] >> 32) & 0xff] ^ C4[(int)(state[3] >> 24) & 0xff] ^ C5[(int)(state[2] >> 16) & 0xff] ^ C6[(int)(state[1] >> 8) & 0xff] ^ C7[(int)(state[0] ) & 0xff] ^ K[7]; state[0] = L[0]; state[1] = L[1]; state[2] = L[2]; state[3] = L[3]; state[4] = L[4]; state[5] = L[5]; state[6] = L[6]; state[7] = L[7]; #ifdef TRACE_INTERMEDIATE_VALUES printf("i = %d:\n", r); for (i = 0; i < DIGESTBYTES/8; i++) { printf( " %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", (u8)(K[i] >> 56), (u8)(K[i] >> 48), (u8)(K[i] >> 40), (u8)(K[i] >> 32), (u8)(K[i] >> 24), (u8)(K[i] >> 16), (u8)(K[i] >> 8), (u8)(K[i] ), (u8)(state[i] >> 56), (u8)(state[i] >> 48), (u8)(state[i] >> 40), (u8)(state[i] >> 32), (u8)(state[i] >> 24), (u8)(state[i] >> 16), (u8)(state[i] >> 8), (u8)(state[i] )); } printf("\n"); #endif /* ?TRACE_INTERMEDIATE_VALUES */ } /* * apply the Miyaguchi-Preneel compression function: */ structpointer->hash[0] ^= state[0] ^ block[0]; structpointer->hash[1] ^= state[1] ^ block[1]; structpointer->hash[2] ^= state[2] ^ block[2]; structpointer->hash[3] ^= state[3] ^ block[3]; structpointer->hash[4] ^= state[4] ^ block[4]; structpointer->hash[5] ^= state[5] ^ block[5]; structpointer->hash[6] ^= state[6] ^ block[6]; structpointer->hash[7] ^= state[7] ^ block[7]; #ifdef TRACE_INTERMEDIATE_VALUES //printf("Intermediate hash value (after Miyaguchi-Preneel):\n"); printf("The value of Y' output from the round-function is as follows.\n"); for (i = 0; i < DIGESTBYTES/8; i++) { printf(" %02X %02X %02X %02X %02X %02X %02X %02X\n", (u8)(structpointer->hash[i] >> 56), (u8)(structpointer->hash[i] >> 48), (u8)(structpointer->hash[i] >> 40), (u8)(structpointer->hash[i] >> 32), (u8)(structpointer->hash[i] >> 24), (u8)(structpointer->hash[i] >> 16), (u8)(structpointer->hash[i] >> 8), (u8)(structpointer->hash[i] )); } printf("\n"); #endif /* ?TRACE_INTERMEDIATE_VALUES */ } /** * Initialize the hashing state. */ void NESSIEinit(struct NESSIEstruct * const structpointer) { int i; memset(structpointer->bitLength, 0, 32); structpointer->bufferBits = structpointer->bufferPos = 0; structpointer->buffer[0] = 0; /* it's only necessary to cleanup buffer[bufferPos] */ for (i = 0; i < 8; i++) { structpointer->hash[i] = 0L; /* initial value */ } #ifdef TRACE_INTERMEDIATE_VALUES /* printf("Initial hash value:\n"); for (i = 0; i < DIGESTBYTES/8; i++) { printf(" %02X %02X %02X %02X %02X %02X %02X %02X\n", (u8)(structpointer->hash[i] >> 56), (u8)(structpointer->hash[i] >> 48), (u8)(structpointer->hash[i] >> 40), (u8)(structpointer->hash[i] >> 32), (u8)(structpointer->hash[i] >> 24), (u8)(structpointer->hash[i] >> 16), (u8)(structpointer->hash[i] >> 8), (u8)(structpointer->hash[i] )); } printf("\n"); */ #endif /* ?TRACE_INTERMEDIATE_VALUES */ } /** * Delivers input data to the hashing algorithm. * * @param source plaintext data to hash. * @param sourceBits how many bits of plaintext to process. * * This method maintains the invariant: bufferBits < DIGESTBITS */ void NESSIEadd(const unsigned char * const source, unsigned long sourceBits, struct NESSIEstruct * const structpointer) { /* sourcePos | +-------+-------+------- ||||||||||||||||||||| source +-------+-------+------- +-------+-------+-------+-------+-------+------- |||||||||||||||||||||| buffer +-------+-------+-------+-------+-------+------- | bufferPos */ int sourcePos = 0; /* index of leftmost source u8 containing data (1 to 8 bits). */ int sourceGap = (8 - ((int)sourceBits & 7)) & 7; /* space on source[sourcePos]. */ int bufferRem = structpointer->bufferBits & 7; /* occupied bits on buffer[bufferPos]. */ int i; u32 b, carry; u8 *buffer = structpointer->buffer; u8 *bitLength = structpointer->bitLength; int bufferBits = structpointer->bufferBits; int bufferPos = structpointer->bufferPos; /* * tally the length of the added data: */ u64 value = sourceBits; for (i = 31, carry = 0; i >= 0 && (carry != 0 || value != LL(0)); i--) { carry += bitLength[i] + ((u32)value & 0xff); bitLength[i] = (u8)carry; carry >>= 8; value >>= 8; } /* * process data in chunks of 8 bits (a more efficient approach would be to take whole-word chunks): */ while (sourceBits > 8) { /* N.B. at least source[sourcePos] and source[sourcePos+1] contain data. */ /* * take a byte from the source: */ b = ((source[sourcePos] << sourceGap) & 0xff) | ((source[sourcePos + 1] & 0xff) >> (8 - sourceGap)); /* * process this byte: */ buffer[bufferPos++] |= (u8)(b >> bufferRem); bufferBits += 8 - bufferRem; /* bufferBits = 8*bufferPos; */ if (bufferBits == DIGESTBITS) { /* * process data block: */ processBuffer(structpointer); /* * reset buffer: */ bufferBits = bufferPos = 0; } buffer[bufferPos] = b << (8 - bufferRem); bufferBits += bufferRem; /* * proceed to remaining data: */ sourceBits -= 8; sourcePos++; } /* now 0 <= sourceBits <= 8; * furthermore, all data (if any is left) is in source[sourcePos]. */ if (sourceBits > 0) { b = (source[sourcePos] << sourceGap) & 0xff; /* bits are left-justified on b. */ /* * process the remaining bits: */ buffer[bufferPos] |= b >> bufferRem; } else { b = 0; } if (bufferRem + sourceBits < 8) { /* * all remaining data fits on buffer[bufferPos], * and there still remains some space. */ bufferBits += sourceBits; } else { /* * buffer[bufferPos] is full: */ bufferPos++; bufferBits += 8 - bufferRem; /* bufferBits = 8*bufferPos; */ sourceBits -= 8 - bufferRem; /* now 0 <= sourceBits < 8; * furthermore, all data (if any is left) is in source[sourcePos]. */ if (bufferBits == DIGESTBITS) { /* * process data block: */ processBuffer(structpointer); /* * reset buffer: */ bufferBits = bufferPos = 0; } buffer[bufferPos] = b << (8 - bufferRem); bufferBits += (int)sourceBits; } structpointer->bufferBits = bufferBits; structpointer->bufferPos = bufferPos; } /** * Get the hash value from the hashing state. * * This method uses the invariant: bufferBits < DIGESTBITS */ void NESSIEfinalize(struct NESSIEstruct * const structpointer, unsigned char * const result) { int i; u8 *buffer = structpointer->buffer; u8 *bitLength = structpointer->bitLength; int bufferBits = structpointer->bufferBits; int bufferPos = structpointer->bufferPos; u8 *digest = result; /* * append a '1'-bit: */ buffer[bufferPos] |= 0x80U >> (bufferBits & 7); bufferPos++; /* all remaining bits on the current u8 are set to zero. */ /* * pad with zero bits to complete (N*WBLOCKBITS - LENGTHBITS) bits: */ if (bufferPos > WBLOCKBYTES - LENGTHBYTES) { if (bufferPos < WBLOCKBYTES) { memset(&buffer[bufferPos], 0, WBLOCKBYTES - bufferPos); } /* * process data block: */ processBuffer(structpointer); /* * reset buffer: */ bufferPos = 0; } if (bufferPos < WBLOCKBYTES - LENGTHBYTES) { memset(&buffer[bufferPos], 0, (WBLOCKBYTES - LENGTHBYTES) - bufferPos); } bufferPos = WBLOCKBYTES - LENGTHBYTES; /* * append bit length of hashed data: */ memcpy(&buffer[WBLOCKBYTES - LENGTHBYTES], bitLength, LENGTHBYTES); /* * process data block: */ processBuffer(structpointer); /* * return the completed message digest: */ for (i = 0; i < DIGESTBYTES/8; i++) { digest[0] = (u8)(structpointer->hash[i] >> 56); digest[1] = (u8)(structpointer->hash[i] >> 48); digest[2] = (u8)(structpointer->hash[i] >> 40); digest[3] = (u8)(structpointer->hash[i] >> 32); digest[4] = (u8)(structpointer->hash[i] >> 24); digest[5] = (u8)(structpointer->hash[i] >> 16); digest[6] = (u8)(structpointer->hash[i] >> 8); digest[7] = (u8)(structpointer->hash[i] ); digest += 8; } structpointer->bufferBits = bufferBits; structpointer->bufferPos = bufferPos; } md5deep-4.2/src/whirlpool.h000066400000000000000000000114561176640446200157020ustar00rootroot00000000000000 /* $Id: whirlpool.h 501 2011-09-25 17:12:27Z xchatty $ */ #ifndef __WHIRLPOOL_H #define __WHIRLPOOL_H #include "common.h" __BEGIN_DECLS /* ---------------------------------------------------------------------- Original headers from Whirlpool ---------------------------------------------------------------------- */ #ifndef PORTABLE_C__ #define PORTABLE_C__ #include /* Definition of minimum-width integer types * * u8 -> unsigned integer type, at least 8 bits, equivalent to unsigned char * u16 -> unsigned integer type, at least 16 bits * u32 -> unsigned integer type, at least 32 bits * * s8, s16, s32 -> signed counterparts of u8, u16, u32 * * Always use macro's T8(), T16() or T32() to obtain exact-width results, * i.e., to specify the size of the result of each expression. */ typedef signed char s8; typedef unsigned char u8; #if UINT_MAX >= 4294967295UL typedef signed short s16; typedef signed int s32; typedef unsigned short u16; typedef unsigned int u32; #define ONE32 0xffffffffU #else typedef signed int s16; typedef signed long s32; typedef unsigned int u16; typedef unsigned long u32; #define ONE32 0xffffffffUL #endif #define ONE8 0xffU #define ONE16 0xffffU #define T8(x) ((x) & ONE8) #define T16(x) ((x) & ONE16) #define T32(x) ((x) & ONE32) #ifdef _MSC_VER typedef unsigned __int64 u64; typedef signed __int64 s64; #define LL(v) (v##i64) #define ONE64 LL(0xffffffffffffffff) #else /* !_MSC_VER */ typedef unsigned long long u64; typedef signed long long s64; #define LL(v) (v##ULL) #define ONE64 LL(0xffffffffffffffff) #endif /* ?_MSC_VER */ #define T64(x) ((x) & ONE64) #define ROTR64(v, n) (((v) >> (n)) | T64((v) << (64 - (n)))) /* * Note: the test is used to detect native 64-bit architectures; * if the unsigned long is strictly greater than 32-bit, it is * assumed to be at least 64-bit. This will not work correctly * on (old) 36-bit architectures (PDP-11 for instance). * * On non-64-bit architectures, "long long" is used. */ /* * U8TO32_BIG(c) returns the 32-bit value stored in big-endian convention * in the unsigned char array pointed to by c. */ #define U8TO32_BIG(c) (((u32)T8(*(c)) << 24) | ((u32)T8(*((c) + 1)) << 16) | ((u32)T8(*((c) + 2)) << 8) | ((u32)T8(*((c) + 3)))) /* * U8TO32_LITTLE(c) returns the 32-bit value stored in little-endian convention * in the unsigned char array pointed to by c. */ #define U8TO32_LITTLE(c) (((u32)T8(*(c))) | ((u32)T8(*((c) + 1)) << 8) | (u32)T8(*((c) + 2)) << 16) | ((u32)T8(*((c) + 3)) << 24)) /* * U8TO32_BIG(c, v) stores the 32-bit-value v in big-endian convention * into the unsigned char array pointed to by c. */ #define U32TO8_BIG(c, v) do { u32 x = (v); u8 *d = (c); d[0] = T8(x >> 24); d[1] = T8(x >> 16); d[2] = T8(x >> 8); d[3] = T8(x); } while (0) /* * U8TO32_LITTLE(c, v) stores the 32-bit-value v in little-endian convention * into the unsigned char array pointed to by c. */ #define U32TO8_LITTLE(c, v) do { u32 x = (v); u8 *d = (c); d[0] = T8(x); d[1] = T8(x >> 8); d[2] = T8(x >> 16); d[3] = T8(x >> 24); } while (0) /* * ROTL32(v, n) returns the value of the 32-bit unsigned value v after * a rotation of n bits to the left. It might be replaced by the appropriate * architecture-specific macro. * * It evaluates v and n twice. * * The compiler might emit a warning if n is the constant 0. The result * is undefined if n is greater than 31. */ #define ROTL32(v, n) (T32((v) << (n)) | ((v) >> (32 - (n)))) /* * Whirlpool-specific definitions. */ #define DIGESTBYTES 64 #define DIGESTBITS (8*DIGESTBYTES) /* 512 */ #define WBLOCKBYTES 64 #define WBLOCKBITS (8*WBLOCKBYTES) /* 512 */ #define LENGTHBYTES 32 #define LENGTHBITS (8*LENGTHBYTES) /* 256 */ typedef struct NESSIEstruct { u8 bitLength[LENGTHBYTES]; /* global number of hashed bits (256-bit counter) */ u8 buffer[WBLOCKBYTES]; /* buffer of data to hash */ int bufferBits; /* current number of bits on the buffer */ int bufferPos; /* current (possibly incomplete) byte slot on the buffer */ u64 hash[DIGESTBYTES/8]; /* the hashing state */ } NESSIEstruct; void NESSIEinit(struct NESSIEstruct * const structpointer); /* WARNING: The "len" here is the number of BITS, not the number of BYTES. You must multiply the number of bytes by eight before calling this function! */ void NESSIEadd(const unsigned char * const source, unsigned long sourceBits, struct NESSIEstruct * const structpointer); void NESSIEfinalize(struct NESSIEstruct * const structpointer, unsigned char * const result); #define context_whirlpool_t NESSIEstruct void hash_init_whirlpool(void * ctx); void hash_update_whirlpool(void * ctx, const unsigned char *buf, size_t len); void hash_final_whirlpool(void * ctx, unsigned char *digest); #endif /* PORTABLE_C__ */ __END_DECLS #endif /* __WHIRLPOOL_H */ md5deep-4.2/src/winpe.cpp000066400000000000000000000052701176640446200153350ustar00rootroot00000000000000// MD5DEEP - winpe.cpp // // By Jesse Kornblum // // This is a work of the US Government. In accordance with 17 USC 105, // copyright protection is not available for any work of the US Government. // // 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. // // $Id: winpe.cpp 618 2012-02-10 12:12:38Z jessekornblum $ // #include "main.h" bool has_executable_extension(const tstring &fn) { size_t last_period = fn.find_last_of(_TEXT(".")); // If there is no extension, we're done. if (std::string::npos == last_period) return false; // Get the file extension and convert it to lowercase tstring extension = fn.substr(last_period); std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower); #define CHECK_EXEC(A) if (A == extension) return true; CHECK_EXEC(_TEXT(".exe")); CHECK_EXEC(_TEXT(".dll")); CHECK_EXEC(_TEXT(".com")); CHECK_EXEC(_TEXT(".sys")); CHECK_EXEC(_TEXT(".cpl")); CHECK_EXEC(_TEXT(".hxs")); CHECK_EXEC(_TEXT(".hxi")); CHECK_EXEC(_TEXT(".olb")); CHECK_EXEC(_TEXT(".rll")); CHECK_EXEC(_TEXT(".mui")); CHECK_EXEC(_TEXT(".tlb")); return false; } bool is_pe_file(const unsigned char * buffer, size_t size) { // We need at least 0x40 bytes to hold an IMAGE_DOS_HEADER // and the signature of a PE header. if (NULL == buffer or size < 0x40) return false; // Is the MZ header's signature 'MZ'? uint16_t mz_header = buffer[0] | (buffer[1] << 8); if (0x5a4d != mz_header) return false; // Find the PE header. It's the e_lfanew field in the IMAGE_DOS_HEADER // structure, which is at offset 0x3c. // This line is equivalent to: // uint16_t pe_offset = *(uint16_t *)(buffer + 0x3c); // but is not affected by the endianness of the system. // This value should be a uint16_t according to the IMAGE_DOS_HEADER // but that merits us a compiler warning. size_t *should* be wider than // 16 bits on your platform. Or else you need a better platform. Just sayin'. size_t pe_offset = buffer[0x3c] | (buffer[0x3d] << 8); // Do we have enough data to do this check? if (pe_offset + 4 > size) return false; // Is the PE header's signature 'PE '? The PE signature should begin // at the location specified by the PE offset in the DOS header // This line is equivalent to: // uint32_t signature = *(uint32_t *)(buffer + pe_offset); // but is not affected by the endianness of the system. const unsigned char * tmp = buffer+pe_offset; uint32_t signature=tmp[0] | (tmp[1] << 8) | (tmp[2] << 16) | (tmp[3] << 24); if (signature != 0x4550) return false; return true; } md5deep-4.2/src/winpe.h000066400000000000000000000015451176640446200150030ustar00rootroot00000000000000// MD5DEEP - winpe.h // // By Jesse Kornblum // // This is a work of the US Government. In accordance with 17 USC 105, // copyright protection is not available for any work of the US Government. // // 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. // // $Id: winpe.h 612 2012-02-08 15:01:56Z jessekornblum $ // #include "main.h" #define PETEST_BUFFER_SIZE 8192 /// Returns true if 'fn' ends with an extension which is normally executable on Microsoft Windows bool has_executable_extension(const tstring &fn); /// Returns true if the data in buffer is the start of a PE executable /// /// @param buffer The buffer to test /// @param size Size of the buffer in bytes bool is_pe_file(const unsigned char * buffer, size_t size); md5deep-4.2/src/xml.cpp000066400000000000000000000162101176640446200150070ustar00rootroot00000000000000/** * implementation for C++ XML generation class * * The software provided here is released by the Naval Postgraduate * School, an agency of the U.S. Department of Navy. The software * bears no warranty, either expressed or implied. NPS does not assume * legal liability nor responsibility for a User's use of the software * or the results of such use. * * Please note that within the United States, copyright protection, * under Section 105 of the United States Code, Title 17, is not * available for any work of the United States Government and/or for * any works created by United States Government employees. User * acknowledges that this software contains work which was created by * NPS government employees and is therefore in the public domain and * not subject to copyright. */ // $Id: xml.cpp 618 2012-02-10 12:12:38Z jessekornblum $ #include "common.h" // normally you remove this #include "xml.h" using namespace std; #include #include #include #include #include #include #include #include // Implementation of mkstemp for windows found on pan-devel mailing // list archive // @http://www.mail-archive.com/pan-devel@nongnu.org/msg00294.html #ifndef _S_IREAD #define _S_IREAD 256 #endif #ifndef _S_IWRITE #define _S_IWRITE 128 #endif #ifndef O_BINARY #define O_BINARY 0 #endif #ifndef _O_SHORT_LIVED #define _O_SHORT_LIVED 0 #endif #ifndef HAVE_MKSTEMP extern "C" int mkstemp(char *tmpl) { int ret=-1; mktemp(tmpl); ret=open(tmpl,O_RDWR|O_BINARY|O_CREAT|O_EXCL|_O_SHORT_LIVED, _S_IREAD|_S_IWRITE); return ret; } #endif static const char *cstr(const string &str){ return str.c_str(); } static string xml_lt("<"); static string xml_gt(">"); static string xml_am("&"); static string xml_ap("'"); static string xml_qu("""); string XML::xmlescape(const string &xml) { string ret; for(string::const_iterator i = xml.begin(); i!=xml.end(); i++){ switch(*i){ case '>': ret += xml_gt; break; case '<': ret += xml_lt; break; case '&': ret += xml_am; break; case '\'': ret += xml_ap; break; case '"': ret += xml_qu; break; case '\000': break; // remove nulls default: ret += *i; } } return ret; } /** * Strip an XML string as necessary for a tag name. */ string XML::xmlstrip(const string &xml) { string ret; for(string::const_iterator i = xml.begin(); i!=xml.end(); i++){ if(isprint(*i) && !strchr("<>\r\n&'\"",*i)){ ret += isspace(*i) ? '_' : tolower(*i); } } return ret; } /****************************************************************/ XML::XML() { out = 0; make_dtd = false; tempfile_template = "/tmp/xml_XXXXXXXX"; // a reasonable default gettimeofday(&t0,0); } XML::XML(FILE *out_) { out = out_; make_dtd = false; tempfile_template = "/tmp/xml_XXXXXXXX"; // a reasonable default gettimeofday(&t0,0); open(); } void XML::set_tempfile_template(std::string temp) { tempfile_template = temp; } void XML::set_outFILE(FILE *out_) { out = out_; } void XML::set_outfilename(string outfilename_) { outfilename = outfilename_; tempfile_template = outfilename_ + "_tmp_XXXXXXXX"; // a better default } void XML::set_makeDTD(bool flag) { make_dtd = flag; if(make_dtd){ // need to write to a temp file char buf[1024]; memset(buf,0,sizeof(buf)); strcpy(buf,tempfile_template.c_str()); int fd = mkstemp(buf); if(fd<0){ perror(buf); exit(1); } tempfilename = buf; out = fdopen(fd,"r+"); if(!out){ perror("fdopen"); exit(1); } } } static const char *xml_header = "\n"; void XML::open() { if(out==0) out = fopen(cstr(outfilename),"w"); fputs(xml_header,out); // write out the XML header } void XML::close() { if(make_dtd){ /* If we are making the DTD, then we have been writing to a temp file. * Open the real file, write the DTD, and copy over the tempfile. */ FILE *rf = fopen(cstr(outfilename),"w"); if(!rf){ perror(cstr(outfilename)); fprintf(stderr,"%s will not be deleted\n",tempfilename.c_str()); exit(1); } fseek(out,0L,SEEK_SET); char buf[65536]; if(fgets(buf,sizeof(buf),out)){ fputs(buf,rf); // copy over first line --- the XML header } write_dtd(rf); // write the DTD while(!feof(out)){ // copy the rest int r = fread(buf,1,sizeof(buf),out); if(r<=0) break; int r2 = fwrite(buf,1,r,rf); if(r2<0){ fprintf(stderr,"Cannot write to %s\n",cstr(outfilename)); fprintf(stderr,"%s will not be deleted\n",tempfilename.c_str()); exit(1); } } fclose(rf); rf = 0; unlink(tempfilename.c_str()); } fclose(out); out = 0; } void XML::write_dtd(FILE *f) { fprintf(f,"::const_iterator it = tags.begin(); it != tags.end(); it++){ const char *s = (*it).c_str(); fprintf(f,"\n",s); } fprintf(f,"\n"); fprintf(f,"\n"); fprintf(f,"\n"); fprintf(f,"]>\n"); } /** * make sure that a tag is valid and, if so, add it to the list of tags we use */ void XML::verify_tag(string tag) { if(tag[0]=='/') tag = tag.substr(1); if(tag.find(" ") != string::npos){ cerr << "tag '" << tag << "' contains space. Cannot continue.\n"; exit(1); } tags.insert(tag); } void XML::puts(const string &v) { fputs(v.c_str(),out); } void XML::spaces() { string sp; for(int i=tag_stack.size();i>0;i--){ sp.push_back(' '); sp.push_back(' '); } puts(sp); } void XML::writexml(const string &xml) { bool first = true; for(string::const_iterator it = xml.begin(); it!=xml.end(); it++){ if(first){ spaces(); first = false; } fputc(*it,out); if((*it)=='\n'){ first = true; } } } void XML::tagout(const string &tag,const string &attribute) { verify_tag(tag); fprintf(out,"<%s%s%s>",cstr(tag),attribute.size()>0 ? " " : "",cstr(attribute)); } void XML::xmlout(const string &tag,const string &value,const string &attribute,bool escape_value) { spaces(); tagout(tag,attribute); if(escape_value) fputs(cstr(xmlescape(value)),out); else fputs(cstr(value),out); tagout("/"+tag,""); fputc('\n',out); } void XML::xmlprintf(const std::string &tag,const std::string &attribute, const char *fmt,...) { spaces(); tagout(tag,attribute); va_list ap; va_start(ap, fmt); vfprintf(out,fmt,ap); va_end(ap); tagout("/"+tag,""); fputc('\n',out); } void XML::push(const string &tag,const string &attribute) { spaces(); tag_stack.push(tag); tagout(tag,attribute); fputc('\n',out); } void XML::pop() { assert(tag_stack.size()>0); string tag = tag_stack.top(); tag_stack.pop(); spaces(); tagout("/"+tag,""); fputc('\n',out); fflush(out); } void XML::printf(const char *format,...) { va_list ap; va_start(ap, format); vfprintf(out,format,ap); va_end(ap); } void XML::comment(const string &comment_) { fputs("\n",out); } md5deep-4.2/src/xml.h000066400000000000000000000146441176640446200144650ustar00rootroot00000000000000/* * Simson's XML output class. * Ideally include this AFTER your config file with the HAVE statements. * * Pubic Domain. */ #ifndef _XML_H_ #define _XML_H_ #ifndef __STDC_FORMAT_MACROS #define __STDC_FORMAT_MACROS #endif #include #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_CDEFS_H #include #endif #ifdef HAVE_SYS_RESOURCE_H #include #endif // pwd.h is password entry #ifdef HAVE_PWD_H #include #endif #ifdef HAVE_LIBAFFLIB #include #endif #ifdef HAVE_LIBEWF #include #endif #ifdef HAVE_SYS_UTSNAME_H #include #endif #ifdef HAVE_LIBAFFLIB #include #endif #ifdef HAVE_SYS_RUSAGE_H #include #endif #ifdef __cplusplus class XML { std::string outfilename; FILE *out; // where it is being written std::set tags; // XML tags void write_doctype(FILE *out); void write_dtd(FILE *out); bool make_dtd; std::string tempfilename; void verify_tag(std::string tag); std::stacktag_stack; void spaces(); // print spaces corresponding to tag stack std::string tempfile_template; struct timeval t0; public: void make_indent(){spaces();} static std::string make_command_line(int argc,char * const *argv){ std::string command_line; for(int i=0;i0) command_line.push_back(' '); command_line.append(argv[i]); } return command_line; } XML(); XML(FILE *out); void set_outFILE(FILE *out); // writes to this FILE without a DTD void set_outfilename(std::string outfilename); // writes to this outfile with a DTD (needs a temp file) void set_makeDTD(bool flag); // should we write the DTD? void set_tempfile_template(std::string temp); static std::string xmlescape(const std::string &xml); static std::string xmlstrip(const std::string &xml); void open(); // opens the output file void close(); // writes the output to the file void writexml(const std::string &xml); // writes formatted xml with indentation void tagout(const std::string &tag,const std::string &attribute); void xmlout(const std::string &tag,const std::string &value, const std::string &attribute,const bool escape_value); void xmlout(const std::string &tag,const std::string &value){ xmlout(tag,value,"",true); } void xmlout(const std::string &tag,const int value){ xmlprintf(tag,"","%d",value); } void xmloutl(const std::string &tag,const long value){ xmlprintf(tag,"","%ld",value); } void xmlout(const std::string &tag,const int64_t value){ xmlprintf(tag,"","%"PRId64,value); } void xmlout(const std::string &tag,const double value){ xmlprintf(tag,"","%f",value); } void xmlout(const std::string &tag,const struct timeval &ts){ xmlprintf(tag,"","%d.%06d",(int)ts.tv_sec, (int)ts.tv_usec); } void xmlprintf(const std::string &tag,const std::string &attribute, const char *fmt,...); void push(const std::string &tag,const std::string &attribute); void push(const std::string &tag) {push(tag,"");} void puts(const std::string &pdata); // writes a std::string as parsed data void printf(const char *fmt,...); // writes a std::string as parsed data void pop(); // close the tag void comment(const std::string &comment); /* These support Digital Forensics XML and require certain variables to be defined */ void add_DFXML_build_environment(){ /* __DATE__ formats as: Apr 30 2011 */ struct tm tm; memset(&tm,0,sizeof(tm)); push("build_environment"); #ifdef __GNUC__ xmlprintf("compiler","","GCC %d.%d",__GNUC__, __GNUC_MINOR__); #endif #if defined(__DATE__) && defined(__TIME__) && defined(HAVE_STRPTIME) if(strptime(__DATE__,"%b %d %Y",&tm)){ char buf[64]; snprintf(buf,sizeof(buf),"%4d-%02d-%02dT%s",tm.tm_year+1900,tm.tm_mon+1,tm.tm_mday,__TIME__); xmlout("compilation_date",buf); } #endif #ifdef HAVE_LIBTSK3 xmlout("library", "", std::string("name=\"tsk\" version=\"") + tsk_version_get_str() + "\"",false); #endif #ifdef HAVE_LIBAFFLIB xmlout("library", "", std::string("name=\"afflib\" version=\"") + af_version() +"\"",false); #endif #ifdef HAVE_LIBEWF xmlout("library", "", std::string("name=\"libewf\" version=\"") + libewf_get_version() + "\"",false); #endif pop(); } void add_DFXML_execution_environment(const std::string &command_line){ push("execution_environment"); #ifdef HAVE_SYS_UTSNAME_H struct utsname name; if(uname(&name)==0){ xmlout("os_sysname",name.sysname); xmlout("os_release",name.release); xmlout("os_version",name.version); xmlout("host",name.nodename); xmlout("arch",name.machine); } #else #ifdef UNAMES xmlout("os_sysname",UNAMES,"",false); #endif #ifdef HAVE_GETHOSTNAME { char hostname[1024]; if(gethostname(hostname,sizeof(hostname))==0){ xmlout("host",hostname); } } #endif #endif xmlout("command_line", command_line); // quote it! #ifdef HAVE_GETUID xmlprintf("uid","","%d",getuid()); #ifdef HAVE_GETPWUID xmlout("username",getpwuid(getuid())->pw_name); #endif #endif time_t t = time(0); char buf[32]; strftime(buf,sizeof(buf),"%FT%TZ",gmtime(&t)); xmlout("start_time",buf); pop(); // } void add_DFXML_creator(const std::string &program,const std::string &version,const std::string &command_line){ push("creator","version='1.0'"); xmlout("program",program); xmlout("version",version); add_DFXML_build_environment(); add_DFXML_execution_environment(command_line); pop(); // creator } void add_rusage(){ #ifdef HAVE_GETRUSAGE struct rusage ru; memset(&ru,0,sizeof(ru)); if(getrusage(RUSAGE_SELF,&ru)==0){ push("rusage"); xmlout("utime",ru.ru_utime); xmlout("stime",ru.ru_stime); xmloutl("maxrss",(long)ru.ru_maxrss); xmloutl("minflt",(long)ru.ru_minflt); xmloutl("majflt",(long)ru.ru_majflt); xmloutl("nswap",(long)ru.ru_nswap); xmloutl("inblock",(long)ru.ru_inblock); xmloutl("oublock",(long)ru.ru_oublock); { struct timeval t1; gettimeofday(&t1,0); struct timeval t; t.tv_sec = t1.tv_sec - t0.tv_sec; if(t1.tv_usec > t0.tv_usec){ t.tv_usec = t1.tv_usec - t0.tv_usec; } else { t.tv_sec--; t.tv_usec = (t1.tv_usec+1000000) - t0.tv_usec; } xmlout("clocktime",t); } pop(); } #endif } }; #endif #endif md5deep-4.2/tests/000077500000000000000000000000001176640446200140565ustar00rootroot00000000000000md5deep-4.2/tests/Makefile.am000066400000000000000000000005351176640446200161150ustar00rootroot00000000000000EXTRA_DIST=README.txt tests.sh TESTS=tests.sh CLEANFILES=foo cow moo bar known1 known2 \ hashlist-md5deep-full.txt hashlist-hashdeep-full.txt \ hashlist-md5deep-partial.txt hashlist-hashdeep-partial.txt executable: svn propset svn:executable on *.sh testclean: /bin/rm -rf /tmp/test/ /tmp/*.out /tmp/*.err *.out *.err $(CLEANFILES) tst ref md5deep-4.2/tests/Makefile.in000066400000000000000000000300471176640446200161270ustar00rootroot00000000000000# 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@ subdir = tests DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__tty_colors = \ red=; grn=; lgn=; blu=; std= DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ 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@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ 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@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = README.txt tests.sh TESTS = tests.sh CLEANFILES = foo cow moo bar known1 known2 \ hashlist-md5deep-full.txt hashlist-hashdeep-full.txt \ hashlist-md5deep-partial.txt hashlist-hashdeep-partial.txt 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 tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/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): tags: TAGS TAGS: ctags: CTAGS CTAGS: check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ $(am__tty_colors); \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ col=$$red; res=XPASS; \ ;; \ *) \ col=$$grn; res=PASS; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xfail=`expr $$xfail + 1`; \ col=$$lgn; res=XFAIL; \ ;; \ *) \ failed=`expr $$failed + 1`; \ col=$$red; res=FAIL; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ col=$$blu; res=SKIP; \ fi; \ echo "$${col}$$res$${std}: $$tst"; \ done; \ if test "$$all" -eq 1; then \ tests="test"; \ All=""; \ else \ tests="tests"; \ All="All "; \ fi; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="$$All$$all $$tests passed"; \ else \ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all $$tests failed"; \ else \ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ if test "$$skip" -eq 1; then \ skipped="($$skip test was not run)"; \ else \ skipped="($$skip tests were not run)"; \ fi; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ if test "$$failed" -eq 0; then \ echo "$$grn$$dashes"; \ else \ echo "$$red$$dashes"; \ fi; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes$$std"; \ test "$$failed" -eq 0; \ else :; fi 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 $(MAKE) $(AM_MAKEFLAGS) check-TESTS 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: -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." clean: clean-am clean-am: clean-generic 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 pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: all all-am check check-TESTS check-am clean clean-generic \ distclean distclean-generic 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 pdf pdf-am ps ps-am uninstall \ uninstall-am executable: svn propset svn:executable on *.sh testclean: /bin/rm -rf /tmp/test/ /tmp/*.out /tmp/*.err *.out *.err $(CLEANFILES) tst ref # 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: md5deep-4.2/tests/README.txt000066400000000000000000000002511176640446200155520ustar00rootroot00000000000000These tests are structured as named tests and the output generated by prevous versions of md5deep. \\.\PhysicalDriveX and \\.\C: mechanism on Win32 (i.e. processing a md5deep-4.2/tests/testfiles/000077500000000000000000000000001176640446200160605ustar00rootroot00000000000000md5deep-4.2/tests/testfiles/Makefile.am000066400000000000000000000014641176640446200201210ustar00rootroot00000000000000# # These test files and directories are used for testing the windows and # Unix versions. # The symlinktest contains a forrest of symlinks and only works on Unix. # The zip file contains all of the files (including the tar of the symlinktest). # Note that dot_file_⦿.txt has a Unicode character in its name. # FILES = 1072-at.txt \ 1072-plus.txt\ copying.txt \ deadbeef.txt \ unicode_circled_bullet_⦿.txt \ unicode_snowman_☃.txt \ foo.txt \ install.txt \ one-byte-file.txt\ zero-byte-file.txt\ dir_a/web2 \ dir_a/dir_b/web2a \ bsd-hashes.txt \ nsrlfile.txt EXTRA_DIST = symlinktest.tar.gz testfiles.zip symlinktest.tar.gz: tar -c -f symlinktest.tar.gz -v -z --exclude "*.svn" symlinktest testfiles.zip: $(FILES) zip testfiles.zip $(FILES) # You'll need to get the symlink files on your own md5deep-4.2/tests/testfiles/Makefile.in000066400000000000000000000233041176640446200201270ustar00rootroot00000000000000# 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@ # # These test files and directories are used for testing the windows and # Unix versions. # The symlinktest contains a forrest of symlinks and only works on Unix. # The zip file contains all of the files (including the tar of the symlinktest). # Note that dot_file_⦿.txt has a Unicode character in its name. # 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@ subdir = tests/testfiles DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ 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@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ 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@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ FILES = 1072-at.txt \ 1072-plus.txt\ copying.txt \ deadbeef.txt \ unicode_circled_bullet_⦿.txt \ unicode_snowman_☃.txt \ foo.txt \ install.txt \ one-byte-file.txt\ zero-byte-file.txt\ dir_a/web2 \ dir_a/dir_b/web2a \ bsd-hashes.txt \ nsrlfile.txt EXTRA_DIST = symlinktest.tar.gz testfiles.zip 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 tests/testfiles/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/testfiles/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): 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." clean: clean-am clean-am: clean-generic 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 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 distclean \ distclean-generic 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 pdf pdf-am ps ps-am uninstall uninstall-am symlinktest.tar.gz: tar -c -f symlinktest.tar.gz -v -z --exclude "*.svn" symlinktest testfiles.zip: $(FILES) zip testfiles.zip $(FILES) # You'll need to get the symlink files on your own # 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: md5deep-4.2/tests/testfiles/symlinktest.tar.gz000066400000000000000000000006651176640446200216040ustar00rootroot00000000000000N4NN0۫ 8zq#!0:޽]!fmF9OJB OO㰯t*[)Z֜ZԞF* FfB/5.YP\up/}v{ο#Mu%&A5 O… o>#(c2ۮ'-(md5deep-4.2/tests/testfiles/testfiles.zip000066400000000000000000041523271176640446200206240ustar00rootroot00000000000000PK1y=@_ؽ/0 1072-at.txtUT ~%O~%Oux H-JUHbSC#Ģb+.Q0rH,Q(L Q0PK1y=@l30 1072-plus.txtUT ~%O~%Oux H-JUHbSC#Ģb+.Q0"Q*+gS(ɀ PK1y=@kMfJ copying.txtUT ~%O~%Oux [s8~^(C:F7;ɓlˎnm# u7@[Wb пFKMש۲Xf"}IvӼ*t+֔Ktzl_*XXm/W4_i9z㴫ޥZF.|Dx'ؼa +&[oXt.yݗj]цWiӞyQib2E j>k<;HL,KzQlLtOiQLY1U'&`|?7n`2ѷcWOtx|d#iY`-ύuzY.??i6w u6r/+sϡ};'U^g {JSQ&s&o좧sSc_:ŸJoEB>,;bKh0n]@J*g%PJ@ "lEmZ2Y7_ۍ)RKZd*[n\0');kg[e:7Yjݻn[e(Woֽ[mK޺dy]lfinEu7WNPƎxyPH*|Nq`d*y_(4\/?wg}7 {Z`4bKG~![V_R |_~oK|R,+xշ4l($ҿ\ODߦK0wEU^F|+=UH Rڊ/RJ:aX;ùz^{2YM^&_UHX,Қ "gdn@vm.]BaeÝ}Qj -ȍ ּ3 *=+~Ț BEBZՆ @GET[,.evRk%tQt=hf §Y>,;&Z\H0gn(QxlԎ԰璒vv>t>Af{ ^a gy5ޅߊZMâS.Y5R2XE]ڲ$v lRmKiܑ:E`ijm^DÑuD#.sD>SGtI[#TE^6}MrJa3zxKX#^B%m ObDayk]''FٱvE-:k%,KKbtd{c.9<0mήp2i]6PVdSNr-+Z%L4KJ}EFcI&DXK2_-1L3Aڒ)U1 ؈ϩV?XGq\ir%7d=2~ʞ,iL-2/ʊa>LíaX ձm`[Za{J|LG\غ"]H8pϽDiN!T㇙]99N>%;NC<X.!q|bN{S,p0C75pw 1\&>87N2IG*-\lA ׫ qN'"ӛ H(@HΥeB'.6@hHh/,g1[z>$O)qU7e严ٯc+G"] ṕ2#ӈЛIL9593\[朽к# YTU dgao ~= B!qm 6MoZo<ܠ(I:0ؖx.JԤ=QA҆/oJm.h`Ysda}8N#) GwN3=7u> 9JY@p WRͥ r63^+.CAFř PH V`QqNËI;z\4sZx 9&ϘonjcM=@c/Eotʴ$4ؼ9wvۢd3`0(O@SCcq!6jLS|6+gDF%D4/Hϳ;Qd뀴qfY|!rbPnr"r%`_td0IEb>IeTVWԞ{0Cr:?E8ڶU+*ENp{n9pM+ΈT8an z\ bq3 |΁ | э5m)!4LReO@+kj~7.1\lNs @ aI4t^t]|$0R㙘g&@* :dO[r BZJDBy3s:˨c6ȶ>@Wt0f%62Y6j$Wcj{G#o̡\.b# Q yl9Zw"lJ"VԜ7B8T4ڻx}"L,~3':^ǰXRAT|!){ޘf2א@H"@F!+ƕ@ pu@PB#"F5lQH[hCifY_b/DޥExs#%N@oASzc "|':(psY`dǃz@ok7T&{p1RxwT I~EЫp^Ì0ȱ>q-vGvF86񋕻モYB< WY 5+$wwp45yA3H*xCטb4i/Y0p`OZG( [! ܶC0jW@fB!Oa+S. XxI(MKsl蚀({L/'NFUWueRݕtJ#>ihiͅC{7q&!jad'PE 8Q7#S$JTq6jER G Hb-OmK_uUQ1Oofeu,W)'_Y8JHI|U4y];͉&.Qk Zfާ ? E+i"_dJ)s"3R2'"@EH}>xmT \e7nƔ)IHIG'0i1g'܉~1Y*Aft7\qM[SEM[V0@‰O< *,i@rp -5,,%CtO𿦃/:f]iN"HլO}bfI?ze(=3h%ym=aNH"%ʶvGh#Pңb64VY1g!;D.:S؝fk6G-Mp<f0ʛA8ߩS%y:uSc.MES4Tmr.AZwȊ$DPbdǖ\@TyU6Lm ?^IlLMiɌHJ{ K5~L/*=+FfgR- 6oar!-0vVB)5 <#a/!F{ByWds)5%4`۰O8ZҶ^B+~P>d*^/,U]s{ c~d$g{~E`41SM iЅ㼱9nGXc3\ @%uܣTz3'WPÁy Ü"?)։?XTu}24P"3.3pkF7Ŧ>]Ckꩮ' ?k IO+(3zzhs3@IUbŽ<)Qu*w H2 r?~>Mg }5ܵ"Q2f9!bJQNr9FꋐinRyq#\/S'ۤߕ ?D=£qGS;0/n njH.0CVWQ_6Ѵ.S z|d mg: '3,(oy r'SE<\XO2P;G )!i)i.$:3i97DnIT%MpE~2Rt:ܶuD }~׎UP3nׅA=߫ƁM-+?u__wOӫvYvT,?i*%ӧH")rKXߎu%cR|GW%AtIvs5 O#x^v8yel`_䛨!w",}6-yl=9CAw^XXX!^fR9`<oF*Iq ).yٲ ڣBBBe4P3o*gI[q3m2s"^Obcɜ|4]3쿦AI= xL~B#d{K0;9 ot7#;?2۰@iye%$۷_u=?~c_<~?ލz8 S7v<[}?$n<^4#mU`4Op:nWt ~=xꯟ#HɴO/ Gx8xC>Out~Q;: oL' LN??>O≹pt74LP<q 939}dфawRirT}kZDM pݟ(/ߞF.x菮YQ$vg57tJ3y~xyO,{=\ _$5<?HǴHbˇ)V2B6<'nǃߞ K=w6fwuICO8wCX']mO6';㑁¤FzK/?Hc^A3>c]V-8ʄf(=spLr-}4) I"РGqAuaVq3f/zF/ɮsk9(y}eBnOÊ+^Jc=tYT(hg%0- Pýwp@V{ P"t ~]6@gOJ(K..`9j3πD ^AOOݼunlFn.qDfVzHPda娍>ގOwo@ڊ4D8; ;w!ແaBwD zH_GvS =,^Y>T#?#6fz;" &,+5$:`b gpVJ"%J/og §v}96MiF6j 踱,Y iҌɤuzc*IVƲƪ(?dÊ;9%g*> 22)ĢTvylo8W&w9$KtgG4XS%+AwN}R1T|bl:؄@ Ab&&9?D{AF^N0wJj2&̟ފ&L$~6iU_$VK^BE}n^w"AVcvCFIϗ,+BNM-ںBMg쫯bQW"خtƤ*%} Iog <f].KPK 1y=@ deadbeef.txtUT ~%O~%Oux 10259750338 PK 1y=@@unicode_circled_bullet_⦿.txtUT ~%O~%Oux dot file )PK1y=@ unicode_snowman_☃.txtUT ~%O~%Oux z4 PK1y=@F3Qfoo.txtUT ~%O~%Oux /I-.II-O/K+(CHIMLIJMM"_b?Z, PK1y=@ $ install.txtUT ~%O~%Oux Zr7}WByoYrT,ى$p$ 3Hf~Ow3JrmH$Fݾsm?x~??_?Z}ծý鬺h4\_6R)yv_Z_E_&谵S9z7z7]ٮvW4йU6Mtvj+X:yOTz\~.oYMٙ[[UmB.xRr[j";Son;ug:^Eiw)M_Uee߹f Ή:K/}Uض;J%t֐#[ՒgP^[Sl(R]wj6v 6{m*?Hhpr;kHCU'>5pBMK8:~LPׅitדYuc2zqçWBL=J8U媋/m>u_ Ү͆gQ~&HCvWOivGJR(w 5D&agt .lb_-hd1za3voW5QY/w9-Zs3%˜W(b׈$ڻv׵) Gd6Y>5ű! dIU Bs)JzOh8Bx~%  מ|0-sMYvT3C~b=w;9NN k^~)n[ѫ [F6rh q9T-D,}JڎOr7*qtG5-sNI\k,oj[.D⍢H?t5epFl[1g^5%Øc\_;dcuO>$a\n{W-~N= >XU YA && Wg&Y8 ;("N8SXMzKp~8=}*d=cX/ez\oThc#}G-]8#4rº*.-իh {bfO!+ųb5tEt2Xp#YcS 2{R/ #SA쎗tHvPH)EX#n N&g z%`c*OJ`'ʉ/q1!kuЙ!q9[lr?<)ɾ'W.KX"<BȮt@ qH9̳糁r6@c4žAX61(?]a=9uף91"dPR築U_y{{y7fCm90"O^]~d<|ն$7y_7VŻ>3p++\{E8?S8 \%񊵕;RA(FNLa}}0I!&ꝌW6|!y3i)a Fq!2ia;3rpP|Zݗ՗JI1_s*3^xᓌW,_ Y dl;p;̤~lUrOW}%Z)bq+~*L_+24? 7>m/^$HJ XȘ`\.L[3])^p&RউTR04op K¦IdB6(dYO.RM9? [e<I@9vf6ǂ\( o$ZE(5JXnKZd`GY~BwX:X^ =: GAc%6 ed?L]l(6-PzxCxzĂ?v/y) %X7'\` -_wb9o*s.O06#12'Wܙd>Mi @4n]lg(zw|Mx ȉ}#<4; d| q:<,{ٽ|sמ7ReYvYBDR3r?e<>)Rfaecqi^1Ä<D,JE|gY|Z97kWl  We`7>E'=,ш ,}\$1:WQ~%k isxNLV +óy&[;{&a.jG7Ƒ0o;ae($EawM&s+-rB߆y* 'fPK 1y=@܃one-byte-file.txtUT ~%O~%Oux 1PK 1y=@zero-byte-file.txtUT ~%O~%Oux PK1y=@#(>` & dir_a/web2UT ~%O~%Oux liv4UX7MIN_Ϲk%Fb7 7b9}L: Sf\|s?MS#dF7N770[x܅or Q*u#-sf__y["JtO%'_ʖ̻ Y6s 3zFĈњU`{fVwxuf6L 8JFַdѼYg~3@Yn.y{&iTzlFļL#Ve>3t;%6f䧡^y*+<زPVΥ0gDqͩi@`sBC[JX67:D |iܟsB9(Vs]r9.jFRipZ.E|n=Ժ(ÊY?Yo޸nxںcķ':!# p,?ofZm-SeF k`*OwQXiIyHoI(yRזR 60 Z|j(߄|I|mRW@8PlU@^3GjKۃ Fk@ wgP|Kl٪yadc Fal|"sCaRO z]fR |F7V}Pd=l:yOn+ˋFn)l30;MBz('C #b|7RebMTڽj]_D)vOP̵QmoGr$uxt@?33 @lmmC^H0c6vx !Mo|nL7T2 tM^HSxL Yј>媇0 /GT+u*{stK!칫3Nen@׹O *+Nn{=iβ^'}L prjQ}Hο>& ձBطlKźGȷ!Lt7y08an4`;b e;hBp9sE/4V`ĖxqIq8 V@mfiiVfUtMCM ^J_ c0;gr/6F,_jp56ޒtf ~%zIN3ݲh ( nf[OlAZJv{?9)bZn46ua&dETgKkAk$o{Fflc|Epx ѝZU{ga7F(Z=(?{fDE֟uoύ(r0  dUT)Udm C(2(<-0}6ԕV7n p'Fz_{VTvR5v^e1S,GeY[6Ty;lػ+`b;δH?Rx>=~gqTVE@[. ʰ,ty'v&VnIIS-T`TA9HGG;1g^RGNʽGp7nE/B)amVltF" /,v$ L<i7ذMYjtwgzΪǪI4 ò)[mT/~SBR'DxƝN&fG+SFkJed<`Yy<#e$; CU^pØ= o@^z5LTNQmC՞L0k;XhM@G|bf Υ ,ڄ7dL%>ECF=&,t8R¸3[k 4bsĪflyDq޹f!MrO[/4Qz@Vf gX廘:0CLuLZg^7UHu2s@6RحmOC;" I2㟷q!Gi<x>} ChSQӜae 8f{3}djۈpwhw'dXYu,a ss*3DN&t̖qK&d\ݡqG!C[_ | }#qzcZBv -vDDFG4u0:p!ؘ=b{e#'5mݸ8ڊBڸ709x<6ܹC9iu~Uk2G|YH+WHXC?c".a+sV|S6<_͂2 *g %:Q߸O;z X(&o۴K9A.`Ĥ']gvsl)Da6yޡ"u]XK%tc x,s2sq>&>:B|c*r X'K0eqm]|g ʅٹ74[/,vCti1Cļjy~ñGW{-VCBF1@ӸCܘǵ/y17p&lme.4e9~M 6shm {Vp$x3͏ X^ruڍ0zM>LП@#pMTIx>ĝḮsa#$ ` `P-+uX64< Y ;16bfY1m7ΰ}+E䶮U|| Ph5Ƅ,OkZTT0Zyjdu+:"msщCgs<k>PYf?좇6hUG2߃Qg8kmfXd`Z'Rxa|PlpҢ@mI8Q6ѾvP' V}[c@b';!广s=Ϳc6=xL?dkӲG*D8dhxx"՗ZQk"qUUM`Tg4@\5@7HQO쮍'GyV%ۣpV!F?x u {B>$l9UCa˦6/]lZn\QiSˑb vemyZH 톢,Jʬ3|>=/)Rm@IV~@OQAsn>mH[#)}a5H",:܄.:HjC){=+Bh 71iĬߎ]qў폚 0("ߛ]rY;V~~cP;5c030e)[7-ʶV,#7넉F#JXi3~vkq&y?*-@y]m$S`Ů4د݆* %a؈upF:dd7e (iWXl/Z$Hv0x`6 M}O]L@/lF5D6kK,B}bh\tF7T̆z2xO Xb%N@+~>)lnE'S(S(yQ#?ڊpfPʇ6*FcQ]5PY&'q9$& {#`]L] 1E+f2,;'B[gytgj߉+vf i!n?9vO/×W"kABMz@Bǀ_irم51u1x81P)b5ٛ΀ Vb.ZTc354;CE YL 7 br&J e1Sr אƌgh[vX=FĘ;^΅sv .6 'ZQ#sϪc^3HӔ}a NkLjM$ '!$M{L}`vWhtN}~{ΆWo\jmoi-4 wid_7Jś= Ov#]ƫ EkOIm8$ECo7o06y(ږ k9e}#A>ذf{І#GL7#(:a+vTT7tTWq]tx9\T7RCpQCa1x^<=<-;#!>e;y)RGbN&+UT/" '~DGG,Ƹh<5礙[qT>MwAmDξjqs/σO(.6PѧS 'xL`rD>6X^85D ekTte@~~t>u@13O3l<*.v۹?4Znw"sfB&?T !6zYn$腘ELsC 'O]mU K 狗6.?0]D1p鐉M=jo ^N!A?pyS΃&h{[ϦNF?~ѐQ1?v}ɊgRHb?9+V 8ŏUp0:=wK ̺u3t vz3#8no,I f}ɅWcМ}!uHؑ[ɺYN!~VBxȉVzCOd.%5k%yIᔞI׎4YTz|޴l]w*OM*v撅Eɶt6Fqߌa8>F\"'k d)R_i Wf"v (7~g|_4"U=(!`gWVG!%b:zX5+= rD݂6F;h"ɱsO." ~YGI$qOYD ЅJ33KTG*'=j"jW*M=41VD W`ZEf@\[m,ϕySWӕȝ|)&|Fb3U+kiC4 ܸl. `W¿O?LPa`^\Z'XTJna4`8A0o3V ]4kGSsOÎ/t70X>'dN=b!ڮh 7ѣYmLsSYU=>mb'aDiFxz`+;5f>zҳ̱@`֏?B徙Nwt+/t qÞ*/S rjm|E4tJeh#̵-]7^ulS;:tؐl7&,dJ4Q FQ-o_JU'A鎆Pױ2XgpEɶ zƮL攵](ޏB^v *" G!ѱR,n<<kSa0\BˤRnxQƯ t龊#9V16!gچj!%V#kBw]ܑʘ:c$$hb/fZ@DdP::@vXunK_~C4yXR &#Z"R$P 'ຳׁFДiZ!:ƪYFTz#&e`W6)r _ {0F-`X}Rv#ifs1*Cf︸äᐠRf~'`U]WwgeF)I-)A3t޳j)NfiARw*L70Bx8 UMl 崻#dQ`8 7@)Vi"tE"D#n^fG0:mp[-<c)PE6 ns]-]Z(^ }R@<|,}(k<È˺6Jk_?1'm$~Wb| /;G"tX885+q:F(H]L="w8 Oz:0x#IoCD́0~GUF/wEd홷Xm=HUyg f T!ss/D3W~'nKq~7 @fQ&.O`0hleκzcJ#N,S ߱_+˿aӯ%,-h2/y#QAFdQK'(gR:G(RҨ@ePpidE/j7t0Sjhn$hԐv2y̞:c[lJ)ܑܔm#n1Or2W[]|ݡ _9־7dXZ% D⾓=hsly~7uˏ7  |{&b7m<1Fum1,*(JFM_vZmbƍVRK}M&Je 6BW8xV;P8 69]wyQ34mf7::p7 K %_czXۇtm`gA؉#:CJKß,Ci\m 7Tl/wI!Ǭ% [82{okF`nVcpk@e[фu}vep/^WY#NmYѸ6`OdO$C"4ٚoϵ>:voUϕ^W}4hjb[/s +tCv.3-Q 0w;7nÛ0=D~7CYfSׁuF<wwDdݴÍS\sS;;;T7b^vj`Rtew >)֐Пu{ynȈr4BhGl N"G oD ״!6thȇ£CoLxb꜄L: f'@Od_Qov#l8Yvt#A`ZÔLnFڙòˈ0؆ܗV3c[5?ͰG{Q*>HY#9JHTWGhWAi[Ya=$˲~q9)|pQ՛Oyk܏ ݧ?3?ϖ湙Y7$w_ݓO;ȩiZ֨`fξS]:j&7cF~幞xu*e{4ݢөO}*蓊WtAf=SF< 9]:p*h{pa-{4X'!`:%(6k3΍w׈0v-cfkG ڞ3| HA_E{wپ-Pk`'cSa%Iܑ/#V)iqbO~1x` cifwm*1bBKu;sL0_D4n[UT\C)/aگ2?!h?pLa[@]CO[bܿgru0/jv|(c}CHVӐf+6@e_sAG߸RǭN@m.W1[ENd쇋6Y. 폎a #C"z8,4K6}Â;/S6,UnB-AF5{t[wu*sMs֧`Ka[F5ŕx ˤ>exeh>eAoDޡ6B原_|3|gX3ERL,3!jC8Jػ 3-A>SY &l!;Lttv[o p CAGGpP_ )2|I0KH=99٘IXmnlu?#v^>$f#0P 0eŽTa3bӈGOXk X0|`_*Rv9@='`z=ΔZ{-A>.xW>&x!.;߉{xwaDcʉ0EM@hTJ6H ݹExȕL!Sx2v+N,g UU$.D3?c-{=gFZL a~n[ n4{A~ خ%h+!ڀ7R> 8?Q> ^1}lqV8x`桚Re/D:.FH[XfgģZ ;KVV7}Z3gʹ +6 iwvf-f;R4&Dsq=@ŨElI6˦DBi610, Gļ(q"b\P%.h!FM1j÷!pj+sz4Av^Bfj::,YD`; jk *Kj';\CA\%H.TF3]rL9ӨHk؁`؂ȅ7Z':t%se}Im2e NYYqR7ӲHelw"sc(t78f]%KaAhm~=Ó=3zmt<-~cQߪ*9Xq 5~(w{h뒙[4F1Y]%m!ِ/miaZkE.W.iDFW}h+?ki_hOn'c[f2;/)_Avߩ6Pb`!y׶O3_ '~|D6`a3D.Zwl_`m.6QM+hBWٺoIuۣ߶/ 1~,V~\P)p_꺛`Ub8LW"@~řhx bۧ@Fm72&DdZm?>޷=~nMMn*ܷ^ )z|Df03=m4kZ 5&@dDƘƂ*"7v{!t;6-X d԰m/I]U3nN^ہvT;C)64qj2eۏ]p»`10Z~vC3n[n9sfV~Mp!z-dXh̻㜻3,yMʩM6idP1UTt u$M@#Vw#4^uY\fm$c|2%H 8 Hq@L($9qv_|Cm; m@{g*/mo~,x~gxkGKFQzI l̀vPi&IMBn?}r/5Im.-L~|#Ap-72Jw)_L#! ojJ굜>+GckE[B^:B wgR1X?vf&+Qw"aNJڣN2MG=7T~~GtwnUBpLD i̟Zdna}O(,@[|C~O3' 2 \Pp``&t쐑 Gݲ05F]i0bÒ[E| ; Y! +hख1SV9H|d>`<) 1̸\9wN?Q"6J ~\ַľ'f~ek70GKT(%Gz|҅0(JLoV,e`1!kJt:LrfxǛpjL`.0`+pyC7ĨF8N:4Wl;)fr)b9LriR.7Ann$Βnk-n(!}?  y 2}-,J n*ׅB 5FN0yL:0C NɍARIo.؈߿t3ode@V\` |m=XStG FHy^ ϰ赍^\XB-U=BZob/5tCKKt ttkz)la<:Z{jOϰ -lE4 DhrDL)r)wL^pߕWwf7 7F t" 3 ŮtrbhO0lT ~͙cptHJ",BwHa+LbyW FUGق˛+h ,xoN}^>ؗ3D4:XbZ]G(ɂYLæw k$fc]݆q;\k1JI {tpDw8S{Yrs=oȒZѳLZ6;߿Y^nwJ3لJqTA ґ6H=Kv܀FS%eK_70ۢZ:IE걪ƽ1K~d =|\]` a'{ab;I _F ׽jL,2:i\8]kƻ񁽜;#T[.ԝ'1^ $qǧN i`T(D"/}o8w^]B5"Sdj8~vkgW_{c}=MZ&' &)ztl%Oxf Ycyp5({L},/&q3†;8%*R7cE\Pß]|mkūeUZXCJX#>9(sD=]Kpގo:_C8}叭a{_Z>g+7WEb `h@.dQASRlWL")T[ tu+fyʻ_f UFryoH6hCލvPWV[tZ1sݽQImA^}T!mXn^f4֎6Θo҇>r&Rl'j ͧ2pMw*|e(#"xD5(VbF b=@y (Zc6WĀW:0ʫK V\~C RaFV7 * &73 iH p~p7~w><8Ύ ٢ $g͜b$헱+_= vc&^J߄:df?ff{jO4gN'ȝ:P0I;3sČ"z*& chn*:KBa 竏C)$DoRt{{'Δ"v\il/38^;b =I2Vcbv&4X\Ù1ida.EO-_^Gɨm.L;k3l 8Twnt]l_-%gF"ecf s h:ݤ^$fP+xtWO |*Yӳ ?O_qkJ*'PTwu!YCil<5{a;6tEɱԛBzxQ_ ]#=3ȪYO5GnBN+s@ӞpCX~>"s@~g^X|NprǢ8ŵwӯZFo c}(ʗvnOj<}2x/'ÖJieMk4PЮ jnv)D>bkV#!=/s9BN?FYBlG/܄}Pw^/N@JK vt!w§l9(3͓:o͓a)3؈^ZDmN?x4'Hne5]fZ~ < ^'k1aieuQ]3@5#[Ȭ-6]]:ݤvJiq ̦ 4ڤq&jX>qb qj}ƢdUL%j&]񫉨N9> 60p6Tǃ;/xD@nͿ1넌YC' l V:>'̖qNHT`xƨ|<(Kɛi@ {ATcKK#O{Ǜ?Tw2VЎ ebM"tǃ_ڦRS ^7Fq Te 5l RM4|-"ԓ⬧|R=)wzwVqLk\zc2V]ibZ;Ybl \ɈCn*YCU:LT,hbոsEG>zN]_Hia2m$u ^n7ĆG`l&m!v7U'aYuYCblBsUF&H2*)V-X!#o)B->Vi!Ka [=fQhZ7lD_^xf': ΰl}Ce8ʤ`R\f\ ex~e`g7GPx WŹK'3 `ww Q,oOg27Z̑}#^E `f PuzLē=qP t F / jiiCSEHqmՆ;{*0(ٍRtJB20973N$LOpxo$xO>Unj/PMS74•h+vה]g& *wj݁_"Ą 0D;GDLv<2ޜ` Z؁E'E;J%`:T/vGp7lof/KJOCh1zXq%$"; ef$a#G;$+/ xUJ]S:t#\VCg`}ӈk0`R  1)Tc^fy #E״{N}(O:uH?Uf2scYz\l\d[vUш >?/6> ͏ce~z=ھȽIT(eIE~f_~a! QnCyз1L[uކ~Mhsz߮ h=?/1y0DʙM$SUcy /M[IW|/m/ؒ{Vk9M#kء86_,w:"f^iQ=LvK 0GyՈ~nyr7gaM0K-3M3xuAȭ'5f۬ȸLD¬٦zE=a>VP-Z_a~{ X zͱw15rg/~V϶Җζ8VQDڪ;Z̜- UGFېlVm> ʵ Fv&Lm[[cc=kw g \7ȾШ|Zery#Hon=Se;uQUEYfK7U%ȼ8v _#B -WSyHyVwgoHLvRZ(aU @PePL3X&!% ǽՔ6rzUڥ)+=bqpD;,_|ѻ}s$r]{nxʡ#o-u|^ bY ( !2c 1xs^LMցVknx:[$@䶛1p`Tdm_ 'f-Pc/Ɩ.X%rLLt#@_H"B}B#Qh|BѪkl~G"@3.w 1ʖ~.Ad0YlZ < CvwA[bc mDZrV4$uva`0a/DMC4 { iiz61!0|!/`0-7#2yD'o̞>p _ra>2;#[wCAc;l􎛹'z#')zPnxZC&*Y7+st[CMjw~'Y ~R; .hst{haW1pFr#-9gQ<0{/}QO*LjGo)_:p×!(70©WB3iIi1{v#λ T틲' [gzHraOmNms9ϐ@|w^i1T4l-2Z=e~cتHN\ӽz%a wDT'Sl(&c}g6b0ymظ`º9>H Fܱ+Uټ+9O9q}9-=%m5\ң5Tj=7{~\ցGًSy\N. l .t>nYȺ\:}> mڼ8Z=9Ld0'rį:Vx7MhE0a}?4cu*w63f5j1|IFI=s߯4[>ߢQs86}VcNTG OQcP,`,c?A/%0K JXijt5xAp4bb`ҽ/^(&{Ed k^հ.`s*QKOey(Ӊi~< EVˑvq,&U <_l 5~3se"'kokʼ< 7`bAA9.GGh0 j=wtDWXaO\_ʍFv;t>I;u6'nIZ-8yoR5O{("K$ʶs!~nhogGeqK~gT2!IF(IrN#Hq| 5.šE9uj0!s|%4AhJW nA. hq @ \g< $<P<9kdRcVa`]{k-LVu2w/Mˎ8܉TٜqFs m$XfwZ SVALDZ::Ԙ2d6x4BAp'đBt_Vm?4=[}X b;B|?QBJ7ssw="jƞtZTLOF~e[dķQO{]՞jKNQ7RtݛR7ilFkB,-ƣ'|?0ƚJP%O^4=V"7erL#j5;OHVC:xzFrlw  G2llGm YhR]+mM33pk9 Vb,J ^89Uq1q!R? \<3ΕvOƠ)yhb۵C#}wC>lwe*[-[_l33GmIl ! -2Zyz(gw^86o5-ZpY|)`s-^ݧt/8xΠB|3{+|(1jvx2A1\̒U)h\{{8QWD!!]k F}:U=-6;N{vi`ÿz[$z$i7u8% tԚ+kH6 qL@CpFp$ٖ-dZd cS#l] qŎXLU 9!a LsxJ/n^a<٠j&yF'_!m{aNP,bu-Sb` YazAgIx(f<=шjX`q?ǮܰnḘs0Jzn60EYV ;דSvG(Gk 2|Lլ-v>7A(FԆ0ub`| unuWs&8RkfUXb~ {~ ` x%àw*D|!ʠ^y>{X=5Rv>6zLHgOt)PLAzcsadNtj87 _ț[h=a2LVS,P:ט0)pMmkfcvVqU݀TETolxF "_+O.ϋ ;Qv\3dױl=߼˟fZZm 堜a9y18 F]MGݔލz871mEȆBI<|Yh{([H5&Gޝߨ9u|hxt8Jn=%A9cŵH^u!颁pxGa<\S Rϣ 9^f̡sWePoҧ##UL .Q#"p S9IeIDl17(g}_K6Xl,Nڱ$<{Cxj(L6#@ƍP&y7P> AeU@4.ڇ[^]$2[}Fv p?ŀNvXaTnK]?,O $ \PUo/G[/r=_O옠p~I[п BLmғ0B)iKsEY`L?>\{,n҈-2*l(wWf&[Vd cM<^H!40y 6\|ʃ{=Y ar+7`  e7y!挗_MBD[=y;곴cx$4 1^tFã $hcG/NmVfKGY0> u1s'0^ߛ:2wci`iOjCMgj]5ӈL9`l4F#DntS윌}W]S-Qct Fv[+<R(ԡg6^jUѐ&_7ph̠efҶQ&-.ɨ 4w9cU뻧kFl6j7زEڕ=0-xh:~0NA{_6n|sqeQ3Է#T1Qz WgGVlw?l) = V{=1n:uBR/2jil?ٶ0tӋh47hӖdUcPke@S*S Y ܩݨb!ۮ6j}pl $N p^>,TjhA a:&K y#[67G%6@=ͭt䮰uiݯ. j|W$kAJ\ !6T`d2ȺuMh3,:PWfV], \2mC7ߦs91tz7g8SwﮒBrmT`͟) h) ݲ!,7~?S`;6\~=Г߈^eko9otuy?㍻ex"sb=v)P so)s\W"XވM_Qaz8ݞŞÆg  ZZBCM|s`Z8u*h[B3VWO"՚VNeh5zkkÅ΁dV:4Rlb_Gܭ+2ykk0% qo`N)ۈ!+'T!<:|49왰Ra)٧O]J &v7aKofx};.]A}$ge^əpҭL>iYJҐ|Ckgivk Z lM\ⱙ#E?tl{ Bpȳnj^Aꦽ@]|Ga Y7A4E1/#x`Nzt> mXnn[soCԩ-b|^M{y@a5`Nt|~Acgw4EbgV_e*$'HCk 剠a)̪|FO1c!Z3~JR)^gUm]݅2xJlAĥ g*$5E\{=y.?hS~EKL3g'Z2$Re`}v}K-C\>C$D Ԍ/C:˸d\Gp^VVBJ8u8ZɷRl:u9p/MϾۭ^cCIgnSuQRl}'VкoTɳņJCnҝ//vd':k-wt@?6%V/Z7V{BjuD8pD` w?M}/-x#VZ Ɨ@I+"a`g v/(tD+mzUQa*EYMu'5Жn|\@ @`!?;dl yAo3;pzih(`W) GmzsFiJ7f[61O`T kpR e`I$i|7e,EG*F$G,ZTGJT9"]Ǔm` /zsM'iSU R.d[@lp38S7nyb-6X.;8YQk)TT%2 :@W!$=K];YЮ49o,V$92| C#J8 (dՖɩqCiv]iAaHҷ)bASCʣ@e~m%uC5BD43?8 Y(/Z0/l%"(4*5Ey*8 7GY#{.Tc~%fn5x&y]7 L4,;(ChL=[Z2UJ`1ÚR؍$tDXPˆ)r KZl\XVqeb2vkLSϊUyvɋo*6~г뤆Ro/gHeQiw䁉,_y~Qp>mYG}4Eg ]0-[n `<*рU.ko*}AHϔM؊J r&N%a+ B=P F#NqN[؋>LjTI:7[~P!Bd^~9Cv]d*"WH鎋3D 03qOhFܒ^I[ >4t)zn~0]9Tg1?O";RYX_9)c/Ɯ!H1ahc듍{W~ѭclEsտczbvwֽy32BR"^S:,_wRpgݨ0pH0,&7w.#^K?g ވ0ʗqe?M=1ƸqXFACQMN>)/T)sƑ-Ʈ/̰yL:m| na;衁 _" kUoF?3Vģdqz {j\t›3[M=FnY="2p}MsպB/ys^Η3JXT4+*dl ]zWkIE['Zm!ȸɜ{+U23:]?uس2xȳވʭWZtZ[ w9:Nե3Dw+U>׶6x%MkmIXLjzNٍlsC4 XM{ p*GqE1qj'BuW`yR/iVMw;ZzհM~q7tñ#Ynk Cu`gڢk\{vb̡FJtgŻqm{,y!ǹzi<];XVܗ_ |yh0:0+'=rqWj-jjnxZc˔@ur€*N5 z!%XW#WƎqD6z۾8qc 9x:1F;j'.?=l]fg|'_4{U gjG!j5U|ħ8CNԢZw`q Xwq7:d6U4Oh`WH?̎.#IH+TBHJBٓc8n+zH`XlEāoL#ƽ}i5@Y{~+lds7 e:W0f.\%~2FW <Õ +Y31;d.^"g8'*T^[WW0rc.m;No J:\-[G/#s\uxֻJP̦/Wؿ4wTl_KrSR}?d5m̞] k+'np|-=w囻rK*Il]4ȥ7( l܏޾ s[jXq[u)Ey}Wxrץ]+wy9OU@^"yҚC/G#ڵK}{Swꖻ|W1d`?t+ƺT~/ y}R{?=0fvn4dl7\2n;^3[p~512Jd<{]y3<ɐoo;7z vp9tW !͸`v ,׻'oaP/fpcp??qxtFc;>\h']cZ~cuhLƮm靽þR?dg7߹?olyh{0C1;/q>}$/yEgF4 g!1} ݪ_צ?n6?C^i0xeLmնdFOE=k1Ly^uwA' ||<F.[ppObf2!gvvØhv9c6Xjop;;Gܣ:2{< AG5G~;[L^ '[1i/"xX3q,κq˜$~zcƫnJw_ͮ8Hܗ4<Ȗl<ȯ{$2{fda6\f? T&2iκ#sj)bc';0Ǿ &k&);|t=8ifhkt7H쯹i`!apo+Pa8mI)˩yjVYMU`mOtwMf:n[ڃfMf \p3~X^!|{Huߌ1E rc<1 K Q0=B)X9fYod-pQC 62b0Qqc1bz-k5'6P| :p`JL7X/k 2^Y{hZ礦e,Fy7C78rYҐw稹X.1 P!`LeK:M[)Yƙ»$CxWUbbg-x/6;o>͖b hJmډq?1,Ph'c Ѝܩjg[,89ԮПZ3-P}d|<3vszM2H%%EO{$TLt^xfA59|M![T/$fp9tk!-Kpu$*/tc9`0|6t.9uU޷z8: p\"ZəWQcO)߷G6/I*}Q('`Xy(F1!xt"r7+l>9!EO2gn?0/흞&T.nnKZ) &5]Gv %@qZtٝ9 s?w/G{4J5b;u$L:6 ys$`*ܸ >恉K ( 2=MʘTOnƹkӏ?]uj8V>[g8֖ο3ď+zn=iSQ}URJO,N}s;mp,+y}oGd֎$O&JaM: }/:{*` O_J^US .o #5j2?*Nm:kAd +i\8>,IJ8XϾa^!ptꄲG;oԾ6ƹ3oniG{㉶:ھи(к\? ~c4cOCQ6ql'q]$G#%^)yAL^6!Ɩ%,MWN !y2{&~υg\xV#!s18_*اzӓ'. 6<>OECw6·iycL !=_qAݹԞn9Q9嬎J:Vcmx1veN~Aԝs/jƒg4ۢNoa%'0#{dk>{>'&vɲƯ0-}t',ybc%#?}{E}l~&kܑ2fU6ߨ9_kn3![C3j9fiܾ`X {xl~#ī ;o>];'1B {I9Uz0pc#lyQ VܥNFl#Hdx0-4@fpqʣfLuԗD;Qw9#VqJq)/?qƂf?#F5 1ݛD<ӭy`gg@ o(i:b49Jmnua`v7nGO~'S1t/e` ^y$<]FkWҰӚ 8{lCzKgvuL\!\-jnS=qZ)wgsXX|Oާ MƋ1Z$XM=: K^{#j~ǿGƀ.h|ElEgwB&:A[5g}{݄1jd;F/ulyU)@w mNXۭoY^)vn?Ey'[r5􊚈pdb 徖8طB>P 09OS{pΛpk}O?%oh֡=nOLswU#f/BZ L:lϱ0Gaێ=6?#M9,ب}c[ WCNm qFy}v9Ro0ۋ@z'.kh2BVN7t_omѴ]> vK7ࢫ8?)&Ok}~αE kU/%j5qfs+Z6kGIl`pޓy `8{GÅ8iIjdj bG;VM(rݵx7b{0\= t(S:7m+wqUׇ3µcU&?\djBQLωfjNQFeѦH3%ޡqô N[F61Ë7S2t S?Oe`LzEgu TIl_Yg넢ZkO"'hTWr=:pyZ.\B i*27X~|wEuw_SvJ&]n]b!rZ-z̀tK $q >~av2o1q閝:z(;ٵ R4-4lKH8Xz\K&l}tEր=k)%Ўh{󛨒;~(Һ cbW&)]Y.XPK,4TPr*FrăƆ_p%. +SKzUB ?tK䚢Q*Gm|jF-'xZ:OD:*k,?, ۚEկv201IJ/1ho U>@7&ZGhBOK'^vimB8v䌶AG~ faɆy눉kp[l.-`)q +ID];PJly'%| 9]djtNT/LS=)h ɶވ6<ھ N#i%65L$F~jHy%KhoGO܌y!>r%MR 0%`R|:ertk+8ҝ^arc5zHBȠ|ߝ.V1vI`0z.0Ѕ%Q% ܵrs5࿋hz79tFb; &m26ʗB "/kFN0#WM =i ̀#{އA"h/H 5riC) QFPyo $ݾ7wC 8BuF5}I./|m@]Y8Do?ЇUy0)$0'`~LݡJUTDu3uW#s_ᨆΰαUUU+x1#I\:>~8G.G &0*\OEWTB)#TjY1 n0` NQqid, Wz L}i$OyZYF@S-HSNfMfYr[Ojf.[fEf%U4g7e9"n26x#5t?3s~(4dh؇.ԡueҫ޹?ߥ=eě4/o9%0LΦ[ٔzpnn0C -MOWԀ)<4o+o0x]w铙?;,U6ӣM5L*+ Œ# S[/oC_ OPF 2C` `FSF}l"hs~Έi_ [ !Gm=jMaW:ЂégM__I[!\}GLjgUsSRaOp~v΄\1Iޥ& \Zf^6Ϭ2Gjq4dT4*:kRTؐ nU Y4~72@Lr*2jbKD>{_F hOv =Kr4NNG0tu߁h!$'6T0p/vڀUn:$YY/NʗMBkBXkwlF7RKө+9;aNeJLE<ٺ*!t=.d䝁g`9X4 j-a[@FF^`3!nn\X"H^6zފ݅Yb玪fdKz5`0'*:NGj8:fdF@ sSw1;kscidqO˦P0+a3m> JCf Gkbk{ݱ*4$JC'Zv`JWE}tAsxœ*<9-} P?>JV M~^Df$RZ0z{ c}ORᜯ槝ūun{xmqw̦r3 Z#+ )Qv=!{ZmL&[;8*]ɽh#B܀e>܂0TgaCnS~%,sDQiy ّVvUvWtIN; S%e`ˢهl% x{ra>sy莰 X C@=Vi봶G!nس_;b#;b569ݶ*tfޗޘs{vJ 7{:V-Ӱydk"AƳ7= 'mj QR3 xŮ)҄ݗ4纝}HK|93~^{(" ݿX} GC{ @oy1d~Lia/׺NSMvPUo \z`=/MJSq%+a=QXIk݈#¤b# {cgȜaӧa ,zh4@)ضzcsCṭXݮw@jg83+4h)*F};.)Z oNyRMT܆i }8ɭrN09aCE?{AG0}f4_SSD)<%}'Sd Yg0YzFaUG `xML̪)x͛(c܉"Dp 8݇*1.renP_+m LwI%ym.(Q4( v+ mLV0׈GiZ8vUo롁Hb{Dl`Io͓ޘ7c=& ^Z9GV+ ّgY  %{ҎW uL8#*e鍉4h'/^^n*x5r=*ucۣ޳l@F-wg}yz='_={h'+sv;7S[M\#zsV{/[cW_L9]hgW1;m}Ԍr.H05pNEQ3{P7D 4cѓRfj.:r/22Y<Ș]Ӡ]9 gdSRz,xT'/[^BH9*auG@Y~ڀw>t&N;`vԫ1j_[DžSrԉq佤F+Y(mf/Xf"%Et"$ع *Vxb7[O `Q=dFSd mM_pґ"ImM%$%"45&W6KR""2ިoJZ Cw@qBU=^à&:-0~{dli%%nCLa4|EkrlAeHhZdWxQ ,s撣dzbx،pI=4P7E/DӞ'̘ޥ.Vb?n' L OpR Kw%>'2V%Zb/XNFUINWfRoE8?j/L@zK\F'7`51`&M<"Ց,~2 LgZփPj*4+?6a"OfRVTHN6ٛٚȨ=oPtyvNEj["PYSCKˍO?}O.S6:00yv۵ ]CZMU.C0?gvgl:;J bm!R}ŦBhΟE*^X.,>A- 1AApLsnnӣ!& Di`5= B/ G8^Л]E ~c\4QG5>C |RQ'A `F5?0s;FsI3mYH Nje.XV7׼y:!0P!g\8WQ=>LL,=πYJ8Fn+dίa,K-Bۇ`!%9#I*%GuDeѨn^^cF%wgԆ);>C/mnUn`Q秤7OO.d;{1z' '3z`+V$1AdÜg9$]zpaݐ]=80լ-[~zmFkf}tUzfVS{jkqhX`ZqٹRXt_Sl =7H|G(ƌ֎q} kH s\3`B_W3T 7=/}_a{LZzVsZT&0",=W(%lHu#=KmIci,z~ʏ[mCvQM4sE-A3DoDڬ^upu,l#kJlsݱUF!1n,\m`;6L g¡:k)z|^z7ۈK@ʦOZ?Kjg`xcu 0 _gMo OipoG:"ea2p_σ2F\Cwb |o"u1.uVNf@<|h1#NmW5) D36_M/'UUW@O`S=<4s} 9=z{Zʯ_Ē[ys YLoPVz,* )$uk]i!mְR12-7?ǓxpCaw΁'. Vi¢^\ cԹC@W\z P ߵVw Nip9{?KFWy8JC?Qs1Hw~á\xT5_>kfT>}V}Ak g51黭wWD䑬1 wnV> `X kgr?y#6xӾ%|")9L{U/(@u+E ջt>f/8kU7|#6?]~Ҧ&HkJʹGtX":77 ffX̫7~s1 'r:+E 0ƇTчB܉quG撡'Xso4ut!^ړlwfL«HFs|$|.6}iS L#fÖjqD6yQL'~G +oXά $4++ɢ 7'gXVe\ӤвjG2WvL49IW[|.&5;dJ t> i!C>fMpl.U+60>:bVUKI F{ҌĀ\Ɩx>eج781dX:MJ}cZؿ87$)D!n@DqFPŮwLI۲b>fk qUUj.^H"%e?pDՆ/h5+ -L/U4tN6y4\cړ+P(e"*8Ĝ3& *Qs5cydC7r v~JQ w$Q9!(W`F+17oިhNpϻm(JJ@|b|NBH=t^M [Y2Â5=t H V~po \%[b"d.AfɊ@r#eF[ƾ1@ֲ` rcFⳝ1?Os+hz FрA7;C,c&ۆ r=u5nHhLۀ#}q:%òE.wû^rbzHzH9pN@$&qc!8^S~tPT|=SM{2A}ӹoH7T] -C(+9KJF2E\ng5#9L61B?-膷;SawM" QWJcaE'gګ 8Wnn\V_(NێXUDSźݕkf}jfFG$0ɍW16}pX%DOs #%ٴt1۵iQisZDp+ocfkJXa!} tgXAmRwtk|YXqտQPp.|Tݲ\7_В1m_$tÎEk["\¿"[ld~F߂UOJʘ<ԝhF+Mp *Wb` ΋72ˠAH@070~!GU=#|Z}$m}:[)H)6ApqJ^È~~qLk+l,Œ0Qd_3. Ѹx&fu:{w٥ .F&Fx(_ٳ;BExx†%=FVwu sZ./I^˰c' qlS@=E!I>`ygвm vt Ӭ,E-_Ԭ_4"[p]?to:W&@.H-w^n|֟4g{n釿'Q~Xˏ仄tIӗ#E~A*l1'y q%L 1}x`zgozeZkeU7k촀~q00Yynɇ)nrjCρ>4F϶LO<3݆ s-/>g<Rmú1*-|~^=v azvZx3*}}goײoB3n#ToVt;V;%|eR|]ѕA+h]f$KJ2ww2|95`nuEЖD':RLnzydu$=)aԛ*Θ3\԰,`=`܇\^S$XgUn/]*bÍư=)5$.%u8^lp4u(v==H#w 1neРw{v4kxf)t3?;4mrG Y.7kU[Xp Pcza_l 3X&?3ۿٮ@"ܟL+GUR}:[gN÷neo*9Vͫ.]|c#s4Y@ P;$"8)'[OeQ8<}((&^P)] Z新 sP_!rhoJf@%tW?3&[",?ة>}G\P G.d1@ᮠj 6 mq4='No=SS=}jgEߝ^. f/{QJL&|q@F5h,˒M}}~}q$^^&BUgZ`"u.RckR;V2˜}qazs sݞb'~`n ,;_$5!Kn aHj 3VF:>rqAQEXq'n\ GjlsOxS< 8L &Y ޓ0EX>۽7I͡Wn4J]ςcHg |$Hc@it69D8';Þu2; o'sv4GAU`*P!nӃAbu#ɏbRh͟L vոMh]by”in"2!+FJDn0l¥^]RP2씫![qm'%w{ >aTy^hK LG0=mnR' @T|#3v &F='-2KE(ҏ2w`5w˩RC9e(+} Vf]f|"/tv,#4{ ȞXN6(FRԇalx4VGL#A3ڀh e E 4bp<9~K VH@Py%5|a.f7 dF[o)9s3O P#lb}k8xgYDsm8) YnW,PXX*?y1G̡*kI_`j0軍A{'sY= +R.X%QjC$" E)L ۟uAMmˏl)W:tR8ݡ]Ebn'}ʠ]Dq:T~_Vr hOǀ"glCШ;ӎ#݁ԁYcUr.H멾bHf#.}d^[Q 0Vi|TGWɭ:}pa~=ˮ~dsהyh,`d#OGTWdKn|@kTJ:Zw:mޭ QAAA.Z_=RB@e L>X9NOaҋ382^l4W}Ѣ܎-焜Rlt- "TGs\DwkuP-;װ;aADKˀ0LJRaIx4riFhe }(1@OWzc"0P2{˟]گ20#ʂ~*`{vCđ $$:TH_/J4?Ez4l 3a=E/9ng 1ko8O|38F#F\#Efbx]4ezyJ֦w }9Uc7,ꘇޏ:XXx;=hvS/6yW4z]D2`N^2DOWY!]ʍܹxpT5"[N_wŁNUQj1<++|vx%p` uash"n 6?&i11}矌7H`"9`Iq1u=sb63[r H#~vpHҙ-M)N 9ǩδ W!B<'5.:(F[dlb–5x4PVh;<Vw#=V q)nf+Ⱥkɲ흏:89z<7[f^⎰&1aHfl}隣:~]$(m|5 _U:Vch :#s0 O{ê7yYG6j]:a/U[}n1ݞG!ׂ63(ݳ_C7KcdzNr$@N]vxD(W5S:T1..2?5W u_Oo63OʫH͸/JOP['PU'{:R`b5;u$ K:9vӛf'h>&x,Zy/89I?@3nl /xzɉy PR$|t`btFwm7 "ӈ ·ʭx6Y6#l1S`K>E ݎq! 'rv=UC3ZfCav>u \Qy.:R\\aa= ?,l¡n*X~RQৰ:"vOz2"=àtX~9Ѝ@LE&?iLầzX lpBu3-~28%4SjQwba!l\R|-6Fq B=rrSlWOO)9[HgklBatnA:c8rJq~aI3?qQ3<2~*t=hזLfv ][2XFIp' 0sůɇ|8$cF/Atq!>ކI>j~jZSR}%R~o:u\\IM^Qk:p5 -'8p)R_W62ĨD]tF ?ф`Ҥ!zV&AJU߀TQ̡߫ROZ/wn4}7o=}UĽ)#|#^pf8tiNM`~TvIr1Bo+ yp`hgf5JV+4Ƈz/ ˦`Sģ m ݫuipz3#Á(*xRwɉa#5A+) 5Pl 8,,j߶BBe[Ty rp @@#0I!$iYj:1w4TIA J}bƮ,zvϞF %w;=n!#^d[@QQ%3T@ʜXkœNaC@,tR5&3'HyEp)>M,k F+^ѱzS^EW IG^E%`  مL [u^AD8MC) `V1aa1I,6Bf>PtD8;'~r%,__~NN Pĉ-4w'M@+;vk`0_xL juTԄLk_]ZCb>= LP>:Qv:`܎Xvͱy̝YA wq Ӂz|.ZMz|GGdGD#F\t||GI\ lgpT% @_uiCF'|IFtD 晍$"La?bmvˍޝ7ё4&Y@ĪG"V2athF;/sh=LS{=dC0ENg옘QXuAt pX:<>75mq?upnfC??|F̸k%sU:?71 |\&6O7ll4rFv7FpIXA:'! lx*e3Aٮ>g. >bL $4H"6N&MbnaI= +ezHuaϘpS LL5pLHְ KP4.wʼndPq:(xnhUNn7oox$vӫ4a(XS;OX?rs`s:Ox_IX󯁏}- ~-Ot%7r]w:MbAoäA{-y5|9a>hͼ52m[Qjj/bg|-EHQ*u ;v}G##|\e#lĞF38V#XguHhH'In!1ݲyq>u_=%J,zV(ij^;6VcAvPF J'Ƶ[ޑ zUr1!q5W(gٯOo39.\Kka0H!Ϳ S m=8A77S/ad<_W*'lR~l<"{xщ :LU3[t[^iz>%FZ1gG:wsnlNȴܧ`O.& dSVe`fXvsuU Y8 χ̘ӝ ld joܛQl#04a=ix+p[=68ՓS=**?B9]KhoG ==&,:*i`\i zP pˁ p\Xގc41u /o@Mr%S1:Sjx`w .8=TU%FZDrcP석0q9O9⪣`a`W_@۫ITJH{TeśuuF_.^<U(/bqY>1}&$'Q^zVh=G=l(wu10ζ_?So1 ?CW||iֈګpLr{CFw{ڍIGGUjn*h@y2өa `sI&Ov\|ȡ|o!6]~Zqs\ :ζ_&=YS&tԏ|1EATS>%)NQk*iD1¯d֩'򁛃͞B;/0~ m5nxZtY{ Ttgg*FZ< 9js~W) 7l!a Zy >lta/_>1%{uqÿ6VhMFD8{}*OSqKQHȹޝa1c2@^utFѐl'StnbO3?2ՌUEj|xdz*~"xr 6Vhѱlm oOMO6zDDo!;Ϣ7ge7,rg(W~dkyUs1QC!PmOoqn[sCKz׷e︉nɬ#M2{o\6#Yi_3qYVy UQ~Zo`јL*١WN /l4JYoPmT/ tK8dkfwW]6b㛮69/*deԥz="}9'x'pF`ʠ_T}amыo-}{{[/yKi@iz T]mѶvlˊ:(zXX#F PNwW1W']?D ߕ?u0Sڢ{_{S{D(;P3:; ]N~85~@:j{ )k_NgBq (rЉ1*kzS#ܮX6 *+FacgZC>sܾl1[<$V_#3wL&'ںUwb+*ʧV}6y~ 5e`W;#D*|D|FF{sǯny ;y*γ2S\ze91DM}w'~NC ]`q?jf b{ճFG/)6Q!EjB L`GE>[~q+td>2~~Ü@H_hy=[UצȕQPN"īUdy3b膷q>|8ApxvI*+']\Q/O/:)vK#O$5i,! W|xg/Ǭ>fCUF xZ zR~aj<<$Љ> 3Y:U??:> 2^%`>xyt%a?">jM:F4wIO䁁z>{!,K0sM.|T9H2EU&(APn~G7.JOx;ր2{w}v}Va(vdr?(FIWDЎ.FYm@k}~J?mXI>vz=mǼ1b|wI;n \zG9ߏ%+F{(|lk|'qU@w,pU.w48|w]3N'q8*r@յfK]S0.V+d.j9)WѧimR!zosQia@e[P`Jn;֚˔Dj_0NVE, S&f<f";k}ffbJs4hDy SW]kGkwڱx kHkbS{BLK4uЯ tMPJJnהk|`Sz:Fk8ʲ6:E }^<fz{0xMl,cJ Nڡ%W2xCW | wЊQ,CGX-GI/g᧻dW#_a95ݛFz >M# `Kh>bpnG}m=@ףkS끦#$deDσaUu9ɹp( Aj1Oj|!6uG"\z>FU n3^G^?`t>Jg*ܑ./ib_׹?Re=n|TP?-lL* au:^=€8AD&c26kyyH 9B9l6ao9#rֱ Nq74Bڝ&DjkXk̹ RĚ2G-ధWDƛ- 5~M,9aF?56+1ǐ4֍O\ /ˌ\X{ZԁOczp@P'ըTU )}6a)}n__ ^Y,`mAbHڹ777H'L$+P 836SŻQQ?P 0:F~<}FnvRE2rl.\kȀ%{ kFeFޖ'LH:hyÜ7͵_L1@(/o8i @uf pL24[$(֒E?& GP`Y 4fNxBӮ)V7W V6(Iҿ;$6<íB,+Wѿ,򿅅5`f<>8_VFh'lȏK4Zx{$xâ_>tV <(s7b>R>TFep+NŒcf捜n(%![hQ H5:yvcXi :hV3EAҋy`_A%v2#sqO6qF[t˾#'Jˁ%Ù2ɍ5㵂J C=3rMAmݐ ýW <9<(Cak796~Z$w~tJՠB|kWm!hnSCX6e2<򧊩4Fh@Q?hsHZ %Z$t#d H6s2p!hH~t2$T^1QkAxBQ{ %؆Y<P崍e^>Yᚮ g8UY DIH^žVRE/Ź *ԘH?MXH,Iq+mê>᦯a]mFH6AڨF?-sx\bxfA0Wx0Z̜Y%rZLjs^/OMtY"lj&\5󳁟 ^=~,γΜ}k8.fUfv-tB]D9iņA82c\1Pf( Ux` Oi彛*. ;^8lBKs"QWK[0ܶj`T1V100W /x}T2bˣ01[Qo:Aj*G\B剙•8EM5C$HhXܛݓpg`q Ee}Z ^$hsOS@~t w^ }De(tRFjDDp2T2ϭ4j׽Cb_f;^Sr ffõ.N4pH0jW Ņ4iѲgQt]Q| f ߚ,[='XI] ft|? `bv&k[=٢0Qp{P5n;+w$w.j0mf~k>DY\߫^Yx gP9FTXk5XX Dpmw $_uCZkčj77^($Y1R%[e{@] K+y9 #q,|]hN+f5jjѺ),+8Ψ!{ `P%7Т_-=ՠ=i^F0Q!AvyqÉ2`:@Ώ~.7ꘫv4a휋#aNuW3Q qtusDu48-ND+  m4EnnYIP |R)!,%72Di_ 7sqؽYcbT,q$uA_G(%6sX,\&QĨq4o5wDʜ[lx,E+j brJqۗ}]K$޿'8j&ݚu{ C $u.cDὗ5QAᬇ_UKRΗVIPGa; ;D ؓ;'qhx)W ¸|9_RUbpnnRuGcDH2uϜ8ZOK/=A̲`l+K;p.XtyՖH Mjsqܐ0j |G=dSB,>1mÊkΚ5s^eG&:KNY~d;JSa<;@'2Z `{TYw 䯝Vm;* n4] *:8bj~bim_׏t3~b꾨Fl 煮 ZCUF]zxltu8 #Rbua"?r4^7f\ ZY ŲlYNLd@U0FPUJ@suS-Z_mziqʟ9҄+ϡ;3J`/N q[~cqMQNq?mq 3Ϣԉ9/O%:}U3Lɉz핒Z%g,{.#ϯV}w5;Շj5#ߥ8kMQc #)p1v|ݰ@u,86澿w_GsNs~?~땂d+'n0۩4W4&߸5Eڽ  /1 xXk$n\ 5_%izlga ؤnBJj6T<) $mV5Ƃ]ܞJGk(< 4`J,㨰ALA҃зOexT0A!ܳzxȅk=m뿒h0 Z@m{#eʪ ~:.U}+c_Cd_j! #UŨnDuh}gu)!f L?ݗ׬MPOPNIª[חK7X3G؍KJ&27anMV屶5b]'?,Ml.A7^8_ٲnjO:ZsE77fÚNP KVC`%޾mQ풽K<8uM"vm37Oϼ53J|8]pYcu?:BG>]>cI12GPo 55~{O)gT4:_r9X_c#|r9-+14Z$m-^1G!w˪ g%΢~xe(xuC-(gOXw=/[:mF^r $+0$TY 46%Y1#ԫH4;HD݇fL&jY ~6ʜ7  >IITvU*рӅгt/ j)8vPJ^#͉كSŷ(T aA6W4T~|y`Jё1,*P̊4O2nYo]#nrk^`0/͵ ,_U^jmT%l-A#";&yIq JKϩ_ -. xzԋxJOKq&> awΛn7pq =Gp/VlMg~Z8~E`f_45LF!MH y1&j{/9S%{ 0e3Os@1|gj im kj~YaM~qQt>^5_.*#3Z{cK Pee/mohL_/<}\khzDf.\72jP1:K+s/u z0 1yР;逶QġoGH҅&l޾ ?S(\ 3a]nOob!IfC X6KH_[?AJmJ;|˜*26x~H#v~̾ ,@\MH6e6T)nxȯV(!c~yXb(XHJd( w҂a@1[9:a>lݦ} Z88-Y k7wM+nnE4xѯZiKvҿi}>C-|N}qqؕh͜/+/4 9ZJN8]~.e䛧t|{7 |1 r2Y jf#5[#kFk7Ľ:Yg7Q^Ct& I2&3M|tp ڧn91uQu+ 2Q7٫܍/oD .aa @bFM3aFqFxS@\mB7ɪf81O52A^ۤ7㑚Ű\θײlUĆh{؂ bRM)GQͲn2&y|b*&"KNxdVMzCIknTF9}Q?f?vBP]yLnȾ^DcB )#-ܝOjr֬{i"]12,id + .֔0R'h>>/y}݇Xtst)t>C0KF(o`µ~7b('(e֪U E)X::KϤ7}-^{eGM)RW $ΟM_TFlj5(*;tAqIğx˧j{#7a /]>F]׽?"'O6\}Bm~$qO{W,QEw*캸g>DA<4(WA  `4 6<b?r@ Ϭ܅$,[K/a΂VnB“r3 0w(O.<5Am=\bkhoֻxL/!U.ݴcӢ%:ߵpu%N.F񢝌Ez'viiyW31kc*Y&CGmK,00يǗ̕.aiߨ]Alo(B{n^,D:;O,BqNt=,'#k:)W3]{:W Df<מUKvgi+ʜ.dUMID&t5VG$X6Ig,ei(S*\@Q \$XO7[\5"X4[gC\Z~|tes*w7~ë!^?Y ЛgglsIR," @RyZ 땝!f#+5+H9aq0jUHŷzQ@<)(uԞX #s*%k VjG!- ,BUpc6AT-04@3\4Jjl2@F7$G}2͇|u>Uذ9Nsc֊0똱xsFNeO()xQt3?]1_x69ݙY:Zy[[H3_OYÎ9D=R:1ZF8{DJ$3=A.j{\Pf׭J.r[N ą2zA]zP DoF3dƤ/}X9x1\Xjڳ'|hZ.AoNWj?|s w|78l @(bGʥI[ U\d==tϓ/g~`(fv#S]xIP7`?M?ӫU5J:UVJq͸F?&kNa;! zP|韒Jt .NlܦQŢ :b,s4,>>.ZD!ob:g_k pt?FC*$F2l02U, o}ƅ؆6>,Z]]CX($gZIk57!d=q릫Su/a=YSV`\8f:нxŦ7I]^]/T}KWQH-ۍ@ݟt⮯ R^) 9h,K%'P."Ee55IT9} _p $ITxqּzѤzP;^Du9\Dځin&ʐ2U-j(z$ TTJQU̪5=!]=E*Y۰vXU@P<(}.|Օd*SHTo[GS}(8 îߗt_Wkxėw dBNMwM'd׏گ^\OJگjkg5h@=#RAsXKrQBԆWdHo555Y Us ^~JѪ"UI;W6B8.Ǐ-YiQ_I5~Í灜{tXeu 5X'lJ]A/QOuFh)Ž qjwMj#ZM?A}(\ub6px N|۠-lQmU 255]o-$v*uUjJdϙG(/5nٛM l9~0L3Qа޾U@FO.`݅2YvأSY|&F f*->Ne*AQU)"5r;Wq 0R|Bk$wޑ@„#O?8{,9QKLu6:0'm3S=;Ffi.wZ(mW`Iov "W~ѻ5U'/i5$W @hgǺ>|r#i81CG7>qM5z+'q9#!fJ&>"؆GC>wKlL}X>Zק3/)Qh7Qx St-$س2)~{"Tvl[ٲL* GG[@;w?Nd |d4+bg/[GZ&Əj/߅Di2quOr_0q =KäH>co +M <@vҏmi" 6iipUN=1 Dl\ooo#P> Yy&:&>FueׅCcy8~O&8z-SҲ\݋ ..Hiy$bQ)ӝbov~2N t?Mx{P}78"A7@OaT9ݺԪ_kݯCQ3 3f=On!,ү%wK=ph⁕}N}Ol|{lt2qU\x;Bu0aK:N1-3x&"Jy>ʢ7:>9<94qWsx1z,p:^ | 4ϧ17m1 ^0/m 3όr/఍s䈰3Z;n :{f/v>U5]ٗ`>SӁ}Bo \I㩧 O y|e/.6RhG*213}݉)aڠ HַX( bMP0 ,8Pbn!!4oz5Ep; k_ƦuO71p!ZTmv:d*nXr"RDjYeIaL;c#*z!Թ~ ao(o!7K PM̎G@q֒˖o~_y eT&Wآom՝P[F 0>Voa/J: #=oj GۀFV0MQ9B823QTq^Y(UQuyQ@93fvlY̚3|G1sPuMpo<{nnh>1׎1 (zqAГYr UkXXՒ2j}8:MkCF.1vH![ _'hGH2Ol;3{)w]Έ|;l#֫VFE*8xz@~0r<~JYa)Z,& rU]gm"p?cv/2sgx@;=z)¬HK u,'4Z;VA E &Mut~KPJ([翓>9+lvLQV,)ŋʿpu{tRz??O̗زO)6/||=:|=,h#(PV_SlGNH~f^[;[1a6lLg;ۼeM֎ÅW}X/"T4ͬtDP߱le^Cs@E X; 3~bù<'.6O726X:tdc3" }LG"Cr,*doR~9ί!=ċKzvTr<&9r7%~cđ`:jtSAl\zD|jMx~pQ D"O̽PxH.^-PXaa @Mg@T@nVP^̵u¿zS}8 ·ud/o (_GG*Iku7޻ɵ7o Ff/Er^:⽉̫hB=sؙ-(@f/n#yO\D^{&\.izHm4+G1׃ (zp/Vy,&'RoS U:E7J]uT?Ic8iƉ3']"ـw^f܊Jñj:T#zz5"< ysC[ӁƅUe^ u;f4ֺs>s J+֭^-> NX#UvY'Db>/ȗZ @^7sO'O5]oNg~4Yae<^ab۞Ԗ X4(ޱ|,PEn6~k${dob!K#?MU-"xa SuЫkV~/|\QM0xTseOA[/5TWc WAb塜}z TuQk eF™6OIp΅,RTڿ. 2s-VVEFQ5w-^52{Ԇ*H!cSA BMamzmPm2BZ ?z:^пJ2"U J+q+ήv.%_Na6Tz!QAB7bsɚsCswRS °F`MQxq׎n:˝&`otꁬU `S`*7{wОN-4eP5z> UP +'r8աU> jdӊmAT̉˕I},B.:TiN\~b xk dů}u}U.Y\ ʊkԤڗ%c aߗ_&'{s|ƌ6یw6N:u)ɭ$K$2 wu } v!FI *aupZ*i#ʃ"]&2}y2/v wUR@NZЕNcx\B\ 96K0nr'/%\Puo5ӃS;<tIFCoX!^tMNL6usaP7lppp9]$P\: Ԥ hGņ^`EeoѸD^=tWMgӕ@зcmnA[*{`=?SP3^H1rƽ/SUy7ævna:S7L}}=!H#/"1:`?B/o=y'L< @$pE~XfJ?jo)Yi?"*QAmrq2z,;K|2Pߡ( jANJ %6= GG/G.(s",)x_99c=.QK^d7͎F;go!:ui Jm޻(Yg&|33J$tԘ38<( fJSADs3u]WvAXOl/V;EiO1y9py`u[L l*9^?WƒNЖ3ɨ߁_R`4$%j ^!pZ+C&6d%@ ?EzIEd=49YSln/U֎",s7<?6 [xECV~>0$f_#V êBC[`E3,y}Qhcu0wDF#Y݄V(ZTdk9P^ʽ>w v6F5كևa?oѹMA/ h Rya*Xޯ)V֙_zkl>d.ۗҁ}(td 4fÓgmS4bO`OUW:~rҔpʲy\1Fw1Uյa0jJ_ ѤFF{(Uu;$-_em+tNQvAmPfr~ފSϲ}.x 2rhvI ?(1)a'/TcdE~t,q8 1⛕ txm55FQW~5 60+WᮃxWe:$UNf Ʌ?]IQ-%ItP'gs9{Py|j%uws<5ǹ)nI%LD\q0U-BiXǕ:pmY;pfI9ĮQ)ln=S8X~ 9} 1V f #SofWÙ;S^c)8_53fZóڽB?|sy뙿ƞI~}}6N&;sG{u;_ECgpTpU¼ĤW d TG;8*z3Iw#_/}(tB񵈺%=&B?qAէH.5bެ/hFNH/@"aX[/Ґ#^欷NCHg[U(jjKH/XJs-rq,;txܯ]qcJy:cz\2֜{J" 5@:Dϵ3gyރ(KjHO\͙_H"M96tp:m<~hLv XkMs=߬#s\)f@JY~^dZɘpSI7 $yF~kCk TT81:l@ٌ)l_93@5= @r0t y qVڹwa7[P+(^*G¿h to!:m<7C[e T8Îӿb{ZSc{Qgf f*iկ?zIv@fo8*J?E*+ yFq-:sa-NcߴȻw}rbAcׂa&]d/ֆܦyH 7ApAuj3 ?H~U/,H2NRz})ֲ&EiiJx: mX<Wr6ԐVfc3@I`7T#*Fl^9FcyHnVEV6b{"l$&յ_gWZKcOV)QcZBTմ+2~#At$i PظnDom#%[zcᷘWh%*~R%-h& ń{v* ,LV}vO#n#+GQ3nD/L3=͸DbC.@Dri܏Ao(%Ÿ cC7J3Hq"`G9)W>YHJLn.ď$v}ۙ?>L<d ?o6.-&83AmvwKS$3bvolcO@dN.x5foagKS: 3."͏aɬd9)`iAcn^NJ3ʓ9U59j,CVimʹYI0L/&<"xWM2`Yc\not1 i f3V|U{-wQ!$zL==4D}a=Av384IUEnqpeyj!x!F~A spuCtl!.nsHs05yFTh 2ؗE4*~TJU)6d?둥R[E݅~D7\*:q ?lu -*bpq=bPub P@vr'"1@}t.g.mBMW~Fg11@bx%8d5G|Z֌%+U "\WAtƯ5ƾn$H1(y=7D|.,+ Al50x%+{oDH-a8«}\>Zwe;Z ʺol6$b*Qՙ?.[̋:!KxQ}"D#RJQFaA5]po P` \&uzLqOiwe*< uu@U~C|-\,BߞG bD0pIӳE.ʔVXǁw8 5)L2- J/ɥ("n(>1/&eU+'c bE[O>M_{X2d< ^`ulbhau<=!l!vw"W>p$0cȧH(z huU@ebgªNM@*搫S.n8:<ʗ6\V.:2_{Z@\RNטܭ}IS,8/u`v0H}hp9#Ȏ VJ/Qo~uW9$(B,e;‘QeǣqRPT8ab0I[A_FbZkMtc@nؗUx-7\yA@a$3ߏ5ZppR)Gf=IQC:H,itUG&2o/dɍ4qbrbn|pT7^ <#9^qyb!㭕փ- ʿ}`7`xnSvWo\Xde>x?=o?$ũa1R"(=e,*.poh[kO e5c[7|2wԝo}+[΋HwOmr 0NAR"Hk{g\D1vVȋ5m;{޵qc){?V:Nh|g2 R ȵhHE!J ;QM:$@W`D͹pZ~Gi0+&Ϩ#~[oW8c' |SѼ y˭_:xg8 M&F,/ 4!mxrfVfAh\GUNL$#Cq:a;R3wp  ggm3lGs.H)1.(C&Glٛ6Yҿ_5^)R1L+SϻCn~=r{c)r \_*W b {6׺ff{߃<ٴGK=#"pm`t(#{D?wp=>zNEG n6R1Ok.J{לg-{)~n%2Ϋ-[u?BD5"^}orRSt;|5>Z߉;*RW#SOyKJFg/H24JM=A*_hpzx :7PBp9k.[zwy0y_]595ŀoMdR-oB Qd xAJ%F%D'2c?UO/G;%&AKZ9v <>L1| Uc_=i0Î󇒖θ Q= GFn a&"k%ݟ#'f)*(NTf8lfek ^M|_ ^'A<@{|L<:E;-/>4 58`Y'BpSw@QBQ`W?08 .i8p3sQ "3acFٿI{ &Īb}b^K1)gf6eh^;j1JOL_Cί籇,gRm~ɺMh3G]~}>%dc< o=k>q룶&ekG<-l Y? !Ë)1XDe>.Oؕw:v()쭈=#$+۝mp.+>gKy' vFWtjnqQ!M9ٽ<Zķ 3V b~d~rny69鏯t u|nғtЀN!JcU :~FlP ?^~>Xs!b vs6'k,d#_} ThXA#xVG>Kt}XAí)Я6{Du\0jNV_mU{5^h@mz.rZ=-9PstӠSUU ڟװ4FBKIP#݆'ιJ8=f6R5KQT\hiHx^(lU1QKIQ+=O2qy5-;%=(RJ鮂hD[;ciZu HW!.:W1 jOȀXRCd 0sڍCEn)l8Dgȇ[_5>!?DaRGjts@h-vN|D{Q6:knTŦHoL&]n*^.Mu&~ ~ Ee QdMޙ0XC\ E@qFmMR*hxn:gT%O>mXjAjFM:V#%'[R5 FjM{cR\ur s|ƴ͞L%P*g?Rݰ+3Ja#.73\l=8JOd9Yy-Qz\cΎ/' xrHFû||_b.JEֹZ58ґ=I{T>(@hU0hp ƣk|]i|[j%>YTj#p^L>7\Px{]Ďg=`Nrz6x5@zB4tcgURgYBd9Lbrg'6aVLzd|Jr"~q|fWnG}=UXOrۣ,ݣp.-uxqd,{i;zf0%:\Kn d9 u>PDKٲ}ǞNP@nO;RM3!J5MN!TEݲa|^яͰ˜lRs88 *{nsȧ"Gs1S9sAfhrmN( .U0G:Q>t[W;L];k SSRla;ԁxs.|ˠ{=>T|L˘Oɇ'ǚao#QoUMSС@JqN˃u+rݡr kxߏ|<Ŝ CY28E2%;zC+'O?H*+vz}FG)&cMY:-䰐nF_y^ y m32³͒;N%zzܮ{f_Wsϧ9tvGK_=r`#(=*ɿU٣hޒ$l\/]-y¨۬Sq,Or驷\yQi^K6 eKc"jthS|2wӪ 1LU2> ~ s\$tKɆ,$ K߆\Li{ z,v%O5Lj .:[^ :P UnOvZd$1?GV#r;T~x5VJ K`I +ϫgyRkgH+\/j"2ez:#1{~"ǟg7UaiGTUA ;Y} aPMU5U=.9 _ډWx~pG*!Bw zYlt lyeUL1r5nqWw/}Nus'&5ݤIjzO:Ն!fl ZoZ)Nn;_x0v tN"ԩ}nO] P$kC_$mumzfmy9{E$.}:lSZBɞY wL-ſ֏j1~Ue~֐iaK6Q:P*_}x_jaHEZN=tPSt8+/|-gQeO((dSDoV}q˷;pe =ju6x#{B(#Lb4LlR0q ^ Vv}.\Ѐ}>B;Ԡ ԂۭSI9.*9rtOULND*-Z6޹QbR-$eEm-Jddڃڼ/63G<Wb ۡ!cFУ`\E-޹8W{dTF9~)L%f^ht#FHےw6,R@¹SpcሰǗLo,~2{jHu{ -F ~?C"}c\յbE\%oޤi?h%)eׯsnK? ի0ǽ r#CumjX a ϶wĹQv%Uxckol~4kIn 1NI |wbfO5A80 /i҈xDO7rNo*R=|}X;·=QOìH5QP]ki@ymf x6J?r`ݤZq=AÊrf;gH~y'7V%9U\<vUnT [@u9c@5FM(6>AzۻO jZ82[wQ+)Cx%c OƪȮx o .4n7 (^л}" `rܞMv԰ƃ{w裊st7~̑h9αbjndcM?KtSoA㏉Yߍ?6^znT(FҀ^ ⹪[]DǍLSUK[{D*;뫽%0VZZ/myGU5rJZYW(mAI^@Nytmh(sɣs-{,Xw*n4 umb.h7d `QؒuB%xId䛐z&g0u'o:"x)L.{YUus"G6^W!retd,*/p\u݄dū,!#i- 1 R%NPy]WBZq,RQ _C {k'}/f?PV] Bkx8;W"՘MsV0- H*Dd( &DM#.uoFEn6]|HaŤ׎D.g;<򉟎gvpY֎ez;ԓ{_$%߾Y?M_i8&I\f Qf-/ 7TZ=<9X4c2'ZGUB!Eo&C_M[YM8Td`8̡y~6=Zh [K5Qg8B ilNG[ >{LAӪ$\Vvk-MƿJO鴈4mHҵµ;2 4kH9`$3fh7h4sã1͜5^Tso_=O؝ωW&_!EHU&%rQ Zo96TZ)6:i}Zlj-nZI+/&4ߤՀ4 r|S4[C߁iͤ9H9ෲ:ZoNCv7Sg3PyR喸?slAؽ׹=*JU'Jʪ{R-ލh~0yJD|Zy/0 iײ,85`!iO7 uf5/7W&;}2֠,5 9Nwb74Q7BN!/#r,ƝCW2uozmȿ<5͚=*v-Hm!_{ f}z'+RҢ5^cj-k70H\ oȝt=Y689p%p%d1YuCxh[IHfw1P`7ah۰սkNQz9f%Y:̬' \8M;dT帊]W! `ꌷp_S~P푛| a.+dwyҦXS^͎3H|WN KPhGhk'۾ RԻRo5v&Uv3P*ޏ6S;tי`՝RWUJ@8f\hv.gklg'0y17~ҽuLG<6UN_" @m xL?dW]ol JSk!"VqJoƕ$&=xMR_9p̃XLWODftov #vsQI$z Fpr*6_%w8Ps,gz4;ZwSDGܓ=\'9Ý *!bkQW-@!:94s/R|^KOGOlP.0k$nVt2npY]HaCw/o.'n=o}TP:A<6 Ǭlً,3\$*Gݎ#l7e<5Y19sA:tq%vpv|="njt D4꩐`ș^^!ȏ_+6/-_M/<@狇ZЩLda Tpf*?"qNDSf*!yVV7>6ty6vB4*~SB𻺺|k! g k:SuiPչMf3Gq,OEi+ ˇĕ>ZEl8#2z(N켟 z\^ݟG;mΘвHQJi@2w<ӗ%O#RaZ%ɨ!irEt?x[֛$|Jb#CtG{,. MNH^]fyB+D^KTbě{{CtGN::(_mQ99\3{<8o)ZO\t!$9cxJMDOJֆ6gQ_]xh::d ]9qci2SՠGiA[N2n+^y?q=^dS cK;> :5;RM7tߖޭToyNzYb4j鶪 ̵3ݧdz؂QSӉ;Y_c[h wBkTlO,}@K٦!4j?M#1cl39Qϧn}_v`fUi(ۤӐ8Ԕ'iV y k3 p)p;eFGrxJ῁wׯWIwTaԙ''@2t孳\ |U?m> fm@?bHMrU.`EWs|HM]9'~b*H͢2ƅEW ^{^"-@4n)hRv {Zf^Eg@Wy`5|o*)}[~yfOJJT9 EAv n_5>MW1ڥ1@Ok(a H;8ӛ”J%Zl}IS,:]t :{LkarkińYZ\Y,s: 1ؓ'n)7'0($z8Z9}jS@vɪJOi ? \صjby5 9Et߆ҁ] aKdy(/:m>WT/>˷iYR(~7͌)Ԭ̔\2|.%87lcgz ֗KU.XwZaCn'?M/f}K\ߊʞ{74^p/FSA,sG upݸaU%ao.y9l<-A';m]AN^H;/7_T/ p{{jL#&+ﳎ^?_>-0jىLU֚]0%c/\60qE |?^~"@>69\:g!ɝ*@5` -.2toW@TEׇ`3:kv:}c62)Z?"I3 PG [nuex$EϢ$Fd I^9lKe*y@Vރd{h$Rx2/adUQǖLM'8CW(T |APKie7%9Pzʱ!eĵׄqbز/U>HKW/2@4DN| kkjoRs׺†k.#J8fcz)'hWMğÆ|třFit"*JEӯ/z'`#FBgŹY:휫L*9j &=!{ݜ=ZCI>fNRd&(e&;sK&:#`kbDtݒ>H-:jC8I|s-$c^ԐE^[\ɦ>r2$&\_44He2E/פ˿> !4?&xtb\G8򨓚/JZ^$0,BؿJn:{prAYJ>d6SȆ|9L2rkHT_hƶK,@DBZM_!jkH9N(w'w[WM{oN<|A%y3ggp @6jv[˪OD)y$輟L'6v4oxFMEHJVowʊ_l6~|pɦ3 {ۆ?I!g+-fKd mƨaBUuh~ָJ PWUEcD"Pa;G[:W<;0B$BV=jMzb}i3rpJ[NEU_܈xEMݠYcNah_xa(Z4XnjٛANX4Y2P1Ĩ̗.#|S2' Aꊹur)NV@D;n9lw )XzׅlOmhz7Thz twBcIU+1eR!q9U62"X?(-SZ>VMJk6Go>&~(~rVLe 3>sb_8">f8u6xU? Pj: Rev~@,տI&k;*TLj⫪F іbl4pFЫ٣Y bjq ύz]0KgFgEM}:'dyy3QN犊!.Urf?}g6}4NRTD룺&ke?0v@վ7nZt=q*hԬt k\kY= iL73C։!G/ 5w׺WC뭦=20G3^3`fY:9V܏BC\?!* Bbs~a-4o7Cw@B0=t!rz2~!NQz!zPVnX)syk)CD B ,iG ʢV [r(-#Vd;`@.p}jjGx #6ԉAkUc3ֻ;t?n|i1^sF9F?fd`Q6E{HVzc+OcnE "GqA.a.,|Lz4r|QK ϛ<Tv^/V"g`&(γ:{b!H^SqFX #/Ʃt׷%)b1wۜW,L%]cZ)Qgh17֝{Pg=MyQnZ߰q+Ѧ@$YL}?>zQr-I~,5aB:pQZ`\8NeO?B()LVH3]2- DyBYs,1!^aK/X_+ɝS89R:5}Ӻ? F7,aN1‰/gn{Pu?k\rƊ4(5$l'4%ۣ" %$mE ~Z<&˯ӮzNUvj-A/w#x[vYrkɨRrO$=fz"9;sVҺ#&V,M@D[h)&c/Xd≷2vXǿ}/I@qOwpgWoΖë++؜m9$gvXHUWj0.g*X^GP+o1Aia~wC+O~6;6&Feq6m&W+x]͞;qDpa vj ד~Xup4C]fpMXT=ncCCs)RiE^a2.0p܇&JrR 9^U& 6}:@6YYI"8EA뻦  lUe児W9|!։b+61 _iϋ}w-WRdޘ][Vf_c2 :51:*`R|BY Lbl*!HkjТdymՋV, & *WU&˽GKqeȲ)8^ڝ㔧" uB͍QDك{CCj_ؘ!;&i`KVO Ӈ,`mvM)ʏd4{tvڰ4phimh8B[#67P|.(*d1q Ȍy$r;EtP+4V>i_(FM6_Ǥl#C v}.;  41IeN= rV~B,U@O `V'((t/@]%]!;;á<i;^Linet/,@bAˀN'u{]퉝 _f f._t]]V|3鰇dxxM3JT #x?UV@>\Nvg=kt[^|޾in37b<#ʝj7i]]N%U[1]*[] 2 Zk)O0w;389cbB ԕsλzR!pu{)5:42܂i#+ ") m1P =5WBج SuΕ~a@蛼R@>}ߏױx5C *X2X u[aXu bfv=c_(A1MZݻ]j@d]1;F'"{oT@*ޑ9%Ϟ3((8D#±BN|{TY;@/ Lnw^X]{M WݵO\ڹ+Wި,TeI,di._̦MitÖ!UG9l8ry.ü1CKDViaD> A vI)oxwqVGq"5E!'J\]'hՑ&1"_t)ύ/,۳?`Dp`xၲlJfRD|.Sif-d"0CBSz(' _EB>}90~%3"vydA#~9dny*P?j‡  @[' KB`@no5bBW9vw7]ـ e@RCq/ΩM016L,k4$D>b>`5Sq^Ġ{*,¨C5G=^.!*(< zqp7ds`[e;nȴFGoȳx87Θ! tr7"Ҿc d a1y HU}(Uaq&L]]#]ꁐC#O"Hv<wja9BP#iϢ%.(I(TO*rLL؀XX{\'$5G[^YǬ's Y&Gƞ$bU8Y1~#]Ί  Hz/T]s9\g{A".Ɠltg5L ,aaגaݒ9I^\<`) iWE*Oiiʉ2^h-1[LhG [GFtAKhE\1{:Vy;C]Hknv7Qָ^}Λ}nuHccf^AB1szȍ4W -`gWJ8Ɂ]7JIM\PJyB=!B2X0c ֧ޖ2ASiG#@C}@cM )LU3/tBilr+p s8}+Ho/K c6wć[b?pMv~Obwxc^Ƕ I|*yKQF4̡@j` E=tP$IQVz;|#O]6cz*n0Yc3RF,7" #ECy=b16=cձˁ )le6G䥋ѡAqN-, NjU늊i@.ԴBY&LHwVm -VQi]RdPYwm<8ME;0J-M.at|t!օٝcpgЏKDA#l C,u?^O_Y$a=O9-vNzzek`vYB);4p`EHTXl-HQ"{%`^T:B]$j<Ec'kNKVtJ9c=`\Y] ϱm %~DW8G`5T 5iV-Σ+a-ꞙy[bX0Vp#'=TyևuY*jz[Rq˽BZKR|ie>|٩O.vU9Ȏ{n9`eb:rl,]$E+ҏJ %0k8YE,l9]| Wh)G-Clr 97| |G5Aa h,ȾEX^ǂ c9PO*~ʩ? xfYnPYªt w>0GBBL[dмCTrķ=t)>x%3 ݭqLl4}?#7/k|ӀB1Šİ HlfyƉGU/ YXHF$xKy[qdPM#vRތDV3QL^*Ǿ0]B~bz0SK_{,o?dV=Ec},b>68TR9ʀ!4J ȂIQq"W@%%gF_FFolzۑ{Z]|d8JElN9Vb4nY)P`\TC=` Toݒ_DN&T5Cs:)40BQa{P/N-03~c,C&'U"†j'nʢs+ ҧ&#HEu)BU))GJzNr HV eBg֊ H%N`6nT[q"uMpz19цzR =I6Oôf0w2eWɪ Kɴ0 \V[NQ$֫YۨPeY !*?C5$v`A/~Z0>#ph>4&z;d(d:wWu 6IigT!Z|WDdxQLW+U=-t\ Lι?-of A-%eieƿ~^ o5:i-ꡢ}ʢoٟTvYZ&4Kiq~*m-TgDK ]$ҘrmNh[%:'曒3ᎢuFUxZAFYcA + ̐aWAPy`lĘ+K~O|2; 78.kZM5 9q7(wnc&.W>/tcؙN#g<21_@v/pnC0,*KNIȠ{e,R5lDjvhƗ/S^Q^r~1_`fL`h-JiJ?T4{,LӌnmaTF0qق!r|`cL5uF h>!zl,vet/)3u~G"M8_G6͝꺓G!,Z +Δ9%ђQjà],%2] .'jRA(ȦCj"7On0;Ƭ U LΪHkg Qpѹ\'趉~s4P_% cOb2ؑW*^>hGCf5h,_"7Mu0􃜜I3XT0-ߊnJ68a$kԅFFL,i~ |%&+{ 27, ҥ89]?xR-M:T_T_Q/†5XPfDž~ň>!8l9J#BL5G9SU^4~h>X MსwEHRgPWE0[t"\ 䴌;QM $9 '7tO&,)|~D>^lbvB٣N]ݡUᣵ ~!{) * NP3dXMFd3YvyZ tigl23s^NS9SQCK1k/Vmom@9E/7cMhi0 [*@GppPaqGE(d}muun6=y>upb~ Жl1@`s->,&iգ4h uxemnpP*N)WPbT* 6c"D-#6;Ɔ:(0$"B en>yva+~!LeMc q#\\-1tbc( c~ȓΗ!߉kYMʂi`t˚zDr(46Gڭ2 B@ޞφҬnSR٢l׾E8l Pζ[Ymmx$R75YQ t?!` ̀ҁ'Bs$287^05*~%,'f; t+rct? :cْ Lzv%K6fD4NEվ!\(hK΢o_Πh{Y1BOٗ rAfĆčݾ8lq[7xէ q<tmI?Opf5\/?nJAxiQ۬>hSQ!;W35֣te ˹&m@Ӭ)-X4o(`燭*H;kv4MF3>M2.}F!0(3p a/A}|wng 2a24FGg9>D l!`OU d<'9Uշ9ABdL|r7ګo57)?1d9N,wUUSW,˗"rWU5"~x }HeC'Kԥ'<Ep}XT}u(Um|CN[ig5]E/MkAx@03+??YЍ@I+z,ܜCs7A 06~zPYL"=H?6= B rX8)l(5 qzbYh2Ysr`2rn2K30OZ9VDQ-\B;_:3[8AolMӝCVvK4W, DmCr SY& _:85r4nѷ/Pj%˼NX/ۦ)2M7 A#w|z ~Oid5YhEB%v5wL$/dW\ 6HyEg(fp C>A '?b ƋŬx1wy++7ńuT= k.{I7f_L~EnA_u 7E-ѐFCe!F 7=ͭ^LŒ@kpEZqؽ8 ݃oPIg qǼ&5gʏ]XRUy\ZWM)O:%>QPkƞu,= kcfT~ h\2_يvwM[n>uiշDŶ &ʓ~v4($%QqX z̬EGS m~'%CI`x"M!RS_L)_ ӢZK<|꾮/Z0OaʉP>dl `\{qdO|3T 넋_+^c騠av-TH#`]a/ HE_wp}wQ6,7$߾<Z䗶9n\Cn1Z:?kQm {ː{s:F@+?zwB#qg7Vto>t8;SBViN〪/?ʷ&_5 SC:z܈U#Ͷykƪbf϶Tx .J$6m(D sr4 Y[CT>y6azv9U]Nbr>3n_WQe ;6XC~β:3')5ZuTT[gT,G./ bha:ӆ.+7IX]e,3\suIl֣a֩#B ,rJA3~4(j~Gig=ca Y˓Ϲ|M,Ck.v!E( q28حwW N͌3_.UN9MQ(ElE\&8!y/ўofof}tu^(vtʀV@i#_a5m K -kziyJDI΅N; \.wCKX P;N/Oމyzuig f[y`<= V勅_&*‚d/^1o+6*.*ą"hް;/t6z%.gHu A&AqE˱#ļAtIJ]r)"EuV1,G'z? ^4zYTR ^och Id~QXAd9{ǵQxؚ/&DV]g ing¯"\a|0O ވ7jzCY=>D_U&/ozgUcBs뙢+N?Nڪ65j5Z jKhWu2`R>1jfu~!TVhDM2qyHB b輮zp|^)]rM\e*Cg0j;3> ԇ}*疇tnHUFߣ`c;^L!o8K 4/ܞyY߬><:T&:eAPWgyuí3zu,) L6  & ] j$ngفYZA-_zly捪,e*hIY6f\ ъJ[ F8VWvBq4J5:TgPcK;:%Mۮ`hz:1&o&r FN+΂wRx=ڡYY+' z2^R;QfK& u-[8Snn]@ɏIb[al*@Bdr>luߟ-ad#hlVh^7Psc;Xh tbm/ wX߬)Q`ׄc3 Ȯ3n@i/w`N 4>\V83kcVq'17˃%S &%69v`lvԣ+u^&4" >=s]UKkI>Q-.g"|!ҀdpM/W u3-뼛:W^-roeKS!v5i ⛱cy{^CKxg?$1_TXxRA~S|NjlUZ2$NR70=@T{~7O0k<4kN91|n(^ +_&Us7jxV0"@H 1GT$e]g*CQv5|]+p|"G¨+"Ľ~)^B Z77P+|kT<&(5QͦƚKK-<;";'Vãdu8[7)'aV187R;q7GnUrB(>'J Fy l9,_Ǟ`Z?DLamcJNn"Dz]Ts H2?=tfg %gFy}  ^b^2_#UAQh8$k~qի75D%s|@#݃Ժg}N<ޢr*P2L{R+1e~,"=_5Q@\ VyOMVEKR(AYo'F4R?rL_( d ieK`f`u,Ye_ꢈ/S;},VsWq2YlVjg[M9 uLVn&UjL=dwA!G 5ѓ  ߏjBps`і zly-M ġDwQyzUZzo@"UԲKiX[aVjczʅn?Y+OmV݉Mr;'J %R!;i`>eD_YّEIh :C!I`E+A=^lD˟@/ʓ]Ah/[)/TS/A!KHΓDh2jj\qxmCގC2L}gW]ZA&2 XAlŷ#C~sk(1 majagOl@b@8eKJޘ~/NF/+8nX8{pdImw}3\uvtX,Zj}ƥ{A[/fqtAKm V(]ʖEj` .Le-|y\0|@xı!U/)~P6.XG _O'Uj:RcPf m_ gdQ<&"$zhd ʓO>=co&*5}J;U#;KCvsX=P܎_p!NUoYU:?Uy11Q-O1uØhiW 1dW6\/˻VpI[Lդfp_r&kIJSu1NCxҰ"n ח0e҈T6MG./\ kgyc%K*¬f2 D&w M@SeZ|,'șwr!-+ ܥ .Z䙐d ';Dő}_" OKF3 F zu `fM{>X%^{sY,;c$ M?lLS'_D-ʼn L1w=m]鎵S"(IOvwGa# `"E#tY[R;+}6Nx'E'4bM+n5B)@n>; R q[\Ů'/SdmÒ'4ZR|,%%aj*>]ѼI-2)y2J+]i~Fv7#[MN w//}!lE{ͥ0؁b!5 7goeBf\wrnzNӪ˒Nkuܿh{R˗eséq(i vd{n[xh@>^:l޼neB} a45LT iP=j 7؛Ksms'oo.͵viFqm󟤳C9R툓+|QM)ۨec)k ?3~7=|0\+% ]ɾ27=6=|lR8ZQD <9}PY0֔, >#ax qo-*QvPVp\?&G.w!'dp"ba$[.Gٵ 0bRWxi%_>`V C[azI&.!\OO'L8퉺?3N̠<9I ,υj*39XF%_SUS)@\5 v#!58ʕ"y@>nrBt4? BGWJ嗭B=U AN^Yb(TC`G^NΫz7˟>.vw9poL9hgkȚ|vٺ@?@$d9'[|&ba<>м>d觊V 7\t/,ri5U,aqSR( jVm-8/Z_xmYa5U?3q& QU2 ЗW3?#0,t@@ɬ4 &1@oHl*'Za7M "2j( 1W3exM!i=k=[xY>d|+䂑y[-=_4\>̵Ǩܞ-Zl%aL-a]R`L7Vd"cHALWS?SkШy}R,KZ{$orsk#+_XKlޓoMt:8 "D"#o>)N* ?IѸRWxç'6d\5_?6M6$h_(_*V!n" "T{t|tt*z#=-3X:;z!ɒ0wh]SV$FM+}"D$fRz3? [aL<ƝN(/t#d:1rMWfBD=7 tePd _;Ye|n1o;P_=]*lT>-/b&UjOf#Üaֻ} =oGh, #3T]ʌx .}2̓co4l#Q^PRx;˛닊*SG3W6zoL1B#@,q`X ޏ{ ޓJl*TeU챽[ђ%oPyu uHˉUω!)@4QlX#?SbRhMEVSnAȥ@ tØ*f[Qs1UF  #RcɐUr`2U b7NE-&{Rt䢙5a !BJϓM . Rq5#9AqIQ/*wX1*]| 'cp~V99 ,|_c+-~t8qA syߛYKozcV_6UdZ*qZr0рM[_5TI3/2})R9G~u[>Cͻ9QŇ0GՏQQVfi "nHX̬x#J܉{Q|0li׹Ӌ=UT; W2-=Jw >S~'nhE4D5+!G>Iь\_EaVd9 ԦE`B[]4x{fL?EVO^үO g"ٔ? fyhp˭hGg y`4$H_zKw8ٔ|ay? ZPf=.hUYa "o Mm?,J\'aoEҺ3  JQu*J ^ N$K%}Z$,\t$ܡ9ECɻ\l畅eK$/p!gs l)]MiFCs#QePNl 2Nvb Ӄj$ @^4X;"Z;;@g9w\Of+uWIx!..:'7D(IT#E_ȶSY{3V\5KH#cK6a!T="E&7OP 5#y?9 AI^f|UgsC}*2 0-`x+C*:h/EY/x[ԧ 531l}EbI K:Uk{xp>)2&n hiS ]wa[L,L(KS#a={osiFm1| -l]T p9yC2<-_f>_ԛ%軑BP bg=OTcM"9Ybӥ֒ySH@41(}L81Y%Kx- <)rP"541M)HMB*'@%ЌcV_VY,Mڋ@ATX{~:$y)0#Q+VRoQb/2V0{ƀ5' M ^,([:KhC²hMMY*|E:0>~xYt8륌 H'l]{@jߞT#GYJ38냦q$?Gs WK5R|u" v9V~/N/ W拖+t fle镝$h7 󨖛^+!Yʅawyg^^p(!&9M5͝43gnYQ)}m B*`XuWj i,HѪiEl#bEA+u\>x m޸GÖ+d+k2@Kq/O{AO]7MMcjEih`Zʹ\,h ꆑvA6 g, +C~ M]Ż? fļXA?H͟\ ksL0QcL^*ViF0v1HPe1"OjX{@ T / KUP`P^Z2@7ɕʁRY'pt=iU)]1 lExO~?f] tC%Qv> Uf,F7~n?4":8Et ,ȷeKb)A@p+ Ѓ|"3k9llUOˡ2pߏtazDR=pCJY9b"CPfdQ^g @UpۅE'rhZEfXSM9UnOzb  [.M c3 n\r_& -YYƜ&8dKX'{Fjڋ/ %!9@ |vޡ}_K hu=({JPE)Y5@E\w`"ǡ>!Uz~9)1!|yֶUkK[*Ӈ\0 #p P2T^b!6%M} vn ƩV=Kǝv*<^Nf qe8:;,GAf'(oVyS6bKlo-]f% /Xt~vTHؖyt*'!@ oYg<̔,;/@~V67j:`Q9ܐ?8d7cjRbp/F1<>|Kx@kDP$@KF#TDt*jǗWhYT5 fy֢NE-:VcZLsXew 1yLKbLPu0=8业,!u]'6ɼ ĎM )&*kY>HyU~:u=GQa$+w>L;3ynfWY3/JՐ mg3tZv)L9 0'Ԟܣ݁ ?s&*BᗨyLȞl) HAߓ%`sJK  yO~7R~w<pu ^');[VdHb4F1N_=DQe^7o-*E!YE[d _;IC=Xum&4^D\Uv/R Ue acјtY_X]Q@tQWBD`1eь{}#vAsT97AGdcDg#BjiG6弟,ҷ1-DžEDj; p"l7`?X \h e'~`/|R;*ҪhdjsɪhRlh } flo2D'ƌ[[P|.|چQFt2ƴ2Y4,,*8@obcۗyC|M2BKGU/``1ʢn_)Z7Z]١n\LYW>!*:/TxT<ѝq^TlGSa\̗~R%'N VxPFT9ԏ [e/wi> XNSIb/qV875Ā؛95FMu8Mt7f `‚ E_[0c#s\ hh\h~UU1!b}]MX;d'@^7eۜ1RL$n' qCT NV@"@Į;Վ'{wj~boFA{!Bay@V^pwE;+Rp+bwp``_@CU> x7w23wCCy3+sUCuSMA/=.P5h9@=M2e,Hr0h#5iR!J04lYojhcR>?Uniiʴtːc 8*:L6o;ӔHc99-#Tdݞ&#U9y-ҋ?.0Qo"W=\D"˞ħ,*mJ )AC E9|a9R*7(ǡvḀ!+8=fgrGD%\HŜ[lt~\Az<ygvEh- M, 9;eG'I"9' '8edbINzXz1ɸ֏BuFSh6A(?k.+f};[U c'ȜxLkO\l Tqo@6l=O͘|,-(|YݑQ0 (e{=Q1_(wXjPȵftT@23a.`b6"2p"ʇur)#7.Ofx.f"uP3ʶVD ]&)j6w·­A lBlܺ̀&A1| IB8J6 '\qdM81cHfiC?mR`yĥr> o T ȚJ"+P>\6f>lƩxBO1H*t,]SiBL>?͇vhg oWE1h\pV# ,7]ת84lnG<2UuIHd"f#t3U4x`<xن*wjäHdDn2A*p 5KɈuR!uΥQq(?FCk ٲ݇.%?vRG& ҡHr/2EFkn+lS[N?Q8*]T -Ad)Aa!+)V؁Rt}߲#c!qhppr0T9M),fr<&O |A3??0מenTBm,zS8}K~;9Pw^,gp٩d)Dua7-3PTQ[Q՟ "W?$<a^kB pef$9Eߢl]:PӋ9{KHvMpY-*BKT2{Uж 6Lld`l+Fre(uu`+dQ]&#2҅d`G!*(R@2^\hعɭ@]uK!Udӑ~[1  45*qDV/PuJIc+V0-g`tWw䮇.0%֤VI/q7+o Y+IyE{= .ҭlQxQbc@+k[p$Hǜv@/$5.-[a|Ǟؗ}-덣9kt\x7oԓ?t N%*`+p=l<])1cg STtrCNc<&gGz??- 75f3uLaZy ?d txCYUzdYwA!G/JB@=KC,N&bcG1zD)S^2p+z$kOBD(7OsܺQ²\(qbG僸Kr'Tb$ڨPk)o p`V- ZKggfKneZσe;]4sZ9µU}xn_MU cnsY>bDq8ޖjaIۧvu&w-+;z~" !/;6>hӤFƋ@ۉ$D~ja%8iWv]pn\4^LA$A}\ 9sh˄ gV; 1+4d:vוYŞ5ʱqEiat): ϿL4 !J; r8$L}(So ;;uiE#+giaVs[B?*%0˵`zg\ukrbҸI #H˖3yWUk[ U~L8hYNoq) uo,ɺss$Hc>GmH4dރU939ĵVʓ j6ź#qT.mdrnpn 䚺8!y.v;Jg0 }  _<[Cؚ[^ x^ť/ )VlhFi @ef o)ͧy9ifQу ~,@z5I2,eW9݀$ jhx>g C0K ol7۵&5D՛YI'30\TEN.6LѽD +/^C%po[G_kFHO*h]ѬrڨoFXNxTA=X}m.R[pHp5M D#Ͼ=@TPxrhtm;v<@3COKkKpNZT`o(;|}P5-f- ^^0>|`gs< jl AC %c4U{u؉)# otwScq"؀9f`6`"^z\^EwG˭ XtnI]O in@ FCK~bKGPWU_HIU૯+s<3U+dRm-˱mq}.(,:j5Ѱi!B&a^#>Zvhc0"b"fioTJ\&5B5DW>C4UȷOTS\͓"}ҋ%)U* 9vtb=dfQ!Zꢮv9G 1U(Tq4.Y?;$l' )5;B C}g\#ԛc$,..&Ӏ t,Fp{O`f, Y1[`7Cx@ejx0"].d9Q'hIa o{yg{aDf~e zC󽘁Y2=U {otIOh%Kb&cr`s'oKmDcj.%cG[5@i8*s g8:X@13 EYa]g} KYgK#VJP̟A\w3yItMivD'v ,?,3.5޲u=7e kZ$5QYj:M&`rۊCOO >uNj[xtzkZ1ZP4t|Ǫ"31++4bZ]!x/ u d3$O1*kk- l<'@U_J_=kbDq~jwTO[Ot[GXٙ{t`V>drN\雎xqtZ:1"K%8(r*pDejRrDX93:UoZ͇Wv~(:7#H$%=yZ(=aT:JݰZZ*[ 3#ǔ D+=֣ 1b'6>{fL gjY> \B\ѝZ݈H5[(J # \ 9Q?:dl͌c5X8l#XB[Lt9iW3B>^ROtȎ/:,ɋsm(U S(I{Y$g~HvO"A(9+G;RH\3Zypq#9M*@c5O9p~YK sa1ޝ쵧嚓2{="=.Fl4_<޺ޑƲu:\3{Cͅݷ].d9/4d-clF:;^Zgkx|UO9`pk01ܻXOBv>oA`ֻmgRKԊzu[?::/\ũKyoE)V؜ ך !rn$vWArOEͷ$yfyy BK<<( gMhx)q䣞NSgɩ2B8caE=$j:NK B:]fJ;7ɔ\ݼp9y5%{hOcz[O $;{7Hqb)hQazjuZO2w̫G0P^)W+rzuzxqmC skK^erf|bxg13-+ 7WhA\\ W}z0p@0˴X%[bِԌwo{j|Aye/?Iܓ~X$ 6E XwŒ [1 fiT,$l|U L=-.lϒf =)KT*KnΖ`=r!p;Ҁ6"Z(,V^XՋZu޲˚7sp~NکvWeosj[HSfT I-x/?<t%+{ӗWIwN -NތɍȲ.}_]p6~UzʕS*.|NJǑ2HXwKp(@aRu9_|ӻObgfB&ɚtqv(;8S77߱gq>'xhx,U}59Z:Lj=%[z{ױ[v3p bOy kky1$Kz—Yɡ}9yDp<#R="#IrP.[J(+ q &f$r8p_y9Z$l!m;/-'p8\| 5$iqh h<=!8XoQg]OtqW-nEUg׉Q vPAaz,lVcVz^']=a@%/X4j&=-5*&/syLjfHO%C, $LJ1'7beKΑq*WpdYŭZ+r}B%Z/aE_s/Ua!VV[E翰*<~&sSUmEt<)ZқNU*"KJWn"BDHZcz#>]Q\C0|ckCUC,UźާH_3tU9ۯZ>(G dM M5j7Z":&`ƟVcE$0ۤ?(Tۨ%& Kij@K+zӛvvBBzý}<ֈRgqMFjzqr2qRV(P6ɰI|r?SAZ7"Toyi#fIhܶ2tUrʁP4} _sf# nm_TiB-YVSN`no(LX`+1'"JRGgLV^d2G Qқ dvuQs!EA׫ ?[Sx+r-d o,kf YxxU.. VA༄9$$tZ(Ok[ݑuѳOls "' _Q 1D(/!)>ݴuGRu6.͎n}. A: nrSj`pq"r>(dOɜf:Gi/{(HL蘧M`U} g+XLg'M!Xo[idq&R}(?tCU_;Ր`Ɵ5{ w8$^m9 L+M+wgԺ_Nv ~䍮|}SQQ!#|]=FgRE7Ӳ|< f L=.vX@c;KVݪ60,a$ܞcќe ΃d ]#BnH2Pu3TSВ-vSЏ:rpS(#3`۳b{f͵N&2SmIHTI4uxwPUmzQL tCY&5B4BYiE'8THo1&P?GhHv_^~Vi}}Wk5t=K'!c2|y-ľ*C5-Φ=ypP[GSp~ EډNU &$:PI@1e(+Vbmn-mf6f2xUp1JXŁ}rO͖O9H[u! ZU&ku,sY8Xc)4 r@ӕgkB)pI1r$F+ڷ8 eL(4\m9T*JULںLL} ֥~"Mn[ǐVyCL.7[(oru|2nOBcze9(u6.qׄb*G@ݱӤr;;݁Pze -e;c^Sf"_ c]wXXT1Vә# N S gds57*n*SbLT[pLV~ŁcqYyn]{3oZ^M5۲N~fZibO` w u|'r1V^ucVLth ykPvj#Wh2l\laZ Pt@Y? 3.0삋T|bOQ(̑k$d2z05VJ`f6&Hmh|ar(lw{%z`Sة%óB%'jlyjް㨇%Iϻk\./eX0Qյ֖*qt;m!I'3L.!j4ƴneJa-;ݡG.Il'{-pYY\&K'] Z59΂Y/y&tZ"^e{_ٻ\zV`(cnWUg)@ql]HgHOxW6h<nzo+=;Le&O@[uSܓ~Z`L.p&`UY#´C0asb_ ax$z2QGFM 3Mn7ݡ920 nv#86V{ ۱Ekx\3AYt . @k;;g; P w>7*ٱ45,emOcyT{goZ/X94Q͡Utc`;Ҙ[܊UN|&טJ-\'^3^~q X}d :7%MӰ("S k7vwsT&$36Uczcc֢ojc|밗\}swQ޶Rly~b,/*oDWj)xKi п.q,\"6YJ4Q+~ SfaɝwBaLQYjg2 ?:QPWRDQC1+f kЛu Vqբz,g[9<@da:O"<e7T`mj ؉O6^C !:(ɜK$c'>Lh:D};es_z—tϟQPr;ߑo1mC.Gm zX1賸'{`oׁ P.J%&A]7cGS¾˹xU=:&kcdPEs?Qav/2p@ӣ]˦:}v{gEe uNr]/ u}3q (n1Q]%Z5֣>~yݦ{ZpT;^dn*Hg]*'t{fGc,74Jm2uꇁuAӡ)aܧcK>1<DD˳ 띿Zcȷ90|Ǚ=*Ja?Bz~cڏ:6]a1>dJOAr *c=0C?Wp%$U$3jK"=`fMW=9a-\ k)ԋQ;SLbMCiǺb!KQ-f!|zKTue|aKp.@ ߀#2Ibϰ]̇Y D:RmKނ꧶"gǒ~zCۿ˦IQдPmP`'v uQKUEspy<4@yA8QvʔKGY~gRHT pMq=Xҭ:mS $3pɀ'LsmN8)MmE MGtJ_h|:4( ґydǼq~]H*Yf)4RS+zPlnHGkZxHgNt[ р$"KIuQͺEY2KK}F^)/SDyh˧'ϩ|7W疜UnѰH G*Nw#o1yWG7Lp(&:tyxk2$uSݜ4/KwhD|,}('C'ťa (get*1u1)kJfJۯ$L#'%[?R5=w*Go_$ Qs 3_>EYd(e_D#(|MckG9>E~$%r.\P"\pK&$LٌG-<v*KIr=X{GO1X %T'eY87Y:e0z|-_2|(nTX]MV"bcRDCf/4g;(qK7'|G?o([h'tqhx9= ~pHA(1&;Zlr~\)7ɯyϭث^ $Bpn|^9$rߓjTVAEC[S[u:qi,v5GCvdiL])uǃ#'CcX2uI6[KNF*rwRS 1H_!x.XC[|f\h)/$%?Jʕ]l9ꔝ֮ͷH{n5A 2n)/j`ۯQ5|5#"$E[PI,+;5D6>rE`{WO|k5U=sؑ&*#FZ)fQ#ܘL1h 3ԈٷAH%D72;'ۋ+z'ghqu`cJ;RW)߯+ƃgʃgQ")jAkIo8DP_?fAkY8bNOQI0W-'u$Z+oi`[*⣬^J̘~tsg#W%`i$>'H$q8raBӾ<ؗ kN>A89=MymDV2#8P1^(5r65a]r(Sfiaza·Iӎ9u5iT?[H;'wma|(}Z=E:+7hhߟk_=1cJ/*)hʎQ=z ۦQF˻'z;9m%;A~i{ZV۴'-w0ss~98 5rQGݢz}\{\gsqU=y^-iv7qru26Fe;w]{o_47){l&77NB7ޡ>}AQ7a[rjL f ,69#1q^؛7Yaat`"}w6A N64_f LilQG%>?G1k}`b/ݢi7;-do6ŵu_a~yu.BU[<fJ{/&਎ԡ£voL1P({YìysĸUXTP+D֟s _dmOKN9tC#oM'zgV h׏$♣[n[V!omwZ*E:Њ@ZQ(K[DWjQ{I!mM' uC}$\AjfͼmLnE`lUZ7c. '8~;.~0BE DS_GS=41QR-Xy0@wʛ*z ѷ6EyDdH7JNZXr@oM7ҾC]wQ8:͞N([f]݁濍$]Gl1gJAjF9 z=Uw/XتlI׿7o"1(<R97L, 3 wEh}ѦQՍXLۙ^W,<ٷ$~&{AQaeB1!L('"~̝%fy*Eɓk3E0, wuy3=ac!ReDmH-Xzsp É^UpV7;rPƜ(kNCztk}cyﺎ@w~ '`ؾfs̊ubH(kw*{=5{=1CeLI|jF煉O"oM?v&'WG~[#`+>flxdm754O;+c"srȇ>?[W帎+{[BdiRՔdrt;'P/9ťSu i-Ï~G&0?~f>| UC1;]9@UJ k,mCT d !o3 WUp`j\Z/%QQe+iR=gtCߓHBea.g RtML% [BD 25>zAR ŗW .!'k5c.{dJ]LE RYZ1i5B1WSNPv17 g@՚.I@Y'`oVO+SN|+kPU*56%udz7Q;] 8N*5LLiTtbc 3 ' Bsg!K&evQvn+ vNǻz0Q6Ve "qC#L96/ϲ79kIC]2[mrcd jz@gۛ"OfmiUDFMdݹNXAwf1S2й\0I Ɋg42j1+.WóEl^S?pjSz7VrSLq: +uAk-(# P1~ۦQ4Ncd2$ B!bű"}+iy& ǝ%47] gf0H%f/A NU\uumzL =^uv; LW@gf6Yj#ݾ3ݧC~f9%m`#/Xu5 aVGJͶd W ?8_b' y M9T궼S5_T VCy\dn'Y(J aX;76ӛ(j}=Rn&L~3Xifm2iǏPڡAo4Bο e2ٻгBh#[<!% (s#{Џm yj_iCKlwVK0(.`Lb(.H"*سG,*58{l\0@70'ĬXwܤ8X/`"UTBįfC?7]Fd]aD6`vv( oچ&?E@>Jws֡ۤx1o*χa֬2f[XJrgh*x_O`a8tQ)"qR@Y x~VmGh 7aNbĬ>r2aHYdye &)9.Ӏs˔m3UP%-nsr7?6ۺa 2DBS,_j3h` so52v$;5)^2+ fOhS^(bdeQFW17ܴ݅Qw ^ ;{ڛ5=>sGkX Ӽ;dySx ]2 373kuXU5.ULg .ŎY=6nmH) ue>-8 <6-=lzG 7󎚾C&,XvHj\2-ű [#ܔCE'&Dn-͇jCE9*JM 'CMV:} CMXaިxqco=sZVӥŀ=:<"2^G=&*{wtH JfʧY%f!>98u=ԃ4~>F}%r@| HeCC}tEG8@Nu(f&r6v2w@]p#T9XgP:01botň3AR+w,@b1΀H'TC4qLkLN[+8]$iذZH +#rAmoڸ4@7(m&tg)O**Ȝ8Uۀ+)(}51x{iISY~rz+ޑ_!_ {<[c[C[W׈x ED_d,)=6ͻ6spUkJ,SsJyՉ[LFW99>%Qpvd)@Smxf )XN<<uIOH[Byc_s gNɳ&`_51LH}'['z4a|T`Pۅ̏kjz-~i`/l I7BC:7R &sfeBu9De=9rmDfer.A>#8]4ka`|W8Q[lVyKVfBտtG#XO}3H6 N%ߥ3Fp{_ar$ٴQc-[\-߱I8VE`P. ĕŇILt K~pj%a̧ڮ1w= G^׎8nAcZJ0ccgJݒ@'ߢ'E3lܧ@ڻeIm2۳T{ϴrNɌڳqθvyeёp+}uѝ3מ`vG_ :=]`4ԌakL->P=j+ejW Ө[.fsL<0"KP="8?1փ+ϫL4mpbb[eu;uB|>%Rܻ6|ؓn-*:Σí ?Ï'>@Ez{xrk!qLV<ݗ:~4̩gL*LcnP'[Yv&:Q >c{O}$WYg]ߝe4_v4wwf4]3~3gfC+#΀"5Ju ;u^x<>coO!ֳgh9q8q쌓j'T:byNjK'7D~>률s׆SMѬrso=~o*F;>iTY}UdyN1V=nOs^PPbN ~(|9ĵ|4V/N;o8o0}kEU8{qJUys 2;e$atOJcWT¹|p+%bVЪ~cPX}^98=gp-فu5G\,0绽7;e 5E2k3jEOF?Rmn}#^M%$>*K`W<̺m՟ZFz d @S,(wmt&M{Ɠ2|qy3>6 Q#5i3)YQ."3(b5!f}`:, @ K[ѕ pKrV@CU0>lmW3S;&rN)τf7rOޡ i։8Cӳl~łL٬q{N매OOS>kY@pc'ɣ@g[c2ɜ68niٮ<4_ԍ٤vA: ub0UFijѻ/~gIpaA{KPxNd0֑aBxe" .y*Px7 Iw3$6'tΙ +-$f^=7M0KøӃ9pL/Ζb>;C^] 1 aZY?zGƀÙZfJWa򑠓hR07eNN@GB lMF`7N_+^Rɇwf .с 柵Ǿ<*9eEn2W'\xBPwP`bѩ#F#Lc8wKs|u\a,_nO$&zlJsqwڕ9 #p._lc7p vUT!0NW|vs?6~-.Y駫`~|v_Q'ƷA=&8Ԗ_xV4[1]?.KU`6׻8<1b BH97سBɮM T!fXsǜ6#k?0G 4]N]W!pljHO&ä~tYPTS9aeǮs2{ Ujn7]n/>`s7dm1nJwOv uaC&nּ3W*_FM2Pbg#YF9PBtt8<7a,BcNi0s&x&i+qUӖJO{˳?<%u='2o+PWŮv j&zw{qnS;c{()M+vd22'O뉬Jv_YV\Eq&%[hStM*NfQ@ WXimZcaղF.Ng]&lQsr;i+5!E[4vT/!Z"|ia\>̦XOF9:gj(:t$e<3P,ԹwR-l%@%,'sBY{x{Ռ|awK a ' @N Ɖɮ+J7ʹ^:-o ˻|=w[̄ᔺӫ5 t6B^WYRUk6m;=4^Tdb{lbǵs>w8vJ ztQ(:f>ijX{-,ŰKn` x!-%Yyq8 \"֤":.w#8t2` Mބ!c/w7%)jIhU1?կvOڽ~1`U#k+0nԙHve¼f@!u/"Lɫ-.+Q}fo*/~?u&Ȑ:=F{[s;dHa3TVa;~5C_R D QƠ)Lb-Ǹu;@1(֮O\[8׆Ҋxq^de%Ww;4CJ<3Jvw{y 9IX)@kCf8"E>@u5pn,3eִd}P;Bǀ[$ptHRk)~$-V5q۫Νhy%l; ۤ@OE- {g'6eY1̃cơqr@l |"4tg;́G*a9jyl߹ !*vnjhRfTS3R'oܸ0 f guABaU=(:RlPk/9_)MNz*/{aTdZp lCs6kUVRΝ -#6+&;,)tj؞X(\Y>;!+v 2; P4N-M6e0w9-^9sr%+>wOƏV q"kYQˋ>B/f=[vV٘"b} e.# @ljbCW2\9&eahPD8xaHU`vYni#ir78t4 R7Eq^ սO<R3] шbԐB1J-1,LvVI ѽ,eH)G Hھ\ZV']Sn]1FWl/G r͜5}M7eNܮy3>Lv=m:W{l VD.Z'v( EsڲjO_i֏:K1f6f eAG.g\~[E=Z'3[eZ-;ӭ2q;F,ҴLh.J9!TfW*>Rb^@bULox!>Gb}rÓu`v W\32F݀BpUN<S} *"B:?!b k_+Ey0F 3_oJI:T/l+LI )a(B"Ƈfm1ԣ&@^Ă܃{ 4ʇbkQm}#f[N ڠƌ]+!)fPe]m#}|C(VĪaw?T^tyV=3_$TN ɛWD&ur5p &/s{@ѯqv8]9wXtv_tPrJ$\= f.*Ҧ)@j˜ s{%s0*Eb&Lvkg5mYE'cvmHBӿn1J.YXW!.l\al0<ø2Q6+@o\0e\_Ķo/t֐rJRe/ٮŠ]C/^"LAΗMׁAckdXv|62O 'GV痩ɯ7~8?~ij2;$bmA b ,V5ܦ'~(|D&\ 7pYgDYţci_GAChQү$O Y Y *=LmXL_`_O]No%氍WԎĥ3)iPߙb俍Z?yLIUr.I~q_û6W{?5  ~QQؓ8`<O9@,aU,fpmN|oCgљ;Cέld>DK#E3F6p uQ1Dفon8Y{%[̎ouphq~㡁af 9(D2մFZ8YNzpW;BQ"zw=Fskr>]gv "a\d3ˌf^ +:JFA }pEiu,  s9>2i32LحBNӈҙ~['76Iw Y\1W? h?{ M!30M+^J$N'<2N <*&>2΂sP~WUF~C5|?MX&pu2l zWUlsm wCC9 ͜9i-ݿM-~ kfΓ7lvl,Ý44r2 PyfJ: Pj`TBj|de_I@MdmXdшvnNTpIʖOٞ;4c1/,mFLW'ݿEт9I'S[aj1q$&[As@XcKcp3cz+"Y7%"/߿\ة-H4.W|(aBCq ~X;RiQŋi6Gdx++p+#{ ul֞F yXa}hqtKC+c0u _0i-Cc՘49\P0[1 i;'Y50WaW=iyܢ<0hK0~,t7jX|444))1cRO.vO֧YhUB3^ $go+ ~3X/Ĉk\UeJ@֮\Pgd~nM$QD@s nwUKӻk4iSBQ?x)/(Neߦ׀c L?R4׀?^+~󃠍VJeZk~T~.nF ȇh Tt#Txu('MԊrB{bb/p"( <_螉9/ni^C C!9 Yw M_L3bQ[N} N%7QaE_a^~E1__`x M3'o֙A/k|OJ@5Y+W;+Mw4Ba.ɬvb"GnONvp~󬰫 %V*,e.@!(eHp4A" ML>Z>׏2gXE7d8R eQҒs{S$!!5@10 Y; 5w7uk PE25)Lqv"6n+d:Ny Nԛ­H<ʰqhr;Tv5V"KB_[g:pGp0J';OGf8-}f!*%D.=xOj8Qٽ&2²rk͓Cp+ k''Ծv2.* eY3V|owlFC%h$aZ`bNYm10Gذ [&9ok_-]je-O&)Y;M J)<7؜z̓\^F0eӜU bhM_w;V2tp~.|ZUbtex~.V <>D)sOZud~L)PA^y6`gde&讏&tpN4w_&?4Pzɡܸ"Tmn3=\< 򳋎aF>]cc#^Fk*<5(W~0WRNBnS;Y`g, ky@k$ro61&ֽ/ ߏΞw[ Ƹ}hYfxAzt^q"@ychu[cb"*A}֘F7BӢG\xp;\U/_a;˧3w6՘^󖳪]&嫬(-kqhk ].FΎuG"Ge(@g5 o 7"' Bw˂ E {yW~)OcIę('C'{SH1܃`*UsnS#hnh"_nQU5 )PtNcꪮq[ok?RCʫU<$(UY{pyZI~>ԺuOz޷K^$rNmT&mN{Ӭ y~0iFm06۶Xq[BE}ѻδNo<&nڮ xNg`^(|qjƉ*1^ 5'Q{:ЄGmPZ<-KoQ=mSe@|6-Y!9{sddբهɉW:>]<ӾtrNE,(]fڣL{h')&$X!7"WXom1ۣ\޿'CLeq.Yô8Ԡl.4",5ޔqEx9)s &6cO YPe(R F:;3ƕ̀='Ĺ ~ٝqɹKU2 toɄR7׾ wR˶D˙<#H.a ;5\*{-}"Ԁ[N1woU>1D9s\##&#;1j̱ F̓l+ayx 5cTgw|ɩ =Kb$*߾jAF.%$WTTmnapP!$ڪA'CĝSqk^f]o8{`zxQ1~kz^5-^%>ʟxj}yr1,<,{O 6ӣMcpnsPZtـǩ8u9<T^rkAGĢt}0 { *U5kAk%K'SX@Hl?}K]7bN @ZLuȼ Z-& qfămh"r\9_bh1DW.ftcxQWRa[\SCȹ,ќPfkaɭ6{.i?sW ^$^l1չ|X!~X ?8KV"}96Lчn-ݞ{<+xdS M丒\̘3g:x1v@VUi>b{ЈR!nm_lZ[6,E-QgԺ+G '"CX"%x0 yr ;wwؾb.RuldUhjia$5ع}::(/Ч9,~lGF`3 v p, "'w@t 8OGlf51G%b%VAȶZVq.- x6gxEu٘ PMh  30&Fn_xgr"U)psr}ޖ /6r[J ;hh6䱠0*IB1~l)8(6 )pWXYWW.VK=atvpT~ g Yr>{.=pڗjf[/KE/]&'}$>ɆؐcgElWa/5V6)BF5⣙cIᶸG`lwʭ8cmm[+h\ˤi &^{^b8FrAe@ccTOp7Q0M2Y|v~2g]ЌXGY999I2bRh|P$d~wGٻ*BSe{\Z} ʽ1\Yzes>n 59ī߃}Rf4o+a =`~}:雷gTh-snls6۞DDiddrq[fD<@ko~ = ؁`rƓcSQpn1P,6,abKImG Аj!:aDޔ&fmfQAfTBJ,H~%bs_ƅX|TB7H0gAIGlG-][ˀ٨m̃`nfژ}O=f`ߟ}}ڋ`e5 6ksgG{xL*jь0$op.vj+(Q؜&2fM~j|ixaU+0;{jj蠲<.'wTW52y)m]>TNWtC;o:Z(p7ӻ R}VeF'7n8<޶Сwv |/d4g0ՉdZ)dM3u]D͘^C:j ϡ3؎pdҳufz}YyR{1JWpJyI櫦}Vg(( P(l](~q+NAn, w b|LJt_ur?_\5Ɏw $&~xe&Xp>s۩LrKб|ϯh0˟Uua.Q˟vNſQ!_=9WpNO(7տa9>O_&gٽNސ}f]nEgNshx"Y{ϑ;:#kGΟe]sEhljrH4}{a5qQz1c-FcH#wVhMSv5mjkL1Ύirm2a#W`ơ|D9=zG?{2JW4qyp6-S+8Ep" nv) >J?W FT`F6aHm@}G~Y{fct 6GJtˋֆ-HNG}d Govە=b#z4D2a\{@{1T%{H'dxigAΞaQ6c Qyt8|ßP9 '1yجK.e֮h:ԬG[RlGCn.>I vћlǺӸV$8.ҥRX!9am1Wpq=8?eAO OEs')(~g0yr;VSvzx!Rq]M-KS5u$}vBngN0*ln5B[Hyn!͹ms$bQasYaUc@9;O{Dc@\Mt[Fv?:X{j5 2#iOA̫ª'F<(&Yj ͤbew\j*9 }KVri(ÚU 3#֏`F^=NN^q6 D1[ݳf~5[L9h:oSG3}ꃟ٤؈w.c5v~QYmܺqwkYOs8_vF|1swQwGE2E_B/T&]֮{ܥvPp~) ڨ(&*]ҷnVs?ܦxxb;8[{d6Q%py%rbw YSxb7f,C7Ú1 2vqޞ `z8w}x "]ʇbbnN#"U7딤^ɶ&F-cW;Ѕ?ItPx%5:S5}L<0ʋPǘGZy,y0GA#FuH[_qͷLΞitfH(\F4^jeXK5Jmeqz'KGۂu \_.nl C!/ȩeN1d*1, }NE5 ӿf;3a4}06̹eeo'ۿd&*`H&hw#XRRZ :<Z Ԣ{sxbIHk2i9sYpOs*j+h[kI [s]V׽Cerl"fG|`й]~ٻRw`  VfoϾ}3:RtV-F=s|0Ïr}ۯpkAG*&EgrvS;BEȽGK3ڹYdR]zPp ܎::);HxSǷBPe%Isg]<579DƠa)x)xJ^G wmg@P:<~ZesnE$įf>!5 :bԠ{8`1-wmܢSC :W3W,ka+g1WrTQo (BCbqJip99@.UW>l|=0-9Oy]P86]Aw|F%^ }V(ҕ@I@ PZ^kDЙsA7Y̧ox;[g1wNp`nۛI=5܎nMn <ѯuJL\ T2‘]#/ɸav^dVlpO0Nb<:.*,))=/ hfkOzcqmqcE2?^.Kf֧c/ܶM5)%rCݾS.[`iς1u]Û'~:NF;;9oG ߟ\xs\QK@1}2̷c^Gjwd%rXk`Pf{`b&݋kʗNz<>i=^= n쪿詯$VKDli6l=Td# V g>$|Mcw*͛67 Pp`CeU]q{39g%{9͟}q@M]"\/$K2[BlZ]BNC #\ WÞqϷ E^ ɀ:"1O+Y_2L Ti>췌xCY+T+:H_c(IKM^Tթԥ(/b/rRGreXxv?=9o|%6upn߿SiuW/݌6Q PmA*fUЅG/J/*<"Ê@"^9nb'SWnݖm_"A-w\7L ф}8׎ S۹B 6sԜNNYonfMï^Xe7dEfWo ]?)}?8,%eOq_ ]877_l j:}=7Lnj̟ #C13auDP@T?!%4wJ֟EgzZEϰ7N9%<=P2d˃`S-[gSr#]51ʏDt6$!^`)c 3ckso'M!?9<; ZNIp fVĴ$v |Fntq3O6~.6܏&aZv~gYs6[$uRR믉5A/p9ܟ&b`gc^}<kco)Ki>ؠf],kT]+ ("ڶ2 @mmtN3p#o<xWXg )x3 f4[7u֋*gr#缙nO"(O 95'?W?>ڴR{r%Jn XpknmmNPI ,$d@\N70չm0Y CXQ3Y^Ij$kV0k%z;nyB4Yդ(Q!_֦w P,TG6{erՁ:srv]hi2"3ݹvOq W0QTp/{EB.y(JWwSaR'+?M|q*&3.®(>q8R4k]P0&sH9v]~ZiGGBܲѐm>1s[f a`gX ǽhO#ĝD%ˣ |Efqtva ;GmipXH4T]/4D 2 Z;8s!D(;eŮeua_ox- 1ZdicRu}u7T?dϭ]|X/ۛ4ʖKb6ks8õH#:n?ayzY+٫1Z,MJV fv4t/#)>+>Άഘ%SL1n4e#))AJ.< ->^z6mqHHkL Kb[+?m}R+}'1QqzMNx1[ve!@mrsr?pGbwBɡȺ}Lx f^ nR]R B&^kV3%:!E7|e?J@!'͍a!.9~sȻqPL6ehpbt="7;jTǡ\w&׎ưlgxwCTqWÆO餅b24u^,gSN;0,RJqLJ.vs{q-5-cGCaO;0xpplFϗiln.qʰ!Oչ{t =5A;>soʲaE.9}rkCNh{{˓ssĸ'-oz{ va=Lh){v^\/{[Fe%dI\#Y.;k4v'C0:P9НBV@P@;* @=+5zOEAɄǃC(@c:˰&Z{BL>&=tc %Tu-0=ppcmZ2 87dK48ޑVPsv5ɧ:Ha2)DwbC++=|mNEv0ad48qW!#کD 2Δf:8k3l*'e5ԊD06}CYMaƟ6^ 03YFFN#pV:88K$I#>:'\PPh?M;iīiVAN4d ӆJMcf~ rEth_wɃi8@D?QѬ ,$r^Sm:AA6}-Z22u}p7~ὲV6plؽ 0{#5rn8M]6pP BMr$G9H7` IBefkZ&F8q:ͼ1 $IDqKigOч#$BE>{Nvv5 KC{9Α ʃnAOZJ+884oW 't:Ir(T}:>]}:q/4>v§BvzM;U@ox 8!f7?vA]YiC~0sD.<52.Y}Ű]Gv``Cn ݋ABKS07c_@6/O3O̪v,,$;@h^Ѹ8뾶];di 8)#P/U30ޱ 15#+"%]#>BB,gu16=Ojgy1q8 k%3XH2L,ME[-fB@-dcW⹹1?HP ,W{g-FLWhZad&Դ:'֔J|Jf8a7G"JKP[!얡ݸP^"%S'<^ *Uf*Dtgǡe8"@>޸vZ,=ĸ3Tar +! 'n OpY3>mcF0uF~Y8ZUsvxЪ7_ ep pmA_naibbenzIbf NĔĮUf6nۭ`L[hC GXv:c^bhR ա ?n@e]˦nq ӥ;D1OU tB0c+ &=bt.@XJx.!y<{hYy>cN_XQ_)Ff؅p+Ltvp+5&dUG`eCE#-ݳ_14kri^ *gw`uer^(43b:Zs]E 'pĊG'WP"+]Dg&۪.3Bx0'{Tb6;Q)ǀm"ׄcu#hW{]bf`cD;rR#9o 62Ϋو៿?h+`*L<. 0STTwl RP{k&=ĚK꾝e9y}1q6񾲊1NҨyU¿{^}iyNWǖt̎r;iG7X6 \ظ@^pfU Nu !jZDK,"V&pDzi/bSXfME $~ؤ]Kmяlᜂƹ[°ʘvZd K|Hm~9:@oےk|uްj7qT}KnY*^v>D^B3Ab {֎)\#!5ʘ:Q2j&݆ ?w :z&ۭ  =3ed$,Xsz64nXAVƮFΎm͘Gۅ8d~q2ߚ"KQdd)*٧ A!y83ٻAc$a7#eW[‹hF`J*˃sqQji)uOXƝV!aNg"|MKRcˎ"3~?GX%e`v ySip4?sl^QY,n*J«u¶}\Ԡ0]0$} r_)# GJD+ *\{98*'~uُIrV4V`n%@DEj;|dܸha b+@EѲN=JaGmxQF pn$[ld?֩ɡaNT~ !#9XGuXMNAV8<}zс6e+>KiP8vL{yXf. P#Ciq)1Dk~<_l$s>q`' Ȏ [?_DLǗKä bsj9V E@?GDiv4'iyG{0xԉN͠G_<=aDȠYUY5{؞@XVPl*"D`y:+"K@QZlw>A3&)5UCG3L\W,zs0+ц#yuh,P\pbdLOpF#ţ~4m[#}p#Ϸe_g9 S/W2psÝq$͔6OTn"Y_)SE!_L<6uVY9OS0ty@| O^;^﹕Uc?ybsޡ)qhprkd2iOy^jE ~Q+QdC0{t{7ؿŒn" ,{c~sSw7L@ooA:IYb5ďvW3lW dcX%rT4u"6z3t.|h{Ygk6cΨHC5KCb<ՇtO ^31scӨCy"A/-wVOW5IGG0tQmϟjO](Y10/K)bl?u('nyK\J<-|'th8p8u>i5;h'Ѡ{K[Dj+!-s[(TMAЙ.:O@ JD'y x]ZcCB0z#ǝ#Nƶ/jtm6:s1@$բu͑uLg5V_w\SpݘSfO ~΍l^So!PgD=g,i& <z}tZ+1uze.mylĪ7K𤥡pM?kжtT?ekxл_/{\{_*겯9V4p шf/:ho€ZedHQYtѡʬâ Re^d&rJ1q+*bqy'}ƃFYfߟ}Sf=L+NG[~Sxֺf#"xsU )R0bGGlϩ-+i8/pAJ<$l4IooÎ_3ăm蒂Wq*CqȈIA.?@Ȯ3 6qAE⽼*r?dzENIHs gѼp"@W~)3LxC:(yΞWhzu؃*T5"=6LT47{@<4&s`T=!2=DT b"NNݡL=suv* 46P[ƃcIHd4Otۮt{KF:oZCGQIGKƗ>uұp;Ӿ߬[7۬usam^ئ;uE]upW2'~44.αggR:0~̟߼مVdk,`|h?x$994&]l0&0_%igOeM0U zU `} Sʚbl ŧ=Vݪ<"2qD^NlEQ}J~˩q,; (o>}<Ej\ qǻP{+S4=5㜥ɀtt&]{ Nd/`1s  :Y/NԊ= -Z0Jsq}0@` ;ԍhKQ"ͭp0dmѼP/f)@ɥȣz,Ւ|oH^wm8Y:E-3Sԙ5 WXQ?cHKmj^uc3IY٦~vP5}=fj* 7^S[1K 5+jcr^v{=,4m1A*z"_sܥzIbx7q1S<}| 7i+_~RPP$;;T.?C1'&>؏&Wr1PaܑM=)F[tӺh s-n[krO@|6{opͭJڪpɉ:MB[EcE8oHc70S#iƗfh"O}fȥ秎)}t LxnIM8weJc8{Q8qpFr3Z(PSRM+<(2c[O~6P[(Her&fgtu5-?#;i,u:ԥ+nɱ'Q UvΨ`2,n4ڔ٨hw}(4:z sG7[/?;MRX!}؉~n. ESUl\x:x{ aeFY~{5e^1Q Pm$Ǖ˴ L⿢pLuivTv1ʤ>Qك/|a%֛^^e:ux}FÖWWD-mz W*sHy{F[XGd{U[\>8zyat_܇MpqIꎳ~P%h|̈́Tp:'6Xu9?ړx}ë玎iv~Gml:>Kޛ~FT|E "O]8w49Kl0zP5ƀ? &jQhv&Gm@;Ag55{&聂99ɻ%TScԻ_5/4nAq#}*>2Rc"VW Vek+Vi|Sݛ]`ӱ;:5JA*cY{;5d^a;w@Y˾|uFFԮ۫&kn烔p$T2]klGʘ+>n\DZ#8B\Gw2J` G7+ȨrtTV!9L,a=4mFJm~OՎWzī\]%%£!7`ln,VJկ{foXyqZ7t-cٹ??ܟ]'K0XXG^/i /7a= [N6iQغG~lz`pcP$ڠ1*v :Tڳ42gy[Ԥ5_hq VXjC,<_^C GޏzEw;] " H/*+uPTmwz}W_/ ǓZ]&rʗBw^$S2_nQ6&u(>\t|wUobcbEک깵}%!ņiFsfn<_kȤ`?mTw &#=ybNnA@T L-vhΨY#/~cFqsKTo4(\BL&BnE~nm@ wCiҶ'a dLna؀?59O7G[Pwz@ns}=FĽ* GQ=pkW` pJ&:^չV/ {qsCHBes@hoȋ0lN7 7$S. VgB*t.4ۜd:\>v0u|<5ԛ~tp&/‡ⱺP3pLm]FIKCҴ14!W e }ۻZoMn;.3H<*7nU N<;U*rqTa8?0yM3x~!x%Fzf D9t.7q(jOzޞe8e{2btuRlfq #a!!> ӛ- M)zbv1.nmTAo:d4LW)DU=Jm6 Ʉ[d|SK Fs;C~{zkRk8˰:J`p`~hvTi)Tt+d ڊ:pje~t@^<=9:hl '1n->t A`@eWW@UA>+`aEMw4>hxjJt~u{a0Ƶԓzvj:Rϲ.ͮ3؏*#-L%%li|mGȯ0ِݥԧ+JI7M$Y,*$Uj8xt]wUVT)joJS(ح5W{jPylFF 4Ń`Q8++R|4 xWKح#p<^tyϘ.&]Tp1 R?NmȣVçmE1aϿv#0:d^)@BW}^'2ea8W%E`jL;TʻlPTV#,! .=|,i꧗/ ;5 l/ǯ9r'Wz PReO>|o\.;յ ^O{f^n/favfvf`FlbIy^k^LO^Zn;|4_N*P{`{չ=V {Ȳ)bͨ2u"W@fjfT! J)$ȋo>ew*fF`a\E .(Y\d^b1w2*+`6| jwxHy[y3"ܩ'n?hn;co]Ͼ J0BqsC"a9%齠tj0#DEGֳ~.jTWn3N:잃V># \i"j6J4M1@QIэgvmvA4i ͊F(T&3t=yɹ0{E`g /@<G.^}[lSlV%L£:<)R#=tSލ0PDjT}戮n0*v5{ī9 >(f% I Ȣd40*Vz0FQg;vfΜl}z6C9ȏ#lqlI.qRΤ'ǝMRm{Ld#9!=yc3bsx =m' (G<IsLi>F{hUEșkrHzD@V⃗ ,#]3LÃq7w%9r K^Uۖpv ?"᪛!ߖ|(rR~ ~m:  XSꔩq`8M8xJ\ˆav&e6h7K,`&肂ѷoM`~`}RU?-Cr`bYeHmVuF;DI9k~`g =`Lof7UrPu-BB s)Ѻ$ۚ['kq[7`XWyhU-YWVfE재#Ջb$N/ oJ3-sov>;U5Vp:u3tQqKO4I` Pň6$ 䋴p.cc)Uw" Ʊt~$hpeW{i 2<WZ"3 DL;)1IԖٷgO꠵3dWI* &zKP[*~,+oSIكk, *fA* l-v+tK4۪@ vԍsT5M?jMDV9Kbт;+? `tKkdo|QT?h2+ ڈ}$o8dM=&., -p(+j5A9Sp6wVM-'\D_S@,}i53>-_ O>yk4ӶSe= ش+h0ܞ=t TG5z̹<:us̠ -},pxen, ͫ|QI,]ZgaMrZU#r(,3'e eg9gj25#S=k;j?~ /7 f۬eNnpg h$}$pr~;erkHsrGlrkks3>A0H w+ryqh='?t]71*_v3}d0>g]:ؿ|҃w.7i>ϒ݈r3:ܜs)UaZyKŧSX4 lծޡȡjT55P"XtF{6{T UW_9Qydt:5FL O?Ħ P(gc'z6gm#;iXƒ<"B}aG/CS\Y=x(QU͎u5퍞wrV3=,^#fhX]ԅ fs I&i L*<"j]ϲ !W?NXǁ.DyƬmO4t: uÏB:+>ym}%3#%}9PQz{j fI)^yVٗ@@,_BԂ eDܵ|QuigGizRV!P⛵=⇹^r="&kP20/֜&c@V0eI|g?7vOޮwh0ْ#KENb+#Fr6c+Et߿gyV߫+P~N?[7+?)* *E"Pbfۗ]h^#~[5[+:ŔaA2;VS>it~݊gIao\W~-Mewx`IУYgA*⻡; [Hu9iq)T& aG^iz<::6Ձj9@6e-;#ovo[റOC|8? )(ß+ԏ! % 7KQ,cHC$ CPnKdpv)0J tdp &\QwgF;ĞfcM͏_'}>W:6`5k u@rZHYTWH=lVwn_۷FX bmo`WG{.3Y?2~Nknn2+btǼ(-e @ϴ.#3嶁 )!E7NÆϝR;%'ZT`h::;#+:D O&x" 3f<T r%Ļbl(OJN%ZR#hqZ0r{+x)0^ow <{4:,vG%]_兠Նv \ذAUY&_4MH=HKHo>/3f b'o^]PU7̰HIr 5T UDYAenkN˅(un%f2]k'V(kiE46p2 <d4n+8*؇nyv·VCir}+ZفbqM_dLJr0T L:*kE͇IidFN;x.R 3Pyɀsb%˅i,N jjaM&_5% 6 I ; *`&o.Uc {"ƪRWXZ{n̮݅"I_b\: {6rI;@qek|{GRg wRmrlIDz 4@ s` ӱx3} Y}لkjUzH[W{k"NՓYizD~\ "I6NIݓgߚH< wB=S:oz'~$DT@PNy:oτb۔۔8M4 CVI0aX!BEmR@ :< KB5Rarb^`r">B~[}4ɐA~49`Gv0ǩ?7+ XBǴ.ٺNnaa]gq0tJ3I F=ĺ2KRX*͊qd^?"WRVhtZvi;2ZU^J.+E]ۧ8灄Mߦ8LԨ=4#acc2YGQ Ǿ Xe32Ŏkh8?9%rn3)}]Xy>$\AbLPq ֟aqͻ 닑!.e`Dޱ)ɉC̃{dT#*kY֯iV&)̈́Z>X?m<9Zè{~E|\F|#T*Z ڴ; Ѐ@WzIU LOt==ppAAE`tXZ*`-;UsEj?q-D?NY=s,\VʩzyHҬdpj S }pUU<3{b+Z ?$7cc<;(&_^m@b~ف̄#Uy%M9O;Q(t0/ ߿]К]]tR-Yu.8G nrWfa۫(JᤒJ&&hHphevZsJ6wx?V&GJyJb2`28BZ..E(2ZRqF3{'L:8:ӵQm Kv͍!Cᠳr9:qX^V$Qq;G46m`AjӈQg?O[A:s`(Hp& NeH~-o҃TW<X72تk6\kㇲ_0zڧrp˴`lk~v~GUe ,\ V6 w}˺m+!ɥ{&C;wC/mm]qtٴ\-ۅ| վFkÿ]MUK*mNdv&reLߑ/( *";B? Ca LQ5Ȓ۲]:nD,~,xwZItqο\ݥ]m2Zmu R` pwŒfNYea򟀞7"%t z# ?R *3Yzmxo/a._ ?#!`V ӽum[304=1f&ɮk'O(&u#c_Ÿ?6:44kFkoxWs@(W2frj2-FytNn,Gv8w]^ѤuۏO=SSqS3/:@N> `:ox,ebX0&!-Fwgg-q0RF(J>5 CVfPuwlbc%L3֨ypøj ~7{4jB@ƥÖΡX=%r12w-n#Z1Gw02ɫ_Xg09LY,Rzk O.ɦdc }ٯ;;-:~r-Ěgc7g*k !I~5%LE@ \/ե5Bu8)Ϙ (?],"s,qvA^&CֹA~u`$X޿;>/XpanE7 K+ͰzhԭN!{=29gy{زX:#' AGz[:[5{ze6;#ajp rnHgy^,ws@A~mYkpl&Q#C/ԃ?g[dÌLAh4̍l tPFRtPvd>rgxlSH&_cZpNOIԳI~l sIa8Dr0Ixw}ENaI4ΰGF@U(N[Dqں(;9vm]k}n^|-L䡬ݙ $.l"#Nr@ÊIZj'_c Di)`DH |*eg# ~V$RD F@O^!`hhܬsn:9`32eEt8]=v$Gפ|`ˌPTWp/X=\|K*SbؘJ&5uԹpD`W=m?~xS"!`xSDO-t s Ƴx>8ًLT3] {d= 3Ȯz]Ѱ2vA^sC%~uk%D LD+8d׹1pmUA'uJzIJT YN?KM7A,A>SPc լp5 [3C5-LC@TPbV:Me/W>A !Na"YRz*$6H$mH=A_piua~ QYe)`?7LCFl̏zπPP5~.}{ M(V#i{?l[{>/u HMS~IRU8^nux(_+<:~8!fGjBWz36+BV. _ Gjd- UWeݞ6wj}3AUWRt6>Nǂߒ0g:0=zv:tLg~Ϩ= y?T4y9#||8,yu_q}TG$S`0h@_09KT|%͸JzX80JDŽj|-uJWy FqV4VB@&j4Pw(}}f|A0Ig,F O@%# 1<7] Ԝn0s Dq*S{~¹7u@r1S:]=׹%ǎ6Xe$" jiF9wOG q_ŴXh0<g c?g}^d ׿2o g|qk׺*]a{^JhcKicڎ:Qx&jO8D`CGM81$_@vl@4 GƽJi_3A,+sM EJ,MJPS"z|Ĕx^?ذ0Gi蕄lz;2/WFLrM8i}\_BX¾l ^vm ְMۏ y̘0?mcpgyVK5y3;sQ=28lNx%2xQW 2" t;$m nACBkmߞ2HPߞx%eJ@ĺ2/d/Lɍ`ns]E \0'OYW_!MߩD݉~Qɂ;u)3AߩyjgQ*v m}&3FdCa΢:0=ܵbB!8~5\:X{4~L anmFio'dw%=2M¦4*Svtu*b0/'yNu*T&D0^fLW6BT$o$b9LYDѭErfU0(Jk-%+m|`,.IaK fh<LG XUv۳c>rP'lQ 6t?ű7*  ho!xGu`Qld@w0bvՌ#SkjgJ{ )K4Vs b 7%e xrWT9¤IĞ ӷ dc{7sj C 'Ugąeí#MXǫEn+w!h=S Q&9 `Ǧsˆ9Ҍo1P|à6儱pp`*k8rת+#S8j_Yf/n 4+/GN!ͫ bwCtδTY݇m_Zn6vƉwWz~>i Sܳ;Ÿr3GWd>0؛v;i({\DMі(:}&uexotvog]&~Yه={Ȱ n;ku~>LZF<Ϥ7>đ2*<j˜9KMLvr&Gɶk|Ķy [4wʂܐId 'Uú^+z5ا9b&ms̝҆ǎ|x khTCا]<@e~d_l_LK7NwdIKaRQTk37e:gWS դv*ez|{g:.k繍ƦNi:Zg#̎i1A yoo p+uqpg2>zO}p-η472ht]ݺ+s?b3V$QMQN?DUWg(P/ ȷ8Mm#g/b |?o?C|L [oq%v%nbɸWzB6Eo헚'97_nfgCEcnm7 aadz&_׿zubߜyw [Ԇy*;3D߳6ݖ3p\n{=s^y`bϴf%mcO[ݰ0r_) Kco|gXv{:P,⌴'DdWbȝ}m?Nҿ1=׿,fjzJDqϹW66d*w_wż5 *7Th28qMgCY`14=2{7y-uoaf&͸%]5M]ܰ_ǂfO hHY7C41Fv}v6=.뿂w*ˣs}ou} bqs͢(kݿ:.38735-,lk>nPMA2߳[;S6ƫ ;YnmIuJ8c'eZ?[@؀tn")RJw1 s`cQJf#Ƴl|u3o4 /\[&FA4Tnݐ^iȎ`8Y͹#f%Cwm;:7|0YrӐ:ec3pn?{(yv h&(y%JЍfnfBDVfhq>¥'2=o;wٕ76H$M쁕7#w\ٗ*KILue/C8otD@ia| z_. <XͧNapnvSH&E:3TS6x hq>cŨ9h9 X;bFXr1|0tQ|2ViLyւH$QuTG9Acy{MbkX=%۾Ӈ QFR50>1󘫳>W/rZ1' զt,8Q7 d-w10,Ӄi]&ӶpXGP/OiÅ=XgխbC`vD02mF^ee4 J4L ynY"jvL'48|8|Y]wm]_ בrF*!KRJW95A h[Bhi b3l8.T')8/XpE#M/H~KM7hd#Qǘu ƃ udn8㡐c^3+^r#a<0Ąq@gA*\@98vfpFJf-<1QͿ쒄7#1!|v^~j=?eSπ  zeVF`eMN`6ڞ=.29e=MgbUx0׎sqQ6|ѵkFE=wͨȹ naQe;` Ne]A|>l#򐽔_dj)l2=`g{irzXe]9nAnHYĂV1{C#:xА|ޞnR+$W @.NHCwn~ .crr.Ptqԁ[Tꈖkq/1/CP.{HyU k7. xWyRT װKGoXs .N~7=z/W:1ڢ-FmLoWÑd8vkp9ICgTkٷqՓ9 /TzDzҶ-?qK1.6ntBS_̂Q\P]wTP]QJ V=HN~%bfҼKAYӋ5Oij;z<:]$N}*k ZQ t3.gFY@(.&ʰ6z82wub&L01W5T*mƠA&HUP'^55dmǞpa [Wΰu{:*@h׊E%p TH /=Ve_m Wn*`܄(댰jUsYQ~ںM1$3x5]?'\#>M5X[ΉP%o$֭gWmB41Zf1l3 \9FgT]Lz Kwu%lq^rR-WrLJZ '_-\uʟ_GbT\ߵ\7 Y+7\hfvopO|A#U]ٙ݊qs0h*ve=sE|M$.VS0xs pu!ñ שCz2SE\m)[3}l q.xB2F8O?g< cÞם[P .}n(\[Kzj8_"!3)nIh'aRD FN{ڟ`ܾK;]'\`Dv/j-tو*W;r|@i3oBZy{ڳծ@.ժJ 楝Ȇ(RM rWBl`+ekQa=QTVVXBȒ,"e}hX])*Uc"44| ]sq C:|V9һ#3ѓa~+KtwFB;*l:|x"YlMV%즧6r - : ˝ nwĜ-nPkCu8HfDm`xWO^OСV"dJcnh40۠fA8Wj>7܇&:򍷏8X~^ӿ.4&E;^08y[/mA~${~=a4Wx|q1}|坙DÕ6&ک:XO^1ݎ6FvH}ZÄNQo[8o%@VU@i*8&9d1l`py(aɩs\kg6aRSSV l= dٜ|>ba8r%ވI= >xL(]#nԑV>@R]$0xg7`)rc̲TփJpeVڣZ|5`ɦ|P-(%E!89[|~\`GX8^Ltd"܄lxpvt9f:}д!.` GGbݜ|FLF!,"|$_FJ\X FeD uozmUY$V2x.u/X aC;1lQm9.^lpQ%Ti|>avAUܟ`pS4bArβTm=@f ̤ۀfgnܿs;O7\so.9KlցK3+2Ton1vb }LP5$tEVG(F`h(@cw=f0 æiM<0.m8 V;4ة Pݟ;uVn'.M\0 `)6Lfؙ2nҐcP eAl@%x kf0"SNskn;CP(-Ok~wDY=e߄8[E*-{t(* 'p\} qȞɆ=ڽUa[V|Ҥ(0- f73b L)ָFRgwo$FdCCnѓQ$|ŗ_5<@\l uveGq-yLLTg kQ'GS6Q #N/.Gɐ0iX}D;QLr}*/f>$ĥ7=vֳ@{[&>3 Tp'5p@" L|i|4ӲŻ^xe6?<|Y<Ū}Ou4qwn>\-nmۛxW <n:Vû2P$ۖ},0b,3_1:uOQUbHRy] BdkeaF f}zII:Fh_ jPg L4i73%Vw 3OaK{ܟ:x[2&|΋L0a9sI8\AjT Lcch[3\KF{Sħ}"o^o kz$ƃlz?$ڱϳ#fSD Hf{@!0B5R(qͶ^XHu1tghNkYmwPmUB%c! ZF@iVwbILmmoy@&i폹EsAiѲ`KGe ɘkHL-_RR"JnxB0O*>Y)eN\‚roJNN,(7 ZN_pGܲ??8ckԽn%k9F-N7~j {R7u,WQmwáKyp"?݊*=9 w=G_IsvoT^e)\g9gE[\N\>Ek{IHϪ_P;O߱#}{OV@ӏ p(:VmvyNtҟ4qL'_+mԮnP٪iNGysrǢudwj`LM!=h!a0(M"7(=+ThmǩnսI;#MB>O;uǷWЇ`LJy*;abr\TVN8(bI}T1.^UīW~{GHET@)XxrI}努8pkmӾL)-(\Z9Tq!nv}SFdΥs눃MpnPWnr ]2c0q nP `!5QiIj]Yg)<,DrOӡC'lm= ,Mfp/@Hgަ{ ~Rf&E]ErK7F;`L?!Z̃3H̥V~mV}e̞Q$$x 30EU:ԆwQjm([:C }CxXo` 50G+j[M V>=diDj&i O%<.;ek̉K҄5Sq׃%TJo!{2>uI'ÂW*r UKzt9-G%+I/!k[W,ELjc+!vLNjk i}z+y7z64`2€cF\DLV0UXZ㙂Y5P pFD1zF.E?dKO y"f(d,B/:ܝ^yqqڮA}:/%%U!@+ Pn\Gu2y [GoBz]dn+oҵn96׮}F<^ĤgP5Bec2H6|nɗ"&=k .Wgu׋ey NbU;F08H+CAoM+v/$F)G2v2 {-pp`G{Á"{$JN4 UJ]TkLoڸ=>Ml;?x'U/zDcX`-:FgI~Jl;9پ4@@#b{ @luїMz +x re]8}urJ{Pv81zh$`|Mxm{%4wGK[z^HeLqNkf.f*sf t~1vcf/ S+SS.^`uoi=csۄJZ図*"wF]jClhS헃oJҀZ4lt VLkL^n 3 +Ǧ]矌m?mj65 `E[KӟܲI^kBa2%.`Oby,K >!P!VlS  ?MҀmәdW""! Ī>>H ФNY`0apL+j+JDԲQ6Ox]>y+GWzi I·2Y+x{vp!Xk8=h0vG}CO?.͌'=Ϊ.IWAa1ۧy#=ݵ~0ș^C˹D]}w+ fUŎT\hkݓT ͜$>Pr 86!O79V~~X ܖwxd0A`P ң`㑣b {S!IvH28UDF$X' @KG8 c4-p6:t#؅_ɔy**BZq-}/@~?7/edN:/(ow}'VMLקlW(l =~aC.] uS.Y/xc?&1P_/ol 嬡Jeuq3(iHMCkkrnnª avn.m=+Dh N#Mm ݓ+-D -9U KD=A[5ܕTϋ#6NQ׀giC[1J'|JqÛ-cݳ7LҾc:(9nn2kgt: / يݪ Tń~ɬ"nHi0Lwio *s_Lo=%`k40"f(Rv7j"@^moJlQxu?B 6ĞWn]b@r{~%=Gk\hěbسrw=v~͕QidGȲ8` I4st;=-e=x0%F =q~G/FvcU#ށX)Ua O1 ]B"*5 (lkP݆|_ԅ=2jTiq6{ @XV=%Wrx';@gBr~h EGMx6m6xa0p<˨=ڸQl:LT%uXL縼 !~Cl ymʀkP7 ] [ Wh70C)M,и̑ZKqG!wI٠1mY΅g8upj,=ͣib@gJ\i'g!nu=pr=5 3`7Sc-ZJ&ł2\WMT;=bR{Z״ʦ)^eb v1Xb c kAnRNU8ddLѭm}CDb(Uv%}pgS3р ڟKNwwkX4|ʇi;1tŌkvCg<5g.}h"y0yg[o 8ufMeGG~m88ԙ$bš͑ Kv%`e1QrX;G/$uɤb5eE 7r!϶~ޘCeoiC}c@c#r+ vhBO-=/mc1"း::0up)D&@3S]Zgl=Ūݎ˼5ٍuI0!f2`}޵#YI*l`0'h"<7=-jk%YurL N?n]Cь82Jv_7ꍽΖ-M)!Bbp^>X3.nRtNT' $Θ6UGɼ%2_ .*^K0=nU+01Z=5]ž9tW`BcvE.*Rޙ\r~ sN>T-'jdEր-ୣ3mpўMGէ>sQ n~s/_(2`ėCH˕w4CMn,9?e`*8|Z^9ګ=Fͯ1$>ԕɛORF%vHhoDd=7M=N#v1r\eL6oAyx/ZF^^Y؀\ܢ<K)*Ё0kl&ίKƧ,ȪƂ#%}TaczSϏTZ-*R:VԮ}ä5-/sW$ Gn>tjkTS_r]2FŌ;,N}f `iءjuˤA'ta#ziPv/ GZ2% ql_H ;ZvﳥK7qvc3=;Ѷ_y3I/{ANZN%1dFj;YWV3$ <2oX %50(>7x2)@q>0%gg&=o5"2wnjpT?Pu)tw|Cc$r9A{þ pw'S`<p5U"AvcNiO (ƦWgS scL ro3Tvjm,.hA?ɣ qx%wzԈ6:^]qzҽtHc&t 3.nR%rT@V>]?Dáp[QE3ܦݯvg^Fgӆc%>0-kP[4k*vd}LUҫ>*_S,.a>OÙ:*_Ѱ{Ln.6s\4NP"*Cv[˩]Sq s:y.,6mC@#LgĂurh%./ 4b!zaB& \/L=Zvdb%Ls]jǿd@7*˲c毵B" Jcx Ϧ삿{C"@I XdZ4ls|׀L%Arn ؗtҺڪ2b`T%8atxr-ͽ򗥬SkPf Áh пրL~Q7+I*ea*&QaWxOv90!`ϼ;/4A Ra!@hGECO 'b '7,w^'`x8dM@WR2ۥC Ϝ֘%DM SEʻ:8tre4㦣#E&)~ ~9y b6x'Yhw K6'?2z&uV*x T7o&l'e;i7aD _3ZKqfT 2rIÍ9=\˅h1\"ۜ`%4! t ۹>of{Qz#6V+e8zxbU12To%}'M4s?@WQEz$:.h9or͔\DŽ1'VP9S_z1xv4 ;-9Dj((qhAgTU2Q 5>tvbvgr6nc!5ƒb dXcؽ´B]eJ.<+ּ#CX~afrbof#*ΏdZq\2;psF+'y}K2U$9e )#{Lå7af,Aesݕ]wv=6ư>L7S^&d* zV =n)l<:+VW*JKǼd'jd X/8{)G2z@,1/Sd7m59? @YHQM6w;!Le7 8RH4f&L$ F9U)>8 di=`=fw_~L! LXݑ?{O6^^čG5(=u.tRKPْ6X7f[6e^'GtHǨxO[wSi`gJҝ]4se=ӓnPu"Y3տm pkH" k^fM7섡܈L,B&'fYqb#^b1ܘ\cTMkG6(9_L2c$x`!;D3ęEaUC,?=Qrx CgT )Ap$.I8 Ko$?F̄ nVBe圶N BȊUua0*D>62vxL Mͪvl@X6߃~G_9包Œ>3q|hׂjc+"diЇ J[#m#Fs (̖cU8hĢڽyou0<ȋ{"R w UbXww 5ɲE4'/w H~uc+b~z6d6-QaTK|L*'9)D{`R=9 dz\bh`^}c(E,٨<;#Ik ;'V7=ДNDTXQ1&Gk\m-;Z{TZ[#3%?5^1P8']{BЂ5b ߜe t(hկaoM+ PJ0wh͹hfn//`W|E=n`#-('kPu-gQyr58\Xwν+E=402[8xTR`ܲqנ7>Z2n-{T!x"LlE}O wZќRQ9ftd/ξݿhp2}JpYgrEy0UMmޢ:j<>Zau'zLTZ~ܳ6}~&yp7Zrt} >j]Q^Kגch-{ef+mWw+¤`89醔n1sA68;շtUfgX81l8t>MHvU?mNX٨X'Vɵ(Ӧv]#QU5oyD쮷"7׎c#54bGѵah[s%/<[{0g m ҟQx$;oQ~td M1;lu~` +e .osK>L۲w H<@a'2;D},v7ԱF1aMn'+eGb* شeCw.kLn /)ku+CǭcߚXӶLb=iuGIټr9Eʆm> ]]p?$}-P`Rd6tKiq;*}PY3 k(u -MsYζd-3$в*\90&Jƀ,BQN'xd'D;ɵ#9];I eRB؄"'nO(kCUn\܉P\% 3\,Q慰i:[CCIE͑",vՎ#(ʁQBEDkyIN{CXVG6KUd=Dn-*#HE,gϵ"_3%pn'D@nTd=źuu)1/N`Lg\gcMS21ctP6AVuq|t1lG4Iԑgk)C?P.&Ά=>Lzs>n g c|B0B`y NYaÐmvKQC4-Y؉e}g>xT{ ƸΧv9Ne+"#6qu'L剆1dzb,"|JYyUۀ,dEbuttWᤍX1Z3Ӳ2RuթfU˷pĘVNaw+)6{Kx(ҰKIR-2 °n"ԵX76GxU13⣦'3# Ǘd S1*k_nuҁ&e2/?vE37:'Znbݔہ]ocHQyk`U ß&,۴AXݬC)_}R݉CcgBϣN .ɑ 7 t<0WnP{ʪXAݱF5bb )\1D~.5!S_ajd@@xPE F(io0xv$ r_=N[n>qv(K#,YAr\c7 X=ۛ/"Q87[=_gg`b{p2~FM,Ht E4s;g ćnTuٔj̯a|:ri蕜2e_zzB\[?eDw4`{///|a0OhS'=HdwN d\(lw7۴m@UOy2J@ٍ`%)sHЯ@+.BS `X!wdò<~@»T^2[Ďo q ʏ^z6A&F*i*,%@esX2 ;Eȷ-C%.A6TgLsqeiFW?01b=cZjVTFm?ԍCj.1O'ʠaZݧ"דu]/Ɵo&n=q\#}}?@6L[zNh!]_fL=+/;EP͙wIq ' 7=#JL('!/6G˺ 6Qϟ@T6f__#fKʼYI ]Bs$UUaiݐY]7p+UFY:\1RWDJ!>E{^K G_3qe`8S7}9b+Ӷ( _A\xۚQ>&j|1פ ῭Doi(TVpe~&42%`9(Ȫ FיုMwF[VpE&wl3=#`޾1b^yL1m Y^?i4zg0'm,$Ze7|ZjqQzH!ᢂBN MnXM"8j,ÐqC>::hd9RT= AUn-B݋yuhh@n$p_uJFnA]Yg0Nd D/S>keĞC:Z׀`sy Վ:ҝfn0H>'D̨G@JሎM L @tC@-Rv[OE3"Φaky+(lL.Sgh+Hy.?إ_lXw"yXkIKpCoP`^H_dM2*lF\)*B\}9izl*02/4Ь`^"e$~7Y"K7gḂX5_'orndٴ?1;KǬ[2aFvjB:Q~khsJr`? NG;y~֌}OcB@dpf9lIe}xƘSe9uY8ۤb?/w1~(曣VIyq!k=},b #̀e Z)u 8BQuݢ,LnP*' >R Do !>[w\T*!druS,0QpeJk-Wwet/ΕoS֎0|Hإ{XaSI+ )s\ \$7kG: TdCֈ@p]E)^yc5r5Ӳ,Qy,ɍ:Z#}"'L͞E*rӡL&^yYM( M(5!n?[/@${pDlxՎ9>a-+1&ĩHg7ο[p7oϲC^9%9fFkQzGG6j$vLdvuܽMj;EyUp^^%\{ٻGsE֒SH5f8nq6Š 4P )EtD _iă\8}ߪO)XfKpjvҌsaAsW>y!Smn`fNq@)3Z:f*:J,6% 24e4+Mj'*f.1D8Zr̽|D$1G7v?0rT;v\YBVuhd J[{>;@#[ee0}65Wt4wz}oLo0X9}^{1OhdQ < 'C#]$rY8aw!b"0>8XMא1S7mj{ 9BϤ9t!)"8!/MF%wn1/nC01/Eȝy.Tw e<]Vc *;4bzھ3 :8Z#f"|6U({%+#?S%??iLa莳A4lBM"P@uJ;ah9\kb*A7vS->g9T?@-QQgYﯨ˿#}R8 ri$uK͊wߵ/<1&U/Y=qol{,`#̾L:Z!<;p؛W#(;x+Σ={̹2oҭEZK"8nz8qw8W޼9/"B]y:bdqQy)ҭj|Yiw.ōS-(ɝ[t)TsWF.b2 ]6/؁c 2^Z*}"s@nu8SFCֹ# {J.+z%[&82tK0ޏؠ~DYf}6QU8 2 U"D YosFv@ߏ܅nq6mx/pItKvݦ%En~(qWclU 1/L̓o:e:!A.@+dXJܸ̥#M;+[?=L=.c! uvH։"֫#{OKZ?"`v{Kx@CfKzc}N o.q| ͭ>ݷHs1h̬Ϸs%%G2SyQw)n^ I1כ]e)Ȥs|a!|[虸"` >q%gY!eVr4 E 6̷5׶6چrݠX)CjP=y]$3o1|L»WգOW؃A92Oj0wX3HKt;_,aZG<~ym ִu~`zye؛2ԫƞCN\<8:#r[G%{S40g!>˚{)Wk~wP,=t1^V]l̳[3Az{ms|g6l7aG.M;2K/LCo-߿ln"jtX>!WLIx!?~`S'UÃyYG뮆b),k# ǛA9+C)riF&tgp==ug \St_7{;uv{z6?C0\4RAF}=@xqӒPĢPMls(7|9ںE v)KW8 Ӛ:4!_pMvy"=2}U (χdgGdiX49,i\xx/|U93;;@%0L)I?r ;zFnׄ`W_o.֎sh#y ArV7 kzeo{_? t%- i"ۺ `/l( 2U[WWFU dعDz""vMS|fL*!*RBDq0 U^jKH3,yU[mik/X?&. ҙO(i30N#ȇL]ZEun7!4+5{ʸ K[ekT_\0Al']CBBO  ,3?mV?LO?5b0 6 Q5 lDs]$TDV()#8 ,M$mmk+!^6!)nK@B [f2eON[@ȜXϘҺnxE `Qݬ=Owb5Ư!H f 4H[C2FLrIWI.<:OɁ0,[E }hf4"KD:e%}Z\& wa8WnBy:cg,#c!@c^b V7_àzj!#~E$E"kΔab=ufPoeyh=ћ3/១,S;ܶ$عſ; C.a-ܓ׏ǜsEJ莮n֦`veTU ."΄d‰~ H9x:ufe]yvϊNC(/lrod%]ĹoVQJwػPc` qTm#/5LdQwW'~Of;G}i˂a?^aE {0Hæ4d{Ɯ4't[D9g+A3js9ql6wnt*2--is3v=PL|L1CK{UnuF9*k5A_̡Qī0zfy2}dZe_ e6՗v0x\m{\6$`y"Zk ͥb2K9/-V8c~?8̹IcTL>7VbAN3 CxhB]ΆiA"_T4H k.~Okg_f$l@)Uv0m_UYar6,.#.6sbT' rl8!5 ;宩rL48hݬltk/\ڨfQQ]0V9Z4-1y[nn"Kvd˲|b%ؒ} 9R/ȏo6ICᗺeHnAiKl. Y,Gr+HX)$>Bfrrt3ř䈑QlKOZQoOȎHvB6dBL3)ZSV}g+&vvO{wk"ilr?9]줅qZO#y}Nz#\υtE ? ~W22+8&y1okcCɴQYa00@jT&䯘6| vu߲#`(`c|Nc$;fߢnN?T3$=${ v{+$n %+[U_n`@|#c}g]Hl 64Fh{cmyn]H>{cބjѴ0j!QU%3zEvX܊u]mf NmdKl.e^s sx`ͫ$vr/ٷ {:V@j)'m|G&p`&P-^\T]/w҂ע%.8eU!I[8@7/5A>M*kfe[t0j_`tL _NkpnL:CIu"ga:CBrPG[p#%ȫ FQ z2AN{+v[@LrJ6{`.]N>TSupH}@{q讴~}dެuϥ;9g=&mboP-PZl0V;n/S"[ Tw%,uP6.WۘdBɼٿmH392/OAZj=dLc]Il!ㄿ2TOO FAp=FD1wӰk7Z5?=g9F1aJ\꫟`Ho@j>jWknj޽~i.UA.j5@M} P}6a{wi@n/9 7 *23e5]ex hd0p)9@Mn?"B(x3'5hyL:m #Aq f8'VR 6 z:K!Jǃ<!8UP# 3LV~~vRMOUs."~*N޾z[Wf%;Y Fd Tn=Av9]\<2b#M -#{Z'g?<_ApAvWd$aԻvkAE++e#>X,_Y[kh }kPEdvn/ɟ0`ѿ\=aMK/\^H`6'=_m{T[QRܿ>|oL6K3{bs~P:W8_ӤU+~T0IK1ԾXTvb˘2]ۚ`Xm> o]nb/U7ߣ:ݤIQ%㨑io4Uf 7y9t/bwH#"F;`ǜetܝΞAd"K>;VƢ"ªJRPSZr9]SS{4{fp[nZ cs\Fc9 5x4k@d wV#7 {_`,P(dhl=@ Լ(жu1@}8d躔 9~zd2Xf%/tb"fZ!3 /WmfZ}ƬZ?5M`<]q7MTh@ Y&s4X[D}ΒVbz.kN훡o}jALPgmW e"vioࢯZ#m gp%;$ơm49Ijƹ}!N"em[,".ИAbqfw^};3I'eTv>JJ_f闢 Qf2:Pմ3c~19U0, aT a@/&~:3L[]em}iCf,pӄ@nJ&<_{ qhX0A {S Ais^xpDtڨ.?ۄQ5Mcg2pt%#\ohq etx+Ëuッ"Y:6XXHoP1&T `M 䝎X hޞ@ᕁYL K~\eCm]2r={f}%ۄoY&AkȮPP zw)4*.} 2 Ne/熅#&zָk<"`׽[ N 8E/6o~/gVܰ;m+$I/gFYKEMܞ[zIՑcgbScJS-2޿+NSw Mqlk5W2{=!P[h_}e.{J p,<]6=7jr";Yz#eLß1G{1[O:tQאDq r.-i'< T]Ek) z/O#ѹi cRNŃJ|rfU/IN0b~`Z:ɈH^A~:JNpAvܰ3MWj+J>/ L7XDlN8y$Xtc%} +wOcI`7of1S >nU؍gO#?g.?,J ȇe6h13j" >76fWn(ג⫎ -"6` 5 ޱc,q\Эȋ-B77KaT~CxLr23x\GDea:76gyO"̳(U.5rd}vg)){ǂꀊ`֪1`!RbX~qd{ё">`X>v/C{@d&D<@ ݗKƞv5&Q'@_X< Oۊ+ϖl7E7E}XJFV,7NmnyŕOװW7VF:y_u&@w]~\/qj+ȳ㧟|JBggr`[?Vwh+M{\cZrl.m[b9MvD5W7r3r9ڼSP(o3V9Hu"jkyJ}c+ckn.syگܙ^pJA.\<=cn T@ e D30|6ߺ-.qlUB! R@$i iݧ+.:yTGLO+9e2rŠLj9dhZLef*8Ńaxsqgü8cK2+0 Pv AVīưT:̐6Lqe~dd3mv䉸J#*~$_"r|s6om0y9|CaGdPN$HԨ6˘W5&:7 $!3ŭ!8o^5T/P)pn>lfڸk!|X섄D=JL[bU~x_PD^XIکh Ђ&w5*tD/RP!k@|p]7V&6 Cb. >;A;eDQ}.BőzKvfa}"Ād%P. kU)+zώ< 0džVcL’1Ikm qxihwPE=r h=JTe OgB[0gZP rژҧaW=NYRhkձ: ̌0W_SY1%09YUg\5g _j- #O:j}[VlT9ת.!qfN t@CVy>;@~eBb``eRݩm/\A=]W6k'5}|81gut .szx ?If>hߞ%Lx8BzG嚏-z;`Ol:s7]ִ T |`ٴ[5z3Oݜ@HاoLkwNM}u/=;u)D 1ړ|sɸSpnńn] P3 TDPo0҇NRcnЉ1D&}#9jSq#EG]nkH(cot FPF`jrWP I!K@r=qa1YRI8dfRPq|(3QД^ʙuG4qa^)I~?gdLJGj~o L`JZIP_xɨS^i0 A K|ܠ Ź}2ÊcjD~G?K,'Lj8w?4m"ؿ~~YG'??:*O.yL 3@0i .mx%ٞ2|+|w,!\y0iK),8Dlhf b>ۢ| E^?֘<ND\1߉c A;Vy rL9"sDb(C]tA٥†8ZVuP}M6> v!O\&(ǙtCAcgnNʕ 6C;c|XYDs\ɐaRзe^џu>w-BL_t|%rK j;p~*,<\ hrLPǹF{G6~ DU@Md<W_O^l]umzܣ&:>ؚQLj]#uhzF'V0̶f Ix+_4L)p9Q7Eł;T6oP|Ctä':Ź 6jMk~1;W禖3[Ȭxб^;#cgb\N#!c͠pQ~E=U0r5h%Ue*#n!2@FvV]51/KR;T` y#2X<‡U>%<9T`WY&uU|tʕTH.8]0*V {̫ _!G9TmN-Õ[m&!Me0@ؑoUɪ\9A7hR߰cG1ySu@RC͹u^5jTst0)opFbW~I>v0?D] ]Aǘ85{)=/[ڂwqZRؐ0,}1ܚxM>A~yrk85ɥ[gq0ߥi+%t-.]"`"=Ƭoz;oy}r&A/oD0D=5]ʏϡ*S5JրFGb |0炣(m?'Mj* i@O@Ӓ Dڢa-^/m4&٨>kO!-pN!= un ! XD):*wѨ Ƹ?ɟgק !M8Uz nV{HF?oߜ?ΰ j֦xIQFvKmY&ZHe?"a@FK|l6\c7LĆlJ6.~ցp],l1NURc"m"%@4, }OkC{ĔےviTKK+T~|O˗ )nr̿0ye4AvVQN.4eg̊ X¸MlP̩r&1/T␛CdNC]K эe΀I;jI=&RFlH#)ħ<t!#:1 ,w\%rxLVeG-.E3ZV",}ćKǡONëDkX\ kr^"_GLmCtԋ2lL2RF?4"$X8B>WeUh\)nR|ֹ=C9gߵK8- 򍌌OBʻޅ}÷2x#݀[p*!qeRp7K< ;JԷinLv8dTO`_־ DDG,Fo٪e鴃=iOϽSjYNu_MQjb٧Pn#jPP(,$iYOϨξ{"NT68SQwiKNgƤڠB2Ķ 5P,Noϭ`oһol=ѡ+ ˈ|3 0K|{d;D/Ի'O8 mHgD\SsK "/z: >}e݀ V[69NNxT)`_ 'RnqlJ8Z~e|)l|`vK@Ʒ~q?nt+覡1߲AtF+u)R<}q;1''_N&1RC׋*Dnûp2&?t`9Iݍ4kXC.DK.]qI>?ywj^#KWlⵘRbxTm_֋ٲPҡ \r%SBOXi)$ob Ѥ<^~{$keU|'*Ѿ-Ƿcg_VCVpu1H&*dٱ~-w*!emjmּ/'7Fqoc(hcMݭm%/gziWv/ X<>i;4P6!(sQfKfKק3i+ݿ̹0v!؆T2% R/ιb4Nfg_p~h|xLM0v_8p6r(iC3ӌ}E,q@E7wau!)"BT.T )V3=}17PeRL2+92n sS qkʮ'~d@.Ɂ |Bku[%`aĄSaݐmں|ʩZGG(~HU .k=nl{n\Y*`S@ȣ_Zbs P׶#j4l39nV*od z嫯MR\I;YF{eJx BTNֈJkAʦlkEi`ַr^@RR# 3Oz$9쀋{j97c!p A.S[ l?ٴ aa(]-l5\{0TE$/tka,nxѠKBa14d_ikQN.%ldaK]  u'CJA!zYU(ׇĭ B+B=gIKVTL w"z\+\|Βh@@SGYj\.t~t<|VﳂYCP|@RI7ޠI; +h5_ x;ڒ#6~|Mz-^f1,\da`Y" Y.a4nDݻA~u.Wat#9ſOt{sA ,:n㨘}0bhEZ;:3/<?>af&d~ cq rL ,,F{(? 3r / 0='vƈާњ52ޥ|M˶v`0q}n(ǁg hc5]cExX3{Agcl ϵH[sSs@<8c<߸D`M-Ь(Z^ȕO^fY8U7eFz $$Vč[)L]o)WsjKttS18PRu _)us|=q^ކg/ƴHx9AX8%m B7|W]Jߛ JO#b f.>wix8q+G0M[!az UEۢfav7`^ٓ:7^.suo}  P8>*OJ*x c.=}<@MK]@†,Y9V%EIS.T䃷gu?ܔcyŽ5{=BMV6Ջ*#c<}NUзEޟP~F#j^rO,7o¼ZoޑCE۫?PȀyc{!/+fJǹy= &N9}0 'kSo^eo0ӭ1exXTDZPGkr6/e%Ъ _})kG -jN5|lL o@wF[!{<e|h bۼx.О@CYټu;u| 0M> WEuT)Gc茇ˢ"Iup73p\^ftE1jz!?-@tT"f7nm"=}ckEwo 0葎4p#Z-=صZ7ʌ³#Oz@7Ӷ,#>NrgE$_iSQ!rnN&nLRZ\XXM'BOzl:ѦJǡn׭d;#)GnH|0>UkxiP]}:@UD ӻ~o%#ӞٽrE%q8Y⨦0`cȔOKelECS\vq|I #m<|p_,T7{P`X{^ Ù -Xy1IE;6ĸ#{# ˅ (>iEϭҍǧɱId`UMIT0ԐF%~_+_JN>R~Kj;T@CUR]}da33gp aC%]=Ql[3Z952jl9eCxx?M59]U: rRGEГMhP$pyAck:9qߢ'~<uh6KZ5{Yִն d,;sR˻Z .KUs6a=2OnG7{IBb5h~9`{~\H}(>ogaJgQ>9N#ʒ"ERչ0,,8_Zѱv#vk}3j+%PKq`}l9SX'vM¹ -|| =l4Y (>Y>&uhmӍy3=S [ؽi55r3mL*?q64a㷝mqWsDRT 5"IR8=[V6@dhv܏Lc׬ر)p̜C#ا^ɏ>yx ?p^T#v{P}~ éO?R#a'ܳ!ј+cBgZ~ɖ& 285k,"ɥ3ާ[yImF˩ǐPњ@^Ǽ2zF(^$2Xjlɻ24% sUk'oByEfܻSe07mTݐHWfqPݘ(kWك["ĄLa*ƂUz%9:@ѯ*ᯛklPD x>{ZXA >l`aG <5KTu ЉؐΩ]mp^EXyPǁIZZk&Ό^99!'T i :#( 06@l}JW۳kZM,E{l^u"՝ΖKMFv #PE07o'n֘D5NȑPa-5DTt_èu;q ?)`EB--LTӹ(fwg1qYJLxf3?3Qg& Ρ/7( 弄ǠR,QV/<+?&1a;Ygm Fj{E=Į";dކyc`Y8zk<'0 3qYO7U|v3IjWj#3K#Dcl绻fɇ0;Cvl x1f:Rw:P 9'O8P#}d%Uϓ'C, 3UMuÙsYn DO<ӴQÇ[*W p5%(g݀+w8Z*13Ƣh@ݘ43R4DFh'`Hc3u`ՙct6<=\yK6 _lNtLY$v,y/}.h4K |:\F C%,3 ᓁ,Txw/op-A՟ >\cf-+m/( `iYN4 >6chF?1@H?)Ҕ4(Gc +#ˑsLġԴk[#mbV 7/ub/jū+MShμz@]B=#^2 ^YMs`_ȥݺMS3!x '#*ENѴGT6o<ҐFU- xVIgC`sh͵߶ S^EOlh ȟv/mRib{~ѻWVyemUGloru9n?F)W#W5I ܤ햍X xߤ&ϚT=U 1 Z3|z"t ߃ CmH\GJ (J,IqwH.tj76Z>3l\▗A;02d>&{9UY|aX.Y ĕ "<`v-1:Uj,Kyb#WNx`=:9>(r܇e0|y0}? C}p@Wz>$*/1-YJTsU4E:pxJDX4J-̺kz7ˊrasr߇\-DC i0e BA/)q6.v*V>H]O >igݤFːHq u K gP596Ρm ۘorcRC a4'[Z?i[9?Ly/V[ aAqRFL@Oeŧ'nZ&8>cIU2 m7q2ΛEs*|Kr#=g:#g(>#H͔e0eEWi~tM~ ?A"`҇| pKh|n9K]t̍YV/k4n\;Ol<"X 4?MErCiRJHe*!LbmFNFu_UwyT ()P 1ʉ8sXfXj\( lU`ёl 155ePt0v9E#*1J]70@нpg){`8:FQ ')#עm64ɹֶWb`/d}` uĊie:7&ikƈ#UO.09 =CKr/~2q T-},d+?&o-.u|RU`V3 e.ȑA0ǹ*vv &UvhLbܦCw3^!jC v\VvvvyqPWG) 7 2|*oKaLo3&Ϫ5-wGiľo6g7nP'O I~h33=RfXd/o Y`2PFzI 2_`r+##I>2"]D=cO<>~c<ԑpmpf._9} #)R5!$HWGE!V!olZ|L2\,Je0j2{^'nuMB|Ԯ>l n=FI 6Vv}g~NԟqN.ZpjMy߇u#CA[2$҄RHAՂ݁=3E4Zw̥aqOD =g,E gJI!+]j 2x˱13Ky}7rҠݒl2/)ؾv3;j{NR`:ѯlp ܊̊'#7 bψql FYL3|u biCidNxH0NmY39g`P~s2(-F[LH-9tŹT[Y$|(ufw\!S|O5]hz0,'=X1ag}SMdI=t!@"(?F $NJreӳ.d7n+lg"`chhjdL [@LTaV8]w_%HdLB9P8@Kx҅H' B&^)xXdS5*+N I<U~c;r~tccA98BZQ.V6I5ùW{2!G<$E/9Ā<2=\xI`-D+f0)T<:c4h0Fc2y˭`[on2tGvH~Hd)42s|ݙ<hS;K/MuXtŅe|ywDU[>~1|2;U&9#3GCL?0qK Dl/4 F8jfmB€?jPTD6m1g҃f+0P)06}D\TAų6o?dzv^Qɶ>'Xŷ}nv®$e\lsNr,y]3 oށ9WQsLgCT$P9>8x-m=rSxH KbeUznؤ6^0ٶi#)4ypa1i&-6i|ߛ-M؍nWI\r1ȴV<=F:`y#?f3sI )ن̘ؗ/ÇkuϮo5E"r ZUtlRGglwbeep$onXԸb7 y0HCEX?eM]XyL^$K}9n1Po}_Gég &rrI7W2Usxl旷 1H/t@ɯvF̰2y,*F^aH!k 쟴\I9{6?qk4\T˻F)戛7|0Ċܞ5=Kt ⠫f`vEyBU_N$|SMf5Ts̾ Fܑ%lZ6pæSxvb?EZ!'4kRVp,d*^2UGє_ td: ȃf$=g}JmV|c"udæ:׿,ؘuj=A}纗#_L삋>/ٗB۝o'߿mȍݎ5SsgU›6  Vc%Fg0Gwv} u y|*c y._[r0s Iwk/gewN_<̇unO ㉆f!~L.kHHiIBem0tvr+1,IjPݒD_ ;Ge^|Br?J 6` T?xQ~>ckپ!^}1Ľކۙ@oP"̭dSBt9Hr-T-M봈n$ VIYۈtq$8wk#瑷7Ǿšʟ@|)ˁ`(qHbeMU0oY' #Eb\hk젭"ٝVwڊLL"`/8L?`ޒQ b-lpl#yъilECHܪǃ 2ONoahmԑ|m]b%bPnc.ggԻArL{ţ842v[=K91UENꌷǎwm e%ɶ,'|񬊱rwCda*8{lRo؟isԚ*:Fw6~HXD&#h,_gZ3 p;Spx:Y* ŧVL7O([ꁾZ=_sHˀ0W`3j7C$iO`5mcoejzi~11RH^~o+yOMLt]aE)>O+m501aY˝[ ۧP(Oa4S.S@Gj`4 0!?@&x8u|,}ianY?dRp-z24xⷲ 6UF s^Hb3bˑA 6ܕ'1Un{B vjhp>{Fe*8(ODhHԃ3%kopX6U-yوv[qSw//vW6hvۥY@;\JOh4U)J3DX9N  60PiJU$9-X˩KhLKl[`D{@繡.xׁIT@ MWY(ODrÎlyͽ(̷h:WYzC $#T9x? \@ P5sV2PGp<ُK+C@'ݦߊ!-ג8&>ԡ_8G15685:bze憎!T$ qc=fǎ{S3BL9ÏL  V]ҏn1W ۮA"J'kCm&!qy[Na-/V;3,38zg7:j͵|_l[mlݯ6/EyMwh4Dj@Z;|ˡ RBRJ-_iwm{+2>K99z4x󄿣A8CϷ}yG󺗷v{vw74)CQϿLYi0;GIrd|.U7H<+l[֊ iH(yt<zƖ~mvqD8#n>ܴS,doI05e[ͩNӷ_g]iN7!\nuu$Cτ%{QLo!^sn֗rRv:zFs m0LzD 1&5vI6OSzok F'/Mg;o}u\rDs+\"{-%mY(3CPiB^6{eb_|z-<vH<=$UБ|v×3ˠɗD.ei!#H!؅.^;1)%釪j.)b)9Gmu%Zֈ7ltcQ:켖GkoU}Ȳ _U)OV幢=B*uZHض;?(Fx{>ğv)|0YB9M9935pCke03B?P:OsUse;}3 hOȟ+zO l4˺^cT~eEˡKWQT֯(uĉt0d. JvɐA;,q>O">Q'زP`2Dq f5)ݬ]ׁ=/Yԟ_82h e_(Udn{vƆ; -#!5ۛ24ĢmW:N__&XnVNZyaj9^^ȿZ' rd❰?X feS^Djpît= o56q9̸602CQ9Q 16GCou YGS3l jUr &Iԩ7brĎXPgrbE WܭmF> -<3>ߪ8'g?7\Rb7 ِW`lBX\ǀ4#vF-,&f*VGRb𜜎JۜݟH *wauGлLZmعEx)Dqg]|q amSK Ǟ<_հT2%)&׹ޒjjS., &$ɢ*Q2 ?_Ԇ-Kɰp|9T%:e yi2QpS,Q^`lٵ!*3dчVKT7+1s ;ʦA f:r۪ IdE 0R:l_[]ʫx 䚵:v{ vYI ]1"=dpGf$dث# AʏQ^T=<.r$TXdN#O8T/t:w-'ۥdZswǜhMd~J秎 4u0%Q5yc/Qv8:3_7r FגSbE,a[&˘A46}[,3XqFsr1Ʈ0?\(ݯQp叶B5u펵sm2L&G)T`]N.< x!Tvn}kDti"aloWUi^#RXGz{bl|HRB *5VI'$mN!?"cG+qi$m6*\f̕]*DgXŪcāhOkg7l` ˀs\ 2B!3Qx-eTL-]{+ξJ޻+yxH=Nh%7'Òw go=3ӵ8H h G%0ciBV0Y>%R"I[ט"Qm|t5:b]*d#j[s?5p@_ Vl`fVlho{_EL&DZu6ފv0|~fe>& {̣+%lEK'0DLapϬO8Jz ds%\i;|FwDYS2 ؄>2ogXS5Hz6H˂˓M" ~mF=d*!ܟ@GC-#_ ױ9<5"r&V!b\q5J1-!1p7} Ȩދ5%K3yWb֭Ck#' as,9<9 :PKwTHH @NU%Iv$LV~a b k>]C)ZW˚+:+HfE+<1klpugrbZ>-19|~ϼN;[ށG9F9#b nߩ!Y>f n6ovy'UPv'3ͳ@5 F 7NY^a*[׽: w&=f #S"K]ѕ_@tǵOŔ4;ޅ;/GåPwzsycIDD5k}2PZonܓрah͇c8tOSP۞?{kmFMdi*! !J vj_R;߈362IAbMdYW-F\}gb1wg>N7 Pdt5LF˺B=,R`p/Q?M$]Ym.;Dp'\ PRT緅0[z r{Osl~!)a@=]JtSsvx{RnA0 !E%Z-KfIjR"Y&m?I S],: 煕ZLxYϚzY5!Ll "``>M00|c8F*DK: b-W [;_L*?0:/:'!+';#X{n`bxio v5,#KJ& |d .&- q fӞI;uY>?(Ÿ3)8yO@̞ک4czJ,'R~hS€ 4##@ OSVjLӰM^z3;$Ym*6ĩRެ?l`z"ݸ2QJz,AQ0~7$`9rC4\6/g0bWޟ=3-SN/F|rŅ)FT8z4y\A~SـHwԙA6"8#_W H)]-3{[412j2~ J3$/jÉ+B}yo&V4J]Ubt\gU7_+|}i2_ɮ+3oe Y'zI5{'^,z\W-&&D :oS1^?[oPuӆU%Fm0SOMNan9 7X}vFة?6Ȍ)VEt_}rɰ"lrEe `L(Syᐹ[팢ʬ'*WZi!@ Ts% ZE<1@ =P @S#+,Z,QtG`*NCIQckobun,:8Gsl@״LMr01"q2c/ۋdRU2@. İ(pĠ ~26Ym ,1WI +=}Dw} B6`xKUlI"GptpGz|c#8z. +%|'ė,!L3M/Ѭgq -834>:O|Kit: 324MM Ҭ Dsos9 BqΊo0j'X@DJ,k%Hn±IADxfTUѕ OMXdF Vݕ2Pֽv^jAAirԀK.b"~wγ1"|P܋b~'/ /40zky^f4\Kk)F |s|_M:*BiX1lNn3Huc%8To:RL!j2b)iB<.o GDJ5x2C08/x#S.<(Q>Q 3҅)< xdgB}$DBFiLaU6ST%6zv3H!9*= ?o{r L~EXw;Mp!nވrywE*3T/Bwjڒ qcSdFM;@֊ tQMqte"f4/׬ %Yq:aΐ ^xTCD[16dM* ,Fn42_H{U8IIjYMŘ#ҀXXŠa筻E'aqmF`_Yhs7 zU${dvۂ{ϋ$ݟǨ0'\d1tej+ǣfmkv_eiDk[g25u39Od#aPBj۠)3Njٴ`x▢^%.sYLLUus+xc[hlK0{wc4pǓ6lİDtKjdK(&wv"(/`nf&vwRKI˓迃ȣ8>0fxWV1k@l9bh=C8WBOju|UGں ^kΨWk70zؠ%Ӝvy^vʽ 6E`L0xea~^a>);3fgj^0erԌ }L/7W\sʻ݊p>-EE+pIr\Zַ>]G$߯9I%AY*1%xJDžRp+1tL|PbǩPBxth&(*n#P dTP1J} \`E2oأUC5MV[: XgyPov.o}-Pt?ho'ٶ213RfӸ9w(4qRn{"I9eX؆?=niSe!`jZ-ՇhvS5@r͵ ?&Gfjhp-pMOqΨ1g0gڰr_;'pupa#N?evvo8ڂp吉ʢJ"eiI% @FrAq Jl(=x @nXIy _=MIJ$xeőv p5Oa]K}Rv)\ 33CyON_gـ|P5U~WuǥX;=B;[Ffc&\3g. O^ͻWsX0 5 Γ =2-U,ߖ‹aܮ0mTѬ=0ra# -}v6o;sPuiŞ _ *&[}Rџ!ꆀ W7>KxQw5p Ht.cuN$P 6{cIF_.Tbp|>_MkUJAGR`wF܀ eC;&)qӨ } zxJS˃9-rQ!xRaqЇ1w5u͖,b>耴"J lg݅?ǩ~OT/B^d0mgvv\3=6 4*w!R-I(-9bIX*Ex)zJ+F/ b'z o|u[ u~zSٍU6;,l/PEϟ< l}58*$HATl+T=SˊOsm-A&orPUÉ :#Z+%1 `՜mʭV߰נ @1?t'F|f8d寅|%x)$ x=rCR؁ ]-0b?'&`~uJ鷃 ᐚ9OXVZO. vsjvq4ٷ{7Rv,囮 -N-Ԝ⑥,X;AVKU>K}?&l8,$=ah JMbwU<:UTJ*O?xruUCQdH1J ΣBVE[ZaތM aY Hsm22@3sDi"繃KyHQh)FgOh֣;(ϖ}lq!ltZE&*&{Z v1Z?bJFEeOvcb~y!pf' B&pYlHw Whd&* T(i:?gD!Ok蠟i+vQ.-U2|8cvcX< #V\%!.&6ɹOə+E>/a)(Mg:I)| 杕;@)T9 J5)(B _\Oj= k_XΝғ ް_gZdE8QjZ`ZJ؝ru ɖ8@vZ}\PƼk*9Sm5L Gtr/:kIW*YQѸ.`ZO*eЖE8-#+_k؄.>*C =ijǸ0yp!3EHbI+Xgt>rT`nYlsO 0 @`| DHf'B3b ̉ + z~(g8\= FH=P㈐w)o9@&<8t}an|Tī@XTC apO>7$W%g`ŧ<,А*L=¾%`zsư6{ pI ?1-&Ph^k%c,-ej {P961 Ne4?ޓ.? xyZ|<Pj:'e U{("{|c~)ں) 2 `!aݟYq~Tt(CL|5BG~YH}1BOĩ6\9HJ~TO͖ ^߳ɛvK-KmhAvl4̜vLӧy]PeS9As'ʠ&>_cT8&\VYuDxਁpj.ެ(>.Ѻ(QsCMx>zh"3tH XGgyfٷ -W"RxB^}Oh-KsY3L:8dH'ync").[ǫoL7M$˱,-H㙄SU#AL\&!"F;6]Hř憽[XGϳ7YlVDOh+KP@VXqN)&neژ+^LaDBXY֑h8eIˡK$ܬ)9UA̴tH̜5 j5kWWϵ`?iW#XuB(ĴF eѠLd{ƨi2)p!p,9z0Qhv48v;uy NKW;ggopr q 2GK@Oֹ9;RNSOCbv_8ஶOk41l:bVi*Qټ)qgw[GG txue^50^+g+GJ(f7n6."[sRؑ;\ZgjӠ[Q+f?m~ 7aQq_`trsUzxZ߰ $CÃ(/Q:Z Շ97kyVZ"MVӑ۔EKu%$\Jnۖ1[4D=}9EZ2\$PYj*%Au\ tv$бw~5yA7]eV<6rv?:%PED@6lGQ*]=NoQ)^R}ܰ;qoLxShlqjtd ļK| 7b"x CFNmMtmXW{OCe0bk4CUv :! QƊosS}6Mjپs37TiH|C "ln ukEx 3A&rţk(3}[A()y&"sv~H2΋&Av{%J NHF 7nӷNq  6;>B{Ltt¦;hs:T jTTD>=gCxY!z>76aatEw,| }N*fQB&dhS YŽƹ1~}{NjQ J}t}着s)ό\(Ol ){fs}\ GkTA\YZ Q׼kSZSJ/T/6_>x~U.EI+z ZUP-X]TkVD)apf&B]Idܨ2LpȀbp@1a;0 믵[W[8%5hgF>P3iIOdz`86hzk f`,F:}a[61J07`7PܮU <.E cൈ(5\6T HϜ4 x\Cw#{e0 Ye`Ծp11:O}U#"Μ!) X.Ӄ1zi}(XQIH {`ž+4#%DEC$d*bMKfUT[4ܿ{KH끹h:٘S"G~'"ub2>[tX 44I @WJM`-f##})\*GĶ&D E- |ADj^gēJ_>l(A_q PJ̘_k,i@fuwfkUX6WPwsya05b̪Fqj0'ƨΝXN𰛠ޙpՎ⊝gbH&G)7OΠ67ޠ$8Ty!t l13 f UM'ũZqzU8qS#Eҩ[{pר*>?h}97g}#&'&8?,iqs'XWEi$b(]LV s.p8Ux(5zNߧȔʦ ŵj-;dp0^/G Յ\Ź:=-sr* : pd3ֻ%ь8bVT95wbz2E,Iiabt$dxٳ%A[խ lMd8{3=<H-KdӴ dxZrNf8}xqRTzNʌ@( v M0Đ!(op75@u%G.)Abc.z7bl9`_4i4]o܆(:[fz[b7 4l43vޟ2poI {F.z`;'=W!`/^ kvI 0l)5:T&=eWiv"m" 抳bCJ$/`a-fyƙȴ+,&F`Àm ܰf,l=R6Yy eb*3 Hw킸u.{性RS$I16g}J2NV:mbsXFJ6!9pt*`x/K//Oyz4Ye}rԟ[w.^LN`'@uTJɓPfȈ\f-M<=legz-Uu:F@TR%aZԿ0BP~: -xGWi;&t+ԺjW\7f@.&9lz=ajHڹi(>69+j9lS<1ɬ?v!ֿ B8;yb b F?xbĮJ x6c\eV@T?!vF<S9t HX†Zv ct 哫g9$~y@` \_F3JчU걙K3W2 n2oȭ̜0&2@.C߃fN=1=(0\0I=^r o9x*oTq %b|!^S>vbܻ*:@oDJ߁Ca+:o B<^Yf ֨`V;IU ؤ8 קi"OJ2TCuVUqHWgh :gU[~`FOo0SԿ̉B}1ӄ;*^Gy ~ kïq[w;q/Xl9-sqYN" aE XxԳxTp>~EA9_h夞Jz`#M f]vc!5WpS` l$3wUv}@鏞I+" -Y=Dѝ̗]NhGd]ONnO>z)?:F XaRWըg W1 W\8qdpx`l)B]OQ|5w"ok-(X0b-i]"3=ڮpb]lVPqfŠ;IVL1A#tqBEx~1.*9f5 TvXMiM+氰&naU4 Q\:ʼn͊-ȓ]vb0ر#41y#A.{BЎ }3TNmkʱnjc ǎ_e3SvNw#6* ?ण8@r@eǫbo3;x#lxyF`\6:ƉGIb O SHaOs 3NOP*@r(T pb)b"~|$Z,F]_QW"a?L]߲'G_rfz~Õ4́&I'͆ˊ~J$iCfX% PЖ=gYfܸGk}q!s>;0`tW:|raM7m)SZӝNv"}ʦ;>:ѝd̊tva^n8lg܅xg⚓WekK7gւq3rr_0ܲ˩,M \VBVp9YР[8‘F=D]\W/V-/؎7:$0ʶ7M4 wߥc?C#?8.+϶#qN{tɀ ~063rmgZ@$U4sKҋL.^#R8m[SQ1,Dpb_zLjW.1q+'U}(Y b0/Iq~U鞻?qy&2 "= GK+C(\9mk| hr57;yPH lF*ҿ]=})4|xkI<KLW]s9Կf?| 7@{f҇)4ַf .z`dDf+6O[:(@euPTzl˸XbyZ{2p _k&{f ;w&r )C9zGι{؀9>N)P| \Aw[Vo҈͸%.8;"te%fW!Bu7퍻D0^d}т,k |giL+_& |HxG|Vә$rhrZBRZ\e1U, G6l }`i"L.,fh_,+[Ȕ@2?P=ZvgdgVMg Y'տVC*k_\Eo04}*XNDhEBpϺ=Y;wNKL4 99(a5t?|-;8O;t6*~pe}+vto6劯g`3*fIdž-`J}'";fugQl(=8'p>@?ydIp%ȯ**riW˞&c"aitnYHVIc!έoO&#!,KVkZ'~TA9DF/'wWbP(zO(zLjR|p݇@8~1[Qh-|9Hx$~d.t*'~L>5KPCV0Y,-C/xg,*ɓ8vXXŸpo} - -G/3P'ng hΒ EOוڙ*gaTwdRif 5P+mzAf 6L]0Dh6u uy[tVo8:ڭL$ empn:!r W492fMi*:I(+!'S \fB63$T74`ZCF&.C=3'SY*d|hTq,k!vrk9̕U3JNVpP.2$ L+lTBPI6Jֲ(nvtfcqڧ )ԯBvwI&MAўeBL ρjѪj.*ayNTZ#n3>f*jXA %gƥ&Ƽ2uՈa%upeHZcEFuA#tUJN cONK PEdÜwܛMT8Ǯ0+8%ĠWQ*طDk~._,PjbPޮsk P A_u7ygn6z0*ՄJ4]YsP&?/eM386h7h' s;ב^7ĺ{TZc=)ƞ5]E+(l:O*7?6g4=ї&H3@3!ߦ1d֫/K#ɆqȮT7L-+7k5V7CK22 MҺa2/(Ʋ4c\ kcmN}i>(uV^CxFpemR{Y\vN1CX&}& v+D9phkbŗQL#ܚ0XO#_؞-XeRN|d;C Fi0!+زpy])"НɮP0kLv8-k09$&d+oBsV]Ar(T*#;R7 9 ^Z)מw1xdcp]jD:łi)u,ޑ{l.DB Ph:b`2-uDêUKAˍjT'++]\mxb6D@+\M?;݄[\Xͮ}(Ni>Qvۅ{PB&bNpc>-ZR j^|ُ,*bBՆx2u}5wO .2 BؿmfsmRzHd=~)VjcX+꽞񌙇WƠ=0o`Rг2I@>Hk|2p) V1A7ŗ%Uxe 4;taP ؔ]>z4>X `6ώ}ڷDǠ"k9DR E$5J Mʂ(^{~ʤ )ޣ++ȣfha^CS8hl}vOεkad>AF Myt-塓:SMThL p`vŎY˖\i1Qtb8ʬ_ù܊{q 3N_mf|O6pUnGwNIA},-#FNe\>0G`ڂbB-[ p ~:AFt؆_8~;BNa5y MWܲFڭ$5cOVځm z7-@@4#p2w4ƣ&qz▎ansؓ˓;5 OŠ!DwCm Mh||䅳Mms`~0F-EY&mSj4$!(tYs=vN-KGRbޕ$4 &|A {N` wx߄yF]A!.>X]wuV:Lq㖋{Kr#Af[FHzkY53e¹d W61Gf94vP5ORY2bzhb3;9=yQ4tQQǤV.e )pM !óDg2\p1U1T;ؓ\ޣ}]%,6]\(ac)sΓre{W%4&6l/e;zorbPAU;<ՉΈ8L7󆹘/*6bzmM]gP2mN;7DCΆmRE)xi {efl^F]8KTDb FQh_q%d].''{%nBf'PwEp{L::L 1ݢ`u7zagEԢ7zUCgDK&*ix{:#gLk"EOz"W?buZ7VwˆنGv-,gjzlT?hA^V0}7\H49W\ U‰#i,p]NvW.g{(]Y&n'?mor" okoG΢cÃRGQjcסlqavF; pPա`;X2kwAyr&nΌ /J1Oi ݺSb,sV<18Yy]Kj'P ŐJ R arpgDM&W?s:(G!|W3?dQOKz*iF?ْpt-?`4Bz+&TDkBp-H[0ƷKG-#w.]:p/W]BsQ]x\։5ݮ9z|E|A1+;_nLQL_\M{a>ă~xqk_5B$6;1|!85JYQ*Pي_D;D v^Vi9.{ \A$Q'R.(<!DW$q%\]R"&LKטYCV >pf3cx5.@2Drf @mZ m`mQ` 3(=[cexA˗ɀrOvqu}@9fp q;C +=fe#Ι @zțY 9ґ܀m 52愗JHޕn#_ pWthu` qHZAc&)쵎>L&c[ <.[-hict$Sd@w jbhj·DF%u@Y;XakڮzL6}_,d{h7Nxn/43E={6H} 'bO$^Gc>m%gR /^g9vU V%ENWibv^ P6*C4ȶtRZʀaDbR6*a^|ި c"HPY›(6rjc 9pVvq( ҄[>A0Ȓ5}Vd~ZdO(BF2)2 >A/i} @;# d}UWraj5eBרVEP_( YlGt3;H#k4M1͘иfdZEq39Z#LgI? ``qt`<`)W]BF( \Êb,O=,2P,\T*sUFQz`A >2;'Irז]q8<ޮLcEj!o:zؖ\x" @[y ä37fa̛ c(۞Q"?;H6̀/|| 0{k~,Ko~v)|BZ: fg󛞟7ֳ%foyU#i a,8r,";77GZ\%9CJ`sPsXxU_hlޅMZ2Ȩv'B!(oLs+]*=cw-۾^P\3Kc=o1~K|0"cE뵽[9WVGf[Mf0[swa%E~~zFu3t;f̈́Y*̣B rw:DqϸfS[SYȥ3+p@ƚVsLmT.8A(i2ڣ06!:d|EJK IJ[nXLovA /9\勴ZU4yLY==LHyrCyqO~,=bIM }[FA_C,25is/ XLrtC Gs)ZB3S[M]o'qPqh7sy"[Tc/SB%P bsᚔ66,jN=ifŨ=; ;LQ:d { 3(|NT_=/&`8٢$VM{WZ뺶u[KNLF#*xLC7u+²pӱp¤bB|6XwL@&ub;:!Et>[<tf o6&}V[Ԫ;ź+5>&9<"K߇r3)-NY N>fZ{RMh3:q@Z͟x?Yӡ0I0=G(ė[^]0Nc[(I6Ǧf_Hj_90QDsq8s`Mfxokg^ܵ%cE E2,Ȝf\vKqgi߲~0@HR76Li(.8%XȬ$:cU*7$N8!C'tɠ-6˺M *WLY%&+nmbqDȪi|| 3ZDjG|yU멃^ճqVMy[ ͷZW1Ŵ$ O)-3H/g:Z0 i2p-$;u-X+Sg7y+|e&aT h+' N_5v&PkQ:n+٫Vx{xǾ› H$7Mu H}jƴ{s |jMJPL>dp*r=ajKė]#|VDunp3`,^I) aڐ:hUӘFDf3Ԩx~5C`1W1Ii[m|5xZMb8_m(CLifѱ'EuNކw{™ myޓǻI}/bf#jŻQUENh3ۢEgN)ݡ`q q+UE> h$x\IuUr딣h hڷAs % 8upl8RxO3Sy۶qkNg*wgyu$yW'D.vz'Ticρw@W%`?/Wɷ>/mm٫{k@b:㜛}^DVV-=R-V9VqS m7+:zd54K(]ݚO׋!,CoHmg}7J"J*_/ )# T;5a )LWXXvxe.qS?W5{fM̓8%.:U6V&DhLGg{kc3מa 0v]Kk[ux[0vͷ7p{DG.ᑥɎ,xD[vzӥ\Qg@e]+6>VGM˦k_eq3Z'DyTnqRyQs ՠɇxuޘj) @=gQ4/ԇ`HCT0Ǹ~8/{]o~Go ] cl4kd'3Zun6:2_~i07vK6A.;Z#^0'ЅGi׍0 b(k*(%gl~apPXX֒Z C@ݒց6y֋VniQjb6U~ 0v\޹K+ёl:&)fGy<2jȉ0s,`۷M]Vi&n;q#PV~8Y/jsӞnQ-oM8/TeUx85V@>; '\!jlܹ4I}n)61{0{@VIO\5N>vA:䘪D[؇mjxPwņ`^5JT,1TcA$ClGu} {m<}۱,kN-_Y>9y-ʭ boR 86s&G+5{ttIkWթX2,xM ̽~>ܺHa8mbsG)ug9Ηs>AF6~I+p##d0&h43'7m6iUБ}Rn6qpyN3uͥ;0M0twa(#;_+T`3ACHjC`PI0L*}q{qp)ςϔO-;d07.@GE` D|XE@0Z%d(d v؜]0F=u20 aFű{R1FSw.Zݭ2 0dMmQ2s$pK 1&z`dlʨ.ybsUxݧmY¹:,g C񾬱>K VZڒ*T@}?/I VN"1 |TB-Gt{$f~q209u/f`>)sZ8;_5!b#ǝ黋S6nWL{_|@;g~XW|̰ԲUb*2絣UN3]Ԋ:}8uŐ97/- 0!Q&/x˘Nk9L7`?&ڂ6yn(L@ob[C{;+hKc7Ʊq@<;N;H +B %yMل C</|/JŎdʼnJs obBRor Cᣔ9/ 4t%v@(u^R6Dv'lhHwB-6/ Oj8Z„N@I[BZіUE x7TvwۖIOVݬ}j7a҉ZvYCUIh}d?}?}Rġ JF^S$9 H|tξXh;6Mnu&EecuN=Og O9yw1i+y`j `Q:ȶݔޫv$3s/Z&=mj%u,B+E _鑿'ͲRwFu3mprtH#&aŢm>鰹XLqldXXO`.݅)\)Ap1Fs5Gtv7;h~۱H66<k/+90J%es!uC.|[ɞZ0?|:0PشgmPY c2hn츉q|ac~kfG%xYGxfN ;7>LZ&s*ָ%.>ՈESC&|&yZoCJѰY0,U00'q1b#ߛ~?ث1rl:-:0EZc\ ]77纄a-!*j rKgUq8Fe6YiaEǦws ${bK2(ޙ<.b4.cաnG^khD-!yw锍{63LBP$Ϋݫ+ʸX/{ƙܽc-]>DaoMjTB#k0>&E8\:ujjژQlsyhi}o<ޏLJS 7 dڤ \[k2mn8:. m _UG-ƶƹ(cÞ~HםgM[v=L,&aIŦ(A޻O\;>eJ{^;zC|4f?MS:=]x!GcAcLkV&Ӎ Gar1vϘNv|pgC:R8lȶ 5 ޼ywiD\꨸%?z*i/A&PhAdușg[J¥u~_ѾPQo?o}sR7 Dx3>/|}D3&(w"I OBOhq;S36(kokkGT#ltϓ,?Vml;[Pt ;ъl3jJb&2wƔ/*FH`]{S<*30ϊ=۽Aka/{\+ܫCd054SLwn'[ A&>9O-ee-ٿX1 ߐm”o/:$'fg[Z_-M6f胪&\fH-M 71CsX`{K-ԣœbWsX< \f׊ò#k^<\cJRh,*52?}#;z5= :QX'Ui-Vs?3# Qײyd xe >8@׾_lhգH:ͯ˯jrtbЦq$oênz~<0m&_ĤEH ?]jCVΆ=7 Ҥ:ukOCW7BԈڅ_մs o$19Y[7Um[DT:𫆡-:y' cL$Ȫ i0CJC]_|\|̹Mbyx_󫖀?MW6)>@FJ Puct{cc-S'V |$y2Ȕ%Ⱦ:_[96m=,~!9lK_)l<1ũdK P9bnY)]?z_Q€1*뷞vhCEY0Agfn>rKon}{<;Js.ʌQCoTdW&% 'K4b# GNa:88jli+5d?ܽglA8wt>בޮ`ydjMgDfhbۚ:3KE{Q6&>"`c;_笈Y=S)ه9ÄYi 0|Ĝc=:q阷 h;R!)m 'N_% OD(ws_!Yfu쯨 =qUKg"`%N͗5vyՆ0G9( Ao؍McD|A^ /+~+W魲yŔ4N!< ySn'=p#+:lj Dǵ.@k(SK*$3u>o ŪF1i㏅cl)6SIQ6i3A^kaQtL` -M L$1:7*A|3e{ushR`3Ҙ흡RcaQt.t 2 +c ({L7M=b"+ƣղPEe<><0K8C/~$o%6cEV&jj>2Pخ}e|B}Hv(Vp^w[GQ|'irQZOnd΢.[8w2aqM#x$b?1*hFNF엕܇}3۰;o7Նo\RB3J%t+b}n]|(ڮG{/ fݚN t)a3?TSFPMk@T3#c@f'-&7HC uI,_qd0d U7s nyoupY1_c85?P&g `ePrcab\mP"4Odvjl 7U{ ')sh 6=g΢378sM'FR GؓHa'l;F{Ogs޽1ϸٻdщQrkd@-]r!8yfAxT#$4hr&L<0.&Ov#,ʯ 1.P;&f]R9Q\g7*x Oe77eHW%3B;CoZ3^J[6Hyj- C]$3#6A;q27Y|loطTkǶEwQVTж/mU071@A 69ru;k@pFYGMҨ݄d|~ spj~< 6 7rqcҜ0AZaGtvnsm㕊Kza;g4>p&>QovVaIFc? :@YFP ٜ0ADVq>NVsWYlV@Rqy8^/~R"Az~Uf7#6ti&k z8eJZVmJ}cy{ӻx7 G )`V$3=5qέ{0"7h{o0NQ DQeAndz0 :l_vZoL~[˕xns7G>\HA&b+{#v3HT 7Lydm3222q" v}@ICpaM#~Vo9v-{O{qBUVZ'zp e_F.dezлD+ŗ'FURx?TaurpO cf x=(V4qu ?v;FɾbCVLWM𳾲7o f" P`fl%3 CH=Tb.=_]7-Qdz/Ԯ!PHbzÌZX 5d~Nf|;MTjf]PQ)';b #<{G?!*v,Ck5I챝b(Ӯ}F4N n`$p~ g7^y:]m_*apS:7:Y9^"3;Yodƹmy꫉V{67;;D,z_u熔R`W<\ttU]u`-ebSYXfؗ {d-ɾ >;:xap1B|sA}`?.5Γa\*fxɉ]&KTfڽV&en. R jm^v`pU!'U:hDa%ƥ#e'^.n{ Zqq1gˠa+zeˑ{W;ᾂs˚f̺^j[M`3"X9Tp?KmoԏmpMg(uzqQpfH[S+|JwORUxxO-(+6ܟkgTf`[\tAA2XS o:U% 7OC%RL\M!, $+.!#hbԼ%pQ3wIwܣ^1guK?L,M]V 6szeA:3bڗ#-w3tzUܫNSNR{Ƅ6 g"%jSqai#snm7䮉5 Ac~4͟ ꦺH1nW F p@wם! ~o՘UU; oѳB+v#~{̞ʝkiᚉT-}N&QB$l W]XW_F%rLql,%"53<{J_G^\՘PX-{u Qjx׋TUW ~4]Ljv<8vKA=tePlG*wU0L7>eI" (kx1巡/}}/=F *۰q1wc# IvfiZ*5"nHocbPX/w5oyiJۈ$?Zw ٲ%PY~/ً4m{3;InQjڅɇ-7=ʵ7׊.Ȟ6ld|9Kp[ml,yk7Iڛ7\TeB_Жb,l#w^r{KU:X7Y+и@sNVݻRe:k^6ÑQr}8"\Νi3\WBskq\gX@œ*hգBѸlJ:Wu̧cj9L7,k<Vv\Jf-Km}"I{W΂Gߔkq&90w[&4lWy {O`* uɹT%z%G zJE8w/dݵE6ݹtF9;(IJ(\  vT՞I em[& S۰3Z1 .d ᗦ)Ͻ>bsӷ NUb@:aXhOH7S2h+[ (>%~Ԃm0rDQ[CIVGS$fŮr^K"X^\CFO}omDa]tv`rbAd7ȣ ycy$OPz³usWL9d=29ӓs(e Q|֮̒xd"MNH}RfU+4c[TiF_lf#~FxLLdvsU P(L_(VJوfLSrL(+]f,팦 ygm]W "p雾Y=S}JeV V+{26{2~ OƕW = 2U};F\ԥ4Rt<_I MjOAN5t6KBrPh.2Hd2̘Z{3c# MFSyHnlʄ07uʁ== {XFMP0AvPI@n8M~U46FL\^d,ۍ)_]WS+C"g/[$(Ret֎EXdF?z52<MR{ͣge}*6n\c8/Z)vڳܱX$(5Ĭэ Nd+)Xk#'R#βGT:l {lTdjKb Xfx1FG?ƗfsOxVT˴M^鈏][ZNɺAԯ _51/3_ ' уq@}p`?W;O-)ww@*qي[34fT'Ȇ6>;ȉݞ9\JwzQE#@t<HퟮT'l"!$C* (xZ@"-Q#̱:] aW?G?fiG%vJ""0[ 8Ҋ<Bs3\)dQG-J5 k ľ fM!P.r;sN%S ">6s>D:¬3{q8p68`{ @5t瑨}K3z8Lw#sPf5,y6.9WUuz`y" ٵ<i~p*|sҕ*gi(~\Nt svvNWcCQ1ckZ sb/;7U%_@IɗeƆ׹7Ka:Py5%t`&hأrDzyRk6Q,M=Ґ{j8lC쭅BdS5~qhhZ|j*tH|q|;V)8>xp=q<_rAN}|~llIu>vj85<:~2m#at֏texicݍ8gh$}ᇕqV봙i_ 3o l6w6"n+%7q%BD1ĘkIi@S!7CzhQd9p⃼cZtGp@'V9]dg+5>| wJ/1 CMɫm?9_9p# XsK$g^嗛H<na qW.ӷ2:N[#ƒ.ޭc;oX[54ąxICK{"HbwiZXS m$oV7n>GcxB:`Q9ѩ-=OTQg}FNVyjG@e;|* o|bmeI=I"Z=Sj|n.*[8ԪvnW@ :Pt Y0$H=sQX,L\DU 2z Jba (1 Yʨ=ADl88Eoܯn@CNS=̚ݨ*ImgĜn]&bd-m@2}<{ïtLɇ ؼC_tՒmSaxabUqW  oGir9D#$ ~Z;mUox4=Vj$75@@74̽ y0;X1N$X- ȅ U:aR~m6+[(2i.t#ô|Jm $ʯ,*mUj_r2'T/ ߆X4M@B?ޠwR[%A$0QJ3{&.z*vPjVf19?[HRH.퇝E!= #j ;N_}LhEmR*g!tU$K[m ,YU9*M"@l]Jپ_墽Hfg-1U ubNyHA3oC*ۺwiS灈T9+#Q׸4I38-L:9e|oȴbz 5l?uy ^\\pW]sn7}-Xx0/cBEm`~ q0,s74r) uIhTZ6xmޘ:蠕v0-H[i@'[!xޕ)[h  {$8I E?SĘV /TahmrMAWKM 7 5 6#PF;:Y'ObLQp^ º"Z'^4؁jD^U&;K 4?z+mw:nWˤ=ڿiv`$?u< ^ @n uwĥ X W >v=g0?W7|M `fō V:R7>&1k)UB ^DԆn _< > #Yy*CxUo;A&Y;K9w_02SZP L"4jõ?s|y@p?z_ӘEQmt( cd=HbMLJ RA3QEv^C%Ro-s3s;OULl(wؕgg{jǔHx,GQ+Sr$\;^' |&VQ\ѧi E ۜi+VZ_y{c<]&Ǜeܻ ~Qhj]ß {,=s$Mf̎}.gʰ4o >xfF&=>~[O4FqK#mi{ ohE%Y4}WnO 浕Ѵ]>Me3S (ɤqZս7W[☛vlag~І9*52\|޾i꽳6Bڹ2\>ZEƣcš(>wٹc@aWԇ˻paB'X%];p9:m]]*)v8|cN W8?Na""Sa37F],o ދ!L|_6͒ߘ>x/˞jf"qikl07%exe@an~`n±+ ٓg^޾߇D*ҁzٍsGܱwL$}cEkY)z6lx`O_Z @@Sf4Max*26B579JBwkzgh st/xQ}zV#2Y=p kqKX>LkgOl]+#Sa혘&,))?gǽu>R}Q ;_6sMTY"5eh0/G7zF~r u5\k3Ui- Av=rQqW^.avgE*ض5vyÄ78^bP&vGk;Wq*WDa}u7#uT E:>.N$40- L - >IȠC+G&l  5KsX0T:K緩Y7k|uj<v]w:O5!a :'wwtO t5G?'h3=`[ aϊ7;!v3+7߽~iJ蜏TǬr@csz R%rG|Ҽ0o/z=UlbhTx,)lZgܦsqp3qJSV1s.FnM= +rԛv-9-&\{Z^{֖`r}R7soC^یyuiF<}+zf׫ܑψ0oV\|&s:2ѿ j뽁Ʃ7Ⱦ%p_<h"zQ`tܢkl]o[q7NajexG~ix8F_,lޙ3 pG^s/Gi^}_ٳՑ F8@8{ h˴_x]uG:Q*J$V{`cެEڋ۔?sz$ly=JFET1*Kh'pCfJH:`vGK+wrGl?ؔT\סsp<(nú۳t(ͷhPztkکiGm'n"hĻ=٣IC9A =yA*9=ȣۺGg"{e"{vf|”aNֹ,MiOOجtFÞu`$bS B_0C˻.΢¼plVѣv">KՌ+7f2#`dŁkYĥG`NF3sgȓWv?m-+(a.u4] wG+}A8CmJosH5ygcB,%If@Y&Vn=8̛EVz8y7ȞZ2x,sIqnkǰ\F7Xz A `D(G8P]X\J{SvEZ @n udm;MнIn+%r/\I0ѫ1>՚dϏ8mn}{@i׽uJoꀮ RX@%j*~mS|]hoF _c#AWv39㴈Em)tޏ7K> V-~y#Dq6[$z7r knaHp&2p+ri h}­)צ>Xۻ^4+ S[:2{6CsMt_FVeQ[FctQDw`?P#G뱶}$?sE,{ݬGZbZ7ͯdx${CInI$ƙp#uGC1`b=8D|E (6[D=RەYNO>83uqժ{H6S~q Tvԅ ]?L#u%X~#S= Ǜ&p[xZ[87 d H sZӋ8#vڝɵ-ԍj+!M`v|v~Winyn-| pK*t9mG~os:b꼮_+~JhVm ݧev%g`wK?VZBѻCӢkDA[7:og:J{K[Bַc;WHVvW1*/}'DjQivl{fn1mdtM.l[l|m]^omS`U{q}Ϗ{ilS(Ql%ؔ rz`;o}' |oW[td>xlkh;~BNp-^lq+9zq4Fل}~A+P`LL©k1*w S]Cw;տVSg羱0dx.-mv|jxv]]dŞ>ԉWZ*L[m;N"ZrnvM*FS':('L0hm4Nɜu4NLK\?^{^4n聍 ^8طdus.]^J}SHG:509^n (y3 9&f]JκD.d {23~/Um ;lYK9ڊ0iT{7Ac&s+pPu91=3zg/ZE>d=]&pzrGԭ#;+hOmԠB.Wi*W(*kָ4\jln=5w{Le{mM l0Il!=Ir[{òeSdErOwt֋W:Nmg=tyAا9i'%z|lB\ gaûozVK=N׈o6̗ Nju݆niޡ+8"|4[+rf:vo{tB%,ts6zG9N QԢ e7Ӎ;*&U2hhД[ap.TzC "=b-oSn^( 2cy^4zw#{_y^S(;|ٹSܸ/oۮ7 /bwY:z7 ૝%7vfLc&G)4)}aÞ1$*40Ѯ7voW+S8{0'(n s12oG {?|[p(oqnNE#{(SF(u^-K2A=!"AwW+gٯhcC2(CGy!58ռ`SQjϗ;n`5kVW)4Gwǫo~=H_OEr4#ܺ77w wxJ0\Kf&2OTg'\Ӏ{\ĦujvBit-UEIK]c˙~uL8;{wř>& 5gJܑ(O[H| mR 3OFK7g\%p:-c枋ߠ-ؚnx" &oK#2\3vNAkg3(cXـ {<ٗ3<7Ƚ?B= 35y'=AӒa`5[5_n ЮT'EkOn Y&$?LlR?"\і8+$:,MԝV5/wcEϾb~/_F ϞcϦ($T݆?ȾePX 2wYI$R+t㕁Jd#b%}[;ݨutVd\ $c^a|D.Zrݭc2j`cd|;[B7쥫hſ=zЕ w{B{ޭ>k+TG$*EHa- /y30E.tNhWqc񦞭֕:vӁ+ޛԙ+ƭ7WhBƈ˽olZbO-۪ļgCDpL-|k6yؓ: [?q>v!7{@/W=r{`"h yhVQhDk^Oئymp1.t47rn[l#}#K9U9E3j>0Wo_ވ? Sǵcovouj+>=q׷YԳ]vaU`2 *ԛLq#j_ůXDjcmA[o`/7]ۇ}-j7v|ڵ$V]]vU8/]jqWÿ3юe7bɟPQF'>@WQgʚA1OU*b9~ IW=6JAdǡz1n%Ρp֜kw6 ;+`LilrU簄͑ۼ`ChoE1 qsF O]IyS ;ge` M`HnfT BF(ƒts>7WЀm{f0jjv֤nO%u_r^&؀45DZN`o:Sbe:G{ԨG*< oN]nН48N&uh;6p_?]jP^dEzȯs"s@쑩ߞyze wUbQnM~P;g7ma _:cSaL hѤe#zjX'C=,1 0J1X^@3Ƅ5Tm0{&Gonme-/GV1l"% uާT܈/.ÈZ2Imp|Պ[3$፛эJH?>_2|ˮKp7*5NMe2ѭ,?8 DTFcb&͊+bml̩;5M]gޠb쌼$Г;=!΃[ڣ7w_gע:S)b$ΏrX6q*Fty(Gڒsl:BY]+'t`\&SC5@lI:)z/ߢSAE*N03w!713‘)/] $>BMEu)--Kzk9ki VMUJm Hm % -8P)r)CGAb:NǃM8$o<,,M2l}y95wٗW(,my2/aq}(]IG 11;`e V2>pɯ[.oǴ"_*}`!bR ⳣςX5dڇ}`$]k*?6!c0oHo0n~=_#c򁂃;g8ڂs JS{V -P=5]o`/غls$e]ӽwl>IEA3=@j bXr(-# Mb!ǣR wŘ]Fܝ b PpM,D)@Qi(lPС4i}rNcqSƓsӼ|bIw oF{#@P)]hgCH );ڍgYvAUȤ"al D)qO^z'X1Ci^*hAQ(VՑό}V,p]t4=ݜyRlȝh;pU깺( n+trty;ӆӫ Pس!Ej3<|}r ?'A3eW 'cJ'+qqC*XO%BMZl fO:8* yl܊X(q1kPyNy^*|+r2ߙ?HFd>'fQ'Q'^V8tg1623G؏"Rvu+yxTJ6dQ3%,o4c&  r iKNO;w}LJc|bseolv+a11.+cv:"7cOu t^\>A8kaL9y7?;$ =LtE )@CM7v6-YL{3#u =ÖɐRpze5ЫnI$Ӿbkr'|i6g<>I۪/gۇyw t<ه+aT݅?Kx'GBPVmhjZWëX.=#K!y{rHvѮEY#2YqI$3cZDvUمItiM̈́vc%]ù :dHuP*N#^FRLX\Şy_ &6U莘I_xr1>WB$u0f pfB3Gpܿ1"J$K$XڄOoҏ\t{p-nD,YY caF@_'Lݙ8KL9n]eEJ'ૻӚHtc槮J2  RpK1kз 6t?ڤ/'W>s.ׁtGQg\.ucS`@:ylnjIUmĭC$ە:TTaJC<"BdVqDtRG춌saQJ儻ȻM^9YmƷVTscFFhp4Pd [WZ6"'%S:I!"㘮z4THa0%t.E%5ש[4tllJ 2!I6fzaڛ:4cLм[嫑㈖A5+3|Uk6=d MpK^!K(wbp= S?,?-iCtâ)| ̞믎՞fk_{X_O/;qXE4# ⣏.#x8 fJӤ ԵxV&x-VԜUVCuP:cL6KWd s ӱB~Q$ p[RI":q/ jXn>,x9 2t py\8pݛr>X~*ƻϖutɪ<ľG϶/gedV3S[<-?_i)8QV^=Z)ڤsʐ-gn1LFnm>H!{0B3 ɖFFy ~(O#KeXڱ^ۘ_*F嘟㚂y&$\fap|ۗn,XHC8hn!GLSYV75d^q: 1FA94OCU7g~L+E/unЎ65 p;jHNtHl{ 0/o4XO7k9Jx=VṶkK"aM\Fu(J'bF @O7k ?6"+3@݆yAj.GNpß 2Em9Xz'Ys?~R'm=n\duqjVq'8H1q-fJ,VkJlI\EkM& `˞~#Îùac?рgvQGj}RK5>nY8³V}m,jqh醗aH+ Z=>6N.ncuCd=<NJFJ?`A *ahGv6?DOႅv}DeI:뉙MNS`Qdz 3ڭ4}igV<(?gmg,[NG'XK+X8sס;FM2~0T#K.#Ösϖ]O'EcW답{gn/ęnBőK1w_?e¾7D+c,+NRmf7tTMIk1/QV֐s›P;gVb*Lkt;T^4/xk/'੕JNh7=z"KD%0X.4tocm;)jmxu Np=΄CSt/8WuY ^Npmݚ-xEGBo~ɱmk4@0 {8CI=xz™VM#qB"O/k ܒ b芗>zAa[ABzO$O )ľT/C0'qБ\rY }poVMg84x~Ii="]Kde3w+1Ϥsȹt;`ؓ#D }ŻˬP Z~5&7;i[c|!\hQz5m:2 [if*q>lZeS[gV_o"x/Z̋$gײy2Y\ܫ"Fq$5J9^'asoѹOv;a˨zI9-h͙Wu)Gc26f&TFOϳޣ;IlV#k._gvȼ$\𱎓]%t0oJ'<?F3T?׀FsRhI#6ۦJwf짺0 ^3JSVװU;<,YaU(06ΦO?C7 kjZF6ƜJ# ~B̏d֭m˃z5H<=.A;?MQJ7V 도7nչL-m( Yyx\z瘠CENG.(8>mQ4ZDrt*}h{O޼vRs=$cV:bwh %]h߂'yDEWZ*?|cHk:_]ܣ]/qGh#' T#PG /=}qhK#upQ}4R!_o^<*/g7JfLڱ[rH _O$$%Qi&JD-0NHIgزfPxĬpR=4((H527"5Kמ rtJ9ڑ'+,i 8:x؆::~CG冥LnYc߈WFx|Bo 81Fk +Zؒؽ˙uyx^ "r-N3<64680 }Eb%uw~ج\{Kf >_DI[u$rOr߻_.@y%ePtC P9f6#2qqy ajqg:MS֭k6GDեK2HK,I\y,( XCOwkfIwڑ{d -%k/SXKt,KX[ZI>+y3Go-Kelne o SG&(lI_S~1r5w{HZD:h6)#'>pHL.}3D&@̯Nï%fSh+2]: 7/ѽxU yBwfk|s'''Ƙs%ˮ$>=Qz j&]c?5ٿY1tPqȾk^﷠uHƐA7+hUuXqbŎv9ґEtJ׽lc{Jb\O ۮ$u,qx`T: ӡj:ןEf m "i꬞W5`3+[5y0|Wf_m!3Wc0-{̍3<(X \U/ vk*jVZԫ2YŸ_vL^N\]WXc븐|#ElRx\.ŸX]4|\{h|R0w02_zprkbKh?cF@=N;?%)XHnɲ "OnVxIJ̮0\Fuy[48w8_҉=XIFl -;vo v&\LA1z~JuUoގUGnȢ4nI-wy;7Z;jmYFۛP3¬,QO`ӡ:}bT1L6r|ZWcꙂ9,J׽՟z`cV+m8?1 :ZKJu dE;E,3>e6?;~(46cۓOC9<{^c=qXd{(? i*[ ]8u]Hù.P0ߘMr>JaZÞɕӦWq`%[1O]g'càTNOnxGYqI^~qAYׯa u,WocOu"\y5}2@o3Jx-tzbCUҙY*#ɳrsGPwW8? I,<,UtfrD$,U8}C;6{·3$qj3MXˋ%A +ln&EkhM95?7 C6w۷bё4om0F0/ԿD!V(I:byIp ;>^y)gA^oHq;!D1qIgľi ×WKw7M=âˉ q tJcL{t9.R}INZpe%בȈi(L+W#]vd[z/i;Q'ZӒc:@3VhpI,Ǧ~Q޾ 5wu33+$ׄ3|YҊqP|8.KdfN_~C-A)N_ˤeȫi/y;5ܦt8(l o=(v0>nK#; "^oSw_G?kW{cEMĭv5gm٣Յe“G!g>Z(rRy3%\)^^J |{mwVFr1PnUX9llh4HO3Ov~ҾÓAlJ2fU.!EEᢸMޭeNb-7XšPXҙ? ׇf^D~|6w_wZ#sV?Gx cMCN'e:,{aQx%'BO \k9512!'?ts&(}7O>bquؒhn Mڹwōo{6G(,jb l :H[@y` y*޶y+ҿanp3jveٕխqbt>Z|`tX;U[ y]ܗcY\lӓNT-&pHՄ%ڝmth@d@̭wkY-0\?^f1Gn>/sUQ5R,}=E9tsW9|~[AW$Sť2U,u# .qNե| [M3 g sT"w׻؃^=(Kgb$+ά%F"LLckjP| EV#/Fئm\gXD{nJivr|D=m8ݱ2atEA@'7qM#nˠjJބ''X_9N+ǣ"8ޱnԢ MyRp  eL?ac[->Meso~ݷ!%-Fe &#fdM5 pT,y -'HfG>q/+&Msõwnvo*4]umo2&=?vM;bȤwq(oP[ti ΖGu-Wp=|MΫKXCr_أ5R쎮Uޛ':p֑xpz@Ffgɨ"@DbPTn>n=uxYV]嗉eũÚ<}`p)֗;{eA;7fFkmiچQ47тe/FՂ&,N҉XPyI8a8^;yCɄ.>w3ng1 <셚OĦIݝ-Rs9emeBŘ(d}E;vWRPu ͣr@+R,F({?PNl5+uuk*6u!fwhS{;>?}6N4&Ej:" WyYZ>s(U րih^ c6=^ڌ|xN:]GBi΍=J7Ze#5Au=XW{ծǗBW:\-<āD g4KN2}:5vs^i‹E=`qZfvXLSE,=6AXq_ɺ1Y9Sb¼'u$2oLXf-%, )kˆҊxc-CN3xIo.Q t5 Y5 khTCw`עk~Mc'cDeWX/sߡi};.+Ugi-<k1 0xֱطScыE0rFN4Hrb!5n!o|kf5/S|^.kCUݰ_ #T`|5 `yxkg/Vco{;gxUNKyOl6|~}We33ttTcr#*举!t&&OLshOەޜz6ſ֨l[#{zuQi4|Pjn=!mt (tVGVd7w-ͷ߫5tX: .{&K+! f6Geye c8u_Z8[@D>]gcsۺ> Bki)DC_lZ=v X" Q@]ئ 7;]nyy*FCx˼qSgscTu#%f5{.. %ԯ'Qt`Gʕ;OQpKZ +AQːd =6aoFGf`cat"lN2ӠLk_=݊ҍܫ)1Jۄ̾9z{|wկEq.ۛOdP9∤7psMblZ],o Fla%6JF>{)loKx̨wKQ z,/xyy|` ov[7k˃)T.=3.Ff#tL /fxOQ閔#c\ڰl+Iqhb2ʡ:-[ .bf;IcRLc-t-@]F_sB94  D,yV?=w@tK$frӍ(S zy#s8DbSIgV.iz&u f-?z9]KMdY._j{ԯ2:"#.Apc-;tYSonE9N6-ْb#qo')#vuB|3+jvX\sǦ+˿5YQ0txFÒTGC(|Okuvr6UNuƒCu\^{C&Uu4~ ]U*i"MD'-3/bRk:+>t9%ᾖȳqfne_-3l; ߚ4gPXq$wl'ISxW@uvVO$y#^&Q^d[*[4ڵТM% 1xel*a24E bJ.Nr'{p;Q۸iԜ~6$6.1TB>hn{O~>+fޯIݲ&Mޒ0r,Tn<m=1UFC U.6iĊcn+3_?[ܚӣoY;̋oJIoZw&:_lruRؿ_uTկf:5"{rmS GFZ5s 'PCmϣ['?\Xv5Ymb!}8 :BvwTh%pv8ƨ4+@TnLt -CwhEgN8kسQGüDEq'jHP?=7 ~Y)ģ\O=:9Bߟrft(Ɨt"'yAPMs|ɨԳ7fAޝD"!'<"WCG^qM;$hM:Vk_=F&·#ϊ$֭ktkPѸav#R(kk }ﵓ#(ݥkw/Z88[H}P{uLvOqک[_O^=Kw"1dʡhy~e 5=j5wG שt쭁pnt0J()uچj%"GB\ՙ'7~4~xLoP(3dO[걌} R'yxIo=utøv~k*u=7Lǭ,">%j[3(PvU%Z7oG"EvwbqxÎ l X *mGӨ"$24oKd{`k!!/9yRNqgNl6>uXHp@; 2Ú9c?\HrC-{ ՀPi$1b3#%~ .`>4A#{Eyab_[-Pʰ+-'-^̔ Cݧ28LC͟ @&S]N"r _}@{C5n#Oش;:(6 i#_.[I39H;{v'ko'w?9io =).JgM?ٽfiI9aɼmjiA~S"d=q#/ML',z,~J>}I'Cy:P.e!Y=sǾx%ӯ$\GDM+37 %!;_꘱9[']آ{z9x=MO'ouR>P1+컏v֡mZ%`T v2J]-><Ϯ^2>'?1R3=c.:Qa{^ opG.AuO~oh6?#9yѫ'N&[Ϲ;>>DϼG.$:0jn5zŕBsWl 3S.+^ֽ"#Q2V2hc`jWc-xCjp+&#vu.zw{3|KEk \4-[k1[4_#~ϒ0w^7 9ɯ23ADt'xzƧVr_=t)0n2} B#n:W3W"5;yمh*gl%?%4w/#p4ŷW^†Wg:\^킽č&1 4tkE c/34%F=!ϟtjFHBeyʙ ?C% YrV;;:Zt{K.|D t2 5lÂG=SoьP~alںwS`rd\ RP-qKg "{~HKg]s+[l Tq]F ϟl$uoʛkoʷc<.~G:K7Wc[䨄 #P2'{t='K%!+Z^i`Osci4֋1l#e6 {\ipp;']P>yr椘 t50HH8L("k Ћ>Ow" k"'_̓j`4k RD"zAG<ٸ7+. q;ǟajɗ4E<΀c-V2D]OLRXҙTFC Qؽ+u멞lda@ ZVZ;5&-ME]$YOͭd M5-goF8>šcyӑ]wGCaUpkT \bF Pˈ=jIw 6xz<-6sY;;wK"K4~ {mG=Mqrx6ͷ*xH~0Ng2SOAqɘ-#jKYMU\ie VZNyoѬ410~:𤱈|jg'^|YL5cC"݃G{_"{;dChٓ;=FF[z,CGȨ1ۇ=zvb1w)GQ ֿ5L3:^sqǜ!cױ^igO붱 Gs xQ1L)7ѿN92ߣojϞ=f&,A5xVtqcpԋѩ9]=|uq=PU/7ם-ڑכQϙs>4&[ϼ_xgHx-/Dqt3r oGJ>סk h7밲fHO:s8YR11Snac/x7;#+UG}疯qF19 bH*CgnMfw`Dv qީRiWLJ)`91i(Ik˪e=0Mkw־턛ïz%I2&1/J2װkīF:@}EucYW ݩ79u){k\){:G:Ww/N쐼| : +(a&̖t'f_y,8/K-+ naC¯0L]hnoP|}$} J8hUǯ{'Z3Al5M4k_ٻ =:.~+GPr ï7|gI-߽sw/9RЊM>'T>aj<{̶ ̯j̕fjMGS|/[P!CפD~C'fQR,,ܛz.#~;4?I)ٗ وeeZkQӶ.rrYhxPדUu[yܼ_-.,_k犯ŧJTzw7vspfߘ"7xXCd;:ꭀB$¡6|Oe< B}Ka-b7Ƞ $+ )hu֯?'ȏ ކ0VƜ>ՈK7[G?ġ + aǣcUDqvMk]AeʭrvώE#G ;i@N{Ae0l+&< b# w,؈`Z^7134{^k}.;qKx;4 XNҤnYnv#%ss zZn*rARqwIa5_#QpS3.sC`mkEz]d\xI#*m0S"IC`F RGK6o95[(ul[kP %ڻ=4J~Gt ; FvtY4> >N_o?fP#Ej4;4nރ~ᵴMkެMx֘z<+/FEݼgj№Au)_,V:ztn -]Z`Mdhht9x7m6r3xgȠf鞯d}s#9JW"t"\FqWqP :%VwS׷1pzeFOtgu>f6k.N$>\)KA"X~ku;JO#K7-$nbfwQf:!sFͿ%N Y{<N^#xSħE?5`ס=(*]m}Gl<+֑.N:Ob&X8bLp 4 l,zv,^5\][?tK;0(] }Z|2 XC"6L6ό5x&MWޅ3|aC7 vڑ @'8)v^ˆtyHmkh^5S/o^iͭUpˬ"}8֯v{b 6 M[ѣ;PD\.꾲~oy/ݖs#6|$cZY'U]S0_{ǫ y))x"- D:Xž51KO҃X-ڽk h{Fۻ|cD:b5y3O |[溱"G;}K"kgʋ{^jkx5uz55fW;G<7ߺ-N"'t"IsKPpcՇARigqa! M@5utp4e],a/j ܔUVP8G`H$ ].wH,9mڇk@f5G~JZg˸" 2"9\?^W*kͬݯ/ݝ !KT7n,yvvu*]WPK|gyǸ %cfEM%bM^,=^,cXqswLk?-|_^@YHip< ;5s۽m ʾԉR_:䛡|w>j*#2ƃz4Wz*,ᡸvu6aͷW̏W +nM2!oWPsQ`Tߵ{*_o7L`?hC[`L+1U_8\Lމ43[o{MxM^翭跓H* kǖ}xpnžX#I-&w7+f:H E)7M?~,8\яAH51Id; }Z5B=܄uØ<~o(%B&'vد)f\Vl J{,hUʾ 7.6qyM g y;a%²-%az}ŮT85h`=wug rlG~.&\}_368dYv{.dzxv˱_d^~LQ%9`3e8:?srj:Tx_Fk=!h%+Y^NhN='2/wyb5 xXd#Gn>K)@V]A?XR^eW8iMEҊY*Q &jB *}QPFۗ!G KOo%MBWɨK~'wty(:Pc2I%P`g^:.R6ջ=qb5+h1Mi , eA~-(P'y5۞:)8jRגf0ɲ~Wޡk d?z*|%dՋ'H]辳#B c6[^j;`uTSG׀6,oPpX7} Chŝ>.×e3c >Zd3x!y)}n2oEqħeC]t>qAR$]m=ľO6[UIw2XaΖI%,s=JQ kÁpaDωM\^>``K)MVK*>/:f;XsѾs`>h0WGC$~y34; N`q) U*{ÞTђn=4ޫfbsRbN,ÇR x'Z*H87(S_cͬpVG=ڻ}vaMKawv,)~=GZCQ9| ~84%:vE9$xoKq/k;5љv4Tx{z'KOGkZqBRGڰ[i̿Jk,HaOw߅kg>9Ti`u\s.Slʒ~:S c E_eVl  nSޛ cL/D5S0~ L]=ڼ5r*\݁sw[m.=pv v 4eģ H:EڻZ]aIgփ`*W:0NwZVا/U|;5; r'(,;&y3:jQi^' ?E1=<..ιxZo2sbf!YC#Tj]gD=G}t_$CJ ysF߭n|lLjU~emjE'AVk<"\R(?],@dRWl]}j_'Jx7v@ @п^`&B$L>۹k4?@62͡XpղRxwuZԍ'ͨUŻFRA|{|UڡŢngPau<\Z`=Yf+_+e2fV Fg^,9>Xk4Jʻ%S홢m1'Vs2w3z&|zm5s%fa=<]WUAFsJ7xMbdވP:j HV"z, ףXuRe^5>ɰa<%W/qa+BNGK/eezYY⏛j",y@hh>|\ƱZxY7p7fƨ+"Ι\0+-3ۭw+Ɇfw‰YW \a0sTF3hhwȡsϼ~1[;&m_5fTh(Ҥ;.K1Kt_)EwK_$Ϸ*+k fC8/c ޛQf~!UBDGlv?0vE&Ф8T^O4/-[]qb {^dKnH޴{|fmE9ݢ _5bn[L\ݳ˛ٗ4xVEPO|2ב C1 {up\UVt<98,z!~۴!yM2A/r[x<_"FA%`bbbͪڢO---SH!O ̳ofpZa^@5 RgJo}riwJN&{ΓZjtyߦtޖ!ZPBע9X0BF]FtCp +d`CV+0lU=8^S&J+dcC/sۓA3^Pjm8t9Jo}L%;쫙1{0{մXܧjVNVu2J1^Ox3Rkr&n|PVbO> hz?m^'&oJUaN<O62ywnf]Bax1=HvH\ݜ^[=9'MӱqMǾ~WU]\=b(9xfp Z-X|b ޏ?k$M.VKjyzP7$-%aP"lrhrTjQ#F09p9ܻiWG@!ƽ >:## 8-^9}5X|0/8L#;Ί1Iיּݱnoezc$2SxS321V>x>g+sT|[\&b>&ńl (#`u@lRj^ׁ93&]l?>b |Z:lմ͌] mI/bUs~ʏ=IOeDHֱ;"(uaKL;M,Ջ VOevHYI7g.G fŌg g6#qKbCN\"6'ޭ |9VN'ɤ:Oj*BIF0$ /$UUYvɺ6Pco+u;يֽL&VIwM@߻H0n"`!&\Q@IYnޓE:*1d8t0ô>s3?eܘn W|JJ40HGuLGQ}#M}fxA`ʺuէzŅv@.^ W U@jt\oGZ^n s:0IuQΖx/A/So鎿_r_5xPoC릶zpmVM6l?τv?@7тHQL@ r07CWDw; ]Meh1r@,jm&~xGrZ.JbRMʎ&Ș@>Dkc B[%!ngZ$iK{@43ĭw0sV, 2H &euLI晼MTj@I W%=F_OΟƀ ^v\o/&w~)Λvϫy+*mcF*Ṱjd1'`[t+[;){D/`-iZ|9ulK|('pT*{+emщzҺMdԢ-gnLT$'B5f2o˙X{]̿ğ~YKE 夫c*HW ,k]U4O<ޭy6gAGmT"͆} A̡[(߹:,tJ-dxV/Y_y^Zh^sc@ ,SY(V]mf1S,+op +&ͫ;c:d9}_j)f/rXMi] `ulb泥mȕOs=]Lr]yllw]=>LiH~Uk{8@<-[m*T+\ YJ_W#\*lZ">Zh>H)am? t<8 ];4RQeZf\&/-V7 myGaVtLɲP90g2VҬH^n`ltb6FH1y\XJL-01Q MCiPLp?U:0VM aeU4:n57:.w̑Tk=d\#M]Xm^o^ X+RN`{Dev hz,Œ J=43SORRp-UEuImg*'U>.7-ZHQE՘'9Q~<}{/F }3ڲ7-Oԕe=*H,0AbLG%9DVJH@κ2/wNhg&f0d0] )'r &(v]ŭeiu}7$Df }[wID,MEM[AQP1>M:T4[wDnE%:PTPKή/_ko7W@yMO*&IW|l_/?0_TD^,׼@c mׇg/k̿>^w~b}8~S@)V>tDϰrh}.|hYoۣM."=SIf_1Ƀ%aU[E8*0K.\?lr-p #&h͂#4ֆU>eqΎ$6)`"m)1!]1Ґ&P2̉Gb(>kz`#wG|ԛr-=R!hD3&P,V/d@5ctp;D-4D@Y 4Y)GiiϾ%I֝i1fs:heG?-JL<' NeO|Oq$ui}0뭨}:QrKBL7YPOo*Ӂ]Rx/a%/"TwP8%zZݟ(F]ALk+ pw`v%4<(j!j2aBۅL_|a`ye Rr ɓW+(D=Q ]Z:Yį _aDBf 5SQX Ndk=Ibu w OkVzK-h2aٓaH9C6}$o~KF9Q+[moB7wW\Ms,_@*L-Ë`tbmdwvQD"]?pέ$lsS1I.Ϋ J٨gqӐJm&{mQSy?kM_4y0l_ƾT}%!mP?'g+" }*.8ܤQ$Kq үEK&935et+]ȥ2h&}yCo&9?ʀxC@h\wBl2?fJKNPxq?Ǜ7Kւ_M*Ss V/D%`jIIT+oAxIvI|7CIxeRg}e&-d[?O܈Hm-<'VVX2@,[R0@"d-;v"խa Ɇ0c8RWѪ$uj~hWo̳D򲐫* dj`F?٭irw X/0ۙ2X+ZMgʐEwX&4o0WT};ZiS=^uqV}JGBQ5u2yfd;hy:bT:jjmwjs)!5䛪EB|Yd. f4` 1t0qרг3C  ak7J"iW' kq n;}Kqs%TeTu*hlݽݝAvTJgGNG(V7gh4LFk[U9gd!g!g!g޷A5dL0{W򒱹Tȍ&k -ܵ\< @ZцhwʜA 9jj\T (}hZP\V h'MUFd0<3bwiCpc cE;\>EZP)cCGt|`?OKЍ3N/m< ٪|NYIrXPe:@2H!4".Z&_jBhBHQ`38UVd2v)?P 1LČm"z5[\T&^ x6m!Tr!Pc6kQ_U/]//K/j_tkr2TCiN ZrJ2=ķ:Mo~#p^뽭E>26 qہ9?9&8mD?\Ӏ=X\KMQ|.&`"L0+OözsI:%dwLJr`V]Ƹ#Fe2$r NME!'v8,~>QrBސ 2@(=G?o@# \:e|4'd =[ȹ[&.q5,]Y9_Q9vllhT5:QUY@)BAĸ_v<\J*zuZv]ЁQtg0˷+q7l 8gla"O$\I=ů+LС~s`.~b}[重?VtP*YNo;{l@4 e֋gm"og3T4m#b]^~^]_t| Vi0'P I+ZT"Wr5w AB**:Z>2Y*µ6 EYB5bMqC*qdMe_&:"!lV獸8BG<1u m&Ax T:l~K2o}wˉ1h<- LL&I5ļhexLМ3QPOc']h>Y˶|M/A/nxG+EGXqR%E ˪`ts3T5{PKӪP`vs!$CsR~`n\ /C ٷ9dϳ3&}蚾H%ZJ ?=}L\hSrӭ ө( I#-XVq@g7ζmM24=ǃѪ&x g(~m౽Go7m2k=p\r w`/=Oާ{}c~~< i~gzs"m2~ğ_*4`0 T1!4sK(Riσ?h0)qJ@df3탒GLFfflHeݮ>bu`32C_wxl"#=[eГ\3^wএ)kH1Sk(tMc_/YM džrX~p3D`>I } x6rj#O*aQBV|;t&yncj 6+V}!ٰsvq;+jޠtaPw«[tk)Vhg/Hdr(u El7坽L6f,a#͈X>'oV p%=2G,JZ4AMc~>$.j 9M U//%пy*Ῑhh÷l<lKL5 V`<@<*ek_fkUF.i,.Q5?&Y4!O]GA?>V5/WT\ңu~ϼ \~ñLcdv܋j=!}~ZxdS8E֬F&3z5v*E{M<t h<ŠH5>HI{$u:al/ ?Z- 2M! _Ch|z=*MusqwnPvi6āNly';ɝ^Gۜ$꿲^qtte2a;Ur ;.֕Bc`+޳bRos92N:ՓiڠM`,r| x\y@ 25YV qP/<+v<rfZBҘ=Vi΍1R95ӯߖKT7+\7Ns7ۓTGг/gԛU _pOp%k>9p֋͋>٘Lȿ%bq+2 fSM}8å1sfKdiduJ5{CAQa*x͟ˑ]G ߸ڇzX huϊ3/tc:W-Mul{%XWN9![3rMk*a놖>hM`94=-ބ'ւYk}&/nG$V)x<`#Y4ΖƸK~ ɽM@/_5!;̍HI_^}Vm ;,];\Nxי{QR𿳒= )5ȵCP|h A1 hbn㺣_,~eAqc\8iJJwX<`?d dN䏼HVޚQ;D񃃙M 6Ix36ƷA" g@$6CiUυIs:s 'xa5<4{k:²Ȗ-~`Ϙ-j?X3OKwq7Zvinhύ|/#ѥ#Qzf+晧I/ŭRF$-o}Juڎdx&Xgr1SL(Lr E,7~Epa^&1A-_gx *xШ%-USܸj;Ԛ/A6.c Zq:;[5G?v ܃T"~YUtpen^~#VZn7)@ "J:n}L=iN#2F;[lnM5O7Yo\mP}2.: bjhA=' c]xFC:3\ZnV;9v7F1}n9Zn9^N Ё2.uHN9AFˬsdbrCe=R.8Uf^IL&hhnvw|_ ,~7`k N*=cM+5O;C`]t!5(a\O<$'CVudI%DL~?{64l9s=&~~}Ɲ 4qk,5[hY?R%ǵT;H5t$EV6;%1_ Rx&S=V8+[OnGl]JҪO6 Zc-ʁ5xŜ{䱪J=VXm]7pNk!NEoh&[N(1Mw`([&u&^u~thXq6)#]o1eĖGxKk4ɐp]L EEFnjNjs/]ɣ6O}+FMM_5j"afC9_KnN~c^6ny0" @-XWELY*ާ#w&uy=bvTgoM>rmNJd>ǐ R ?>X&>WDӄgu \gBђNyAJo.5bY7Ţ_Y"B aCX /տT!5wŁLhqZŧW<-/TE.X<Չ{"**`+e Q]-88Nֺ@#߉m"MjMJ/,t҄,r k5`ld, 3:kۛ!NU ѬRAP|J˫zAZ ֜l٧Wxs\{<"/fԗ^0`[6wy;@9[z8HXb V=0J&f[ ^|$iʎ1µ)PCᓩEvX:;+,i!^П '8.#]m|e4;:U2a,_OzXOųTcua21Q.213 &`AjNXwJO 5Zy ] vT,.\ Ԛ*Ŵ ɒ ok X.J'VDIs눧(J ܟBr%at+vybW/¼S%blܫu2aٵAuǟi:$E.S)tO.1=t>?`?P*Q|\oi( ovKpr5ez8P?9qJ@"h5Av }ߑk}n:럻#3fr#C f9sJL$ LĔ%rY+J jgnx1 z a *Yn*^ӗEb|Pb5)1 (,/oܤ`Yz4Ci@- 5\ O]KO5W|<˙ol$&,x߁% 0^| ;ޝrlaSB5[҂)~Ӄ 2VA3cևPʮLX+.^X/ Hm=I`߫čb]5:x ؂PM؍hҮ1+G"p!sK _fsV=M}p$Xi$/]V7^oG{+;ZxG7ըuW˴u4[vb8ϖ6RZq%}ZBi͊k&uط|<^o?75Ղ^,)&T7>WQ#I*I~+cۤJGj>&Bh0́/׬7[n#|e:>x&~^ 6MR@VƆmWaD9V*zKqKV8o[p v$|lrTZ+f@K[aÁ\\Zk53y`c&z(Vx DŽMP'Db+f7X2fW;K;Q'j6}o.\Twe J>!G`h˜m^{%6Twe q٥^׿yLឩ>!MUd۽:k.r$ƽJt%Btk/tpNpgQ9t\~(ZlTuv2hm:#bpIe3/iϷDd!F8sv*RKlSihh aH25*>1 9m!=gpu/aC}ݞvR[|Qa櫏نYqCɕl Og%>XkhNKj U>MްIՈt\fG%/DG$˜ ]O'ȶ EsPTl27mfuw$V!ʦ'gN6]/j==\ז6~/mtI 3^!7d73rXlf@RA& a[&ȧ|8/q$5AP50DoKJIrڒo^Y j 쐷WU)})z!'ܭeWwGrb>kX;m~\E>Fb_SP,ܒ &€ɻ-ە[lhPq~-hG \&BvH &՞!F6!ͦ-3zFG|Kmi`nSNV)bPUMCvSo3+u)ĹL)-&j(f iT:5q6^N@=Y ׽d){_IbV& fKh/oo3o(YˬH^6rΫ)/Mc'%RUnHG!7$O{ _i?Zyp͏4׮}3l/vyQB=TUШgULv;O'F14>SiI~X ՙ <'=Et3l I3eqVwcv'TRbX؄{\p%[b~B,NfQnmuVVw7}ܣSmsDLSs)u' Hp o]/];;;N>'6;j/W}^tYlkThiSU|i2"jJvb.&,DDVvHKȜ-nZ8m8zMyꊓF1* Ndhp=$٢0l ֘xn J[k6FQNkNUM}WV}ˊNkJ }%PyOljCCRC+lMLZZREʇ5՛BC &>rP˖:.l )WŁfsqOXx Jyy0}ԄޛCN6QL?6;+ۯFCCJԤf-P fܳ[ij̪wL5.F_b v%3VdFZCG;!D@C\״\ ިaHaWJg ;/:h~!RākpdDmp7 CI, eA9Dy2T]Z"4oE$*>ll5l$Rh\p2ljbM9&£"GYGkRLq)7 \_X]dtZ5{yeWx_^fY_WuQ|%+v({X5{vy1^v$vkX } vϲ{_q Zֺ`r &v/=р 0n?]hj*Rv {6,؁{KVrViŗv;}p(~)q36y}E!b &bo?8wEi>T2|w T em$o@*}࿪Gz&--(; {rc6*ҿˬ~OG&e@ۯ NG(ɛVXߋ=Y+D!㝕|{фKdcfO{ o_jb۶77I V+3ߚƙ y *g?@ ŷl~//jU?b?4EA2Bu֏*N MJQ\.i5K#  j&Xp jw%xI:Fyx}eƁDiҊ~CҷF[j APd 5OO&$75*?a6`^W4dmYt_~jLXb- 0?j|=͐N8љ&ZhO~JJ?e WKՄ%dy'rP367ϭn%śY Rݿ\x/vu7ʪ4Q U1ߗA)oڰbcGH,ؓeK7!TzӗUhP]^ȅKZc5raݪH>W!+s7;V iz% P!-41/V$xٳ5.5_s]w^Dq`q<[aDw? |*WUӽ!ۚ l:= =#Cf,fUL:bM\,!+ɻcN`e@ ;SZ[μXb]m}:]_ ,:L߅͹FlTx5-bmH cZ+K Iz7rKM'KN MYr"b%>6":7 <)ôsS2<$AX{mW>7:@zgM!& `9ti>`#G u$]o5ͺk^X= xUدc\KL92 Jγ%^Q=5}hu†BɡIڶ9*d{ՓO5Z0 yhk˅e4(6KVbXʧI#wlJfgȡs[ B"] f ^Ze6^U|wX}0ƓKu{ ( (.U6u4brhoC xſ3Q*unX0c~>oVj(M Ma(>@J7>(vIQd[ Ħm_, ÊIӈn<&;it&-*üw~Kh^\F(R^VX(ƐEiJfm4̹YuS]q̝vA\J%vLE 4l`IYގg2(En9-t}J!51k? p-Na>slǜOXQS4RYOkLq9z McOk+ H s.6D, 6XEZ$r#H0 ĽB6Ȯ\3et0 Ԁ/v>\\Bioja 3B̨W-:H0WQVfd΃-iIeO"u7M. OO&-(M4ME R# 'Vomo*VOUǠlؼ֠6a߉C-^+BlV'UD<7 f#4˜tp/Yj lvb':IU!Y wJNz pALmx5@^ܘ!XX(GdfU84ټ&iݬyvW.$0Vj[ zͩRROtp=juεfAeo+ug@:WojdOZZ74VwP0_`]{ `A^C'σi ]9/c9=~ko% YrQ~qBCiw? zV`H$+lvΌ iU?wߴ,I2vviqQn8ѶSG w^aC;oW EeR܍oP{|3o&Z9n&hXgeapbq*ƆTmR{{/l *sI7-% ?7s8mq5fFP#3]c(c6lxWZ `"\1:A  sO?#-A#?n {pÏD'I\#%)Hv)EzWF3D_bRl%\D{cByԆzTPWR9tLw-* ՈwvŔv;o̦cUj)CPfN74*lbcJt7,VFud1܀g nn1/= %Txz@K6-kqvYؓ~UL9^}FVEWϊSgL'v2f~f^:_qn*ovR+y0L/@nZ{O<#vP]=!ϸ|,YꨴX ZϛWӧiEg{|'Y`$yGfc#k8 Փ7h>2\Kdtdbh:ĚIMg6*"G4yh1RGd#[J#aศKv^\+:%1fe.{WR @N!wpfC1ym=2޽&Ȍjr?j 1'.#,ÒaC;cg!Vws?OHAAXGPF)o~^fZk>W/}¦cEfv{ބ[v9b9;}{ We a; ! E c}%RNE ~QU][W-1oRQfȍzbv^)#U}>PnAyL|v+v4̐مIOS>EP A+A[[U' يy͹[xWҕ>"T6gSrFVwUJʍ1GeҵYJjEkF$tk|ʘH)PM%;yW㗛*rpl /|3ec5qOqe-]sT-*D49}gя$Љ"fųOoOK×FCs +[ova}SՍчF&藍FVwC@7N]YP{քn}>hq=>IRE@y&/LNrMQ{8E\XWK,V2C{@GwƮ: Xp w%7a7≄ᅄj(J,㭄Ɨ(#/nA}rg洃{?l}}SN|c^=dGј-NҿA͟Pouk^?9ˇgLkͷ?$]x,483^jY죮'_)glYC%iFfcv~3PG)."ePJhLJ~ta4z*Ia+dfxX|~sڬGb@拫pb%dڀS sH +̊ZGB:OnbsXh+#OB@e *$ W{\:r)̓Sy ur'"W]3O0QHMՓ; Wr̗6R_fqX;bXhY9߲ޮMv0_ڲ,B@$p#"Pt gL]/^2&U:`i|)so5Bo1rP𕋁Fޥ+ش`Л0Q܁@viC5bX0'((g>6d4L1Y7EN޲bUG\arI"}$؈8x^ VP@#WpĎ;b`3 u-91W\a<%v>(b8TX3eF0몗[̏ U3T/7Nog]C, مyAM?8lӗk8c6$? 7L03):'v{WBlр߬I84 _UڴO[)C餘t;|4l?zhpyVD"Zb &Oy.V/L34b&Tp~N~!|zmnFVqZ~.LoX,_ Ϟ-3K+ H5˄A }M,$K@N7@ AK7-_3b"}Y~F@WHTۓH aMb@9f{ `YI/ JSijCBp@ۯQU K۱9uzrԕU*5]=:n;JIv `_uEZw7L1C5N7q4;fH^w`C+~*B y*ݸ ]2`n]ȽWssR J+мu jqr">bUǷRMà1,< [OJVÚ,Ft'~l%+\!K&5%ڡR5})b')n :BB+ETѴqjxF- Ͼ#y ro{Ouzp:~ΩU#')K]S iBNq6Hj"UQg{94`qqR";4QLɐČ P#b`a= 6ܶOc^G \`VuD*F\7q*T6vmqM`b頋(ڐІ/ltN87 YUul6n`$l$Qv-HQxP$E;CFX/[]";o_z8o+hz^9|dC!\o5=煶<>Gk!U#nش6M*+)dL|bjͫu,޹޷wܛmur KUcKkC\dcYPi^d ;1g0Za7Bf7EFm2"6I.`䁜~|(NhaF'ۨNP9xE|=pgݤ3fCcn\nU68?NJ~݆`zLkIq< _T &-Bt|[:/Z̸@#칙}A&2{򎬱I8 0g yLBĈ @ٍ6;WvJ|{KCTr=̄ MLOIL"<0omӝ64_$ ]?u xrdF F}\ mWa޴^osXM -bCap(6gɅbrz;IW=9,"7"T-e{ܠX ƹ]'8Ťxx59UԺm-Vt=%c]M Lʃ: yNr':1{_:t8V\ChS tg'b{~CRe]Hny 0n毬v.R%uAڄl-ʻ13~ْxtqD.D lzx%îWxl#9hkeSÓP X5KlHBO,so}HmSM-@0vY~ ܼq7 c/֩>:(Oᛮ|_%꺯'v5F֦fT=}~oCތ {6492 Wd]RE朗``-n-rz}M˫HUB{˦QkOHR;*JciwT/5ʒIV}*U~?yƨj%Ég.TZϺͰN NZA"?Uq /@K2 @uF| .oUw~~yW;g/6;#fn6t~7} ЀwBѕI64_giheT83unrPGuBcy钏 5#G6U>< w}3I2ny'aNG;VfHpN5TWcvO%I).1~TVŖ+?6 vG$o%' A);@suPEVnFEI&CU0^ذ-We/ ~ 6ĸ^W֚uVʁex2av^&A3`gd#)"ۼz1bҩQޚ@Á8ضtju/ʨzmߡn [||Ѿ1s0a$ݯ)[Q#ZɿN{VB\ c9Mmu@۵[7 8$"Kru|!=*@PF"-!т?M<rTƼfL!Qfiu`{OߵA"Һ:dP>b&v.o!~`}_=L/D~q[sp.p &_XټE3OvNy2ڙUb-9t/#.~lޡh~6i&:mJcNyP-帰eD?HKZn\4_|u͟9-=u)u3yh~qNuѪ=!vKc}BS=%F =K=112^[95b30? 󙿓GR C"h|'1">2/P)hJn1ڻ]ʋgKV`_`~p5qS=|,^x#@qT`gُsy[諵Թ,O;Dc4#V[Gz 0 0 F]7 \żԫ\[_q-Vc\Gqs` Z|6\BoȱoV퉩56*,q"%"$;2AdžO~&wA/$shܧvK5ucvǦpAސ]*Ʉ)=+2ߡgf/#*1=n?+A^8&nώ"͢ꕻhAwgΏJS[qL: ãG0F6xdW=L2S3Ĝs1*!x&Dsce0-O tWm|n`z&,q816^lÖjMBa*W$*^#Qh|ߓ&f^0FҶEC=?7d>:JGzW0jKlPuqcD %l\oclbƿ$/"U^cN PCfJ2Կt%O%Wxr0弩\h߳L`/,(0vDh Di#삊IlCKaf{׶ uXz󎤞 qO}!o*@ _b=~,bF_† UՓ_k5S2ٹZ[fVMKm%OamGmnIn?0qk/g YjPJ&?Lk0Od=tI!r'D][L$TM۷nZ?LU4IgD2+&Fס8C1tKqF]qt%+"™^|!4@4pyM\itP~- a+r.ej3S~,&Xsav xp Zy} g vdo>di_|45WA+4~7GJogX"r'Šw'>39{Vlra@|e ^@>K@_ zGkA2wȭ&>((ǂ(@舩{3f;;ë9֮!l4rYDp B%foYOW8ozAQlv Y=oheDEG ;v1טA_ؑ0CR@̇a3J .BCôi6 <@ ,a5{d"酃㌪sN9n$h?ӞU3jb-}sЎ^ր bt@'E؃%\DY^XB2`︎_uG:Q)veA}1ֆEԳ:NPk [,Tⵖ[g&W y--JkwA Az~tyq=$bJ5 fNr$FWg8ȼ#i9|G&SHa0iۅ3jKNo}![йp))ahrs Zaޙ9I[ipQ- TRWH-,s}eG(\6:@؄E땺2^a_CI{3hՌ̔Mw^GkIDOjdL W,Ϯ@lЭ'Č3-Y$Lsy"]BY 5dE8Ck/kvд_.[ʉ;THfT/7ѭ:Eo@㲙Zg®-[pj pndRLtQ$Ѻqs!P SP gZҿj1s4Y3ee}PfyqƁ?P!@v᧝7\aQ[a 5}ٽ8{s0%ʹ*p"w{E7&@;9a6,zܹ *d *APߐ?oh 8Lt}д%ds]!fܻ3΀ۣKNQVF2~߮C/p=LndK7HӖ>+…<|7*ȣ#P$u)'XzDy0e7Yݿ)(PO2TM2=KmncK3_^{{5(Q&(( 0nc}!۾4 ׇ ؏d;o2COK0{چy7LC ۝A\펹G}6'CG&09-*k܎n4\!6|O|>}T\nZB$EM.Ao: 7rP[Rbf%X9 SG@*@/;pm2SXa`>ei l;qlzuH=,M<<΅zC;c_=IYfW6>z#|[[FEpƬZHQ>3~L 5}FyX៝j'e򗛁3^hΉRM*gEJq't~PM2f@*['4-Q lW7nvVPщ5nœޝ*r1=L݌NW>(s*=`8;|)U7^v}0w`$`t F~6io_^'ؚlMHŎ(vHi#&a;{ƽsԉlehdC7\kEs'M=T<*#Z$';(BrIl~ ނQ (`j|[1_sֈ'8:;~o7¢bE~Zn:h}Lgջ$ؼv5B؎ij>\go{^XDXI*䨎 Rl=QrODr ^(K: E )}MQO^~f/B`paH<;ZkAڄ ' d L LہNjo nNۆbC2o") AG#kQ:9TmhDR L;(VE3G5~/{EKEKnvD~㳛`J^L;z>UC3}q3|"E?iAvI2l9FZK@mݩDMSk$"?[R:Vjrސߒgq`eNܯ1&mۭ=\Ő@H ' ~(>"GgTj5^6qqފ1m@1]||\Z\љ~K7f|:\m)Jr!(8?S&A-%-;X N[Qi6U\?6D+o@=1&~xs6~s5-3 on%=cf|sMD\3JO*vKZ0ҠzTt9Mif>:G@ufﮗbq=w/'ek xz,;4A.[jk!]\ n0~u!XiY{]:H/ns;x^: 0 TSL6t.Nq(  uɅKT T 7sa70 M$wߏRNvYE0 O7׮հck9WZ eKpCO>}*𮁓qxIg(|s ,ȶQXzl曎k/t+Q^6+34!/:AE.䮝KB;7&'"M;^G;CuKgB; 5VN@"{ڞٺPN>/}eW{wјpݩ̕Ty ~O4^kERr|ifla[ŋ'iy3jL~vco.7OZڊupW57kZ_.fDɵh{VΓ̡|×%mmLX>9 D`Jnv\;jx^FaP5mC\K跙F[M/BބPF_cSF!?@yIJ312 [wb1Ld`8(Ag`н}lJ΍*md>PBŽQ%s9בaW?Uf/0ª<]]D%R=%|ߜ[A Q36DY{H^Tׁ[X7? ~PI%dk\k48fX* H%R {o,1?iSxjL0-ǚϖ0]nꌞ^tNdomK4vodMT@dQ;'@.yȬȐ0a~H&R xB%x6!|9y`?#7g;Y5uLԎUJ[03P X\]̇\x:'9}pn_G6N1my\G16ykuTMKpi=wzJym \$Q(aKzͷv׃ծP͑GotX,TR W:v=-V$GV BFFap;lP)l+?պ^^XJX]!cי/4:[KsN{>" 蜋z Τ# 6٦-mH~C:9K ymzx~ɯȍ24)bH:r$*qvDȌ!tݭ[Bn,ɷtvr~97KьEG0[7M2nƏ7Ȍd4u;M^Qۖ^$ [ 6o@qMJ/nŒ/42ݱN~g LuQ]$ dӠl@)k Nࠢ u@] C f\Y@nvﻺfЖSfYNQ0uI ;ִPMɿNZ DlVo"Vv q^PG }Pv(r -/]m`y(&|i]!$p@ k̚N)+ 7#҆^IQs՜ fXQS {VW #4 [iD0U =Yl  14wmqb*;w.g!xfOeǶ~:Ys#g(vD890h` ,Va`q9f[J#c􁗏/%ӀL@ RiZеgO[&hsg{:O]70E^niH1TiL]Y/:k VĸC~^Ko7S\ 6:-*۴EԬhceZUOgsbuCFgИ7t&{Kc鹚){_CE;'󙼗]GzBz1Ƣ=m6Q#@>"i֩Botk`zO@i&đ#ݟmLJI\<#%UW5pY*sg$w6r4oa|K5 ˞E s =L\F̑QM(vDŽgBP$g5~t!]#g)xwn rC9nXQ8^Fs IҦF-g[Dm;$SEرKڈZYseZ1_/:nw⹷MR#z-}clnOzlsR 6U 9ar ն(!}.ߌ&c)see,*$(8:k}yxXeGe@?դA Du6ˌsZp4;_3G=\cz t3Ʊgc 5JJl 5Be7ǙגaxA/X2Paw޾5W2Ƀ8ڒ1%ӛ71T mVtO\V޲斛eޟ-|ޑ:W+!bѦ:P v.gq,t3{ BX m{w 졲N~VvL$YOv۱W6i/q.|E\  oL׃q:X^^(a[:ԣ^ {KF(hk(z>@{&yn/'[Z9h6xkGKwv p7 : KӍ#bCl40Kok2[+xDGjRn3mQ!^mNM-He+}Ed6dLM}Cܙ:3y" g5(&a*mqt6j)aFz<6yʋ-/d%$i{1q#u Q$8n-e|b~}(\t\)Ef~;.!mSAo9 -8_Q+.l\x7vF *lhbV3wAM쏑%F! ܺyE8y&;q"҂,{ ~$[id{,RYO~_Swm{;&Mu\ qˏVTK^6B1R5+R#b {vD\`@%jz@=M,TMq~MR>uO9}Z4*W[0f՗Lm [Ǧa(J4b"<+»W7ÌQ%eOd1UYh50e¯吉Rvܫ|í  \X _g.[۴kb."w{CarPlAJds]`DR{s"uUw@kʇaBMul5#$,<F-#wVց(r/o>F+|4\hgc05))"ђ^ PFq8 1ݠdf.Mz6]LX>3 Kҿa;DS2c+F LCf MviߡDTzl| Wiq:o-nЛv 킵Y0es $Dg@yyi"3@iqOӢH*?^ uRӈoxG.?Nv}b6ATFmZN{lfŞ f'L} ^^U `OhPULvf3i#\܌aIW6):R;9zoo\,ˤWboX<"Ѳ 9x`@$?=x…( lKNAWUC R"i59ۭ_407̎_9UӅ@>+黁Hm94yNrx`^Ȗ(/C1\;\<,o.͚$(=,}K0 udQJ2bFu|H#/[Ǭ ܖsl3)K{d4E~Q$SiTgLחͺ H!nƔl,TD<7 $ fז1w14C<vw;om>8g^YgLtTA@ޢ+Q\*8u \囧UƖmL@#fT6@6Fێf͘+[n]w}NP򆘅)[芝F5O,B۝֠_'Bok}شe 1I1' 22(XUUu-eV !{r)@Tsiu .8Cvjr56]+HzF\Lk2}:\δ$=[#I^ܐ`ʡ<`vGBFboGۮ$k_]"FfWNAͪ\c4RyGE),F <:(H9{xwpiOiȇ !n95n ol& d12y+q;X+*uc]#Fg?(bij5̱c~7թgc\E؆m_8&ďZW,yzTc;*mցMi^X~VVQ1ÙON2!xV 4pQf_t -]ȶNΘpHnM5aB7zh'y6dA|3 =F8|fj|SwLc .N~m*2bg^Z}vBh@ɕ6[<6y)r:uraQŻI)3-IԴU,@{J@ambUqEho~QP@% O&{(u֙MO W@ .Ia&ECz@԰%N܁ܥos Gvu꼱RP.w^oda'FXώS%kPZ8pR-sڊ12{znRj-#e]mE ~[Ut?RY UfmD`^\Zզ (l ~;v+1QpN߹?wW7 'P%gosl[m1SI_)PÍhsrKɀ]l{PP1(~ J=K@s :tPbyiH73s8Vȟx/9MU7ck׼e Hu[>C5x ܢ9]ycyfSR|8ꮑ*eqF!]ULG8a7dG.]$,mf㕸S^ +Q:7LUah!ώL6`u`쵹aKmG7Fa{C ~Iw 0p9j{&JW .j9r&.!o8y@ߨ̐N(O)PXjBc5Z7i-{^"Nlx;WiTi@ h'cPy=^#z{KІ؏ 9n DnӳMJgQVKG]Zp W} ~rέv3t;練ֳj&MO y0U=F7HlAk|gCp[ՆfB|B~ӍhjfZuna SړV}'':U~P':Z(~ `~ez3OQ:YX'6qAncПTAb/M9&~k E5.HE /<;WJhsLB5 ccO3~7 v x\s6 jY )DQjF5WgFX aa" :3AiarvyHxU!x&\^#EJ0]³[. '!D (68-TsUD!v&Uc?(?P5w̰vݟlv?2ⲥ*^Þ٧. ๥s"YՎJ5-v7L"g,YŌbjݔ"$SK#N"H-&^1 (D4  [iC 6~4sEq'taz(v-2 hhl.$FOAzc Ӊ"5?߁V+8 ׹3+zL빾$ף\Zz rF1%L߾H´xccz? X6|U{,@LQiCBSrY_eG8 X'=@Y]Rl +kSaX %Sı1@vɝD@gpp6:G8\"/vHtBpm}Rb{Շ,{i=**VMO `0Kpp H/懎}Z`ᘜ;F`~SR60߭&4 D3%eեYɏV220`l.8V`/ӝ@7ѡ>V*"Uʧ)5U.( )鼏}ժռWr 8|2W0]'5n 1RU+2h2daW2'>_R`YVℊP!u4dqV>9jh^Ф88Efx98ri7\?d ߄|_ TE9D/6:{ ^)kIƸG@œH'~݉&`z@6x%,*SQ0VaTm_yR *2/gHdrK}Q+=5W~i(}θk{#lUCfF\#=!eiP>z8c6ȡ6ɓ&dD]UD=PT"Zi N4o/#Fg[e01B%~MPG*;p>TqGK9n{>pւX8 hVyX|P|#.@kXz)T-ao|Α$Vr2kWna;S%Kr"u_TlF[։mW*̝ƷBxs}'~Xu@Q(@8>Mx G2AUϠ}v'}MRrΞ +çu' u `Q;4g?m|?3SN"V9A-Xr =6}h 0ŮϼCRc;,5ݲ'%r`'qTlwJ#iykF@ǞAEЈOxE-؝=x9;Y+xK`/[CX'ebA|(̞m EvN PݼMuXi%&p+o[I^#$.nSKm/k#@%xr4WSA7_i?a/[WҕO*~SF!V_l2~C )K/= {WAf5;j!esa~A@6b{D\Ӫ-}OOm9'I4iŋMDP7b}MܡO 7bJܽYNM^@yȂ'B]J;)})M(w8bbm&S\g <MmTWUSn*Q݁z~7P>[/5tI)[SMSPB89u%l܆kK'} pr;ÍӼO3 :4ހqͯL~ 56Ux+.qjk{v,E% Hv 4p7o Ѧ~`V}<cmP]KnL[.'VWQ8Z;;xlDw]`>&$}+W[u&i.75%eu["S|ʱ:D.%bύ]کmXj::zh5V4`_3heCJ,4)^O!S.LUy[$i>·(\mQ Vs4JD ]&Q>37 0*T8k L^Pkgf4Z!A%{n2F]46`` sdzT4>2-EU-価H:3f6tȧ{~"sqł:qWFMlom"u|n3)7L  f/yED`y6g}LX ΙS,)y1;9ZK32}6g5i{0|ΠL]֦q7̹Q$^L`ReMí_Ҕ7)=_se]k~9qhNi,P^GA7{u{Z:>f[ u`>Zfr\ Ա`c OOqB+9M,NqW9ϱz$(\rQH4'.!P}aE[[ r] J<_M. b:J)g_9uqdȴpm!ζv88^qJ;_P0<{!4e+᫟s:~S7'yZ"Aq?%{jX;xcesvݖ:l{ce3D<>GEA^cٕnx8/NŻ"<`sˋIi_&}K.G˭w7Qb >$h 6ۤfD"IgD}5yI*K﵆kn6D"\2T9˘WF9N"nN/CPמk^kh4A@ӌBp6ɼqƯbC*dg BPI}XpV̲ gnwΚ)*xCz`䎘-ϫ#&+GLFfC&df-Pa׉T JM*OwosǴVk{/ѻ-zo! r~X81:b uπ?4diܛ|6oqD2soI&䫄 cQjY [B06{^T&@ k"`^\w؝㟕$p>iy@|$yCeZLUOH ",y<eZչxir֩F?;H_/\-A mBaU&T}n H-Kq3M&)VylYȅ cׅZP|454gyX~dgag.>OUM"bF?/XxQN E] ]EcIO/..[@4P?͎\AT iHuq*A9\"2P>Zu?n">`X,.\,lJE[̰ fH2եTdjG|-Aqs$02[*{᪙CEzp!:o o5p]Qf0*!>rn'ᦾXi.ڟY\]$Pq^ʻSg }QqZ%1AA$BvN4ҡ Dw'Z*ӧZnSܟŮ+5\Ja B֭ۤ2`1*fc~02AۺTgq7u=? +CYΔd(xidcR3`u$}.gy)o&A{Y O h?0%h[F &}紹dkNr. K*H>6TgΨ kZR8Zҥ|ؒi9Ӄ`&6Q7<7iܼ0 i|OfEaf'ep 2x?Vb42s{MCgyo~@vϜ+dC>L{*{d׬hp* І!?v6- l{OoَUڶ {[ms,X)GGGhhK166/v!tH!Lƚv"䮨q#?Hg{lz |tBs7nl:UaWW>90Lnśob Ə/]mׯW Ѻg ̈́EMXφB5Fy*#,ݽ/elRy)c2Եc!p  U%Ë{5P툹^#̄\ZdJL+aofnv:K 7t[[}ǓXgssi|L}cQ{:(%9WGƵW፽f"ck^X{MqjpZ|Cdzow;QDuÆ=KON~gkRv[^PVla0?X P|@{ ?4,C)_u0Jxp9;|~0UH;Zs#ęfSr6g$`0ohxcuTd^DӰ :r˪̓XN)935h}PR/uh(b΀Jpy{lC1r+uƭIޞ(ԃ nC s5e12f(raw"ª֕ѰLt3zI6p(O{W$˭X@Yq'6/uXݝ{2I3wF9YqVjw_2DA<"؝(W\"@UqLL |Ypi0^6Y`Y(̚"pDjZtu5~< &K(v_^fN:@e_\gPl)Xy[7/^P]e< e*I|fbrZ!ð։yi- m3eűTiv@,YHnͩ\f*AE{{j@V$UЍi$Q\(pi=lFB"=ya H <ҍSMB}dM+lȽkf9_J" Ӫ"AUHڢɳ(~ _[:m :wYW0 K)flvig1m)~e͌֯o+k[/Ӂ{Bo>=*1jI{_b$T`x})Y#5 |$^o 0mo+|Y3n G5t GzoL^N<X˷Mo'=P 6~ltpKll Sj- NBwL]J00m_̟?]wJKwژw0\̏gW;Fؑbq)`@`0 t7Jq~/է! w6d)ˀ' .vF]_?̽^՚_\^'.΅ۣjAQr_O Շ>izXk\eFәhD m-~#YD#rLP(%|9gplsd>C?ˣ|:>aN:#OpױM]n8X )w2)75i #%t+sSXƐQ+nXC3[ 9gF-o1X$(ȅZ3̤aڶaѺNIy P`7~U\u`u j0!ޤ,rp8;B]`+yPYs3w6 {Hzf v4٦S^IyůvFlY=!M]vS, Sٝ}EeíWƗWd^KdMuӈgNS/ ϚEg|Y_RK=AJ8rL8OG0uԡ " ˏޘ$o ɀv^3,4|edJ7ZB<>E D.Ѧ?['\;B:>PF0 g.nan" y q` L:\!qᆃ/ fu`Tʌ\K!~x!fQKvlhOXAab}'B\ ›(0qqtN<8ۭzD0 R0! 9k t]LZI\^q*~C"{O:~{$F&fۇwg~J6 +taw(-Ly|Dg=8&W#r'Wernyxo"x6]^jhKVID*Β놡'ZjLim3,]kLN>פg2]< 5nv14p7aniycYgkSpK‡͝ꭽ1Ko? `qLAHfMK}Xíu=B'sB0T>g՘azHߩV/%E/39a:8&gKw:\.Ǫ]ZbMwq5_݋W27GYY&GPnfV@\rmVvGeJg]P\?'ϝ ` oAD+saӭx9F6N^p귀{hdbk}<8װ86#΍yHɷ8ܧZ]u3Xϛ`UEBhWo C}Ȃ< hYK֭}lĊUK]{^XߧqQukEcv#)>r>ryvpZ\?]NJs2>ӽۦP]_M&|q9,vf@m5T2:{ν(jodx$>Sg?lƷҫh?v:؎-1d4X{^yt$,uX~T1p7b%'w=%|:*"VF2PW܃_/rc{,eqj]kSr͚8%w^{ mJ!gK/:hGn7b#g:L;wW̔c=)92?om\2Ek|L)6hz+aVl(AfGFhZvdͥ:'^T`=?^p΃KK o ${x?Qnۂ.6& !׬1VpZ>X5½?lvuםG'D&fjGW%t(SS}WӞFF#w3n$LCT;jw1GySCc38ļ|}\ԐA1C;`0|ȀƹטX0:ؔr~S]TC~PyE; ң1X^.m'紇ϋ3=..kaLS93$׼0V\NFW͈!(9NEQ|.vƙ y;Vkm%]trƛO=/'5|MT*v#ԕa$^igl "y5} iNK㴝7j֦?hZF8vs\vvK[/yR8ƶ>7ٰW@@@w(FgV #zO_;vϵr`GfT\s:`8=?X~ZOc$cܾX"ާ+Oˠx"k0>wjL2:7ꡲhZ٭PpچjrN//s*Oj3=PSw(c5'P: ~Wy*No|Ìe5kbb7MC2QQ޺y'\t5k铽~n+> ch q>ع:00m:{Z|q[۞&gJ-V޺5#0sx>f&I0##mS2wb"eBwSCP+jGGHc%ot6 jغ'/;Q[3Sfx#XxDZ=o 5Ѵ!(~4:Hhx*ns-&W/|~hfgl}ypcȔ;l̤2%": eXyyh_tSw/b/i{Qӳ"ѧxk0ؽ㞫z+l%6л ci}u}ȕÔ2#W cTL1LoT7K{K ddD=n8x&٫.G[c[VxɷOveL֨xEubv50[kL M}#~KZ7y ӱ=gkciyO}xf3t? >3P6ΥnSW{Z}^ڜݿDlڡu`*?:G'G>K^q}@òS!̇!W.Kk׿/M}@aPTG|zQ8X`g}¥Կsavo}zXƹ5.҄C:QPhq& DL`#~1z>)x8^F>Md/.1-o{OڱWnGQ۶d+P8y=:z|"Q36|a@ úv S;v>4 aP_gKDfv}+ʪ#cJkF-ؘ%`qFZ o0@Lht KgKO1]$_w'0ZYu+_u6 LӵĐ-;d;ſt"k/:ka$S4|u.M.3j>ُW`C=i(%2Iix|g=M9 R`{0<8? Ǭ}æMʘÚ.LO'fCn3̺I; m &_no\ڐmSGuPԂ\FZ #͵{c{Q!kH&GXM)b2 4kV'y yk+M~e9oslЃ*_QnԪ)rD!MӢ~0R,ҁ8.Rh$zf*S{G}٣Gm9u*=mƅ: W^3 (*X%݈`O+QU/ӳ$C&j\ ʺBZG^ x'zjk]A)=x!@[ C6&|S-QGKwE͛bId٨D|}I)LCU֍ 2c%&[sQOv6a)|a#Z: wВvф>3N31k2%; ,kթEF2k-0 (Pɓ5OA-|& {n?0_MAǶL`F'HɼJ.Wn-McAFE^UȖ[}D AH7M/B ŷ .>l,_9@ijv A2~%L (FnԎ#cH|QX"t@aym]2@Oh|,xѨ 4PDWT҈G[]̸r 0dsLC%hPbVo`pGOKAy462}58LzO4oW%-&e+JM΀*[6sз6!y!U$%n#'+oL69!_t WCy+O켳xB]ze,:=M>UۋQx(Nݽm?mniԉ(C)#(')6}|ĹY?D~*WA~x`R:7hV ;3{gPmp]׎p--gؾXٟҌC?yΨ' (V+/̮6T+/ =0j =o!<Ȼn7`Ű脧]J=L1mk">`E lDYԑc1vW 79t#2>e4WF؝^ܙ'~WXژrcr\(rSnf0pԖv]H _KKG2K:;/L q5(ads> 葨a8)iP6}y߄oYLo4z61B!6Aw{'m|_=I1ɔcY (7w6pi2ܲ1CfH(93eNT]|"˒=ɒ"s #VeJv+nӀid :U2]ٍشRX(!{޼^KŒMlqOl"\{eO#\Gp|/d9+ ӿ^ST "C$v74`tv:dR;Lh,}گed֔m-.˻M-{qߴ5feflM#֏ͫj~O23m9K 8fV:YI_sa|2`O ?9L47up_2`x̒Ҟ*T1bMvht54qedY {}oZڛ6c8|wi V7X у<6B1D=.@qK; ת;=)4 8qs?_$bb mdRK5q'y?{냙;-@xU  苋? h=~3<2u>~]4=)&. ;kf;35(Bwx]UutlMݛ X}xyv4ǂW_%Wwŋnv\+\raicǍ 6l{nwOmI9&-`Oh됏j{=zN\L-#죥dq(h`Vi0 w7Wl+YSFG4t~_(4=9nev)FFܦX F$@^^^Op8dI_T.x<4m)?ɨ$vsO9-Kg^݅p6{x{]/ Qyff͸^<||l^B E e*}Yk[ _ݏ'@4^\< _|4q1,ȧȇ4Yiku*c\e&J5dY;g,cDoL`ew$bl 9zPovD' [~e$*jIx)?ZEV^"Y_Dw(p۸#<`5uEC6t|j}ì1 yĿ9,;-+Jjd5> %Bvnfu}:Xﭨި.}gnOSO9ƽi*PPCN7,w54"C#%x /$f)&6]^"/Ϸ||&VrPw(+В?6{O;cDŽ#e]~ŎT&Ƚ*mi^.p)$ok0]6>VcUyzLQULó|jˢC}ܼx|m͟34;^0y0~T UƼxߙiI5tl0n% &G4ƭ}5GtܩkmL8Pkcۜ@!P%`w(cr0֍LN%Kjxoyēb=E)=Pt {20YS9coK*FwY;uӳkU*NDdɞnwN nmpK|^]JZ ͵녋(C or^ KͶ4@VR Ksk|Plo} zf]vψs'ճ}nꖰRFdou#F1Ԏ~͇eTXD-;]ow7^]f@;ŀYF[Ɉ穦A/$awO.2xuƒ Z:^q֦'ͩ0W\> !):I9 &R68ơmݣzm_AfCF蛮g/oe7N\Aq;SDErڄ-N!@{3cnQ$)%\_ "V¨h C ]DR{ hv\;#nH7.߸V6ì?cr#j -UܷIjpqIh!BjUam7& ]@s\!suS5xmcQ.[9עG`8یy6eϩ=XImJN=O,?Dm?`sY>(bA 6ۏ&l|]tdϨ.ovTr&O~-!t>yBڌkrB6d[(u~_* տrHr0)'m\/gF j|[<pw?F2_ڒDĸ &~X WG".!h{Sqjc v95͎lqVV6[1/-p}O56]f@)u̸Q~0Z44!g/]͔oLl+FP &VPظIJ|Ο gWU"#SRe}j+V̍i++_862 7 =bag_Ά^l?JɕW@H45lPUUyf mW nyv qѐmy:fbѲkc 2=lӑ?ѴMW3yIm8d@c&P+ ߎ,j3bR[TZMOKlڏ=f; LGw@e˜UG#'Fvyg@橛nf{cPcAokzb6ltA yWƺUko4uE^yy@vRDf \%4xv=|FOXkz18ݻyXn(Oe  > &N;404b.Xҝb).qp cڑ>Sm9d2?ܯ~tv)g|am.3]DW`8de { A. q.g Ei΄\P vS6F^d%h j#$Zlp|`w Js'뺵l%2AofFx!qc4m14 Yw}͞qҿd P Kd{^360 ;8 u(>7 APпSPq"ZΎ_ +xe7N)/ψyFLAZMPziF8ZNQLsL vyZy<u$V+GL|KKswSC2 ?>X|-xβ` ֦OΫ=oCGPG=T;x&ΛGR ViSScGݗeϜLV-n 1Vݖ:#rp .G0Ύ /z[۝-tzyxӆ3]5C%m`z%<xt +Թu%u<){Lq7C&:kj;7#_ؗ36xKr^lqxržCOB5ea듄3_~ u|v.n Lw:0\"suj/pnӹ~ $օ YЛwߒtXD= PZ9m&%&J!J@e0kd3GĞ՞L> ܦk˷zȍ'&v 1׎ß~4*m*ftجzF)T7< 0u$d#0*=69PAOJU^3${Z>yh~+Cɏ% ئk5O=JH8^[\;{O{u|^ݗ ta~[Wt'/U\x[z Nu|n׮kؖt;ͫf3hy*Ԇ`>Kpzy+^3c0:K0?g|{92i ^7E nכJB)K +0S5%= o [L!`tSot39O#gM"uUid1suX&=+У:96N+>|e='ųtqvڸOq+GFW(h 4G\[1PN?q=qٻƈSe!:uAֳ؃6~xе8܃$6-ӷx#{r42>imqai1b=,^&1L \F# W@i\7bPkMo2H}V{囷(BR[A:V<5Ï}Di+wizKԉ9:9_|x ^\ kF<%uqO(  POeظil=ckcнK)X=SE\yapo1Ldsmx~Dž-m@by6=*ga!fthF4`:w2{xt3n"NARu`\dC挕XY7:Va8EzRNpo9-cL-iհ4𵤵wӹφZo;yYt qd1Q*QNas=ސ+?W*7t_N#pGIގugUV:H澝d/9OM?,KIȿ9bYvO^ґNmxe>ҹ kNn'“r>$@_G.p]"UF q؏D->M@3mPT&$R2ɊNi#fV)W&Btऻ^J죘y5]$h&Xױm&Wpd]>xOpϺoOZ=8N{^$)tU["oW8'1q)} Cbα;Aan,]FZ.+JoO ;#}@VkI6150`a|p3g+TCelB\tR3m?a[_ %&KiZV, EPRz1 Z @Wx@N$IBpRPhe;L<M lC*]yK#o'/n_9I#Etރ9)@c7j.h׈@ ItC+;k}3 \dPR\wdx~P fH@$BJo5s=-Ao BZreK?*`OgRa)]j*b @<˥םP)PQY< $C %n RcuВg SoPԠrkO={+{q-2 D?Z]eŕ5ի}U醂Y+XƋPQ[`RE}_zx^^:^8/6/yBa,ݱrBpfr"?cڔ1Dѧ/4S|j)>,f6ӴD!jAKg Fl(&HM-K 9! G7a(KDlCLjCyZ.6e^|0{Rǚ%q.91`5N: m#CP,7WlqM+7]1PbE"8bbM4̹YIfL_MS;` (:6꨽]xZ9Eb-D$eRoVg@mMoWA' 厈3Ivܿk8R\C7r:9@[x-FpPJ2.o2*%B_Pސ6wvӊj9~9ix*1إGg~MR{*2 !lm1,-) Chxjk40Pѷe7@ds) 9 h[c>S0"Ne߱ǴQBׄl]nڧ|viߵmtyyJROkZejCŰ69Clv6 :J/Y2m*6AXtƙNݡx̿7Ԏ4)B\Ҟ`9($0S@K @ ]& G"Dmx ^7/[w!cҋ>Ѐ"㩛C_t0u/%+(g۠Ku_FӊZUC y: M3 V0D"yj~=+ #.Ju8%G/Ҁ.iUĕڪE{^3<$?dW[&BS+h{;Ϳ5]G WŠx~ͩZ:$3XHVW'!u{G}ƉC)g< uqޝ^dž{i?P esT"r%k!mS nw=ͪH}Awbs>C֎U7i:pv,n.26y~}s!Zo '\!")!Þ=Vt9’w!Vי}d˴=Ȏ9՝[# Ǥ1*Nn3Yp@³?U"-,(c=ɕ(2 O,8l1J㞤1etZkPuOPjvW9א|$$0Րn*̾Ӆyy,z#(a jla+rQ>.J4A*PT(q5xusĠ{ĨkNW3]~p0>1aqwmeٻkE|+AA[Mf7iܶX1 %_T pPi@ )gX|+ֱ(󍍀 a~c=pz o?7?fgccD~g8B6w2S ;'W __2 lk2VxOw\OL8:im$쥓69@f+FX:(z0=spAv^h=F F5E489nC n?ԕFCZ٣FShۍ|Zn#'sGO<4||J ш)hH6 ,[G(kM ~ϕf,Wb̕YϥM>~&D~;{"6I 5TlEj g}/mhwMOGκ֘Jk>`?ReEMz dS*RC%pmhTҽlbZn82ݑS7Dq _lZtݨB"tܨ (jkq4̠Qy.3zCI< 3$@ hp1;48VT ̽vR .=c.wv}dK=qHֺQAP]i4 cYѢfAdAJcs=dL,y屢}ۆ߮f<(?5j4xm@٠vOnmDz^U/^s:B:mx C "0'}0nm~^2glJ1P0<2f{p۹B@|>[>^Lcͷww$%\MN<7<̛:Q]?߇b5{m9_s|N[q^{|0`jpM8_#Q9 g\oOh ݖ5z\ćKK,z:zw"M=59LWzOVFKϏӕEtf9X0"ƫK* ӛ9p L3FhcvvpF2yoh 3@-ӸFNCP+%ge -?xtЌ"1;0h9 zdFGMlm#%d ڍ#{6e:w}0ݍyLxվCyKk2hrM%.6OOV2r{cii X9Gbzv^yh@?] ϡɠ WD.!.c8Q#yҭ=-=k{f2XRzrdOb{܁=bn~|GRhJ\42$yKb*2<%uUkߘb+SMiOڑž~Qqdwݏm?hyе\X{dDC/=-`Yc΋ [ӹ-3:px^'78Mẵ^5|*GnHi[P˸81p5v=יK "ӑ9t81T?pӤ/3!@7xwy^-|= s7 9z:)~Ghѿ֯@6ϱ{y;1wbۊoM, yU5Kfce]5rI0XHٕd֕VnޙG =IuTq]`H.Jw2CcU.ap>;0|8e徆˷m}S/Ÿ]}_j췭sకd;&PD-ME"N@vV 1FqmPfIJq+K7HNh \; ϵȲ~q!EL2Gfi24Cc6~gҝA`Jpc'Z:e4WQLBkpQӠJaqKfimT4WhXk73SR8EA*x= ||`lO&<FAn?4uHoJLs&7O|SCof5<7t76/}`C* ۄjʭro+IBӴ8%9 ~}Ϡ #yԴsGCD}Mf>Q+z!nDFo ?P Zyȧĉyy*3: ,؄.ԩijqPf^RE5- @(dyL芍5h |fE#{LPD +(E%Z֌L d̥ A:gz^w0Mhr k9ٰ. LO@w Yy%|DU," _~\?6Nqy[cwkĩVz|Q_̹r4p\Vfڪa?Džg0O%0)gD y|PD_j5iYOF4**3e}6g? a]==1=t^p.A6_<0r@hHc;xnF@9a1hA;MKF!mv0;EbS7s/=2mSR"2,fG&؞*;SH::͑sܑ[h5Ҍ(SV)<*ۉ,0XF4ʘܰFx94xKoRFYpt{ݘ!fl炇W!}apuؽ=Fӡ]L# uzr#|Y')c+ߡ2KsU-Po 9uuCBIjv[m:`O"_B3Ej}F)֪^8x@|)"B֦+!cX:n2VbXuQFX"rok/Lv^Vx,jh}֛e3͢N1P$L,-"#"ZۄWդ硾> 8a f`tF>)BC% xZSm[p.:sb8ӒalWxӎh҃_8aJhCS&MQH- ρXxG=4vCSٻ'E)0Aޣ` JGQ:d2Xb[I=]ߑ`mȲu[`- j`sjo)®^P7aۆ$'0iSrMIO<$m߆>Wތ'OA"ɻu- %+1Q;*-AM x[Ъbaa`-sз4B9S}іM'ѝots~j'\@ w'~q?P%a&TtCE@?.g$93#ǯ ͢.(6^(?AUȅֻu^eWأ8So{ϣH!Pj($FBag5/2\?3YJ}MܰvLϕY6L(_QmF(GŸ ?5>3M<4"u: -)7Bi@!v ړ`L e;o~8DXrw $$mO9aNgL)Dn]{0fο@?Mi?HSm^ZDV`Z)3Us;@]ّ|2!:M6e??Dn_:`y;\ 6r ]!5S6ς \.VWa'wlg^SJyV rKaҷ(߲bo:6 ;.ن:KL (gQisP^f0;!ʔyp1)ԅVeOKd "Xs f}DԓVt~& rթ>B?[FKݨ(Y!- Q1$,E Vz;~V?3ܱԘ Rfl b XpsjKr62{*;`Gk -< jΰg7!@+$UC[eHj9P՗jʭyX}&_oWpKpJ(g"B:_$cB_&~N~%Nmyg&.[ip6]W1_]T-YL֤ue܂f9c5 A #&'sӅK{QAMNmqa3 IggW>\9O! znm8ZeL_M2[SH#as? f{MrҎZܚƑwh[B%qܪZ ? Xes3@|jYmnYۛT6-x ?hԺGѻٲͲ#X^ (xbO|h~2aV98hGs޿:X곌Q>R?3sI$ã{Ggn' ^gW#Ge,n\1Fc_u 08#SXw!|jʬ&unLx :5 d>=v'务g 51˕1p 4V7}mD ˵fZK`n!ʼnU>3}C%ý%kur5i5hh,<]m0aCuz𭊾7DL_"XWM;Q! 7<~Ie|,ɵ7IdDGn0>)7 :ς}dJ10r)WNTuͯn>6o_Aj4vH5|P ,yDߨ~4J4ã{T[Թtd[|odL;{-0|Vxt)k8<1~?o3{s\d]][ ֡o!:Rl$wpcMHޟ07T+Z|0G7Jexb |%y =cN4w&GVuG,c8X uCPMYiVK_OSF BQ]_UGAl)droTYgybw NEGocXL\", FKwݪ#EtC\re'^#d9og8l켰g 8\V{Bc(LΣW.Ty% d`)F{Lbd7h^>yӗEQQ+R7nɮ}M^YrP{YP5.@KƺJCU/=+$160,C3Z_(K d@VQ%o LJHH-#FM~:v6p 2W 8oEoW]rSD^WKqeBZDt2sZl4w*|l LqsȿJիFVdUO6PbRq:dxCvs4 8V=g67iiR /B7Yn>y8[иi '^Ma)6Ĝ-ؔᤓtы[gOS+ƔT8n I|$*T*qiKM% )/W?v&~oIsP~Ɋ8zCX"@ΩdxmKMaewLR::*6) aoyFV-s=DLPf3p+w@HNv̰2X˜/⾞dAEv4dP{Tj8Njxt/b;NUۍݳa^r)q.Yއj'`eĝC{Qa%~х)L7Eh`cqp| uy$<< :`V'u!v| w8c1rmFTdy/$őn#T'.*RmnXL.UB6̆Btǀ Rد*\39zlWrxnw$:Nhָioq yֹJ#s1J/[P̃tAє ?># ŃR4VLa4ݖ$bo P!foRs|0>!%~QVCb;\@Hp兘B[54껇Hzb˻Av>+ry<5RnĖ>ite7~?'>H[ʭUh8̠%cwذс1(>Li [Gȝ"~1,.Glt 妤Ui쪆9aXq갛ԇB$ + 2?Rrug-iFPnV C5<> `=0'5ףpcaVč?fWm!Z֯ &fSy&  ͡O1dNQ$$h-u- {I=-( N{oT'B ؈ =Pg&{ew@JpEs-X-2R d'ˊ.NML‘v:L{7Ia&q๾ҿ7\lovϜX ߾J˹^X>l(kWv1vODwLM ԝȶ@1 #ݥSϿBj'(@cH1cT1I37w$L(#<#X13}9Ϳ`.w`yS#[@R]D2. Է⊳7˃ˉ b)ܼJ|wZ8!B/ Y\4Y[\NI{4vJI1|Yi_w[rܚͱ4=+.Eb6B9_̩m5ϓC$ʘiH7k_첫m`67C^f f{&|8*Nn ;&Hv|@C:nG#7Cᾖ t3s{ D Y+kBIjܧKPҒ9IB'"\Q$ SnN%;~N^pnMfbRlp\|9҂NM]C@W:o5J3v ^ʦ WL-C:%!7 bzuꕗ_ۃBcڷ a0Ml(^='lB5aJT 3]?/dK:l }f`0:W=c}$yn!+>uOt6*fSp0qAGAsӅ؟؟^LX{5R/KM&-%Mr‹a{5k{pTy:#2x*h%P8Pݿ<]nzEyi,ixyr*P?Wiͬhser+~YL`#Sl60 xvHu07=i0|2{NX 2np1p9rb1- ]ٮ.B!"8EL1@˺i$a%v= ]Hgg=Lz&Q:KG;̝#?vs?y;CZ֔,^3inf{͞ĥ¯jvׁ}v>s }O=7PuGI( tcne5^Īn+3~ciݏ'NIMXBžd XEwflN]|nX^6U ]C*6|j[rmb9o5!'io^&ǡp9]SsWʊ?M Yo͜ݾP^&D@?GL=s_52k})geN7I'aI#ȣvZ9(LMAm>9l*vU04"[kӀ] "%Z~'TuB*gJ_&KfUmNM 5S<ЗAJ]%rk' mHRVHI? ypx6̫VeZ*NwL{56+[.zH8iLc̥2CP.2nšX {U8LAh4}eQ*&I `aN􌧯h+]kb K:,."65`G<I`q:m m2ZJ:E2RA v ]d5]3:`x܅s@퐙,(bZ@wGxÞ5v|2SH?\{lUϋYd9/ܾ*? T~ؿqu)IjvFS#v%.N2MWDÔyN;;gLwt+߮Qgk)Fy :o=יϴp΅̇cHѻG%DB1<=ᣤ;Q)6pg 2?x>YӈW<-0<˰~˳+aZiغ3X%ԣG`7ڿG4 pC(R/;Q,h\sⳝj(L5Ls^/0%[Mܰs`nH^1 OϞ}N,Չ{ MϠ"g^tG5X7ݝiFa}. .(QkA"6ʻFkiA# hlyc3Co#uTtlEa _>-j%a8ڤɅDc콵wy|4WTBÅ1r:FzsP+4uMGoNcI+1t'_}bR.{(n<:sG2,MB˦azL 05xf#yĭ܏ zP?k􈮊3ˤ_]'2O=Ay(Gc]+aog,:1lvƪPdH6u8'e7 0 M=zשdl_aũsE0VLko8{6ŎiЊwJրlxki`qI+?&ɇ}b8Y΃+hM {ۧNPɇp*Z:rϓ&ԫ goXAx íʖ/ԝ{JHȷw_[J6yhJǠZ1ut 2㤢v6|s!#A{=_ӷ2k\0py-=[߸"ҀP*-s:Ut\9"`B*_> խs8$ +WEV"02O~/lKEE'O]7TYzEl56+5u"rӏ|ǹ 4.??(?~?]9oӌl٤>ηg5oFńIvrT5i?ȁ'&_ oR[METgBS`2ˁH5[' Z ?h ?[b4Qˍ OD3wA[=r} :ۏE]?,@1>z|t*@Ȼ17d5fa;3AS'N*G p!]#6 "H/kQ=aLUϘe!S&˦."o,\T骁5T[%'s8-\Dw =;z-M:S\ Md|uD&y↴,5$fƌ.cy{J?cA F&4B|Ajo vs%zLl<#(mT7!>_˶_eaoD2iAK lIuf%Ad{Te[C,E[^j ?l~Gݑw7|4g&DgzϏTYz@G෣0MA?=G#0wvNH^KBoR?))5)'{5 ;},VªcHhFB[_{#j/9I2hJgwKxG]`l S5hr@Jn9ݒCxEq`V< }O ;C"G$yW{ang̏6!5 $:5 ` elӅ͕n;~i#JyK4xf̺!8fcl [ dLY+' Ó]YN+Q9km:><.6lX F~PŎaF+h]/Q^я# Sl3|%g MzkA;3;uި?XX!VXVjNkej1y3e϶a͕3^ JQ ˳0YV42 Bds-H-69tծ3384k]*j>Lu'MU ߙG ݧk׎vҰn_xҌH!2Jx0w7!ggd8plSߴ pu) x@c<g$sSw[,ɭ^S$$##l2*U41k GVH#OZ+:`ϴyb?;mگ㛊q>a,ߎL/KLJs ǟ2G:`C%콗}y9#5=~d2 =e6Ql3nD\2:3N~x h6J4b& Qy `^}bAM i;?,0vҿ[6+Z`FtM@ֽ~nNsMMAHHT2c0_\1:vvY-)$odyP9_1"A/XVj+xܤ̜l؝TU&Ka[/2WiH}N:ĈA;DwtU,ҘW9#;M- GAj86ZU1c4H5cnï&|qkTN_P v;gah`sUQB!z* tZǚL!CM*s/Po0HT*D7|<|Eh;*!HqSd9r7G̘}AGl@J_Ro1]Ͷ"xKh6񹍊y` ^iM5/sd2Z~p-*ag| ljv2_l^e+ OH]<?4mp4nEg܆uO d6P>aC:ov'ڿΗMl.PlEYNH2laEk,r"хl5ZAީ3Mp*]#^#vڏ{Z.dA"ha ioN2aNpQU2AJ].RUZ.)`U8)-PD|g sKN7'TgHGMa ojaX0Crzh >&Qt,ׅΖwq0EXs=-ĞJ~.D0\ wBju ^nyS[-F4'T7oCZس m?m,: Xw#2Qmmz~!5E\3Dz \m;?vmb#mj9mvϠjU`$;0r Q79ז[sjwd㿳9G^ڣFdDLzv_][?\شaL٫bF I` An ܆`kx1gݍFuЧN\lFg-봱 8MonyeÈԞhbo|p5vDCM{|۔Xil>Pۚ a64r/C}s[J(&{mejLo% _3 XتSxsxrtrVVQ4SE.3ܖC._K-Co H zKu?9 }o8 WD"X]5֚&T(ñGٴCl0Jf'zh[kN%vL۬Vd2q CH O?Mi {[-=U‹rk/Ԛۙ.fscVG̏f^vC9[>yiskR{Ш:䍠mMD5<5q-NzѠ,ɤs4ocnƞP9b-2*Q9z[붥߿i:/G᧽şSFlͭ; +Mk:z8l9}hm)VH&NMRXm@I<~1X#ǐ͎.!^of2ޫ p봷]vvgh}/ h__Hz^c)[/v!Rn wi`z3 AגyEBݧ${ }G0~.OsҺYͫ7䔧M"pQΣص2l\a6 -WO]`[NS'_fC`88@[N1-# T!@&"x;:n>fvX ~+>2vn`qFs G FPRqf?b%YdW_H#ჿK}÷O{谎jf91T\>҆rme/gίzR?6AV:ze+Ρv!]r䃫eh4g,#K1X 6kb~N:vq/Py%#b:αn46fG c7K?xdXۛ1j~mF0du4*X5X``~mckY5x;oPAp4>T&zľFoFZGq:X+E^mdeG~a 2aؤ|e>gg%fxqbC82<k!8(^u8'αIs h=Ǟ# :cDިn'ou|_#eV\#*B%2ېm8~ +~g AA(-I؞xL+@ۙX]|A#N@@a;f2}NAM СĔOyuv!ux.BgK?7i<0ÿ nIG$y}Crc  n8eg|'dЉ;6)xhG=ʡ3LCӻdn]@"Pxmt +Xq742^xi|Cnc X_*|wG%cy,G oY.pJj͸-9{7cVQ`H>u;ǐ\Y=_s!ʏ^߲K^>SO {+SwsFDF׷sCPڡwp?{iS 7¨nz5#S_L- W6&UNiD.dc6!rxmأDxHy_ZcIRxɕ3鑥 ޤ ,I|\ LB,ƒZ,X#ӴvOe.8O Ao :L&$e/wwAۄMnW64O0tWݼB9/sȒ#=<<ٕ27Rpv0a:&Ϸ`.E:6Ulp[wkeQ !ڙMO_9 }( $+ w4;~w)J#6ÅW) .1C1I+ݟVLΜm"KovAadb|ՙdvf<[.^kÈ`k7KQ0`s!)>iV*MiXWT"iMmNuݼ~wMjxl.͠KsT~jMpatB5]4h_= ^>4zPvXnN&:(:׬̸o/5а ј\ZTo.yk2Wo~>5>Gyicdk$_'/-j<- ϰ׈mwF*UUK&svMO"uĞY?}~QO~i`, ~X{:S >.ΞFߙ?Z,[o/Fh?LǼeMC*5r m%_)}yj0Eho?ƭ'?qGOFDip{..aщ !a:sמ*BO;O 2tyǽuNc㎁h'% 4} Ro=l򧺍qcWf >G3̺ݐ-(ވ/Eŋ'MYn?|zk` 3 L/^“R#ţ>uo^<݈Qw"xm`9%3m~kF[{?q%<,O[z~2`qk/yΘ{jFc\i$i:@.Ͼ{@Sv g06:?6~C:=6B4뎯z(JF#ss1x:f8J:x`n/xjԠd Q੠-O9}h3v RD!p}ɷ2 nϱtOɐ{[J-M/p#a{ؙwc<ncE"0Ď7>s(S=JK>@@XD&_>vг< UVk@:}m ;&7kSC`PRt8J2Sl=RBd߀zؠM 8 x&Vh@ ݶ8C>ɠ6\nMcSa96NRϸP}2O;3S@h~>!6xY.Z=Olڟ"q>A=",6Ϧepդ~ S5@NXfh7Åe.dީhopkZ(T^C,kؠ)jMT=hSl% +^&GkjUS[c#=ί࡯J3rzt`-M!Y?f @c[XkTi}hBǽYiwtbгuKynepu3ZjE g{y$)Ǟ-I/A`8WJcO}as!{o|mK|RIZk8]Ñ᠊aCAhaSB71qa9h>E=&s,=(y6o&92ҿ_ށ(ZO#] q1ɉbI>?`:Q&gC]Ea!(!hyLwh ̀iʧgdG_B bcwͮeOEI"< P /-3{!5 EէFZK5dӠ<۠51[RF1KSCύښutWpmؽ*%bcuPȁ,M} qR~f*gNUEOL@+׿/%GڛM*Sԯ|PݶLAflFl$KKs\\椡B'{:@ +qn'ߊoc|7?$F)] \ES8넆{u7i#ynw-zmjym X&!T'dk%Eo\i\Zغlci=2% !KjEK@I13}H:;rwMց=1kͶ ‹V{U.':R1 S,})q:ྲEFI&(O<>U ƃo0f/^(!\8m5g&(8>W+`EW<@X.wmKrV:\i8|v t~'sݰ=~g}icВ7[G}.p 5bΑ3ifsay,/[xlޡ2B~Gk0ڹ~TL?i^i]8n#w`IlN?Vܷv^!yΝqcG=8c* ʗ֘zD*pKĭ,s?f/fp{du ֆvpt<_|KAkk}#;|նpYv]/`d;E=0k{+wfaT7`Q`=qļBMXq—}$jZ=m Eɠ ܆Bct>=C,&[a;^n)c7!z`8?2}+pcIbK[2ܳ Y|z[gˁ;c-#g{; ki6eROKwu_t&LsvDIsm7SYi.M#lϦ1(T(BI>Ō v&Q%=qs&K7>}?ob5qF-m05<ȿ:޿]g9~'3SEsfѓݓ%jp^JP2]tcm=Jl׌5 3=YgJQIB Ea[DBw1" <(j$OCnfދ 1hDa`u(Q?ızr66MLǥ+v߱7$D=ն(5u$ȹC\I!ng[tbJ{J_il8p҆ǫJGWyW4g4̰n8AXX|*05F~l-҂5.vz3mLv^JwF?Gt1nCw#[x|&Rsa#8*%?Ԏ<2Vaٓ0'O⧞kpep/a-w69mLD;I5DP _l?9Je)1 /]д@0ϛKÙ c5otƷQN 4GBp3VAѹD_~84U+iP 2_#MCV2'r׏6nqwmU(Թ:6M=^ #cg[kh]炅mz>ƊhI_ }2^b& 0Ɩ^[ƛ噆֪0O)zm䜽{ Q^^uMOX-P^]{aG:9>3([rչcxX*2l e~fd}{r腯-{ĞӇ]d~nRgUmLluc gs> .~X$>y:&\fnlq G찇-!b<6M=; [JL# MPY֎&_!-x&ʇn t'yxj{@꧗tGÏ:=4#njF~ mMcx%O4npDt`>(f{@E>ldzH-] RA}12<2mrhb%=ٝPJAk#.~P&Ƒ~NgHU *3ζ^ íu2|⭫;Uyh!cφF2v f@T#:ỹ9pUQycM-mq _t8؇I52cmhS}8Ok_»}KG:Qn4b683uXy5Q |}0Ope N|Sog^tHbGaB FS \{̤iwN6Zj@P\{F祃(z-Amdvt&> ?w܃>I샧#5~o/ ۄ{#7Ճ aCSZfWHmB-{/i)4[k&9rwuǜzfVXBxx |PFEU솽@ %L1+?^O28ogq$ ԇ:h .8^ߟq^:ux%J=n{F= c# J:v 饵{N`/FmCiO/}yhNJYg+3N=%ޤۘyޭF{w kh.h΋Zt)rz.-ER{q8 TTl\p)?C@c"t챤%M'5A"g}!*tF g<az! #Me7`O M{Gt wrC*:b6$!Yg4O~P=i{&_hhAc20ů)q Q1]vh%^eR)vW<jyۺļ|1|ߴܹbg!WT'O0cCY^m2؉2?_ 0ĨzJx[( |:kRi~y_yJkdik.=A-(말5j=^.9tt !`G\n 3g_ynmX`?R/$8pYAÝږc'ߌ71.8Pu~ۦ~VM R6jaB4{ow$Ͼ)VhMMGf$hڑH۰b1GRFʜ3?x6i$̌.bF㦮Ycu8M)|}:UϮWaUS_("yts'ᄲ}S(_̎kM%FLY8 K67_i[Sݬ2`8/SaEnJTnP=^F j/R_*<+./j1bުުձU3陯/9txr$\ŗTDpJAʓT:aSk@AӗA҂Ӄeӎ%( ʳMIA!C9Z]6&+Q+πX)`M>_ӨO4 qJ`~+dN.0?4qLPTkHnqqnu]s0ZӺ$FU#`ԹKpH7K cG59J&\υQ~' Je.L>V_S헋/ :q9 KG_h >ʞlƒ rȶ(dꀠQ t 3s bDBUCMnaȀ7^4«Wj8KF)g_? g|f歭fP林s^&K, 7⸠k#Vb Vp)Q Rf 107`]׉y]e%qyN]`^nk8y`^竝җ%щ%SG sftߌȿ%͛^d64|x2a݆&f?n*e(f%v9ɋM*J+X7-xD#|u;bvޙ /;<X*d?'3kB ˙edRvx?,X2teiZܰqtc ?ۯmԧ}DAd`uDcrOm6z';o|rW<])pĦLXB;TX@sYVO310eB,b 822_t + RDv3brc'וv=#PxiÜ'?,6A«{Bad*kң;IEwP ~fSp8zXTHa8`z^,7+RE^%ђtU$VԐ ɪA{/$uBEJD}u\6!p~Y F ,]O{m-DCcUh@ոQ a1#}t*יj'@EvNecNH-*H fZp4NǰX  Lʀ+O3ll5e.г9ei{l9h0KPLjG~#km hn <0bDϹ}Ym_IPS0>MLٲuW6&ŶmcM(ݲ5Cs6%\B$, 9Y;-H&3/fy0NA{* -aG9vgِv5<(o67v V0?us`/!Spp Jcla_qxZxޚ{^n$:!EjFu}#<lqm gڔ>|3<)^uM)8B侙DSāoeR E4@ |4#PѨR)Ɔ ~8OHv ;z$l["IکL"սၡS+T㛙š(OLyOwj.:?qZZqWa"':O|РipkNM)Dn6:QҤS5p:!rM2ia_C"0:+8|62%e5{KKo,5\Ƞ%(-TE1տ5Az7GzfT|.АD; -kMC!:GSHTT ;]"cnStrpS ie4uA bn/--ˍ8f }\t/%X|=di fۘv) E$3gH;U }·%2{蓷@h Qz_un! `׽q>ǑMB;a .ѫH;a%D0eByFognMx (8a.$ qZ`Ka Dhn88'd$.{Աת!>Hj 0yGL:]YVYG c'VH&[gJٚ ۑw;;_w}땛$jBd\U!k v (I E/Oǭ}`z }"E bq1rR)hЀn Lw*kR͇|XBV46LAe^A^#RS})) 0UOk=FH3>Xa p=&(/1lF6O {d%Sb(V#"smM5*Grpٷ@UJB7@uUfgįYic>Ǚ9w"j7ŷvf]$4 0Ve{`HMr(t3/G+TL,7̓G4f0.q<h?F" B Bph~ ]:у[NC0mYN77i|:LX!/ }y#{bnEepW g9 u$c$L_vgÂCw{Z;SIIXn])hwq:D_dJQ|e1R3YZ-Ti VeƯGZ債Yώ@Gd(|"VA^jJ^r^Mt@,FX:ye]C>ͬ 2)_XxoYmrK=2n!;0coÇyZ2o VSU~gzlN7}؀Gg 1VKUzsq}~ڵg6f,vdb`˷HOȏw&)?''("z=}PY&1"nRwɉ ׺tH$ d 95dLYTRs9+6Ʈ=`u$U|e~]NƣP[Z 矦u@)͎_>Qo~J7lb-P-43v +m{-/q MvJߛ#vCXm283Y-bZ-;l l+̵|C68JF&I? W0' y?V; ݹ2AssK wc3lz,$'[~8&"lqaqQz<"w<[-7qOxt n_ a mCY$;s ޒd;CQr"YH'ײxrtH,EΊ9#],kl3Nb"وHogsD=غ0 鞄 G;lG~ukCh##;@sm,R늛M)̢Gք3FEMe`&htX/w7C(<hy!?X[7 ʱJT6)Ƚ÷PYI. nZ o>:Ұ(?P;Aj-)]qFkGtDZ"px?XqO [<4P_N'vǏv9҉%7$-=ֵ[kKzP^:#`'g~ڰo6L7Uo5Y^jrHήilIu^ܦ/SF]H))ʩ-FD%6=pZxjvF-d9MC:|2 `&`]*A曀;Nj% `ڌz8ob/7?7F&΁7nd[ARn#p>T26=$=8 ӱ/sWX䪾(1Z+ ?# GYxyND .Ql4v-^ $3ht\%NG AI\vn`0TBѭ_N(FHPf&Iwsbw̾b;&U0dr Lpԡ|9'R蠓G cw;B~>߹9DBN?Lb ץсY{ukn:~f:4xnjNJVX)Wc2qJ)Ƭn=pG7O9<.~[;P,{!?h?lһ ߩZLVGwj;o|Riz3<|YO_JO3nK>v͚fS].hN3gsQ/| hm«[xS{ٔ%\7j깛Zei42zSX={7hL)RR5dJuwW M@ɟ^Qj]I /lI@y+,ba NF,^ ,E2%JĴ~Vڨ TyY p Rؚzo۳)ILٷBET_Wo1mbM. M-@u}^C}Wk,pƮz a5hQf׶!і=e"BK7ڤʦ+fHKhءtl ¶)s$5>_55p\0on;%hLmNm0|nlOSN(m6b;W.cX|gDQZGp#ED Rkr1ʥC_p8ɗ0fN?;j϶Oiey~TX4IWJxB{HlO mر/v_In'5pxBrHb゗RѺ(w@+?ѬIzJ[ z6B iY ;xj]QXwFܫZ147.-^zFWRT ec!I5;bŎ Ft;E,o+t2ʉW#+:Vr4D8oRSPߩH1aqg"ormfΔUԢw x:G =+8j{$Ɖv؝p'wܽ3{y ~w<qi]C3"=I X6Bpp{Ґeڪ)]}jEj$46:}d#2y:8K&y!{M!=pB ^Mk#Q[MyM;ӐI)ZP_69򍏏jL+~7[ͥw7ߺZM})Rx]\6z-+3!jNAVu[9m ɜ1e{Srln2Bl[eQ7;U~MM¡ ,&,&oTҗ^8/,\bqч>J}XnGru˿!\=%P s=kCpbXfg~#ݔ/#oo$ f̦(aR+5U!@o)W y[+3}+,E0÷vhB6%'%& <D;i}(t7zUIX|hQIHr'nղ/D|c Mr5׻EE2) Kjt >@ZL ?ю a>j!(v'ՆE7a8wMa#U ~>@^SٰdVhnvsQû cAS L`q`v RjBϿ 5k zp Ŏǻ>C4τFۼó|n퇫 sdlcxn$X(l@ʼnҪQ >8 mMoPF%,\2 ;b$2)@5\I nR+ݬ:/b$LUqL#~|RG7_݅ GȽ[EЀ=X ]SIWp9/$4%cDT|xs>{{J s SЋr2cXl&,-yaW7h%: b> }О0X> 8ݢ'w¸.fq4ig"hhoXŃL@kDD=Q4*1 4h %&bޔ l}5Ϲ/̪ؒAl:T* s7>gR]$ E -۠V ɯſ_S?1lwF1-o\g3p GtvS,iɩ?"u-,>XN`It>|R>0爙£:w&S|Vy'훠?$Qh:Wst;r2AKLQpӈAm/K8tzGHTAi,C0$R?[FzSY苷|̶X5&#&(3k?S֘V'˖!]iy*FgNc5=]gz&P2B6I8zLе + sUbw1!ב㐋} %vN'Ka5ҍ7<@_UpCD\:^4ۈȺWE";揄q:>|{_Kc&~aC\ՒTB@zB56Rt9| lpE@+chFZSm9꬇ T !R|ּ2/|пw@"P[&;/w!?w/-=C0Da`=q~9&[Zn 4`6'oC|Ÿ}gMX UxB5wm@*@:-` c⸎I30͢S&, Mj@ŷEy 1WWS)v,L4A =0Ogu`x?8g;(.~ ]46,H#$ WR+e],GiI[Y01s) P+hY!^Uj,Jзk 8E0A1 c~: !Qjߙ O h>_?Ǚl|)zܚ)U%ÀZ|x(kI dGfC+KRlD1M`5.> DZ= klTs})dw,."uM3Il޷hacv>o?ʼAtYb;pO$x TWK?%~al.$%FEc$zdt$M CV8 ѸY@-SDEL_?l? ArTђqQ( ۑXwX@Z?aGU}^t&q@Л&ϊ0)JrZaLuDt[+>-H,-ta+[ZsHvvx W.|UVh_.ote0#e2{k`e*6RV$c0e I5 WyՂd ѺIf&$_.%&~MU[ +LAZ&xX I\eC5Ö&JgR⦺m&SxYN@rPPԮOO Wňf7Zk [)SGsg˻F\2,OFPaZ ˦PlQZB >oYAW%|Q$inBkЁXV  :8kdq41BĿʻYGc5/o/%sڶa";utKqQgS:s3RU3O3ĠPB\E7/7\*7oChQnKR` ׭L OTeD7U:.0 տ@zU–|P*-O0sW@ln'~24Ј~W[1+WHro۔$=:@`[j٨08&=ކntkyҐ '[VjIBKv Tk4  ?Pw_c/>| rJj/Aq,8!;o$T!$'Tw)Q*m`=:69nrd!.a 0AC7~c)˩ǽ; ._,>|Jp ]"᫙ϼ#Ez2k3?hHgF~8GA& Mu%IG, чLM:`x'tv{܈1@g2c OB8||Iz660;J3Hppğ0tt_8b1YGT;KKo[Y`ޛub$J izbLI#uD!kYg1&]0#g XM5IUnrpkoG.my'$Hg \N0:>͙ߵkCϽ/l<Nd?-=ԈϷض@"NO~1!NK2['g`nf PHUӞ9<9P\"iD4 2~|ܓigxY͋c_5.kvܓ,b{زNyTYg=ƊuR;햴rAK^ Y"~g ?}܆Hߟ/|b$F>vpB\2S2+eXCIۑD'~ }>6ZzM4j,xvǖq0}k#]P 3ȂWwH*q 9 XKv-8vhql97 wf]}8UvY&M9aGeŭjlpTFZz@EYQ: :UmQU̗Y}ήnwU]G^4U9QD,W_Vp:r`~$Gʉ5Q-X;UbkסK@Ewэ-T8/B]zwS8|{O7 V_&q~d6P6K<_}wShCFNAX:.aӵ. yGim-hdݯ2 B0Fl7*)at duliLjت3 q6bc׿6Ɣ4p|1| l-xvI=w#3vzNIH{B=<6dȤ7ew}"wz#h q^qZ%8`o+DxNtQ_ ;z s <*>FocTsgo6mT[mL4/QEv5s{d{y51xPdlxI4iҰxB, \k& 4CunhEƖ͈͖.+ ә vJw98hDB+RuAB3Fw[N?J`|Xt&*Hw?}s׬/`}ϴ>2C;1{N=`a۳wؗt`uOdҾԓg\L㽎u: UMZbxK]kp[)tIa0vs=5wCWP{qsH,цYPx-]}q빉>?R(]*;y@G۳|L@p~Oלxi e[#ZWh#%W ^"ը Q\GH=qJ#`mR/3l Bv7Ҽ#I4ށÈGk'6)Wluaiv¢j*FXEI9%F̳:|=qs#wX,Ng&1L/9~/៭ ؽ=NsGuj7 VHtjHj8r@( Hx0G_#yz\`q<97HI6yg?rÇJ,8*(6Nojl+EO no,4bA\3.sSu @&󇔵_Dv+QLQCTk]7䘑-=s O ۃ]niJ+*5arr%#> q .W̌mg趗Yz<;qM_1_>VE@\UX# 2w,Q:f,;%{8a<R^DIDc +#EݙxeG!sx,!hG޺\ƻWqЛ\Uރ8_JenÄUPBl6`o% 4Eiڏ"Bb  rJEQBK;(5qVY\wC/1`+uuJXU QŁヸs\҂FZNRU#%I}kD2ţJ*ԫ^!cq"P+}f#|f/Q-סA[׿ glv_Qd`>CZyEWyV KNQ7R*Q`׷O=:yMx$HiQG66w{%՗9EF RP\~i@4|=cq2܃uPasxgGJ+Xo]' .YF9'9D'50|Pf{44+v eţ0wS} %Kn76{46 g6 {fKgWtưѮTNC>1c=ǂCgICnO!e} 6?]~`m 2jgEs┵A4px;g3wfXQRSu[kQ=@Rb-ֳLT*Y#!‹GI/G[r$kC%}2~є"]{lR (e UK| ̦d=M )2J~5|_Tm1i}ջ,z4id``P쎫ϗ[QT)_Tk{5HM}(oN .ɛE29ݘ6SKa veu?Im#›jӞIzZ*7 ySњ~7Y )^X!UMp3@8S4;iN/ e ,5Qǫb! ȟhqRWudo }\+GIMFy8ٽ?wy~ΚUZA5SZ} wo-@7<5YNM3#uRxM3cUfrUP%֗ ~ pD:T0Uռ/AVot+2ȬB4(hxlؑ!OZ~ lj9_ 66f__xq5?8a +_,+k$5T:lS_\f{r8Yۉ|_o'`j|{6{ L+ '@ ^M} i׆RVy~+|M* WoeRsN8Rt2̚L[]ͥ6FdUx6VXKwѺav|so%QSo_-mϫSM^ܠΫkOG/һMqzPv(O $6T)yl#? Vy= wpǽÁd=5N8i,? 0t^"6\܉.0[!}V𒤹W䃋l$5ӟ yOBB떖\kc=2>4/|`t(P}NGR2 v]+ZJrVʕfMAmꎕn!c5ۅq/s==G#>b݆1'j9c4'=#w vA0𖻧%h'W&g]TLU2$=q Ͽ]):Q@R\?hBLd{6>iu[G|}z|AъSݤߟ[j Gz Ean4 U' _¦J02) / &kUC==%vWɺ-VR]:K–G>7*L2LW3=խ Ƕ=" ݵ 59uIB>4>)NwDd_"~jIXy$"/`"O@g7x2;ͲGx5$Lv,X*>x}{bױJ2{KG_#p ABE%Mpю% =bKZ]C+yyy.S aW n40M ,f4͞g0yO;#+1cp+ջk]k^ix2e|UNs_ Zyc4`:r9ݓq.H!i <מN |EPm\q=Fo^;O(i`dq[ z0<}Tw˵Oc#u8ȘMԐˤfAJ!piepIތ7 PVKÁ͢.}=H}yx[}^\w7OY#D1ą8 3p0DΫtv˻k2_;.]]i~I?#sL3yc8l:GFm" pnmOZ?Yd=]qcBqlmRЇFz!UCی* x4Yw:$N'Sm85$i1G)§}H#mR#ru} ψgxc6ndT J 41xf,wWOErYIUvum q^O[1g5z{m$/&M%@~#_miq~u?o0| =|@H3˿l޼5~-mV6+]69@Fڱ'7hPýq<ޗ5~Gx8z|J#롙IUMRFG򁽨Q#hAcw$V;)SzPJ$1.X o$0p8ds>z&<F󦜗eS8CSyfO#|^.7Djr {Dz؊ϽJ~8zU-=<pfAXsq yVo-HGQ(8lm`2E4,p]wM/t /  K*y {pəO<[Iq k9jWT}b,jpӁ`oct`^Jq|u '/NFϗu9H6D!đ[Cu;FF*D\ihpl6| ei߭2ҵLS`=~M{' x||~1Fqxx)R9=U""5iN8 6xN=˸Px1Y8I$}zgyP}vKN·pb5no Q̷!RNIW<;SgOtiGQ.0F ;$ә{pgmg68uO }C98"ILdzG|U=6Y:v.>sAw8n1:ZѸ,dtC&ÔYt=#.jh 8c<) (1׿m{Ihc:| v;륻Tzb=ECDI2)tG?Oj{cL F_bOXggvK0=<C\/TJ_3`'S1?7Ѥ1,v1{-]ϣVD%sA8Z>y.|*Q#Z5!HFyK{~2fQv~uݕ{,weH-3@\<_R9"~`94,~~ ټ FAI"Mtgkx0=D^/=%EI88?rȫ[6c9"Z|DDh(;P(&P/4؍V"T?oK/N`6ndաÿ}v@(@W?i[ ~ސOpК,┓BTB9mQ?a] 8"ԆvǓ18G_6՘"_k_ng-W{ H<eZ4pw9tB}ry*CT|}:Chnc DžBƧwA=et::YC$ UwCqFc#??ϖAơE*&<15er5A% NQK!uٚR?{d{ݎ*.RP?tuOhoW{(Qay)]DFd!#,7ց[l[A u7Z.b,MTV.]j㋫_X ÿ5`GP!kv/b0-O;aǐs|a a/} b@8~iQ#Jt$9̕9Y7 UVy|N:7vAE|K([z,fx89?X.v_'݆Q y0R]_-zmm$ o6n~pnW})I|Ixb4vw׷<g4!oV%;\|Q\|/R*PEۧuV&N {K' ;5D 5Y g1)} ^}Ho,܆q 8}N; tYVomIˇl DժDIV#ϟIcNt'I&ezg_}r.iZ8<(;Yryùo͞"&?WFEt_(F?\kn&Qr{X w{CEB"%藇w;`5[Z~CRH'N122=w~F9:R*)v4Fc`$/_zػ̔V`^`8M Z?瀋 3{O} |w?hQz8 [}^% W :ouzRfM9ា21׏|-u9<0G3\ {{z;j$IC6PZhԍ|M7KDF=b4MgJFc,VH 쭓O: X>Ja3|%@IBW.GFӗ[|1$v$&ved5;kd&2$5c0oYcᣑ!7ܗ~]{a`l!R〶I}O56KIPқnwq_!H9g.烳Qdn)\FUV)@@k9%P(z!̾8 nzS7{y,GQÁ-9~Naoڇ#w4a;|< V5;[ 'tOkؐU.aG1p<mU#7 P^pYBr%:rEC%c]~kwGz>4Y5@€HtސCg$DJlxcŷh|xG;yweK[W㹘H=]7>FM ]N _iMo 辀x~^҃Q3*3yiyu?x[ oDèGJG;j u!8rpNA:vϫdoNbDؽ?%`/Vov/d"5:LZ)h; yY-xh09Hɰ} X|B {ԋ풜ѦMk@g=A A7]j86ܛ:cM-BsGʢ# f{xd,:sAj {*5"#XvnE"o2XzBiL~8cdlګ ~z`Gx'vݏpdՍE5(4h#Dy;Htز֬h/VFW8Mzx $I ա65|m)ojOXR^ PzHai{soSrc@ 2#"%sn"}MMX+pqŽJݫbK gnV0 EvVDvƉab10t WN1IH~_cs\޺Otۏ~̓3d HAm{a!tG{QN.} d"d稧‰&RVqk`+Ec/Pʏ OinXNXJ % zT!`hocC|e(λ~yN0bxz7:v> T:T[ؾSŗn>W Ǝ68sln/FZVoS$+E`*a!d:|Oнh kS2Hc'2+Rҗy֒Rm$*Eg;O_nC?Kc=E{2|~7ʹ=˿cS[%Ϟlb]ʟz˟(~P ϷZk0HI_&+PWm|>OE.Uwl޳ӚR_ssBut`r-BE< CP;ɻgv:t'@`Aü[Ba",;fVcIFfd{ 3MK#LZO /\Bڵt39\dd~֕5:VK\Ȱm:VqfCR[Z$#)f-Wb'LI sL c>#jF4#T.`d4;@4ClNY}VŰLE_| 2Ზf=5;TjDſqADPfإpx91 f!d?'| ++=ț`Rek-;u& 쬵H*:" As*J'm9mNUc{*j[*QWͻY"P\46Jw^,a57 L˯'֎p؜_[s5YKڽlԒ.vumŮģEbjg9svRn=GHG9f,~0HPJ@k0?2'NbܺTϵ;2JlhY0s9_27yJ/v9O1shbVb}tUgJiS8X8q -/A_";_7ㅒ<& j[ p-ٮzȚh^~zm:gu4ݷ$^dڄ6p2x~:H~ӿ#ꆬ[;vmC_`4es6l7Jn0KBqFө ^~3_pzP& .ld).IdˠkOWcrZ)~sH?jczZH6` mhVFSz,[1k5e_qaDh.7m{q>K{ߧsGƆo>{-]؝,0OnAcPl;fslJ,\>B?…($ɏ5` #,u2mTe+ن7ږC؝b > ^as>h|kD{oy29\emY,O {ÂME0uQ`HNܴ2aTt>g7՟̓OҔ#j$$,Nܐ9hQ?[c^ePJ8Sxٖe 3_;p4f>wK Or%B`>o5l)x j )ch|PcwPnɅ<o;7gZA뢌TeYh`,y,]nU׸fA^cA\:xĶd!٫<n$ 2"bBr38#_e%}M`a.. >ɗ vKT4fpg+`,ձ'CmQE*4va\y<igr>`ti==#3=M|QmxcF[%ZvMW= )0ɪ )2؁l!}^` 47dM}z>[𓎰%{v2Sxqon)r??0|r_~πyQUZg7k-^]6ys0Q1'^NlK҈$[fr˛Y$Mc>H}aK|yL7B-ȸ"a>M=Qz 4 $h'19#Y`ƕwCGa (gi,v·_- ApC[wSY6/!VxF-3-Ep@hb(,s!轅yG!+܀A~}cN[L'ƷmO-&ʡW3SܫXVoކ{b糶gQ9SJnv"j3&3'2g/}c*ٺ8;yjtpK9F б4ܿ4NxIҿkmUӸ&wlo%,A[l %>a_BH}@wkPKQyЍ5VnV>Uk.H;>7nj*ZZê3f=_yCa-}*سp:K3[~+X_v[f]-l%xͰo ?nzpM7/4+TtЊrb{V#CSV="W~*Xn5 c8ׁqy ų6kɮBzv2v]Kڂkh5֬Eb N-/_uOޝ3rKy*FA"N#Ze,-]5d/KU.գibW)h@tq'o|1ɂ=QG'QsE~iDL$۬du9ǍXX,&;uLuCW)FphEI'\uߵ)íaas? +%4#{oA;9@~=omt`ґ[rd2_@# *S kcuށKЫІyG6ޕOq19iiDua5}F˷R_ ݚ)M/JThWa`)1OR#CS 'ߋ Bt5clj|)5_vj)@E Ԓ4p&gvPH3]9Pٰwzaʂ2L ۠~&T =)5P2)fMٯpHYM@Y|FT:" m'۫r|x4qȭS?uh޵>?V64Xzj`H큝ےhʉ>/&_jCJ寤c%\>97Cٯu*}y@ȓ=]z8$0U}gd7B3#gBw>ne4'=L8;G; tN}9aU4jImjih}'k~z4Myimg6M`_g1yugf&j?U g^k?wmw<6MgLRNQ&x osnMNS|33fmy`oyO.5T;}.u?3WO>3Qgg,1MDσTUTS)e?O(otM{^k~-ò M}w"yG}τiWrwn^a_\S'ut??T3vmj'cmb?uucjwfvI'RY(O UMekO$9Y [穩#u 2^KIqw?6:-ۑ4d̒gPtO{AEJdq#cW>G;h ?l Y.*ѐ6q{"ۓ^Cp&]/(:`~ȋ:4Í21^xs2I6 p>bFDFuegУV KbSyJn{1j8\ '/(:'6#W}'yfA j ({CԤ5c9SiUpQl蝲/+Q|cʃ4uiоmUj3LTKyEF?Ogs?yVE${? fˆ ɂ+Snk_4ˠ^a<^kFKh-# ss~o]-bSs$?8 X|ZFr( l!F^#Kboɢ` /\5-}~ׄ,ni3f]:?3=ahm#n #`@|9#7RX^:WQM--e:6Q-85h/<7/skOhf?Pk{cеLO![ܴKV aFilߢ5;`@P*߆&vMetBEyۦ>?1 &.֐1@Z8!pt4II"qjQd%R9.%7ftf.2d\U&${n4U͊.)l7f`i p'FaC'bݞխZZfޖ\V-67cnr:X惘eΩP D&1X1_ eNFw/"C0$~NqhY:$BɐaMATݐ%' hJ#C\Sl~|;O?e$2mV{D:<`Wsj>>1PVj= f{vCUՂ1꯺54#lq#FUA^t^s ?5q0?N甹7I>PR$R,6z: ]8A@t!v875&|!k n2,}2/`h\.6WGɂ0?N[V{=:x&h"[4|!ŏlG%?o >&H=Yuݰmٓ; ka\ws A_b4YZV "l;]gJL2Ux4hU>>x ``iد:[A4 (큩P6jW]LA/h(b{TW7`Fwxٶ~vZ[ySI7';+M]WvSyǗS~+5Tp"m';9<'z^aMN4aHWO:*@&D4O I T>GC8,o eKi5q{39Lࠡ6J6fN_v3>Xy! o6ĸ9T2zԌ>$x[J˨SaUֵ*0z8j6opێRl}~{^Qԁv=0+w34ϼD+)A^SL׉u=U~)~S%421UE" VTm`EKX`Bt 98զuIOzikfuq⵳5 b&{!rTL<,T[=+3@fOJgE[TXTXnj'Y Ai8bZP}u9=+ٍ;OfU}R]BxmEXµ'[1*!Fy|~Bvb"9¨ʘwvf05A>'l90Hߑ"j?یeGhMmg\hm=feL$+'i\jwAJW#r5c' e%g`JH:F564 V퀺7kKP +bK']J+/ݶuEQh6j \W-NeL{Rz̈c3#vK0#a:[Ci%L䏏YHڶx;"a4Zҝ(esLܕlb$QpoOclvDB3i $~NJtζ p |2y۠X~D&: imILnr wcCf6/a><[\Kn-DA I=iN$e;_\#lyW)Hh3ۅ=֎*šOE~ga:A`L;37r ^q󫅠LqQ@%μb\\-]i%W\">Ka!7942؁fx13+ D" J#}&G߇v+0ȠZLifoOkBنouiw;W8c]}{޴{!L"C?v!ӎ6&-.E-+~F\+\@0C>SMؖܵ2d ՗gc9z]CF߂+N}z&4FHùeI`p Ѓ0v< p;\ VG6XvG4C2\0ѷ͕#b]7QmN]3޶[tG>cLAÌac}l 6_ca[߅qˌ.^_t[.l.e]ߓ*@6}Á >[$h,mM熓*@CӪ!(MRZfX &l [uLGUcP j"ScLkXiJ]0fb(>W\o0غ#i*u> d8D/]4 V$`{YM}pahnGf7yT݊P>S Sc3vB7I0&>5 f}f>9j-"0V8Ϸ4,loLw2v*xh@T[a6|iwe tlл&7Fvܱ_l!~Ew+B|k#Yѷ{ 'QIWSR7:WxFod@9}م,*Zz dNsCh ;wCw7o6) *ѣ*Ռ>!:)kX=\G]{apFU32Tc/dlMiD2DWK+VI/C a=Tjwf4ɟa*ߌ=eB6=<Q6w>ۜ{;@c`-6?9 &Y8n64/ Xؐ?՞?l *(C;w&HaUC d AWF@j} 5G/"ֶ,[ sځQ ـ3̎O6"hL C{^lF+n<4YUcy;97rCi _c4. H&!$pNf 9/دRUCɆC6 qtj{l^)aȭM^Kғr#> fa u=/zU8wJ۠˴z-)fQO7)8 [M| DK cQay(9}5ilD7ӏ:Wv eҜbDcb ḛIDtȑ탔6kV ?fX!gN}UmK?tˊolE k`򳵚1"]U|KVpa-[^G34~A_w($L-]Ca8=U|i 9v9_P400GK][S4v]1 %z:1f`3G7Er4PNlүE!dnC곴V٥$%w77MR=It`ȩ34^ 3vhqF+i,\rUӦE;fX,&@8j lִ.X<2|סsVПi*K c׎=.w)$+*lqSޭAjdw$( 硇KC[fmI=æ{ 1p Tu㫇4>WCcc(Xd} t8D$&H4\21s@8Nna{mò{x/;# KF9l>g+}҆IuGbt0lX^Xc䂝ׂ@,EP#jǎIDGfsdw;BE=E "+m{7ƭ䉳!7PI$R{3†ʄ~ܰ·i y=[JZ/RwE(Fk]{8ko'M`{X9m~H_GqUOUj[s"In%Ʀ5?j4k2\qlqLKOdV373uvko_Բ+]nQ.PY!ƸT {+mev8whzb믆&i`HZs] JS'z#58Q FGLAmO> /Ie8 :j`=V-4j2"P)z&o`̸QiW:{e.}'Mvq wvdu?44~u~k ;\28"Š AF$YC;qW %Ek Z-hxo Z^]⎫-xn&TC,92ir1{M;:UjndmqRN>ʻ~3wd#B8mZ) 8 C|,=)AB ܙT kjs™w[*3VMoj谋f0ׯ6燂W9b<'YϦXH'i"QߪkmqXz_fsG |ɛ-9smQ qp] gyiNBL}Hha, ڬ[w$6HD@QJcd X:qt]a&OVbui gorfx&Z+WEqν~:s'8je9wW@Ѷs[ և ܥC^DoT sKŴRnXz:_]U"gln^P{^ \KaNV=+HtNx`TT TiϕW{87&,13u,i"mj #RJuH ?3{]!@Bq~qG˷Y[~hW*iFb}YO\E@F sc ە?? 1Dx~nLs5v~} Wx1t[RIO~Θc: d#Piu %ЯsQk\\3U\>WĬ 0wɰmj3C $G Fu[D0vz^>n%8ChѰNlVEz]8hTkED>c]T_ Mt}x_ Np,)nwq9`5{yxV=E _Z/u\_^Z@.7B?X{DT `-|[7}h=' 7n=5"$k;^~"Ws e~xGBO o!>jw^W[.Wvy=xZ*^X̾<f8{~!EKD/!г]<^]pnp`ŕ?>\&iٲ:SB'{U!Db)ȘW}擓:}<ZK)p0킊^mq{>klIJuJ>q!,֜(/^SbUKp?`i8cTLMGzFz:A]^FKH e"bGsG0|ѾV<#DU47x}FPwf>l8 Hv?AJ҅ =HĭPH Zi*lCcM@`$h34$[KZ[5VRj'aozB%Hq #nY^Uz[!ÊY Nʔ^LݟwEtg 2/ $er <CݑdY:d1bȫ l1UtOF&4oɟ?QRzaC "P.LxfȦiq UȉiBA~S}M0QRaLN -5nLrıUF&Ѐ|z$$!4Kz,L7 DE9=#jlz}`?wTٻk_~e`Ėau 0~s!!=վ]n6[F O 'r;[DS}b&=rأ$:"rtչU9܏+[O|iOsDXB;2_e!*80#dDbe0{"0t]UUG {-{v'5:N"]G5Ciμ ̤0qgx7k랒~TؿB*{U4uM-ǔ2LJM)[jΖ.R?|܈*g|RWxN301̰6ˈַ Gv~|f:nCUO $i*p%4Ӧۮ;wi LnzXQ ? z/_ 8O.H<.˳@^Z \m\]|?U&t>~K9eUu)8=tʂf 9nC w0V|_-Muj大H0 :'r@A|z~%ugyp "r\ a頮\;Md,Ui| >J=z֑!ݾ1&} iiCbHOxNRCa9 ,O̾>u A .fmJ@Tt43Mk}75pSl!{0YMi-3檢+fǚ1g- t9'٣&V렳y5YEhZ#2&#K56jL%50Z.?^;; {} pG4Z^Yf/Tlʜ9@n$@b (z 9-c](Sי>%&-EQy4603& >7j>4ĵ0fs7qS*Cv.ܖ0w^Uc%+e?)jt<2K4*ՏԵŦ8߄|;:psg$*0aCKPٟwZ5ja0K߄Yr"ɂXyYMUmC4ظ/wЊ@/uOֆCa%D^48 JxTcPYVofxe3XGhK! K+ `N 6Eänͬ|μ_jzёG۝[u$D="@HV-@GK~7$p.֙xbrh*CZvrzœ;Yހ_9 6.Pa{9Zkl;{` B^SWaLLڦb 7?J\k_ǽtE (9V~Li~r *v59D"iJ[shĶ_q-'>,&; W h `H0l剑 s˻uaf\]xbzJblUD}-Rg@mNġZC+EiUU۩o]8aF$Z0ꃀm98C`_6fY;Í=cljq wH&UB&k5`+zvꉀk2C"9j/"(մ*'}J3S1ΚoACyKwzlE>]/>GmT .I0%՞p\^*^Gtk|~1!:sM-mw.#h&XZ{G<S:ߢ;9ؔȆww= h"p+I}ȥ꫺NƏuݪ#] c4v/{ _sM/8ٍaI>Wx(_+,$e2#kƗc{+$#j;E:љb9ӥ5agaQ]3<7>K4+51"=?jZr1=Vv:l3_'t)mzD*>Mnjw-;R h|vE9,ʥ=LҴpRNO܇ظU`a[5iy6B> Io8i5QcDh8p1X'sQg撢LAe-4=窯2a$ #whbkR0.`3xYG|OS&wNc<9x9WSv`aODeS;ՖR\Z޶0m p`@Elnfo.'l ͯUr 4>hb:݆#Ձ_D`Иzq@8]a<†!6pIqwn鐃: (. e75"w~Z( }@ЁtC>\gV[=a*d$OdoV3og,ƓzJw;[iBI4ƦH BX {b*6Ea%5 1tb#fcڌys]'2K6mji ԡdI anҐS]ͫ<0t3bB..obC ĬW\NndžD Wӣ'8 JTG@+ oLW[M'CĬ2F ¡qȑD&hEH_4@EzE^PLeLmP0L.ٍ[;wAkHy ZK =;ЉFF +yxfK/Ck1.!z|4H:jh8 %8uhmDEQ~sԧ'g]!BBS+,z-7Wz9r㰅,%5M=51x靾}Jlڵ}z|uhVz9@d_ӣ%7+B#Q-"Ue={54C>Z1  D6 AC(я=vKf`(jEM!p -^\t!0+eOY7k.u8Hq"W6z7Ϣ־&VGHjD;7{w lxUr쾡nVp?ع09j~Բ8rOV֦ͧLjYeoFn2*.Bz,ӯ9e}z$3p]l)4m`XL7?u}7 Lk j $-I8ZK>v9u}Kuй!MljjaW"1NIDJB;tc=w=l!azE6RqCg[ zs6'eTAX9_p9tZ?^߹Ӧ9j}n޼d)1|袿5gWs#qE:~>x*3tWZU F4;{z r!zͫek8Ζz\Ͼxcw jVVj킩ֳkVC9%;caH7utś3t$ע5 )P/l駱oY=F}BKǼS k1>oj.%Wk  vH8^;WaD>^Q b+C/¼  G˱Dpڢhr.8\bQ.6aaH}tnT-aѹpiQsh "UQE㡷^ 2%=BV'EJwesSBC·/F 2ٷwn4,~LۢA=;N4,>FA<o,*ze 5 }fӶ=sNPQbӑoV`%3F.OUg^* 1jO٫bTZ!eW׀AmPlWڗ6)Oh倾}ڞ1NM8 hokڏ5 3 N# U|/*?FxZgQ u x5 6й"bWo:-Ώu$h*ֺ_ӝ+J\ g>8֍E/~X14gm,~ j[F?Xu+X͏93N r,hVE#` u@XoK Hԁ*8(n0Ocdn v.#qf![z=N}ytc}`^?z۫T4 ھ ) V ]C: nt}Csdʃݰi:ao6n:lQuRh#ܵ`DiNN~EEL|HSA+oJjF H0VRq Hqi937 pȍ@[~ɻns87*r0+NSfݕ vv,k5~2N+൮xz;ՕS׍x = fG5>mљ?n滂Ə5k*aK,)rӮ[?* J4mvmFD[*E)+]2HϥKZ.G+!VK4{+quQ@43̣-~hCNH;nűt'8/LWʙƍ4xWA/3>٥}:mrm:^ H鍴lSx#vu/RhOʏ UjV0fWGCd}rPq4n(]GtÈ:{lmϼWxHq`\\;)"{j" R{Ag)2-WKW4&<{#D7{m7VY3HW9?1X=G{j2}4s#.vt6)AqAG/L]AO4#9v> R 8=Oq<I4WfG* 1 2ϯeqtͼUenihtJ=%4<ѳn%pH/݊]%ɷvY-I&^:؁2Dft;Jݜ ͢#e*s%:nw8L?~y?%ٯDlږx׾ytF8lo bd1.5:e<3drW"!5=S\.120!BKxTioqxbv!!RniZ/`f¤*NHoX'bF#@e A$@_"Fc16(E8# IheйgJ5(V6 XӢJ#Am̝7i=N0v è;c3ŭV6Yvb뛿OvS;%f:~S5m~Sbn Wgc n39soHDd2[4E +9;؋q*R: camۅ}+; ӏzhv&&c|~xi4 `:& F=Ác< j#F l |Im1+'d W*S45 8]s׶Ý=tG'*52ftKA&0R#RޛbaCu?zEW;s*vAcfr@5K)qys;=ef}#M6JQWI趺R @1AiG9e#a. 1_uExE-tO@۴czJ|l+lme ?&ߦ]ǵHAJx=uӠO&ܤRk# S%Ltk5WTИEX66WRbv,_k4Aѱ*K 0$6 4_ K᪲_xԙdjUxTzyD$)^z[W zZFTLlŅX=!@OD3TR J/+ڿF RK5P2 X5<GLA'پ!vknЄހ3XˆfGCVi.5sspӧ?SWUs{{g꺪9i9Y-sC&TLhkxc=V{ 3sTo@%G82Z>v `T10F^" e H<|m[ŻCCf)a6G7űxH4= %!ʢK%Դ@AbI|64#Acw@;4)D$uY}Qn//qt(j+W GF 8}\/|:qp l;yQ^K'D@fGEӤR4/aU4}ejHg'_#ܡc2U:vJ/&44ssa0P[ZSSUyMC 4),JJMKV|sҡFPn YQZE< yzJ E.>~쵃gs\8"wxV Mli, bXéGMm8*DYF`@BHVZ ϊݤK!5 bS%"c_Xp^ZS˫`8a6hi!U['VxF*"_h' V:܁rBDU4JiU"' w,pbJ叒; r}Pn׀@ 34_>} FdSlAF*;(HAr4^Tgr<0 *}}@m-J8%H]C7`:h ܁k2fe9+s8m:TԬl2WIN 8-%ר P8Oh#>9 gJ SʵlCK8;niKk`0=]p QM}Oy LES1Zc<b 9zD{h]B%;qk/D1=ibl98_V\Ρ'J±Q!_;{ͿKLއ~3L̴֠ok.,媘/S[;(x%Z^Mb5gÃ>>*{P#MFP{?努x udG3٥`%p] Rt4p!*@}"͘qNqY*$A -py8G?\hLޠ=;cp`$ֈ-D>]vp<<ӻsxX!Zoj^U@j_%GڑpJ~GL.8/ԉiǿSdg5+Aa/l%U#_+e2ɼp턁Xj7# ),j0w½2?ى Q ڄHU' 7MiE"sN;D6ә"^D2Z<{7:m$57&]ۘ 1f'>ep I9[x;PgE|YHZC)@p}fWSsI!\miN?>7\ F疱tcWj:T穋hWqcQ褎wƲ.'OQؚV#5=le^ZRCHQ0AMC2Dřٹ_QeEon*gŀp {K{v2؊Ҫ`O}v'v4‹ȬNeʥ!:@dIxe\V\2xsdGƘDkh݃k*Y] < -鳐3j[WJN‰?MOK*N'0w~ǐbmՏ@b- s%7/w߄Ӿ1&߰zf::GgB ε|s"ܒcJ$޳6XNgfe~4`hEۅF!N^Gr)B[ y-'.l2`8lK"_TY1j0 ܓ/blWFS,"++`!lnD)}KE6oϷ4! 5WzM45k5uph)g1a=5FNkZG4ܶX8R֒"jkyiRvg.݇,曈RQN-0:vךŒSHh4gikRj=RKju[q ‰7G"2ͪժ3zw_c};#ɆcR8=1le= |)[i N)ϷK-Z@f0a@`.l3x?->N֟{Lw{Xί\B|O٦墄n”^ۅ=:euOmA 5ceF~["5q* vK&W52_*ym1ei8C6ߩ *p |ArgswӀ:c> \z[霽'o2/Ֆ-s-\P{*>vNQ BL|+lH!buXYY;HfL70T2hU[:Ґإaѩs,|;9}8XT/v2یapsR6R@ӞF[:2\{㴊iWn{Įʸ781)km8ȡ.T3`n-U Ĕڷ҅@b\s,;xy4jG E<ΐ`=NQ(kw+rA+Vjj6lAS 53 :.=\`P84B]8ŮlP. 9ԘL5vFQ* %탂*M9ٰIMm %C~gdWKJ#.|0Cf!xmd#21OvVչ/a1k'pMr/S\z֛C{\"Z'*v߃c8mf \=)PUuHe` H텴hޘBja9! ڴ+r{QÉk , 9($f-ds#FlG|clciVPH^+AFdFƶj(uԸBP|kI,K$߸ ꜸZ VPkRPdy>H]rCsJmI c.`~J ;*`>K*,Seve`i&f [87lb+˝F+>`X5p;<1mڙֹ:̴ Q}- u7tT=`K(0`EBl|;fŎhnXܼcl-snғr#}{?l14ҍtnͷXN9?~ ( e+#QIZPP{0{wܣ 3'+IU`Ԟ5?f?|ͭPx&>P=͢)9`v[,C5 nԟꞑ_AkM(n 6'H >Xj)jL_X&:X2m F8=ǒ@%᫃Sg-i8*.jOX8|J@md='J&[^,EN6ނut9&MhO,Qh-wn,xB^5D -F:+*X|Az.TOW(1$)< 쏐4@o8237Lfz*>Z5\Xs从\߷sl۬ ڹn'At~|-X|ֆByW?{v9Jq ;ne=0sSV eYgs:U|L Z7Ќnf&1Xܬw Ң&4 M׻l'E{Flg1)&q٘n,C1 8{Hozhîٍwi{?p<j!CfD쫔XRnH_5 f},!sy ېY*48 D"S)دj{%VSC6_ E Er; s66AkwFC^m/}[R7G+lTpʤŒKÿ--kJݍLB͛ z/ҞaNƇOړlJo[$i${'^+uv$#!["LhܾyǙHg+}=9mC¼FUYcPXMk~,7rǘc,q2pC|1L:bN 'dk;( rRrKhp @ڛqiʍ[qJ뿶 N-,KW:pK8Q;Odiɣ[N]N-8Ȼj؞Wzr8vPI@,\pcNL3vܜݼ|<1Ht/ 0? .h#uhai0W:hҙnn35wy3w<ށk)oClLk 6ږjm$ݛhV2 lNt;onuwX|Z|?:☻`v.|tN} ?mߑ//(j4Z!#x+޺;؅*K]һ>VErY|oi WW_s[-sU \2 {T)7f;{WQ+B+׿GYn7vtܐ)ON#t[wlB{\ kHL]1=A"T5Y!\p-@ea~G3؊ExaGM2xǒIߵmbx8w{ ."-= W@"l4sCޥ3tQl= ^ '=D!(77{,l&Qh8?>{0LVIݿĈ3^vjivӜuO:yoC҅?/]h^VLqު %HH}ιӰY~&;i'J#Xb+wa> ]cl7]^h.4 : +z%6F"r`?(ZYHFcjZS{%uGB f>[V]PxXqx1͋ЊCeYs~̵}[=u^Qqx& @j( –>~jXү*CCO¥7ZF9jiUʤ\t#`tE9ڪ4gF>G՗2G\; Th]Kgs5SG{e"|9S0A~C)kWev~d1Ŵk ڤ]o4[=hsi4>Š?Y(V< G]g)iO$9M{+~k2j^<h* AOk _ǑҀoinZ͊|þ<|3Mv(n]@]uUR}GCk3Ϲ܉ik_~7ʮۖ J,L:g']voH.fEވxEq:7ݗC{n5#ui0)uNlӝ}ֱ0)խ Ry qTe`8p yI!BrQ,; <wVX!jq;`=-D|5* a _-֏KvwcN_}ɤ!kElyy \Jf_y"W[59KW&c8IkÝٮ;=;y'4;l}cb]gym#nK³QiifcXַ>jPHRSm ƦsB;q8X@ݥ.5l .)c&]u5pr׆p9n̈́N!^$`4ʖ85l Ю;>:Y#kf+P V. 캺셌QC-`b^K\E_Cr \ø q$o \ ^MblF;c]Q-8egwU. Ir(R )sq&(?i6JBpqgDpɹ/ad0@{{w;13@g8s,@kܭsi~QG:kFRju[t=ͼi\wVIǝcF}׼u.`cBwoZ-Asuq:zǡ6޶dp&.T@dM=ꦝDqJX^ojnm`͍{sB$tDf t @,LqJJm̽ۙҥ^_ah)F5OeQf\RLcjLDY,RJ ,dG3:HG+lh$Ӧ ΃v+l+A&:|:ԩ#Vzm8\Y>8^U5;8brppnGO;>=ژpj4R4^~+6w Ҥ=-&U+VIcio~珯8qL gei#Qi2V12-z*};ݟlDgWwt8 hyoSD~J-_W7xN]]ۥ!-z ojh4kKkycHC64^*]@֞Տ\JwˏO5dA\U v쐍#p8uui@VIld_vitRZJN/\%d1;;k(|kc, c.LFf@WZa鄁inKr7<3vddr_Θ"qЈRf:1;;))T4Tר%R%ycS9Թ,t?s )p.ٴamJi aym\~~#TThWд"KMh#iT=Uu\xnst'3 ۝ZNmRQyP1-*RlbD9?@GsЮClOu| 5s20 iFG߫Z iV:q _nBEtIV@ņf&Awa)>9m?Ey؎ [+HszwXrq!42>U5 =:RxPP p6ɟkHE6OgH:{[a5(jz_~ǩv,q`1'y =(=DN#3A4~Ol@צ^J{֏+^@LA:}gU w}I~ ]-Thn!FTPl aaSvVL KRtd*RQ`z1iLeQ)^R֠ ^ +h&پ b4K$/On.2 n;F[/X!7Ʒ5O(+:N^C6{s'|>W=^svkX-4E^,!qU9@9T2m2omb 'm^:MvD3h9aK5Qѫ}ةdSI Asm qI(pAWI ^w5Lpa&Uu=Lsi/th$hJd+,Yk_9ȞI%fG_,keh(<(8!C{kcpXB7Yz;g*=5p:|"Oय़j|5,D ,O4O68}Гɳ?I+D{Yœq{ddݒdNt g@Sk7!1jgl3w19sC`3oNO"]1 T7yӧEǻ~L>d[3.eLQO?GyFpcauN:lQbnsC_qch)>a0* NZe YfS;}9BnxT~Me8 h<#K*5T/\jUႪғh_g‚43M75v`aA%80[Y! j*YڙIi ߲Sb>V9Φp f kLy.;IGî_?̨``s<Ԣ/J\ *nRmͻuSXʀI ZA93 lLB/6K(W7\ԁ̼ve]u|$#XYmp ޫZiPU_qX6j{JGx2 sWa/H .W/49()f Q/#ӟ80/ U9!!kVUKu[H;~>cGTq|" 3~Ӛ YωU:\Lzk:v;~geڜڻϩtբ OVYq./rs?kϦ j2.dL(L ؍:d]|&A H_UukZ3 0y߮X?5_1UߪJźSS Ģ\G >!?R3,&a~rbjvNCϼ<6%ۥ"ЃPZ,G? m qʆ#㝙Ik1*1GYu۱vͫiݱt)?u>ؗErGڅTAPA.:a降9ʩϡ.t:r;2{֙>4ex{Uu;q?6m6/Q'l@]O[@,Ch~6mA;JT5FQ c:4 ~ad°ߴriO1mܑ|m$݀M 챺W&]qK^;}nW&"wx߃72,N" MMtX*쮱h gS~p:c6$1S}z3ro}Ep 0t:6HА}R׈n^M_Lz >s5:9I_WZN_k񩵷k8=K^=ZOuiTkN{@+>n Q~Gu˪VSX vWԲc]c} LSOm(RUk!2ҷ/9qѷq|"OEvAI媗$G8dcxR!OUmiH\ 47…6<lan g+bX4;L*,ΡpQ 8Nڙ8*-je^AcLCzJ7=;EU^7 MOFUKaj ԝrϜ)L 0k*TKU&}beRUSbŎ:Amet ka0!EfP+R!œ=i}SY p( >xj&Ov5PE.SBưdݮ)n2/Auu8\ۥ\.kl=vE}4WYκףL;B{jB70ĩ߄dGVg84UAj ClwKD%I +54Wh;TS3TPf2f ,^`Hq3dht'*R]񄨏'Ho~BbFGaQ.;"w'_U}~g$lGa\O Yqa >(!lQQ7&mp%<`=.O$9>o耱 9I C`܇!>KAP7h.L=DI=U/ )c8+':m96hD Iv&&o{+8ɩo$#-Y`a!L 0t&*l*Rm}*F0=1@+F鑨Nec5=LYYǁ@aZԩk43D3]RlGN{;9shֱu 6W&]t7bJf#y=:VV,zCh [yPپJbN3@ Կ G-PccVJ mJR܅g0 5ɱt/i LXSx$GysbP WF;>E+@w x 4̻T68&|Dq6)GޏalNiv h5,yzxG}7.0K-gs` ov,O@nnq*\KB& =84sSaBǝCﵙEFpԸjȸ0""+Rٕd'` p} l6m5x!E5#u qL<^c~(FM[ZϮ>eP%Tnvгw,~# 8J5Cεs}1X)ugwEN{bך22cg Nuc"X-S͚ӯB@lE0 lFLMG@GӼH~c$mkaG k̰BOU]v"3&ĎTtMqjyOhp2^@U$h%+{sJs|ĉlbdAH„v#dG#y`xh&Jp940SwiΩ(GAAnCsjLpQV۰+!u%Jc 3obw?N9[adR7,U q̡-I[FbZndTP6=M܅O :.X-[K 8LVj+tBcJYK0C.(\ ܅a"$;RL'A@cґ݇[2]0BC;;*9.4UA K0d' LF j}8d/ `KB#{~lXiJЭX'fZå(O"F< G9.n=04'UZKC2߭\ۣI7Zw&|wcd}j.h*QLN5-7ڒ.s34^30õy j8$R^ҫ=naCqʓLa\4G$vZgפr}{ {6H^TtXŬ:*rEA6ZsQLcB6=% T \$oy=4;צ`D{Aaw{qahpuvj_8tکӟ:a`cOT19qɩ >L<9Zgg;_ ̷i]vizϙ:%X[̡@Ze l=74h>E._G ړML@]{u Пgfu=k;Ś¥۫n/ov*}ݶ$з^]=31q6߯b: >Eu NKڋbҐ:S(Ji׋/O}c S|0`w`#b|iG0 jS/]M0qH P Й^ z-`rie3;LyȖ 9Fj'}i*p⃗G[*a. qN $sg NJ/#*ʠ]CPċ'tFƵb' 0Fp**AR4ž Xdާ]88Yr3yIݫYڰ+k'z$`&Ӥi5#, d J Ƈz{Ua qqi0rMt<~MKpUR]X`m,=k)g i`#Mu)A\6 0X2gxNV`CHDv"ܷձb@L[X[\p,>hVm;RYa3 b] ѡBVvb6Ow L[ZNJ'95D;:MsU6[;1Cυ .SB vwxgh8*ܛ6f/}@t4gn3p6Ib6McRW G_iX$a IiDxW|EH:HZGf:0~V$I7/%%ĕ\[ɳ:jˆ-ld"Qv,|3ГJT z-#ar:鿖Fx/3ZBHr9 O}UonL jD_H,ghǪG|Yp;Ci1uyv.r=i9i1~o4AinũT`4fFfN fOH4FVέ8bdݸMkݗ.o#RN f@kWZT›=WNIv@M) ].)Qy } Hs/ 9h#ׂtg]@eI[[; Dkh=rH8eіQ_v4*(3 [oJ??:X7+~Z7'7pAmf^r;N38|BEZg엮5DՇjJ N=WXF{goe^7ُ#l\D,omAN6@BE 䢩fkCMˀo֯} LY,?V]ot³-h/&gffS3 FߡC1@@G;lxܛ}gdU3UO"tކY;6?0XN[SǗ/9^Olb3l8'₁fl&YwL/Oёd|2+B'G ,.%*3[d9!ɹuy wrL1L}x׋GW\ŁB}A{zP銞p?ۨgRTKAݶѩATp,yš1X@vnEnponG8}JU2Bce`YPlQ'L.9V~- V:d _V7ne{VU--~D@G%FDxzGam:Ne碰aTx)5!]­ O֠&Z)3צULc#CR["Bf$TCπ u 3I9ܝ;3AuJ?ƭjSSy乒u֔plaD);& {Sδ|`$9 -p82$$1TZln2?ĵfdd6Bh1x%ՃQ5^\]ܴ*Yϑ8rs#e ؖaPZڗddv|6XaMm(]jWvFb3-}Kڝ/Ak7xE {lʼnDVUx=}λ z#)XNCf+g. h]Y, !لp0zGJQwN Qsh8&LnIzΚJ/8SwN+Tڽ1ݖhx[ŞΝ]X `5I#8~`(\Jq |5utI)V\[Yפg+blo6/f:-5,,<D%/%oC8cQ_zռ}luqX C6޻F dpg]\T{ܹͤ7e`s+Io.E.6QUIװ^<}\kz2+7z3_苫I;LaSF`Öξ(RR-g`+z{@7Pmiծv{*i?&m dHnN':qdZ@d.LhVI{ǟ|@,jD_Vs74q=so*Ր~>CyVk]ڭ܂E`8n"f(amqxGfT_xֿŧjL^=Wmq^<\nӺgzD{]zMe7 nd҅eK? vcV:֬ty켏ko[D.-[n׽"{ iDoG':7_V`jDxۋ `+?.s6[#\X2A; !0gﻪUzw~w^-:l󉵵̇L\&&yl7}#0 26b:t֌lcn棭;kPbMR\ B"jjKVz&R+3-yIEaS;" /7w4~WSD&YD3wv ;^20CM .(TmjD`IƠU}(UqݡByBE'#w:V4 LXE~+l1:bJN` g *},,շI يQ:R L %s \CpHWc6OnNZ=fs wUdCo\vtQÐ̴_0H.Bew,Nԁ)cY{e0: Z N5fi}Wxv+n]B%L=/'k'nu}/ǔԏHsԋC?6'aƁ6<^ŗLuYM1RX T4G2ob sҝ0R(]\ +G|$Jdy:8P'J+C/\j؉•9pl*x"9^r7cgiO_D3I.lCf ȐV*` RL>Q@?߁5dKϟgϖϟw v (6Df=z]?~y,8xx?r6X AثRJ>E|+9f_G 膂ECc~0Y+ -W?EhAz3xY*IN@OCe͸PS95!d"H皎[9 9 yf9a;ec \TǁB!; 3wj1spf#e/z 6 +f2{3O*uFxñ.OL<53Omv 2dZ[|C )D';d)Z{=ߠһbI'AdDbeר\ܦ0 w[ JyRZLVp˷`Lk = 'ʝ1p\sHͲ;f{QwzNaVβ̨N z5q4=:h}2vۈZZBԱ#@EIz%I+A>]ɇMm>ÙGQ؞<:l=Eꦫ 5'f0ƌlob:7s)?NV8:MtJ/*ϴvv#1n}8p9^w%@RN +e-{Vc:GBϰ=kJOpT#+p N,ZPcC|۹ThhI֭J e$齋ӄ[M{"lr ]jG*:b)aZ)T)/M2<isXcOjc;XX5Imߚux[p4|s+'GcQ&;sE*#V )1k;V34%U:gW#ӣ9pvF%-LK ujN؜#Uce:(絬];SK6A. M]<ޮ:$4׋ ?ڑCX+i2E-crt$({]49n56[dw4ܜ(n Q' 2fz]ƿv-C }ϬKt~r_ZLXն޶Baôҍ6O{ HklcWi;1rQ><[vPL%n^E3z|>[2֕o1#7R WWg2* Em5hړ<@4|CB1vJTkFY[fpa#%ŘmHλ]A`O &Gk+l 196IBPx8]YiVc}#eWݓ P, u:[ JUC,~B9gTl)\7C2Ǟ5sN1ÀMm8zlF|ر:WJb! ͼĶ n呆wIRK͆/,G˥q GQqFi鏎{]Sp7,Qe* ?lÁgOKqBNGjvA:ӈbKG;"X'dGGXkk%nS4&E֞QqJV9, ivUeMCy*r3h[/SIWU8g@kb;搣I 3I |Zmӷ-m:yY){hø"wMV:#n\G&`t5Q6G+8\N^dpZDm̴͔eBY7q>5͘ߘFf<Cfnĵ?vAMlh]&+%˲.9` D_r(G61)9 ݾMAXj3#'7Wd)|쾺YF]_ڜH2 +Ұ|YpsADe;@/oN G$,bs_^X46:['-;xC3SjKX40^Ё#tq ԙmP*̡)^\^X6p]jN$  ѮVx\n0[DW\:B]]T|g'}>`>]ZfiD]h2`Ng0,zh9 ~'H;ዎC.qɝ6$XK>N7bqNĮVH~b>p`}x>\)&ڵqrA_y)qqvsʹ:&ί piU^%`}z &uBaB_TTz,8Xz [F%Q̮~5bt HgjCAUV?NCOÁvVlhGfn֧P&g:"ҫ(Uo1!,%<Wc~5<} 55pm- ]Es=c[Ͼ*dȧ0u E?_ o/C̼d?:]l+ ʔgVIѵc x1gKvq3wkLq* 51h ZjТ{#yӬ7 ?>k@=p ɥiٳ߱8rn1Q챃Vw(̢MD}8ڰ==cLA!>pC&$zU3೧L fs6<Pf'^n3o lIiw  f*.m~3}SVl>6$=)mS 㴍o@LF .evoxNq`v',ȜkUk #}"W2$5ܹ[m t[ J9@Tfuc= OϊΧ@&{訑a%b9ѰؔC@_ΗSnayٞ*m 8[0tnv^stwΚ55xti_!cW ҹz7V2zH4ڝkfy1S6Ԋn3K݅CeG|l7ixFGR }BQV kRi#]T^~~$u4sWu6΀Wo8ͅ4*?bUsM?-i}H O*s73fdCZ:9ν~$Y C; uFB + rA^>&F &TB! b8ٔ]d2fL)1(Y0*m 2Ni;=DlL!(TNDٳ*jKJKU2O0fl{B`1c 27396vIН@톉_xeHw7q8%Rp#?d5R,ܺ"x{J[_ݺ3{ u"nr(}J*<(Byaـ93 'cl|.ɴd ^ #`΅lq9X_k3f4>fH]G,.'4UM^So6"95e_k8ZCm!o7yhN%V0{ڃAe4/|Ic{},e껵=;YcI n]NW- Y o<0L}uKxϼX3z JeZwI0E(~g]p*f>,അsap kq,`BbACBB丆S2ǠvKwI%wIyJwmw0aKwqӞӠ<uc?HH-ye bKI_B?81p܈,dh ĔYx|K0Q”=_&bܳ^aexߎITnd/a"l [-> =pwžꌌiw=9Vlp[ L{аO b 㟝 _ }/7T!#]P_.qL1c\FoyqzHݹ"Bg}l;v|HAz>ȕ ra%wǺx3vO6C/+؏wZ,K ^d~[e.H^UguuօE2ՂR Do4w4GpQ9]̬sISlc=}EY}DSoqљ}Nkhaٗ[iP-bF?Pmܮbo9ؠ-=tbԞbs_FM^CNzeZ~ġl9ULk/}yŶ`{&w\J˻ɣkbQ@6*ݏTSk-!YY;33|ĂF<=jL^UAM\|+ӧNlkތg}fLLrsh~1\F£_u;5]?na0c,Tx>غzc@;˕Ϥy}k樒gzVz+6H#w.읋FɃ'WVZ<(ML\ x.3kS+\I==MrC.\)B9\&aOyW!T*`Q M]."*/u;x(|:k捆.3rx281Bi(Y)o )Vwv71wi<=sziGx:/1E]n>3 BO*e):s ¬x=/D Q3<)1yI"fE&I .#I煳6A}gr*<أ?_D*1>|Y.(VDT ]*@/oӇp--A8fыxH*s'jc7>^kBՙ7r6YaJzL^P9F 3A^13LW3NkÌrt1MyChK)dѪcC\6@F,>%xJ=='.yżŇF;X8ey_'YZuj^+SM7%#0Q `@;\(BqO_Zy\}Z:ͤgDWp"ۤ0=uPe4(ps;v]n&1NvJ/]4p܊"WY|p׽\r_&`b8aҥZFG,Sn- JX0MIfItXli1(OP|Z&cw0weDM Y<(XxvF}٩>2("U\Vi!EO}(ehTO $ J8F~cSUY >\Ä-{!G2;"UJK#V=g-Yr \D\!$?ҚL)K.Cй;jhx͙Up{k4f#貙EB;W}iIzH\{T:_xpFU;>n:*c,pSlEAFiSNII/]F;XDpz{Eff[XEE[#/:!XFj*JꟚ9{bId9 Rzn*J1q&FFq3~SiP2^eȒUN >x{I`I$l@>D~~HOQr> %|.Jo(h87]'Dor:D_ﲥ &7z*<=+F/\QT 'J ឞ30:Fgѕzo 6/3  0]scXG !=5x%p7eDUi qJdm"K{[>& g˓x^վ"IX`5i"G ךօz_٘ȭFl,Btԉ&bK[1BΚ"gem\.7mS"rlFnH/\irzÙޏL]_c~db7 ч V9 އkC(,oW@rcĨOݑvQZ1&8-iAE`*hTiwcAޠe/Z8CnlPfFDŞ i(OOV%@ӯ6\j!&#=̧0Z۴{gyq[rab<2)c<,{zTKH MIx՝7yKnO*TiVB:WԻI}X_{-\j؅M >E!'! tWƁqLc2O K6GC Kd %"Ce"RfWђ<@BiĚË{#7 cnԌ죱Aa yp7LA yHX; [iVE(V.r zu^H/"Qg~0Ee&yN3/ or^R8cc}L5KGc ޾<-pYgB`CV13D5Q=Mb4)Ț0kY˯5*ʐ( Ln2/wpq]cn]Aal ړ| O+ɷKԡxX`Y)1'Q8=: H:;ewd^bT')ӌ~/iiy:`^ V!TrЁ?,M0n zN-7Y䚬H^+I7-f %Ad`9vb;\kT`P GrHNy*tM WЏ&Jc0 0TO_QP'ۑ-uugjKޥe8e,F1@TDZ=}%E HB"-ޙ܈@M=}`zhecɭeEKx-~ ,YuYZ%rrx2,rC9,I$w pr<}}``M0zxSzѢnQ\>D`Hm ^b2Lai׀W{91oQv@-$~e<sbBK"ˌl6MŶsxVECHK }.$dj-Iąts\;\؀ n<<&/sQH$s{*'@Oe^Ô(b6Tߖ!c Q]pgC{c{A<_(Q!0LD2%Lr2'@+V)cȨ纝E:n uL[oBX~} ߰ sK'뾀mMIE4fBU ĝ{5l8_0Q2z[5l`iaP^/flwX=ÜHp@.dtzV dR'Zb0L$U7r qÞ tod BWNh1m#xA2t&&s"Cٓ&@&=;q_e6r+I1#00溻1۞KWr!&L1=#@=]Bz8#SǎJ|,ii^<)Ia ^v υ#Ehڰl iL@FThV" KV-'v>nï&29qu0ىw!Gqwb&szI> HXj#?TQH\)y{(2& {0cS2v;xb:^RnǾ'&E,ݹlǕF kGŞ5ʼL^H`5W,# [#S8V_vwwan"l =Њ#umKJWgG#7Ba3FdmnYǕ!gw7'Ê?Eri9v[0a ͯL f>ؙε؂$R,;cAVιU]>E2QHW2\Cw;ӅX"oZ|0t,.LQR.|Is@d KBV 2Fnr}3 Q4`Wy25@% i4Th14&awh#1j 2ƊO{zjg_CLIňa?;%a7v?b(bc[݆<ż\\><`/ 0X?)?=z!+F QVe>_(5H\!߾e b\"oy 4vxg TƓ*/ C,/eAH}5@ PȃzzŗK#B\M~o9"XHKIt8c Ο")eG}sXP4kı޽2|cW<*}70 o}>-tZkhUu`RW6f-/zf2]4>[sBy!}]p^Vh Gw1T'~2Yx &nDHJaAR?%po۶TBDYb)u06֐߯Sf@T&בO.J߇\ M/bKd cz ft ư hBA2c$3`xAl 7.q R;(*5L#=nha6NGV^@LO6NAn_Q=Rs#!0fKKz"S&=E{ǓWU`}Sђ Rjcg>&ObfS=vO}Gyb NKwOwFZ85aqs7.nOz.2F =՗n_P&wz84-i-Wpx()e;c;C-#rvBO}YgT] )7)VojqVzqP֖)Tpa~%QVD# F\_ճG 6G|Pz@Yam:|6ЯTv45)&M<QOis̍mzH[5&g& MZ;uz-Zv2&?5Q7*V Mvul 񪰘P`u$b{[<Q۽+ɭb|Ul1ŃrH|7QKznXQ>Pw`X%$t" w7̯>7vc Z>( cN-dAC803` K{o>8fiۤ2|f0WcB_H+UzfB(9vSb\"]c+p'v) FАzp>ԪE~~1GIs$l/*݊k+xʺn˅֣.TH lB-"zvF@ ,<vU'G~gEL϶tA C>أي?(7 [)|MGbt.F%c 2KYxvweuJ{y ӯx0gV2ӧ(yn4#:/r"18 ?l1܎ 3c1kbS3reGHxX(@brM7ߜ 0&o,懟 aK:vr0)^@{Ɨ{QϿLEc^pG/Օ+rk/}U 6Rd@ o*%Aj-k()7N1ϴ &%wdO!]Ut)]brfܸȤ>޹:s罔2i77jyϲe+)O\ 58yiJJ&^kDZ)1w2z#ṎRafC%wjyJ9P/V{;Ynv:V[yRHޔN-as#_wW.,^޸ .=wF9t>[zUei)ϙcLUyc+MtWVqɰҀ'=>9RqE2ݏܧ>A=L~zBWZj&Xӭu:J`([Da3+ҰpGJ qN,$lz*t7Kҥ߽8hEJqbщn"e _ ;6"橡mrG= ybM/lü0|uwQHC4nV}*V0:>mf3_=Pj7>`1].d=/miDm5xtyjvn ̋ .m/PO ^|y ʀ燀OEv%q*ٸwc[x:v/_X"B‡RYc 9 KMKrd@&*̒_Z͆5Y iڠpaW.MM:71@r*Qz>h`?]B,›5 {(1CڼA4] ⺤]g-1.țn;[Ml篧@-=Ծir~^yP/:Bn=߽J#ЄZObp,-=Z lyK>Ni2N$ cN#ʯy7o_J 55OHIU\ 9WaEu2V˺jvP]ȾT\w<ۻCՐ} :\4,ӺeI0s;.)2᾿tZe ]M=_rs8mS'^&4j:l˝k4 {F ;qe=8\/ _] Fb2zڨy (HOk+;^ʣL:wfوȤ/AtZlp}ݘ@c0'/7pハ  @T'ّu9vo"1(Ȑ޻qZS`Re>&' 0֓;^!f>8{ -W =NwAx!EAt($Y-x^R酪/_ L'q~CU`9+ 'd,2|`ޞU3"g/L4k MFlA?h楳xg<%rp<**AyYE00r$DJ`Aۂ02ߓ3x:}Mʪw²kh4ݡ#c=D[nH~B]馿tCۯ@<]J3w$yw'tlDĥ8@gcr7뮃!4ibnE,o"jNr9) •rw RgCfXrOeHZ GxCmN3erhUKKg'6>Usk횅- :NBOHzih|[y'`'kfrXo&/Z@tE]]ϛo?kwm=cc w3k?m?q8>A(>; WY5l%>+U`ZhDՓnߊ9<0U4%Xh@Qv/,CB欩/"& 3Y2l05ԏnts- B=]ݥ?YWa`|27|0vw~ uLkz:d fOsC4xͣZj2W /|TTI+TI܂mGhmD BF@9i8LX&h B?!L b(@m5tGvlJ\"pK Fng,<4`Տ" {E$ScQ],krҭ;51kPz`ptS ӴIJ;0CTWXz 7`NE*2 8(_.G-0xLjyTBW<9<ሁ5rH%+VG;ѻBl3 C\ ]zI5:A0-%楥Q5rK/&Zdۤ 耻;TyqixPG{ tbnU ;f* I|XQ{=Ͱlԝ+rXy++poj/O DAS0rBڧu@6a^AfpK&P2/~doMQ΀öO*gBY @-/l d3MVv< W7cYif0j0j)Z<4[|ʷ\N-`*S\?UqMՁr4Aa۠vjsƆPAUd׭er̙vh1&Mn#eAV_twX(at$Fmޒp= 2[7Ǝ۲l`ߖ7Z(L(Ơ=f5'S1_-6]$McN]_!9°t 1k29Sg:$,D/7$Ol7慜ĮGd] jƋʪZ $b$l, d^-"-eO)BF%tH'2j|`qvNi0~Wc:;6l+O%_1mR}:sU$ՠh4Xĥ ,KP IX;tK {v%==ZǼ¦.iVEr7Rp]h]kw_^Rd~Xǂfq~#|v~菎X*:D{颏X}ĨX[*+U`VH(kرRQ⮰/Qu mw_l/&]YW:nou@YfX e%a{"Ro^*{@LΔN^. مr u'UVb$z9*CA)Ć (@B-<&~mf1Dc5#pu#X["ؒ,Nv2{@ 'W.`yգHYbUIhil=k/㵁OBWلd'v kz2)6Y767cʦʤb{opKY˟ڏx+dMMWE>ŀ(w֩Dh)aDdaZd/ݿ2#<*[oY y=5p٬B`a:4#_S/ƘIS͐{&"p ޒ0 8JrEBƌ#G%16X7ȠxL1BlTozceh5F R!Av۳S>28<2[{ 1MnM/i >4YgD%eLS#o "'Q!e:hV/t+3ti+9¤˝fpu3SEzjB!/,Ċ`Ϗ)e>Loġvc%,&Xʺ]TrlaB_Fq[(;|g=N=0ۛiĥz˵絪 YcsnL V-y׷ޔ`dy#2>%r]q<@o)1X.Рc>zT흦f)t8H͇!f&(>6_zBё{P%$ovOn MSF".w2ȠI8uh@wVu;9G k oɄ'?`KGs}]JnclTGD&E'|cHdscG{f z0seC1%N}үm݅\j<1!uJ.azk=9.Kѹ8P/evf$K 'cK^80d*[|&>&osVEa6 \3ԏAXcG6D0 t-^ =a|v:aֹD0w:}; ߉KK5iQFR/1sYG~r0T9ԡAhzq] w#N?[}77,^mڀ9]%a/2}jOGb,DY=c~^N1ȿ7LU[ږۘ/WUDy%qcwyX_E$|I5ښX\j+ZQ:6c~<ʦm=K5mڧYnD:Z{@ <ps $;N'g$O"12&s;>U[0"h^~Z i"VOUacLrh 1hQ=O쟉w; &1}?LܖGsܶpNs|;Ao > ?Af}/1Hkj`z{lhI9Nݿ^pà ڡcg<rGW#Ս#2;pP dhQ>r)ڱ R'+0&{MQO?I$KQl StX ʔ*~/;%0*{+$&rr_kX vY7 t P FSlр6I>D Ғ #헏iwdMPsL^KrRJޤqyREb#oC-D45tf*vYtysǗ8)KT'_x_]a1o=iSܦ8C 윅|2L»K$1Rn 33\AćAHJ 0q)Z4A-RcȢ[^~Hk~^^D}m7؋ؗCYRM`TRhLFp a͂/ߢUʧؚ!ocכ5=lRǯ",vz~Vyت_#pί21E#[=9X B"1G-s`LX1dtP&Ho 2xͤ![.DЮxC">-<õ(OiZ%Szaxowt7'+E q|'};1ɁG455{zJFI8|_x8FqMm @%(26k;-(90Tڲ0!+찲 N .)GVUT+"&@#b=!o+$ǫʦ'"4F;@fzNͧ !<oFz}8S$>6X7ipOV OcL pqY/OF^ի@8f!q0sGqG#}O^؂욄5y'BQ!1n'D AO #>3+r7黽^U17YXr'(wA=2Т[2:#otBO{ѠkԢO;<^* S(Fr%PĔ\cޮ VUIqE/@%G@P@׳lceciS*h-yqʽCDT1jY6YsɓBw2(e:Z~,~ rP ~ck-tq:'VfUqؑ.y&-v Ldjn9C#u'FU~b@,Cze IEe*v|hTysh-?\XJGA`@ V NXHHu1\VtFd.BD#/RȐd\"莽' z #$2`,=%$P XCS@ت I4_B3Џa?@wA*TPh+]emejj\PǰM0<~0‹_>AK`rPgM83L?UH$6j}!rLX(p"l!.^Q5,v 3BH\t#Za'Ko -<)\f dxA) b<8헒ЧNxJU79`za[ro\$I/ME nn鱬Uiԗ{ zi0(=?uv!t)=4~]-<de_pqdKĐsy(.L!!@|(RoZ^;yo勲K ЌJPJ~Y%[bb✟El0W3k̚>l e@H 2C!Xf28Mdj/ip,jl˦ڵ. ams~u}~5ZUz5iGvu+?ѱr~y91Ѹt2v#^*{M;m*Y,`Fw&K[ʒV]c5hc'%6KUL5:.z?# U*G9K"Q>B&rR| dNw JgmljgQuOF0QJHk 3*|Cr þ9"IMJG8a⟧';3N.k@a\ h=VqM*]H+6`O|Vb9p7 pU\HL~NJ<1,:"w;2\+ BÆ<<'z|ɶ愮oT|x%nlMQ;,_?arcmu")oʉ= Ow o:裮НoVT^~@KvTLt["Y G @槨0Oa횖 {]HY۞U2t9`\&,[ |# e7vzAemw=o$":xnξ#+%t.0>iu*0Й 3|+xo .=Cr #AhOt&.ils3ZT欖IJF&. +N3#_3A(0pP<^41Xݡ8Hǥq &mmNNNO!W7@-P a [Gfj1}8EDYOCIV=F)Wj[ fxFD;wihI7"F)T`QU~%SL@;ۆ-^9AW)i/T8.~>k2tЉW!?GO3Zb>W%ް}rn;9 .u_U1jXp؍^y+4=0Z bLeD:.C+bc51N#vp E</"OTK =*u;ԜI6ȈaSc,*bp:wtXț=|n-tc$$Ƽ%Mrޣꩿc4nt E|́d <˜%C/tJE^lqpR"n?:(!:D`- lM H62F O (~1P}DZ&c<Xs!ַrI$Ss{`zwfK&Rpw] g׌JhsE#GqaV.Jz 4r?+o5weЃ{{.k܆1xdC]ؚ B ߒ {d|B۱*=-J{ U˚ VdL'ʃa7[}dtC۰Frԇl=mg_GomG#ibӫ}J -w-eLF 1Q@/YE(!0qVeSK. ƋP<^vR*wю6 <[o/dlZCU0 , l r!emZ6usorGQH[OK9{y5يpiAmyHA{T'(s桊 ̘O8:e|LC]cCFRjk2sTHXYL-fג o4h$?"i/P"u!'8>pX0VrHF?5˰4%Rw7,]HyW$#`2 ?- ÝpP D<wN ݔB"{mc Ltg6x"F!hn@cIv7ӏ=>'e`3޵4ك%w+[Y)ΡN_okZEכZzW֖ J~m`~eYj!eij@k@|v;#t~6KԊUy_QPKkz4/YrĎt;/}v2mjd=hSB .v}&a Z Ѷ q1 ?ifw]`-Ƙn Z|͋v>0aґlv SșX-i gbq"+1g>vD)8I +yr]&@AtĎx$\IO!|zNHIFF>Mъ~NML'z Д6/]mf:;D[RFum=Pڥh.l|R*1IoPډ(i_Gg?hdU=mv qkDP͋TWGΨrߕn2X/#} )-m,u{i~K0v&'&Wˈ(p ӑ]$JX̘3@ʀ@U{Rϗ러4-d"MΪ/'Ҙfdo+[ImPV﷼ŖM~<NyBoUq$72rŗc1iLMSKN"[/+`xq;LU4S/@:Aegiy?=lJuhAE 1 ۽\ _&I>f_k%u4t''@ES?>b3șHϘz1xu.`#-EfUGUe?fK;Q$ 1< 1D1S!> Byq*$[0S;a|nvsQ|o\CknCo|:e/X,!Nvi͆&m4|%#w:/!Z؃lE*%Fj/ {z~Rm:65@S[dp-K\"h!<ǽ5@ G:/fG QǖD6ʂ +KW{B̼~U6yڦo귅շŠyI/,yW`Q:*O'p0,O;1 G(2%!v2UNFdpnvV|h _H|7y^21P1` l.S,X6f;r3G8jut֊<}gKY5j'w9zctp~Ocke=x7[GwCDMEW5TkfJk]-;a0bH fۯʴ?Ԏ.cx"XQwB1p55v. 0c<nz /|5B,#ǛA5>I ?>^q;YhN  NͯS^HVqOzr(O* @lfi ,%]UM.AO 1EW5w}j*}hրp  ٧,6ϧ#AtسnLHpQe$';+%a$%aw~ daz sH5hc*Lud!D68 )=Hg s{5]Kj~LnxJIOν+^v =?Wo2LU^ˇex:Ws1xz_rҽ{麲A/Uk?[Jde@^e><%:>F'R@NTnZ+\pY`#rx Q~[3N嵰.&6땻c?֚X0ԯO,gNCw$Ֆidd1<}L5y:['/I%*Uhi6#_6EШZi.\K=+R.Z?,{U?WyЭ3RnGXUF=R[J5?q/֍8[`-ްq/"#l|ژl4bJ:5. DU0~)µdcyͮB|{ |N EӫCn r 1`Yc8E| BGD/-6!ȋG69y:O/F<٬W.͸\GwϪc?]_&@bvz 8w7yђ#)mp?ίy&(i%"k^N6WR"CkCP;Baȕ)#⤧^= f8@S#eNVމSF<Ý]ц3cޓMvD%R\1N֌).st i",Eq8u#*%=`wny!o]58MD^JL$)R[f,SiJL˕F*OLh+,)cmyl"Z{yȉ0!Ey{_O.?W>6DbFTl®=E՘|og^D3Z1 Bd~ jcW.4"9g--4#+S,kv= @4X5S@%"".@ׅ!M[X\WZ. dpvi&{]KG1"$?3T^(An[K֦ZѴk,k7z!yw"vZRS&5lE9QLf3|jZ5$Hv'ܷ[{J*Gb%<Օ&gQl֪?{5"}ل1^y{e*? Knh[HT-+h1O6=4Ʉwy⽯4Lu'1 pZhS, ul&GEdCKM}Y~llFXTqtA#Sc+a=/첌rYVJJQ iвЫZ9֞HۯA5ؾ'ڜ[Jدzٿ8fאH.qԇj}trԃz3vQDeXqK'$}88RMDmNnL'J_ݟ ݟ _ DC[ 4]Hʞ^ӷzϬML{'#e27FCRb<}ݦ%"m#v5@{>rI8"('lOhAwdLeX ,ZZ=yLow#1~͘SnJނw衪ASvQmY~^%+++j |َĖ-B Is3l:qJKOWDN^tNj]vsi}?F9rS՘*RoȏT,U96,ɲdC˝ ZmsƈFvz2`zՂK\% F_ޭZjЭ+u xIS0Z^.#+U |žXO&Xq0ISbL,d6Ѽ[ƌ z&(([ g C$U@:|vd r4\ zIKi1Zd^ǒePks=atvFh_ UYgd&ufO~r7az#L|ncxd6]"GIy"2F)մ|,,\#\N-).$/ѸdT T zd3pơZ`{b/[e |Ԛ)l>.eZ@&=^!jF#K<ؖg#ȹPp<jE{fZeԔ~Đ )/zQ^&}%']"Fly{e3FM׵=aw?]9)3 z ɓ~-Z[(nsg$FܘFA5suN^uk JbA.yTXh\* ߢu!/A8s+T2|33]$  O"HC+\Z]SR{fC9+ե@4@=907T'?0^ld9ƙ񤌟QY Џt-ɩw9Q(d(reKH(F*6LDž1NG|xSTUgfDk͡e4ܪ^{v31aWDKSiw®@䓉J=ᔴ=PCӣ$!$?/B/*C$/hhӻ"IB4@/ƫLYdԡGj~wyР׋=~p$"7aqaDG ;څw`jXE+ZΡvk k -w d'762C12㊷xe{ņ*~o0-o 6Ǵdݦ@˹c cx|?z21}.,`wxt#DgYNG4R8V7q \m\+fGknerxopbQ ٜz:!̀B*anp &h 5该}Ձ B p, MF̛RoX9KGɸWhu#BO9D#,+wCQG-g޵}hh`Ӊ`mc6k U?610Ao؅Ro=XKSէz˽@Q;}_㡎:adtfe?F` ! =*д|Yu|ZB:5T، TW$^[4T'sw;yG=$nWXvzkrmVu=zoݻ1Xڴ" 11E !DLB52%"KDPLd`O{~jA==TdNȹW{1\ђ0amF \#tU*!M6(;KG3_6  dg@o_$Q@*YKM4&d1`95D**m1~Q!mhö́)u8$Ù:bvlD.'HliEݾe1f Rgwn,Ė"d0K&``w!AV\o6SH9SR4u چ4TOUjCiQVݎQ/LFhcJ09p PžDCC]Ɇ4[ o 45na7PL Ci[0$[Ut~vJ(,$?j^#ػFg<<'۬QfB5!-FhZھQCj4e=$x&Q°[ 2:2cqTV nc̡2v+&@;MQm)6^VtyӦZ|yh<4`$VyںEh(>6)^ʷUOc*YZv^NkIqa٪Q2kǴYU|u9?뇭{Ggy1qxi)2~܄3+͉7ufVi!&n2mS{纸FK١u'\UAl)[ӫH-݆"wi3[":w={ $o*1T݇,60wCft}UWeb(;X9<.B?25:MovaAo$AWaͳ.f(i$ss-k¤P$3sh XXdHn{1Ɨ0՗A^GFKkw(Bi% JFE!(Jܲ䂍Y> Ąp8mZu7@A|i3}&7ST, ҹ:C_P#5sYCQCdÉu>Lc7ݻᔴuy`b70@v3ha[P9D%aDo)a]S㽳qdm̖sd``9M(X^h57{aWaZrFkV2iyN=,g8@C4 VUlÌL"@Vp(Z,V$)2Av ཐlgKx-bbM89kЊK1Y+(@CmOMJ6XUԔ痾@M~u#BdM2ZN8^Z>PDu9&VW͚UYz Ί!.7K`$$  J2ݔEIUElT2yGP+Ԋ}aKT Uy@W"}uwǯ RS:HO 7Tݓ#I|-a lVdDm?avcLOm%&~ ĥyA(^*4\KR}>37+w&C.ySw %FLAzW"^ua d M;dL}c wmT>4`f _^6ۙB&"otcAz3nM7Qh2{3 6TQm.A4 ܬ,чMV ?3aJOrˠupLIi<0ry0m* `SQ Ppz MKl/Ys˦,b4i_ԥ !/+`Ԧ ߺ:Hz59 Mr fH-!4#6qqc*ٝTX{(B͕y+el=l6D_"Ĩ/7فS{Ofz-g8MI+~ܨIŷsBX=ջUF) d~"d@nD.  MZYTkyO7'`t&@\uUGF`B:%rsaM3X.v1 4 7c29p J0#MitlU>qcZ ɵ1EO2D8)hoa`A!Up<[jމ8n7B"͔&": Ml3 wPrҬo))q&482NKmX.ʁAHꪒ0qDm#7qU=3#ЮޝMLbIdP3$&sFޚ Lf[}8v_z*A/2Y#$!;qz*!qgi3& iJ23X@;k[r ]C}Y_F)|9|`(cf-^aOMߜxdIlG$t;C΂M-PB;|G*#mP[R4xetxO43zJQO{yI娨 ?x +f$$a+ Ԋ<ӆUN6o1\O1ͺׄO D a߁^gֹ<ιuáE5ՖC5;[FS+Af ƒ{a=#D3H9~2C}~'0ZIU"+-lPlwKQhokYv4h"{O".w&g--?P4,?X:<U~N*ޏFd6f_ZcCMĪʖ]W$kPi`TUwyw"nβ_#,i=Ia.$j=ږ$9G!+HU=pvX2;pq.39t^R`8r9pPt _IPK)u0yᮃҲp;1-.(LrdȔ//mbîN=Fȥ-Qiy0Eahv17,)jׁIFض=}n5/RQ˄wre8C.Ceea2>["҂-x_K^#*vXO>I\ $xxT6cB'y[r|`>9jg=Ge[{j, ,%걈6\/Jq~4O\(v/ ']van ^x4w旋m/k$׺F*Q?JM-X2(f3 /&Yrɽըd2ۅE~d"y7:!ys31&0bx#YnܒKFg1M؅~-oc`5y^n=5ߣ!k { "Ϭ^lTVj'g> |J~/ 7rp';ٙY5}{'[;ڍw4DQYeK%EeX05p ^/ 7-x˸_"̈IX#t/;#Ai&qj X^j5#TxMSy$4ô# c=c@_)eXE+ -,wk*ł/@utO뀗$),zOʋXzo@n\5d黶/ܗUW`#E9d}T᫣-  3 ]ӌ1xZ:RSK.B۬c]p68 YaY=Cke V#dOѺP{ O 1SǤO4ʀ8LiO]9ɆENS:VP-f{d5:nIdRK&4i700HG'Q^4 A>]!, PSpb![{m6u1Ɍe,/ 03η$i*1l~O.'ƪ $B"PN1@=Z7PL8>l{ 1.:nU\F`^H:^UC0Zga6ڼD4oTx0hґPߴT#xEzA;MmMyG) tMY_ugC}cfnɾ{m#vu7S51)D 4N㮎8$hqkh"H:$6qV/cC_BwB4u0)rpR* VA t_D(cEYOLXiA:u㢾 c%(Lo?D}::*?і4'4[sH!LZPnnkQv @[:`}_>D,?gs)ӰtY3~9bGSP,;CK~i+2E{[ ̺\VxQ Y YW, 2V5V#tv!wEf%*?b.zW5`ֶa%j8Nz&GP` `AM&Q턹`Hq_Y v#2m1Q.nnz81ԥNC9#iA5s /AfH \3I8Vad1똰xGNjmPW vq@QJ>]ChiŐ,SuuKVEbwRMUEj 8H& `]= '9h\ByYT`hT(5"xLCQV'ěE].mub)Rc` u Y:~08;sb6aXsVcF9~Bift&3FG 2|ոiJWF+vbsrL2eS/3L aY&_DQkewD(gTA녆[Q^XhsL=ȎYw,}տ_u:H'z^hOMSJew,Er-l+BEµ ޱEh*,hF}"wpY$ F|I1>N:/ CaEЕXv"/ݏ8.U*/~zU;ΑW?lIVԎ(ocNv3eŦ/ VE"R_ie _9I/rCslh-No/+>d/T#7߫hm_. @ۗihDߖ'+jP3T}jTKS9,XQbdwuA X%mTx{T`%tN<*Osܠbb'p'RvӮS#;U<ФH_mCZX~Oj?e$],wMxhzc6yk+4lٽЖL&'[`c˻ esVA!OPNO9U18L)pFEλ6CFƸKn Rx1d ?Igб";V+@@N?p j ȞiUEsw_ YiZJPM@nNϨve=)Jqb:}`UY 7hd(*nٽ6S,v_8$0C2Z5o)8Jl Ҏ]lI̓4}xs>)!|ퟁQ0x1l-E!Ղ;{ϗ<=g9(BQ)}\O:5\a3,ӀN*f`0~*;yֲ9;jm}" kA7x{c9&'LvTyqnx :@/ {^aA@ Znu2u53+AȮHBJNzPqpC ̗&¸oI{i"tN^BFcI^ңF7}}YAYWmmր{~Yh|?`֏]>v/:.f\ ODݕ"8(u.T]!x/27dJ[;%|K!/FXq vYsJRMO_z& eL%>ՅjCZ _L?DkhPzeӯzcl#aAhcKF KHԖ;VΨ$9rkkd"==ZyuE Ѣn^^.헾c%?t `7lbcve1ѢY 7̄690˶/6hHHr.^|q|?.hH5TJ*X( wJ]#NLH]7y&iuX9L=<>iDrkVfrj1š.22#EVsɉg7Hx$I>& iL'bӎ;N <^,U'L\k\#sSpE ) t-w L1=t;jʉbhUgv驵i}Řk4y_AKn-ʽEhlz?,DX9bd1mͼD)!]KE .ltQ,77Ap)i8gTa#NU4pQ}R2t0ax"pLX\VŪ*+2ɂ! iÒQjo`dѴ^[ ̣0l7*@ᦁT+lkVrXҹc1ҥo*GF`<ܖlbc2/7UDܑO*IXN*l=ٱ/W[MdЅD__S[*Vh}GYX2|*jkd EJO:Z,Z tkáUrK?FjLGff]ub ~nVX~OYm?b_>mCK 7t^JVJ.!WL=Z 杌oczG'ZL 휖6zڵfKO`0J+]M\ͦR'mr#US0"ڎi+j)r玌OkVOO'+5i~o|!6StRl2&cxn5phI,5TsuLx!s^//kifVS1|bC٬Ei]pD[ž<MiknЅ+Y֡m6ZE>4V,0 ?zW5Q[XZijQ|3j(} C9ml6U kǨ`q\M1#^.#`d}YlaYݸ4 `†lJ1&M9+l@Uyg r] H}V}~B=V$i46B/HK\7y&&Nբ7\-VlaӶh81% 3$Q4(J6Uz?S=lkKr_lzs} 0rW_c^ԙ2IՑ@(0U _į1)RFK( .ҁ߱ r'̿43lhmvQ-"EPxdkEUti- ǗE)fTPTW/Lyp+vvA5Y)}𻚢Nj_6j76^1R"A"F[9̀Hܻ5"E7>1k"Vw)iN鮫L&Ȗ6<z4A Awlw߰}ֲ+YiS7T-Xg/v&}y1+x_ԣK+Ń}u[dP,SSVձ|Z&mIm[-Qw*B*Xr`;FX&MZDw=N/tE4llyY[w{lX8m-vmf:Ut ̐;y"CC69mBxANE+|.-:ZB:W$pg )ro2oe/mP=V~M \~/逡6r1cI.tMŃ)xg]d0[+L0MXT&$3Yu4Zt]MTpY^JW+Z NerF ">:1[B/4 +Q7ᢳ "U)={Kr^8(SDXda_DYݮRNGE5|FZ2#zAՑyOCwpq*crԋz(_OtO Y-eOD Vp׶ erke@2܃T[E/M~G-E5W3Ҟ˂~KW"^/B@sفFWM!?("4we8}Sh$VZ % Ƭ~SŐLG#o׷Znr%amH9ThjhC,ۊ6軥'FKyհJc]পTM 2ߓu( ,s*Q$ = Hw\9l+h*%ai ɐIfI'9NiB v 4C$y"K6s[kt(+S# b/-T5z"a]X|GO~LHYw9"%apv{z +<@p< +-\(z o(JӮPw=,62, ߺi&[71,5|LikW0g?kzNQ5lcBA0j+Cm>dz#N m{+Blx!Fn%:nypWKQWEXztS۾6F6Qգ zM)H]>~s~6iPu+XD*zuV&͗ba^K$¾ZHbEǞz&A[ "hk7l? VR:ا˲#"ہQ~ mN]ȯQ뙭bnC Һ&b%dm`QPFXq6Ւbk DfbifkՆd E5jq HUd) @֗ZN(BWuCi#n$S#c ߰:*[P8@1rٱDԘѪHclu hFsmڋ6]?wj!@6]5YF|5퀏G@;6lȻ0! nʋ3U tt(fJ|y˰M NӍ hPдm^C@V-s;'+$|M X:8e+e[n7M",i}o09%9UmbmpW[2eY#Iw7H.bTyB'Ö8](M'7;=o]ÿF"$u]Sjm_&/tK@iJxI_r|rLv5sfap1'(r֞2S0dڡ M;~/)DŽyHWl=9q\T.37e*>2{M2ڼiݯ%ȠxF+ 5nFkiߢX0z Ory͐kY<[P%MUH-fc٭y ^s#6Mh`OPGF,a={} LGp<r8-+.E`cD6 0Jk6_R=wxD9ڮ,j}'B `Zp~.-P |Jaw^zB^p$$ O\O6"q (sٽVķꖼo#R^R E=JmmѨ~LQWSU+KD4Z8E@50[Q#s aPdEee?aKUL6/t1eЧYuu\QLi(fP[gr#0vz1}َ([;ܲ6;IƖwry{Hw<;~sx%)(|a  &A`{a"%LpYm@U,֗,Po3-6Gc8>@mG- aGf6{O,Uua:pQF7Dہ9puWգ}l Sң o#]kkpF NE3ɄFu2jN+AIǀ50-EA%Awֆ읿Y;9f5Vo\?12b~1y`<RS)u_K 0݀ eeVeC%C=w=hztpz:=V[ Ezvn@2+><y`%<)G _ ܘ֞[/wٹ=p*z"Kwdnnc;%Z꩔g7鼑wOӰ 6MC7?":̓ߚ5_pGXy; Byw7y=oCEײCß0&>W[ϡDG؈(4VΛM6}=[w3oXxGBl^3ϣ+pߡo%b`;9 P7LJ*ڥ89,g82VMPl Yw7pUO(vcރ4("^ŀLAVf 3Pm9bƉ,UQCb2-N aӗ)˛3|kYvKIlk2v5`pbE3~=CXJ4A֒ ( Y+>RG\OULϭUY eNPy ;OX<)yuNj2d #~$eψwb}2O'O."Þ8hKIN ؒ{477k!N}$k qe@^$1 -Uώ:T{֘ |BXV($Y@8faD}BRiбSuT*9}2SKBV BC.7QF 9DS80/ _9rۯM'"Q7/"{y#rkKCn-1L)[/ Q !sG8"xyٖw7S6!,H^ |XfǤ5. ZZ7؁w&ɾ4˲KF F&#H]O\!Ƀ cRF"Ǖ2 e>}Hptʊ7 OlmWv:e⍁h1V"w `ay/aҭ(Bn%)B/+V|ܡh5ht|Puu\@MF-eGhP̕Aïa6 ?rűIlM6om^,n~U+JwSt~9U, 8S ╈GMߑԝ uvy %Eyʔ;Ԏa(r~wf5GÀ[[nÎaa22-JrqhA7d7E(a_dUM;23^ 5wd #Ͳ0x:\l3`re{h^l;o 0Qv\qn@1|$7 ֶ033Qs-dG &g3⳰HjW8$Ci^v5Ib,,cvQ>aYg EMelRwZ5S!Vo}AD4|vyk?m\vnTU}o*}(&$a%Jh+Oٳ)eOMiFǖ/W24dh>yVӄR Z %Ģ)HIt3dc7JާObO0؟p{D͑":Mg->?)NE  ݟ폧'Ο7/LJU\66R5 Aŷ:C״ ֏ /P O;w`xȬpUcxfah?+R,|DB3f R򦌥F8vhxB6VfK֒ P(ú) >c=X;3]'Go0g4paԗM{?@:벂dr9^' yM0ȫџ8$*S]Eΐ0BOq<%VI/!5 $ SђH@%Ѻ5KRa4eMKvg}2uυKNRq>KvYZ2vK BfX",[ "*$\)fcqN"<6y;kl!`lDr=0KhU=v|62< ڨ^\E b>ctI >?Q./eз`f;'KL(<[1Glduz+T߽Rܲ%O,Ɖϐ}" ܽzܣv8+VQnai8` T4Vvy;/ed@)] 7kڪh\B<v VՀ3{#~f$aS.Ww-f' ])ApwK Qw0jw5\8}hІ; w5nޱ]SfhuwQcVTBBh[2$Iϸ|oתQ;2'򋝉[g2Vgȵmڦ i﷙*eZh G) F`$؈W7Ϩ|&yDl!F1 D(l.P68+80՜G9V&d[ orbƂ6(x L W o׫?0ffۖw> N#< >lSKb&l3 D5R_UG\`UqV0(QRLźi90@H>'~Zyo#)`%WoBt=QgXhiG ><4 uik&@?3~y& caAԽ;0sGQ)E}xrpiȣZaE<'r1YQ,y?3K[PrCh٪K!%>c 'XA/J|qOI0.Nچ{(!X&~SnOv}>/K,^.W咅 qzq%U`o|R2V? Lg/8{XjEOK|q}zc8,4E2K`4i&poM`8=iF9!OyqkKˍh}[*[=]ggKkp@k^F~t@W2seCCB"9ˆ ) bhhNІ. 3%YQo Hp[?z 9f_wt ݿEs"wTU4.<3)0K}æBr.I MynlSa#"vȭd͜dBeBUZ0O50 UڴShgTz'"DaE}1u2"W E"TBJ1>q`cecynt\XSA_'whI{LkK,is;qK'Wv,:{.m_SnihFmWkVpNi3!KzD2qQ1Aۗ3ǡh!tUP}Cc3AtJ7,Y| S oC3;CfXu\ }:zJh,NVkmS=+a  Q Nc:;@# =s{rT{t[2 3F*=9]{g^1?ZӬ7U#[ba,D2_f, CHJXyB$phhf2fiK'?&Iί8dc,mtBL5{frPmX[R;`LNwE/5;.*Q=UP*k ;k-x`U/RɣK;2l{ې A osnq+U >sfDA 8_‘|v).kֽTe 5KPe{¥K桌Fĥ侖n =սqقqnnF~ݺa@~w[ZbgȽݑ>%˷-1;Y2{#]><IJ6 [pQr܉s:Ծ=SGvf'M:uc=R%;+pNn(Z=% UA,Q)XtTEۛ !S⪥ƒٝ|T\SG\Aa3B"L܇]e0TyȣTK]tTah_1*x 3v wc'm/ 45DR"Sr*-#`X›wzt)3P3ܥo-ިtwe?cX9!ݼvi8י~/0mвC~\7R@\ mI\P կuӇ8A3FM=##̛p,Et Օ6lEc_6 ]o;5MwOQm4–ēx/UExFvR]jO:pA%*XM㋿Q/#5^K  Un k^G ^QiͻfZZKyA[U#}" 3Ek+kzwfCe\[;ZjLO.J4Ki^= 5~_P/]'Q 1/֪Mn/yn2;eQ|jEȇ%2 `;UkAoK ^#]#! .Fw'0,U{֪<LhPW SxCs *GZ~FV׀~8$ u㝜,Q.ڶ!WIhn14=̑fJ8Ur`gvhb'pNbueBѶ^ eX6)eS:B2Bl3ML#@p|rMK&iO&AwfL9+o6%SFRc"K1Fw, UU 6Z~:a}.bqbkO 7ceܦ([4,lN#nՇ IQorCq Fs yt!ԶiSFg59r"?@6}sSnG Yxq#pxĄ#%"2pi#4F4$O(=SGaWbN єv7ߦZSP>,>E6EoGͅq5T/rޙ6in ;rٕmE‹k=5#<Vq6rm hF[v"|`*zc@̅ bmjAEXvԍQ6rsbhXMGcK}$XOŸmyZ#il奒@pg`2;["n9E`O:19-1!/Aq"a_! B7m{h[gFQr'7q oc8Ưs.{@z}e?b_=sțN7HO;>!U5p?1 uxع^X֠q Ba_cm͎HM%< ,+>92KuF׃߿yY}^]L (~9, tӰ .T6$aw+hsˠ'X3x>@_lFN/2}=WF~Z]pcWnm<`{݆8b#_ PMx+9ߣLDb>f R{ŕ`0Tͣ7z=y.KPXjv9!<{3Πx{WPPC~X ?v^"$4l.DA.;n͚5P05{.eZf}pPa>UDN 7.o Dy#MX [co d_}~`Lv4߯$>Z_ܳ#ݲz3tGR2?C?q~;}wsBF?_OS׀c(UQ( EBiױ0Ypv"OG I}˩CȿlO6mOM&(2=vh͆bc1#_Uxd䘆fY4!e ksAvkoukRʿ }cѰ9ݹpr>ƿh#~tA\}bOK+t%#W&@hK̠CŮ8ˆ1؄SWVv1.oq+#jR?s޺rFK{yDŽ9nV{0X>&'7A0d8ǴlSprQ5}/ѷ?^88MiD9(_P ^1Q!fqRRaE]; 13&gLOYNDtipPɽgncw mຜ=55"ESF]4 䚤dr9<9(S},QT PHR#yE2U+C`vauW.)NB\8x6ɘWcz/W?k^P@>reh f燍Q1 @{ ܟwSoq u?!E9"a ݫ2a ?Io=x$ R nSR5J hrD Ͳ{A-^'bn*i-/~Հ^71V^3tW-dk)-B{U[Q؂Gnd<'`00܃Vf89 X=CRx:jvPT`NteY#(z @3G'|t'_ ĉ19+jo~7 tRO toph;z%<#a{ZgX>Y!<; XЪNw~Oz3u4<{Ps73 Nl5=|sH!1OرhcQY +A5"W\UN#Wx[1=!4x#2x-!Ϩ218ZϘ9f_5`د]s| nTNjw x+ӈq'|ܱQ|[x`AmhщDnjGLv /xFrXQ0]GP <9ރq6VXX &|ug[ҀSCW=o}H oVo)y9}>d 's,o# +Ďl=I;߮:pPK5r8u܉T|g'nv  ^ j eP1'|℉^̀*(~vփ $u뼯mMGܧ4q0fqz84; $aT\!Ót?xe^KA?.36Ss&DyQz`))RPGmpOrw!/jT?^Z}$4xe?:r)Á}{mVB\hDX04 `*қ X:T+OUD,-$V)֩e1ŁYW>qdQNlm4EqhOjEtR.@+_ _qrnU''Jn.)Whɫ]%G5]u~]tHij R23PF NzIq9erB bUTF]MtZjr5Ui7x` I&(^bcTYS|9٠ 0iCg|Aacd2M;"vB!Uz jYf<_ `Q 4ۀ^Ȕk%74U?y | D9ɜk+e@9"CP cU ֐u`OJ<"ua1tQxl34c{hEgܺ_>GQnk޸Gjn@}v^ŮEn.Eqed=a6my,ضLx{4}ZX6F17|/ok/b>]No%FUݢJ@YUU N %*kFܒZY. k7&aG@J_jow͗jp-'^r~^;sWSx:p: zҐXL=) ?]Eh䏏:6PorZY~DLfx/ӂ)и;:u׃s>>bɩs<}x£i:Jxߧ}ΆٽkdT%wߠPCk*SPS0 2h0asD3X{mBrO!O3X8&B ^](;yy,"e-@xzG)ëT7s{4)u'zkŭ]]1yRA:FAMxOm GlczC1ƔRg_l}8#[7+5ZNP=. {QCvMtxE0ޏtMCW?G`t+_ <v]GƌO?~rpsbedbV}"9\qkôNx'tre{l-i {w0OK4ﵗM`-ӲLsƘRΛj|4hχ,ωv=]lV&7أjXwZUHxM^n= 2q.o{]/Qk^!+ Qj0ѮMy >sDw]fOBQ>%y[ӬUPp͂{O&= ?d?Pe"W_؈ k$?CFqka VMS=)r@# SL%xuR.@gCI2\/#K~A'vf  YO$D_/utSߜf(F?/IHxMfN_Cy:v[H=Hd2S3:kۂuCYȩy5(@uR?uxyVUKӳzf\jiNn70ilzXiؕ QuXY;9X8iAm^nK^d~PzvJOJƢn0JBJ$n!" ُJ{`N(K/ޑBr?fެ:bVz7}A5{r0gb2ˍ[z"FZhTFr~7#FzJ{=o*gܻc&H;^} j?%.\QȊu#c}7Z sn+wsϼSmVj+#8lV7qF&+{kc>B(r\P <:Gu3SK^O](?]Cqd~}ԺLz?=l"^ Ҽ}&.7QDh-n(%(C4 = CRlСA:|[#aNgRo~voƽZ6;r?[mز)~nlth̅(>XHvs-2龖nqK@3A=3j55)LhZ\rt֨yraJԆ4)_D;Hm"g `0W$T \E>i`w }'t{&,**C9g8۱|\l̬iszHmA1l w2űp L; 4xȞ炊<ڤt!CUTh={Te[6(h| ALk|a;*hv& ,j;&X›GUu\ۯfo0Ӱʻu 7%_.o9hb9 9b1 8!ƣ/V`Z}*7#v{"ٍ]L7jGT詮'm7{Jy ؁Hz$oin홂+C>ڦI=;$)4BEi/ƹDBiśilp !lږlI; C>pKOxfU-c̹$WŒߠHNgW93f ;u[́f܉3v΂Cb6u{p U” wCu 6Ir'$[`Ăɯ@ -pk;X9>0ȹ։K;-&DqjaZ`rs0zʝAJ'Dk0w.i"ʩ́̒|LvC|l݆X.S4p|!!!,1)fQܿ׳9Ck~C^{v1Y%#+5]!Eibo(ݠƘ9 ,8 &amixw`fa XdOuԠ)gw4=DB[,Zh0d6(2mFTh'#tg;3kDT b쌺~7;Yh$5h(IO+'ʝIٿQt?{h#00?ΆxUqdRoa9vlתy0qGO5"K,1WM8w zC&TEy`TmAyBh+%19/mZO~D^~˛E\%  'iX3Fy}B< 7PR.2cgmPl}_OL-evfeXUȴ:fgKYG.moa|Wo;Ђy)ty-cxD:HmeפlV1R۴'__UuG]FBr Œ>h3npĈ3.%'0[I#ͶѦl8yW o,Y6UeM,BRd X4ifk 8(To@u!rJ[M:q&_(m_\_2^2`}R3Y$岬_XD QmQG}R4JJW&skp<],ae'igbuFhZ RFNp 6Иbj z!`,c\iٍYg,[E>;EJ 5v{0]JT`d=RM+!rИG= 0i\kW7} cyʐ;:-F&OgKSM{2ǯŪT@؏_xA ;>,~ha/R\̲}ON>-ӿ2ZA~t9[/}#nN1rW h]\O那~5e,V ⸉ی'#11MC&$}po.BjGhSi2tLw)v _&o^!fxG:AW@D񗇎$)Sv c|@7oէ F܎ɑݷQ+7a 1[^˾#f?3 +3t5*Ckp Ņ[P}ˇ[j4I3 IXMMe$bc`@׀H517F/~`/#o~'G^d^\CvAieJg'r<~0NQi<ӢPfT΢we6a5h)lWT!t5 @Q^PD@`^1x=kL][%n&7z_*"q(6Oz8)?jN;j4:ʶzȆmZym~fjQ?Yyln?*Ǎ/O/⾹SA rG&l&oW )\qp2{2{,M"[^,kD~m*=A?D"ɷ@V24[-O:j<؋b:. 5@ff6ǭ ?4K#h 6FsqHI7`}͛! zꐿ#\P#_Ws\+_5\<{ tKy ɒzxQ(h$+~wB}L4R.Vf!3׋:]*%eMn]o#"+!Vprg y|5N_:_yX#9#U#Qkl1k[)Eh(d|\*Պ Xߨ.E-- ^atl4H> ASw *RE#_Gd2qkg J4P _@Fnʹ冤!IQg]0`sÕ[si?hEY4|b-<촺V_j8>{^HL.\-Q k#1A7;i}L'"^ k$ZyK!`ɖ@0659@|4M2cjjdP +<]I^{3T.J{wǪA1(6/`WpG lyzL+u9:`Bi`X,T45Kp ײ16 F}&Xʾjbx5fyh~'yL 7 g_"Xt*pq2/i0vvȎ뼫6G.hQ&Z>G6}*k _[~Gg|G_,PokxCvJP[Q?g!:0iG !G)4nR(|'E߉ؖV-.<(2_ 2,!uΎ?{# 3ydV71 KoRBvadGNaFΨb\7q$γ~@+b_c'DQiڂHBe@#F#ٕʯftD߰I5 :ȺPI;E=pF#7@A͊MxIp6bN =0,R@;rA&5@81‰9_;ѬWZUkiHkxpF<4Qxw"{vдQ< F^TXl;"Dm DP,k@,/vD)"ᇕoSHC,;r z; Y'Q+v%z;1DXtΉ`'zٺ_U_D1*CkdW1Vs7NF q zƭօ@ŰqDSQף*?rAЊ Vk0%f*ǨtL( @%eS/ Kv\.(ZJV|lc( ,c.X[G,U+K7$. k&a^Rq2ay,`;gStO5}^#i4C% DaL(wՖeҊPUPCNu|TCOWD8<¡QdT[bS"} `2%rdd6dP2Λ|&>p{vZ-qGN@)lRxyTUnV9k?T3RE*9\9\'P8\@%{<,mp>9mhfd(;NbgPHg(0Uf<&QHχn4p8|!("j& X#嘸$ . 6pBs\18pD&A#EF7Q)o+M5#il h$~P<$#^9΍J!@ ʄl.C{pp-ļzP* (v r34PT /XXI,U/g,W)rFff `uOӫě?nn@M9d^+)eH օHR[\E(  cVYo%"{ L8Em)>NauwC=-U؀Zv ߲<&ǩZ]2"b[]EexwPBR*oJ}5m$,&ą!UM_P*ȍckPRSNBb1|N ;c&ToV$Tc@x){* T) j ::bm^AГ#%׻ۯ/k8j+A9OAa K?=IDwRJvJ&29e3_EuCDzrZ?V(-b*sMNMλ~1jԷ9N?lօO54^;ɃǕ2J刑d`E@N}.5d#B c߬:Yp zSN.v yO FDujx$[ŮEɿOksF%5$N(}iԖU2܋W-Ŕy5]9g?0xb N y5]& Q"#cɍ=za~zbur Ѣ1l:b{ı HCƢXvVF=~l}5bivGɩH.R(6NcsTJR̺q6=_  xI2ex͉U׌O#2fѾVya}O3ٽL#Ԯ>Z&?7 7`'7TRfwރ_2?˓ )ozW|'76˿F6<& 7NSnN 8q2 325@* ɣ>FQWI=T)8hD0'];k- ,j*^i?7M +,/{:7byt iE_{*9:&Geiex痀i -˵"4KЂ`# 5}%C1} ̕K`tE_{aLhӌlۡt 8SUO5$y}yl>|ېYQis;/L"l)w7q@ 'ᭆtU#|Mbvw q(}3l ,o0N@:/[x#@ۄb#~Y;#vfau X6#=iȂ1Oq}!g1$Tse&HV@_~ Cad6N$̐JmB lYZHY.\D /ҡtX"$dS~cerC`%RMbE:*6sc_/˘ St_L(%Q[4noSЍ3wIw~e{ea׶,0wS<T(h75mѕ_35x6`5r̴ IJVmێeφO{1=B"e(xƹw-VvwB&s!죞R()4cLKVWq 6ܜDĚʌ0>1IY䆨FWJ6 5萨\CC7OJŗջ<וT_^lCOmEsB#A#^0Eq^VeFP| ٚR&"6pBۆ~$7ګ)=t evo& ekH̦>`'Ed`ЛCLۮ 囓-]@{6޾ڶ}*n(qqXY?58|ev^W9tGM?Z玝ؓ<4Oh:@ ׶AK>?vACZv<ؔ6W VXtXFgvuv$G R Z|v2C<9'ttTgT@:0ݵ1633|4V_#U.2^O$1Qx׏~yx?xΉAKXo/ŦCG ԐCy$|Q!Ua+۩n?68ӚMϾol0=A{VV@ ֫'QO-S60,.qСb#`"{c1@ɳuɗ)oDDC_R?DCяj5: \mˎiwK]'D ko mڎCY)gPF*ևe˖H[TFJ]~k=1MgjIYg`Ygm_.t8f%)3@f^oYefz3Y}\`Ҫ߅%co.} Swq#k:As78AwlccplO 5}+YY8Jb;;NZ.{PƬ3d@n cljΧ] /ov쒀X]`rXe<0S"7~W 6{'Te!6L2) qGWGwt4w߼?$C EVXI*<:V$?wMHO:Shb~yV& 51̡^ yBH_p]6eFሹO7Ye>=zm &Vvægng?);=2(()sG1]xhv`OM(K ٱ32CxdXkSG{/w,' Ty%gق|KC@*|p?q^x]?XŘvWms/? &0 xj"7LI>[|9OkWmbk-QM tНB<|"[GkO=G= cnWMT;_yec]ܪ&(wl˗;Gyb}@͑jSd`R@#6 } Y$=c %us !;`fhW }Ҋ>U0~bB6yҀE'H*+u5fs{R9dQ亝siڑyEF"Z3ur:@{ BfFvw*@p9}u{T{Ѳ5[2>%v,էT7,V->ZwyX?-L_z9>I<,r~xZf9_仅X;e3Ercbd5[y}oi9WULMn(OgWzL^qaxBnzgvXP!T[jlBO9ۼ#$ܡz _ĝʽsZqvEvWL}AAv8fqVG&Fqo@b[d̢3`a`N~w< TU}¬;=W%Pof'@뫸KV032gL\ʜ"!W ў;s,NfqД|N}Kkxأ=9aaܻ'$-T$GC>x89v /y ZKֆ)|{{T{803CDWqofO;,UZ j,z\~Y3''j*B7sfK!yp3;M?Z<~۔-r~{ oȖ+Q,Mv#0/j\ ?:;~_:R>* FuXta \8ơ]$B+$m6 ZSA,\νbjeCi A BPLѦ6I .15ϖ--)uf_zCrִ,r8l\M!.fqȼ S]8sьjOw87JGSS֏(ln5 ckzUm q>cL*q}.Ӻ^^&M1a75VvΩoqJ+۽7)[G^9@>W$Oaƕ9qv豋^j<+eWPKA;bM<,}G_WEwC4R3-KR"lbz-U>SEf [)- So]q(>eobil'S 尙*Ǧ?أ<\β/$91x8b#1#(Scb~2̀S}ggh׈XiDP<{=ZNe9,dtc-%07zgGOLƣ4̛s Ȯ' @{`v 5MG{.<,&(L{2!3HL&'gz`C_O*2/kh k+z|,e +!¿_Y`kZ] k#_|W`9e)Ϧ-|bOjTi7X ;b1ㅛ0Д?8Ҁ{}Y-eIL3Vry=iZ`TOȈOq~ : ﶴ)kI@UKe :%)nq6?Ӿ&F„1v,{lKƊȂ$ji;O={oEq[P5%~^U2ЊHGiVq2.Pg=[M-V-;KmfdwHm^Ivj̟HX#YFW1Gql%!=;>>bIû(R͇GSʎ@ <-/ Y'8֬KA# 34|zW.!@Bq?wfXaa:+~S94"j!l1oJOЌ.Ho 4dmNo}OG/l7t)Dx$YGzvȖt@k~gC@<< u\T-b짾0 Ža>iIMlVcK=HR>qoXSʰ>ֆll7Pa0w}#<ʹV6:f]ĭV͏o ԎNV$yfr>Sڧ&H`b5`tM87=j,RWbFiCmU.l_,H\t4 KnBY{!; Ѳth֑U5{O\ZdbH.n_}gϛxj-,aػs@7dQ]4h~^6UCR#lo3G~m= 4,\ܯh8wxԦsLl̈:d+&G6:0הao:ց.c׮۴ãz-:ux* GdVehDZܞI x<ֲ;UGtM5EhPIq\s4o\sYuê1lT[+ijL {T0 ė>,ֿn蜱Gk#>s;Oﺭ{hUի3f ¾=ZXDunaWq:9eR{cZ1N;5G IJ**}AF~YWLS3Ψ2ݦb~>d4rđ}3֑F\ڱq 4wz@ X2Gbn'ȷ$ H!9J#0}kv xqA=ca~aIV-OB6cłqHy ͏4u@8)lЭ8h|'AeE !ӅF[}9N%nP.;0qWqRS̨5 ^}9vV,Э#sߛhC&&햘…0*N e)ͳ>fZ?FԺ}WhGt~fY2ZvckzoZ}Atf?Vgu^lO".WMoAy58UH5Ge#/θQz{-3utvGw۽d]*Rq)gڍ`#H"jm:a>[UVc Mh~w%.F@e%zۭ)6hA|+ZZWF!*_*o3 x~﮽NY@?{^{5D3~+@ Ϋ)RCxLM˛tVeδ_r!4F[~}yX=qY?E~rшqr΂s6 9җڑF)%z 4I8Йø4Ψ < {1;"HS &5n6H9qNB0j`B0Q|d~`p8̣٭Gka$e5 *п)( ݒh&юu W"0M=:Pp b iƮ{ic~2s<'= >u^dgJ]i{t-rT;?s ]"O4yT6tmmfIh]%)꓇џaQfJY}6㧋.tCeb/d<)*S|'V9~?.NG F}gXe15t lYxS3.׽3!Ҳ\ߚ1 S5A2o Zv}[3X[^ ~.lƤӵY6!Z&/C=6zb81$AtLi^ rz X&쑰q*94M9n` F]MOt !6T1(E_f7AN(ԋy EB4=U ~ ]_wdqUOsi3J+l0Ɉu39=!eC;*jsrx;Av0@a-v(jGNy>k !k`0g^9)JCw|Ѿ1ȳiUXD7.N'eSVg0,Dӛ K`SU[t2B1(MՕ؝w/۳UJԢfx7D7$_Tf x_^(Wwz-J٢(7ImyύǧݒMeN Ni Q(v|98\Tܾ|^؋ [ sЂd꽘C{'LSkV),fa%qGʜcb%_.@_ 1Zʧ(epew&9ceZV+^viszAqjFCx5Ljow~|ߢ{V!2~nX[HoXB1@o1; i|߉4OÏiڎOc-ؠ>0Bw$_2; 06ZPmܹ>q M&pryЀ1"o0k#zC-Ob:G!uK+BFVMӟDjրĦ.#@ <鯠b"X1\Րݩ\ 9n-1!;jGL92`%FJ82\f0`#hVܪ B5)Z ,> +sGxiJi8-sQS2I3T 3F䰙y!{+#E?G-883#M`y9Y' ddU'J>q&bb~@s[zT{_aŲ@mpgVœsMqC&Ynh #ŵ~F(<5T~SW-:Iװ@mxIY,@UJcUŐjz ìd /ewrY5<;rRRX-3+4`a"s#*]>wvff2K 9V򰘜}ؠB#=Xξ DP03nW# +kq_#yjz?R~|#^n;G nB8ϭH.wbnI@>1 lzڀ~0;zCQ[#Zb4CIZn @U.AȕbLNoh1+T󋿑ؗu}W6n{EeGcÒ wFpĥ#^|br*_< .b`d#uS?\Ѓ*G@y0M:b HD e{|~)o爃Bw3_aD`yhϪ6M8@14dwYZ: n"ʛGC]wC;3|`=;rAIq ĤF<왜Xvm *1áQQjEmx8 n6;:ẘzYwnV?[=M74iO些nM{6=r=cƤEx@Y%Ô(F)ϪO'xGhujmW 58!\a#o(=ppM̭s֢Iiv療x(! 'ƨdr -ґ oUvz(C2x3{_<{6iecA j\-(uMmP#['N"`5ۺZZܲkRa򕖲Kr*>z6svu0R Z 煿1$RXx 7>2ݝgOn5z'w J~~׉"1!zCpr!r.s}0 di8VEԱldɑPPe;e=+ Џ9Σ2h.@*<2}UwrX uR Vd(<ఛ u'G(7ܤk%p 𔶸F b5lh 6nV(I/-猺u7čF3i{,sz0 b ;Ax6Je VBR% ݍ0A-dwg'ć|[{e=r_1TtY^J+: :~I_aQwTŎ)Y+b9<:eеnVIU /Tb,cPrR˹Yw/7,A:ALj`vTO}zK8 1<$Oat&MGe݌0hHN)I"8}9USYd@hDT:'\?w:nvyGjpONJlp'Hgչ Laaevթ-PZX +a qrK݁s"8y" =2)g6{[FR=>!x5 a1>3¾'`o1 <6k$V, l΃~-pn玊?z_#ʼny0le~o‡oQ )({oʾ8K1ȊjȏV0aL<ЃҒf:mʹЮ]:KG^"sxZsKXJU͉m0wWup] bV1Ut-8Bl pUFLid/3/(n#ut Q3Km)h4m4ȽЉnP 1xgen+\L$f+ț**RG.M<_6Ms Tg;IaI?L5J_[bd ?9 ȪeB˅Ӷ#!'7Ҵx4W}&vsF%/ ˞"_S.->'=y X 3ybmE91 ~Mb"^]cY:#?%b<AH9HU\#6hX7-yoU{XA̳L 2_[ɞ>E Lv۩}`)IUUppk7xzX]X*D)D"MxQݛJw%=*מ޶hK5襎/UJHZ#AAa>񁃃Vʦ,tyC0%{|wS ҿt@;Da>^䟾0ӦEvi@s@zWpj*&D.r2[X1hzJNe`YXL؜G8dg֩ jwrV4lhqh3$ @ A;0Cb[E䠶ed{@?Cdgպ+e @U0c:ēB0yܯK x,":0Zi qb'1G'd?˲ߍBFe%1Sr?N`:ݑ;뼁2p[Sdݱ@ϗ,K= 4:R:xT)QrMr] T݄LϗLpP Rgns8x-ăwzh]`[#F$wݸQ({ mxQ:jO܀1tYk߰+1-:[ߴwtK6ʓAE2N=u|hK-Sc| =GqCufʏ͸ߘFk{Rk)5q~8E<7 %F8\N6fIkA8ju GU7Rn'$vf vHv*${I鉩?^zA.;-HȬ-/ߋJԛ-5T"g d✻= iD⶞ 6Ƣ45I!BV}}IxN1[NfqR̘8'$'/U9%KҦ.sްT'}oh|Kf~gHv{-ݹjx:> .+yUݰjr1#;mۢbcKʦLϜ:_+;,|bƄ2O0 ,a!dd<=(I^oT%wRϦVingQ]0L?I pIU5hI e01wu^A5qhD̙:v;>at#fd t%p2kgM(c4hݐJ}6${BY@#AYO)vo%#hj pp l_`FMuG b}Otoy,#8J1tL؏-B,4K7s /w݀w/\iwAX5zKѓںyMԥ5O{Pr3gFTQ$Šd8j%^tۮ`=*߮a6Eқe@WMKg(wZ*\Wضߢq6#J5/!'-Ǵ§jA<E㷰w zB«c~@a096s.ܨw3(X'AdO DR#OOZq^զ %i3+/5/ ^)fYr(s+b/Ȣ?f a8Y[fp@-@XJ7LSb[aa{٦Ļm-cyͷYq\ ;{Wq <ё~C5nfwl$@3ri'ωb@oh.)mgq*P"dm(wChh@κcn,G)LBsFUX8?B@#wy;'|}FT4r,H¹ВfC, 1}'/7Z]\yY4fEYD,%S(AJ5c.MncײlvW#3ʷ7)@mۿkLN5Sv7cۆ䀹B}yLٹb{2oV98b\gXy y+;Տ9ÁAtOƇg5/P4do3E[=\pjǡouk>dsw54p[/HPD Ɯq5z4եBaU{azz}粋oS9@)jw* ##hp2]< vf#*Lg= ѱIlQk]\\N@^/e>%o|>po?/':=_ݞU䐦N 6Vs4μ{\UyI3.Vr 7s'"ǹ%[jTu=g=ׅª9^i@OkC+[k=CW։}xeɻfw={s^C Sղu:8/gkp~d%[`*ͿMj<]e>{ݻ= 0qx=SÜJyuQ{删=Lw? ͛HI{@jRΨew@9u1e /r9/\KalxIlӵ{ez Rg\le^ ;d2D.WL޿?#g/PWR-] (nXK%Cb\OWfY?uQ%7xߦMƝI}C<a9_{1tdב^1%=Ukw޴ A{Ptp)F߽{ްiaɟ^mV^ i: p8wwQ)pa/ڿ15{DGJW{ۄoQcoxJfinefz5~T,S6.6_|%u0m &nA6 (bq{N3 26dOnyOo.sxxZ{Av]ito٭-ba,{[Z(cq8ZϽq>`(r_]ٕA,x\~%W pAH2D`2}} A1 wMp])tyyO@jgw`f'G=x"v7_cȏ0g =lsxAysatJ-L /Cds?cfۉg`;vz*q G +5dZ=rE`U- B&OQ6Z(L=6Na~tI_\'\[:™oyqs*~%~ɷڎ%礩<|pr7J}.'UzuF;b{+&'wh׸k${}Tϓ@7A|7nS)TcyԳRuso%E/iJQkxʃ{| =zmxe6Y?1unH{S3tWhZ/۲S`ՔQ+KlG&ڏ(>^.ag b)p+d<[.-c߄{ ^pJ·Ӻpn@Zpkkͽ[iŇh%c1ޥz?bW.#2Ze߰YZ 1 :>Jn1n3^ %-Syzi̿έklYM9F7˻R .Y'__dZ:=>7{җWhE\ؖ2׏Տ;TW?9»ÿmfh19~Y WTa5aϰ3H(+1]=HOZa[}J[GeeKxv!b؅{ w:UyԷ%Ov`;Mn4g+Ǥ#yD9e(Co} oI;1_-apKҸ{c`<,KّL؈m FAÆ|ܫauB>l<&-5<:P7"Wጟ !S0#T~w}s'ci3y8 mĸՇܣxڔjYnF t[r9=3j| 'Mߕspjkp-RNR~1{775D>ԲnkEhY0|-Qe@MmfGmBAl{@G=Q8/MPn#w8/qsFtdS͠ǹa9f0LEqP8[uXcwx/q-b_$ݳw/նqtNPG_k^ϯ~ .NX^gM O+&ĺt㭀(BTq"7 [Pb/QtCbBe8Syާ[9ccoդ]1=DwfX o/߮y`N(}Եd|^HZz*(S.wGa}g\sNq8\M,m;scΙ)j==u̎25ٔZFy潞3Z2g:LgR>m7G\cļ.V~pdmvTFAx=*Hs@֬Gȣ<\~&yR?rFTݧ7:#ƑGA.$HΰutW ޟƜq JƗOF#dαS$>*ٛM U x= Wno}>`ҥJuຽ9e+!KCT1#r ʡ~X93}(_H/H H[cZs f]#p$>պ7lr[k׶iXfN$ȹ L*R[8)DbȹHCO> ZFS6&24ޭE ;` cnom=ECJ6_ڲuئh]&v%6o@m/VIF54lO=S2ĥX.8 "ߦiC{wbX3w&YE(nBso[u x0W*[ML,S9VrO5Yzx(ЈtLuW X+\D單C,n"Đ+sY,aR|ەxhb *>v/zp"-=&^ n[❫;@q l J= O>" MQ{Wɬ"Ok FiM: {[ ]Ʈvј=JNfUýfT>=v=RϾ- MbG@Wy=3cKȇ=q4sGC0' \Lsq2>ԟZ-Ra\QDK9jA-x(9 7 V.8ً!puOǷ pӜ|z=2 + F!o@SLorȻ~{XnXBSν*mw:3rKv*7"`_ Y_\v 8J} P#SE/ Ҫ,WX}PKqրVwz|Q%1ލœ-Ef$|t6}p+;F7w!%<5s:d,>b3#&x(⯲DB՞]i7R~sW؂Qh5`r: <2Y߫ݠ}VV3*ruxsNՑڽf p&DF֝/ts2GxKۡtz~ fGɁGU<՝ǔs5ZThNyV-9-P4 mu X6IH!Vasw $n0xY ٫Zwv.m>|yDxIq3-[S+ EˍڡUbsh VOn`P #e݂5]DW( K,6}ɩVlW1aYl$ ϔ|}eF,Tԝ/ @l:-UVjLN/0{Bw]j`ΰ=г!@K%nJ=;{vefCzî;oQ5{.?ccHӭgG s)ѝ Z$n:gSjDY@E癯i.;{o/>K`phxd@F pqXisPv0DߧnOnÁ.9шđ7)M?$խj*=ҍV . 3X0F%^~M"̉U郙?u؂:|2aJ5n6,u6 MZil}NL|A9, 2pI^f9^ylspݦqط tW\1s`L;؞ݞ<>u郙?WT߁,6Y7)ײ/ R~j=_ox\67{'8'=3P]Iz'؋gj˄CRPL{Y$*4)56OB4"v؉O 491c ]@ПO_=偪!l*wjL8H3$ kR&i؍V| 2V@/^pLvN$f9(Kp0;Z6 <,53WWT]6EX_Ԅ ݖvzKGc~/Th2vү#BiJ׳lp !4&Lk uߍC ۅ4p2M7 |K=70+{n4e#'K[*"+mY'ʢAQ RSkh5FjW/SUWпŧ:51 _e(26pg$zweےphwDF61i- ( 4U m1mQ4~@j6j72;&3Ʒ8o; l&OZ~b1}Wov'α }fwv0g1BI (TT:#yn{mCa1C X$ZdZlNU7ɶ^;a0sxIؐ3vfu1& >gjҗ@ɼ fBŕ"]vԿ*h.ţrHQ\ʅ--̕%}A;&DD;ꖎ:6>cV^|Qd %<6et/,S,r-KO עYHR&hoi#t8h+^?4&'6\郺vA띿̚o8߰=c&k&XCoVvoZ2VO5t껪#Gv6,Djʳ g<[e1[j3htT[4/5;kɂܰS7RJ渇`^T {;aKG㕷 fw g1Mf/A/w&㛿*[Mgрyྏo;[Nf̓ڴӍ ѻhN {cA9^P [RO0*}s)h^^Tl,eh6n$&IPv 䞜R،<)Un֚R&q8J0b6%<[Aٙ--'ey2 ^DkOք':y&?cL/{leF'{? udcvBo8"9D!%8a3]86]8iȞL S^Tn;"<7)̛*NM+<4JQ@Z0e e?bk"\"tQ"4D(u,~HX="*[i}?pJL.T #uw<4tʟM%#7ئF&U!V6/TZoݑA Ĝ.È®#vUwP=ΠpT_=kd(҉E +2?:uB-(~z@ 1dZjYFB*̷ibA&|}-v.e4tm_:}%ͅqs\69_.7B*BBXgS"bTVۉ9"2_<@a])sW>xc-^}cb_~MĖLμ1iXy2{Cw 6ms]ixxQxQGDFQx_ 2֞Ī>B0 x=w`9(L{]?=;' jtW߅bk#8_6Ids@\.壟;`8!06J +pw%y[fw@fmYYkT z,r oG΃N.ˌ ~LN,|Iu2Ҡocx{6NYR37۲,J6b*!Dr#@=#bgCv Y*V07Y8ˮ3^ ^-,狓b"|h/N?/cE,L5$P6]aw@tpưRvJ:|/Z&vs CН/zR42I <&_3?߻1_/ ~zV22 }ꖑIF9u߸RIz(̆ohPup!c=<_ZG嗙b 3ΏL7O~IB yZ(R|>DA ?oJC!Ӓl-* A1(u4yF|BQ.W.i? HK]5y~>,.[!.4.ϭYUebl(Fn)>2XJ r*o߳;nq5t`M<[؝'g+"hZ}Rb /mm NCH֤"6j81o{p6⏡_$F HȻ~!\+c]Nz:F{ǿװ3ة>k(*pq>hmǙPh vX֋t;pLdzKzI 9=9>$GfJsJ}mʂ/f d!<ݔd~˷Iߧ= c|:|g}K`{+:DR.`w_x\:PG?iHhkN߸BX*5Q##U2w4:;E"*v#(P5ټz ` 79 ::|-H&̕ab0\lIgj˖Wz-O|P[DWv! 1Z~ _z3ŖOiS9!tCU qnݹeށ=h*ua08V[[z[;,e;<*uRłeI_I` LN#Ɏ*cץ~ P FEؓ-ܢPbBGrz8:Ӏψri6?.f}Qoh ekZ״2Q x-^nw @x? `Kyeϴ"߫.U櫽iXI WLkA4h]15+vϞS`oLURndo\10"ߚ:B ^EAW$&22/pxe(3~ ]Nv# Nr Hɶ쟳 f^l$>8JzL?F[jlV׭3ZC3ƛ|Nb*FlMaӮ@0M]wQۨhT%КD])NC1okPķDQ ֤]Փ- ܡZM{RjLS47yjR6ZaMZFAE@?BUV~r< ߍ׫oЫx_ҷX;Z`3ӖElPsX$c:3nn@]292m&βmx˹˅ -a'ƻZ%lBuP{lsM|g#̄Of6xWŪIթ{YhPici"8K;p4Ǧ4X%! y/?e6%ZK[ed-oG5uթ߱p En=3FcWauPˢ*7qn(yKư?<@NC pޝKy ^-4As7u4S$aZ2$癫+_R5__݈}U0[ %j'Lyr*Jd"ȑIxpS`SG<|H^DJu}/I?2T{j r$lQ4xGx_zK"P88nE^WFc:&;yOK4eƂ2'YYo1OnH!XlgCiRcۆd4L-󕏄CQ)4mVJH0e"9޴+ YJZEDQ@vӀgiPi-$e/܎3r! ^LYDA$ Cm^&_i>~e2e[u [rˠ#-ŀ=U *y{e+&sq-8,ZDZ%riҰ4Ԋ5}ɭ;Z}O>h,TG4O%ײ|Oi}Ck6VOc$}ZњM,YYLShQy@eԀCMdbw[ 07 G&9_KՋJ^vynV U=#:RH{o eFsX͍w7~&zf*u4'lLag'kHc1c/aZi7n~GH7„t,aUn*)X0*܃_Ro"liVLBz-G6DZv+,TM>}(^g3P)lcwR։!dM(s7xtXP!Z3(]ߊ Y0!Ўq$?1P(=A'\W靄XOm P+cs#Ugȃuᑗ`xaz܆)=4;SZ>z+5I8zӰcE"_WoԀ#OX9Pfn 'Z)GQF6tƆcTҙ*iLI Q3U@pt$x(ExFXh0r|[FfU hz!5VF+u8' FHځ; [RP^aR2"Yvo'5L7j^F' &~v5I 0ZÊcH NK~Lyǔ(HH߰7- K=6WzrR Fi0`֏ӈӏJmȍ>'>AXkكz~(r3*5 CLt'->^CWd+.B+txFEF !/š9KUBA P-\^}}D/3y/z4iq')y_F^_5W//#H "9w61v׭t0cp0(8o]Fujb'*uyR06fdGH"]pXE 쪐Onm?UU  We'klV´r@h; &֛lk}Hқeҳ+0=0?٧[#cϺ>u/W@.fzf~\ɞkl<\Bкz׏}ωX(wD'E 8x|+MV?~A8D}zuv%m?'_W,}Hrb5o_Okzfo1uk~d-*h;Se1yۥD_VR}.V^ųz8 ;Tq|nMSdN7`4{A2Ϩ§V{wS>87+hr#oKsdvV*~zy8Äo5 d<,quk^ϣ(oU:z,a\iPL[mITSDD9F=Ql-aP;߈6o\pBuH,~+`? pΰ %>1m )'vq!ぱ@x:G J#1,MjsIعNeN`Vh(w^.lGv&I=<';}~%Bsu.}V '^n3@Ǚ͛B ; ~sַ 5<{#sPݾcEJL`P28ȝ5qfj;k5d3 3[p RyL3Z]XrV*'K"+[(Qq!aVs DbCL 8dh] ~C^ifPD*u"b= ML2ӻN\Iv"a'F7|]~4&(qŠ2^ !d Re o;6<t58Eр2BKѣHa@QBޟ{+?_wXRD ~ Սg;¿it*<t_V_q]iN/]f&{Zim|ZE a?v xm/Ks~b3/lqy:;)&{`j_'n#&M$eڦ"~0w)t GA _  J~~v5Aڱ$Pk/okQ a+0EFW6vuƍH%m_wZ$.yhH>p֡oF=`)G ##c /9"8^e])U|Ǩo1^?TsrbY_H27,"ƚxS  *%fU5CGG'>HnN;_l˪?Ȭxc.Jh?!c3 /<F|"&?'Y~`?e,m9Za #QQ%u ތ7r, 5)ٿ T`,wdz`q i{񗉐t6AL77_._׮#ͽˤcf69eD<3D=3_ W4/FC_T{P$QeBJD\V#<)6#8~p Th(UwS:at/Hk4:FzW/rgy k+6a툙^~Uj@!F@zwPȊ]_"_"@}kѼQq6S1;n0/<W,iȘ,WVQ .z{5kڎ B^ecИ.PL#r^,\M/a\N X%=a!L2WiO/W0GK:hO⯒2UA*ihX[|~/Ċ.C2fbא. ,8˛n&.!^g,}H+tM B6'2kHJ,81a#k_QJm^\"=.ז_#' ƨ{@1`.|T֝A5-pG. vU0gV2ydW9NMG\p&e)àm?./\j((}Z|9meVDu~SHY'h~&}kPKIK/@oWnF@V63'OY$ZvUP,2)ph7.k!C~pq1T []@F uEPo54׬8; q޽lmhkUs~pH 52{8/"hzlVO{FWtKO6Z97ψWh'h7&gt 3$~RW[hVϛ:/u6HOO˙6 \1_L$V֭azPo@6WVg3='?z\ V!LX' "yՈ~LJ<.ZeLrǩ;OC#q m;N| zLܚ=  q+y{m$};G3UӻS2j_( 'c-Ѯam:Y< =:1Z+`}ûdrѡ4L(&`﹮$;{ĉn#Zm6~m'dIz_Y Dyrv<<{y0#9&H?$)2{<67I~ªyQ%H:WHdVCxe:B,>U1; fz 6}u#wKc\8?6F7[hs4RbO+|" 6 xÓW":Hheb[^B*+p_:ʬLߎQ=@{[)BzfߥSe<- ,=F D6P7MH6m+m۴MSg Rޖajv&a}e͚3֘ڑ崂TrO_އ6}h=$,SwjmoGm:C%#=cu0p#vm + 3:1CnZm\0:O+"Qak7?@:6 u6x@y]܇gJOI[ިvF 7 74|gҋ ?mƷl&l&3Ui~ad?ph2]yƇ'-πZ4yޯᕱQ-=e' eZkӯ*,5FB)-7jwǪ$4zkOb=v6g9xYzOcy1ě!`{$7IပZ v!*lY|175 R0+ϷwځLCiUCCs'2Gyhlڀ6ܦ,}QVx/XD?z9;RfZ^"bspZm[;Nϗ` |!|CD̺#y&@-"mSAgSOSws=GGgK 9 |¢[_oߴotuI L~صY ˘,Nfnn֖q8#I6eLR3_SfkEEmȊ_}D\-М,lkMаX=qà7X0*X'za;_4<5((cE'S P9?9 ufYT-qgƀ6\P|ߨю'HIt}~KjLخ  32=SOMtSj$nA0 ' 7iPҢwD9̐jGqM !us~V[1#ԝPuCI! 'wN)$jL܂sA]< )mT o(MQXƵ嘝 k٬[2|t&R&X2LG;(/f::.20l׷Sj{&.}C~eaN|^v?t~p#]0;o/'U!\/C"o /ρ!ynlx0a.{ ٩]C]K6mAj|^DGڞ i?gz:! `e{bm|Luj~Fm @.VJHvAԝu΃K ip[YVnQtY MpZ/Sr@(lCu"(p- qW Qt 0}uq \F441L:?x݇ 4,phvv+\e$t.# h!YbK4Pj>ϸxj)E.Gc#43l@؃@ ?agH.b}Z,yVAΑfu(  M5!#Z*{g!Dzqr'n7,3vfp¿):VVaz[ui 1qlFëA/n.:0Z'hEWԤ;1\+ o73W'nhv튿uY:)p>Lv=m8V7Ugy2[ts˗aN\[f:ӭ~\`ǎm(-v? 32\n\s]`B-D3wBKn$p]\`шvs 'jL@gėZq9&Y+9fW;zN, 'PC0})d ` UIחEHF??xN5r O~pZ@ @n=y+(o?IkӃmZ\]#WftTF[uyp6K1Bg}v~0U 7UFeu%%YV6iΗ~L{i:W;Ixn>a|n:NQJ߹g&ځq ؿn`8ϑùK#Elaj5nuƚf#BSmJ@V6BT0Bow۽||m}LŶ?x/Ƙ˦ie f%lkSniǙ `9 Sĉxxv}A(6q43mt B})eWRr8la`c11.>ƶ^쬂ژ͏1 %Hd!'ЯsnEl Hdʶ0VpFG`0,h;2 }\¼ e ;|p75(˖Wdm65x(k-YE,Iؕ4b\?t\%"H8uĖ/DQ(1]@Yposx>j㶟9$q+ 67n] H[m1G~Ss9ξ?!C4`fBƙEn s5嫟zrϞFylg[Y4N!̱;}kW] |h"$K!3)0!<*< +X~ Qף|>i { OFڝe԰6] ]4dLavT!F8 Hxeÿ0 dd`Th8ȉL;^nӎ@cOYCdQE]B-08)s.Ft=-7} 2b<]a*+$j.6(Eg@u_v}2Q3!'a dw c҈X0!EKQkG3 3 ]ߕ89Qy,xҐWœ,=)5d&:AJ!M5z\, \*W.N1N6z0ǂN଼6 TwW$6X-u,S D,L H 3im̚Gw?s[iEM bȹ2R1 wSO%/"_m n\:MJ{女@ʲ0Aߠ Rt1=Ƭ'y8m)6!4?,^ Eoo:b/Zuc a,}ǥw\JC#r ]̀+cDG>mR rë48{/{HDW?k.3154\4p< g&"v۬(֝ݷ~iq, 'r9L]9 d)#~כaCia = \m![6 ߋùnK6,g\($ 3nwv4q/ſ.q#m$7FҨ$}O仸bm*N\j* +3'(~`_G3 h/w2 iYfKP!ľ n ;} of薠B>ݿx ȥv uBEFRY1uհ),^vTH'ils[ϐFxHKٍ!, w3yS7yIn]yrbꦞ)aRN+^H9Oeډeb %AD 90n EaH)Œ^F0)"&N{`=$N4`>xKPߏ fԤmlJMOlXmʸn}z,1FӨdn8\T ^FKOkHjbP_!|XZUհB̮Dm,E%y;d.vWH)@s Y0NLum|>%VLH84r_r:Ɔr]6m*xҥ M Oq]\x15@[S՗Y}\1-Z%02Mrđ?VM rWRd+LS42Do`l C$*5jG?l'Mbw7̓ m柘UJֳ#I$F /mT0fb$k"_5c2>/lCz^fMSݨ[\zs] 7v %Koc.wE㒉~I6g&*cΛ6JgMUCn1=mX/|se7L»hql6k-Y]2|&cX.4-Lq &ׇG_>;>_i'~7FsXH0Qo&6٣No*W*#0w%i+aF<1 ܯ=쎊+܃Tb8,zY pf.1jǰI>hK t}h3x `t+IS/w.h 4X0rt˘"{o"v?iQ4 8%<"O>!L>+qa8x}e:ˤvI6-iı~,) 5]/@E2 FZҍn5_tkæ u1 LY 2 rc_sq7>nr׀ec{\pԞ-~Կ'+c\٢~m/:߃2X϶Wrf.I lM* Ձ5y2uqXL.}@4~ު"S`(Kͤa>mLxH1$7_`o{T577p=nfx$ #QrKg=ܐlL!Lc{snn.l|GnFnز<8\ U(iȌ{;aF%jZ?v7?-{Tߨcuϰ+k=܃ X I~cLG9 h">mmC1:֢O2CC={Eۻ)PZ4yNxuޞr?a.,G;Nn[v+Vȳidkc`P__$wF&%ZOXEm~ @ӗ>5|.Smll aGL^(W,Qo/vcytTcLddA>F 3 0b{PX]k |[ρ6$E?ڈ=8w9*O3y͙^%܉'ef$K32`tCa-m9LAΰj70E#(XsLwVc^\p6Xv'5O/AiHj\ٻ}I_ v9g/1୽=) itN[e9s 2@qpLRݛ"kY! +jγrg0p6r+u6iKp=aåM졮 hqʕAϻ*/hxI?c xz1?38Fu˓Zgs(a:T&#o:Nct9{k,YJG_%J{{^ĸFP0\]]NjTyLyEl\[O!#"|>8ݯNn}A77Uc(eޝ;85l٧x$pAk~tgJٟez( iV eU׌w{9|0c֏| JMv}>)*Ccؑ^eJoe*R>%ge"~qrǟ8{z @s֐_2G G~nzyOx{|*sk+~I`ʧ`@tCߡ^in]:2߸5!yޏSgm&AMr0o{7W<<t&{LsF,ŐCJ{cz*Xikr [!-N|`_{"5KgRIwTکXj75^>l3:*##0/W3~>rCClWWkEn =Wg]~A9lBt,}l׀UًW샨)}䅒wgӆ~01)X.={:U+-=l+sG|:x2& e!$]f̽MUEzut0;PfPwt[sVvWX6% .p5C)}VE.\{LxHMHq, NmiS%vprx zam~x5Ȗ6/G,z]"/?Y̱T V5=(G3c',n e<˯g|hM Hcɹ(tȍX]κhr2{R!h檹QwJH7GMBsA /f;F1vmw+H7xNKG=LD!K mM)=R8ucx)<ެ3o|^‹a jAi h%BUG*N9:8eȝVgÞx}/86~pOuwO}e;8zd7:uy1\]yCGCveڔv0IdvcKߒʰƠ~钃KJ!0i΋F1)Q3qK;4(b놛)/L1:p%ODd F`l(Fķ;aBahjaEuH; 9|3&vWpiஎyrm +cٜĝB!DǞI洛큌rzӿ}ګHSPDغwW%@ߘg5(/=Jkݟ#"s4{ [Wm╖~L[Upg6ڒe(k #>ʳ-kyG47).L ey^|(ޥCw-`m GVoOkl }!jCA ^{g4b0m\jhn!;63,riȆ߽;(KK`5NQwGM{ޗsg * "g1f;~sXA )g9h\&d+0zoMXe\yБ"^:4Vگj+P/%EݛS0C˥!=iH|;rs/A~ $J#Ǔ n菖crB-mBAT62 # x Tbc,FF1~F@֦ ~5(d= b`<԰9  P}5bİ8LH&k jco.i;0#$,`` wY!6IR}99 =Dt]T ξ9\d3SҠo[ ɓ,'<2ZA{F<υ:2u]EɫGƧHKq:^kt&A]fy;F+$kgYyB|CȡRC#~!С ].s|򳦆?c{èKvfT 7ы@ŵ_Yei~#n Ta"% fهd%+VLʦd\J%H=R[d4₌a=O?LC;iyov|Քy7Jn S)+iN:ٮK@L,G0i' jaF욖Gr0O0" 5=epY<{#u=Hw`nʬ&VQ)n.GzАyjph<,h bB?^f 1\B!Uc|ޞJ("oOȸ}\Š!Z!u<;N&]'nGlz/J7fax#ݩYFk g1Y88])>CH9h4W1_);?oTaSM2`ScBPB0uGKG-/1u{皆~( 0w*HM]cqbDM\llϢ9r|F?㉮LV!f\8G(f~mx)=2})u$(6IN͒^6p_y>=3TЀR`"xpb(,R7]V݀\7)lÍue~=#&D6~2ۏ~̢hߨ>1-=T|B ^ GB@PݑbK=Rzaۅ`Pm6{ދpX?E3Srf»ePF}vS]e4StJ\ig@%](rǟ`q\S~zNpUՀ {RrQ؈8,ݦg§[1rJF8`^b)!7w ZY8KQpn'@g5<=n,{.nc!it՚ۆT1Ԉzg*a\k5Րrb`dq{),X)>;^.'C;(ѨLz#pO8[taWtnlEg~ PUqYpOqZv@g,su,#}6~ 6\Iʑ/:-myQ6I4mQOB4Fǡ~Aֵ4ʹ'^Batl Hh?<%eF0& 0$z~jyiYF=&gEV0@Ukઋ[.o*ޯ‹vh{@Ϛ^_/_nٿbv(X-dn~V Z@.Q810-L)@OK &`QԀ<;be@|2vڣ=zQ1΅F'c>(vo5jnUYѼAmwm}3saGFWgڣai1Zӆ8Ki4Ovpu66Ih vs'z0JTk< 3wTÆߤlZynFÛ|v50<&!6 xॠN_pH^pl!j*5P`Խs ӡ:]B<`Z6w1zU{4>ygU`^tݩ<7=7T [@pJ"}Gz z'Zs'_$?F)b9TDԫ]`E:QDGS*n@H*AR|':p+JFLHEǁWr\aD1*uʮZ@P0ΪZzo>6v|f%(~?{it ϊΕiuu3Zqg&>O\aEyA+(l`ݰ&a .*Nh =.m5Hw̛HLQ`ݒmx|r{: 0[$5h1Z&𹶮DD/~ %̴*p9B\ x- L!`^Y]iٱ3\a(1F kĞN7W cՒC(<;{[ FEHJu\R}SMxzEk*Bwn*}r}}>s5j2G*ZD;|/)j:5&p> jCP¥F*6gXUՋC WilOhKӖ &5e~S@hkˣjG9M|;g;uj?GثH%'>It"zs~2D7c% %WJ{cﭽt{6b1zBp~!ҍ(2 i* N`!` P`{C&6}2DS"a@I/C1Іj0.jAHm{vF=E9~{nRߘg7o~#vTq'EP/}Xl)lzh/#zV-M|d̞F)z`D)\U?5WRpqÍ ׺h.W"Ryxx0  F {mV:~ }hŃk4"O#Vkd?>fA-p*ϓ@01PEbV,U3) 2="G^A]jE0E]\{|`~ejw2͛)kbS.\iY;b#\c \bx5Xf> ?o^ቺUܛ7u@m `Լ-w?o3~qt6T'"7J \">[{R>E7#A^Ƀ2?WZN xlPk,[ZJJ4-U2ă?>#?UMd}D0kb9zl^Ε%ՉulIrV^Fm@Ցvy)?TKby-͖ vTyW&U}xAFu6k0mSS(`bYTg4ˏn5mb1HX76fʮ`m09ڥ{\@uMhqڑrHp&f2vzuh!0;(z8{C3 i={iWsM%gm,XDOHM@f ␺ݕ {/u`>h$Ýd|E8IFu*`B[!eslhHOߧԂawE[畄ɐfrh+'R9nOu4\M=]l n/Ey`f=mU,WX&]6fhwۖE굻/yֻm'UIN>8*)AhL|P2mi5΋?5C`76SG rNۣe=+juR|0}s#=`{|ć8VѾ|'wsCz?{tQ+>"GUqzz*n (Jciv. Y[4`<vj>T|)˱i00m}tחEKf.JaːX5eJyL#@6f5p6kҗ9e\M'kr",z,;k @Aٸ.Z3^hH3:9`5%(kB!2h!4m^uQ٢]!V-YNIn D$ڣS%9wu/lҸp>L!|^]4;HD[qxw*QR76c5Z| A烣#y0Иel*Y`$Y뾎 Eu#lؽgiA 7fumRB3Cib 9ø(8>G7T`1Fdgя{@.y&u:D2O="{ALݖ,AhC|רfy3tlP^D.o+2iȝA*W}cx^M1Ju|jEzc׺2st|h6mQ:9FmGZ귮`@+/߈Iqp=4G1|qHcbxaW m`l&t'hͣ]Nfgl zT<ٹicr'ճpٱ1+Q6[jA&\cbCͿGE%G쏧:߁}6-[VlJ/!qVF6>!er̍Uv `}7^E&JGqGh :)4&d,Ӊ`0=#YS} yo( zbKQvMe` ;`}0 Z:_pヲ3r0ymmh7o{9ibWbzzLKVeL P: ?}fȁ8ਖmDV>}[X^s\\Q:QD`~f>LqMi k%Z?@W"s?>zǑs? .,_vt.)Ru{4 K㣉}lA\8!9ˏA:~g\["[NAԡG Ek\Vg"mBBFxpՙ﵏Q| dV9Ωxg6өUa;ӳ3Y+:@wtϺu b"kb׿|ۇw%j Ht&'PR٤던I r^TRjvt|F8iiHc/PPRl6aɚ$m1!{ߌ/ZVBz8G0= U+ .Afkd3=G9vOsDb3]C`m.]x v'[ 6C+G|JxH{ ;:`;Kaq{feSpєFX0/,lC{8SyH:|s?\Fkoda6}+LW5X-|sze>9fo*I\6W*Z cp?r,uqezs9~{]yj#o`JG D UId @XXNeCa={%ccxIqFM-mۏޤ[drb[HkwHV&IaCo[zI%faݩ{ kgg]Fˁ/wCA ېC: 1 =60+~! *$<ڐ0vP<-:T1$ 0oygYMLBg4x yN w⮎C5vUbh4!Vwye;u(w޴wnymr0aZ=ޚ5gH )qpkz?יÓ!EVvĞ@z`Vʶswq3ðu(WM5K/%kZgh>&ܧfMc%(ՙ?L=X՗lrn"^Iv7 wV,CY12G^Hz/m!Vr䨟coeK]Y{tT*Of:ɸc1#[3.}f _V^{qW0B)Nk 4p0tld9ɬ,܇4MQL%;WÊwIgKr|-KH1@d6C);<<8*UjTAtnxq2ąC!co, hͷ[l,OKz+1)|d$\к/K;q?wy?Ƶ!M$J1Lh0_2V\-rF&?9#.ebۊ'`ھ<7*^::px$pB#/Y &|;qڇ2]kQP-!Y}Ś^i/ NXij4̢A5 @CJXDWJZb!7-DS)A^[%ž2\5(%ju:j'rs-|63l/5=zqlhG*|/E1IPyuqvj4+f5Qa 5TVi 4"a7:|~so|ON;dp~a'kjZF_WwlܦhqGxh޵IBonP[EȾp!<٩oa!]/. =dٹ{gGbǞuֲ5gwP2]NzX1wT+}'V$JN.F-)ZhrXT%1yέyR|1Qbz_|!o%ǐ{b6A/iT+v˻bqϊ_"!"A@: . Am\_j加A0_Kt>E9FV0(%lBW ={Y5b*wN*_eͦH-5&#Pe8tu kjdNdcǶA* - D#g E~*]ooT<:mD0)iQ矯z _8FdILQ({1,P>/d0s8XCΖ s.ۺlV\ M1o|)/!~a 0#p { bXKbPpgbb4'P +V"k~ =vR-ht+ őǎP{О$2ծ!ce" fBJ>D ìh Ixm͓AA혜(_0^3Ŭ|J;-]ܩt0 v=6)YBP[ض-$T2+ʉK !GxCJ( st/Wa2_tʳN*u %ѱHl1m]dR4 Evmw=R ×HF;ʓ"~z/-+= 4bRKq-B0 !ׇQ국K!CV] uA2yN4"DPHQl<7Rt'@JukO`@C^:ۘjPM>={*G}P*dp(NmpT2~`?SQOnffChL]I˝ܹ]bq&Tf t`pC1WR>a B1|pO H4QEmi>YBȹ\0G)^_ӿkŖ¤>ˬG}zku9y8Qʥ#UV͏]{Px/!Pvٶ`6%X'NrnˑP3oiL?H?tO. f<ۘ 2Z:y_5P 7}0=Cu%.F~3*1!v_{\na{W|F~#y,t#Xܬ&)Lq!A98?PIi2u_[=65ҿGK?5& Ṽ It0ص̾%ӍT!['yqFpw5Z467>#y^>QhK3~9+`996[;ݽⶶG̺(&ANu{jGKޛW=Z[a#tC5p^ҮJ4wh jElA(lawx 4 WÝF#vp ðw[!2`*p16[m-'oJcU&3WO2*P,K n25(BS vSs߸ؓ2Rs}evMS2^[Fm)38+L8'Y'? IX$"ʍ =33iJ6 AI֛QRG]Cc|UU){ ` :lƾux@GyP[GFSN8.+ڇ\ܖ84غZY}|uCQl|Hu4' )?E9eוv2>b a$%@{޾c0> Inj<=2-va~ _muDFq(i2wZ W=5̆333`w^m*3smuRǝg[RCY%9ncОŻ"DYFm'!!^sp&0/θs`Z︜pwʸ}nQP:&9WS.6UGT{<$M64x,ب%YÄ=Q%MKƠ*58{W.sD+";WM נm-%:5q^֢,8yiI87rÙܦ {3Vb(L<>o[:DfG9 \0f6L]T@a~MGr*&_mE6t%V}dTuզT_g_Vۯ1+u +:X5bQ9J(ٷ)h6o}6zXm&)UZ ܝhHu6W+0aǙXР%Bڹ}&TDZCm-0J*rëz&:mj{kj-K硼ÂOaL_ S%\Ynim/`/.O{#(Pm1s&XrzQj{z+㗍UޘV4o7{{ kpsl>.y/Ӽ-.CƛqӰKD7Om{_LJ%gl4WhdCyghmsvSyg"wcɴ*jEv2~s>c\ZTb}8 [뼸xLCM`KgNykVq4M_^fHz3QFXLxFWfLźыCnlG}PhWI Zgmn7`w6QnϸHJ⫦E&kd8{4鯣Xݲv ۛrfӟ4^ZG .uphsly=s00\ԥ ~{oNA=i oOn/l)FVUr`_ |zq͇Rb)/=`h"NoQj`| ƣN04jLUcTr1t̃/G$s8eAEC蒉'$/=y:n0E "ztV7Z3{9ȥ?w y=ߙ6ݻ nYtz=1AWxn~# $5oӝ :N?^?}PQX`:j޲9V(K޼?LTn#lJȖ# 0؊#xyt3s"9szšCcգc@{fNUBx 8dyX)ۦuƯLXϨ0Şo2,S[ՔGqT,Vr8_f&^= iv@!f<6vl_Kav5Ir+:'6D\H8dh>}vJMB]ӪYttkuwR'DmćtE5w[n~\@́bU)[S9d7ґ̝ӑoZ][:Ѷ)g Ut0]M`{m\|\>G֥FC$qsyvv#8 k `X(2y%TKl_n9n%:ӊO?{,Ẁls)2_NӅA_y~rcx7ʀx* -eM)] 5a Rw=Bpgf7ɠC0'TLwzxE|Кii5ߨ&[ߦwygS fBP1 m;X [M~!: @Ht[<|k8|s'#`_*ɮmrlrn8۝:Ar6Ul&nͺawtΪn2|~70`3GxeH0>3 s}$aFG~~Mx/!Cb{|9lP2&{Ɠ|$Y=|Wwa}J)vNo9*8yB7`ͺȲm M\{jϟ΃39t{wQ`Z`V":S?v 냔!Z>|X`yxp?sl's1AFsu׀`;ʤkaVa/?7ӏ'&E14N6!-۲(/{Z.~ y0*Ca&3=HkA{ W 1LƁ(ˬ<TI`S?5N7aytώo7$I@Л,MH'^Yu~p+Լ*S>,D\{ò 1Nj~֖TdUr=vA}^d][m*%6ˑ?i?߈:Wmӫ-QlQj*Ȥ:m8u}mx1!oD%p>Q2.1;kievûQ Ԙ|ck]SŪ-Cm2BMO3 qN٪#=0:33ؕ>/B.qDz^ƽ=c zkD(5&>Tr?XmRnaB?; Ikd[>ഢd/|r9l[4|U'筻} mS,;)ĸJ:뢊 aɷo }ߐHut˽ݲ&Q0ilP(mƜNNwv\nלZWӤ;_o/3 ^6945uT3ʋjD'K5 ylX (eU˰uF>wwvG;l+ކ*c]/؃$^>x5ިsUg:c4ro \iNLz B-YCuV0[>lYn4thҵO~۵"Q\e+ɮo/cze9u}S0#Z;;LUd=PzspCC64oP8$+ qmaj]%[EIq^OCl'l}^wR oh|V ̱-XGnO0kh lrq$9/W/sٓaf*=S2LW}%L]`ܿ(v+fľgy[@ ei-%6Ż=" ʛV48R< t|u\)sn-~0>Mn=j09@ny0C50uǗ#ߞ O3`. uxb8(.Xa|U1Cur LDxn LTy+$`5.ݡ:u^V%,Q{ړH?ގ0w>xEy߼>mLۮ1|;%s7UcT ~+0h37{._(WgM7]ss`֡RZjbJD~v>ܱ'ݯM! s58.v;[?Ooz"n\s3Gf}|,g'gw1:#IэW.=ᘔ}c%h Dz=qf?2o"Ҏ"kӧ M5sysH[B v>Nt޽vgO]ʵd) `F=N5=e|yh~ GBC4pKYd:׽D0Z'/;=&W&~Swƍ*s? p;&]RGE7 ꑨr!.Zj(šWk,{s͚F̧eSQ [Z+c9e}_SS swpŃ`|'KX3J}!8 \f!} ~uo;q8.-L寲%y 1,oaֱ88Cû_lѾ}[O>ߓ&RN Y&PǔQZ;>(EU2YG)Q0SƠ ;FW >C|6fӰNG?%iL<{7m.OUҨ2z$xgol&t*mDqpYzXMU"M8~j!6v9T~QٳaDCHh [ 9aR`bϹe88X`F5s3O+gn"eXxm^[ xH 86I3c<{d2;g ?zV>^o#噫Ln5#(6y.{R,}I֝==#$ݱ"W6e0pg _NgW5 TjA,9{s9#{,O3辂`c=0{f%v?^/7&b]e.Ybnz` s|F!Nۦ(Izǀs "S)x7D0+oz7mۯSċÎTO+5>1F>D\,/>u{zޑwi~X˫t gm[s=$7g" s~'zoQ-A*1b/l!k۬6߂ Y<"3<4nɵᑢ$^[[y7;ioѐQX̷.e f&mHQ&`cS&SS_`{QjBh{q_G>vcM.GuQ}#=u݁wV 7PӚA6JUC|PIbC^` .qphh獣h5h_لGdA.xC8귓v'sow{sdd߯vo3!uȐ2Xb>bY$b-?~gϞ,t?7pZ?p{+U=>{1E=]# =蟼 g˿ ]J85a0l7bqF# *980*)r_B|ĂY ˋЍz\^/pŽ|m1X-Ih<GX] /ss`G"L=yotlx5*qR_8/ۡ:;i?؉WuϺ郛ao#sԽ rM|l{ ^5s g v=[Tǚ>8VSP5+PW#9ͽ >jЫP ƿGnXOmq?1STo])Sg%4r0:Oi1)pa#?Ll 1;g8-y̼mc4!a$ݙB{[|Xn>hpL4LGL꿭&L«A>wy71 isxLYI4{=_cdeԽcNfÍqcdxDsqk7-wv?a8DϘÁfx vYss^g1xcl836{a؃??~y5|]c 2Pxk^Ђg,6nmn,p1mM>~3T3_-P74>5):u%66x|ǔhۧd{zPh49Y1D2eT9bܚbv'p8vǾ<yVq?0<ЃOS@k\ji "jRc{x8Z+v2t;Q5b}5faE]htkF=q_+<׀1Цhzm+4_*yMv=jԐ>Nﷄ޾P)Cf^v$A*mes*@q^`j t wH8'bfA"Rf]"АKhehBu&ԅ ;H**@':1qzO(}ͩQI{N ܊J3$g;nY6>}4C)@>C[7Ƹ`Zu *},f`"ҀA\Ją1mU=7Ap|iqjӳksNɚ[ XHVpedݱ=Tdƃew'5;bW8p<"w^>냭\Dh^,g ds~qÍ5Ф)!ȏ!*Ss|(.mgIhv;ZDi.dr^ {cqR'YܕGvL@$Q>~6o?_*+Qhѷ2F㖯d?`m7ڹv.0TޅS{d[m{QlL6mCn ֣s5 |dq<2DTEb44M982pf{ ]1Y(LQ!2p=pC]5Oahh BL0(C%ٽ8`KW47K;d̖Scޮ<ߍVK(.>VK"@|30:.C&\19A$8i$pr wQ3#xW> ?4l~ y\s{^5y7v[)V!)(M2|Ge#>R4wJ%3xN%G=1y=˟ t?B_9;ZYg{3SϢ} 7*y\Yܲ{/~ˡπ+Q n4o&ygG00=GwһIhH.>`vgIP8Va~Nh#}gtu݀?w<*Q>łAHqd!ifR(^k~DD t" za~V$6y=_pi#b cO {?YLnQ:Ѕ,J/k31#WzGMGmQԥȃ u+8m:g+Z(`>w=LW5{Ou7qys9D`0paݟ>3_<=Z٨Ϙ@2# PL>:e2!^ϒi2K u{7#;.> .V\8q[r}X_q>:k84Y= >>L.m[{62T)-1L3^u?}'Is]Ȇc\fR[E{ИEg!i3+(7?L[P> qPi6_>sv8x3?qG>1`p?b5`#Nr >Qr_ T#jI>hJ7}TVGcΏ" "Ͼ{kBt&n ?FU>f゜[?؈|| RĤpO{y-_}I+d3$_e>w ` t/_$/nn}gPg۰:*U׳/YjiPm./[wW;3pcѽxL,1<<q׊̰h$y ݯj&](O~z|v=SLsp{iP + .=Q2I-uG+Wڑ&%wLᬹ39?<S?A3zU#0ʎhm?Uj3۵|l~ggyݣ&rm#u`L\oy=7+AOc0R&ozs.=ot/7SAt?듯Q$6FA!udp %z| KQwu!ݠS*֖^ѕ  'ooc8`̜l+ѨL0j[MӢitt")YK[ nUugLY?,Ɂ듯gͤoʨ \6Lus.7"&ep 10tx:'Etse>>#sHE?4haǑkT kg)L.Fb̦SKrvޭ1-1<4%<쥵ڸ7N)2x[q'F5uc3q qALl HuD2Rx\lt 6pڸgZǔw_LZ즾iCJv G5 yoYf?%ޚ=+3 gWM7)iuСVo?vaųNL1ܽ" %u_ѩ:_OGmy%ܪ҃[ qx n3V-Ʃ2\\ a};k\b_b@l ҿN#)yT= SC˶OEƶ)֧rTrigZXAY]qc3Φ f̰s ۵`95.|+08vVCYy8jz@,WgE$p'u?ߡg # 17yJ&Bdj^MԜȆ_HL$># qn~?m̘H`^i^U-}ƭ}˕} Kyyj8r!OG=_F}J^_ A~2UI&^' qtMu̸5H}aV`F(c l_144vw@!h +3~֤CLKL$Lo_҇x?>"b Me\_^Kj39aG(#аޫq O3~.prQ͹)m!Q|gx1}zL(uL' Ћ41cS}uF.\-=cjo7mk7Lvr~ 2ޮEoOSI2 /{e:t;IÌzx|ᨃGA%5qCLd⮁CR銌~?.w3!_k2Jߧ8+=xuwm޵3S7X>䣱c>spM?nB/{n# v\?3*98 $F:UB6O.zsȴ=od{RȺ+!\\MzZSb _ϫxLLoc^(u\kGwGje6oL1> )D֚sE,ek^5}Z{}CЧA/OUA4}u.5GS"ˈxd{0aQ| 8֗u8y(ֶyRRӰu 4oZd\Ԥ{ę>bi{Q38x:w==4XӶ AFzk{(ɸ㣉n `wOy{o*FOߦ/r8'vሮ!޳m*SFz|GI|ລ)u/Ϗv7.[9#={1#?s psj5|֢|͜wK툉݅3㽉Lqs+XDrS?,q w pc:LWLU{%x w% En,{nsʟݕED\{^ #/ig|Xz<{Lz6,iv_##-u6=As="63 6Mݸ8A:q!5τ674zcm.m.*H7nϳϕBiB$=% .d\/GGG=oF@XhI8<ǭy&?vc99,!Tucd@q/jJP^)}]<>p<{ʠӃφLCXn+]mb6s?ghm>`MՊmJs&=Fo*|!lO`3? !aGV,=s5>.=4& ՌoKgz]3#;bӐcQ#=o@{ٙT@{}kvݴ[1dܬoSZh:v(^I+VcrF {pn)>kT׸+d1) V2 _N/^YT0T:VŅ{=p7`>(^zV gt/\cT;퍿\jbh5kOjccJ!MQQ6^8'_g[9wfuoعD|;<1#q磨N2=={sNg@ӹ>>cq\T^~ƞlq&γr?" +?+Sz}a$oGa:ޚB5ۼj`4[0QKq/qi?)7L%C-Hhno6{nM0`ĀbԘq*JM" =Bݴ@ hxQ +b\C< VgϠwZ5\SZrӉuO=<.oC@$kN^JQ)~ԕ h:\,zRbN/A&53RlDoAAÔs"e!ݫ2H@FNuS!%Y %owm"3wl;s#qրXRҺ(,e9 GrJV_j{eir*lq+ҺZ , Tlv@t6HHni 8`\UC9P.B -pzerWQ1SFwpl[/<*[x)DGx.2@ W#Oaw<$g<?7:1ttknI.?Ypy@wԥYx}a#U qPZ!ٸ7]1d=5[aޚ&:wfm! ^w6tృ!ʧ»6C(^"%H 㾱s ʀuw{WΨ #y^乴q)  -0&{[bl^kќ[[3El3aFHved/cfF#BoҳBs53]ɨ\SDyh3R^VVV=_WMzy<a+ுoG@n@fU8|MLτ 3-syYތK>e7~"s*:ʶ!7Yqץo5T^џ\4g⨠,Plou4EP_$^^XH gމԒ[ݾ2y|r? КR ԄV_娡!ndk4;K߂1Jr6Wӆ$0 wK cD~` Y eC7յ*ߞ9^v&ŠCπR&RGg;IԿGR ؽ[(fZ]#wN/Oު*PbnM5 *D2񊝢26a ȳ QK?i1 UEh sdwBűxY51ݸI>"N RT*=CePxÃb]#Cn˧òCY81l3j+Q/oJC `7$6ᬰQd߅_m^DD[-sN#`*o>Ϗ!H X5S 92z jQd.!ŌQMޡgQ =L-E7~@®L7ͅ~;S? mKj'`FMΕ[G  # noLcky]6˒hu㒪^P1m>KӮ1mh gSWx}LyК6p 3.Wgjpj!x0 -xbN)v¨ˢ`9kHG!#ON^#]qbд/6NT) U]+Kmb7<`1ivBcֵS_Qp {}\C&qNk$@[#ֹweSO.joSH/`6铫r\8ca kqOI6sU/1TL)?< θ.My`i?тȥlFbWO~Nc2yc|/ÿ/~D$̓7=/&c:0=p yֲzн(ad' )4#b˗_.'}'kڦ67ݏY0[EM} zi:J=uqʣ֙t* u{PjSg*arWZ6G=nGg{&clRp DŽDsOGdwO7{?hOywUܣ9L\I9Ɵ]=5C$ E[x/X?(TD|RV$` pȝG*g`UE9\RP5ܞ|N *;a0,~, v>xxZ} 6l0UdJk_՗6V'Z(&,=Xxm\9f>|3898 "A!G5 =`"1w4XNbzzgޔרm,6z]֠q" {Y#^k Pid8S^\6UjaUrS6#ܲ۶nF4Re];|rJ*x[r3)J_nT v@`hL>GDj^ o U/tEQ/)|yC hh6$ƃ{04 #Ӓvy:=\ݦi}^ rJ{RJ 1}b^ҐH|'8*Z7ǧO=O`ٖkD Uձ\ˣ!:\8>| ֕gd X&⹁Z}Pg>'"-j;N[̴v;J̹pFQ$ 3ݳI{P6+Xx+EnXaQsF`ϡ>7x~X>yj=-mj r.ɧh =D1#EN>W?UJ ezjXզhqkPkPEP<#Jj&FFk<߲'P՝1!j.}!fI5fU((׋n<mMԈpüKJc |p?ڡ l/Er#nSӽv["柱kש1LKYH&[pv'% ﶔgQ-EX6Dhoc69I5@RT T&t[O9:=jmC9W8" # VQEˇ6Zd Ď 3=~Ir W |=L 8Ȫ膌At1i# 2&Yg828Bv|q ۂq9hucCJThfE8` ah$Bnp$\2ԮL{DHn'Ph~+-"7bO[ >wyM_SS~v7Ҹo"THQZ`FN*K\sعd2냿Tq.瞞5T0;tgHY3$sxN nKn Q;{I$+υ:<6"R:Zż›*7%t5oT;7£9"O3o[;3s$kĥ}5Xқ6Xx "SCY,sBFe mP\aՎ5;\:'ruܦgXg=_C$bpMUy7 D8Mp ξWU!I|"rFhnuW";-3#=_(Rm@jEl`]O!'vh;2@RLmwLȴ_pHKgO.bz3wh;dk4@rnHw7(}᱌y ;mni|t>:NkePЉ̖R;vϙR^(bc;vGPy9/J.DAR7Uߤ-.aD7 9+qbA<'b?,sVh7旑VЗwVIP{&b b,Nܰ4x# 5:1ڮnn!9襘 i9GlN?vƲ۔/чŴvMГjq6 Re݆ R6A7Mj'\l knڐ*f"]@ 'S#&S0~0iS fx\a+ ȃӚIA>A,497c hk:&Z:W#d~YʮVvڐغu\K/@[ײKQI?wNb(#8P!&qQFgߩecBi΄ AaTX{J g-ajBY|$bFEA=lA*-3n,Po sj7wnyqRA> Q2׸j5t`0e^,z(O)^Vr;bvh\Գ~ (Dhr}"‘͐M 6kZE7}ݽVKo/%>;!DBm_(TșfTjеUk|y%wDzX Rnpn w˼‚,l3ygFњ6,]Y!Έ~&`fO y*6sxZP7!ͮ́OGp <.|ž~ ۟~pj꽚r'L,usAu^ZtY8mj_r2~<-E&+艙t]P]YU, r5>inFm'Y<V!]ġR$wS6K,:4'#3Zؒ3#PuTPYMC\f5|/b& zim2rF Ki>۴~b"d@2-vRWx`v`-,gbpOLsXT&?Mǃ>5p"xZN3%J3H&I=DtwPD 3~Ө|d=KNns,V[70ЅKn[%P%V*&~=̚=:9 9븉aWQ=$ 8|>\A/-yi1w)zQ{aڐ ퟨؕ'!Θ4]2tn jhG=V977V߉+Ô<6ͯ([S}`@zcz5B7 X7x'\3B_ۗ p@<ؤ0}BAOK2-αLW5z~H34\_M dΌ V^_F:ro嚗֤A')P@4Mԙw:+ ӱl\Հ$O@Þ̂Gj53y+,pϾk1]pʦɰө}xQa~ζhDmg/jAY6[*\~q^xh^2W7d/7CwG_~i~3ǂҎs_ ~Y1@WG 1\ wjsp AT:֩}&*NO|xҧ˄)gtj[VQxQ=g|H* ]d"MàH:zeӓ (oDU h/BSď#D RK&N%)PbZ܍g_^trBe8FC.Γr?i.y% c(F-1&>Oeb; P 2ng֒e.NM(U邰rIRn\Qѣ9l;<x@t^ꤼn#K*$d3opgL%Wn0we'2Io}f7J93U\LX/&˅rveagGB)̕&~.]bwed<_ pMY4r6-n9s @MeFRV V/knSYns[GEOU[}QVkT$o."Z{|ic;cvJj/&uIߛ-khp>p7BsӗnV:}6mZ|ƴg'V~(M]g YDU舯Zqxvl&3+|@TI11Y1)bu>mtLg #ў^b'cͫcÞ~tDž5pg6p2|"gC֪#Nܰߴ(Pu)d E" &~%}pLl&!Df1k .k<-NN_ڥ "Epg)4q+ /GL!hl欛I!QeoЊcUG5:#ExctڑwO[VX}N(䬰vfʻES/,vuaD{]1HUSֲFW@=gVjҬ{YwʕyJMI%GGw]60M6Hziw4erY~{ *fڇcY?h11UHO)c5F"MxTbNc`f?vYw>,"IGN^n8W }/g ZĬa*7iL&iu1i>*Ƹ4K8_ Ţ2أ%F~:_zN2LTEI4k!)?h7g>];hOD͙}c9|1%~Q;g/?㌁C6v5[&;'?rg_G,d!p4f rŅW՞a3f] B?;f~(@ V~Ka+YKލn 4Q1 w˲YvtVl%JbwqoVUWt`NZ/X ~VlޘQ ּC;MDvȔ2BNx:\;v;Rܙ& fzM`^6.ߕor;U PT:tIٳtͬsyYj:f;uNRiksd{0:q7a~ rW*A_ J,t k֞o[oŁۇ|H gR <` } - p:Pِ4C=1߼zejk\c- 'ԶU$x!\OPq#?Ĭs:uNJ׌Ϭ_\1%l\>|4|45}C\No H |WW+*7J{ #|֮M??M?~&?Ӿ7xU RqcpA~$I+Of1HI^XRoi~BNjCƊ]o ̔M~Bb")x4Pք0$,/7J{??! '4??UG~n,=OtCPǵ`&6j)…3;fg&D>2# ׺c}&dAb5r"|o9j&i~H`|U,p~YRGdClH!x aLZ%^s2Dp#JbM#&nZFlޱOh[N)C:)43 n"Dio{'AeĹyt3$e~Te`@>^݄p1EaDP=1F WRƊRx( ?1P2B*SQ8E[OɍzS\9JMdzA_ RTtDOA}Ldf)l7kEuYHQooxzeFYGKjP>/}!TŮlU/CDPcTm_۲H0Ҧqڀ]I)ƨۦ m]A` 4:0DU2|aꦵ`v5:"5dJ|sGΑ=|TR#zdy&< ]_mM[B7qƮv[:_X v;,1Մ=~き麠zP^<?/6Q8vvUFzxcֹc]vO?ҹ̐_5[!#Iʹl>>2V1Tʖi7#w}c6L<8G_tqa-AsהQ8#]DmRl0a71M0^@U`^ux9+~8%i_Ч~Ch|&:V)ÐנkJkH5Zy`BMؗ7TfA1m4(&9Zfu vy.DLb}?&!ȟXKP>0 urj5.#_4XHݏ4 CMDcsKNq$)|q ^1R n09{%ztMZMb~%̒eUdeˆH_d!4qDF$PrI#iHlm`9 ->hB  csd79A0l (eU#Gƣvj`i_^3jQ\N~H^x=Z8nMVL uq L u-Q֧Tޙ:|ȝ)§C|JAed#*@Fً r\NJ4e4ȔÇu#{!S${ڗ̺#u%=Epa 2Ӡհʙ}jrcFaRnD 3C^2V%:#kqR:M@G[q*`f4TOV&3wI5[X>Z3"CM`\ _%)j!uW,?jnyAA(;Hyz={MaaŬ%1YxV\<m)~'7FfS`وN0@%{[7FC[O;zs]lbrzq+͎mQDs,RJ{#}B (g,݁OA>/9 {ŎozoP |(?G(}IFW脕\ܓ0aL5Ȓ) sE6kճYn=%Gm}u؅H 1LFm3{s`,F0hF_s@f xY*(V5RՒiWP@'}Sus~a?f'ؠkTMo=x?gܳo2ou͠*Y E>dhaʙf6 bzsj\;VZ ]t*4 3k ibY*'Ec娌A;ׅ: -\wsh!}ҸV--OK. 'Bn0}_=,R1jtT+yPao:̃pm>S%5慉5{`ԭ@6Vf˦G.6hsv3/UyMjC 5Y!:e`(.Tx\پ{vprhQs1f[:tT{'E tUB@?cqX(]j:=+ubWhج-Bz~wh_ ,cy]&^ftÏzs-rԀ|Px9GΣ#Cbtfgr(w,nܻo̤ͮ͐do@h$tO1/4FzWe/z^wuPǧUĭ=6i<ׅDK_=bE&Y[2/N uA,1Q|g|]ptF f*(%;/B\vccoՐ~a!L̴ԷY}(rhk`l$`EZ1xg^nN=QwCsusca5ЇzCI[/5E56TB4Z$(+O# szcNIv j//kаC7 yˊ'#9J16vAFAA8Ƒ=RoyY6ކ3_ ]cE{}r)FL.]^M`W;Qri?$ѹ` )y[6V6 N hcIv$ ,qes5츔mm-Vگl>`t(9dnjCΣS exj=i^ּV-FRTNPRatpC8)6V7?:wn>5&/s0J>s`XSyNjA)rozUbXud,d($5qL<̵\҆q>xŊj "HWZL]E[j/z%[{I<7OH!:܆ruuaM*ZV7Ȍ Qe֖5^ߊБ{v^_p4bO{!–ma[jE2iaSn,Vpq#*_%D^\锾k0Jc| Vp0ft☔bϘ ,;س3|Ǹ"A5+Fv|P(hi!z'Sfr\P! htHf9Ou>o 7aIJ03]֠*>E׿Т3b4~S\?(0p |Z=ʻG:֋N$ (3ezX3y~:"Wu/IAa`#.X!οꎫIJ9l򯐃 n=~}3mB{DQ2Do/rUa +TV_a=B w(jlIQ׮43^B+w俌!Gfhcn&*l4u9g+p.dDCʲ?m:9w~} _tAyU*ReB= Ljd3CǢAc笳d1 #u_;[^&T{.ﭬLh{M KI(|mu1) C oocaMѩ'rOCXѣ`@5T}=YfE `Bk.7|M>F6NU$F[W2)nk7.G{[X7C2(2,r N.ԃvB{L{ʸH.uxՠ_5/uaZlZ*|UTci {`u:c:K>vAхJ2\wFjK2uBGR}sXrvTn¥5{9*~%ءűb[;lohzn:Üb@B)"E֦7g vMfv,G~,Su҂.N`>Eq 7`ʺ.wz|Θ˴gqv⚠ӈzpt1!/ݗb8>EUڠS" %Kx7\R fɱ)mƊ.-nrjfwk<[k ٭WOVkZ4YH)t-/xpsM=Qթqjyd?`tz^#J +Ɉ#dOg %8v>y<\ܝJ^vIfEޘe&)wGd֑261zKI\,L~ȨBQA=GBC5b!);X= ׃k@ާbC؈O&\\Gx}|pp1F o ?[: 9< )p3 p}xN$Ì>K }G x:ð߳7WO&FI8 2b{rzW_&#Z`"b}+ * knY)i7QZ&Oy}EbXbyFzp*mZMaFpR$$4qcuLYp% 2C۶5w[zq9{mk:^y޸䡑RccNoYT˜]{5 sW #'5VҍO3턒`"j85@ =CXɮADܻݎcD3-GYa~1mߤڲ3]?pޱ6pOo\ '8ҷ.eЙΩÈ1>摉F 6*q`D̤}4RKƅfEä2h Gh>f<]{/s*d ?9PV~'ׇ|}Ka~sw2u޿zk}0L_xn}UĔ7 ywɀD6,+1jA}$(n.)|W$Y>(XkHרbt \1,WlA09~|BaG2LM6⍇^W;LD*dQHj ycVWd[#Æєf,}7sS*›ȴoڻt},~poןG4 +S{FH?R{I?'7p% pqT"n$ qΘ`.rUs6Z%`Sg]X>gn_l fhkTf`-ӫd~NeP2d#4#l7hL|9׮*M Z'ɖnǪ32yJ"A 1;SH33w d5/սX|S,|ڑN qUoa/ZcwSHtQS ]:/a@ޕm`Ǐl7$Ǎqy:qW\'DtҨܛPjU57ۦ:2{:_ǣax\qw8vέp`F]G6TXw7T!₷k* P!j?4ߔD>.~8'8&1̌1:;]7{_|Ba#+w3kgp^ bkZ ZSr<Ϻ-,!6ѝ V/8jiL^== yysuc b]o:ǃy4YLn"]0=~ -D| "9|3ߘ̼wb-Xh?&bz#fu +b*F8,ጞeT z`By3=cs|29,5cvCh_a;B#Wd8 Ohϼ:~չuF>e/0oX_&HFQ2bT3f;V$7GF^ٔtܥ`ncƘ*+-2պi@|$ ݛ4/X@6y MkXn:eьdbx~dFrkgy6 (ә;QUCcC =WykbLJ [Z+}L(P"iJW"9`o·t[K$̢,6fSˎlj-}݆3쪮Gʴ"G8 )-X.%?Ud0P,'گG[[ƆkVK0 C|$5:շ)z\L}%z]|?8lx@ HU0_K>*&B I` 2}ji*d>~tnwίVڏ{)?fy.0˴Jf@6c3OBl|>t("6QPztX;ͷ&;S9>pX`^Tif57NVAjf{D ;ƺiyuSo*@ҷRϞhii2tȯ mhS< b`Ifi-a}0<`ܛx+S}11514MM9Ika~f{@SLZ nŻx1`dZ6mp>١b7^/d^| w.u*e08_Kx0[QQj_g} YƅE-ԥm]~zӶ@bW_geqCWXq;q&3,&XˤhK+%hbÌL;ürG0u iXcM]*H+"uYˍm~.7 \QyUɞa0̩+q3Eni~'N #קrB}I1?(i^ n^k& WS׍@F٠ʇʌ'"&J0>$U{)yYۚ{IðӗrwlN3DR_KTҷR6]_b4 d{:USBhq7u8pquC{ܺpHZ&A<xpCgk,cS>| ׵O{Ҭ G뻝'=MKJ%sqâ:t&3}o<2 t]L ,g)Ua!oN,2X?9fU^U ~2 =a߹G2˛eF%^~;f8aײy쑯v/4\4L /)zc#nAQTvzz.)smdm/(%0>hW܈xY(ాèovXşdsڋZ?CaQMpB[54P_cT<zZr Y_wcV=.0h)JxާfGبU%?xFkG|,uޖ93p-N=[}硞sr4wh{ٚZMl{c"n0e93S4˗7n\4ލþWmp3RWBwfHs`vq-#aN,@]~~پ1 glzroXlaO3QYh`+%|7/;SnSë9 "u~'y?Wt3al.CQ5 ڟ/ȰO !q)pqF?׎W^X|0B57fEO?N\GFIx#5$,۞̫B!\ C9l{%!vީV#އ[#\QU*j1o}:"ž׻]]|iPM`{F4 5D`q*/d fqppf+'x.. &ݥ7]7p3M( ڂ3dY^/ыg17KvU pawΑ|CX %2rk N4 [=#'0Du79ޕ2Đm{(@Nw7֛_k6QxHC;?-ڀgóG/Y܆ZwL[qZ#ssSb~gޗiGrDž&s;0cyvg8wΗ:/CX?Me]FZ$|wfZ~2L+&N$ʮf5s#huF+Yg^ړ3w~rYF^èiݝyM8˦k'0W,-d;E2&(vgws 2k*8) rTݍvr4yK_Vɺg_JeUq*R vmK;u$2867t_ WZaL(lӽ;M9U֦+p| B^2EG?D2Ob ëuX/l3BCQDC ;E9ͫ;Φ \-uzBd"ybYpe"Vf9)K)oWN[@#,=܁mЪk`,CBc6{é_ibHD(ZQqȴe&e0ˋo_#x0$tfX,i1䷍~@Z؎ʔ6Td[h  SGшpgx+@C< Z8(^ޮSʟ=Kh ݙcќXF7pUKskծ0ra[s'|k &٠/Ca58,)`6)*aeXcxj (E 9,M=QRY1a׉/QI(L{BBǛ.pdJV ܿ,^FI uߥmR{Yk8£5X񼣃}^;,աBɌkvg%m{Qv%#.MCF<~NH/IЈ" 6WK E3M.b?YO>(R337@ q*ikl?И2֮v6YcA mT46}JN )F Pƺ!PC =Z)Z7ϛ #8~kRpeulZ~0Z͝l,+%IX<((*IXe.gKG |'`z]&wD5ޫU9w[ d7< (Hc={ ylƳ3~u Qe7~HߌpA= ֓n c7wl04("+5]fcp:*]];d:Y#ƙvg;8G;S0Ob8_ /vQCU - ߫IxҐ jHTȞXns'Zʑ>Z^.,Z5i@ y65Cϖj!_N[]Sb*T@4gƥm`Ofr, j {M^qT`C m)ⴇ#˻O%M0 "'޻購ϟS8[6>MW1j^Ģ_gW##|/6axQvY*5p1vHHD!F6'J΃|u&S]h}A/0 q6}(bO0X#&1һȠ|^@;}ZmtdƁ94~`\讎1V. {)]c䓴eqY;ل yps8cz6O~ ~&RpmO5N&6I CÉ'$`Qjc;O$EUO 7`-Vc?1Qpq!c Y˕ou1ʣ;V0hEx(Zc4_VcZ -ݦFDa)υnS";0M~d@ nXEXUs 1YD$% BDS`myNW2ά] .pc ymYfR[ST@53VQ 5 D}*̋ 3b#!VcIG'P>/C'j:*=a MNwa7殏/ZoCPeRdA T@^a YR5#w2G^I|?(AM[,;(>γADnoq6G@"@HUhoHEyy~ P"2ԬobFP~LԹd@9KdyYh]tSEeNy\12Дn=XtSFy@Vʛ;F9}jTgb@DR0>^?}ʉ F؏P XOe,[zҋܳ&$T5*':pDWK,jI:1ۈL'fKI|F-/t ;#2A){K\oG(&Iv IDhmcd!c8N9'U>(=C6=n|lu%>r{Ů8:)NUn>^zܙgՃLUO(U9I+6/-'ݦW+vcF]m }󺳭3dpEX4 UӲvOܵa:HpL~YԄ"X8\9 Ff~6k¤(y-갹m`am/a^'؍gzAAI}̦i/#+yT t8yv`M edHR,Ÿ͸`]iIcv?,>&:X4>,+`oŒX?8?d.yA`͸d[Z=\Iy^H'\A[/̶~4g -r7l?>l1} ^bcv ^) wl-U S7xjcb̽;Oik;1W}:V5?Z/"x.Arj@)Z[^_AKEqv9^.gڀi`f{p=sJx՛Ny·ѰjU:Z2gRi( oЉf>PNAɪ4 wr0eo>8&ܪ>_> !us*8'~KtQR.Tz/g瘙_)T/;r +bItk Eyx׈̤#F1~˛`#Ŵm(K_輛a(f,suU:U* 9adn87K i;2 BFsѨXLjͪ[THU1r \+.R{l? KĿ&ɮ4d|,s9^mlho+e/{~`ey~_cgD,;I-C3EV_25oH5EfŝC~)J`HskN[Sx'WBJN k0&>Řb۰CkM0}.7bƋ PyF̴%\94֎ooxG![bMg{A8jP|oȆwa'( -z me 74&Qb| l}.&U?HɎ9i%'iø#SY1D=rjy,ش A?|z?T4g(uq&8OΙ\Y Eܹ蕵h%0zXdV?ee##󗹧g1Tq ۲ݩ>)3k fk5&.<p_3ϴTEU?jjOP_vGLdm[sC2JB!RH)"v۸*t/`'O[&W &Hgi]r?L5t:p_Ɩ9hK1}? ;辭pJ} cC2"{4S+6PIۭI>A0nrvY]8ªc#[iw4̳ I1бtReT=N3:p`V@>iHd#Pq^ 6UC6ɮZ?:b/NJn*Xْ=8 ܼo]lLQh*ϸkSPl2"`oJt]*]+@gcc^ttuS^ڠ + ?ӷZe<wH`D:noN]O*K8310<'kG= ie\<Ȥ=ݳ!;T4ְ[S r3] ElwGwW{];ΪF{OFMwnewU}`>6H >-)Īo VT&B,qUEm!WWuP.D# DE4Ӑ]DڐtD5׈"X;uTf:uw,;m7#>bGaw;yǐS^v\Dس4lEU̠֕q*WI~ځ}̜YyFfHj"34ÞAT}A]"fl<G q3&&{RtO"j5`zx CX4]CF̋h9;^/5^\T7ݠflB0g3'ߓ wfrRϿ²lۤЮ3A&ꞀO;diى6V43W2A↸b@EO}dUU7ކ$!ٛ4sVHn$>is/SZϪ3q,֊]"8>W%%v8L ÙF="h=.D;6YsE3eּ]R6ۢRY/93՝OF-znajOJZlX% 5^}L1RHty93!>n•=R G 27XIa=_Nd-fGi8q?ד5>^%d1q~q~1UMMD:Na28)-5Y'22Oddİh!ElEvU绚ОeQζOŦ8aGVgMkFĸ ?6+?d[(UG,+OM_V>̠ܨڙ!u)`6Eo)P/@'QnSd7=sL]i8ϜaU=ޓO½5OKmV@сf &<Ä %A\"љЈP9hZs`wk63/6n OJP^8JS9{YMabWeI4r\K E<#$@9a)mjY=2Rwh_vYVӴd܏FL$<-Lb {?@oC7Tx1M^ 6NBfcUPۯ1`Hp#Aպ1qd Ix^=rrbP)tcp{l>Qp6ecn"[QM>8@]{/be>]Mb}۠OfNtosbW;ߟ.G6տ] WR@D51a`FUk?:)\{"P,V /Ӥ6Alm'(?m|jx(^CBҋ.m3imC4qgF,/^r8eoT5ZMW@2A['KQ)4q"-'҈Qx6#lZ;R =Fg1}d lXqpw C R%ir ,6@uiw7'@&na鈕!v] lJç q^A@1\27aK~W/ɀbjwyg+H֤z"+ {ljWAS.2u|H], .W~x: Aw:ctfL$!ƨ~`11ꩌZ&Gs񖛃6c=&bF*BYgls[盛/v>s@A6+S`0pIڵ7\C0N~$[a t:Fs0q P2^u*o]]!ʺ&6 #:ڷVЉ|s4ZUo{I)#߫NY}k{ wlz}^: :Z=g*oo# \jpCia3Ar=1j pɀ;0հ.]5Ul:~Cr3uo6{τrp\Rvlm6ٷs0㿓O1ǟ. %wٴݒ&]Zvno\ \e $7NO ME~V]۬Tfz{|IHDi 2@s560OyM=L57NYRGaq ."3sŜ(?F[0]`kLxX-R~4<D^OpQ'CdG95_Ju: (p~C>9R9^x[ʃ$M@nzHj7e9 zNHti0kB%\0xU=PgJc4rE=pNGO<0LcE|tYn^G6|9?OJ!V1VI F9 :t]sY>8k+d=lql]| ӢNS{ukDob0eB? -^{P1ld'%[6-'~bh2auOu6ή22UW[[xVЃ{Fzg? dKdxNgO'+%b 66D_8vȂ6vPsុ Eau5W0nyEU7skDk&E2Ds6mݒl{ҀȌ^ x&P/[S4h1nQ@sΫ 9.ɩgCZ3 ޔ [㎕X0`Fv?1f-*/Uә!j%oċ?ӗ;%@FYFbDs1Q6㈦"'1:~ױ/Vo!fD|,_ܛ&-7 ICj3yc͌W@ԃ2-u+5- ]X 5lTIGj'E'}qovE}:c^L?a|aOdEI 5NzR^iqʊTqX*ȸ38| OS2]_׆#ry7/PPKkl^/^[^pP] Un4j3z[ #ze6eR71mJ}bU/>;E|qN͛雯+oW>]핁8H`4 sr):pT 8f%I͙3|2fy}6;1q]blܐ7Yyfpfa~iǁ8bp''c Ԏq|+tc&D0Gf[Gks7l$w0$dѬM~O3pYUZ38b =jM44v]jQi!~!6&Mګﵤn4T;S:7|:&x>[Ѻ1%0 7OI0u7SG<N☿=N "Nn^3桽'g9/:wYP"[wó Q"ǗiכJ@0d!1oO;I5f{ 41:Gi{>z4tG^vz|{ywͭc8^>ZFcͽ}}XI~v~Qm_?޻킃eBe׹'$HJxv̯-g6ͷ3MO7{;m&+d!ӣ=}<;߰(.*&6vқw_԰U3Apr6pciB&âeCCf~-QRr)9EItc ]ҋ0yOvRL5GḾirw'|Dʍ(|fCfRG/.Kr#k_S ʦB=XbS8{GyٮPTݐ( nqX03ys5#Xx8MBG正;c,ۛ B98Fuh^GwE!MFa fDcL^Xz럺:k{7DZ `uHSQ:֓<| Nci-4]ȼY n>V._79@\ԥd٦^8~o:Ar'sLqd7D?!E{vr0d"X Lq0!iۨn;!1¾c|$D3ge|=Y1$~@_C/ut ؖ)ZKe;"b|mzwn_{r/V_bj|ڐ񉻡`IPdp iw[_"oz9rHqt6bF?ނ-``{OmHrsyǻ >7&>n^戹+=:eϱix;_5ƶ{R[yEb 2Zi <ȣ$kO$thOQӺن-Gab30zS'O`c3׆-rcLM~#!qeӰy/0ζD Kog!Ge9n=1ѳۛ 7}J50Q`~!s&tCtiY/`kNzl`rX.'05mF  N#3ow,d+Ç4::"EYĜA~⛋}F}3aی׀{$jG=:{(DY0=O:(}W֒szHΕڋCV߫o~˴ Ywnȩ2Za8|Nppxn%606'?=݆u4qt[?+m8 [fH 㰛%p5mxmIݨ̍d"+ӸJW hʵ?D?"A>%LUK6.RJOwHa'9I^ !^`C JzkpۚΜ3-W OX<3;Qv|Η/OΗ߳`ݼF uVM| ů8B?>wЍP z{oh_K ?CF'r7{F_; }ХcXlNSD{/W'') jo FS["/Kr=ěUxۍtv64+_K0:FCv'`AU#Lc&sgpƱQp3K]5w=sGu+ҡL6v!շH-Nzƨgne%7UſFyP3^-(:dlqnc&En]&&[xЈ&i8ٙqbw j-]g!*ˑɎ݈ئ~u(4J#FJQK`**N#ȕ_v)2ӎr/Lf}{zt! ?  "auQ>NfP׈=?cN6'rJ qOz'~g,'o@DG!at/[x}$uo8:;Ʃ~ *7"Vbn6 x(f|td4@y(FH&F3TM 彤UA9(" L"t=@jw2h!v TBP,jd:ֹb2ތnOz}X]#`^K{eX`#p0PE gDm`}nC<45ڈU~]e:.~[eŁ\F氩3_r:&/87wI >Sp,l׉dkSAmq2{@?%?&fKzsaQ+ ]1Lvu݀Q2A&+] wgΌ61"86&0:+Nm2i@",>d1k>Lg/giƵxzO+K6ݳgI֎zlk8:Ko7OW6$o]Y]p/n·&(o̼\d+DĈGx!noh-pEJ/%H݃!a:mTdz9i0~7GTߣxQn }9D&GvG:-=A43 uhv>f-sIHDI#ҦH~Akdx7nL^2ޕ6t%Ph44n=vY;u'AG2txG`SUg^M0[ ](OȮǮZ$ ̺#k(}roZoȷf$R{Dvb{F>}HAeXT7HEтF]3USGK9_ }׫UY@7VEM1_IٻvԂ9qm;{r^ɻJc4Ezx ˖]&.sn:(a{a󬊸m[=@W%/CJ=$6#һcpߔQ@`[iKkőhhgwMurAÕBܤdiE #,*Uй=uxR,xsX@ܒ*n G`v!n$D͞eVѡ(r$uad^d^"Cf ZH2=쟅JJÉ3r\)&k.GIJj fj|ϟJg~N;. o ױ>[>|"i[1憳1TD+>|ۨȽ QjYC6]n>G Xq3ִc7[ ^ So/3}#qzF^'QB @l)>dU@oC:R}ZC˩;w7v.QxJ@Ck7u0u[ r#{J%xm*#XYjڋ1a3G_tf/#3?M4tg7f}fT6+*zUS1y{A j%gS4ɀm~C3z/EHC`92ׇB`K*˒/O@{^3H˚nc/bJ@Rv]aYn)ޯ :Ilpe}q+ʗf+_iwGu vs" ΁O>^܇KvD}Yc.7o̰+j Cwa*iқ]y[{e8_/WX3,^4i *^.wG)/U:]}IBNCwHi}Z>6wLzMuo3Ùt x0W51j a`{P5ӢMbP]\5nn'걳4X8Bm7XRi6$)V`qד|;ūW5+K Uū y鈩Q:e 5qHJq!L ]FY)Hel5ϭS"Ry,}t3ŝ;gj_ү5yA1̽Nt9O֫X I%Ж׳oۂx ۭ ʗdrFHJ?ɓ72{0{|;_1߲fC <"8} HUXV"Ü&VňX uMXڦs8Y'77G^]4Rk/JsWXsdD9Rn{8Y&>n56wЕ(BEG>d苻 M@(7i£#`Vx(}'lծzd%:]IpnI ]On6x= S 8ڴ̾HE赟(*q3}`dXpm3NOKNx1V3-깁du"ɑӋtԶq |@ݲ.Y+}ʶ&?4e$'GztI<jg/mRmjy4 f:-jt&67~z3 sygH7`VR~ڐ"hzǾu>܍'Zw\bclwP٧uC7`$f΀cD4#g00 <ڑg.hGS%ݵg7@uC1ԏɥqqWtW9aFybͳM`AȞT c'-^hpQ G h9*T%4̲AE5t/^pXjlqz/O+*ݏ3:@=b-7L7gEx1۰u}hANt[c:<\zƼDW}chd]ha r~68%ĠΡχ6 a+{ wzegg]Rh4j\5KVr{V% NE:|a  PRaPͮq: ''\U$uiIVԹxv#Ϊp`=;.&F_II)bJ=UFb-G%ym`} zveZ%#X5N̡2ߐ&u-*K.%_t.K򳛤0{y+}fSmjTc5jl>Ujz0<3{*[+ ސjz8w*$8.y;!iBak _ue;|K!+2{F`tYCp抑HàO=\xk>[~7B"\Z Geˏ/n~1(8p}ᅈ:x[rkr{kx^jq4;ԷYŦ"W_ tT݆!5ZާU6YŽu0_’#W}uf&xxʲc@M>: 2Z: _ƐGc\ȥL3b&f5s3IqE}ug|7t\;v?Y 5n`"Iأё E3loK|mn&"tq-᝽z@AdM< .g0^y:NT7nJk|*id2h756BYu:}7.K\7ϦcsN<1fN5q9#c3q\kv71 g}[vZ,XKp(Xo0X<#~yحIYN !\Omsnc~1S[pGh#o\p\1Nepwh.I"˻̠o~g) $&2 o_iS/=)NdMf]N|_^z{tT*ʛgҩk.|q߽NoOL8/n-Ex'ʼUz*Tsnsڡ~ɡEow"zVǼthC~x(u-)n6!$>~^/lW#auOPh.z;WC*FٓJ]Z oPj䒦E1hH޷bR}9qDD0i9k6KVg*/ )}C]fp~X{)Iq{)[yu "؎&*헂qugy\1?ʊ'&.5åF\lh9 j.lG#MkGJ 2ܼAq1Qxv;YEm06Dt}QOGZ34<>}Xl0n~M܃R?A6][+z/S:riR0t wAGeArsߐ *'V,LDE`#tZZgʕwM}G\>`p-n*j+:: XM +qȱJC ;Ig\сOA6uzLQϢu4tt12.Rw D4Ç~j0̹}KN6Rrfdл\eyҬ#<8Sr nӱ &*4GSe6¹[r5x}~=3]$X΀Gc7O!w6wk6PEZ ث;h>;<~W;db|Vsw[Ν}^i4N[Bt@x޲:95-d>wGoš ^T4hf.PIw&R,>&Nrn? w:Po%c+\MFY/zbMFeGuj@wqdZ80 J ]c9%RWx4)dskKQMAlc~Wuὤ@;RV#,MF90q&~7ftF-Z[ٌQ8׍pjp?QGma^Zԙ?͹_ovfmY vuͥCu'5O[Gk?'ɸ~O;٨xVO䆙);݂·Qdq?f#hFkPbM#@BT@pOԗ%F1,-g70}F^>}ob7.C {5(6D?^Ӳ2SFu{F= 2Vg1&_RvuK6GL®@Q~*rHv0R/N==>A*yd*"6 zX\fWm-&gPzcsp%(=N.2} pS̵O1Wp[L^3ExQD[%@i ]0a?,u 4Q]x`Xi4:Af{0Yn$>fr |҃l9RWMJur @Agz<ly aQXW\YgLkgE[7 | H~5W^?6{ʬ cl̊551 n+۸a@0JAbNFQ}ڲ/:g]P1"Qڠ* K h rI gׁфt`p sn]5'ܓAMC%)WSvCnx_ųoR7W*$&arCҌ<`f\i' +U!ZA2@{Q拋E Z<%4u̟8 WgIaqmh3"B dD%_vl`|Kv $U͊u#!c;Z+5_3K.qJ gR Y\J7/͛Z݈Yu=FYX$UO,7:I˟7ef|zp_9yW>#ִo[pW5fG{}WDwvdqP&UE?;ֳjyZM,'Ǔ 3@O~u]kTJ Hᓆ$ y{QE{UxΌͬP[+Suɑ<!ښ*ojOt1=(CE  ۊSBCYpF.6Ě r sRR4@,).]5QCiBm)fՋv -j:mbT^8H.)9mKPUsi aXeRxeFI$rÑz4_9Z8Tr33{͆7JPd'!KƵfB0s'2@b0~Ԫk?e˚ӯNq[Sگ%9mM KD"&\Ò"4Ih$]"N3|^>犤8D=5j75優OW*3I WX&%$&B!&a7I#ξ ixh[H*HъoVgIXcc kwL^*ZHi@%(р|q{'pd ,_bQrO(/jрd*C8-7&57ZV>*#ߘ2^ұ(G\ o%e#2G(.L.i.+v9M3;/sAj_~U)X+|7FYqb/P뮽?uR >iBH6Yau{TNCGD椴$dnlUYa4m%+jdR*. _A~*/šz-{m$PĬ|{ԑNvy̳Oh8 3񝪚NLW.;*/i8ZSQNWrv &t($,:gtNȂ=NKSGPi 8$2jz0k80R7։9%Faf泂=hڳlfdכ#&;߂sn`dž8{Tz-Q$ jz18Պ{-*j:P|>lL6 v>*x:\G-=Z`ùwPTW7ͥ3G% {CU]J]'"#>jgze|Mf>FP8Tj \왊:b reׁ7nX9+ݡL^R*Vaw5`a[qdk8ڦ+`3G[=s@{tjWk>{(q3,KRH;X{6#|z;rh^Xv~]]JzS7XlU>ˑ={؍aT# U׳aOQ'jAGQYľyCxvh_3~T~'S;Yiu6}hݝߌD>~sߣC9lSa4='S\qLg翗 }5R~ߤ/Rf4ۿz̆l<ۏ)Cl8@SֆiTePG{b/Vn"tf)`8Dz1s[0H_i 9B͡no9T짵^#Nmѽet*D־+:~PyrCTmNl*`mA[N/ajL |1 3 `dc2 _k¯]rY_27?ցZ7]E^E5aLDm,L~IF%?c,ǵEs@C6~W=csooUei1MvͮW* 55fN4n"vк63JC)Br9؏1bm2a9-D|EcPQx,#[$@ 1M0AXr1lT 5E"f3( ߥr ޓ ȈR6/VTk8MG>Cn''ݕK?ܬ@Z 㞜/[2Dq)׼BY3Ԍ贪ߺ'|≟?&_\hPGVx7Y 9 z 4󢹺wpmкad]9eRܹnQ&y{{skz5ѡS;Y3jFzx.ƭ#ra#f?U!V 4v-}}P߸08d^#h BF>KGK zOU^| ej+;oxQq,ͺO{]əzb"ʕ3%y:2F=FM@9|;*cS#ZnxIDQ$1{N %%}+{s[^OJnaIc+FfdKbjQΔz#rnGK kbIMx;k̀R:2zbn Sr"_ k<Ⱥ_|oUcV:ZwP:ohkzdD?*d4C8(Ls<~Kr3k&Y_1ʨͪNӥˎ$ X\^@o 8XŴ8(;uhC`ZApJ9f۝;ँY%舘JLD ntOb*;~L,_':Fx:ae0z ;Y 1kUnO0)kAd`AzW 0 +;p .ͽ#y5ck@Q|ݿ7MDfyK { Vٳlj7fy #skM [߿m TGMFWvj=P60/r%NAdC{ϓc}K4dݽbŖz1 p%$&btN`z쒔A=]V 29~NFp9EF|R\M3|;wH>8kcL #"bBU(EF =f]WoɌvKd1,ESC"U6_@3Ck/Eua]#֠do;pC*2=&MGJٍVf-p|smV`J6&X lVuPN%Eɫ1ɼtno0 5@1ph{Zl`9; pD &t_o:X%X7vp:3u.ܻ'(ȄOzPƱ<cCh=e{:Tҫ ϋՇn]=a]]D:3 rJ_  _k~g5 I_1V3e$䤧q$Vy-}ps_)ҩ,NOfIr.^և 1$v"e \r CݯݿvTa(ݙQbֵ,#=o[I#N5̸Y"BYtG0 *N޿y'\|M`|?W`/{\ }olITi\zz^9lc 6=J~5(D%Du堰r[U& z+g/_2ɋ 0QXU_1*>tg@OUya[`egٙfJ3@階;T!;i Gꔘȕ8;Kڑb$3UG逼 4B2jgHI;Avyr5.5|veX<29!/'DdЭxrF ^ˡp;_-'haL=DJ̠=OW{w|˪JQˋ#v/c`&/K1ۖXoiJ߯g0yч}i  UbkP;Brs{y6f].sg5\GW׿ήptF e%uzklYVvɸ;s;fuer\}s[#bٜJwY=!~;(= 6Fm_'yD̝*[*[rs ]gD\&<}}ڸ˘7zQSw{g#`a257_Cۯ臍QsZ>h J-tݔ-:|SnC숵5s!SPة&kJF^ZYQd=~'(OHH6F0CF[DgN yt[odt&KQ*'5`x)Kʈx|]ܮdg*)gƒwC g'd0S0: b?XwsczHv]FZmmCzS/)mvSM꩎h8(g LkFz#n԰ӱc_ΎuSk`Rqvǵm5[3g05f\x޻Ž]|pL8Ƀ,й܋';P}?\ɇ^b_a-zm"KEDa 5}E$=ݟԝС!t;?c.+{CSv 5GyVGoo>hy\cQu8j5 r{`=ԽL0n~GL VcvטiM@6ʰݹF7qD`<}g̗c XP66V F.;pPIG<LKs> F~9`RipsѭsyP_csQ"/_ ޘ1^W׃0 E{?#0`}xeHWe9ss[uw2w?\.'yퟯwj}gőʱމ={|ö=;lӕ VDvo2N&۪!~?.fM%{.ˤ5Lu;Q/2a߭*#¢\(u@C 9pے/MR0ԑ:qbpI"- gD{}#mVѰ"2c}a} ߊ}dpgij׌F)>@7[DF|,nO"‡, vl &n0/Kkۨ^zsƧ־G&,D3@$a!uҁÛ" zȞVI6ũsݣ=RJtGMPqvuoTbX:y(!9KB1 Pޓ x;6=0hth~k A|2DZb,.3tY=o~W}\ϋ>I>GiPsPEx+kUC0=/7GZr: #JƆ7+By?G/8;vVxo3{)A/8&œ3l/j7Fzc.2_g}#,~|+j^L+^oK~xXo=mz۽\)"gdznpmo3(F15`Z눻 ߰~D:['h7,Sz|%)x+*"ߍO b$ `/1#uWHi'ԑj&WCxS5EZH!p qO}oΣ*{=Ckn'DفFД˝]ģ6{/;.' nj6fD˝o#T>ws#93 lu^Ec`!KxdMq08lxx#o&"o"b%&0@cV%N9\%{ +oZ}6c[ {ԷtYst Ww$-GY8eŗ謽K\_- 8B.\΄uPN Awn]#O_Lj ' K2<@wosĴ1nrNwck]h%"!Qۓs骙|~7>!r (aP%UՐr^N+aDvZfFFf)2#FZG/.gXB~w`Y ih {RN3oy\ ؀J]FwL?T̩pYE ng [Jo5!?կ]bpǟU5kx_Ld=[9rO :Ôv_`3_%-a>o!b 8LGsTegW'p3]ǢޤM7YAgkC3~\3넟37ߔr+㚬r$c|ax  :8ٙ:j ټ1OQ5 u5q;/xsuP^q||.5-_BM@aPf$=gb uv_ֹ{ʌjMˈs[IP-"救[=lJ 7k{%pވCY]!ƴUg"a;~}z*WeZˋԐQ%ȉ>[*9Ukei ~8n:g"bGou+e)ɵ U6": voj7߬kDqm9bE`O #àW^傑)(F =9'~6ʩJ^O-8,SF1Wӡ'}dqGn_Ɂ []bI8uũ0z{0avR$?p&gzO,%1=oQ[#rC"ݯ>LX5DTG[*=ųa"72/~,[I+2]f]Hꩵ> /2\ܾ"W}M*ғ\M<*8x{TvW"i'^6_="&iN{8Dpb7z%TDR3f1Iʺ!P =kv~ sfvɴw|Z[ D8մѰj^=gMjYEM XE0=fo=m/W}%yx9*#YcÕ\Cf^j7ôkedo#x 3;oF W#40nџ3wQՆBYJ~>W>pnL\:T5Zz713=CP >(Ww(R1wWpބ$A2}x0h|g翾0lZ߹{vܹdNae7˖AULfF􉵸H"!# m|PnDGԥ-xᐽ--pC2EngǪ/n,LǎXMq?;><+C(W=]nC_O ()+{B K tt8 >,75x%pcU<;cȧrDWWp]tfr?`Jj83> `qA`ˏ 5JMv_v6xqɻKwY "u@L@N#+vXX×>/yzsyd)|?qZ~vY]qsc֢^8z3ҎH/1CKTc Y?Cx\h6ޗɼ}qH~d1?݋NY594#ѳej2db/G/,߻:1n;~]MkͫYDf"k?ES߁m`?lq\Y}_,Q$A䯿!">wyY<3Αylafİ ldyQH$;L8?to>vG WY2vTqrO rl8YvhoqVii\j|H^rw\jz°:`ɥ.L;t"k,v&5$F]ڧ6F7<Ӛ#,8uKV·ʍD $r9O]Jg^,E$t\'d SkBɂdw%Gf˲b2N \sat0d4A4"$+o\I^ā% ~,Y׉ONr%q$K),uz}N1xRYUsݥzVOր"v7C'}P &56n+]^.4PNA*Bd붞<ȑM"e~򲟽L5VS,qܚtFH)nɯܜ[2|Ż̟McZ7B>#7hg6-1P7IEUd7yb~q~ ⍉'CKO(=uAoهqT'$_3MQp# Jpx߭tC*f|UN:Ή@8hj!cO5i{񎫳mmG'5GeLcxCکw z췃9fЕE<=.xNgB- H읂$Kɷ#u$"j"+mXPLȖ Gr0k=JAUZ&0 ?s K3Ã2C_l!_iB `0l ~q@kJ0?24xфxM_ѿŵ"%sDsO^iݚ,2PhS@69sm}CJ t#Deۨm'E~ZJ>SUBON.?g_~/?'_~—:c/1dN+O5JilPjfUfy:aqzߠ^t%nfV+BE6xL|['7-bzkȩT&cXJ?l=z^;4eG܎뷉6s䦷^Hrὕ&H;d'\!ps̾2%EA}d:u8ppsQ&Lm!f[ Z(#]> l;lG| WvOׇJ#8+}sKWTmD0x PA?|xz$x|X4!wvxd5Mi/;~CA(À MWS67 &M.}lj1# ; tLi%on,OEI:7 MSJM(8GVeg 95cih5~o7 7U# cMDI ln0Bi"ΰ-7( Qc".!8-/78!pAZ*ѝnReg 9%+73"ؗ~#8+H;sKHrq~J Kj\z:Z)]z\kDjnƃLB)T(`^>3iEj>H׭@s$gVWM8-HҴDt#7Gst,EKl952.YN' aߧX|s:hN!-`+BNU-27}~9gH{[d<%:NJ7S[#R  ̐5|9W۱C#Odmf\y~~,OD+ r6{Q`4HPfS>N'P9blF &FDl_SsRr_"K~X{G|q pb 9@ *klv1v~wwA+-u)H@DTw" GF")&Ʋ͆䮟(I<˘ J˂U0Z"@\[=aqp垇4}չFE*tmvRQMA:P$>B_䮤^6#Q7}7Wdl2?a0]kŴYW =}t1uّ:VڽE+T6ppteeZEku?Vf i~\b@QM9=.uܾdk, y\RcNelp&Hf<cX!mW/0>f,NJQ"(h,5QCiJJиɺg)F ub:Oq>Mo*3%es&@s2j=NXYN/KNmD+}1}fJJ&{ {'O9 ۳BF= ]˺&?:I==e+0tF2b0ut+1^]|%] *a,X\6h9)k4C+i2 ݨv䷿;c3p\&}{"=ƾ/6~q2E zLm26zH"c̰#-a?%{ ԭ:Xme0W.hR6~KKfvArtCnc3|be8 !qJ>,qڦqrQDJhcs9}[G1%:#1JƷLn#*)G![ݎ䙱ʽnr0{+ 8֛ uFf=B ,RQۅ '[!8lz")< l'qN)byDʖM¶Ejhw\81(' lt;nO{:\[ z2u~! aBa;lhKTWfb[sx=9JiisrvBwa!WcUK(+TpEG,DӱD+_jJG;_xi`:ORkj,=iӕi ̕ol!S':07>]@L#fř:Nyϓ=*N.c _ ȹ{ %Z.CpQ&Nr4vi!rFָ䄙h4eiiO LqmQ 73`X rᚫD"Q~J-<qI۞N YɅ \}Ȗ m4@̶oyJ 3}5x312l41Oy6`xEN:Tk=94l.q -F@+ݻf.bki%*E10'vѕӃ~{Lbcfe#dNЙ_4^=!g'qt`4)S3$5cvul;Wr!噄[[IXOFG-%gEd3_zc adpS~|]1GԒCދyqAGbI]X_(|57 v' ߧ8-JDJ8Q?: GxP@Vrr` '`N"Grqڣ%Ƨ |Tn/{dv _ RZk2{r-# x Bje%,) #]B7oe~a{,$!F/:Xҝ.Q"-㴟ZzSq{/J4Hmy5}6zp[$~ ~(s?ÏWܲxHcg^*Q_%.}X^\U{VAi)v@Vplo~& .ȫ\6Lf"{u\њ  CNU}T+.KϑRzfk]o_^OgޠR=.bo r c0b cb>vQDu%{e*i5`tэGfK^P3_c›EdSzvCH܀x 7&YrB]L>S%U} eѭ56*feRHO׶6#`)8H](H B9<;YqsxUXJe9Le|FɼF@>u(L F<(Bi+^ ϵ{╕plwB3[m8,3YOHIR#q @r/'-;qQk,X)^qAуFq2NS!&x,pOt%'ө'H/vdwqh}u&b{3Cn82YvJP[h{y̔^+}?f9 QOC6QRex 7i~}dD&esQGfQ=̲&J*k.WOEo4Ssrx+Uin @Cd2Q/}dt")A@~f5A +N*7A]>j )g$yВAKsV=]'P bRȣ5xjeJd'%ѣ>)9DtBhp6"+0<ߛTkKDDTQCύl<$5$|BH<+l>r(8$ʊo>.id s<% .CN.1cSnj&VI1'q~]/^]q!FQ_vIp}[Q|%i$ h{+Ĕ3iCrlA*Fc=6|# ҫcFo(IR~~<;N7[!݌WP]?-XQDcT]VߪzpFx& w\^;1`᳼#Ҧf'x= G1=0-ȒGѬLϒ}>ZG__/*:bЍ*la+D k)Q'ʋL}cB8@)w&RYM$#t?ɞo82-uh@se'n /1uQVKhZ>oH_Wlt?+@@X jN|h9ٞuB{F`kx$1Wpd*tKUxI#p~G=9whS~Oiȭ8'-" ׬x4ʈo%d=M}zPFo?$?.̶$"nWl'Vԧu ]n#283ԣ-LW ;ke 6eOGi F|&uhL@4E2yr Qg;5W~rQ=.Q4m=tjun1vǼO'r(`>azkvas|kiPFzqDܩMOE Olz~deofãyQr ~Ҙ ':nd_zs]H떋K׮Z{12|Y854rNdK&QbDc25 #TeG3dw{4qA 6§@j [RNx]њ @GO/{ o:yM71gkZRN=2~m♷8;Z򒗱#館;* Mr`vN)8:i9œw87!(tC;]Ӓ>']t"?XJ\&Hc)+}:#ߩ\f\i$j \sCޟpƃbKd:XaZ9t=吖2ڞ*Jb$ED_+ۜ@ޜXzIBg?pqU RP,0z#4_uH+ilF'uF1lG^ST`l)_0@@Y팲7/>I}Ók:AGG C?RxDo3 ZEz m/~0sZ18^8M{&*%ǐˠbz3m=9˭g;1w 9zg76=SD4|ywrU)9%eBaYO 9RvsYNaLېE#^むeILz6kr ZR9-3 BWzM:UjhG9礁cֿ=WU&A)p@ީ`U>ҞYd=LҜ( ;eݽAy挎DL~l`=nM:vKB&pT{kwg{Fxl w|ɞ;^ }# zEB~ښ3;nnoӞ caM<:p}ZH tw<gx?wT +^GGؔsv!3.m΀*U]*8K̴Dú0BX1᧎ƒ[6tD8cys휻lfӃiN{ӫ7c\WjC3">:2yrXdNy&'%t E=G ^5*7~}_&~o%D0SnEx#;eC"l&q8 tJ;#q@C5;!Y#Rh>B#BykֈZdAwŝ.Xf.01JQL?9q{qOoqn0w,t>KK[[5ސcEP=.?/pybZ.:=#ybD%*o\sSθwx{O̓p6\} b*^bT_|Ecw-UTrڦ("o:0v)QUIv7CL9yՌbǘ+&P7Q(@A'DT(0aq ٜHKCOz_Y$=ĭz0awd`t3~j+s/BvD*ńWA,1wiOr:Q8zn_A`c)> `L,_x׫D1 p$fy >ۭ/_Cͅ^ G q GEαb~GƲIx'h=ipMPx0Z_) ->@

&#\#1ap$8¯!O :c1pv{?g|1Ќ7$T#DFHu(u<=j'dwmŕL\bdjhbn>2q"-aH;HB?FvHllUSc]@`YxdwIjG #G#gW/p[ϑGHUڣy׿Pk0^h:x<(:DF!S~a 97RTwDz< 8j '`z?'&fL tֿ~x`H1gWakфqUׅuʿVvha`ʐ^%2+99J&ǽ|*$f*\U1mT:1{>noz3Ѓi<~chb:A1CuzMU DX5+T9vHt4RTұS/K(.'ɤ'a7o `!x;:L2qjQ:~Ev@"@ht)ԀсWC=ŞC*xўL3^x`3aR8% @Ob'S4<J6feG%L* ?яp+Z e4{Jp_!c)7"9gۃgt!;//ݞru|;eMX~I8gZs-^TɈi.rxa\+7B[df[qg2\qCSbnq=Qǣ4(P{PPok RSiN c!C%(G4 M,ЯjLPMcir,k\b~M2`{'VUi KAá8ΟDvvxIIvJz`1z]%1TCw۫?X!+Zk09Xi:`0񹉢5]o٤PT 1A'J ЇԐQA3~"У&!r9n"at]#k'kT:TjGмw?Zc, #8*7,"*mH8>(ѮW@I׫0"dG"LDŽȂ{C)Han~A͡|ߠF-{d%%ۜуhZ*0'`f<32"l FkonNӚ Q &14FY `+Nh/UD!EJnO^ҍtK,ǖܣQFZ wAC:&?*g؏~$ak%"aYX1g>9TS$:ƚa09&7m >-HKh[7 ^D$S;8mfMNU񭁁f؜;9o zIHʰeAA+! fE=, 3 B~ p FZ?ˊ̏϶"֞/RKEyضO_01C2{wm=s ˅g?:Bh8$LG5OK>; ϴznF҅鲹 ?NX94_KPin)akRHrWfvNm3=pC~F=(2m{-%tcTŶ qX[\pebn>Iqp) <70Tq`@9}RtgĞd(_>q I ipr㏟ȇ)_U}'ў D#eO}ca 6SAf#@s8gVѾV7E=뗻FKAeZ?yO7 e Ź͖5RPtL# |bTN͙f08uzP$-r;7Ā?qV(cj nHrkpI ͩ ӆmf 稏?+Ŷ+=um,TnjZMIJ[4L$kwo9ʺGjxSdA &{1oȀz=qM Nh;jZ ߢ9 $`u zTI8}p Z0*lE2*H}KFVZ;,G4+~3\^́moW `OV!SV}LJZDg|ݩ2@f8 kmvX91Oy'yS+Pa~fk2:<'aŅ,ୁ !L 59#ߪTTpܮ ]L%r9MtAcȢ-PWCG2b]M4rs< fx%9qB zfV(`Q.ɞZ\-DX%",REW GE)mq%6yUd6Eue1xyUoP!zy5BKxB7샠NC%4< {Gy镜^|Ox-Gw!|\{eO%=Sҋ8@%4sjĺcJldwmcM*Ǣ7ouw ^Lr o J60+V!َzaL`I>(OJϙ4+²ݦKN^jFtu+B#^$U{ULQȮE){a=T ,yN DJB5Ec֑4AzF FGT2p:3=9[Bȣ`B֦#mzD j -{%׶$2I$XPN+_& Hd_i|H(%'7XU6B̼+?j3 !rcN[I<km֎${*PPh4O엡l[Hrm_1__#O50o$#| 8F ҳ$m$D?' ix }E}y淬RE`Fpq,$ϣ` ^%`Oɖ0ˋ#)`5ȁܧ{w]td!$^`H q9.*%씼85tJ1 ƈAPGKePQ>G*l܉+z3]tqru]sIg ΕECgO$٫T^_SI[`|1 B$|e-2Tg`֎*'DR1š<5?Ǟsglj`+V=As֌u EآѮi~LGWRe^SGyyLpo/69/~rm!F>¼F*9(}8+K=Q~a+dW|$aASfiq{Mgv+,1·"_{fǜ`S@~"Nѷい2nN'mhN:2+JI=,_9SbxWH"1Q4h7a(FsHCzR&E[5Rk:،#ta #6Fe˅ci5i9.:=1e;SQY)||Xg2G8?@s5Cet^lvqGz"oӌx]pcw4gRٷ A3ă8iV-S^szx`pY*T (vO-"+pʃ,"6; bP649G( ק [|U-%--ا˫̥d> Zc]mDﵘeT2oBARvp׹Y[d Z;BSl&ut^F{˂F|k| q T/#Z6论ϚN584A~&ر B]l"vy=I<%(}ײcڮXCWOt:RYGǑ)+37q3U;-JyuMC}iIUyuvg4&_^Lz6'˷?;Ӊ`srW&۽)Alũ&ǚg$E#ŷ Xs&y2#τǾ) OGmv% P9rtwt zG.wGk ,ᑟ?!?C\X5?iGf̧4pb:߫Aϛ yfn_ G]>S|OZ378+<"D&D`KͨǾ7F[PGC}qB }YV,Q@7xs %)9 xgԌ*1D9^C%yܞx:0t&3]2tUȘL+soVUTjRo' ٪-Xa W ']e=ӲJ}_f.ǣU"Eo\urK`sFHMP'}oHƍ޵D~cGAs"—m})4 ķ5߫f}X! YMեp#̆N`6b=L5+pPa AJ*ǐS 5 KL2ɷ*jyWow!_iT-zZ89(]:>Ce)9_MF-R/:Xd7=slt)d Y]a(Q W(fܘ7ѝ 55#a- )09roR |z~d#7g!?0Nn] ^|w=(W<΂j d3d xa/{ ݧ-C^ޮ<H_a#˟`ߚ՘?p/vZ&a?ⶈX;of/!yٙ\ӺB=$Cc5`a~΄ +Jύx:u۳+LczO>EM- ߴ :}ǩn 3Ojv?98u33g -rFxtͶz EntyDh 5>$Z6V%Ix\P3> cR"r%:injg1[ʳ2Wf Y@N;ՙoCE]z*Ly(EHvFMoO1 Z~!o6mP++$KK D ~j=tB8CT~ۀ>w(w<) DoC[+<+pkk%) 8BbV΋ E: ;P@P#0$pg3=6Q*_m_.Q;&#@1 ^e֑yd>MN8$lƇrx7INZ:\ qJ<ͷ ›/9dA|+Y~ƴU'6R=38INCF܎h]Oߌ]a`SN[RDdT]7=?d `xb,B'|HJtQg*΍/+ P R.5]2 W_W)SB_px{8"k/̏-~D;}hО t49(59BgGY('h@ O)l1l, G^qK0`#3t<6,vrmc}b-POGk$нK)\=)g[#0t`C4g& 3WYٟhsT#zts cjVg9SgG|55 WǸD)DӳE 3] SN͝}Co&(|"`_p67[G5FpAɄn?Ã3lI)AÓK$r8ȺC.kKne'/ŋeߊoq`2f4 H O< Bz‚{oԙu B#+an%8kL6$놦\QElB5!X *M[_2GSuw~S-7/ W,.\[ud>֛nln8c!ЗHcxwog!X27"DqSEBS4^U>^QkVDa9iwi3e-r|?+[U>1D w!|o䠿=vm^v EAXJXpr(ˠ :vFvoF/;(`wwPpr ڭ?6 (lEѶt," B.cSp4G7 cZ{HR^jNJePs=!qIiޟ>)z15Ӿ}"E/Zl?,yaώS-ǵ("_N 0o $ ɰ]pz2Cz\yHg b%'QrA>߱EVYu5̻b7x#$I&!LfGR2Alт";B4q|/RH P[q@M+ O<`#UK 0@ؿt%z<:AaEU&ߪ{V}b &H/VXv9(J 󭴂@Ȫکť@N؆]'k[-BXtCyIt kvQiMw#& E$.4>$G2b,uׂ3Nkb~_e~0ӭ:=A sEQc|➢99\l_%h?0L;Xxyկ%{#]$Ӯ"- +A~e'?vè1M|,7{i|ZHIֳ$*M:\CQA$'D;mB ~/( ,^/[bvI 8]ΩaX))atPl{MPu`&㫯Uf"xǾCFKs R=om e]DVbCJ"ƦaE]TݖvVu,OSjc8[7 `Jꒄٯt3B0j niqnh& JpC6 mnKLh6+`ޭbMn"~fIMog#"g#bz#'AÏVyp0ہڅ{95e"mOB~,j@HXϭ[n!\@B1&}Jpbŕhb y:P a|<ADѩĽ(8hcO9p8/Mb3;MժD:A h8;q1 c@;s=/:YZ& 4N!Qr0њg6{j 'Cٺ8*ِHf[h Gdz~Zypj{Pd> s8rvyþ< j, (t!UZrޡ^'R|{(e](ryC`|J\^Fd0R{#FDɆ ^Fub>+pf6g7 CU|YЈ AO|3YCN=Ǡ:Ӝ]']#8JL7 T.q9Jm{oQ/֕Q|$|CŸZb7U BӺp_v6@axnCx%4\$(6uG=hd#s'k,jPidgvJD|ظᬟ Pi᭮i^M |G7gX{o=&}BNFఈG`69YӢ 㸱JG8_Yi%^Kr-Kd#ma1|~-n;N~FAΒoJ#築'ArS#/}!)U{V-¼S^;jG;"^| BFWA 7H~C H4^(;V6Sj{DpN|&#ObK$1Z}5jc\wSa]cAOfȝQ*¦MKRGK^e{5ޫ+?T>G?<3As`x'pȇ ʁЄ!t=eF߂a0A̷wG\ۚ)zzsA3oN 3T& ENz677x=g05~]G@!L$]0=d^ۦ1Ƙn@p䘝k;x8ePQ bf^+7}큲nD➟p͒ Ū IA q,dc5lu?_f^ZI)Ƈ$bx`׫ ã% ޒ-˳BR&g஑ۛ>aGb`ѨоFm(8JIirg I,Wr62NDd2ғ"n'6O0d3?:yM'M|ZL jp7 _Ixx[hk+y{ Z`lfʳdNK`N[lEPeMgB-O\,$`o9b9j>q V^ZRW՚X&l-ss?OQ˺4{}$Oz[R ^[g?iUA]AdPbVP%V#%_#3 T@:Hz,ɣ^qHnj ,9Yp|`͸N eh_tl 6C:.V]&X /c+Ťan\QS-QH"Xb?@Em'8xΐ˵7QW4Y@Y# *CPf MEr&8 ]kp{I_:p[B.T_HJ72=Yؑpvca4h :Z9uD y6}M>3V ^ZWD69f a#MS"; QX\oB.I+4pA|:T\0\&;'1VWl&ޢz{'p=Wtuʎ Qvd"d9'(.(x֠W }L"5-ՙ*^\#~:AQ!FAx̊0ۦzK]B<X LF>@%WG*ZlTffal򁅓dgNLC7` `J+"#þ{`@"c4ha| Ih*ߋGmLr6Fr/Qnre` Wk ;Fmݤ(;DrɒdSâ췃9۞3>{4-IaXR3+{7"Ob3cvqOKoҥ­y [BM A q4z tf(\S VS8!@Go$\NN;~¸ 'AvѠo(QYdʾ*F+08`aAg[ńa}lD: k@4AB9j~0x52NO@ ,b:vxhRN ^nk~$"+ ۊSdƠ}|ޱo=mOgaF0=&NV*TĽy]pU“kN%?%:+K̆@-nQ(94'욎̹1v++Tm)T |Vt*n')ۉs(QKG>hZ^ubYO˳V^hU˫pq!hyk|:_X,2 )k8@i&TBAA @M`'RjeOmVOfeKѧa g`ǣZE).|6V?'#4RgʲIE?1t9o܉/?5ިs Q=+kO?|{ I .2gfȍi64|Ya\)RSwsN CG+C[v&4qX 7Mzv0Č:ɶx7i1; U,@E%^a 7~` 4Aug|WqŋM)Y`ފ C cT >`PdjV'Ч${ Olȼ'{Iq?VZ{>;mzC 9f8BN&g#}!5lh 44PCN|f%dl 8㉎SIDmֈ 2^P.Kp9mşdZD;)^ka&\v2 A[oLIҩ3:bbɗWv%v( l8Qx.1)a1 Wr8B<¤e;bmofmv0'\C\!Zzrb+K-p_E%ȟho7iZ\+yLludcE0]qɣ=ڴ3*Mil,< h t0MN%| ̕e$o ._0 ~'q}N`'@xQf9Q>syL)7K_Fb`7|5<7<}/qc6;7s ^y~TN]\L_n&  ҃AZzpL8nFLaSsҠFUg^s\9u/-qzH7Tq}ԋv[R%0I0@8>%z3H3N& لK>^ՆӶAqvTbS$^H?бԿ eZcNgdbqMFZ_#E>zdDD+;|bb!htEiFz'DBn,ÞF5jҳ}ξsG* 43R;ԈnQecGE{`q}po O^%Y.AǸ$h\5 Q!\*ęf7"|-E &=ۢd>dzJM?x]~O0*ݎ#zk^ By53 dyδjJs~5yiHxiW(c/#uPJ{58 ogU48^°"86-;V"s%3aXnY3>eт1㝑Jh?*@T=0˶O=Fѽ'ުG|A43N֒_K4wpT>O+-$[IIXVSRahW6id6߹bZbd9| rg$FbgilpsnuƑ,^=RCsа,`"9dG\+zM*c~=Y4\4KTiS=o Ay*"w`%G/@<ɦ2E GDNuV^8k1(^Rf"ioisS8s~F>$7^yAAPxX?`C\^4u闭bf 2,9۴,ksYcIKUҴGY Au41t1AXx!8AW^xo;/ ne<Ĝ"5ϏQ\smVye`҆dtS="aK\I\n7=#6o|ȍyVMQjw+3ur7<3Qx  B*D9B(=~Θw0O^h,HpQMwD+S؊lR)xFwrG x7`-LgIm\5;ʎJe?8ig &[;R䡼r&<ԡ5 mS!gVíc@мyv)"1I] MвrhjBb>TOMe+Gdhb_hX?P,՞|V4>\ȕ0OL{J5fj$L9U-Bx1|xFO{|LY[>ځ4]osA)_Q6ʿsZo 8 %2.%KM+`}3p~!.A]!mt:%^ΉH59thLY@j$3^Xg?뜼K.+3G0#Jo]dJ/q5'IHT)S˥c=Neh %fcSLRZw*,+d&!EvvǡU_`1, \z0SZS! {-c嗁~D}qZ]hwHtg$,gO$t[A2ff3c'WO4ZF4 )AB<_}"W1C}Erom!'Mگҹ~3pyjZ_/AW}Q>.H $>1qq;*rۗW`݉q_/#D?sbf80lQl!0=fbȋF.=r*Cy3=3SlI.X35~ ?'!{#9ё\Mp\@2JT!~7Dk?m?\4´ʫp^!MAULCqoP%,E0A-JoTK[##~CMva˗c㥦#._l+AN \mmc?l|Kp$Wǜ"n]~Wg )Trnlc[As@ۋ+1tU?u%I/tӢj ;v\uu=_:ndw@xJOv=6]?@`ژa 2*ט ?1oCk ^uC4g+KYkt]]x܀ /3x~Ob_a0d ⺖)drx(9դ/y%f}ݭ?V;!; ڐ#ObFe姽*?L)ʲ&#x!L)Psǁ ਊ6#_qTO3)Ք`5tj Иiށ@cO N,Mh{ 'SƴŮd w;ek%] /J=t˳3\0H&i<T>נr:vU![!gǹx(E :bT#bV[ bZ~ۯ{FAMMߓ̂=/"/Ѝ>@aNI{+AC.>wK聶F5£-I/}n޶AEz߰e89"3i=+_WNr}u]E|&-E ڙg0dO";RZX{m4Ўle‡TH IpV=(ڶhm{E߲yw/4Ƒ 3$2zƢ҇ ŷm|{wmTaPYkuĭ=.04BJ)4}zڃ̢Z!H}+*5|lū`f7" t>1K k/zR%})+#^sݷlI:2X/L]])Cnh x>dj=rnN87/ ;KE]NeM)~偖(hyd SbECf%ɀ= VW]3A'S '-ŀ 0jT!d[R3aC q۾7Όc%7!B1(f C@}|!t[>(WJ<җu9i%XK?oԜDcR{04ȓkbj0Uz.''! E~ߗҟҪ2mw%bb+㎲. ,ݦVWVhל$̣֌=gOuPYs^Rs"_LϗC8rؙ'ivuC!> }r< ]UhJNL$P-Q1YS`t[V=#|;jw "P|{P6>{98⮧ aHuk`IT5.U.iSZ"wKKaHsL_ W7RE)pR~[X5ƌ%|c/o @klGQ!5 JAv{+ Y̦{1dJZLN+Uu ûbZcYb 2zG*_++N#)%r>22~*P121BK"Rw<|sR4 =/a~SRPqS\z\g7fLz~+P*,B<-+5/om#'48VY\ō7!pSuKmb u9pb!ʡw]PGjS,?9 =vՕ#6Z:fK%n'h{jJ6MUKC$C.Տ0$&sሬAķyiXw/hB4֍垑Gv?*wlp-\G1Rk3 v7=q%D6k Ү^~#az0.n<(]LXX7_Ɩ˛Q8.PSm#bW0!6֮8a0lqm<ғ_'N0zգ֦ĎՂ3?X$`AԨ]PɂD@-Xga8E9D1l"R'eJPq&\6';Ac ax5 gEo'7D'8V&`o#0Boq=2(n>A1,zv/))fţKgf1z] 6Zi1iIDqM C׍zw8Bݷv^T~`OQܯ2PdYnRD6X7Al~a+4Yv&9Sq۞[CX p6WM !xb;^;mF\%@0[:!9:ΥwA=ܠԉY;nYg;W&wff}3W)D7菽2gTJ8W9 (:c~I٩f=؛)tcS`scNgsC v!Q=R:)g~M'>˅ovd Cu`3e.VBZat T: CTiᎺ`zȊk܄^?bПuVږ;Ӭ>t߬ -YR˕25lա4HXN[mJo Emy[śA]@mMyI6d(:ծ˫JB0uUhW >Ӳ:Q~\80P v`s1=%y=G;#%=~lS| '++/O`u+xK!N܂qӳ{uJ5rĨ#v4>|\_4Ҭ2sP"' %8uc̭)F^"zxlAדTZrY^)mtcqYz0]C\;o+,.)'~"s2KޥѤHb+ρr1hZ lLSws.<;&:wQ<~6HGV\<>r90}g2Ɗ?wOz"(*1T#* ,GxWx8=*u=|OiHJP6ɬ mn,,^rMIyS\#rxbX3ϽuV\ZYRFv{RA,Lhj0 RšSWDz"'lAňk[XX< Nϛdl'Qbhe" o\.g?m-b$, cMc(eF8nqj]= cm{f><|g Dy9SLʖ iĕY&7>FǼyeMÈSo.)Sw< m tt̏-7Nyp߱ oN]ߓZ'.7^1# s}NAkJo;]x w'At(ss {8wwE)Ïlo#-~:5'} I'gtS0ǪsrV7+ DGN-opm3)!3d g>[zgEYYhdҚYe $G5~nкQΜ"jf:wxJp#4jǕg:k9i${wԳ ''d:cQ' q|YYd /֊a]!9R`V*[?d5aIZRRy;Dwj5HJaVfz9#U>6 ٯE6ʊ7fW~s` ޷ΉH(}=ީf=؛P z&abg5O;UpӞ(STB K႞Ủ2zb!p#j>0=۬CӴpHrElv1㗝hlW@Hsn쎝1R|FM1| &67`,MSԧwFӳV*pWt3L$+H/^oAC7(eM?X$Є=8a«DWv~m=omkq5 =5+!͙Lvgv!_B=jޓWaMOm=yY7-aN}Bקf7_ޮS@ 7A1T3(h66ŸH l[ qp`nn-uVNo4g,r'HrHրbwwA `aUyDGfu ieƘ: m1 GC_w!aBe*" ʳ[0OFKWEVvכ /*JQF:܀YH (;z=s`Wo dqݢ!i`Òa-s= +%I/uPZl[I@7UvThn CPVȆ|{ʼnFEQd TF=9?cc >='Pд * ?7.[={9!N+))Q99h-(z~WJaf )2?ǔ_Y#MAkJzɷ{]lxlh>pQ$u{;ʜ FN1L;\9 !ÔP5D$SM*mЖ 8ѿĻgS蠾 RC6'&M|9` NdDhg+ƎSXˑT'h/)w7vUʸi4v$ɳi_IX]8X%1Vlߦ7WZ0ڞ5[#-}]Vm],01fCC 48ɐ''1ܷOEzqy4WY~s E<ԫ[Cvɡۑ1?Wvօ49i&o)l6Zv懬Y*˨نĹ( ,Cy%d @YqV2'~MI1/z;l>1G"I̳Ygi:6'x󥈷5P|=P#β ;TjciV `ۂwBVt۲w7~6pwox@3cX}Sz; dylj' aF+6!cmT߱oJN=pWR#o@\YH#ZB/O})@M3ާ.!z@E7dLx1ۑ]?؟i{;cQ=K%6yCl26m]z7B+wH&lӻ9UPJ`_t젫2k0_*w(Ml<~kn@l_*+v(m Rkuj1O/@ģmA5ϸxb MT- .o~` lg^Ui/zT1?ã~\ۗnbqU5k~t3WW2TʘwArTP+L˲j>UMlc]"PV#UշVnyu9{DT^Gj tHP3OEMT7}o[U}JEM<36Th)vNK}9FSoy$ >ٳMKEnŔ?1wSUѻ.Ts?}2V6H6qvUz u2wm~rkUj5z'qW nypQVׇ*1;k3ɶGѯm(4FMy$=YAi5C?UL(Uڗ, 0w.5 QGA/[UlŔEU G[Cٞ{g?&\q֗VD;O:7VO+ gP$va.JZl߫NÇ*6_f1WTYokRz SMҬ䍱 5 hQHs`'6 ngl0śX=NrYT5m̗W~R!4P€ZVR x6kŷ xbVŵ alfŽY뻩ơhEC(քV(ըfe=3E!cV=D'h|СƗG~6xJuPj3AXlȔPaӰ'1 ibqHZ.fۯWΡ0vv^W|WUHBɯA28;ńe#MޮC}cYUK[&S OVmz)j# _DfEe)6=ᯪwv~4 ֡}7UԠT+Ŏ>a6w _[L2@^]'e۽.dQ]X"U,M.) `qTvnۭS9zW>l ]Г!' &UuAH)Ђ[W*[Cыͯ wB7ٹmrM٭/U HmqڴIƙbQi=ji_jͲˎo8oّ1WrTЇvb7/Cg6BW7Ue>zWTۦ({mbٺe "?4.5l-Xn1"a|ˉ"̡>.rsBիiEWgnXD]LYD]1wr8BWgs?{ Pİ\\1é봚\!7SGcM X^=%G}4W/Rid|T&6EW#kv:Z"n=G 0J-蕚K´bdg2ʸ>[[tEld. [$;TaiZQc*њO).R SH/ee~ M4ZL5]M|@'5["T*?aӕXcGwre8O?:t%=luKs;"9/ QO]vN~ {рZJE2vOT {nW(Nvz+%=iȗU19Ek8u1kf5uڞ]9 )Zcc#~O)FJji/sm_iON:cv.+ g'cfk]^/JO'SGȥ#IDAlԈ:a=[4*#}U`^&ՆAQFYK-(^RTyZu1]u̺]dӾ8-<2HNHZK=\3*,I~Ȥ/X!z\͌N٬˅ԉEEh0%QBuuqJ8Ζr|+9nh9K?+c c?r_sT~ƘɘLF: ) ӈucyQ 퓮1quD*[LAtr*eY%u%MŤڬg (+E/ɦFAEHѝ]}X]/]q"mXYeN ``bOP +}nH= o۬viџIŻZa.EgVdS!zg״`ʉ5/#'4@VydL)L؀&mL| jivw7QwU.V>6tsZa:3S쐉HMFH䪕s)G u{?F1݋B@Vs-:^Mc!,IzE H??|yxiw%xx4qb#Z ~F EW5퀖>{w;K[)y/R=l#D"fTYY0d0Wٱ g&[ժX O8 n1jY׊.ޣQzyx7Yi05ߢg>^_f_r2-hPLSQ6d9`Oh0{ 'W4K^e1h>nǪXHMe}آCZjxg'mE`f: %@\kc8b2 IQ|^w,L?ݺݦۻIjjv||1Vv{aEcW[0Xiɖi~%LndaqOm_ɡFs@I-Wձ8.m?DOJh>IWDuv_p(%HB v]L&b_Iida] (jA;sa[fd쓝kE5K`˼GW/P3S#دc CW nd Rt zi};/"GL펩*oɸTWU>C@5{"Wn$ADS},X~./ך壍t*}G GՙT2~`g3yjK7+ th*f˩)f j}gp!~uK 41b\ѥ@ tp!b+;XUtWWq7|5^ --m&ۨ2>C}Th"?bQgLRDb_Z2]'Sud S_!8q={h m|l;uXUSAMQ`}3]iK>B#YgzcsuyVl0:O>.0dhEKNmIdOd;X'X랼ɖXLJ%$y24ҷR#m|RE?mZbluJbÖF` JFr\c^+L H.{W&,^C bkwB@ȉ}bpu?25`hbUp='i@! , H.in=46*0P1 w  I?l\៧Jl P]Z.dNQv>ơ c-оe'X72)A46`~j^!)\C1M>J ؘ30Abp_΁ ;ff#3FLrn2&g1e}P[rJ.[_Vqc<_ܞJhS|ta{ L7pU=&5.W'<=04#4e"8DUQsDC  43,YW~/~_Էo-o2⁰ٳ\՛|MvK; $opևLfX|WUn nTl*3Mq73=h%܎!;af6=?7.d֝\cQYOiQ!yvu]xi$[$W}g:Vߋ+׽U˂o )Bt/#݉r Ju34~ɺy~4Utc off9a(UEfo L3u)Wxeq|me,!ӿlV-`Yw:+_9DU\A#*ψ ,/+ApVz:D[=nnixጯYiWY̴h#cxW]׋f-ňdƖ|@\Su#V42w[_KÆttcgmV+!_! Nݔk}UӉ_߱/˟5P3PTcWS"p|AS{Ց1k`HXvH^!Lʀ{?ӹr܎e&8Zi ;3 EszCj|eClttJTiD6Y TX(7׀6rJD\6.hlU֦Cd 'mF+{%~NA x 0l>l֋jIwMc;k 46h>mo.ڤУb8[G 5fcj*ej"^?(*3!,42[qH%"='WgxCݑ1 AoZ=B=ODM%UgWq>6z&E:3Se9+މ"bhlzx+ybiWq+6]`w饀ߨw7M&. [ @ Z\&5/Ժ ў eT}ҚO/ hvQ`/(Rۇ2>pz[? 8aVݼ12`1 |"i`#:ےm.Pv=gR}ҐVcJ-&Ż:vd'YA:{/Iݛr\iS*,|w#kX& &4,7MWu177ye#ldt,~{@RҪHPIu#RG|Ui Vg*>FFW)v*x#:YJ!|"1>a%m_~CT&D^yU÷m M hXߝ3 t~Ď>Vw(6dMdf)/yǴJPr` G#{HӭأNu nxMQ?n#3s+`M]&ޏLϣ}_W:(-{Qa'֌t2*cg`s 'Z?A%L鋶O?}GHF+6vNdHvz/к Mq,9nu$OSm5rgy\Ղgzx7:0W;?Vw(۳},ʏ>Qy%Mi<O_K~P՟|]ng'Y:?.$K!cjPdt,6tI1cNV&W$&IOL>/hԧ1qٵ [3;0 p2O{tW.% }eԐXw~qտU=ʗK1Ti+|&]TrBv16.E"LUDUͲWbH:uU}ewяNn!d3 <+X{ G M&"j@JxCݯj1AwЖT-7E# 􉩺#/ g̓?K}3VnV>ȿ~ʅTl98 ϵx^Ibwch8ޤ <%H_6oXozOPv4tظ_N_UzY*層<" @!;U !#1p4O;} OtN> {po-b^Wk02v&w5} Mu_14잲ᜩ%1 ,+^hѱ]ok.UzXG+7gO:qc}],#Iwn(LVzPZUABhGw*E{i[i2>$$'#NFLu~64xv#ԢZ&(ܦϼ/cxtdߑ;pN ˦Ԃ3c*F^jݧfdD"G4째^/Ǎfzy 5|"HI=I}~v^h3ahDzBo=(+YId'[ p?fg.xyJ >\_tuo-qCТϟ)?3@g ajI*TՓnF˯a}ҁA-;m+=Yͷ4"="vI N@pRLTeJiE: 3a_]/P4醿9ݮ.):ϑEZ aݷ^Lcҵ=U}؋K6Gኸ|׾!Y^TAG }Tv6ձm'^' F)"ɋ%jovŸ4wua(v(1/ՇuW մG7Y' nhB! ObO"4f::c6qq^>:T`#vQB?_4>lr"V2s=拹_`Զ]rDr#sˆ0|ҷ˜U=),S;}N^ƞv3`=/e)e)rS+O=3y:'/æ_meݡՉLM˙*zu-U7"rXlcppbluKhɒV)["^RIrHw`iCdN8(% IVǃ \'3R(Ȯgy[SW@.5RZlKE |ָ(,D{7渂݆KK8¹>qXY&G]um%NrC̀S[l̬bA-#Fۛ]әlfYUl>lt(yA*"\6jq/jېrȆMrr`hlu^@-}-ݍs;H 1#c6*2[9k%$h,in=;=6}Y!ROpړ;5vKQ} rAۊÁR +OaRdo F9sKIر 5taaO {rNLc c219Xo)* Ao`}TlYWE 5|H;kԭ`E=m5\>olhL'2̈TVR|dDn'6gX2JS>vv,a֘"YMLⳘ_u1EuILͳC`f6sS槂ut?^|oo? =М[rŞNdGt][5NğDigS%!G׻KCN@Cs{eGts T5S+69Ҧtwx##Fq30tksmm :n;(Rq|қfaJGŁD ߃g ԅff$ Kτ+'^ ߒQ!L8M/n.r2Be%j^]4vJfkV'f~ 8{[) t?i0^p GƆdGЖH70"' !9JN5mfy6d?0φ8p2XRBHTN>d< ;֤BbuMϫ ј뜑.*kya=1ȼ[蔍d v {O" 6i@P mQL2x+W1oSKhE^jj WFMDJ2Lget%lza<c8?"ATl?/CTҬkqάڢ3@I4`5UQ*U\|_0eR<Kw\|$Fצr{єHpSVIUxľ&IʀQ7&N6`\Z!2@r!0Lr\UBMK)I13Ô_**eL{GQ&c9_x/ =, lR MVBA% Ba딠9<+_"2bf棤fW!^6 ѧ7Sy J]6TgNW)KtGt89I&- ^صELtZɿqiH8p35Qa9ł뎍/_{᤮rp%.l.g\/^<^[j`yqh{ 71Lp/R;˨謼 6M@C{POhH' a(8F߁;X[kmu[yEQ^;%3gٜZ.^zu@DmfiQ5Toe'~Rme^#戳BoA GffvxU^EbfD"ecBppҥ{ &u xBI?_znMR0RD4^姱{ n\̝M e^y‡a5kyYz2fɍ*smsd=M4\O ) ҀMM0:!a"ØTQrЃnH{[քZ=+ebsybc.mcZsEm@)~5љmCIжlꮙbG?%;Om"+_b^T0fתzU `N5ʸy^΍* ݨ)x?}*>[mkՖ܀^Wx=AwQfUuJ>xh~Vrqf<̷ό|qFA)ǡPr勻ɠdgCC{2k{]qۋMo&-nKMMV30s[oQSf M)m8[(f'(x{2C#Jy C"d3c ҠކP{Մի0ŋ0K.أ61H0,. ڄq*yC`mwFIL߀8 ؂Ȗa;Fsk4};Q_ڢ;]cXWӶk롛0}Rjbj|Y?Tq_k#K $wEEe};>nVwn< sԛW궋Jۓ7>Y Xu* eW$\ )ҁ Muo&'½ cc! >h3)!iBx]~GCvlA ?-P{ۻ+xJeI UBFVm*$ՉDkP3w8&*IɃmn;l>1(U9BmY#-g~ y147-B18"SBjFKܺ)2 =%J7V =pGrz*.xH\mL+c&*,rK˪ 1oC34Hui`Z h#ͱm3|Z=y}u OB ql\hlob};?`}JĽlInӑ^ɩ8a&s'fېM8Bُdz~%{C\~i ɌYrJ}UraΖ`#uh )7&U[hfӹeٖ- 敍sE/"ͣRgM| F6,E*jj9˂CaJs3OoTAI~>yMPjLWůl2x9Ls!p4n ˴Rnbal=g=g%9+BuBuZ.SX G ךKɢ%i86a>C-!Cs+ r5њ^q*,Q E؄#>]%3SsA5)]ZwaYZ*<:X3UJLSi'&=p C0֤r#&ށ?PS L |#Yvo`M# 8FIL+܊oU!P18vE|EcۦJVC9C$nM=xi$nMݚT5v,(%sݚCq60,BXWCk58[zZ'䮧W3hN/6quPmhm3l,iB+@Qf휨6M4Yx9|2 SvIo)wK)Op/D335э}7=he4%w'u" eI 5 oD0oupA~W׻ PfhEBs^D@P$_pƃ&l/?WtoY ['M dQ'iVFpO @=/O1|!/U?㒗jaCE4:_틳@}HUsAL` Xx ]Eidi{SJ7^A{wn'^JT g(Lds.8>cc4e7H.Jgԛ0e8RQqRY96$@AltUхo_,|JdH"ME䗷:^#H)t(j9X3ntxK9Z#`ޢ7oD*K0AWh[M#4QJT _1E .2BĸtMt]QY_WH(09pkix2{g_T6S'3p"4LI1t(_i|Xg}Opҽ<tcEU"뮙6:8$vln{'u4eܕ=?dEJQ2U(ל'7spWv(rي$b)MLV8j ^(Y^43 x#j*ZyHʼ)D[ՠא"2UfIOzt "]#2xwp:S+5 y)^͆ʫ0Nͥ /帽l֭8Oh$l?V5Kխ->2 ¤6NhUj,sb3+j%Uyg@jRcÉK)-pię`f^åi'J3`wBHVA@g_+Ǫ$*|q4 ͥ%`Z]Z7KerE鵸եR(p2i0UjKխ[[eRbw}uNj72h%A{d?E3#KG roiM!ZU*Gq T9U /\,fb 5 ʠ,, OLoEX7;qT/˽jTkX{z.pb2Iwե$`~~2e j#UP:@3A7%\L]GTsKGKeM8FP~Wʮۅ4sH)$e`R[ T+ʏtWU9#D͖m2O},3/eD8sᐚvoXVbzQ7%e9314N܌9V-n03sMڂPOa?DӮI<_xF~nO,T&a[% j~xœdʔ@d]Zʐ|ib hxTT TdeUY֤Jɾfsf`cV@IZk=н &n56^kҙsAhc+)Q7p>Y,^A2VAHETdֿcI)ց<Ά#a3 +#ۺr意]t6g.b>M.xգ+ !zb,ЙdA hj`ǣ&?WCNuC|[WqTII< T1Z\\Wg{/ )iS˹%6 y9TuӌȖsl J&}wZp,]`vi2QRnTURw/ ;'+PwJwᷛlv,$K.߽߽Kw;ʭl7Ht< A}wTTCh?bzɱ?.. avf} WG3IO'OvaZG+Kqjȟc}kT l%XR(c3|#^ ea{Yg(iTLQ A )4x V848xk_=0MG阚>]}nkiϵ-P(6 ށЃS`Oל6{ H冸7{]A1t?Ȥ#/({#zL+]nѶIg. z6 2nnq0,gxX~2h;*4WH)JuWۦ,nfHÜ" BiLC0|\KK%dӓp$k$❳j E!:@&Ѣ-OF.rL\?<:խq%#K U\j3'+ʄlFaLˮ2?}JRt;ՃHH%c#7 76  }2lpda[q|/ۢsqd^Zz#\iA<)2$uWS(A*KM pjCe ҁWU'h @7GfkwIf WzK pY^%1S>x5(Wk8ګ 2]s,ש޻GoYj=Or¡YD ;J7I{{9o sCPi}ʙl"-P4=V&bAU;z{}Z*᧩?*wE OGjy2QeQ2qdNn6R^9jְ̯cWa9Cy$}ǭ7bz[{<2Z5P#+?هaw;B~-o~{0_؂۳?N*qUiz) ZzQDaYO":5lf-Ϟ56=[1Oz b/<^-Y_~`p7dP#l EJCiahu=Ջz#=xjمp 8̀5 CP#q#W3PN* pg&2ȟU@= ɇS4SwQBoE{hm9.#ԡ>s5ԗYjoN Do=D/[Hכ> :tz{Le&h^"*GL@E4Oz) g =mF*+C!.IEWdfN:92,)aU сA0h'Ju ^ OIol;<@BxSߕj‘_Қ@ )(U"S:&B_1`њy9#3X@ -ڌL hi_=H=DoՄ &!|{RttUqP*v+]^mD&?C̤-_tJѣtUbƧ2dtJLޑ qϖg 3ΙoCVc(o8}itbv7&Q~n47HtjkPIt(D0&biZ*O_UU:S@[PƠ6ZXK՟>>E 綈Jғrven\AdH!mV߮lBj&k:&ԕU ˪ޒɣgsGMt>> !Mzuz @u1S"@Kɠr VB蔛i(baB :,ZܑDj4ڄHHo_D!z6(݊ 9$ p\h(/tX!I+D0 ƲXe}SU8RciD5GE~[Z4vBdA;A_$a* .ܘ czl{6v QlOf<,Dp^UqzLA,v[Hv ľI$8*}s^P"0e5L-nӤԙҍI=A'k Ean2tq|}$нҠ <'`)1`Y^& ܙtrge<Ѿ.SwfxM_[N'|4s4#0k';Y.ۗ%2a!TMԜhVWy@ZˀYnZ wk&f/+]pi!jVj*^+Mká<`3 D$yO0Ō]Jm:KP}j\_E;<*v[9c%juqe=aTC:*ٖgK07gP^ݝX3:bl5@Xsj&+ !ÊH_*AǢdNa]6[`267A\'/9ɉ5ivKPK Q~pG)BhPooY!Gf:ؿ|k,eLa(s!O<\lgE;0h(@g37k./ :f34L ̌6YtQ%! ŅxB[;8FxP0hk5vܵw8)uY;t&i<K7֤Za2]t^C=g RmpBᆎ#N8@h'7 R8ʕ C2uk=A 2bfq'q ~)RL/Nхᮀ9t d&;{'@wަB*TY屵\,lЕs$"7 7=½dYk+6$jo¾#XD( iC(ьИi9޾yCQk!P&-]=y*Wc6dU@t,|>)9b_xP)tlb's|ͺ&)]/Rqn&Ry>|32V3 "vF>! 1ʒA=d:~bx:5i#Trz-XU1GB-:, mplrgUUP! .Ӽkhqe4ov4zHvtQЭ1! ƗB,EHL|g˶Nr i*pAͩg<8%AH\ %&WV=2LW)fUTO†TMBpC!=PmS\P?%@(SS*y` B5蔬t8kz:&iFtfKNr^R pT,.23(L][ZWx" k^p})>+/C*O$^WeY;+6dh'HA_E_fG%<'myi$VuxMnؠ"EDI i31Ӂ!9xQ\x7Pkth)W{Wԥt/'.XS7 kGxh@KF2c<`Ka2PE'Lm vmMzgop| |hrs;9AY[C,L15 АB;V;Xf0 fv"L Uo]}k< f?zw_3XO[_xZ3<C@A#&a sSX7IPIh'rb_:FP耐mCs`36\)Q^A5` [L68F7=̈Xap vU^ [_:KbPD]2J_" y4v`Ms9-˓ =9g Iڮ>jHfrK4(Z*-]}Uۺ˾"!JUUI{b"cF~`Ǵagy]9vU%ŋ^ƄC;@e{wn-C)fIv-SǢ|Od0aR)UʭӽuUoZ: ՝/aPl*'J8_κYC̺)6 nkfu[37LЭD'|U9NzZZ]Ģnr^qou6px5IhDcqI1}h=G"KՍU5GN FfE#f)pV724`S Nܜ!js@]6E)`靇t `;қ >]QZq\,UٺRT$J`'7z⺚S`Y4E6*cȪ"7_J/5}7?Ԅ؛l .PcQ΍^G)&2k6&}ez2f9qogtn8״k>|5a̒P^d<^lvZ4|j&6@o1wGv@C1xTFX>^q71ܕ΁VR+zsXT~vѴuWo!wi6V-I՟J^ 2ڜQj j58.kJJX\.Cy4h6{_K>dHqV޴ɠI48qYy4*.!V<4:~p@u3[@NXX]3o) 3I BN>3gfOxHc`p3|2pXg0? :۟/ @cgT3\ݜB4k&rRk[< 089BS|gT{^j4v]#VSes|(N0^ Z9Ϥ"&/ " +26o93Nb$Rx/dȌ F5Dۊ*mt<yl}k(:ObwdfwD-uCCTCM/5Ksq%jrqz'J `[Rh8'yl 9#c FR>N^D#/6rz4pnGF[UEK,Ylq<\q*vaF+uCXmCx86{zM{MDGdFlނF 39`$5zҰeͲALoMv:U@4KvI(\eW"UFU?^P5i᷾#$ɪ EGR+hr|S TĨ;]|Ә{/̪>S.zAP-fאҾNҚoj!uC/)2J*_p&)EL A'NAO , s )"n˯PK>L'_HТ29S}FʊUZy\q6d+ lۋE 6CGkGVWǝ4lZSWVժV˨>BQ kpFʇ+<苛hq;dkTnoS4Q$GF̞HK8 |(~Ojw1D\۷t+v硴X1Y=f7&NjUW竚?~k#bԢ0^\7VEK˶5*Q~n)ձiS0Y7΅ )@PC+y~Ѽ(NqjVJnL8Qm_D5shUcQ!T J6hjQ~m'VNiB-S-uoEfOl~mr^Si8iqJSm=|ٰDzܕ 7+y_l<T%ۋĦkpzvjƍf7o6k :cyM"VϠe,s52}Þ iŝOo:mDZ7!fǒٚqz!# "h;Z8J @Hx & rF h;fa_wG薚BBP 0v˫;tL c8l5MG}aTzi&1Lpin5ki5' q=n=!%~2%zr;3Ľɝ!ʥcɨkc 0ԈrXCMkx'vnX:(5t sY4Ȯ'ZfFJ,˰/r@\ QK(?4h?;w=ڸ>ι%]k[1mt-M?둵rZNpOV8 ZctSFdb䏬,Gzב(2>k)[O*1CzЈ\qw~\>(yl9_v~1XUhD;AfPԇ[ "[~*Amk+nF6aB+&.I; . 5[XEPx4` 12pAԨ7V[&sfc !X\|J2yUafQ.}CtG–dɔ S=LW\1_-|(W3#Qc㞨,ʫ(J1#)gČg/tg =R/D=^B0_6nAS X!x :"eEP@Wt;L:-67S@Ȅ]$dcc  0Q#OB-)!;[@4H a7q7Ɠ}AFxu&d~Ry!5.jՒDS}C`wg+f8p{z6+8}"881PI چ;].>+*-gcJW` ޢZ%7׿EPB@םOFR1* Bt᪻y\'4%w2sb׿ݭFHn"œV \ !C=AgCM6ZǽR-Tb$& EH=L#wr *P~woiG/g2Bi"!sx@'{Bv[vH y&cI1*s[N}uWH:3d$Y^`EH1qzp?Z~L ր')NFob'47;LHɰ(vКS{SIsSۏœs*m_c@yYucsAf²Uɽ˫wD %dž|{RP+77@A_@J/)àv?f ʋFҒzmgȦJEL ]޺z% ƭA}J ."zHeyڙH" `,%C 㯡2kwW꭬ YY4vw4VAW'݆c+Bx7"H_|#tQvPHoI;N>B1w=.]Iyt}phe3yQ(UExmpQ֟L U6*r׾AƁ SXx2Խ0P0)+`9#ȓ -UDQnd ^( *y@e J!)|tH:5vh &)AXPkFm)m]'6$PK{GQhOAyՀ\Ln&`sP$' YT镎\ TqhL )2Q ]4^t9u̝ >%)xEv"XYHWRM2N]: U,e"82.IJ嘠ecbm݌- [(6]Q&0#1)IH "+woMLkG L5\P T6!ND>* wojs)2Ʋμ!B](L74h4%tg-y Dc|.\h8MXh(V0b5G!Йh8WD* q i\˸.;2_VjMC ]#桬5)7Q TPtC 1z&9l2v p8Rb꼡ٞ1*@a~Ñ } b"w>]=qP}K Pk@%iKAfݑrԿ۲vL50}_>_KO>AM*6z[|,$>fR\GoSƚ؎?>Qwٟ`*}}TғOw?w,KDӅd.=A?-tcyݳC+H6>1 ދ)DHeTAKz]$)yT!i:V9 zkH67zlКnHvs / Уy4\4q&^DV*Ԋ~׃b!wh^CCa :$Q9?z;>tY I-T\ vn7 2ffȌ&hT7Dg.,9AXIm^U҃ȍy-aLgY$?&(2vب k 5 Z4,¬my.Ch (ElO.XWDMz;ba`H|,{Pv dP>HQݘ1JslKұn45^A7!`@D+AUaCڛ@Δ6*ƍdh+P>npV:F VѼi8RwРHX0?A$qQ0VъO̳De^>۪ cʐQ<{DhB2ܒǹ CиQa^(&,Nť@hbҤ %.?'J<$wr$`'@с؋ko(x ,1A jah-߃-#A=fa"WBR@xyUHy>ʜ`7RaJg`#/HQK\0E\媢o5DF3T;4d*vgAWaDIo|AiLB z訧x` )8 s X4%j]CzȡGk"Շ;]gAS*"`,r\=P3c@7^.Ԩzu]޽ P/ǐ7XC@Eh_g`[XtL\pF8MBM>O'ޘq@F {}nDkWxG RY/@ݣ]ۻ} w,'98{@Oe$ hRc Q.=O[$AU:'u,XşS - H}+.8+҄( vh;w#: _et4)_@6~ !F*:.γS$l .M%v2c Z%jLjDL,.4xJJ#8 =emLznʓ(A d3tI=_S㮂TKH䷡Kͣ;/>[;>~z#}uZEll]hL8nIn$< ;=\Wt~!I/CK Ç"{q]sqɚ6j4GeҎY!S\ܜ2c|fvrbp(nf ]BlSrbq]Z> kC.h5RVJM}9|h+e}cfH}=9G OY5?|Fw?='lo1<ϠYpbٯ?CӰؗ P]^ `cBF~ n6×k <4nfzIOuCudv5'Ұ ~WhlP!@x P,Q!9 z4 *kkMV&k?jV6(BP}Qs7'>`%bʪZ5AQ*V`H5%.g,ݬqUeqtS=`軩Z4>6DP1dž˔>)e] Dv_+'#Nho7]}p;4(2ۀ#ȿpz| n@q!56*uʾis]ڸŠk _@Z&nl pq[;~w?O5$ #ܬI[o!'1fan5帤AnGgM[ bdɢȤ# P/ MoowcxK/Vqpu8>d|'Os)3K^q_n1ѠBcf8Q%N\I0 0byTqJGdmndj57թ:4jyEV+24\mZ)eqC?8[Nv~ '43I7.%DC 7?>;jƞAP˔pI^,H9LKwFX}2Qd3o&̎`}葜!oBQP>-}n&rxNRbC9.~ BsM/4m N/y1T"&׫ En}ihe X& F.tk~4p8>C -~M9ct7(V]. 3 ~*d:&;3ι{zauDE|"!?PK1y=@#*=sdir_a/dir_b/web2aUT }%O}%Oux tk:4G xU=ٖmUJt""Z{WF,Q| :u]4udyQ~.ݾr/t-l -|~e~Z,wz2r.|9Yp[m=tKoEut;}(=aime(?K sm{μwS7.pǰn|*_OhdKBU޸ojaQjj뺋Eoudeݻg9X٧n>+[㱣Oʀҝ|2}%[k}xU]m:K[7w*۰aQ7ohcԽ4c2Nko?7cڏsA GJYOs~+h/eg\ql[&lDzvF~=nƦ8Vff3\{O9CUh;ʬц$q<e:6طCid w'#^I}'M3mn'@5kSU%ѴAW[#)$[*9w+Yi&Nך~nj^[V]^Ĕ+Xom8Ąqm2t(ci؈K8-S{Q>AayZ'^O?xu{FGe,Q̘YmXlWiZ&y?ji}Ъo O&cOeobPy u=m s-x5{["ńW[ayl~*lɵ5d;Z7}4̺cJؕNwg45&Ji{aAbL{_cfjH $Vb&^Y#ȉ% *MB>ם1{r]Dl)-m715n~u>ぎB&S+ZеmPdն<یHe6\E=A-v;k"*[1!ftޱ."z`]G _QRzÐj%0>z[7 ?C*<.-EXZ]ϦU42K Nֳv[|uaZV-P8X[ǁj`BuP_]MB~|9n7h XXO=>{lfD{Gu;$;f۟cӺ۔?(=Y0΂]mUdb3Zfh¸y9?T2*ķdʿQ":BgInZOiڴ=Kհ<_ƵZ:rȕ>ᮯhƥLXkxkT6^3mlb~a9ٛ7gi ,݊3ʲCTW][37_޻_/-Ra`m}>Gz/ PZ{7&1eBe==o_z!0|4X9 䢄 H[bwb]Tl9Ve{0 ,n/4oWZjhRl~<cڊ̚ưv7m>rIbliXr0 8X'soug# p!/2nױG5c($P-U//kn=S< Ns\<\P!xyzg?=?:ݘ0jM(0b׎A{ThJy~6c3[og`)}3*2 ,ͥf6[ޚ7B[Am[ۜ@ku6٥6,O9Cf fwlʱdURC,%-R BG%ؕFN}هQW)&UmAc:l6cM*d?eK_|ufP}uy:AMxBЖ6&LK?9A*ψ}'V%{Zϡ x'P4cma@KQ4cFd47sr{̤öXnɩ&["5XMf&FhpVЫ(wnfūK_2.(mq-wMw+ ufPGv K4Jx[<'"iLMrk3ROa1sK~+u1܁l!lw&jcܪM`(-lk!Katȸ\@-]h5;\ՁT%&_mlk+4*hibѮYx7 ۗ ccV~1zcϾv؏ 6u(7 F`+y[=tDbop|tGlFl/=Wdwߍd]˥(v!a#ԯQ`R%C\Z莬\ C?gv N%sઢTcH5aS5-8R$_|ⴵ Gr-yho a7p!);~YR5:%:VhvD%ԏM $gi6Xj0Fl+u![-ԆwDH+H~t|42}Aᐄbjl3_W_0 S hB>Ӭ\l,a )"BbmƁM$ [G7o*}D)-x.=krAeƸBQb,0=DhCcel*~$`2RNK-h޴ԟ|nĆsl3nW0J"PIB[<6m$ϟ?cX)jgJvK)`5uQu?H.T {5sK~Hq!KSiYز&^Y4=LSk3؜~5жN?\%=LkA<$5W;3+͸p-{_*L*qui/R'سc;}le֧ߕ8uK+Xb(&_+ZOSL7Pu-|mJ(=ko C,.pIЛH.W]h#Xoh~e9N,e3نHX>kK#+ĩZ 1vmp_idK*vjcvğx-LbɺH䦽|b붩f >ƖN7avfs%5ǐe-yKkc4u|Vq} Mpjjn^E/8M5k)x/ YV{RLٲ&2Nhs&ûI&I웭 mp5u-װi&[1dCg|eBB#$[}$X樂 WϚJ-vr TedF$ ?ze&?$:FPªQ]W <(au펟st篲%0xE>( qhyq#]n~45WA "<X,t\plC uؙ$é )xv{fM|$'z  )C ~u:mdYVLș  fp!2]hFmgk|>Q[ 4c.xPmz?j*;3 usQjwN\UYe)69/ڣjJB{GGw'|}!XdZH PÈwEy@:qbF3&>9k̺^ÝϜ>fny%|+茡Mk6Bn_d6T5&N La8Sb |$|$a>.F}$nHb7FLNG" }>Si޾+ y\S|UWDBM%ozV .p^vu9ȸ+j'ɬō}ƎBj|R!lƼgn] s1EaWHr[IEQ3kVeG'ۢIE'>xKhǭi>l` )||4n/$Z$1NP9פ6,2OHR}|﷤_c|["oVxlx0ۜl<&#U42yYz`ϳlp2mjFd( *D[U 3$,qPKw1vMm@=˭}n~>D `/ew#ʤOwNNyrqb~X+ M(Ṻτ&VoĚ<=;>{%p (JbY1>ƋCwJx@c祐H-F}d?aA>C!rSaoKq;Sac#"F k%rl<=FO$RBL"''s)[spG!J-=V\BBϟ Z-}9T)o.Vg"qe#C#X] b}˱ F<$Y׷r-7GtKȟUqd^ciZTxl p3ђW|T aeݏQ2vŶ|`54A,kf}IiYږ[X؛3)ۇuArHbl) L.j<*̏/a^;>ڎU7,n'dD<ښwdGGENu穱p2H(.ajKz=XVbu/l2FRx=gWIn7q3uyҠA%!MY28>07EՄ5/peH-p)c>^7SlEl`8s πEeX!,(Y3$4/9\AQl[*3iW1iõ5%P vMG n+,j_^.OrmK[+tӬ$oG)yӦ8 R7|S5& IFSf.H\rI~XOOB QO^匹@셧tD%ȹ2E / e ZJc"M?ٮ(8J6̽-X$<&s.\5dUfh1oiGA|;.Wv{/ =Qn_Xq6k}כ[~}{1'HŗpPS=mAs ѕ {_7ޠN=}kק .׀6/ƌ#) \.wؖ\mAnB{ʻwe~L8+R<^m'g!|oT.Cº} 2fh~Vz ᎫWur?#gmJ"czH}fW3 =i7=pť锵I OL S߅P}ƅ_5AcQҜBՑOH9}#>Ѕo4 }8C BoGu%0 zH^^K&LVbٲY U-`Uca䁉x_0\\HF Fgg?{V'sGۖL-kXv׮ߨ!YA/$φY^S~ڑևȔo|ζy|$^M<" ݺ|ůXp~ltޣiy>ݻ횿'.rc*|ܼXׇ330Ig4kS&ȳGĚk5k.ic [8)h`։x&+#|8ʽFLC'_Z $OR0O1[~@ 42f# ǣ)?kWZA[(5 2A\O:\4J`h1 +;K*'&壎Vb0bׯ֡ rdX`K~!} ' *RǍiJ`V:@]3OjDUmoy)S צ=D =dKoS{G[acED{daYtT)c52eAMgb|\>(Rd#*G o/#5$Ե_K3?elJj䋪4u | N&um~)?LW}TaM y~u!>w>г[ؚ95Dja] jV)|\xӓVHp܌FawLߊ5r|^m/ergk&Ӓeq_;q^G듽41 \Cl 50P]؈[hqJCj`>=cU#nas"c9nv '#g9# dŶZ(0' y%3~OQdLƤ0:䟉fgH%ɨzp(.zI'q81~:xLIp>!uO`IO\?8.6-=d,81 eJϝ+Z]h=OE#ux¬3_eGw&Ԗ2bBwSg-ZcKjlKB+=v4p]o fB?nG/8MO,r-\;3dhiy] !: S!ܪP 0A(.D7V^v2;MO_AheG݆-vM^PG W0cX,E*ZQ䓯c<k]cSxnm+Io p:hK~e{c|[pB8u`nnbJ <ҙuȔu\E<^nj4 묩7_ãi)ܤ(%/O"T r0ۿ>#y~*XYpЋ,Kovz^xS[کI3|쵆);YAŬ;eY6*a` XfӲqFǜ Bbߚ(VNspc\qDh **6ajvd-uL,bg#?C7F/- npukp% ·hlTz i`e_$Ia\}+, "X '/ b[[D۲_bC=򄟤RQW# cxg˽_:Ɉ[gld:0,q-gp+ho/￐4:k>h=,x0(dxHxSgȎ`פ k5:aWX' 3݉<0 ߙC^mjpH1x+~$*guH~BafC20T:w+)iL$zܠ_aF@ oX@h- lJ>PE$S7B[=v,{?݋66֫/,i>(XvIAqUI⎬qZ*ReBv/z\ 0U1!5VoaSF3u7ks8eJ΀ Os=~\@̃nmr{}h?M11ͅp>›7&[[Ltyp39=Y4 <$,T: ^6G/`7,bb9V!u b_oc=6".}eHև]NԅArpG{6'Hcxq`šJc Yp&{L$]eᓿ\q7's*cZ >:o8$~},~aAECt-8STw+A&y#p0)by%x }R* ״*/ABr AjÖ[t@Z ܿ圅/*džh p&<&8]*|V,)XEb"aʳ êX ᘏ] \X8Ea]ƙaJ#p?Ѭ霆3֗AJ((co#j^h7'޻h%%Hd^3V ]ц} '%x`T+5̄ԲmĮӵ6c;aӰnpAyqݳgX1)-^,"wU܋2Jh8a/MP{oCj( ]Qhc DAbaiC෶2'(L,_PP;?a$ 80lK.Ϟǥa O'T*erQOzqm@{XyLS( DEtᨷo?t38tDc789e'O~vm˞`}DBun}Uexq֥kfO?6clMFUVoיy"4%U 8MWIJɵ|Q7[8SV rh&;d##[%aLt 3\oe{JZq^$/nd" M (N<65+[']י ^aQY^eYN VlGx;˺M+0$'ΓnɬUK:tNr% @rΞ,7S@M[CgIF_%gċPCkOK5_MB5* hWym}M1r[~$)2W/_;]?R)\T>zj&._TM{cLτf}NI?B$[-S|!SATp"MY #4z% h$H$Uxinjncã0;kiOx{w1φ!?mOH'ם;,H4"5?q CRѭڢRhl;/n$Ny2;MYKGB>q3ow.g/6qZsT5sOrGҎmp{:4EVNm b/CjaB)"7H:ܚWdhCaL %JK]ѩ ¨s!r >ppJq}ʘݞAuϻvn \mjob w2P>JqH~.Ì}@%r0qժHz>ڇ(gr[TqAa4"upk'u\LUf1kiDQŷiK?L  vx~cxuG5`D]Bބ;,nbrv|A Rqζ"b]sxBuu'( +S<,":f\D@o=|s1G0m'#A\M Ju;v:;f; $([%=#녅% ƾ Rs% B'/7 Ƒ7#4R\ewt%)y0Uؽxd|2@ +5k6Qzp=vꉴIq˔ PAY7f0؜)nxioOn=1:7=_j};XdciP79' @ErvrYnl.“w9t\^wG֏Vgc} n㜅D :6J:f~jLemwLFOn8 I8{3Hq\{k2^lZl4s8 r˰ގ>|դ-F#«gйQM4ù!KH`3 I%_#>Q_ i:Mhs5bRb*I^5FkpُM\5bVz>Ԍ 4QI?2%9AKb? <[wS=(ZnH ޘKS~F~l~ݟA(jCb/&k~莈w#Ɖ^}Xġ|`$c\{ UbPl8"wz B ~qƎ0l8%OCm :wLpI09, ji$}{Bɿ0bx*/Mn6d_&CB97V&7#(pnI!2d0YneJ!$x͌sBVBKxL}gup͝ޞ%faaM=I!kgzp(*H#ŵLy+b2rc 䆕P)3r;̷ gxZr]ϡӥXɩ2 N}6 ~  GEuDy4%K}xN6G4BaI ZeOMȲ`et,m/aTB{1Hm~z^y .βXb,1ٵp ~K8cE"3Ll)[(< yԅcEONь{󦬆cTșV!ɾʳt\_XB?5l0:G%`৥yoJAlh[o#aY ÑZ.^0_dͯQ3P%nQ_\/Jt$Dkt? ,UsZ/.=Ȧ)n߽ŝhoww EWBjgx޼;;zBy!VxgӬ=DZx֍6s7"j ~Fs7j&H0vnU '#5pSYׁ6rW0DžNU({J>rxw$tw135(:+#M4=y$p`qqHStLaeqdî_fWE׳Cqד Hc6^!=y{Bźcat]q" >z]MθF "4ȉ2yٔ]_bY\;Ԗ)DFa+CkÏ3qa< T{Q[ efY5[B!qR 臌vlxTqMߋ\oNr*J8H;&=O -b)wT'pmx1d@R#|pAw0nф +'JE'Ѧ_tFcɯ6 Vd?GPNj5;7xȢ U \2 jIT٠ p`qd\},1EFkW\XtO'֨aн}f{hDD s49? r2Ζ\eqDBXd19qe.FA#LMЦAGfV=̀o00{"B?Mp7]=0.pJ]bRdl$K@چFXV*\Fތxk"2 +'tħ% $ρa0|JǧEZ_WX61̡:h>{8~ĿYz^Kx ^d2l|6%2tc^Zg8W`&m "u.v-6"qJ 5xg@sDCGW_u^֊.Jۻ|maե)$+kCpl?T7ʪ5ީ7 &rHXs*ڑpSA9sV@>y.W'k׌&a)_pp}C-:SyxǾ=$rkhbcOyBBzƁtcnq̉]{#!% l鲛*^%peXqe#gN%\,(-o 7/57dBV=jK.ZexRoyϨe2]$7wтs^2A,rO@wW !10GH<*^&ED=(MMC;|n;8w}bP]H>+i7qFi y_Z0'ϧP3@x-tIkãš޺M"B> w.@We,߀Dp#(VS[#J+4n[C:㏚Tê eI=}^blkVVMкw%tӆC&F Wv+Q}aX&0 ZldCC ı#W%'?kr +_Aʈ |0!~u1 }UK:X@$^SxD($ڻDJ C/I rGvuNSؗv$y-5Rdle+c<4!)| 튈q3Cͳ8nńiY׷8`0dN* i:>C7VTzam BaL/ BQY83?]6: p!kegaCw5rdW$RS 7Wr4N %=C[e3Ϝĺ?5]V${U 6Rw=ű%AEd08WSj83$6.͎B^ۤ߯]c7@:P#\6-Sk*RW͌~*<#dؚꊽ[p-b#_I 3J$ P?3gqK"=A<33¿S ߼=x8 ;U鼮f6X햕Y-篜z,4۵?L@!>{]r+k^,O%Pz,%@p}wl z{sEwNДV:W%T*κC>jId5U_!aw_]vh֒GJ^)g=!XQ9ܕb) ?ZUy#(0 s"qN.:uщ֔\`0_ ql U;]AEH!7Be߁sh`ٗV6ו ŏ>O*?,UqS96>ǝ85Vq7w|͉V&)BIBBk.Ծ{N$bo '!yK`Id sd~<9(Yu AZ5"K,ް Z~UPpA+/`RO)Ox#6SK@a}/k?2w>xka|ILsz|W7 xᲕAG'#<ɎO$agI]`jEe_+XXׯ0 s%ǘOJ ՉУ3+ U}PUFDZ}~$W([?u+Q1]ubrȡcr,~A_2+]t7}4lL>P.#/}(A39Cá!Y\Ƒ:IJgIJ'y<& Z}p!ȳ3nAS88w]^On'qj/էw 5WCdt,:.nEq0W#[ôtJvy =wWiԐФ=&Vǯۗ)3?as-s1]4f'y{}o4oTmV Scd,t aQy+C$4,ŏb˨t cAHXa ʨ4+Ԧ:Rm&,.S7uK3f8'yV"{m]xj &b"YoSxu%VfQ/r,u[<;W7rLktc>HM\pHÎE"L{3_{u>GB[ı]W>ˀċuIn$>I.~ezM˸Ŗ$<#v<֪,CW5+to9>H4\iƂ0l\]@Ȝlmkaxn9lnHנl:6xtWfZJ`-H4F6lITo8rEq\" UL,JBbOøggc@\-ۢN qAE$56G9r)cT-g3B߃ҿH{wEȟ,y]UT-~hڻnƯ·>zGq,Q*Xf XLfԐz-M*A3ncƘv湾ൿ5Mn0\^>FaOifZ%h Fc 5Tf &m} ]pӮ͋V@UJaP&*ͷ6tb9$8&K6K ^`D7KE`$>?(.: DZE)o[Gt魫Ti`ul6 7s479&דwpcijjLmMG^l )w8A:M/])8GRu[,V&6`o[+Esߦ4oιm@gpA#ysVՌHPXy,w!'4".6(6n)ɊՐVA\ی]iWcDum=8S3~R#tlR?];n倊m&Ń~ʹXy]uc6J?왫̞( @g뜕qBO-Ԡ8aۖTgt)wY4FhFN _!o[lǽ 2Knq&D`fLpChh% -;l|APbg,R>Ju #!&/0][ISg?*J, Agep)O8r\ʙ9/l|[hGS7U@p"l)a+y-};?mvз X/C@s_R1>&ZЩoۘ eIWp^U1J j# )\gY\hpaeiGwK6NiCU9}8.r@MoqbXn~EoSvCNs&~ݺ7?oIaF|L}S.=Ҵ?mήe*"@KG eF_Mb KiMooj :9E*["*lx~}F}H8U>{_6Gn\޵qT <34`DŤWg"&6=@H}l )Mzz,B$EhyO8 u}gyQ2X."!TUNקkgjUF!1˦A)5mMүw7FNjQȃ6> apgHr7砪tiOᪿ]S7;hb-|~t̸'W{H; Vb$gڀ0*M=lA٭"}aX} 㜄@Ń`nC3v4yѿ8:ΞQzgQB:vMЁ=}VQk".Q8d7pc8oŃJ  J,YBft+?|{4hr/#CϦk E:~{u?'8e ݘc]x~Mfwd(8ΐ b9a%R.G<)Soۻ^^2|s/&yYɤ(NWRZ|&ugOQ s;~ԕӻT>Qg`{JLZ/%[R<3kSPrg?%j WKCMbK:@c:ĚeރݏlQ2"~~!޼kDST:cC8|ɏ&L/k&伾32$CX?@39%c+gxSB A,PLSOXXZ Ӱq_2 s##vF }MDjC{0I]NJ(u x|z=6ɟgg|ܽfM{k W儧9,*V,5UpN12q269 g,o嘣/ߜz( u!uy?wW}'ዎW}䛟 ڒV!*4րXa)!\;ۆ?9sU3JCg{9|{_'h%M*QVYP(c4ܽru6a+}vѦwn{=K>.,Fxӳ7UPx˫ŒߺdА\X]3ҊH0yJuw=F{3n(.Dep' b/n({UGlF2"etΝ0ĮUZ)F-_NQU$9BƯ$9s '}2E5(>Y{|%1o>by9Z},>ہQBf trѾ}('$NƲ4Y9Av$p/GL*VM(0OhM-*vʌ̭ɜ.cO ~"9m"`p{ Ը2qn"^{ jI!'oχ92f+r'Doކ&O)?MqXK. |ɬӢ ±d"Ԇ"guc#W8D=~ϴ*B*0T|FmX"T7QV&4 =Q0 fJM ǹ\0&l٥5"d$p L7 z[DЁV&M{t(&:x>eH'~4זs Rw\ [A"MI~!ٳ< s{==tEvVKDi+2;`',KD[e5 Y: 1m;u"x$_ØXtd;8n wv!{qՀw s*SEDMDYKΕd7ٷfpwlظWl/:|{A<ٽ^ ˲+jϳЙ|R h\P"OM/(%a4 b'2M&S!yA|SA9ͿЫ5y*wŠ#|礟i1GN\[̔ V28SuRK8yu0oED<ܑ2.-ѫ\wS k9=L"`d/MkPg"=(rזBxv¬ ¹ow:i$P)qwZX]_MXZ;0Y@OzTʇѲz D ~HV9drΈېV3 r(2&U?=aӳn#W-i[ IpV靣/$JZ*=Td6y>ydWz%B԰-}YqV7ܝel^1rNkN?S9r2Y=:}OpIBu狼7<;1DGIWGlu m[9y(ߡĭ,W50߀ρ$0Yqd׊9P%msK%ʤajJA%[HndGs&&4d+N׭6T懰z\O(smB+]kz߾dz>×ϕ<3k <|JmՂq@7xLhIc m5*w|RD#*8<ܵ=B'ƮqQ[Gj|:CRg<2:.fXG|!T\ v9&*3 18{٩b[閼.,A8y9Sl<jٓ{CLA1Kd[DNہrQ(bvL ,v\sW:p E$ WQ[jyf*uF#|z?UbG3{n{D{hØc,YH._yZ(C|9oUS(\_.J ²FuG>㳹eke0!뼷`ŋ"Hġ%Y쁷ڮڴ{1w1;u=8 ˮZmށoaypNv9ހfM6PHoղV rNuõO~Ȗςڊ^N֨|E !obg%@ uəZS }I9Bx_5Hơ?JV[XW2tGߌ?|b5..[5_+?}7v8NcDgXTkԆ|7=P瑬np_7 pləyǼ05E, Ͽ g噈Ecx#s3*%.| H h8r] %OI1J#@;14 X6֞["ȧM4͑iǔ4&pA0]-tRn/AƠ?y-.HXϵPvEWv ⛼!7u%OEH*Ǐ5#t;6MK]eB>twLV F쫩enxcX ",>bnMWĎ}-I2]v wxd{ܟuq)̸0BV |@cT(fkUe3Z AIFp}SHHMQ~GguQZݖrYTk^"qZjϷ7In!-@pQ K 12Q|V,8MKL W(Otzg>,8NBca?[u) =v zIK9{\Gi>EB~t딿xG7#O%=xQ_"d;|XH8"z14 #$Η:A#sB"_]8%A7,4s,ڎ4n@n%6MM$XwZ;@Ft/lܻMmFw{Xt9˸$@0: ׌X/JF$Td UeM0"|e7rٶ`om%FȖԚFāܭs`Iiwԙ@!g&zbQdYn:NiN uhCqJ_7q?&y/kB7ܻkK0QR԰<%[@=*? ~AN.~CoyNǂuyI}.XAambLbAA4MŠ!<8X jUyr&HM,Ex¶L?uߌZU0D9hKb#TJ5@ m?8 oX1wb De݁  `^2eXeL7VTCq~s }cu-c4xtf1<)6{=aw&%>SLYu˭oGFw \sKn^qG-,\F;훮#X{;xNFCjVrp1,hcǜ{,CdsSb(0N\CgĖݟ]8p[O6QJѱ%[}JHשN C]?šKUxBḦ́328΁V c d8H6uc!\7[t"nLD]wOdi.WX飅 gm0)QzR&d cͭt;woMXTƎ?l|h YoR\%B6}B/hղ Ekj1[DdOu}"`N+ugy7 @xAXdr^sţ[(\.N:+k\W^jƙg ꅔq kMfh97>,m%BT$|]C_>VWÅ$ttB6Q/|$o't?>Y 4J8@8{ϋ |E܄uF'@ME;>=y^Y_)cFf.ֻ>d˰^QX" cEbohD(@?1}ځG9TĥvTi!^1^8Bރٰߑ?^Ź|g qD\A,6]z̈́W ' p7ً j\$y݋QqE/)Rՠ]hL~c`Bn]R3Z\[ ﶹÞ Z$BLܞQ oU+Ѐm1V?rbjѲBIwśk_V+g^<`߽bp;G\߭Ҙ^55V+JэNa x^4#Z3[| :d'EL#d+UT ʹ7Z_$X>RzHޤk)z(J{j z_Fo%"n_Q-_),7bיĿ0/UOsdH(UVCt%#`4ɛٱ%oD^mt{ bk;1ovX  t?8!G*Zaҕes"k5rx9?{?u-op'Nr@~4=9R` BMH Tb:TciIDfHgn3@ĿRxxbQ4zAyyalisO rmXC!Sea-}իls&g^+߉n:_V@&n$ztwݶǭ~H hnkQ,f3c%~lCDz*fAOK7w-*-^OH?gm4>`I}!7X|ꁽlZ~ss[#?qku9ÏHF H$$ŏ0 LJd0:w`'yA^'L~}郁d|B)W0Ps/1'CbnBy:D́PƸ""|c^[.Ẻ0oC,b(kB^y_{f3u;^apȓ34oeHS;my#N\wNq< ;MYfia|ad9]Lv˨_3` $lsΰâ]fJɳn Ұ#Q8*g"ِ jOnkLR1D"M"6΁yVD-ِcBI;~0v{3B݂~&2`rk"5ʹ!BxzLtuXm;=Q֞ԝHGq}nAɪsb`r(ōH:lE\ r+5G]`@Ēme(t˩`튿̑Ofs-IqJZnm+SV苧ƨmPq.I'q3klh(K'od%Iʧ@D9 mLH xY ˞0FřX0014OV"N) 1,ZF A=jp%UPC-u?_ ݻƝFforE!×_,b·>NKܧ]Ш^.q:4?dXj5O98 A?J1CdN8yo;"Qc<=V+7!aC06ENNVw^016^dLk"#Vo뜽%KBkil;U 1Ί.ؕ:och.Ns xٸWDbKn^;L{2橮qeKڠ{\V1eVdVe,DB:"N\̌ɘ"nwpɐtHx n6J|g*Jc,P{@iܰ!%ĽYs*6ۂ_\";/LgN8(!";c>_/W סLy=l?y *bv]"ۢU`\tU 7AI[~t)|Jd@!9^}ĥ| $পW4 kƱD"ǥq"Oo`sV7Ed*,a3kKݍk_o*k8sUB Lw upr=:/vӥ'f@XC6bBG+):͌gz:nʃpX;{'$b.vT tzZd& ÍjOz}B#oǭyp%.Vhy\lZ_aʯH X+#z>H:MB .CvC}"2tP-yM=uY?g QU;%VsVIm%[5'uZ`19Xp2n>hd%kg:1(F-/eox4H7cVCW!$Q|؞a[p/ة8k\2X slpj G9&UlBOPXxݑ1]ra)2z'Jأ90X169{UCH\0\[<(N x\JRXđv"}S)iYhQ`?hGJ5k$4ѡy: .mἰ|CdH`YkX듦™ĝ9YFajTwI (b᫫A\ "qfz-CEW%k[%Tf_ٺs}zol$_ޛ $O6&@Q,Q kvX-/:sRj-Ou/E]$8s@tӌznZ4*_uZݵ̺F&鸄)G)bSsAU![uQkf/sڰ UX pNkx!hRwMI_&8"Z`H h"jrXF OBhۉ\s]?9b,i8e/UyͫEF qhJ֮rKWK,iƵՓ*%#;֯]Ivwa&gcF[rcmIטYs~6G;)hŝf۪)MU\,'CtW `q} Վ @jhsPvw6^\ 0_ ʝ#ŷA[g;_CC|?׃^<` )';*uNhrh*:y88(3Yd嶳y$&{׶*Xib{N\Nqdž;+:; ]@=dduFTZNy0is$%TTF´;ہF-$B 6(l"bXn@N;nQ]8}{xOӏ e͡^c#߻Ĵ`9 kv"WΥ5Liwq\ us 2'~]q#Yyv'bk߀q/}}O,gbL-S8Wϒ4q*1NBJeZrձvD$ϱ\ gB\2E?0~ۺ=ǎ0{qa ,_ȥae-|J^f 1@F|X%spxmW-N4&<@Qzs&œob`rJ!vM*l6W5Ik{MHAUdn5BIm]94Wwk*X jHQiqS˩Ӂa@5o )象r>~<ay3^r7];(@ 弳ÎܫL3*WU|6ŽeMrF,AkUTiU74ZAfHd]Uc " ax3ryO|*s:ft%\vHN-= 7oE.8C QWywsgEqb,Oq%'.(n55Տ S`~];=2eI(;Omn`?wȧ汎8G5qLNL4¦ z%Q3 ͡P+< g4HKe%u?]Jduj5핸PlֵIԅhG0E:%(mos6~*d.:ۤyN0s4e#]^}rׁu-xW-Lpp{uՈQ:.QNqKw0sX#tFe;k i+B֘i4ŢM^)e\ށ6~-gnA ";;< y44MؐmM $x$S|IR|mj),[ܺATaD7 ]3&O&Zz7 i{/IᾇRşt  _?F%j8NF~DƇ/  ?hp? f,w(.7UH^ifwbu[f7 ݶw4O>Z_/{ Qr%{_Eo帰:O0ڍc&"\lGkbVF[V !|PӾ3 rafZo;al4ܦ}[ZwSkʉk}0v&1 miu9c#oN53ps}zq݋"|ɪľm {=.XL8θ 2>#VqMu7C-*ёRȾ$+oX=fO8YAwruȁѡpYڌDE4ڨ?fkg2Sś'ia 5߷6RUee|}!tcc9HhV[wga9e ?M^ZL+ ǯ׬OwI4gdx[KƦg>s Tu 9>"9?el9qT~i?AG-"zt36g^) -W'SglUߑ{ͧ:pg}>EwahQ7uW )gsYsp7XGnFWAVanAe"-KݐVXS4}g?=\b!a|Hww5xp7a/]S?o+|A~[oyO+:<mBVWQ<,`:^捽9ʹp oP~vȳǿϮD(|ǵ~`}&^_{e׈ΛnC<ѩYpomeyǘx+ C$!\i``wJ>+goE/[;^NXf\_`vKFł Ha#MF]$P%qW9xy! DPʣOP7Sw2G%48<]1kEЌ\5CW$  oJ뗫=s3pcjo Symu7 ǔu#13N#3";$Rv}cK԰[%_;fQV'2',5T]٤#& 풀3ksr4YN±@*-f+7Œb =ؚH|]M˷Fww2|TL_,°,qi ȃ4Cn&> pXO۰_éa/-LڴTNaeׁT_sL_OGO@1Q[;ǫpyCe)^wT2z\`K*ml恭wiv]pԠ(q㢵/[?ʼ> YJoN]Cm-?)KC4 7Xڄ Jm篔i)[1*I@xJݿ":2)n AYtYk.@Nxu+)D8zgXdlNUu@+$^ w;P ֣s[TXs=Cۺw7:K򪡱s_/£ h4I^ :xSvݧ0s,6Q7Y^vKswMĽh{0KP'+w׮te4H )q,SHS gN:ܺ`bb~ZLG]:[_MtV5+ "/QmlDU'0=;K\[d 1~axYM Ͱ$ZElL^y(PYCWPK焥 n2?:1-Q,R)jkgg'C}h{ό}3I~5O:=\>8*~5^mPb_M]D O t,VȉJ)W1 (}+{z; Ko Plcd&^) !輽{g8=q5v18\$k')`'FWnغ5םzt,4[@hjsI,i2d[s hOx2w L$k_ou1d & ɻսU3gεWrl-_;NeJ Jt(Y~O~_wӦU@jJŻիggP#7׻ꢯ" |;bx#Hr/k _(= G'_f/ms/]- ]Fv$B/:9 ν }E4)"ϥ?8P/"W";Zo7֢u=l?\6>5D߱ fEeXSb*0m raT@ON f2` 8lp/mEwqpMeh&W\ٶTDA<Վ&4E(F~9Ǿ|%qY)Όdx"Wb8prW.V=) NMK* |%SbaCLVL5Vsd^F$[!2+>+1G)u7e\-bK$*8%M&T8ߧ[O\f4=Q7^z@|:.h4>`;:#ג{ fwC,ω-(}Tt2,=*evJa$(꜆Nİ/t+<iu6K]|ŜI3)+ӻV͓LDpѼ`% w.=hv̱$h #X'qh?n=Z6Y^̛d&B?ftr56M2h-Mx&\Y-s !&+Ecb$k߰w;@Jq kӾ9m,ox=t-#^C9f=1cOReI Duׁr['>z K?& ہ/Ch"t< _5vѩ{|o:ȣ*_d9K,i9q>֑&׽ q+A0}F6ʽ:>aކ'o5=Dbzodڦq|- >ioh~׃:{~Z0 pg آB0jzz9kD}_mOX7 ۵}v:&S!6Q->< n Icp%1'唁؛;HqSG"?y:îί,1a+IUGD[T'6I~#~v:S7HZ9z~>>F`'kFSwvZ7&6uN%E5Pm֒lq2oژWK$xxD };'߆']6V{Zg8o35F~i> UxSOD\Ћw`_L5)V)en_yџE:m4|>fb׵ O(޻b)?EPM'mxXo) '-hJoZnή!y+=۹ת)ۙQW\0"&&˛t3nKF900l;S\bӤLNqn;5 "=hIin5B +YΈtg۟Cw+uq5~ېuc(kѮC-5ziNf>Aei| QAZ0Wjq0QW>غplԂ{ t\$uN<9Z)|0YĿc؟ԯZV2qlJ6TdTV$+<_h&᳈{ irA$|\ey%a%pV%P5ۀ3Gnqd`q&м[y2 J?^~鲧zVWZXb6}߭wm޲㇭?dpo˻,v >~i5t/-Ye9tITw;&5}@ Fl=8I+~ZG ;ܨR dž4*N:ƕ5wšl ho J+k0`u$s.ˮW2e!2o|f5w'aV:<y85+j եi\K|[#y!fkݴQ'0*CΊOU$c^kL'UҜ6Aj? {s:clZɴ[uֻ!;n:i۸OSh_Tku4:[@60% #G}m峪m /s6%s 6J'n/O[`2ؤs7UoހC^cAoTR~rC(M=*c'*mh}K&,NC)g> B `] QS!&Sa:_I2/n~""\b1J)}wqz(' ÌbuFGaͳ{4G9BVz?.,6,oCZqq|Ṷ#FLc%+Ic<v=!W{3ΏRIF䧹Lbl4k-л~B~'գR kf/JVC2k; U%u%Cv>+ 5&\\ʩ<_洏D,O+7o5+A Nb0W+4 =x2G!syK${=+o_2vcL9vtnܹe (Tybf|ͷƢڽ^7nG6bA;ayb\MMi;޽LZmj-c<ɻFw Kjڸv ~XJOG>k0ۚgдgtDɆt~Q#3w|3*qMЉ{ڪ~stnQRbx{ }P8B6LVdp' O {Huz^B8D =:v%6K+&!5_M^WSb44!gEV |YjdoZ5!Pz$~HWxLf0_cf\ >2aR[Zǂ2o<φ /^15eՠ\el;c!Emgf7E$}R> fO6RϏ گ1= e;{P /Wg*jتk Y駙~.'(C(5ϻ+;,>pXa7:폻 GNHQIv3}P+[͒ڰ^ÐRȏwͼJ&S tϊGnn9{!S?u[c cn2):gN"_I-XvWc+̛&ĻщɚgZK6$J쨕ns\gԟ]vb\G51.2eÂĄ&'$7g)@2 l®۬dmؐ6+$l)^ߗ6TN'ûfZh(aQ\mΜ4-쒻?chMwCG:^@+i[`KO5aY˟RyfMM°qK[&0.z"WnSϠO*ɬX/|j] |UL~<"ne/}7~YBa߽PtM\lƪ5YLa{8X=[فu1s /Wl1IJA3ɉkry(͙dg9 A_oɗP8 `AIs=Ѝ7QtB f]>K^ f_Bg5~x D_g4dM&ɟBKD qMK@<%^0}6&͕= II# X:הbX2Go?l-0`F6W'fkCEzÂe-z#*DWWGu)e*kOUθi`c-}$-Xk+H1V~60t:?= wGEuC^1 SrylDh . )e{G{ku[?vj]lw?u0>+,m{vL?$]vS VJjW_G`e;`!:A_yw] `3A08!t*LtrH쌦C"QuXU[ ס^XNNyqՉnIV&EK(Йxn2ΖU '^IHhr6*a}a=~ʗ|d_{ ' aNMb/ɞk.q-D 6a5&$ln p6[OvT6NDK)WAr'L ͧ TG &F ̔v0K_Y{о[,8qȧPhݻ,A_Mƫ6|2^}S=xj~ B3~H2^+-Eg,ڐ̻vFWsh{ Z+fLEF{^X4af}a-4{bkx٨axo8AӐ2l.0>޺tOMgAOA 4'u! w*ժXduH\v}YqG`Fls@&s<>[rO .'ΰ;ؒM\`4yPmn ׵ [ܷvCgËpfδpg>hHI~A 1\&!+|z~+;ndNu=ǾJN][&KDX/-ڽUc_nG(AGl=@7V86=8m fgO99ga[H~5OaItaʟÑ娄&yW7\FhߍI{>0ցI^E(Lt bqZ:iRf[8>H-7NBIHIFAxǯkN.E I/~C⢜3ɿUNI$H@Ǝ5SS?sxcK\f*v%Q]P*y1d}nE$@!m!4e);GX)0WKCWl+N*ITp$?Q䟮[+߉pgE lR2Q2i@pW Pli8N]fȈ9>67Ōc}鳰썈Ycee>66pƽ;K_IB  o<pim ~S klQu\ ̲c2ϋ j&Os޻Uk-lĝ|Y:PF[zPswǩ~6|aiw(w\;Gw_2JAgi(=>gk}g0]YB۾s7k͎BVX2za){,ՍOTzʍqqJ]4 fp~+1=摈ʹ!Sga<ɯFd{gW摣;u{FmPi"_r!EWܠ~`0MXGrpJa#f7uD f8`D7\Cs" Z *uCLT, ;/`y,+`uY͞f; 5eQ``ѽ]$X?Gfꙅ7/cxQLOOd{zLS;ۥTW}QM`$_О xȐBVKgpu KO,ٞ0Z2 o8\y{À!2]+ђq 5IRXeFgUs eؒ[qa(uh2_5bV"4;dbXOISNhUuFvUel"]~HKW#[X4"Q  N_YUF"!X6 ܛ:ctΫZJ-6ؙ1ܮ/.VFc6vj[hkȳ8^4J<>Osfo~ ǁ~WZmo1&Lo "GE/ΰS^X>^]w-CցUsPZ$Heh[g֬+sOFeA+϶"t=>&N@k6FgRցCXP<ah{2$K_<,w/e-iOF_@bN$8ɐxFͦSQK zpW[[~wYM\%a[||Y Q9)4א"7(0Ă2O{;_s2ٿCD0A{iL̼fE$-Qq遚[@곊]+=m-o;36]4ב^FyhnEf&|4NhW&c{#q1 T=g̍q7. )YFxb'c=" ;^!аLÓ]!T Ub.qmoz}Kdy]+gM6mm`S=(kܩ͏m{ƆCaiBbt'٩>WU,SYȡ"DgjuӜ8wXyw^n:|B:M5`iTe(w ji '䝔x`yIІ@dFsiD76;y8 .'%Gť텣q'Q4+BD.hnlWj"uˀ;x_MTh5å!M7J {D^j&Tf;'<먕ݟ8" Z^pwwftcgDW8/]Յ9$K&ʨ\.^ΫaP^ȁ.u] u!\w}߈7ٸ!YoX{$V Zjbe{4-SMBHR/wr{[*Qn~?n\K!sf+h^Kۗ58uI#44yS=v@~1Z`zq JJ5 w%Euc?ԅL?qqv0Lw&Ck \HbDp Qٔ| +SW|$ɽ˜>FA5A / ob9y<9zO᭵"HPe\yv ϸW)YsTpJ?,)ޠY۬H{¦UDpZ3)erK]#C ϛ =wQK<<5m>ibv=0f}0EBV7:o͡~vuKx.J8X#33X߮\+CClxWmelbN7Vx`a뙁 ^p/ھ $X$Tx;VuDTiMM{`xA S@&p@Z! ,p0Ia SߣS+ػz 2~Jw|SZH{) )/F۫T,y x¬lI\h{%H+?t4pL.8`BS~lN1k4G #ߕ˒'v ?O3"1?w \^F楷FF|՝G~&<~LN= ohu'zhSjk")YE2uANʼHcP>Z$m]tLYσy =Oؙd]P: .?:wJ&c"Ѭ٣3%!=s* l#K6=/-2hV#~i-< q(d2=z1Ņl@HK}̒HvBFo w㿝kK]hEGFxdl">[^\=1~8V~(dH8+5{nMQ sϘӳ!n$ɂ@enykV!"\6^ݎH!Տ:!M; \ݢA⸭7G$c=-e`WȚɵJQ q>/$XOxQسO6ܑi LĂ]&N_ YyR~I2 X-*Cӹ,݅_Z.#kHD{Ag WnUA.L*L-}5p8"CY:Ov2g]T'&n55>`\X\jń5*fs(&Vs2=_Y5eche1'Q7v8OZ(F,] y'W*g`Y{E]\%?-W2we /h#9d놱eagv=D磾PD\o6F:D:JR9UNao.ʋ]Aimkk5s"riǽ(MaČ [OW.F}O9 ++=GN6ʪ54nWY'.(ި0~2̿[<٬)Ĺ2ݩԖ"k7-9Cp%N =lɣ[C Cmc5HHn؍涟|Gܞ$jypQ-;Pc ֻV,-at\/GdweJ7cdF ꆀxfT-I.&-`hndwKc2 uWrkĘC> 2fezR 0gJC2J=I(1LiFFK2"/.FKoCXb #Y&ơ}=EO;HҴ#Ji|D|L8WQڤn LJ)Ěn/o~SF:4 Ș'qmї^ 뒅1-R^Kddc+ZwT5@ǔo1:Yq{*x.v+~+MɾDfj" _B"~aHRu 1$ jQvO45 *O&s>7Ck82TTġqP9:NrB >5«,2D-2 8s=״19˅Ybh  Ieb~wΏt@gK~E'.LAPKJeqf~()ZgbCN=NÏˣeKK;ֱ%{Lw?d͢CX ?n6b&.>e1eѸ3>=j'<=Bl;QU P~ӮavϔHcB-(okPDdݧ΋C%吕Yrm~UId'8W]G=ʶ"m1HD=,RX5u٬pHkQ_t}ulϯQzuu>/57Kꀀ|l[ԯL6µ-gCݱ(hɃl[#XfQ# E{ِG>'AP^l;_fЏy.͡u%u'ӧAd/$Is%K{sfk0q ̱ҷ@Hf2&-Uō _Ɨ*xuUE]Dt596gwϟ]C߆ZdqhTuD`a1xiaR@c.֊ frQ#/vG7Ww]:JKɠxH؛R[pPfc}׼ˌΠRp\$}sg0,"NzE⣲:[?sQt\Cem];rH0t r<8 bV; 2iBNlu%b{cܨ} *C)-nd=zmcL)Ʌ+ 3̺^YK<4|I![y@KG"ey4(8$T,8+,B(k79.Z9m6=3ܦ$y'LOH;A#xRĈG|?}q\V 2r-ʡ@|jlT&0h|#d"r7MepopnwHjvI7ﻼ&&ST*5p$ 6B8y>jƆ5̽O:im'Y/Ǘ(ܟщqDpZ 8s~ց雈r&&P g0ErR"VhXO;}cSpiz0"x('\]ؽ9vL6kxLq20(R͏W0?q8[>CܾX^&?ef3O?߮J)e̿tl^E>H"_Mh!zIy9"8NA5>#.b~UҤ/>= OO2lԻ:<%%;Sr=8'uk&hCYcM"/q 0b[ SI˥X!ʂބ0z$N=Wd$:<+2ᲧU3 K$Q L( vSJcD}޳H!6=3;1DHn C KǩYI?<#~%#h8{̨(99 +9^F]K2` Ty6R{XZE)h24B; P<ݨzYlV!V:7 ʰ<8 xeIJ봆1`o.tKox=Xq8njh%D뎩iC$Xa7\쑔@k,pG<|Zl2߬w7-h\?&caT+XBB)ߦSI.O$b2!e uos`)JY`#(`LL~T2&}g}Ws4$KdK_G2=\hDe\׾gf h1%rP8&3r:}H<&YP.}Eo%TcܡWWD?Lg`p \gY0qޕ"r <NA;yr4R!h`MXn>axXiۣ.ߧ'-#,wd+&"Opv)L y&c|XCk@a3O4 4{Kls &RޙMδuRU3}KG4[eO_VǑ~ap-_FjF<׶jܳI2ԕ_z2"$뻯_erO.i%\0S]; VҘ[?/p_B0͜q_mg@'QYٗۿx\D'w\u5$nzuY-Skc(v AneoHMI`A!9s ^Ai&;$yD]r\~# cP&PfXQ!,RV]Bth<'4wVIYg`Jp*_爄'z'6D|p(kW:GL2?_|aU; s`mTDmkV.7U=ԗ*BDAƹڢD]Qi@xlഺe88 / OĿ= jc"k jH5321neƻbrޓE$q vFl=fYIU<(]/ rz9 gf&^LuFSٹ{2eL:d a?33_孋n=gyxmH ŧ p`͹ǝlsf3ܲ=JP# QVغm3rfYemHWJ>3ci\>6_XDu־SzvJtN%+8~?{!? (0^iRVQoK3@i3è^j4K%K5",*o4R1a Fp0LZ%ۈ q(oqۃg[ϋj#Ӎ,^&=0^ދ;{ sUGr6sJqC臊u2jSXQUg8ڗ9ݒ]hLuwnJ΅~ fQ0K c3onlUB܇4$g7ՌmsZs j KOJzf넑#S9[p Jɏ}[99RH|}4mGBYXiF*'xaAXft=DWpUWF4~+b۸Aw xCtdw譍|[ )}e#  h!ʱ39V:F>_yМUT$ҿΰ; ҝlR$F62XͥLʷ({UezZ&ѹoDžwJ,̴vM6?>Дvj1Kk-+4Nv*R@Cl渘@ɬpk]5N Ze5De^k D`!]Oq>]]N ds?>{z,,|!l+A3$m㵞&ҼD+9;]Tjֺ,\Qnޫ-5;ϯ!ֆ"Zg\ujP"*5Gix.H`=&O% "pZZY#KHv}*TFPgzY'Ҫ אl+8')[Vhbr .GOy߱;D k /k irBtկޏ7"z Ǧ*Ff!Պgf* i*JdL+[N!87'Wm:sXZ^} DHXxBs4%=&wk^tf |2nb!" j.硼XΟ=]cZ=ۂ|JJwX+5݀EccՔxUcɔcA)ږ= >T>~~K))*-o Ʀ[U[3]u\OʰsqYT+~1AܺHq0P =OKr1 2-[cle㠦-v@j)p ~thaVP@a+%a4{L3ۗC6ؖ.aVe_eC"5JHh<4S XBW֔z60D̮u/=о"y nIbLpGNE"DPKßxm*vKάV:(M}e62:\:)q8Tn5,S9^*d{X8*5|M}.'nO]aYY`DxhzS5Ot2\Y.Y)a5.OޥSĔVMSg<ﮛxMjTByfR%ꀧ[YWΝo+ׄhU[wx91 vp$ b/>Si1+㝿wFL[>Iw)p!IA[iij?g,SE~D*=)e~KJ̀֞>MH5BEfH/%cVfF 2ӌ؂(]z>eHr2ai_Y4z*4rŸnJU)_=?Mچ2zsۇ3_{D! HP EɚXsbj0~a{&д;<)4)H+)1=}Z ?3oas.{\>ز[gmcUH_Q%%F20R4䏯,&a[^&OLL ''9: ȷWfNI 1Z-Nu+BA+wHp^Fkb>f+ k¸ܿ=%+&~߫`|{)aǍHq~<>;i;`kpwHX.r ʍy~Wy8iX/쐨fP ")%Ma;=^kEU" ?sK|lܛܛ_h![_ S$+r;ISi[<~%kۭ4)id^?7<>>5+ɣmrqS ہg Zإ7ڛL2ޙ #syr8O$Wm?1lkwwmSX\2GQ`̪Xok݋CS Syґez ['~62,Dd&,˪zaXJO?H=âDѶUƓtoi9c.rXVsz;ѬO6AV1 +ψuM⿱mMjn+aa>׵++XP/XXɲ]өK)kƚ04̐YYG?:4N˨>u"c4W?۲~cv 3@>Clݬޭc[$Jk'hvG<)b"-yƄŽ%G;)wj^*uR1.|3hRx7v ,*$R%t:l`8$,c̭3K@x ,bN g&(L˼c벝QvvL$ !ў³{)]f,tyh{l{!µnJ_A} ׼5_Ca;˴){B+b*_$U1l.U齁?hY%w,:ni ݅/.\7 ~i=ԫ̶|m:sEj h7 xͅTX{2 bȊ4gg8Ewճ˞#Qhʪ/KcURp-ALzmK[ ]|:Np@? c?sAZ"r΀Q`Q8V&eDpXÒ[s__xWLmnytI!:{9tbR>Wkdksף>풦V*aw٦C]saj`}gj#ச9Wʾmv{"}F"R?1qWKKfCÚf*AE%M:(عny͌Wj^hY-+J u\fz^s εQ*V7]Xr3{mMWyeͅ5WrH^_% :uF/yg-cOB. mPM=Wk{ ZM#wU2ֆNڻ_C} $$.Lמ[,FvQF \QS#[>{Jy^9Ü,6bO|Q643)]B~916dz*l%2pV&)H,4:JϘZ= hdUI }ҭ,2U@r!3OXxj̴HZiU[f4^L`<U 4I=cUD@JJC"$N:/VL*;&%qn$zhgIom"ej_b"JNXfffȂ-ٺwt"a_P({uUN߹O)RU/ ʜ;隧Ux}9؏.ټU!,xW dD4;}5- \61\qY0jMacRDU<=|B0) 5u3KlpJx,ٍ_;g^vMK;17=29;1 SL*輀Oi>d%Y<9EG&* O+2eB˃=9nA6 IϝmhĽVǨ`L.?!W8F ĘeCq0Œga:!`8z6+20V?)F8,75}4e`7 wY8מSzQOS!hلF+ DL:#8òD+"BΊ#O^;2^N^/{uvR"r1 AΚ*yŮk Wc:?g:cNI"J9Yj˄' 4zeW._^hpJZ3+]^5 i`c:UW3S}aޱ}ϴ#7 fJB)qm(x4$/:Y#)t8`oܡ>ÂnpFX:i>Lh꿸aL|\,nijKWr]FqYm\gK' ϭe([5YDKZKG= uZ]#ǵQ0@3ȮQ 9Vħ`HM%x`ϷMP\6E7?}-x@`b:R1Re6~d"[OTz<Ι=ψAx-89j4>R.ϓ;N2&^^:&my:S-,.N Arg<&3>w;<[%x:st{ߧ?WЯ> lCAI̫0X$,8Ĺm$8ym_W ͡yZ:{\ځI֓D9-jms9ѳסty? ME A;9#!yƦB+d:[b6,Vw挶S {gc6n렿]ՑeA.ჽ ė`VDЊӬf:֋amyЍ⨻,*=JG?b` @KwȽ Бi2?k'GZ-DL.>`}F#2-~ "` [XA1Njj?GLHIy:ΊD@^8$$pC:D4րPn᳻DOg 04I!xJeRi OV4T1(4O4= }HB7N4v)?B4)ו{D )ozk 3Rܥϱ8Bl?H> DsQG&K AN <%?&īHwpʠ "CEf<$]|zWͶ ㉋:W0@AOTUDE<}W[, >^/Bh%G:+TR%gy`r[9r,\Qh*m͏TsSj[PH̨yg6naʾ;Qj*4 UsCV1Q6=H7 ->fPke[+ݪym c5/F:ru6#ls"d^TFCBYȅ٠E:.kO@R\ȲvE4*ZmєȦ4oBH3v{:哸Z#ݵl|p#h)Xv+Q5l,:_dnu۩ 5/m t42JJg >)09F_3cWݿ!~V?zUIc^(Ҽ]|k̘q`j*+fh%cRf*.fudxgw?zI]Z,#ؾgr!kv~yU֐.+z:%sS »t8>xpUd%/,W|e5]IЦq4#r$Tfo7#OX='}vM@{r*d rñ)^qlh[Y'wDֶ @*. z2SP [~rjhE>Z` Bҡid,9 ڻ$:LCPŋi7]~sLyOM2fiJj>IrO P{dgP2h `Cl:豔nTOa }!hĝuaqP*%#'zͯa>9i$\zԍsg7^ѥv!Q1~;2/$.,4o'5RמqcCI!jo ^dxO)Ff>o\2 b1[@ ZhW=WE1̦ѩI0=$e~ i"/%^+ [\5zzI>2 >!Yv ʄ[>*|D_S*ٍ=n_SM(fo 4d /ڦ z+WanjLU 7aӡX[@DQf[J1 ѾF;#0эxCe@.ی2ƹ":rA8/26z:2% $[Q}Ro gx )t =?#! pPi@$|/2&vu n ʃy@M< M7oå{/oO#n w^٫bg),Z%2LɾD =Y~wH]#Q]Q,;E55ḭ%KUɲA5sA2I`zw#jOY@Yب u&ކݚM]9KlٞX1c78bkꘜ>sxFI.(h8"ô0Ih (/eW )a#y]_.Ñ ]|d0i_E4{b#LhX]95_e !@@9XϕbWf3!YD5c oZ^zw|i&^e'ih앿/(i?2ˈ฾t1`lu~̷[G.iCuST7ef;S g+{¢Hζ-VgVFom$GUĆ3YJmY01tLv deD<2?+uߠ~SvZyv!cїi"A6j}3;Sw HS<x/C:jፉ́Dq::_= ++kU7gQx1#~`4{gX4B0x?p+5L.U gQZi/6pkr?Z>2`'X:x(?ӟvg$T鷟e'WBc۱ i ? 77خŭiLEGm,N$iB0zDwq5u[`d5d~,% +l(OZJ?x`9L3|/K>;K9|jA/[Sn!70W =)LmU0r^I~.Vfz=iSn9tccRy0/'^0<+J-l'LRua-&`f\;\&H|R Hd[0 KONJ8s,"3݃$a5BSzblY"Oo-M"9'恓̓CPzm"O.G3&~!E# ).3 jy;-E͚xSYgrߙ10APEpˬ(}a*5@2|g]ج6Sڠct5tMѵ{VX qJ)4nY-"M!^ќxtŤO$jͩV)?h{CLk'? uSQT>{xvc_BE F,9v|$ufv:?ڽqQLWA&!0_|3rKR1.%I4QG1Q'CO0{`#^%1FF 6CS(l3%,?uˬ&Sy?mnF67{Q,Z:G)c*EALi"KDקHɠXAb*SpK4`9r%~b[06l*fП"Fl{eǯ HOYhXr.˶1d9 󩕊W5; _P|[Yz{A]oh0ci2#L~ GS?cFDnjP?:EbB!j=@R>)h"- ʴg!qlfM7@,oCH dƚ)<ʂj8i; î9gQN 4^bTNQc|U8Ae u?2oh^h ]&80?UT/2vBH=+H g?IL|s3 r^}X-)Hmle3t ~m~?D~E`@G!$ۿC_10d bXk8TほT=tBi'|Wp ^|zu{XyE+ryBs%ʤXs80sGYDŔ&=~4R$1HJ>H47_!XSϴv 9~<ݯIDc ). +=Q,UMBR '`}bH6R׈2!A:Kų) ޳>*ٲHld*ND㙿V`ٯ9v?gZ*"ȹ,`~KI )cf-P?IK,tzp~q2C/-_^G] 5宧RD} dp=gנJ拕 %=Op{7DGKGBPXּP枌+5m^\4N0v_ZF[bf94(Y>4e[U,.5iV1 /Gt,|]wD9!hUYzm哠*8YNtD̒?<I/֑GW6+?$ C%mi'#2al,ܕ+괞xX 6*jAL Uet?+K'>У]`h^[~?~RW^4?G>yfF"oўԧjo >ʳ^WRn|/w[﵂\航opoeRL<7zp}7.KxxS-ƴj*ÐyMR~Q\@ Vzy lK\Zػsty7}p?Dճ;3upiZ&l O ;]tLc|;tux| eCX)3NapoC QpV>cTy̆^@%aNn˲%r`=X.c<:$R_ao~}͚btphXص[竻CK:)kD J^)U_cVsgw5cQҴ'>hNcM6,ذ$I\&_9 Ł3*O"4ڇ|mfW镪VҥwNS7]/LJb<ۑ1of J}$p,?7aS_[^Y$]lgzľ{%whq>௓-$3G>TvG}QEE{f{\ŝƸ6OwaWWg5'ψ SMÉ $ǔ < I7#=we(dҺzyvY ^pqVʴjQ!zP[gB.N(f|C4B)@i<}6|hx `O/")VDDzj2=n%92co!m(:p <LD h ؎[ipz^ z K:{7̟]<0m0-pxa^Julc/#HƝ_4 02KZ5ɧ'mO@EHDx$o 2lRsrv6{5Eb~\&g)]1#☄8(ڲWV<LPc8=iٻ2(_]ܰq6ݯ8r=_*I$'&E<@v&.\ ߽Q܇mY^sE mpCLbӵs6Jlh75V]j)j}YqX#W(qe{c1%P|ւ 3<O6$""GS"SZ)2f\JE!];s)J0[fK'k&hY{߲ze܇rMm 5S|p&sdwBޒS&aG0k!lJ6+stnC oI͆CP3Uq#*]|k=Yۘ@Oyl+7G-5k_;:}=ِa.sen¨^_~[29sC~aLxXmćgζJ_}%BiOo8{/!OH,pP_:3sm0OavD*!o_ޜДJs4)υ1mqKYTp#R y<7&)|jr\v{ `(v5O&z̆N-\R$'B\?8q+e0Y9Y1~UǏǣ+I3v`J+)ws$}0Hl%n p6xZ!sT8QEHȐd(KJO(yŒ zzK,Q* Oy)r8~jJ6z x- l-Ɇ.ɧ8YCÕ18(y %abMygun/Qǁ(cH{G{ eJ+KLJDʯY.UyU&k5'abSnv`(6<+<!M\U/;|3<'Ɯc Å޷+1Q@TY':i Xj{wE0޼ yb8&B, !ke/'oTZdZZzB94FޜRv'>|&nZ!K'Q0;5m"ÄCxVHL,~"2&N6ԲVđnY<7&2$Ew/<_eT1Nlp+W-g dzyjeiٖŰ'06d3'ak(էoU.0q$CC P _N!hvի*GsQ`cöꞴJd%K<- bC!K1m^AL~Č 8|Y08s.)|]{)ɖ'nv=۽ ;__C5b^\ZI eب`$ַݭ8uS:vg $ ԚT Ɠn#%6>:l`pFY3Wz /[-FЙ>{8A~2ːВeI8(A\YqFP*tk _ifƏ_%mAAP/Ϲ1!ԐăcG06dC<}|!}#Nq"UȲQ^RӏAg}ɞgLA B'HCgaR5awF2+v5*}I"XaSe2g$~8:P]a~4D_\ʽd=k)I{3/\SW-r$j!pF ˧ߝ F/]Vx0XS2 ܫ 2OlVDh_1/q+>k(x5{Z1^ 0 GeA$\ Ôx;[u!zom,?p0e ldž~"A ,,V?6KҿmNJs}X؟:h_\—ha% WY? lMy>zI2Y F[#[0Lm$ksxli149ϋa"y&}_FoEJI;+eN HaMˊs(Sg+%O{( L̞VNfR3:v,J{ $_0YooM u%O$Ud\&I5Sd=qp LWM ^Q{cկMd6x~&Vl6ZPwlZjbaX0怸CYp8errYd4$ZXm:fl22uRVbANvD8ƟB7&,e r9Vui񒼙(6c?i*8f+g;.ӳlaZՌ\wF'j% m5!q[>G$FI1^LayB>pɌ8󇾳c^wb?ew*sRW:4\sLoZh%;?m\we5pl== zDmeffR! K y{eOdsܖa{\ z̊lTVv97 x `pdkCٜ]hReUOV$I醆XSKEZwje* 9 g 91ЏΗ7 ">X ʭC7Lj=p\}zl6GCm̂-<[vƒl6+Y)!!3]U2s7Dy)C .C,+du>!أ^ҭQfbT[\`1 gͶ]TB3IJr 6qQh~Gܾ`یII~ :gOX*ľAe%33ຢguM'W@Ojq׬dWKD"Sw>ħM2iN(uI|wd6):$%M ^V O#LuWALک\pA3NG 抁CpK[+gndeH;ٞ ǝx+ߑ|_T03d+=XGڈbшRS~;o4Ҙ?;b Å,es_)bRsE()ywPCA~4\kΠhiAhM:~DeA8hood\BբG?>TVw[?Z0&3gJDd:XX?Zc_H.p8frr{+q2s =fu"jW$?my593%ubvhˏk3Rl[1LSN4}"yfYpҴ|}e)a5ѻQؐ@9hNoعkv]N0xj0A{Yw pgs`: 7=a=dջڜRS0"%n^)Dr7wt[{bdlƶ9Jbp1շ>so4 |98/]e83~3b?/9LΜuwc*v{VUXkܯJ|:^2a}3OYZ~.넙q=>@ZbyM=]}4 7߫w 2OЪkb2\=&bgd'\m2,ǔY+# 6\kؠsrN*w- fd/[K !FU^#cFQb-Xee$'*~"/SSy 2nG&O{Cs8m’ o!s݁ܝ'}vf(C9L*; ,=('xǘe\P<2)8#^|$̨ `7M?gHOؘB]tyJg*4Q)HFi.YfC#ȆD͌${!)S.oD,NaD[".}FaS+- ;Rrˈ\8\|'TOR2թ/wEhU5}Ѱ" wD<yR/ڱ*W3*<kΎ[<:Տ[xşpeh ^Q0Xgy kFYpva`TǷRZ Rq 1[D9;kR5 cQY43 fOkiG5\zUԨTHW]ߥ:c5/L M2T HCM? 421$D֋XLcI aF)*YEӥ/־jZd^ͣ.SU j*ЎM{.$ߚ;W,e^YJcŠ}YeQxLk,P 2*c?M|jzKfؠ;xŢbBX?X@3)0 y7KSSxx0iW=ğ% ݤ31|Y^"|i{!Ii{U׶;<4D,v?a!?@-mNWbϮtkҢeYDay^!hY+%& )! I|h.{؏du!Ɗ-;??F`r28J Y ѭm[-~F`=OXN?h#2痴6X\G皕/ru6*!JCӾHfa27/~[h:7t$A? ,cwyG%mE z륇\1^?YƜ]?h _eTq*=DO#ĚJ *v iF. h1U^Zz5wutHGX!:]b[s/,`M9ƱRBːEgIO N\X39%Aͥ`(pݘfD&>dFBj-F/eNMslķalC`#͠ߊn\5~I}%rbo.̱#p(SZ8yTPsb.vk`KU!罯F?j9 mA)$W즟Q{FK W04I 9C_]Dxƣ2.ndU s *bwr+l"*n8y/^‹[a~jom lNZviU]KccY/D{` J'SOKPM@N"{RGm$d$|LH}t.񃽳Le!V9*4*,_CpI$&! 92sl. t$Y6p2Fo ( cc}J̭E!?$ H{1I[d|Q<)qF moqfB}ۧg0~ud}s-a8 chIIx70\v)'ZױhGF!|yQo`Aps<ʗ܄P']1ӻ9̗Հ_c/m;hfs-%fǦHs(IKҭjPӾsfq1Ͼ%@24$1VZ|*<ޓ]ЂSALv;6;ۣG~ /WxqE./yYc"BUvo&'΁YfFЂ!34f hG!8PėաYδ, M1.TK\pYfxRS>p#Җ𳹓$yPtnη"!~~mOO^Xs3߄1?#cL^C5$h{/=ZzCq"=z1SIk$NxׅXoC-BdӺ^K {79m[C^y#㙘n^qtqFaTYV8 ҬZ:ɭԻKSdIųٶO1ۨIJٝC=*LdӬPLLEC,b%!BTNiݔeCrI8RPk`B+rETeԄJȶvM#EqMDoQ7of`zI7^a}pe [4E!@i `2[{!OfԩK+W0 )_f'P 12൐.y9I39R&STurW%:V]zOE6jrS}03 $\CFAU)6f xhW`艵!^8/Η&o{S?GXAH=b^D"Ϭ5[(hrp/TE0\t~J u8)ͺ5l4g8ŒjD /8(/c3Qᅎz]y>-;$i`+y<߆ |~?fEm+F l g.@Ȁv^:L1ozXRSٮubP#T, L̗dEs1wpkl6wRDwp`«@{}rl}CeCI [?%(n>آc@ȗ$p[9Qؗz(Cl菞 bD;L"ӳqD那O Mk\ )/xo As^@/<m93{ ΊM 28*r؃ `m OuIl}(L|k@B"Ʈ:deݡ󿝚BmBt_Ya0Hʋ~18V˟B ca5$Uf: >eJ&.ࡊl gEVk- 1oMc!. Hda Kk}9<:(~w*~FLP80sLr~ 'mb;'L_JoGI6t|r9z{^=GJAe+h,v{4u8|=p}zpsx2f\qwN(wXIԥ$dQs' d<3p%y"jYZٿHD/;cq$R0Y@N;J :dqM_dygClxE:?gtm=|I.1Ƶ.}1AB2[Ls3r,:k3YUPبQ^܂Bi]<4y+TcjOyP;AS/8`$LJ:1>T pTn.ג Cy~YMr81tP{5Wą}E:L^Pb LΑd-("|&d0.Yqh/T&/HPp.;1젳S 0n 2Uh#$))rs\pymu:cUz|+T"eqAx4k~}~^D蹀q`&׊h/Kw$+>bR> l bK2jHu{{ Au~ .94kq m$@QRM psv \4D&QNh!cT=+Te5(OഖvkH ^|iX?% CKE:cX1#.ݽ!H\)=4LJ~ at?ٽC\!7~6ԽW(9E}t^߶xWswrݻ;~3-~xӊLs˜˿ s[;f旼q1W+w,"s 6q$0+L6S} "Ht~>]$jK ɳgW^ly{2.re<뾸NIoI2Y8 Bw6TR.U{BZGd>V*$25D&H[a{>.~Zi%+K#չEFqTAZt'Ē#GT)^*fBd@|\1RS'l 7\ R'`I!B"Z$4IՋ՘ uny6/28tͬ⑵eTtVOt=gwJD8U6į1Lzdİ_/B7@zz-0gsXgR~d)3t#U8np jP~3*@d00kN ͢~8Q^M%k=gL]aAMJEǭ&컀stUdMtO1xz}nQ&t(ľsPX:㘏z~ls꾓UGcNm2Ã!IPƸ %07,dҍ]CaK-g<$;Y. zLJx 4[2" tJsBXaHQHFa_F\ O 4l!צ1owX=ُ7`Ro/͠?% 5aX\Vw.OnPw M+Hdk'^}~/S/MT<gb/(.~dCdǣIbic)|,gAeA3Zu/|.5\lvO4=|wݢq܄񡈥M&a*G(,UAYy,H3" b0!f\S$p6}BKní%W' L&soԮaՒz66BA8Θ!6 e6!b/d@zrΦ-߰_|d,n9N|P|k#Eh4wօap܈ʌ>+xy,JWVzNq;_\0H|x Faae$0T^1\huJڹz,X+VO$jU׈NWY}kYQwӹ|p2ƫ *铄'׎+JS^^R'2VL ^k^ۼE#,3,N,7/TɽrL0fR#楼P;ڕ0}?az!ae1 v20U\AS}54veZfE]OaXXcj͢XB`S+|Srf2dž 0>hJSΞ2i 5;Doun4ZAZm5.߰ 1xR^`q 5ћš vP *x',g=#5$YKJˬ!/]*Μ/Zw,>kl#^7{ On#E7'@Bq'`cUΌr[ .X:iR2g2l/LAvDjf\:cƜl>4=G>Ȗ{0D^܇oݥcHw ';m0uY#ᴴr,yd *g[4wCyӽFЃ(DwaRö} N7nW1ж\cOSBḦeؐa2Q.,c| e$rƏ깔'wm6{J$)fͶZ2ժImHSaXVIl=zV/f>ZR Npɬч?Kc?Q֍15iP['A|mߘJ7u^ډZ@Qo_CoRɪ*8]z 88vxp%A}JĦGBR> &x8@s WTp0e]^<9oYOV%P ϜHK9!F gA{Q4fOpW ƠܘIk?I˜)Of[2Z5FlZ%M,È!]xbKc455>0e6%[yy㟻Bԣ0+E ^J U\_h=<N Y'RTBƤU=l.}>xHyYfHp8駑8.a!U.;UyK7&2̤K_c0rE@~D¥&4IL?u }(PlR o3*^%]Ϩ|]^E_9+CJ Jm?u?ē"AqzOp` ^pF藮 -[K2P#/ue^UE4c}9faX3M,oFVnz).5 ^d kC%kFDl_QŴLxǦ5J"@4EK%G+6U$M47?Nz5IYI{C8%6ߺ2~ $ozaEV]4L檤 dYfp9Ur˹M#dWJMg=`SSq_Ialn86= *ջ:ѯC}dfZ>tW uUhѽ<\DR9CEkNv-?OIG\ʤr}g .***s2L"؉oi'QW=4]J _# n3--v %_՜aZ;c2˱2!NOlk+f/3z;3 if,;(UG UVVٖ=X'Oa)]2vܼ Ec[5~:2}Q^4Dy0.Sr_<޽fSIkx;LlCIIa+i%/yNKLi1Z/x#F.q^?$u"mOag?5" ][Ы{x3}=ʬ9IJ|!egcwb+@\Owz\1v'qp,Ut@Jr@ܑScr"9ǂ/b ױ<!s/A7)w֩:h1@X`CKmꩤ.˄Owq9Y)icpevsRrx)J;OAE]%.Vbgخ5Je>L[в]`DIJ7Qf)ߗ1V4]VFB.Wl+a,ŕ-9q,`/ZΉvjiӍսs%hka%LHէ4'TFjɘ/rkd\knclhxY~mR!b]{=a~GЍd36tn K[YP:YqMiߺѪ iK7nQ<} ~ KSez5kd#=cV6~|6^֦C׊,}) `S +^,~PF 7ε EԦlJe0gd\L=w44ϊ0P˴1 PA,pWBF"x-h'<|XFSP[QW0eEP</; dsTdZ=}Đ+ ['jy'L/LKQ#ЀN^'2̺ZHP D񚍹܇[b >oh{)Yx! ٻ;ďS$o/Ii{K}I/c3osgeB#:RLфlptOv(r䦈Nx 锉_e4+BddinqMܨ)8kkO|aߘ9%%m*$̾?P#2ضWX`HԦ 4~zB z Pw] rhHn ׾ Vox2 g_EL /מotq%K4={{co 6%.[t |u冾b'f $LB3(]3 B u,Cgv\h{.$+#BS? =+ PI;A| |#bđ[ؠZɃ޼\]d󱨛"#'w*}^L7T{tLmQńp \nuGc.mQy[}wiFA{j";m_ؘ|0 ((g8I{f-J֡b2mEz`<-K'*M`5^}$"J%^;NuΈfx 3 tØ_`1Ch^'|0|;EW^]eS ~k+G!)}Fou/=QY%fzwKhfn!!o_X?#ԍ̎ͭ*=8ρeZF2}yg+_Q]lbU3NPW4F}>+S BsȬ|q:/BYژ>?myhcR_{δmPOfw CYOPlK$Ŗ0kNѱ~O}RDmKXj׼Ȟag6ԷW@cSW+ch-.ƞ!XwQ*bm~t51pH Gy9~NpJߴ#0-6T: [ƣ_̘ʋsH͂PO3%vBhT䅒2N-)>!lH 2% *jTVwAlkTdA$ 2kkAF%SX{OS`#.*E]rM 5 8&DH5id1>D$.].aIv;A@meB!jUXZA _&}7-Z; ž+G=[#ñGSHH+J!ę~$r87UCbBcN A_0h|Me4}tM1  2Zm# Ai@lK;EްuWF_uP:hX1 bݙ˂$O6"Pz |Yo0)Mt'* k7[i.*Ҡ%pҾ"6(yGHheaBđQ|L-%&--Kh_ tp"i ꯥ:Y,bNN썉\؏v> G}dêk~Yp@\48 G>5Wـ]ȫ#>X,c+dh6yJ5ڐ$ C/RG ̽2R ~۳Fㆃ? 6no;&\;HكLWyWq, 01d2)؟yQ/wBb<`F0y BSOalwyl6E8s>y<͝Y ړg{ޕ/y11ڇw*C0]6594]a+&mX)Ph רwI=0Dž}X.dÑcBIyXc9©B>d9ZQ#'Sc^Boo ҄Ġ+7qTz(>}*xGQN0p62v49Dγ+UEʍ^CvJ̱ZΕh3RV1XNeG+{&dꛐ&@,Q?7 jM&Br [=z ~ d [1CC޲ȡOϫi/~}\|U91Ð1n%,3t䓶xQp5}؜2NSiL|94ױΚy|~OI gOk T0ˆNAh?{V}x *9iۇOA0> NdN$_$]18\vF;l.ͱ51my7 ^\[#hw{^WHz7>sQ/ K a=+&":&nl Od5kkv^*udg_FRP;YT&8ϴ"PrDڞ`]eXK 5G(ד39`{};6F?:"<^N " ʕ(=l,Bœ@#F+"Gʒuk+n|Z4S׽^d [5A1M\[o=Ʀ+ 5]JgGXұV^׆4v[>L&#e,FQ&4>Y+/k|M8S@3A&pw:ar')wMyVpC gtfU:GEia{B"'z>C 6J6]X3Є]E7U 3DOh`sNZUF ~N&WxkUйa3c7k|t$\?hC̣X$ l.d*D0փO܉"Qos(-9]&S!Efb^\?mϘz$P-U!EؼuXN [F턉E"Б(icZ ;*4Mޱu_/ Q|OO?IEր6㞻8;QWr{?̓6Uw{ˣn;5F@T:CW< ԂC$IY+O:s/&(wr/?~Zz|\] cG>Ja3 nV./n/ݵ~OD 3Nt` )rUL<{35bĽyN>uyhPH:)DZc(Cl[] c'㎇Ifpb"uy h,k{[eyaJF L ]ɒU*̠;m $VD8<ǩbEon:܎{$+oyLh,?1#1a%S-1i,f[^yc\̩ Ka_Se3HЬE1$޼dx, 4!8TmǁXY &X DA케dA/jbsC$Zȕ@Vitń~a_;Iַ\Z" b-!uE@24 ~ p` kBp )?~P| V{O0aݑJ3:̿_eN/qyCu.;iAeᲲY.ل _nPA07gyaQLu'9H" s[ c8泻0%1oB2!4U˔}B;!GQ8 ʕR#[-3%G2`GPeoΙvy[2YV75K3sz=EM~& OHKdcvSo5s<ΦMS S؎17 HF8~<)H]&h4pӉx4([}њ oKO|g ?XgX$3b·su[K㕛R|9Z'ڴy  qmRmȄrlr i|[ 8Z؂L b >ytSˋ?|yk"|C'h`/bl2%-XXkYX *&%Q]#zœוfwVZԍ!I0Wa` y2_!Ljb Q2GI|?F͊"^01VUk)r juhՈk)n]x Xro6hb`'ÀEu<<# Y g{`Lcى k\{nCKe*Z.=թ4Ln e8vXL~$͋&*JZ7gr֤#,a+& *3Jܩ'aנ,#*cU|dv$ogS }=W=0E$_VN'GOGʼnP@VM3 ^ Ǒy܂g) 9<#vAa쓖%M96{HilL.6Xύ Ŝɚ)KF%ƞX7FE{iR F4BF>Ta^ț7"jȀORoj0%c{"xE.X 'SwqNͪNnASgE"4vUѴ;w٢|4v~CkCns>"]H[?M:qQq/V/b|NO0-AUMýE~%R/z@ &,XeN{ys3^/K3>kȾk븢t_26e) ni`~L"2D Q3ZyE4@s$wе緝.LmJ8?=;?=&0"X.XYӷig3?@П9bl Άޘ2k`Irw^4d錈4x`<9;4AF[TяJ$~Ɣe8Kz]6K/l c#o-~ `MÔB 36H8Hb\$̱IDQѬHk{%x0!P桞2"d¬19%< %T$s%0:: = WߗL^h}ss2/@3"nq9tٻC)wĚJ̞ ɢV奝`aV+mB%'^֋eA>H3|Yvb3] :eM-Y c rF yK":f/]ҵbKijtFETi':؍~ $~Z9`, ?:<BafOm0uό6G~#V  0tn`=/EZz(Sf{D^|F_Λ&ٺsP&5" ,/XP0_tԱ:{= )dښREi!M2&׹HVra&qvM0ԁf}N3kDXGD7& ; G?G y[ qU3WR^u-oTw ݮ/@Z8hb"? _{8Y&jS^R&aa 8ɱ̘NUsjTO)F#H-KUhHj K@b)`]36 i,Q1F{4rbCb䴵:+dX'1t;ʝv<Yh]v`橁Zmx֣$,, eC96 *͊&I$Q)o^ \{9Vc6F5 3Ovj*swvmkY!KiSf;DJUSDi*01>ɉIA?æ߲`4 `윊NgVS1!Q 4a욧WyLz/ GwR g)CF=#i YQ>;@. rq P $i{uj{aM"*, tEbmN6rLPPI5, R$:^΀T}ImNA~S.yˮJ*ZHeDv-Wo ' =|yY윁 h}W6HseR,Gīt 3c')Ȧ]*oQk{Ӽ9ݘȭ܆>6HyWIͪ|e㟴o+/ =')ݻmWp UapYF)`$3 hD+rmm})%HR™ZcT5΋O㒾h3յC4SFヲ~r0j3(e]4X-F_ .[%/,IXk fnG'(͔u5d:ڹߡɌg!NYpZ$jόwJγ5'OCrv`AgPH^f#bN] fˈ14H2Nؿ0k5Ok1s̱X<5Wf E0EIh}da<7)U&2 )oɣ8c`ﮏNy,_M\CLe2Y=7ӬNee@<jQeyi+}ȿI` U#>jlO{Yii;_*75]F:M@XG~i4("[|݄#Lt->ۭLȿU{Cc@ k0ahH =ۄVjfag8&(AE^j& ö<ҿc#v_b.}0ǞNgFҌGx?T)֋eou"17 Q޹A<SA "±"ȜpKݫH1]uPXsSGܴc\ sn$q峷TPs8"Hv_э7ئEchP6E3iOE9hcm@B_6J-iLWgc{ySb#H_ _w3o˘yG&39U|+C j,gb_cY:xal ex|4?[ߘBoɿ =1؍8JoB.[)O6|.d늳X9A '~E`9 W4-.zCNrܧUw:c\Ō_׃oec|wjOΡpezNw,=3aϩ(d[~)M7` aPTy 03#I6к[fa l1LVO'f.[SnL޷\v"}`Ә^#}A˯cDxo%an:~ kSRIޢ\Zě[K.1On,)-K~ޥWUœHkĺVmd-}/Z wcHCrFFeVF ӌqDtu`uDn-z%|!@`Q b4XG$mOH{ϤuFLZz5j(yOMW{vst|acV՞|lo|+B"rI]Q"H2#6gou ]YM"qj 3bq-H"wگ}/03J?GρE@- B[DO!P<3aa=<Y[k vh)deIxt4-c2OGy,7ArŘ%I'pCsoj?ۿ e %ĎHlT+"D")c[Ǒf*ۘ\ 53=Fd,D0{]E.Ȑ,Ɠۃ\4FhW8kǒrUw%Vfux9D]~iyv4Wbʝ,& cZu*~I+@?:ȭ-?C$G>BSWJЧ %oc$a߭  (]Y A996$<72dIhI7!qe)373č­_C2EuqC7F!XAfpmH11|u79Ƅ҉ q??1qS* xLVi_sI41h "@EnuHe#":9ho-VrJ*}CX-jkNUփg?ʘ(kF4ag˱`5cFZh$1{= r}i)Q$_ᇢ;;OsPV<\UѢ02mBQ Jc$\⣞ <`aJ\NIp,p*ĝGu^,UX6G>McɅːO&Mh -^<=~/!~c}O_\Qg\ )|.1 {ۗOUJ_|y!W/πs^}rձ8; ~YSy!/`ܞy⛣Θ14K[{> %0Z(2/Xt'}3 ˙/,WOpaM (KNVo5I _hrvĕFF;"zݽ<Ƙټ. āaʾc1,"Zw$hvKMN"XQ]vHa^r51 hpW]gAɐe9븴GLo\'Rm |v.k|td=ol8&&H)V, pk.L׎I0WП[ឫ(S3V03xMNBTԧ"1ꊹ';b,6>&3YC5釾Uk{8KhJBco+`NX]-cDײ8ߜ1*b%,ZlYjg3#I*xq$Mb4 0(+pC9o hdzZВSOG;FU>tԷ2-`r LTpJ@1(·[ŵ5gKx$z\t~c{rpeE,$JPξU8mi(ڵ/('љfNewgI Fŕ/ KR:0uTs}ObВOik>M$Lt?p ң`x^BtX>d%WzP'^.z"fL%;z;]u(9#a_yr':ja<=f\22 H[on󅂱sjJԎ-7B,ٗj >WXL 췒do@'&g3.0Gҟe7d5/LB9u&g 6հ0#˃d3E2Ld]љrS߶ac8n~g0S{[Ѽz+ pM?a*M/QPXybK&i=#tj2@e򥍲 #՚ib'QM dTӅCE:8s_\#&RN5jȾs#?/.PƳ}ޮk|>y4mJIGCxCaxdYyXE\vr>cl.kp<#|7/6 6-81"rk&b7sF_҆P-kjߺ}LOybO5ϙ!?pi%2vB k֢ŗ-enܺd?mҤ!%wQdua.0wP͢2Nԟ@=~- paTI k- G"jLJAX-i6̂e$k)yw{ %S@"ߎ\n tj?AEk[o͊N%U leMw2O%fcRYUڟϘ+5 I©9兙ɥnp&_hJ:gC0vZQ^rQ%L_ YnU _Er-ܣoOA`Cע\G W\d\YX^5[ysqbd3_RY"3#dfڐ$J $LxI޾֝Y֌ r"?Ec:C$LOM-$BxQa+Uq@(nY+FxE,ï_ҪL~eiXPOC&EXYZhk2w恎pG݃0 hG# Tp悜=H,/J߆e0-{mI $Jz5D$PNGjD"%ɽ{d4%KSIu,7!Z )]/ :ʪEˍ+F-J| fDPTC *O* "2OyVqx<_'W`W62oҥ}Vrf@/y ݳSj?5?u\_Iq'^}gN{ێd"/[%53rGlnyt]4A_;IpYO9i g9wGM*i)l/6H豗E<%ȭ[ VJ@T36꫾s)Fhw_b2W7}"@\tC vyQGepOhCn0Y:yE~Փbtʞ e+ㄦ뾂ĞL>K )I_[M$ hVB=Me^h*LX 7YSJ S69qSxž</羢@Qh;u5`gŭk$0i/kg($U`-=1.+m0DA)H?xöR5JkD%;攢zee LCIRg{E%׹J@7VFO( MS2w ߽"+6HY sB a/y3}}ng_?/kS!|/u_͂6;[Cn>xS]ٔI" mU v%,">m7%reN1ZnIfLpULx;2?rݛ4 jJIR Vp ;74Ѽ3gzsk`3G Pc"nDzOJ$jd<"!ˉ=\$6/d BE@zO)8.-:#J$~~ǥ#D w'n +}Xۡ/ݱnW"O(Z^@lYǣlWmk2tvOeXFzvq JxVSm2mQOYa_+ʹ(qO[^z+ι\]WH;s&\AR;x[>{8#EfD})>PuYau*O'bk!j\;hc71rYCXsw\31=/~ž ,]6}s]*ď_er7eqLH#EuDE8iF3;N[ (ʉI%'Y?}h~ąh* g߸_ݠӊaɏp2[1PoB 1Zُ>p|wªX *DŽ=^ V%k7PIޔ2敮ns&D(??Xad05՗Ԉ |ZؤU *c_uXY3G~ [rs ;N-qRP޵4Qd^nbnޭϫAttkdy6(<&dŻ &cA9sH`9E#A/:aX_0~qguNo@ V[Ή# Jo*T~lBͩ6y\&eڍfv-eJ}Ň~!;S U&} Ԓ!cHJ׎4,q@~]N}^uTCY5ZY\&˜/60zfS wskKĈh#҅IyOq3$@h Ɔ a)"0 >^ߺ3l:muO|:K8l2AnĎ#bs^~ߟyإ*5':'X ūg"ibYoA}IŽnudGYidxk'J{n MrfC`TK@Br5ya1+(0?{yn03kf5ԁ MQaGr#rxS)\:FM-Mx3l@XE~@Qbe[,h6ZRC(D?`g0pz|N .ɨ^0)z^قMT g?io3/=7_4$t8Y] pQ{#>'!_ܦLB vk="K:K )YU^{xp _  ֺ9}^ ke8.<*Ub,0>Vj2:U­| i%d5t hv^:ՄI̿AG86S. D1QnkEqEM?v\7›߸iE][lOMTt //ؼHλ`0I;f)^Bl2jdA'jL&r1,D=?h SeZ4 =dlszeD`Hq~I'P?ws.;;uXѵfaƟI4#:oQFANƜ?[#hpMfӜKC5?9esDSt˜ӯV3~1-Z~}] qk(>#ݙmTA7% =&]7yʠ+UEF:.qǫ۽[MY;TSbpi; 6wy%#_v-PiINVAM /KH{A_1XC )q&@ ċ:I'YSj$4ٰ.ېx+ጝ3jZ4 H S#y>)=Χ#*6z$QSu6s 4w`q [Z< YP)6IbJ v奰\}m>u;[e?$[%Ki0$^bUįT UX/dV9>٫OKNIS@yKwݍ 7̈t*(v&Ulט*xn.ؚ⁛½Xs\ɡ ODlvX1G8L&u R rƠA|sV`ԉ,!=4X{?[;7G. '2L?H 澰q@.z tՊ'U ʒv!5X&$%A1-? >KR\kf[0`}L$} džhBwosr=Zt\'=NEWYbe4.-d| !>s*ng,"B.i{y~=i~0D \.n)vHdd4= _U>R j+MYhCT ?QaM9GK\%1Jt! arYЗ}S‰0AI<{-MEJɧ@NXD&tĻ90S'l@^4c(~O/h ލXn|66ZpJ9E9P#*/h fڨO8 3~ i _9v'4ϵqv\SS?|p /s$VAa bb.aܟoidS|\@Oُe!OܦO`E[[̦5@ r@z<1o"va!~x23 .l\gf Fˮ]=*(fDjZ C]Zx9ؙ^D^Ol6S:}!?%eEnSKY f^ ?$.œ!Q~7&Zǟw& Yg`3".Mĸ(-FcWXU#׵%h6 )5dHd?ur;r$Y⊴JL0_U!2Vhnrg,doٙL#+2yCZ܉vӮX/~]V|0b9V~rlZ_}".qr\ZU2E&[x9tp]mDiJ*' -Gkjq!X}hޡWG(ʓp#Ix1Byl$!(ZrM;"Zb82mY9'鈼,Ix%kmHĖA,-Dɩ S4fl[s5Lί}4s'\ڋwsu/<%qʹ}+61:/y(5OhӍ-R)Ua\(._b"S 8;ٞ?!Ҹp "K%0E>Ô:N{Ȗo'q0,G>ktyM/cRn6p3NݙߟQh;ӦձO[1 v *guJ4 Nዿ$0kڽߗ߯ĭ#Q尙H4㡜;9޵AUjA)ҿH[Y& gsy? zU=.F22s*3D$NpwH3?p y5~j8e}]f9#y D| ֲ1uk֌r;" 81}Dvj-9LOKFɰ^-|p8>4E :Bj~1%Ʀ; _t+_,.rE8 E~cѦLpfܵ Ճoq;fu~b*ET=0\x96U=o{ՈbbU~~ Fh~sگn,^l $[p.U7 uN0xC>XҫUI/=WpWңX1P)5G\/+6*]X jae2CP,݉8YWs&,2+#e 2(o^_ zǪ#Ͻ;^9VOl6C"F"ll%ǀ]ϖ!diʹt J:/,\\1־ERx&"K>pPg)pJ$,TA&e\ V1˱%Q a@#^K/-]~$t A>4V<ĴL䊵C Ă wir^`V1?/H-p +{.n~c7 SɝqD᥿mDa{O8v1J yhnBݷ{[S8=s/2e-dCr_va6C ԙzOɎDtṳku쇣Ung%_!5@jF=rm*љwiVc_>O5vKU CN ;rəv""|)e+u5ʐT8| ؃YhNd4g1l1aqީK1Q}]wV%(当}4iݬ%وPQ%9I^8~R 3՗L[>'t")3姩(!wtRo9y? ]:R.z)CE8&"= lf~.GELf0ؽݗa^j?<| |z\^q}JP/Ƣ[!"x-ief</*|a0'OȐKd&Jk.^~c`S-wXUb%Zp~o_ȗg0]C&Z,1';-c|޽w}8KdL消u8¾^Z1\} YE[ҁ}++ jT*e0^97ȓDs&~&TPb{+Ï 2r *{dġ&V찹Léod(ʼn'z:0ܙ0X[c07Qdl{V|n )̼jnjڶ˃1 =`sH+1x`>_򵜇A=Mm.|)9\$lX)ط@ksAf%YGCa S34E1{Ƒ bLNI(0;in:k`ԝ$8yO T]r_3>m c\`-?  ;xѯ|$.1$/ 'qL!}uk rOCAaԃ}?HJ'}/ɭ>Z􌸌 i2rPMX]Ka- )0jX%_j-t;;0& V>GQ Wۇz M˨{NC3 J] >MW~;wk+~a#wn."оd@Y. j"cH/&B \sFw^V-gD8 gMّ!t_͎$~E Kj24&Ib_ZX6}8:>R'v_eg&F]OJ{s_P2a\JIǘ0/wL~>|ׁfHl:F,"J2 + ?o}袇/G؇UJ}̃BUV'+PW'ݵ= ,1c0Oԭ@æ̺"| M5B#ܽc,"@Jqv΍mZe]Z|Fq.MǼsm .LxAT:"[K)Xq "y8E?mhowRxI!knɕh@~tFe ՟Dw+.qEׯz|T&/SV?@x?9t#gC-6Cal\Y .YjϱyA%ViHT>,O[TМ)ȣ 5ײ\*_Fx൯!ƂCzcsm;.]Q]Ξ!cŮ9(NO2 OwYB?)6E[f-zpk`_2NZC~]7o֐=3)pk,<1O`]ZNWZm/4Ly\葹SRjޛVm󓾶\jwtX}dQ}8ua1x4˳#RfIN׵v[\s)VKI^MK[N:\|w2뉌XnY$08:ؼg;XypKhV]Un07?L x4G6}]·%|P`B{~M@pZ=0HP VJs],İ|y/^y+$4쌈8 m.?ȦF@OB\avGC 績5@miiψq̽q߼t> Npz Tl=*12"ӭgۘ8pb \|BrE)a{*U#=+}#"*jBE(uAJ!4[nzK?SeP޽pٻϏ>C`"_BŽqPd nzM܇nB-gN0cqhM̸jd;DA8XB]B q hR64Y~q/?&k3PٔH ZPEoGNU|f#3*jZ#J <'w/QU^q: đnzP1ąH'#uI%;3=kqCR< E-O bbq:/rd&m=<.S[wމ!#} N[7iNgM bJKѤ|A t]֚6m0'6uexޜ}:1{O!F%׿.Jh{> hEFϓvlo6vĨxHaI$}σ 8yk YHeFftK 5@;"%>!z@7҂3BmkL~2(n<KwkuL#Q}2Е1"\Ԛ>A%\ytl ?Hg~#BEu=\Ty X*K«f0L,+2`!SQA=vGCJYj׶: /E g*S\iy嘩PbZr9> U\u@ /4g*'l\ӸgVf]KUQM>pZ,/og$("d1fIR\nR'd>Wld΅r˙d: ' u{G7 D~ialtD,B] !b t|^@{Zv N!W Qe&yex֒}v|\/8 +z+BvTpKȫLc 'g" CX&!kBt`".8wq-` ii"%V!oCwEPr- V$Е0YW@%%%εz^pQ6'ICEwgW CVlMc#2c(V3h'^qmՉ̽S f)^mSPPb˜NDHڜ==c<+I `].n)u)VrTzEM8 C9 Js=)*T77T; 츝$'+ͽ$ZjTԧ9\~DpR/~󱿻xn"鸁߫MMrj<Uz|M2oٝ<)YSϯ0Ě;bUPg: _KV~w\TZl!j$_wL%Q^.eowUln'ٗbLu-3#1-'{8.m0`rز6"bB4$JHQ9ָDorMIsԆ ^Ŧ.S VYWҍߥ+Ru >ry ~i$헗"DYsm{{F MkyF@˥IGj"KQsxѫyKbl((c\)$ .ImryoZ;x ,*yMZQ?Ȓ'ŹsK`QpjgڌRnp~d ).@b1D,~1fyj 3m۽O +4glֺ_WY8딒_A~j>1'4a st.'yO _UbTk7cѽ_Md1ljh6&hO0<+(L9gz0Ϊ*S#9M& )M3뮦v&oΐ9['PS4L6vlB st#9&;#">xARkϡOl]W00?(+?bڗ8.Ϳsۻ3#}d"$/preK%E(,/n[w#VKbE1V}]8C68f%cRLaܧ:ƎOUZVZg>BcjyݲH I`=KO99VkK'g:$;0 u}[ƨ.Ys lkGoW@z[lhnR^nΧ_9̲=[}T|LmX[pOa:} S<>h;4~e"e7-3;IѺŤsJ9UJOۙJPaMQ@/̹ؖT1({jmJ:FY餯:GD)uKmm`&SsĿ:sk# وM%~MWs䫜 pd vd8,#fc2K]Z:oqK*$ZKmEJel!$С}ߺ;a1XKS{-ݭg'vv#oͪ--ƖŸ%P\ދ؎Ktb) WϾlM- ʰ2&0y{ [8<=}zeaᵻYobZcv,qCÑ-1MtiyȽg'qkLHfڭMYljFC'LXォ.:⺦ㇴ[=SOq = pJ0f{nYhܠk~pwl } ZRz " O0Ef8t{j+?LQuʭ Cgs]Qsֿ]B7<;Rre#'a}O>K~L8˞i4J'7h|sκr"6]/qrᙨsɟug_Ͻ]G5þ*kZ긱Kab]H^8O+DKT[-u%uqt^I> ʎbxI=*SEq>2qߕ}k:{vp>W 3Vy?^ί(Iӻ͠S{#*W[MWHr3h\xI4f{rO[Y}jƘyGźKpY갫hhːᓋ@:5L MPJ">urXRdgv玚#ڿ&qu6]J:F2m3 kAIA|f#\(H3Q(XyIGs+[I*@ILJ.2k:9trZX{AUY@AX3ȽwޮZWzٵgV/>]G`#hA Λ>)%8k?v&Ox_Zǜ y<^r_}0ΐ=;qU_e_ 0/*\paꛗ< 5ROWu P Kuū2h>M$Wj͓j1+hӾv91ju(*Ou+To%PyZ0.,WoK)=a(oD$ZG h5Y{TƄz֨?0䟎ZCa_V1TSH>;2/.qgmCe]ry\3d?S 㠐|p1+O}0o}jϣ(k -\AK[­O āHC0$ǚǁ?Pfmj QN~Fhg!k֩,ev:&u{dzц=D$/i~sv\k/Mx/Z)\lo. W Tji V7c244(EI kt%FثD \'˜SuBυœp0aM-"cp`# 'c%/(¦˘^,xd{!X6D˶bR#7JCe);z<zRK=^&f"m%- NIcfW+jZtB@^KyFsbW.Yʜ )F-lѰ,{A_5ˈL̳:$9FtӬBė*i*~:>ՆZw734BF<ۚ5:ȠhB6gju-$aNER̄~r~[,~LÚ&bˋy$rf W?QfDsM:4N~[K`~>g= h-?ѣ+><tcJG{Dzp,Px]pÜAhj7H)ZMܭK8iJㅁ ~pUm;_GDPLz\舣392d%Qmj6Y ҃IpV>J ~D@/0 u7R, d%"9A@!OWٙ"U:@)G?w~mc%ڇݚ|"=1Tħ _]>K/??G8|$? '['&>t _-zS 966>|r& 6V7~k$Rm"ybCE|^{ eR|"*9~,rKY=PYG(:Tگx&xAU/ػ⎒rmZT7N0G@: FB #M\9k2(WC{\B },q^Y)QÎ5p'!>mBYDr-ҹce}?߶r cyJx%z|!BI!@ %GI ,yE <@.U/d ox*ѨsR_;ҲA#nIu}:ɍ NجC~ыႴyc}o7n.(Wvp:?H V~ @;hF^Ζze]_ih~؀V%- M,8%U7Oc6)"W/=>nPYSH—3HAB 銍|껬NF 3XED*dUu=]]?% ^U!0|Կ5UoSngW_/B43bU+/uz%δ૎<ꁍ7L8*i)ޙX b kS齬5sls)0H6@.~g"TezL>[1jI8ܷ<>ZR= ٗ0la9rR}O?a>>t{uޯՙT,2Agci_Ʒo?y/ "b\uX\ǾooQ$5.v-*D&[BF{]XDtsz} +y2ϕ"xVim-_E lŅVUAX7SYǓsQS~@EfMIm&6i;i~Q9v ;[89g4*NǙ1օ-Rt1`80; }0' =Dwraqh Q# 'W<(GCCtJ:ǵ?ON{0QQEbp((C$ɇsfϡ>>H@q$-=w%ٽ 1sdԏg%n!J4vb2!X/w_Ժ|. \zj7(5״KCOAq ^*_h/\1&8RncKcӅ~ )Rq8C+!ٕwǻ;N9"P:=fHV P퍵˃'iT;vR͕0bG"@’{ {a6fkn!10KyP竌Wx@P6+^@,,{! fG{M7C L ±O/S66TIB*AU-^r-Y$(dSMWo0EԹq)P$D}Ë4NOYDzQ a0F'x}XmHcAqm{QusLCt¡ކjhUQk"EV2o=;gsAϮOϘ55Ng혻/922Ȼ}\;- (ZZ5~Q0Do1YB 6Vû͸Hb p;-M X@kra2M{G^WQcR<#"LhBb #曖"ԟ+uu#'uMu b/}I.Y^8)Z' Pa|WbC\r ZlzIQVsԾ2yI+Lp]!-n%e SN8ϐa'.spѫ8&8>N8u 9c!T?{>O$U?Qn:zo8X\Iˣ2gg=Rn7 T5ON݅s:'D:>2Hc=- CC5-~(Tb8C&_ -Vq ,:2']S";HnO)Zgti@ vɦظ:渉K><s}ˢ0SO{kjY-2QlҭnPTK>M,)gCjpjT$4 v?P.9ـAd ; g%|B-d B cMDvkF&f6|%7ƵW8Ǯ%._72%4E23F-)6~n3 G".Y+f9s,(?fd3,tF D_i,@mO q/X[Q%QP#_ݜݾ٭q7k硬ۗoq^>eFיWMb̦w*ƛ&-J*NBXUnH.Ysƈx\#~l>Vuuj*w˷Sr+Dke5BS`5eI2UQLxYc)*>ps? 4^ f%bc=h4(ϖf` ZQ P y{HdWw͎Zg0I:$RaED?ѦA#Xi1ʃ] ȋ8h&d*YD[~"{gNEskEq.\a̯hRF}z}ֽΔKDqr%Ude妢P. eS|aM! hI*D1!Ϲ^TfGurdXtbsͪ;Зhg0*G=~KWsX#QO%}<Է5.h]xyvm+=CY/_sC-C *nu]OF^5S}3=gI[+%CaHs-i,?j|8]߳OZڣeh,vUN)Ϳc+# M%4JvT5UoNdc1EsRx e/װ)܊& nY`5v9uI)n$ޟ{#m$Yo5lp3dz ZjٚUp+xcf.ұSTg8*3)'<4,DB:-# } ryr_fy+4k i9hK&=Hu!H eW4SYic*WB'3I49VcKC4,+woVX1m0D_].^/0u^.Xr:S'_ ',\*I11"),K%ۃԚNЬ,Fuhovqqdȴ ƐBKy2&PKkKH7 +4W߷ ;ؼ!3r,ZPO0:$9ryOs+1*8„pD0|#*opOO~k6 CM+ @RK^SBmpV`lJ`8Kp2\m h,74a/ӹ[ɵ )%xFY5"U^))\c)F0p|(Yk\? Zyey&7-m,ڙکZ'ͦ~H|4VƳUJ^_e7]()*#EHڲJ_t`NEIl 7sc@N(b3N"%*ICgj\a:VҲV[ vZ֑/:&^$ֲӻ#9 ͞yʺV=> x "MǦ˅ V2\2~$3vJpL*3hyXN}]gN.<>(e5-Ǯx=Wض= U(V{4#)#>+4q|d8C`sbBj'LD?q>ݏiR٭X5YO;HKlo+yBV3BOi 鎇&Cr:^2h7[ɧ>e@F#%u;`7*?& oaT/ b$Hxb%DE{9aӴEZOSs_OYۨ~갣E;se ñ0pA6BUU^] lMB~ĺej bᢘ\:ׁȟ6ݹUrWϥVVi| Wd_\P9\@b83IGAN}XJ, )LdUGX"D#7ׇ|ߜ;{b2$o|ÞeЇbW)H˱GDy&`~o >* eW0o׳T:hnW}DB_3s)tHNbA`j!U#1v#c H 9\FҒca'bTTqR—~L[qBZ~gͻG;TAE!l(%z@!GP F9ᘾL&Pmd-.NqBvlOQ}?+  ;B9r,o~zcdQeoqW>z*0%o$>XMV;|z2s}P m8&QՂ2Z[)k[o@=,_vrﱙDeU!\ ]nP! C~(}ÚPy ܫ":cq0oLO&xedl -.COG"piGt>z*M½,{S?ohѥ}mi.S#N5g~m)`e')Q6>,ngDN n` 38?H|x.UK1Q x70\9FJ\wMΩͿЕGS:Zd0<_vG㠩n69_Lm2(uDI3x*-Х+V9qkG9V# Сq:,/q%/{ɺAc ǿEXF:!xSCE޽Zu$a}cKɉmw_F`4sP`]iy>~W>AF P&>h.kcƖ -[e+=kzդkmftnm z!Lu;ke EzAMS5wF ;. BCG=AT&ٗ!S0sYB/véXHBUU`P~[Tb2QsoZ gF̚p+;a^#P9T֞(9+x->O:\ ó쮊>.CFpΐ &Sd0jF2&8BO?y 5E)4 ,- G 6H x_\0yg^ӏLAsi2?=Y/x' 狉K!ΝR.L:aW&Id-TS`?qԂ+C0yכ,A>@w)E/!`Xzx +#^xH.@|.c<2_E1{oYq:)jmP/(}7|A=B(ߙLB'\/Nnbjom$WTg Ql} |IYZ)@L= yF?"kedP!WM]kvнx 4FL(j.q !ݔ$,CPVʄ|il_d%2;+F$ْҹ3 Vt!}ůu: Kǔ3:":V'|!u"ͣ tzU{hm!οuS>6bЯR#*)}ClfAzmUE#f%]V8~󗘬Ա-PG6?k"y,C{aM ;'J~~ϑ&<݃^U9v۽KX(""\  뽒8MOD!1bCr`[7b]ERp1̼-,daߚ+ _{$7-]2cA>N]H4H->찁+V&V"P,j$pH"WL mL1޻07MyMRetG2":D$^ /;ӰW6x-yEhI@w5wrnv#W gw 0UV`1w3&[BPip'A"VUGO+%!fސ v]͏ %^zT/mfD&kk't)e=8uMyA_N`&+׌p.nor̗HSr:%X#wx1l(0!I?x?#CK5qPuCH] H4…uQ*?1 =ڷPӾϊuU&ŅF@.'kf{Fuy\1>42 p؝f_|C)Q`L#^Ǒ ]8aaϲZv3ݾ-VALБ&}X+Q4 qX[62Wn%Ok7Ud֚\u ~1裁r 6{k}ЯޚZ!4h;dLĊ\8{#G|d_͛BhN6F\OKʤ&ҤO)CdhW}I>.R^q$i.?v-TMf2h4 fUk/e>N}ka:E>! Y'1d^Ue}{z~q5'L?ҐFIi {}[r:TjSt.7"0sZ3g>k\i-JC 3*@0%_<\SnyC| mPi\7ЩZK BBxn$?^?uqO<][74^oqak+EI-iICՉ~WIښ3'xָe⡊.'veoq2- ܃7%f VBֳdqR{7Jky_Dc T*Q$%^%[O&#&s[l- ;2 Zjmn2mtiĶֿĄ]'_l|K/KS@6ܞ X6xo:nR8\{VѮ\4QnkN&αυ}v/mK9y/@L `N'&/ĈI#xW4؟LDqשaKP@yE{ގb Ď7Uerh ##^B.Cgɭi_J Toդ,ՋE8ȆmMy]T5\Z'd>f ,sA ]S3YG' R|V|+t 9A.ڗz凘}e-E҂p^Et92\L93L;&ôL)T [mkmT"E`P:^_?t-cE68R[~v u^p5\rw& ᩑ; ك.Ʋ V{/v^%Z9hڻj, ^@s!sWc*GL_Cǫ_^ Ơ`^tІH97Xqe :[p^TbmP#å3ܿ>A}7m8ǶM@lBw 3\bLwOjz)ؽ*lۃ=pUX)BiQe;4g'`ŗtNmD*"Quڪ'ɥ4۫ lmbLc7kƸ(<)k^ǽ&VwLEdM0fd|E6! 8gu_`tg2q1C<%g2,*]-8m?*Hzp 2iKAk PٯzO!1#٣c&NܻjMaX.}"=l vd"&>+mnՙOn@H-/:bى.LpA᤟Ƃ3BvO4AAp >,4+jtHv0,bYTmT@`GөPv"IL}ťjmZ|dG0?(Ԑ%1RqNP07(D#L%蠑xbh̐.&>hc^8WS+dl0g9 {`{6ճ -?YtXCp1ri ϵK|E"#u¼x`07qyjy,q_=;@!(iz'Ra厒?0f\Y(?xg3?_m)Y?v-@Bd؉vġB0;ۊIpp(^?s4q?L慠mݗeʎ>ˮWiE0?3).Pk˅Ok3jM<<ك jNiXE=?zšy0RH&n??4}vk":c UCvȑ:'oO)ƥ;xԎ]4zt{Tt^6FwC`N8/hQ%G7Ar-={ݣC3vM\Y='vaR+]?b]!a*una]#ĪI3\J%A2-kTŎXH¥ac."ڬߟcŞ@sa݇_v;Œ`ܗAWCV; -#KKE.?? o:o >Rf )m=j 9a9]ꔱòJpUaW?"XY!=G- 8Ĭo]ksӴL.#qJuL?{e%>t܇_)_`Ê@P%@F?"ָS;)D<7ol#32􁟅qڂ*ءs{ooza_3i=hП ԤBUr %"|pB*O dc?x%tiwY )0% 9܈ݙCeuemC^3G3WCwid$ΗxL]m> 1ou=%/n@4DQ#6i~w+x NŕĻMP;O|Qrw<4a{?z/6f?sǀf&MD- ~*KJH>l < 60;>d|REvx]*MoJ aXk=+^@껽q;i \g )"h=ɫ,!}zn̝L _MƀDAAVH' aLS`e+c秳iFQ',QD4Z0>gMs6xOt4~\%kT:agrpV@T0E= TE.=sLnJP86AlLMO3j]W&4.[`FNƨInEd^}=w: $;]nɯl7XUL*Hg Q뱚+9Xv<+K`\d8A*|$@魏kd H+1Ch뮧a\ѹE߄A!UdY 1[8l`7i?z ?Bt;;p`VZ-LK$C&&=x:ɱ_Ŗ7:=3'*-x=T.{vqkeMYn+ rN  xgHR+҆.!Qd`&c`empdo 0/r.h0e!1H }=/xYzI,ç;cߝ|&?'S1>rvϋ~ދv{h`!~ _hKc |V^wb3$1ɨJSh&x%ە}ZS^\|r=K}/ȿws~+z)6o6 cijo,9R`ZɌ9_U!dVhR+*; x4vm?ٛ*ri%{-MN~(Qs#?"wH pk \{'3-QiJj,90"1?鈵kGnjK()K%Jvޤ6h)5ސlA>Fd_3gPK΃nCvw)+EA(j5/!@̵'hX6~\j%*Ԭ h j;1&G}9ܿ!w%FJ N8՞v7B)}/G.cF +yRKj8tO4lgN,q$\BuF(n7̴n8=冷Ibv՟t?%+bb; Y$ zB:nxdZJOrg\E/MW^xa v1l" 'GX̃Neùbp n/5aixX&V`/yvB=i8M߄RG{hGNT{f'j񇄡wUF &>.>6?X"Rp l7Xbv Q<\}kT۹I ȼ[TcOnAla4`5۰~ wi놔wO^H<-K a>_+|d2(Q.8̊ f/'&xEJp%rh !tO9 {oIAԅ>TM# n"'ؽ?qaߪT\ʑпG q6{ Ȧt+M>k P?业ੀXjS1%GUZh]nlRFdh0F3X(^ɳ vށ!yx.suF|i9|uۉpA؈`0D_'Ce 96\#Z(d+ O /\^pP]1`qJO7h6uG BugeSULmQAw?-Vꩳ[ Z='878yO! irõ<+h}ƭWB=)zYMN 5!sՓqrӜ.qt7A=kj!$u50\;.0Ǹ-Oo7!%pՃ+~~yQѿp|ZaT) OK-rԣ/d&'䗣̕,nWRMG_Z6+CjOg}mPd(/aoϕh$f^Ԩ_T.;h[ ]*iT%0@les}ђ-;J_<Υq\"\a*Pa ZnȢ8Iv ,ڄnEV%ҍ``Rx0)Y^ޣ}7^)m[ٳ0ҧ J)Z8\?0=sҿ5iZ `q1ćf-zܣs=5C/q4nQ\Ct$,lj&g5-3G O=t%tQbm426 s(5 ѓs%X<"GOQDӵu#;px1&;kNoꜿ|8ޤf%,z^&p a`#/,CVPD)7]eQ&Njo>_$ En:K A|EU·#,Babl^7cm{) (2.D# ?#g?R[@|-DK9+H?K{sx'/{{A%/ypZ\6,]]1fA>p nPgO1ɩTZ'5dj0,P+acaJk"_a4dmYSv$|Ed$M4fm$KlHCL9nK,Ċ2(P'pRzœnl[sՉ 9۽#-?_.ʑvYL/I f蕑liI&`U4:s%vw{3'w _b9[@|U:p ^C_ۃ:0iƆBXp iwR&`ᢃQoAW HtjF7^S#l5aWJ\Q\AbfxllPfRB^˺ejjkb {&Vм0:nTa&Ӯr¡ t J0 1>ܢaXcrEfGsϾš}k徜yRW~ 'ê}C}K}A֒c)Šs гw٫75<wck,cy0H0.4黨\u#acO͠gdڞ bӫpO;QѬE Yq_/*Y| #aPpQ\=uˆ$7Dm/-WYՉz&oOFUr$n0"))IDF5[cp]Z, YkY_C/hcHdfR4|ՋBvHēT1:2'%{V>?n+ v])G. 5w[s$gzw^<8?b.FWݴ]k/xΎ)YW>cw 93\=|#?&MC8Ժ qXD|svwF_f؂{soMJت ܮrq}ɿm(MR7X1FaWh[ol57MoңӇ"{.#[ɱMk\r H:Gjxݏ̋Y2<}b?~rXgr#P2s|w?55}Xyr]U_ ~/lݿ> F>46u_9 8?΃tt2\\#]T+e†L b&³LTS-5>:^bzL!Y^, 5\_qVbgˠhBd=L [KR]P,h;+YO^D>6a!{_Xy3@Q>g`[\Z|]ٚ'pk¤5+n9 '8ۺ,Q Izwq%lDBhհ T:\m&OBRТ\Z|ͮ15LaW^:2 l%n@i9GcD?/)0mDK߬rz씓I "=4xߐ$*VoŚK^"Zi3<#^5x$Cgkdz!^ŸIyY)%\qp.<磊$EG罗ќ>LNRtU9 ca#SJ4@F=NB”X̌]wJoBE_%-X8֡=qOMCkG(-4Z!GHb]7>RpE^<;,!S'6LI_[+k=G$|Ew6JZt&s |5#~wJ|IzBMRP eEw"|H'x/.hЀ?u3@]uӅB<S}t}e9i:^>2V"2GLý q]^TG?GƸvQ2H0:µM/yteDdZaxuQIk;JI_"CBV2!R1'%6M ߱|hxiF_ <=lcXb%hFl甉lt`oILm]x0e{Dq?ͯpc0øN<'u*YlO:^ch݉Ym?Fݫ ,w?KlR -Gḻ r 

˂dN|e it;~SAx=1tOk@:Ta)ƻ3qcc9Y| [P*8+G~+CeoZ%Ρcw)wG_.pyP&$}L6:\f-xC]s( Rϋw10Sw<Ƃ\մ.hY :팤|P$Rgk-w򂭌ZBtțDhu^yIkKnx5͢i86jfmܜ[xyqQSXR9<4MQ/'ұm;L.@-*){m۱0xC} bO2x'-?H {GI,%n{4>u\/ #)B9v#:y}ӆ\ԡF;B\ݜЬV,_AYH9FH;Lfu癋"F}+O;*<կ/u4q#4ˋDk}<麋|"aUU0IKF\ob`+lPɛͅ{n{9b%xN}vvˎno\hCq[=XXAZO8tlNL18:q`4>t'\"J"'?\= T![:! !nv#vK@(y8,PTp0lr\X-]T܊9JaLt *VYV9͖B[Cp"\u>ul#cFҵ q!eEy锅q4 Q/\4 xx1-^Ca4o'L;4Mb =N%sAޙVLWpNale}`n^`9XEG?"K#PɭTjǐ%G|m8tyN֥i QkҴq}bfI|-<HI$~ˉ"*E?\3@ah#?5s3A0x>yT@:\΅xjo-9V$ zGj۵v}zz;Y) =zyxpOlu<MJR`כMtҥyh5`pIX(ƃk7ϕ?yBי#:~X[!=bG;}S=}i61~-Z+WEb[NN"Rf}*.XD ZNT'$ ̣P\nHxw(E0jT k_e屫W>R q8ˣbWr :Y>qLQk!]%2q#>w!1JU\_w9 a|~G Me{idZI% _JN!S',T䊒WkY~.T'F|v)}fgf_ zgZ7myڜqbCs60Ss& NWh|A*xvup,}mxW_=ֆK5NCګss'Kob2)3BX8p 6{c_~;'`sOE " kX~e>>>]i_RM؝t4ukQF#CIlב<'%,NRp_$I"PD4"QD(VɹbajKwS86 IQ (i~׬Տ6tߠHgءAuRO/8tF歐/ dqwT7*4 wDz 狥)38lIX;[-/m,'ym9:"M;\H7I3B(mLKD7,^ pK%Z+rc x2 .3rɼe[5VkO}?$ wy=kDK 7s-եWlFjuߌoAҊʦC0Sa#bu07*ʛ>mTS6s$8FhSi?,r2amM kH (HY<<^ P@@%׀ZUɳכ$".æ42"Ȭw5!Ec@lM[-ebAT$QjU n$''C[8b ,j?xbL׸pI~O4٣2sb83egw'?c@r۹b6Yq!79vM1y=i8`XY&ޢFt#5ܒ2U1.b|}I7ɕ$Qcug0{$_vfѝ^c0CwZ(G|E3EΥk0Az芉oL:x6+\郧M`+sgj`@8֕nݓ <G{FljmX)>$5E#R+a؊̑>j[@kN5fT~sT,>q#HG!DѼU<+I1%փ%#ݛr>eip~i|cԷY >Qr88\ƘԿh;7lxj,'ȝ] }狖g>4Kgkޥ ȳň ` 1<Ɔ-$4\գWdbp?\B!$-pU_Vf %VOZh9=6/qpQ Cq:dVG"^@o }h!]O\=kQ t+^/Q„1˭rc[T 2hc1v -oJ|,0ɫ{|@..!wӾcaLc+n: bǞ|sD,K(;5N}UmqɊ}| keɔgpM^d%Kgqe T[:l09I7loF@qVyl:yOf%M3NS EdmV1J p9jx)d2H_? Qq J#t2ހ}|/ҽS"RV%8ᔝ ڲ("v"ᩅKlS]iZi%xY>SŦN4J? t! .~rSYڸ/<u%٘+TICЭt 4WvrhPKR }稕\*Ƕ$ ]yg_QK0D,-Ίu! 5`-ɉ))u}w퍊b-7<~ZV\ myn_`d?Qbz_hNȎd t<liyF 0&0b, uY`@nHB: پTRg`} XB,b8+WaAk!.ϱ$W'zTS^P02P0F3L1r9ɧ<8r$/2 z;khtZn! A;%ͯKwwOػ/X-X>t__'Xw@QG"Qlt/lbSa%߶rv.Q~P# 탔m_a8l~< kzz6GKrEɯtd&6'+14e&؞b]DR\'wTꥭAIۢמ< F8270K&5nYt 4ҴΔXd ~6r'^P:`nUw-PS]%6J5b ?*/28+ &D&Ä6č,&*(xv>4<[HHg{> {QH@2 pYb]&vQ9vS!@x /V|#@8cw >2qĶ:;CvW³ f*3 bd,|c(AX;GiX ¹Kfroe°k/ʝzڞ1XX }6/WXߔ&h,>; ݹ;Ɗr֓i]3i"YTQTVS~BO WJЧ2S'X>/B/|m,fzlħyYXavp8ǔNyw{oU:(8#g(Qhz&?)ku,7G"cVү P-.93L]8z'ۛ2a]?&ˬTUޜͱaR54OhuӚ} Iplb 0+Sǩ#)S?_0E}?Qgm80I#K>,OA>b2X\%URh 3ԀR?,gLV4fn:~h#n`pKbTӗɾ)Zb֡ψ5u=buʦ7\V%> vv1?+iOM \]ap?ZGMl.}X'wqW6_RXނc*cqecgx #S'{3^=AV#|#UPہ]ݭS$ɖ=5ؼSm̎E\EG*(& [ȸ0m |ʔeoarv"x\لR0q7\bzI)6wo5|9auȽ6!$Х+wx?0.5E]N[V!Wp59bU<;Q&`zri&NhUeBnUb^JN>r^+1fE_jpRKd:cn=קO{`߽%*`qr q萱}jh3{IE4aO/ʸ7>v*_1, Vb9v-vljSy )OX8nE裳oG}wo٢nFx@TcC.2IZ'FQ&6&$؛MXHh't/A'$ԕW#_;[udQzer:GHk;U޷͟}؊'Y2;$.F/%AXj~(bsSWO$?+nM{fjaUylDıﱣޓ;#bkpB]cʨrɴp}2T:)=oAO7CKwop=@n]ذ!#>\sn$B P;6U ?rkwWYtvP_kG|W>]ɣk_xI<̼^3jx|v,jr (LBN/'O/8Ȁ7k친gKL H]%:bWg6~N2E+ۉ Tpo ql닂0Zcg>,~S8m[~ 52N>?#sGhb>kMYicn~y@cr-}4E;\ *Nɦ۸+Og-W3KXN+(cO |pDWBoA7Wm7\ZxDd94kwN!84nI17=ȳ T%tA~dXo5꥖ ZC?י]B=XISYڜL(;TO+JE1Hv\ }C>ܲGSO\֕=@B֙dD+};cP{BP%k\Ǚ#8ͧ{!1N#QXKa&5 1xE[yauڜQ_-t_ ?4m#޽%*W:{ _xaA38e %iѱ? w6z3S-Q}6̈%=##NqqD7z8+4 .aWmZ-i> 6CbΩ'__S~[ +4NlY\F'V#OF ~Lmrg䜖,;\Yl:_IɻF@-w%pCVqmTj)q>ܒHMn}>qQExhfTVS%pϲe*q6== WÄ>h-\Tt)f04{/>i`q9LzР "V dԖ dU:TGl]. %YUٛYk>d*{({8!oߋ!utD0N;πc2:v9oư!Z0%%neEm>O}n Ng[ <ĖO"-w9;| QC4{ yleC1o(Q )*"Eo1loӶ(g~&aqglLڻCE-7QџO6g|De:znޭBO$RWOuxVg`_8v4 ѻ2:6y 2)5y} <}$RObB{p7H gm~vsM|4{]C}g3k y$-$f $"nNMu'ȥlF(v2pScbΜ>m|"}|ئy(+x{ԏ{z=`hZln(<̚6ѿwZ$uSj9w_ؖuʷf]#mƉ AOP:tz'{!>vPvh?T9L]4Rwg6|L>VJIL:9T 3~=,Yw8uFi| kb u mW_F([b u;Zc琻ago?M2ZLJ?7A9Yʻz7^\t#& Nfpw*vesdAO瘳 |"9 ;}Df8[ "4%X ^퀻ŚbFξD%dihmS{T8qSONk!R}ޓ-.b;X":N1qJդIaϊXGu\m/mE Yk8\8ꑓ3포E glZP:\wFyP Y2̧9piD"z-{j!Tt椲=&p(ZtTOk&T" rcLMw)y <^M+".Pc_@ s]9G,kſqf[E_??q L|0Ⱥ"+KOhv9XK C@Ѧ֑|c[c-Vao:AJaԇsWkiyLbu {Rcxc_r_!q>%Cx $3LCV%^ 8՞H=pN_0\+ m{uJjG}uwP0 43LuXKSRZf{_/D+k-W?`m%V6ءrӏ}HUC|o6Ke'8eUOa ϹDn&O䞱(Mӎr,à+hvSy$M8ͷќA]TO3\6qv IC}߇~TDIKJ~ԇi{ Я706!*Y0}*q{ NX.Kn}VP RY\s\VEm4n풡\r\ٺSMn>:\TE!L\0,Q{Z襀lQZYEY'XFΞgDPֈ [4Eesl]Ԡ@bzh͏m3/\w`CÏIYGUf &U2qrIIa98y 3<97(e OK]iCJfK<&M]L*i pBC?=Ey!sVA}& +ӷMZ7W4~Yo<2M?/G] O2+eLgkmaq{[L*z-_nJ0@s"zBUUn' NADqZU6o5bn0hX+ґA#G1h k6 f|%$د8F:Ai\g(8&p} e=I*dTB˹jE ece I j @{"@M+.-M !8w8]r蔇d ]Ba6\]Q}ٸ{6R'QVLk )Uk#朋5wNp )} ^Hk RsA,:w*(Bz A!_pPYfvQJs>_zpxDW_~xAB7 XQcH\=7{Ea+Gog@:2Еp 3K1)G}y=323NsM } 0 aH'5ئ;l50hHPD")}5WI*݁е:r=9{]Oy;.\.??S X]* 爸V>wއțj^8ڷo{ef ѪX <dت-Jpt_^{k?ozX2==yAB C m8G&~5=c$L؜,MgϞ+SY B_>aIn7Cr J:=qc]2l1'A@xڗg%)ו'l 8et)~bt_OuN3Ï-?ϰ}eak:iNkEy1Aqj5ʹ8#^'6hfe H7^J#R>x^v?2Z3l}T[N͗Dk|/qx0]oX+mO(qߏVNR{CDzYul-9oU2KrЇOz%4UנM9>\7l1 2S7Z*pPnqjŽߨ:l|o t_7lo[qtXq˳b^~6fLGGi\!dp5%ӹ E"NGe0IQ#HKbf+,y IS@l<^aPGU-kyKp}/9Rn#t11ze{7uk=~[`l8CR>g) SY8_=aU߷QD}9[ T  2[ rZ!P ۅ U.>yߋ. ܖ 4T B}W; 껊{ &OiXNyz3wOoz΀F}M;ӆ͆VeکH\Wi{=rL[VI4[ ;P/|&"d?c]ǮJ=ݑtYyLjKsD&QW!WO>Ek+Lu_Ù>RF^Y ~G?{} a䛰ڴՄ\з uϬ)$V v i< S)te=fAX$l'%|k*9؈&͵ft {ۘKwWDB}l,9йecFuGZ`§5|B\_pϡO7E;a9t8p~?ԲڈZ:o~g ry4;P`Zl\阛Ix"V\mX$[z )njUic (=_дZݯSD-S)@3 +c6Cx@b }lwx{¹;{Q8yt!/ͽ#Y6epTEj1uh[PیwN^w uc`6Ayx*]z̪exb 2,PtU% QI'\5Q~bEWt#Cw$IR%yv';I(CcQ'fi^A\Н@HqVoV/Q^ad:m{p R ~ k wJz~L{it2s/)W$@^;זrj1MPǣu>>LDM9w@}Qn#R-Ir>fvweEP'u`{ mp$3c}$ً wMa.M5!W`qjn6IT CU]@ p8=:}*pt>8fpRF{qKߕoM s84ӳ"1U#=H}Y5 "EDwM$MHGx:9ɾ߸*MQZMTe" U}B`wS,JӚo#$GiuYnEsimt-4<BL@{쾺zdUGw?xG3"u||:_AݠaKFub_u ByqKvp"" |* >8ԅb-58#dPrjUv7袘^<~NkmL'ʺ9tٯ=]9-Ex;ƪVnäcAjc ztl08D9tZ(\ J`oc}X`*`Λ 㯼sZiu[s;^6 jiɕQ: B{м+ID%|,}GjR g#t~R 8NFa[#!)k8멂V\;{סoyd/Eɩ^bq|bt5Mcj}+UO:R _x-7z}x&BWS9AJ,)R{|PL{Z\;>c"nVjI8k(L2sE֘=JiO^糬$5$`p$;+_o)s\;|ɖ˾uSo]ԉaJ-ȝqwtdg1pMI.4 ԣ^=@8p.hsu#^4n Q7*X  $# vwZpD/ 뢐vn*PUb^_KUxS9刃x`$CA0 ڏ>uŠf l~clD\s̛7L6kwww|÷dJ?_UgJt}|] GK<yg@OK~/_WmwOTX1V=w~eZ37[R>ٙz#dĩ(oRgվYƞ{%M 7֕Ȃ`h`ZRO;g'G0Swl 4lHgP ܖ6O"bOqƅsGg=bh<1k #C%c|iQD9`x2G1j=k4U&?V6ӟOQo"дW Z:~Эz%Nvʈ= I e^'ҵebhO@{+!JO/ԭ Bvq2#!zҔi"@5mH<7Zǵ؜O+b|C͊;È(\mr'm8Yhbn̔ԣ8WGH\TS X 2h%nӱ WǤ*Kr:muCC(ID.q We7 fKG#i{>%`BW<ʚҽ ^*VG>AS3uS}z lj؜@9^ p/7ɬ1pH "=CVO2> y17`qtifCaj'Bnp¾;rNCgf !WgB b5BeJAՋ>. d}`le #ýjl>`b<3% I]oōgf=`;2)醓h_bqT.$H<.M躭TsVoOJŌdT[ JZSUƖ^@I$9L-[6x|LSjI)󬥳/^`|OK/ڮr^< >~nVO3;KE]SBGƺ2H<9y}`H;u[9Kկ}CU0QyR"~/ ?[:Ff(|оw\*˯V\fI{^a z`+%#q܉A%AdhRՎ>':qJkOxJc ZDX.0emZހR"kq#2GQZF H4AL盂FUy*z՛ ֏=^ _O76WGMqfy ls o^>ڡg l$'D/{m9Y#5*wp!' ICnЯܼxn20`({QQ7 i6o=p7JQ"n }؉츶0<߂ d.n<*/"I#cxvxKjdq賷6@vZ/V w⟸aIT"6s@M.o1:q/,N?,$°2U l-?3`*t#겋yǑ@ %XHpZZsjÏdž4;'zodZ @be b89jC%;SǪ᝸-jmcwg>d]>&㳽UgAh䅥Ffx4 n,يu>>_Ԑ͈aM^~^TL>=G/T&MZR<s.n)]/xW}'eӅ\m{4 ~ؤbe뎩*n^,E_2Ř]IqB7]m27JC܊M26ZyQÁzq+.7UDnHE1h$aut_[C^[놚M+ '݉*%U|Lь댫]8 |2#K.cV7µI ]ytW^?pཫS lk8} _>d:D٥/M~ߥs`NOI].;UJ^h-|lT%.B.,< ~*㪭 сIpX{h{fvMN \$ܱ;$h#wkCO֨ozU;h P@zTS@/z0wlV:.FO\:{ҽƬ&x+w%a!OV.3-z7| ޠo1%i榷|cx ('h|WԈ}S 7M^Ǘv@ <^mn}F{Ng[\ ˸;쎫W$MjE` iUI66sN5gsXG!D,KXGs5J)2.ĘLZ2,1 \x.~y*DGD:abd{ gxQ<~a# dPY?ɶX!{톄'DHM+'!o^"zCty[$nf?/eͬqiJ}xE}!`7k Y֭,qѤ;1 uγy7DKK_Jv^IQ sj0H|}FOOԚ>j c$]{HB_Gb?EKeNuɘ5g-Q=zk<1y?^P*rSf۳V[X@HiİIޤ:WR~VrPkcC5@Q0?یx[&:~x+0T qAmGŕNMSjދ^ F*ә;c])x2M 1 J3 s;|W+Z7ǀe㧥}UjE )SƦ!oG:,r.P_h$,HIUBxJu-ߜH,ωj&Jq{ԄvjINˍj6Z۾:i-7g\`}vxhQF圗 t!E¿ek+dd! gxŃڍHRb6}Ϝ<I\'(6h᫏'%e2(vU+edKrޫ|]O|R:m!ĝl:8@~ѳQ ty PHׇnۭR6=Q] gʈsdFԙwLbr]B2CՀ>+63:bY`jE C:B+FjZ8AJ\VܸU`1Nm7~[8 Sx#n|E|u Zn 2G[2!If8]tOȺ1O"h"?WowR_3 D:SgIq*s^aH*@v?紻siI?K[7*B{L NqP*o_C*ƽv,_q~eP;{jH 0/Y=hhuFƱ;_T?f 0"'$0#N>})}L,cۃ dR| )#!c'lo|(*F4^$w#&>,ͭԑ鹨 3 pp^owF3dC۽ݾ=qCtǾ$p`VjX:,]g?pJpB~': 6&}Ď g[W =#K(3 1Dsk>}/s~9U')fτ:e"Olj΁;E6T' pOn7rGie$VA^ %r (^EÙgg_tO艶J $ !1ܖH(|mL6mclq/}*t\Ht[ڄNwtw2LjFTe!7ኰj4pg:RWG5#ڠ5 q=U6UaI3! teSāo0C"St=I!;??.7QZY:- GOcp#*תI: O5fRzĞ45I0_&LN x{mV{Rt9,[eOPʻ[ṳR G_{hEfb#}7_`97\x . X+VNVI`2Pׯ\# f {(^:e6ޠ%}ÆХ?7^m(WH edUyFyY%_>AՍ˭W7y@q(NQD?3 [_y_O/[rN;~3!)-*F ht(2p7`}FmjnDnM*l@t.#ߵkdf<[> `]IӧNGd9c(}A8q+ı5^"U?Eh%4SNyG0ȹ AN(|U*Z&O^{jɉcxȦ)D+'ldWj*ډd,s mMle}KN# kykoh6CtJVca+9cӝ!Pyʖ٘j?jܭ7b'(3 F|+f8t@#.ȷ+ |`-A.,EpX.ՙ0R9AYUŢ#(2œ GdjP+D5͕'C LLx@cv8DeonC-= ai_ QzՂQ%PYqG O@" sNAA(:!4Ҝp>0ha\3[+$ogߍ^'-\T%Zw_<%t*@Wks@ ;YX)\-8c♿RԎ蒈9W^I#N;a!.mε@dZh{0_7Wi\?)F [x\L~cMYYr>):L/7#5iϤO<ڢ1,9oL\^RUq<ӆ?΄pF~GJdSˣW~IGZڐgwV',yF"a`wy' {%=-%BAFݳ %w8 YeLA4sX͎;).j/Կ*`mPbF z^!%I Q9hˌah?&g:$>8Hg%Q" HCS+rCIU̗O\"l6>Z[_ODK%Ƒ_۷>Y#B'q=aFU@p8W)Z ~COn\';# &2b NYH潠qGrHa<A&q ?*+46q=ߣy{m1j,>~m"w8$xq/ O靫_8G^s"_Rta]ߌdjdSUI0+vGA9C\rw<̾YV\1b-y#j X0B?3Ir9bk9JgMNqʨYRjњ"xĉ;!y `_gq?TɋSĺ)a@܄6l+ yC O%lcHvr Hb(APXHRepU>g<=<ٝi=)eÝku) ؽ1uz4<]Dk )H8>EnΔW/>nMZN:q4%/mVZÓ5@~`i()4WQGJ%%nKcED̈Q@4$=@iB9\}D_S:b]q<㽱PA~,2dCT \U0[`ROW|.acʻ]!܎6i;v8/uOp:gwg^N,~ω g IE p7v=;Kv}yn ?wg05Q?}=;7BN/ǚ(v:51 oXlt9bN(i:BEe $Dzq١[;xkL-/}~|ƹ3:)m}s )qbj[ˀ3kt#`ݍUc]Ur^f{ry[ztrNZ۳r/xIJaeE5 )o8Adp=5j.fx /يz'6v,%.Mk!'i>lF`HJ`ƐlX+HPİ5!FSiBl5K8WtqnSI\g?K}qTܲo3OyJeo.A$qR^3*7zw5~]OR(`˦8Q <_ <^M~l+Hñ;:I 7 6 g^ #f=1O2tL e/\3[QgJF0t6ET1d԰`p8pkp8aqKc\51Ụr'aނrUDCQ(>S? 7zjhi\9+Kx]`&$h~'KYRb.X. p \FstW&H[[~4F F/8| yq ͨɅ>K)B3 .Ʀ^!68n~cűh$]ߡ^OVCEگ: I!_M}XaճP\|,͡Gt"{Yƽq.6?Rޝ8S~.t3%U\7$oGvY:m 6l=*wK_)`  tzAE\F Cٗ8\JL:Ks2ʨǙv[|I\IB3 n}0ft{tX^Fl׏qĩ~1Ic ݙI7g|)^-/]X~/v!m uVɩ̄PA s z TrM?5iX-ؼ>]+IQdNFţhb<Sd_O]$^4^`Թp 3![h^ 82w, A=mĥ q >0%DhZn2k,KJ8̯c ZZpAp\ˋ<qi*c<ӫ} ! z$|)9~(i?WZc/nsOof_]!G/VzEÛv*Z+g|݌\hٽΪI 1'Qs$&(H '_cS} \"T5äĶ6=_u+\W$[~O}ZnC`^~m4-/}*4 %Z+4ߧ^ }_cBS\ѷ?xHfh=nH8olxH n~/_SH 1 S%bSyJLzJҡq+Fu鸮 X"*/EDzBbZ,9M7={0X1a+e+}Q5޼+unnٖR!8՘Kw%fkwE?*[ېb+; JfAحqsÊ G<_Aci~:ÛdK1 G"O {uKw`;")nܛ1~PƖ `%[ױ '$o>hZfKm~j)x:| g=#M"_c /6,^,6 |H C: oltb%"xCƕ?OMH /pjD2 4!p*W[ 6NE`2nXߒquݻzA Z~h id6zMěQR:LոԃLRn|TlY<'bCpUD;AY]{;@ԫkniܤ_M2h 5Y$†ۥbFgٟt򃫄*,9gbR݌j e eE>r+u0t Ig6,;k%Ķpp eӠieu9>VC%S#ڑcupO~  Fs²e[Ѝ4 )'Ypv(iTꩨ>/ʞzʧ {Kv=6QPK_'&:%Z];Zax'*az~rم=w '<|y/aJ9Vmsosx'+u+Љl+8 YؼHNEA+Ȋ:Qf+CQ&OҩPwu,Ww^TgIx?*f`6/F\&~bcѡFt ΏD}@MTjrxNaz. N1ߍ|RJwQ|6ğ@lE00e?!rj˪CX~/GwĚЦV3LkYA1mx,}M҅l>;^xOkWk{eىeяfFv_q6B}ǯ/ ʪa0=JVeW"LEE8y=Ny'.X[PڢmYFk|bmaۃ3q;)8v3ΟO^=NK}-#6.E2Ō>ŘjI &ZxPX 6N1A}U|Ԥ韮1pG {At#UfCp<9Eqhˁg:ߵ'(:υ3[9l1.x:$ ]y+stKIMPO>}|G—1 &OgbuY DKNa-q;Y0 sTBS s=#a ,lk6a6cPqOd~M^ B@7y%rGi@`EnsM΀\򻁪͟C"͑ݜWu<0^gګ [$1jD~ks55{ @4;jFc鱠BYc8WMDN#+(W/ ^Ctp=O䟂!Nˁ38aBPæ}n|aԥ:*U\m^JooQyݎ 'u D n @FdvD+⁡|o2ˑ lknr5e[wxP.lΕ$;']#{|Aos )N_~G[7A PI}:34v͙9թ"Dj pk$*T}/K{.tN۰@:;L;-35('f9܉aаu4^#/\y_smqMW-󸐡Q?nk:"JԞGLTʖ %%Q`/Ϻ`Ί/El"ا˽^97GMխ>EN&Ϧ( nB_$ՃA\_D\^CL|za-^ck1oޡWG#>m i'~ϱ{"}L&"dG\kɊIi~6lqDPH{p^3u4[ԟaK>d5"" ;T9x۹5Yv~_iW󣷱؈*pkP+%{:q•G<20ngσI$][=Gtr;b:pć!+J{Čou' X]ƣVB-S VZ;EJƒG_}ǣeEG!sϗ -AY-\vL"dL2}F$`C0'lJMU(m$b+8Q ҌLK'kOjI ,#ٲOAUOb(MHݓ g7 뒁܃ٿ7+j2JY7[Cbd`W%Qك =6*YHHb EP&?`J'dzoGqBWtY PǓb;w^GXʒS<`MDoO`kklo\.!Fe8# ]/ FxMv/8QE!g k8Ի!B:"< y¤3,eqVOʫ`^^Ҙ*?YO`?t[FA_ںz RBifz hn. 4ѕ-qjmmDX~;uasd^&Ռa#-2b11U.cc/3 &em#]ёѢ"LB:02"m{pL~xp{0R# OהyB4F6xW}d䪳CٝYѲU_`m%܏nH·iހPl]G!WJLkخMsPO斍tum5e [x{RMF }C&(6L1,Xvb+^PmyTu>F:ÿc4uȅqr'/a"oE"ʇF-G+%G=kn#V*9aU` c27a(ow޿ǚ/;d[6Q6<=W-;Vb NVK󦿮wUa81]3;V=.vUlU!5_MZld-t,Tr9%d0m]]p'\*:" qN&JZ e ,xi% G6Tz\mE, _myt\{$x?ߓp$ ^mu_9$u2hR@1ӧ|'pymNe LXz{7yr 'ؤhd]/9Љziiq4pN VmpbhՆ'u:h K \1p/s2fk^ε N7m3}Pd[鎸|]Bɐ9k+ B]4'~d! @ʾ@ 3:89|Wf`l*{jbzzow5f)P0L!qs.Ĥ͋%B/J7^t0Gx+:%rIW8>;܅#9NW^Ǐˠ%`^ny&tXdbhuk qrS;l/yR`$Upv$ fgzΒBtU(v[>2]n"Xr:<шW3GX_캧=wПY7o#ϡTr߯e7RZN 7XcS[av2fk\18)qKѓN s^m]ʝ^3B\SN+l}k&(,D'A$n3tr)DB,D5:qbY½onǯJ5_qVCƎt sWD`6~͇;o"Ro)E01ʶ7ck|:~y[uSة 3[H&m!jmݞʆ`@9 w誷C|z B<:$IJYVLPxV$':a5z/DK9}OgAM|vuK_IW(&]ݼB)ܭ+s+ќϋ]1$"\^ڊĬ"^O(8T h(|o^"#MӚA`|$GMP'jK!}8S R`pf`ÕbMlX\uG^MX'1hHj6}[V$H3V5ޭu[6*_q#~/nx߆Ko=p vU)!3gFmĽ K+ب ؏èA [ģgCZ-~,6q(oIDҪZet$.siF-|OšYd00t vHY?TQs);$U:+^~G  wwJr-dSj!@xV;w\72Dr2wW]Ֆ$iHq_lj4g yP9]:`|gWة³Ne{?ѹ~qס HՃ>pO`4j3A[J㿷4,V5#?$ v/^}LCi~`5C0h46am ^:Rk˽&GY5 ;v+ W{6zG>xRgO ucᙀh3|68P$C—W)tKڡaI Iq, ~>`g I>~z[4E,u~(zԀyҫar2yhWk3l6/M}!\ C:K*<EƖdo7k -?r1D8uYyR#dkѦ7" L 8WPxjtktEHmƧDHeROҴK;r\Yjw -~}j@kws,Vy~Qx#F=vw^@o{_cojc@ԁҰ2Y}P}=}ʺ~zs%?|v> ojw+> @nV%Z'2<diLR>KBhApc-Iqt魺83 )j'G0[?}Bkc6[q$>&z¨BsG{Pa-64!&q W7~Ex*{֘hzCҿ:g'7uzd㙺Ѓ\P+k -=F7xv̦-#4}sPE s -~ڕ߸"u Q@:52ª6>$ FT6癮"p P)墻 x@tY®=7o-^K u5)=[8,1jIke4}*ҴGU8$A߁k]$Xr{fRv&pymݒ| PNˋ?OOiϧmL  A勏 b.Vg}O2)['oM$ H@ HbWv=N,K* şp\0EO3:[c`c3tjD{@|9iѣGpu:=燿'Qk8^X7  f13{tf2Fk+= jٛ&ı\H9>OG᳠!=اҩprMDGTzѻVGĮyCR+ ^2)=,_ jc@7ZTUJePVCž!:g)63$ʣܰT=! 7"Ge:|*a<g|W;Ci"#^@ɥ^⴮ JTfݚ6~$\@j&GOYmAsbdeʉqHpN#p 2VeUkݐ!l^ R6!xr43ypg2-1k~M=PFNsQJ}| B ihJR8OPI/tIYs܌wcIu|ƒ < Һ&y+y2B:Mmr[0p &q)gcVtc!G>Ls{ϊeHփX}{ât/?Z*-2*'Di)kTt$LDl=(~96Vr5|V)@lxF@*T _ ͨ:z$_(}sZ*I|+!5qP-z!Uٻ_B>H4?n5L~g#V8>Y47DvIهv-Y2M6r_-j*'$7'[cۊ wp_8Iw!j"']\jKűv qm5lYiTlq]n3̝Hs1\-/|u ֊oWS=q~m!Pi_ޛD8СAw R?~EO#DCd[Z߾P)[]&u#' {g{&obڼ 8Jv4K:2t8kL]wy!nJ6C KJ@m PL$qbi& Æ:gО4&_>($~.Q7U#pE|OH^gk b!B!~d}~jl  WX5\5@{ ;f7<]@g [y W V䶹M"v-dq?bB9m[f>ȂkRrf%{-Uġ?Dx!@C{֌Zs-űosTmPˑvMC|](|Yf#moXcFN8\ T>9q4';}~qiw)a"* Ƹ6[qqGܼ}ӸHL8*7xLB~"i:N>m4;rFnN cDg>-7OA,?1 .urYZݼ.¡,5{|NEα/-tE!:Jg_Ղ|PN=ˀ .z |0 _&m72 tǙ!!zar5CN ܇'Reh}({{l[jX:?AHa`cj V[}иXfEo{uW)AG6W{6;]K[I7}}̇A;,"P'%xy=D_B<0%& w?ýM konJ9L?,S꨼QKw> 9S½!1 Ɣ֬E[,8êgB"nAbrVGt +Sv.$"6}./j\*j}%RI>; _uQm™I@J` :y+N*DT|oSyRPn2 2qXxtWLelu*.gHlUȡ"ץRcCn w+TA0 Gs(7xCF\4.705YDhr0ojX֞A>kMVZE9u2qy>I/y@.͠ ֖>B ?&:X0 5oY9 oAtU4^|'X hظ+Ne'.9[k8 o"ХS 0\PRp\V_[Xn: AZAw+i%@/D9LSB&f4t}}`8˾-m UVdV3-?;kMP*S'{as)x/aND.=R{~pϢ=>>ԏϣS}3h{n ߞ0OO[]ޑH+nFs%)6+E#+Җˌ3sxo]\NjEʄ\kU+ԌHZt䮻/GG f6#R<c []k =8v/,Mͺ]nջ/tuHN/AH畆5'-Dg LD{*󴞰[S>q;o^5iB7N }*b /cL| OK_7Zu|m 9={ 69&TX}ȋ4>}]PC2p7T7[6\J Ԯ,3հYޡhYfNn_׉4(#lzؓRdש8_w64WT^%ӄtd-'AWn *sۓgtYclBmb6$gm>ixDvBIK 5g0m, ꣴe䢙O[O<ͣuKC{q`EAΦ=^2؇jݾjȊq5>hK{r2 S\ڂ7[JM?&L`DH9żq+Ұㆆ oQ ц_MD Ʈ8 ORnjsK`U^iqyq"g]0vlbʬ ʘ/l"I'^ky>- SДq{,5Tc!]̈́E.gbߦ%!xH_"kfحf1o)])˄}bn,Zu>l{ s>j2KKi a[&BWnAk%,8Ք{+( $wzn5|]yӁ!?؇|D\I5 8+56NvWƗW zv/X dqSIUcExAIycN(BcP PJufܿcZ~?;dnZ#:ݺ7Ո4ljzt/pGyvw!RtlE<6UO\˟ZIUB{(㖿pajAڼʴUU/GuL6Sښbh}FHl N0Iiȏye뾊clħzVʼXsO\PD1Fp j8‹:Wrou=xMAڂl竜ѷ}wE $&a{ZȺ< r|Y M}`+< 󞠞"L]*JCdE=^qZ.()ZOfbs,F4~xg\K]6-]I<#ÛU"~xEp3CoC#3A/s8\N&A㴨_-97v:$U!o_N9$'"kVFew^1 ?yoO:JK1hpȤ4߷1{ȇxtW?D?]G7bؖESr_Owo煸[L:6{|J$o\ݏkGɿLΣhT[ָo d:VXWo8XRD]XQCK8Vd2a~v 5L_/4+&$ApZ\ pg%oWrx/8{jLl.G.s7n#ru Ezב"tSl_r؟*IO|a.~bLg Pu30 Hu_lC}]);]tKIz̷*dFUc}^ [gfWnӑSn׾jF˻!m6Rd:R%B#*E[h0f vU~54ü:|e߰i~IF}lsaZ?x[fh2Urȼ<y{b;qX%ICQmrbpGI^l|ED5ߧ mMoQ6|8ЀYX>]&'ǺΞ}7"~;OoRpA8󥃭~1A,6YŢ!ˣfj6hquUypJ:f;|MO^,vzfrxtJEco>.N-ʟݽSh3프N5YH:.CՉɗhJN’Ov?)6SXx#sQigna[ԓxj8gEr3U*?F% b j/֘@trk; @:JXK6JV00hX0ן&\2=<a94 x8[}zCu!vm3ZgV/80--n[b9rR(5T1ŭyw zEY%Md/t^%Qvfvu}ݸ)OD6'RMRr{_.)'bʦ.ƾu睮T Ph]f^{on#P9}xbE^D3B?$ & GЁ[\vAG95( [[i#)jzsą}R`yԵ9iOcE|%_gk+vX` f075bށ؝S$[sRCziRc^`MYDT]vHsrtc]kT2]1Kg8^ )Qͮ~OleQh=; - hFU^rd^%?rx#W9V6nZ ]ruAޮKķ lbK:,ϰ\8i O?hX#=)e2bB]6?TaϬ'qoF{I{MZ<R%/}cd%~g˻}+M<\A4q\>YC@s|BO]E;MQSϰ`fd g+n+P6#xdě,nVxM zM4Kh#:ݾi6ʓӑc9Ck )@%lR/(a?c::*^ء[~D\Q-XtZKvKeB8*= n;PhAO8Y0N[y}?ϬRa__9_-4jeA֚Sx$[8h%!fw!>-f@cݠݒ-1 Uak5Al~pܯ}ks WdljݣCI ,wo7IǰGR>D-ŹėwCvHRAL'ڌ1iIDnGFV c68h6EDt.xiSXn`AcKxH1nV`yH8mBgom]q\|>GhKI!? z@E9ޙ*!DP, }zK?NAt?1c3 gPыldu?`%-g'V)EQľ%$rjX%,E샅U+M25֮EKFgYJhS8_ i^<;lL'jkXϔJgUIݎΗ$\r!gaX\RޗߪV>0hVp}6̯У3`其3soIj'VZwgN<`Z cigqm3lC &x=sP#otU=򘪠vݞm$՘5$0'Yrwj"o{ck>j{}ǥ]RHl؇|25,XvU"m~OpU?IC>tmݟu=۔[cE`B8u;5,Yv'pde^#p,ಸ wpw;G9MeJȐƱ֝'MxTE-gkx ,(˓3V(;oAd+<:G_zdZI%*#9foP}W&w7_Re~Ha#͛0nM MBag{s/wMmiwM ߄s>6w= jʟ?b:Ů6 ʰ7(Քטm;Gi粵!{c[gug?q0 _4]R_fغq$9Ub2 +vFөBoSRBS' 3?|P^e\pߨLܳS*Z)?d5}bn 3/V1C4hV',|a!cftF=P*%6d6sZ8BBeh):&ڷtt<6q`<:M29c%&.B` Q 05x$qr'Nł. ŏOR>V˙ͪC[ ^yTD("A?vvq9'_# cZVJw~H*c A;ږ|tCnOӼ]+]gS a58WYҔ_e{|6>'k L%ULQĉK( 3͋ƷDk*˽d~Tl&{Lw4y1q~9B.LH22\i=aȖ몡 pyuz4 y<+`yғ^$^mxzOʂ{g[/ Wxs){Y/th]9j8 DMmtcZ>&^Iu|(QZ`t;Q)h`ޜMk^d_'|-'k Ǣ uZb4Nֻ"O#VkV->ZdeUH~FQ(߹]Wηn͏[xkz T''2pZB6B2Y)D'O>' vļ'TY>xU^5riEJe&u;\F褘Bu{;ntü酦?lz^wbF{7,+DG)1L1u$ Vwi9 FGʆ(#6L::AeL8؆K Kjcɫ2*pPSMB4q*u8|Q/k} XK>5njlkN9,Wat'R7(nN"oMͲI6*7T1G/}i%a!v^ZZR,!U|!֢ h{~~۹~ Cw2 «`G[-BsQ\k$Č7pqtijea{M5j. >OcL^5g涗ZؚUhXϊ *Vkdž [#[\]3b&{,@*![V'uM<k;VR޴(n ˍϒۻ3[Nwc%[AGg0{#H#i_+z7l-6p,G[=C[Q˛%baٺsWs|[yr=Z43;mnq(tZR>-)r(6[ k6ѾQZ@D =gPQRnpz^Áh(9IևO82usE˳'E(20Y z};h+_Rގ{äf;VA.8XS`Lؖ{MQ\h<1&Mֱ4RVZ sR򖆺9}v"ݭdz >*#ˁ삏,Y1_m)`I0:dRs\Q̮sElsZ!]w;YBOL' "fyŎe~B!D ;a_˩wa邋-Ja\J\ 8#:#?$:;IVk>dGOAyF>ʸ?Ӱ 监@Z)vJ-cJِO)6Rw x!RZڗ=ˏ۟}CUDt /:%ۚL6Xf:eΊ]+5)Rۯ3yxpt?\xY?k?ۏ,5_Af>듘 _e\vȚj~\[&O+OJoΩO^֣ o'N!؏s( ʒ?+H_vu2uS䙞7m$ՃIVW_fm~،eZkj{?)EL ~\ w}pRo4.I7{no`9笌ڠ[3ǹAІ%|b&a:TfƸ ps j+w#9vԞ@miT=|i{^]Ή8QOpO 9ϣ&JA|i(vW8ȷ jg&:*ZqÓk/C"}3C\퍆 _k[ ~dpȷ*Z/Ğ&qq&UNZ)>:5~f`8kr+O߶:SPs~ #]EѩC2L<kyScn ㌰P=CT ^KHbXζ=KJV+:4?Iɚ.ݣܻ],ތo vordR50\욕|DjK{g/-k&)|=m~8ҩF% 햍GnV~&n7dϥrAG?%m\g5goT*-5??| Yy񼧾s`tG^*i~|hHo]Rϼ=_*%eV tb헾LǏ4'sH8沅ށ+tf&cl:ý-DōkHk:{/˭ݿhmy̷MH߭d2Da 1 8zR\|438FA>eU oS0*y!s%A~ײVu[ھnm[^[6&%yo3β6:dnlz˲Aַd?~@ߒB@wq.&lyo3LU\_]I\J`{ [!ʡ"?5( ]8#Al}z0~G"U`:Ivښ;Y]u\~iv0u&c(,,bRQfƲmVz-S)d-5)kp=c\¢_jPncUEOI"\*Z'.YJ;7ꂊOr-guwGD"ղ0TwiEx{GDj;,aՁ_A~ 7 ;n Ľ+Ʌ{!mI'!;P> 7 2s`qҳn"i}).fɡ]dl >qn7bN>A"l!}X8Ydʟ=X&PL庫BWAmIU}ܸL=1\ߚ,G%m7sa^* KAnN)1ek V ػ ;0a􇃅~3YHq"}\9xave/{4_1N݃F SD{q~Y끪L[,/ Q;wϛ;(Xύ\Spq-VZ{>yUb A#p,m{_wZ{W% j=WC]Qŵ`-<(n,I!Y^-a yN▻s/0\].-HvxNˮ}CT3ϝ"67 3j)$)"-C~(hm5 Ŋ#"+.~.r OnU^ꭡ~ ޮO-*k=~wKn~~dg)W޿OX +,nnX܌8G }}u_jpy,@(&tCw| 8o<Ϸ-BA]wu].5Sh݊ao_7B}:m׻k5;׿j *T unOʙ<[;,(np~ek'Yܸˡ<ǒRbww,$ k>6{Gcg_B{vHI2¹6徸84*;ԷkN=hX~{sbi|?7v%N߯pR'<]RG7C{{IW4O}s7?Şz/09*߱z6e =}O  +Vn66xH!M9ǥ(GL nrJ _ V6 Ά]zXk]RW!7F)Mg蜣*q4xXԹWt09xH.wBWup)z%?\QUuCٸp :O958]a?|V*i lN>UܷR+Rp-]-n/Yz(AT!ZS2ܕZKT^Yl~'.wPuAo˳-CdbT6Yco;N\dK|9Fs%d0v#jwMYIn8ɥ[8(d!Bb$[Ri^TTGV5¬k%5wA-#])(#15qټh=jRjymX8h,[Dw"u${X;q[5iڷz6~l鸶4Xf(kPoҶ扳+M|hnKiRCu,Ue7đH8ZcEOm96Ή⒯=^]S g y)I#$>gydcb4?^Z^:x R=6# uOТ 6#c{g6?TE')xioHwߖUac@}Ј'UB@NMN =gWtF(DHB|ˤ g 2Wjc͋^ [JKR.]zs[z_e3[ţk֋ݐԙۑ_pBya!;3l{i`Y_}qZ{(ܮ42ҔEiJA?Cf!.֢H"}o SfyִpAචVws !Xb[`=|)k l'ck=lT l0SbRmL}.K`HkKdf/&.)dl`0m66hk e-w,0;ra"+%Hun$a1[/$o+Md/Y `ťIw׼Q14! _t_X k$PZtAޕygHjMwK-gn,جˁj_ ˃7gUC:y}}Su>,}<=.a%rmLꯏMl}'c$a7'讶 (YBPl򂳓w%,˒IEEK]pHwؼz]&w;˱iyIkm__?] N-[n vm~7g]1g .308ny,uvp7jyGsY'6I˶p5g5Zz6(:9*M(inҶ1@ts6K׶sL[FT_u|gl,|Khz6UOM<^zELظE RgLml=Y#K!P4dst0wo߅']sfbs[vR{{1XS}RgyJslI| /ߧ)'(._;u_ڊ&G+&K 9N4cKxOI!"ukH;S=S3rYp{gC I*ۿnMB\3,}u4.`~$ZuLgQ;Z:4&ǧ} Ur;MrXa]lK,_vӡ{Zu0H!.4'T%Au7!'Ea0ɺ59_`.6Oޗ6W+>"s,~ohCxD'89Z ƢY2xɷ\2msrTuG.u1 ˥YFgBmZk=AVw@j&~7t%+r^+r:9{tÑts;kjU"%G?f=euYM_5Vrzpp!ZnhkAʬhܙn*-kC|]=ߎ,K{a. ƪ6 e/Y;Hؽj aX.'ۂ7ɏC՛@Q0ޏȕh>dC~37rRi"e0Cq7Bc-=aM{BJC'T.$*m:W ~kK:vK&(C}eCO^җx>E1R!˥F}0pN7cɎ"u YT^cՀ8q7# G* jI>ZR.Imd3Dk*Si:왛\r7Ԥ>_ތt?0;1E!޿Wn㓁Uozvf| p7=ntGqZ|?U#13|C5\*-<^")EI:z62gucYK-ci1\Y=gur}=nZe8(hȕvsrhe!bؼa훢[DkڪH=gݝ*]s5)}){3 |׭UvE[]3fdSSԄ cGeL}jHLtѱ4 ͌j4X>H,oNl]ԮBO n0s3[T{&|޸tjb{,[m0ܬn5-CJt*NeT  ؊Nz`C675YD` t9v3mkX#[CIAmQw@]MnV>Nx-s]5uwWxspV۪4]q} XfPake18vΰkfWM lS,dƎdtFŕfrB^CT?d!ۦ{ KSYLmJ%tU(a>O / $lMhz_r\fѻ[6As ;$/GiRK?hU^0FKX~~WKCq}%ikx{,a>Çܡ:jd/WǴpq_ϡfڝS24Ob&N|'ڒ"ܛ^UMuۍ'G]` 8,y..NO˔MQ[4G0gX<@d^:kJ=_0GiW|9"a@+)hZ;ؾc1cyr綪 g5;Oݽ٧+5g<`<:e޷ff UIcJh*HSِz|eso| Gak.[.v[ƧjT^٧Q~/wc݃}5ct?JF(^5pdkƊWi&a@vgil'Biwg"$7VH|g͙HN7PE}­"]PL*OORtxUv-`sMz^&u7[&m$s K7D;,O;k齏t2uyp̓@eq`@@Ź>M!k{ᨬEWgE9s6Q"!#~ٵĢ OpYYsW*V #8|`זfZiw mڬGNB)9Td< '|bWoQ79Qߋ"j Ȣ|Ľ<{oRJ4<ݧ์XD7A)X6s;,E#v?;&IIذM1MpR4@'Ez)|4(> 9ݺ煚Oy*dM;GZ^_>'?m 92{H[3ΓW4*hI[HP]SIݗ.'H'}B/p`ނnBr&b]X~,I~Tu+\-X_IƳa!KLc'8bS&pʡG c@h6/pZ 1XGi qV 79'dz" 6DN^7%Ǔo)ѫca67m^ڽʳ7¾M7r{{ɦ #tp@HVсް`ٕ 0Kƶy̵-rmFT iDs ~bϵK!YXN8xaV>t[ז+(9=I<`ѣ*Iv־ݫJ68~ȲTpn{Ix8妋 RPl#[A޿ FfXe\%/$~}.rY&8l|`P2z +YY}S02bGGtE?6H7oތEgؤk~fN\gDS-SDU:GT~sbW}KQB]E1ˁcb |HҨ&rBI.m= .tDކ=(Y&5+lfo‰'G%]qc$mP;ڜdydcQyDjyukTԴeyIfGF}+pk^{|!<̀'͖4EIC.In4*Zيc/a9,jՐd$>JNĩ+u"/ `2 _-B̦y.lW2I ~@o_piMd#j`lz<'Fqx@@9N팗+~VOjASR@ /t놺nf$,>-ihyMa+15n&6 ɼ #Ɛߵs `_[L/_{Nu D %?>~OC@\?Qы1'&nv$:`Fvl$\[uH# 1zsRq+MېU MxdWAक़6 qu%_,3m ֣1tF6g4IַV^۩؝.ݻ^ڦke5U<[ޯq29|a>_O B)1 iu>}sib NWSK'orǽUO P!Y%:-ϲ0^Ȑ޽rcF!-buh?ľ^gD-ol/? pvݗ?\#zbt\`@U 2qj|uQt6 VJ[ U-۹+=]eN-8KS``2W,R),3͋p [YK3Yښ}dmbKΦ|E":jKiBqw#D|'7fˡ};?]VYE}^ n܇} 2q6_S$Q0/*mW3zS6x@>Xwx3,-ua'8Ö~" "{Vv|S2>F&O6o@! 2o ,%jI_<hWHAHcYdnѯ/aJ^x N f\goZ\_]h5sZ J1O&Ti[RŬ7&l]}30?|@Fbn}Hȶay:6K苝oݴF6F-c"rȶ"6TP +b te0ʦL&pJNc]>A7DP{#IVERUAmGVbFhD+( ڄY4ar$\ۃ0Ҡ_r4E4nQ0oi3~5Z{&7-&z O)?]`EИ{Ę.T j_oUqk&t=\œ\?8Y95t[v6,!_mʃ\;8HbΘ8Ch4v&cI55+3$[ *5əy($P3 'ߚn_k2~}ďw&/VŨHƃJ>UCF;]1kb^HC-ŶAh;vj -l+ELQ "`zJOgHl{` QFio)~f_;~wpWo-p0{J}lsc2[k*\WٲOƋ.WIh/#W5ֈF4Z7c6iR L*t4][9^v,?'ȦfFedks5EF]1R* w}X YSTZ.(/vO8c2/N\_SdKntj.9bJˋښI,k.EcW.e?h'{ĉxCROFoQ#MB:N~%}tXOx[Obl~4VKPY<=mm۷לAmlAp\bk>;iU OOIwz*o@ϩ>ruxžlo{a >V9'7Tun5۪̀إ$3֫/eb@[fx )"NN :B5/dT ˸n PGiҙx} ctcU2i#mujZ g_·K3';1jl7>t0$AA%ƃЬOHFLfiږR0|Jmg&GKe/T09y'tRJ/IT옟oqt-:Ory2el}^(wPH~naf8hpEė [ti@cΞ_C'[#xl5knf뀺L:6Y#?yYPˀhĎݜ٭(/ùfåC_UbЍaLMԒOսpLq#"fS ymLyM ! ۑOzXFEa:?QrAsqCK] Ȃj,JpthL D#+~OǗp MKV`c7/c\”G;K峽1UYŅh^݅#\ܾ^*[z-jd;Tȶ/E5w~'[v A6[Wx}8sT-@;o%QjB8d+$|Dps1g{(Y_݉kZ/әk.ᑡ^KڱucFo%gkZѮ|zg᚟\<]Nm Dž JF4w9Ox͜y \`3J\ӵo=!hl2Ju O4Cѽ%U2?V{>#fVUVKc50vuB U&n|9*{[#,T8/6n 8N669}~/Kk4|M5(D(9|Di&۹qj}*T9T ǫ *2*ioHY% &̴F, 9q_v2? Mjk*aTY rs18+f--m׭]q00C X?B#VN#{;*dݙWc>25/kTC#b}ۑkF3m7J`30%Jd3{뛯7/4:#)p%ud˙U%t<,6ϩ*X5< 0lS5>Sdwfk)1.H'w ]p䰗,ճjh.nu7>QYk `~-Ny0ZwNԪ ;p+:2& ڷoCQhDyzORtv } ܧ;? }?SJ3>{4v,rюVӸKOJ|PpZTR9YkwO#g3Mim9ݳKoN=/c Ɉ/6 @^+yVy[^BŎp33qq!TLH:)ͯ`*u,U:/^9AOT؇8!@N+X==+3&g+[&)OdmN'^Zc,eNl[i8|k7 M?h~pJ=>}0b05Ζy:OI<3t Ydc&Ñ݌ @M1@S/uJ;\=~v6EaZQI3[W` ɐҵ!҃lj'59~C%}\-\4Ep H {-5C8^yLYdWfd/XX7"ȳ2\ mOr16e0&;`1T}|^653 as֛0#},wyo (w":Sb 7?a݆^O4]>р iFǁ+\[@5=I9^_Zѡ l sz]5}zͪDdV-xkY( /<,"ʸw/ۋ20_i6xRAf l#+nld=-:J'2|kb;&- [@ԉLƀO7E"6ESd,hAN7Ysk{իkYN%,ǂ~d5^g3p<5hCD<t ;ǙnY{\d%߹sM c*0܏NQ+Q+э1ejk8kCg 4j}r*nKiEY^@|Ab#V(خu'ͅ /7V A]̌e=jj0 Ơbf.U~JD"Ig>2eBK7㙚N\Ӎ횹6[ai5[+vY=Y zzG^[,]*7Cll(CenGHSxFuLO('be (:Uɴ'}exFP;p#*%z(჎'\"t 4;v@Pbz`}iou{w_ Iܩ6tsI;UvN~( _ k\Þ붳S=/N}p8ahE͋y.aZt @cV\=DH )jyGЙR|wո2⸵b=zzJS1CD(aVޚr鴞6:K2FʍTu:ƌWsͤq=`gƢ+ '-V-ųrIH?f^g]{$S~֒MiJOyD'n =c˩vSke|U)P}|"ME7J=@Hr[ ]1.lud=n4qe6JO) W}}c%»Cة{W+[as@IdBۀ Viv׳1NT WK:'1~ZH|L"SmBZt0I ECjII_>8Mk2],Ɗea|ePթX\Ã=hN;'&>DmtB(W4[hRJ Kcݗ /xAg {(_4Y/s@<^E{DJ_ʱF虆6#k^ I2do5&/bN$YǜekBн{{a,1d0MLG %v4)'U( Dr4ݺMp tL@VWxV;[sb*xp ܁DvM n'-uͅJb ᷪʘhor6Pnu\Xl0[tR2}<8dQ&̺+-Onev]&mT'ţBJG:hH= -LW`/X@]&dP̭?9dvslu[X3- -Q $ԒOcRgN~„d<4kw7&p& ѹ$֌42^~EA}J :5d.E͗ؗaեF)0;nlYR3O@nPS;MlRm{Zv.oahjM?9W/wKb\f; JʂXvX`fyj(\H-KB X^z o8 6*"3eқz Di1(U)!<݊;dok0S ޼T{$ud!\c1f?&LWGiSYcMd]Lp1|ȴ}p_C{eStrƓ:1 ƳZqJfƹw!Nl@VLa4Ė;kf~ NqMa*?,sU.ҋ9 q΃'Yj.RK$ѤUVwX9+xD+P;+`s[|"B,Qr8b8%u1[Ooed7Au#ak93wf#Mbl.>R/E;:a\֏]yAqr-7Ո5דk=VtwkD]k ]VH~ۏW}_D6k7Zշi?s}sdu ّU7qLV3'Bg3 l,,P"÷Gˠ2됾#Ɂ_H>b;]sD2̅q-kuVv?R4<]zTV5N"KC׿[׸RkgxjH^}ֆIJbwq҄١g04`*18ۂE~S:4HGC6jB.CVtƤ Os$Ґ[~itE# A][{3:1 crj PyN I;IH"GC,읆;GYYv΂F%u9r.g/(?"~gjҊ\\3PAs-b"O3H25l4TME|aCnYc54T]V2WRtՎ\O(Iҏo}bڎecB*1`tS$:ԛ=J{})y ^gSߒ-чY ipXl/#U<$[1FCw'z2 bdj0/iq5 Gr*+2\戽D0H[/=j/ <0Z0,D;^U[M7§'D<}Ed BюSwkd}oe[4& d.xm&iX ݖ+mM$275TlBMFcLCUĵnY\} 9:: ڛp}˗7J&81`"K(\rPd/T2,k͏ߐD@|ovX{J58vְ6`@=q:YB??5WZ35tU\ԧ~ Y`d/ vƁF){qBxۆ$2uOtAơt.__h"5I,Uo`.Yd4u&#b]'_*{[[L")j' DF S-ƊOE4nBNP!t$i VMcKT@.K݃%94:.PFZ܄ߝ{eMI}p!6f?_} ~aҎ83|oVH),,썀Wլ͙@4~EҖ .F+z 5w,+H=a'dVL؇C/Y?]m$5Zr<~:@QTѦ7pv\I(;s45JSjD=p,z%~z{$E+D/DLĕ1$ygUu-pg^725 oK9 XnɌb/|A"ڞGgDlnb,W1|>|!eGğZ i!kz!Zc=Uss}{gtS28/h#vJaP"I|ꍴ.h.ChKG_Q}9t̼>B*xfZSt[w{AJKJ &hwR,I{T{JG$upS}|J^=ȸtay xk38ZuY$ {f7۟'U+o}n8Jp+w9YrI1+= /Mk(M VCl4Plq)FGԐw*BWDނ@QA&QoI<ܰH`ՍbDfE z٘nϤm |T*hᱮq<]2.2\4R`:3 Gl+ g, ]}/^xxZ\iX]8h`HZ=k, [ecl"rM&yJշ+/uE,\[Z,['kwZaּ߹~lE6t)# ܦœ\2[n C#BI6./l`b\Zgli)yBp79aDzSmLg#1|<⼌'Ht/=_ʞ&$, ;4|s/' ĤD&-<[[PwfVFyZ gh[O~#{/wlty"K$c:v>vvGT慞(c(N-y_:'OoxֺLךIYNX#8 jyЩm#v2L.H']dT!`TV ADPQ+S΍^*Q OUUItJyh` +?V Ζ45Vs2Q\}nhQ5fw}s$epro_m>4襨];z8kUOO|jL%DImx{btu')7FO %xTʉ'_fCi]=8v4>eΜ1Uj+Xt|ϋ*BZ=Kݾ:`fӁj%MҞ#UkIDgbP0g;#M 'nb0,D0pQ!>"1/l8[S15յ2 ߲~4{ _'n9|KVSJ!96s{ }wSL$c^ .qmjIzԙ)!YE19g1_Ze 5мƃƎئDUyC%]~qae~;X& e6tà"Ue\>ث[ s晌}Z0L2oH~d'HqXƿPa?Oэ鼵AXJnF |C5OB$b@RuF{1zkP:˱vC [9`20RyX4얙\37!a"#!fw%pQDɈ:0lЛT\O5J `+Õ2<S_Cf[7?(`%8h7V$!a(2#58?z#|!d.1s3WG8ܤE K5eF5:'1_4Li#8nsy5sepKSvҘ}#ChtkJ-1I0W8'9ح݂̩[)Z],j,I^:Ĺ מ_XfBnb|.gF@<~Kq W>vTwZ 3tמxeNNEdImXOY (gNtA*q Ki?PkMVw9wZ0VՍ/[\ʹJ!&Ff1V1ߠ9 Yc;3oxx oUl l?@dNYI{:-.{67ZB=wX" hog>\r8YȦTTQO_ޛ#*@%߹6+6}+^,.ݔZNbzqۺַ"ntpl;tìI:>GS2p܄'Aܐٹ:wtN=Ͻa:=*W/t0 [j%f!=0a9 KvoMѯxp"swqlׂu`P0-Yꜚ$yjuڇgYf|45_t?oi xw6rz<=¼FbAs lFbQ]Sw# qz8q3a}#U$%[o=H,W7驕=&e>4l ݥL(ڱ)bהYL|T!M۷ɣ;foʼnUB g~lSZ5En*C|w\:}8Rihw,oJ뒸|gk5 .~n@A '`oluK ,s^Sw}ƠBgC&kҁy=htc?[]'ab6&[nx~W!1uk.8Z$|.08r:٦)pRN~?0%ı}a?MԙŬk0UC[㸹U}^nTi)n+a'bllB(tKo1ȾZ-* I<Z myM%^mgдmQ]%Y^& #?Mq^skt_+w ~|pa!w鳘 N? >X)bmO& /wJ{g`)hup{QCsG9={ƴ k薗]`-#+qTQӉ!e~E-HGd8(>1/-H}hn9~O(8{;ɚMT'~OQ-Ѻ7.=\NDoFհ7Xꏦ΁C87ݕ-ZGU9%5j)Spۯ6!f&`ۢIfOIE$X[~&@b0*k!ܣ_q^-uݳmޭ XS6f>A= AK:'lb S~Xy5jws oʲF24H0%>hֆamn|:~U4 a:?^*Tab :jtC`qӚ}:Z],rH,h9\kD3ؙgJkIH"aǬ*t;пY= #u'X&֒AuK;eLDžiGYH9q)oܑB,l=odZ9w-V*lO!R F+ܖ@XON2Q]sy沤 i4ϱ?3l\ZV8[24+gX;_6i65gT~U|I>k> ̈́Pn9m͵M 4.=qC2oy6g;yvE<6car+ {ڏ0Nr[$\ 4vjSJ4~ò)e׵;Lu,;&DFd[dƙe ,h'3c0vR+42}qrÓF#Hx9CP|]0ܥi6rꕆ4+=pAk$jRBjm{]R]YE{Bp.臂]f:s!%n.E8%p5!oL1VlE.5lMΙ/ߡutRDKG0[>HRzڱ{s;Ӹ>nc4uc8_EC lU_ttQy=J1upw9e:2z\=ָL0ӭΦb DZ=zVnXTfY5U{\;jϣ\/^io_!9sW#F6U7e8-O|_I4O%h#YAbo{T2vZ񋬔EjY߽Ds{jWw6|_TM̗_?j,î+c/-&dZc}DGZlf!+7T>aq, ,|q4; |%[ ZFhԂ]|*w:5m|U G`N>rrGM}M:O>Dd%U4(Z>NlT4 m}Bck˪| ҟ9#MO\`_ɡ F1Mv)of=?ШoC"+r)ulA*R,Jc`'`@?#E`ړ*BJ'c8-)N[zu(“rYj}$N~c!S00(ȰNJVzXPSDbd6QRMX[[ NsKu NU]Tfl CV{I2_X?=Ƹ 9?1JBLI<ȯ:g/kWDq*_++fTVn@׽ 2|[vxpQ~w-mJa GGfj, :lSi M_cͱv+$8(&._ތ Ö)^~7ӹq*P 6 m3ڹ}c1# mPTםƙRus Q%(ރ$ Jez{ҧ<a ,0(bsMc{yp(yŇV ~B3ؘ<\KQ_9du#AL svl /V:ccY~q vGϼel8>3qT*< Kws:(^_\ j屏mpqFJָV̎'!vH 'ډ2 W'=TekS'6BIZl#t{XUF~$0%zƥT׭r4hYZg ΀sܾQAkޡi7o^ֶX18uBH,ccS`]<Зk]?vM N-+V= cON3؎ K]7>QPˣ zMpMOEwQ26tb#I̮BE2cZE^j qMqxLPZp[mG,u}ZIUF&A}~Z>27ʬyS8_b7jK#_β·ߔF _}|@k"h_,vk[#Z79c/4"i;*髾 {<`rT2ǤYul}ٗb^O4g:GR_v ?c6zzrx(,K(`z7j{ǻņ%.zC^jhE ViK2+s~6xϡA%UjhTXYblx$3I68. kY4+&hx"u^&f+?RjWT/x޻ԙpptbܺ"\HAG%tƕ헾a:5I;tMNeto7:sy~ti; 38KCNiZ>m"Qxq̶._[Ttf d)yA>ed v8GhJ2Y2֬\$?7%{8M< *ؙ9'mfUt51-r?Glj7E\; NpޯDc8ΚpEh4ѐLp*x󐩢oUT*@p/+Nd"{"\ܴ٠얉A݈tdثCfl7N8)69%qDKވ٪D|+3'~ljOǮM"ک ihE3NMXȢJ|#7p@wz2[U " "^f>B$m)nTH<ֈB ^Yi# zފL5B]эʼnvCGr, sutM &ڙb0٭ğ35>-ŁYplKPeu In%\BSq>PX*wBYy LR~>m hG1 "ayڢL~:*w€?<:]Jp',_׬+Cr4S?z.bYRpW/33}Zȵ7ßoLvX6!hfvXc@ x}F,Űvx`0 w!)CE,[~!-e#Ko FJU<&(B<_#,X>8$nvq 4\ Pp(r:Y\ n]sOAM`U_N畈X0\4( 9J,+-P2PED}"!rٕd"+qoLHb竿r;Ej x 4K Qk7ZzU̽LVzG C^:JMb{ $ungxcllW*a2Yy1x=՘;ީ3 \"|^96~]ͯi.~kUU@0dݟ#G=c`7!z:+z0]oIM<} I4q7+sy}g__kRe1g& Tc~Ho,- 2=컲^C'x;!Oe:42mw|#ԥ}K{rTG1_GJC{c(d4`8nTS#ҍq:M 9Grߗҝ%?9<|8bgaezw5O3qOPPu"r P\p6h%r=ہ=b~gkސ)u3QȘT.Zۻ6-g,oEO$  ,V5ϝq[o) jN{Wg5ͨWgU૿MIUVf(A~-]8 ¢5$ˏJ䶷s讛\mhc+h!ߡWhu4pg`}|_pehrޣ~ڏvhNBArjʰ4A&cidCdG9^bۂΰ=Ʉ~J1yjjd;9  ~-.:~0%)^a*er6K ]J'G0>{Wœ9u~ x:j56P6@1Y}.2 *wW["%|648}He8djrn[l#e*%"K8{aouNN7go)ky?jٗV҄l;uM8Ġ1zȻtK7È-+㥰)2#)ձK|rM 37Rw$R˅& n*LM֦2^k-zMK?n|_?$(h?YVz+{86LZd륏1z{phK6gl!]/q$UPa/\Q;Kۅ$ G[գl ~Q)XD EݕA'e?|' <)`c\zCxk9vu¶Cɲ^cPk 6mz) zC[@ޑmlx[aKhvy3K"ۧ>A;#ZqvçS'xX/\YU:+,Olr$nЄB'B0txBradpǃֆt/<+*V!1Jݮ T%uL YjM!\MFG"wU/u 8F[fEm.7jݚ  Hg]C)"z41Q~஬Zٴ_ϣ8 \߂'7}mRha$izΆ̣ < $Xg3"UKt4p~c+]n_%$X\'_2jќʛN Lq-[rxۙSv8qTǔtOym’[SpQ08d^ΨVWhe4ަ7`YXL5݉;q\Y|MB3" mhMKTP֟f Ʊn*Kӭ;f\5?/3SčM!q|2q[Ӂ7?ZMs p`M4~ԯx-k޾i6# eT{`rkزfۡ)Knpqk'Y뜧WqQse8<׻-@CIKj (Y|c U[U`{*j,I=GL$nݡ.DG$`TKX) --%KkɌ끿k1ni.L-Uto^Xs{ 5)h|7Dw7- Mu W#s_ib؛ƒ, in7ks{Leb0 ^L|3] ]/+}Eo>/]ӎ~ryi[ށ-m;3RgVϡz,tv~9G(!ճuR׫HTK!%ir!yEjaHۯÕrrզG=qٰ¸PH[ U?^1Kkr.[K 2Cb=I[:v_VzhS^=fstIsWg_oC=Rβ:C֋0qCjʶ{M"oCRMUyYD6K7wYg=v?u ߂wsE\n&[*## ӏzHɁ6Y?瘷A_\^-OPp׶"9^bre:DD;4vG^j{L˔ğe^pɍ0OvkS=qccFUbԭo\hRY.UYNc{פ!sRksҦ ?rMKߌԿWg+u7OR,+zy},YFyʱNV+Fޱܮ T6Wkoyb[jO"MUsǔkDa7dn1mΛ҉זO.*ni7Mo"}JRȠ[S2F?IIj<Ub %~XX5jBoB5"T$8,DغlRk[ӭ}7ãHZNMIVtOϽ6=띏T\wm9ٛ4 %x5/Pn1^TNj_ܘR+`Khe`g)9z(+IZY{YQEARb5x6'&+Bst~T .n|m/ݚC": 030v{!kcDICܛhocn>Z j%F$u;ǜ/wڬĚKuQWY%aIGb#o(tn#A^>Ҋ\ o(MI~>QnH~kO [R܎Bƚ_R{[Ь $+gJWOLm`97U?8| FąuY&r=!mI6g?=$Mtx+|k!w{S~ acLP+7DmsP'{a7ݵ7y>}WmWz^&kLT˧il-kj*'Sz /1!zCom-W3٪%Kxd͕@:zk7ǻ}NRT%6~c4ڋ *N 祹X%5hɁw$Rݕra#q#gjDȰM=~[:;^|ӑב^+H)ͰS .lpM0jqR3Wbz5 ij2$) S /53 gi6rn2ܬe̘f":B{΃F}4kHXuȋFӴl>^ unL1KO|lZrl3mMAևڽW$>JNMJڼ:W|l`75+._~$MaQ8ACiU%>Y{2Xtޫ;[%~㒬osAǣshS/!fSny6ޜk)?9̺BP˰T"hs?vDstu6hZ=ʸ/6v^r=Bn[ט{q[&q?jV1.VNl;IaM殺w53&o>G0(yؚF⩌.&W[#¬[{[G]@JmŖPc0O)lQKۧ_gnwAszE[z/!zSB;5';?}9rs}f욺lniVnfLv>zozSxh6?CPʥKhMa9>D3Z SZŽɷqe~ ?%IRo`A<Ǐ´ 7'֔} ק_c  OߌP_؂VxW>a>g: G[CIë_^H7ɗ/T{Xo w &0=҉d<'%/C\O BZ- Sʈ,%jϱImָݰŒ,~*ACpކyvʼ'yvM歝'!xLݔ{ *#LɆ=HtR|C4C}d=Cve@7~pLcq ؝&fׯDz/kN\"be(@ 鳌 4uw5/6Rbz2w Wv⣇`HWHVw{_gDs>Gg4byyt!2`=^K(~ʍ+W tH-uLТzT7d,l=w/44n'1Rqcb#{?c>sγy1>T.W[dȆicr41QaNp$Ѩ;=Kky&<[壹|2$67O apoE)*o[Ha,}z77Y8 )eNEα,cM|ӳFy^ LߞQ+`ڟ^6EE|هOŚ[,ҳ3 qb8C˯sn>mns`c{MImm9A r`V7z"I_:%p(5zBfUexLe[+/aN/a;+PA{,96\Bw8y&*u`,%ځ+IUiCMӽ,zoN$Q\*V6qy] "d؈5%آ*㣌ɷ,}['E+u"nc=9'1T+:O %˂3X)z42tΦe_Mrr#3htl5z\#-KN6iI—8jܺ#?i&WEp2W:nЭMAˌumG)DH3֔ZX$1ݖ =l_D=ҭ 7+Ԅ W!bVl.EҲ?.b9kV%'Y_N(!iڂ7ΊwNk'f[ðvM8.,3!- ͭ'>$\;lޔ1+f镈C`Pӥ̅@7vsL^fo(@>VֆdH\Exݜmg%Q,$P|ݥ NTS1E[T,@$̛NO kwb 4^ʈ(pTbO QVS嬹ͼkw_-kxJ?P%Y \ۭ@* ~|;/Fūè1C0Xh#s0qV3…/3Fh4% aW0QFb ho>H4cnz] bQSW 5>)bg˝~9{] fs,@E@p /ݪb݋:>Gr.%ŏc^"89HVIBc'xaiR".ʝ`KWiѦpRRk]!5NG4BtZKopo#{\rYpe?eĚ'a)Uf^ҽK % o\Z ^v86L`uñ@L Ш&h7 {Xgw><0\AW#2l=b?! b#D !^)Ѓ<"0tmr #!muNgSew\/0saɹA@uQS*R燌ҲPiy('S2rWD *+ &ze>-ȫuxx%IkLud;,Ȇ4%8DtpbͦM6t~hTǜ,,6I~,,v`k*jʄ𨦶,\Ϩ55)ŶCIv"ik:I/7,2Z!ybLMr!Qw=;b-!5x7+`?~N74x1Ŏ6fJc>>)Rl֭^LSoM,a3lލ5R+F !yV`sGfa@yl*ʨԙ A!d%0 f*="?SoFr9߼jt2|"_@eZmPXpM*ŸSpQ a eBXYXq'q֬f8YY^g2~8ίYf!akIEPov[tHnĺe RP7T giyivj#0&.s352{OE.bOx̎ʚ!$##SMUahrj:gG" WpzE" &\6S8.el`jw?a-xt)O2+"_ORda4}_TkH^y*ee6̾ 5郈bK1h+ A8qJog%J\Ah([IK`: ^((ʐbxMV/ի}4v͟2f z&@$֧fb_xE.>w,]oECֱ{a,z욛]5턽< pNmJO7oTكBP{}7 Fe C`E)םʼnP/ 63T?d/*&~Y7moi/Isi/Eֿ}8`=>b7kI,kP}/sՈu :W^_-_>Tp.bK:q7Gj]$~5:u"߲>wk-8O[/.}0 Z~vh͝0Vx `nƪp]/=8bs^7+M-cWMD u g3ZV \Z =߬f)M&֭MZXOfݘdx&k\ t 'Eo/VS(˞y[-τb`h ld<6vS9R czGłG١/7EF/fYӢG,8 +,˷VjC sAGଓ/ľ]w)KfI`7/@vpհ4@E;xE{_a/mOt\em,ˉ$LUh/sj6~ mA \Lf6K:4nIƒ4Fuyp\O?'1[E!;r Z28J ]BeFl ~{48*4g'V3d܀F+[|"b3;<^<`_6I*DH|[oO3RZiv3[lUA4ٌ;eGgBNMal MB*˨oZj N<9AWO㳚$~̆@ /0k84B $s#e-<VL"}Jh$Xm/2G fEhMPvͷ@*Nv]~C@ s4j&?B'=SռC{ש{< jVu`Y#dMzureP&D.R7 0b&:5$IVSmEeI #j\#&~6VDr}T?J˚m|~..y]kʧ)E^5 9,nk.yKׅcXKm'M1l~K߸[OW=ʋ$L%pS!?Oӧ6RF.23չ~4\ه=?aj o`p5~£^o"U5@umLҏL ~q󌃛¹WRÐ]wnv_fۛ1g^-EC7o^{{4[kB1RXL[lQ >$5_s`ٲuO)vjb*FQ /|j$7]֧*.*m#ٚ<43TL;xݦM(otAA{0RK%VWS4jh'[lW&D]R-\ k&ۖٞԉ&=Gi}0ouiZzqnɳ]ve0rs2DɨU~Ƶ:Q>z2[ atd\D{!ۨ<ܧ[ݶ:d> ?-ZTה2KTU]=Xօyym^4^6Y5 &m@RG -nu8GX+ᰝ;8 kbsA,7̅a{$"Hmx\<wۍt4>(L9orJ2SC2*دw#>\?Ox(~2`/Y]F6O@w)`B άjX؋Y'؎s/!քk\7CGﮣ.}wۯ\'Ʌ݂Jŵ{8(Dyh݃0p.3E_]'[eexTMA(dlr u|b8B:xAҖ׸ |N6YY`֪H}D想E(A!_/0B0܀K7+_ {`ڹڳ@qpF/@|t҈Xk$4@PaY fzW5hjkP?  a4Nў\i4S'I0-Ұkr:ME=|rFḞ BOT%Nb!q%p&󡤋xTTUq?X{slCpnϹ{9M 璝+Ƿw%8ƅ(O/Z9S7LsD7Az!y96RID2X{r-dY qYEV0δr.OxV*(ǪmI]'pC šEw\E-fMgZ%__;}rO(88yY0- C=sM , լR$'kxU$2=888 a ď) jz=Q}: 7}ç2Y4i!P3;~8-k_f2D9XQv2yR.B/,zKT}4V͍K0BUS0ݔ oNR;M VRBʦd+} \ER|Ҽ!hqL04FS#k*ƙ݅ǹ&+IM8ِUδL`Fh%[Ɋk#2nRl˨ 5SXV޷sH\j+nRMEnd\0MX`Œ|k7 Բf=ܗ}j{]҇fޚ#)I1ղe:a{} 7!5pS+>ёDwsk"6,RUyЀͪҶа{ޟP4|Zta,&SIV Y'7 s9cQ#uZۧ<Y4N7-L4IC`NFR[5F6[ ,ϦɃ4w'7ߥGQ7Icjl>.RV9@t_|r"ih s*>{@"\0-l9v H:4=`A0ەM4oZbte0`]d֝F: Հ] `$^al E&@v !1R#NxȀw'2n^2AzjELQא!!@ sSP^A8_fBN~bL]!?]Vl^7!By cȃvx ک1z} }oP,n~ODaoA,Ij#NNRC \<uhq5Pn:~0igϩiB^-m[!gP9٥8vncQr*[cq-:aSCrO3]iL~l?DYC_7Edp,C4x{gn`R!/1`ǜ tv́i`2/NvUc4Ă/Vzǥ1$&NqhlH%8珿 }i^XY訲L)>|+_0kiX/dtp܍4v̋kWFBG a0EhuV/W_3g/\ey)jP b+Sze#cǪ3 _N[Jw`>pҡU!l G)sSt( Orn8˓ItqET+eg@(c~>ݚ+΍ '$,_mJĮfM_$i&[F8`J0p#W#N[6Yx3@zP cN!o(Uڻc vߔ"YQ71x2XiAv߽Iqܤ2Z00h?nq1N. v b;o0^9I0>f$x*s$=o:﹣_#f{bIW;eO/~+< BPQi׮],zɞf1ds7](' 3",م(G8%fVLTJxFLJt.-p{.BDᒙoO~ʿU&b9 :80p;}5K'p_[o_׶JAv-0 ;`#J;f` 8x&+DbP -;ބO5Frgc\n R&}Cvo!։=B-<4d m@-l麤-EdBR$ 9Bٍ5BG6;ЍPqF#N=bڢsGLq@kl(k渕5pC$x6οe h6shYf%#\t s3n乴YFq}Uå-u[=bOc2H3*Qq <^dﰴBvsk[ydV8  z?DZLBԭ*Z:?޸vk/>5}k%W8߿̓Y;a~cC4:$s$ u`"3,#NsKxr{c xy-"x:4q @jMWy@q# s3! ) bg4k ՍhGB95!ZJ @'3Y3m3y_?8LCf NjUq^Z[`R3b>UZXcJq6: j\J0LRO!OS'P_!g~&'U ]._l#J4`~@䤑G@|拙D&,cɈđ6(?(}pTX]%ҫ5R~ l5b' 0TGl\N ?1oK{E4 !{ϝt13c7\/%ZCFĘnȏ -Wm1f yXbkP *B^є3'AhH;}mOrpǪ>XmDZ@;qm,]3NALek=Ϫ-yE / nzsnvulv0"<TVr8>jVYy%Ao^>(bYOE 1őP'C;.B{G3Y|5;O eȥ>Ezuk T]kxsfVr4dvc>FyU1[Tċzaٙ0 c`ocͺkovW{u'{+>72P-ǯ@x쓐`ܹx栲k3b_$@tVu}myhDJOVod ʨyק¶–`w+rCΖ^X݌d?i|slK/TVeHkL F:~~mDܡ <#{` ^ZCHGWSjQ_O"tHD 'Gt=Eq'ɅS m})"v~ψE0fj( Њ#43."6rONf׼FZI6*f!H\CJALn0b2.6GI.^d+AX8F϶P%RosM7Mől0FbSM goƨzz6a /RlͳlSqҴśtw[OueBM}?۩%|&;3ek[h+Bd4bmeF IBv%n‡nBXʎꢾ }'Z <}LYgġ T 06VĊsجAf7ְτ"Pںx_m ȳq,)׶&Ӛ ԝَ4sn;Ɗpق딃"oT3[#yvoM&_м  w21Tc -?GXZfNѐ|,f!1 ?amR<|QwBjd;$mjf#0nSTȅsMؐFgfFKb>*;1s``FsKbLΦ&[>TVh)LA7#$M,Y6SP?p`L*X  -B_εUK˦Z&$O%yv4+㫫,CffbQ4OP),\?c(k-m+FT瀤n"Wc 42Qk* KYvL N|cD^bpnE|ѐZ˴?-6B7[о}۾ ނI|:F @U! \(ƗW1uSl$O3.xҤR;4'yZR?KuI$8\йD)g& u^իw3!pX#b @eL=:a/^$ QxhGD9O'Q?_iΏk7;, K)#K昿`)s$ B@Jܓi;6adWeLg7|%94oJq"6+B6 rء5`\5uGTe39c dna{,ʴ{TC8Ga!AUG'DgLi`r+ݍŶjKuM0ʫ/\|$yCi!E|^&G-<5>_`2kpˠ@ꑁ%S(N!qOa1C34JT=Az! ;5MњL~FuɂB8uVG{uB7BJY8x k|vޟV;A:'}t @tJsyʤ7wd .6) #j[]U|3oo8)ӧv"e{ؘ7`b1lxɚ Q\'\cXҘk26*̿fzH eccbFm`k.;{,-%e7"IvTRX-phR*EW6?nc&Fb'rEǣ6N\f65 ,J>jX`!t t艰%e.B"cYRQc ¥ϼ\p[BrȻ?]l67Ys )^etqJQ_tC)Qf aVd^մJtoI |E*XkH4n A-OL8KXw#vO2Y3#4e+AN<_cndxR|z~@>"|'0P:Θ$y!6MV06\i\oJ1}]'e~ضӅm3s9G!Md9 _ U)"PW"nY<M mkB<ZSs sy'DW2gd_G@4bWxcSll < ir/cvĜyb11<y^Dd[Ļ׸>dnOכ2ڶhx_ 8@cjo/Ҩtd戗05w`ǰ}ƀU2Yy li4vE]lUM] Em_B 5Y mHTZ #ׇvdem>jq+6E֠H"2̍rE9\jr/-6͛x1yĖ8_y~A@hۖ64auDK9'4@6jZ rf7νeLP {T۴iYTE[<-q O :w> a 7" )5`n bi#<e'-_JWlyP(5ooa#tŰ\ T!.qq  ̙>&FvʌaVФއgF2 WS A⁜$vX6BΕv5ǩ=@a3džzrdQ\a# M Fk}X;ɛ1&/$ 2&yfhoS~$z=5}1yWo}#OKTh9ƶOޚe/NV[gɱ?ʆ=H]u``|J/VYou:Jbȝ|"tG\s6a?m˜_d?[,6޽iZd#m4bqꮹ "Bi j6 Հ:LJ˃{hPǻ{h5K"03̠LK! ,U5ox5, ,O0؞h8cU݌R8ާzI?;861@Yvghبz?p{L\dNiG!܉zfA2[%Ӎ$ 2HW\[oe~q @}Nxtl쯧[''" SdCoߞCjL\0euAydb e-WwK"yEVf~M,Qt{LcyNJVgiYC,r(D1Şjk8rܨ(.ySډ'a{i+xe^`r _RU''uW l\T0/r.0c X/0-"9{VFC̫UbC-"2z`mMf|a2bm=ڤLи[#,5uk#MZun`Ӱ/>r?0sO ۦktԧY80O8M񣭵55sX{"f?kS'lz~Q a b +c!EȆM ÎfC6^ԴLj9L&D~O+Ϗ e{/M,zUjgRh(Տl`Tl-z [G\moМC'^P)7yn}}&;Ω{k_fǾ\3H[O= )Ggڦ1tdi5)(vVoy+CNh0=Cjo  FkJe,|vY?5iaz9EmX?QHn^TøE8Zհ!îlQLx2sN猉aSsb^fE[`脢%1(Q}F-יqu\ f6G!i*|uY&@!Dfۮg"4][}iч/2Wҏ& A{cKb?a4^)cd^p?lAÑٚؗfsY,4 TUNXPwbGXt.8lǒA eٮݒauUVf!l=k],KezY팤W5C^]̧܁{`!瓎_2^GeK 2z.2l!"YX2~6c;oY5)%q F zh,N\v]-FΤZ "g&ͳ˻SqgZ*3@kiMsQRp t_ ^!sk鵾quVW5Om:$!*{ ] <1ۘ'_Mk~?3c%~6P S`3,&-!4 0ݕ: uȢ:F.J[o>!a UaEɶpbq_ל(CK) /}e-ϗ9OL(638u,@hDA6`t'z9`sꃬLX4.˶1{&j f!n#^R$Qv=? ?bԶ|j|C9 P8.Cގ+tMxeII:lCK=&."OZMCј䐭ѳk]PbbqzH ER1.X*6 숻u6,g4Z-7L 8)"+`?'8MENc]O$'[| 0y%Yp:ta_g^g'նՏͯ< K8M4M{vk4p^t@zaoDk]9y)]m6B2P&j.n|@siYFF*kN751ܴl> vD,4 qlD3 u4p#VS)1~Aպ6 yW8UƱXqԔJNU=aݺ$nXHVlFF扗xB$n*Tΐ +5:d]9rס-/f>^n$~Й9  !<$4cBn %#x?aU>8DbM N0<.MXo#W`FY9HVLX.{Km(™npѽ}5ll`:b.zвDKC Cnv<ގlm75j_40KzaN|1:UJ*'|ZHlԼcm>5J2r% g4Kx?iS)nTTB 3S70jqZ^+4s1&˶g04uxp  ~%>?g+Oִ)+-B׌uU) aSH -nlUpZw=e]Kik* / U?L}Mdcõ·#!Q7xJwPyMjB6#7L"H}zlXl3٦ѥIt|: -1+GY =VS9FdY[A|Y4cREcPe҃bwrZϥ]Pٍ_5 fRUS(Mjq%c~ϴjOmjT;N4wh}.{Vӧ|I^$N&j!ҹdQT HE.qAwFvڌ 'y؂<ˮh:!XqN~-'`<|Rj蹸;u?|daKL͕@]!n2:U0b5ML+i,)vR\izL-#ksk͋##&(ivFr״,6!oi} aL$RG:;qd~RyoU|z~u / Uc<}oK74`Mu9Sv Xޕ1l*S5[IZ &4τj")="Oy%.9ɴ ʺHCg3E%9)Z¬ة&y\|7!,`isrb VMo6AZ >l0)tMwJJJpь[WDKwtM:%AH =p +EmQ뒔*pz@@)ΝCZՠ3b΂Q@^^=#< .0ܢ$Fh3a¹<3~0bq:>Jvj) Q% (ƃXw}r\D=B|VF?܊]2:]T(E Bc};v>?wy}ތbf4OcWൢ)e1Y!{_vʛvO>]Ivo!~ W&;?F y9b1kMωy}RDz;ּaه},h@#iNE#w~h/Y ,kw;@sVL`V7OnviDς;kfr"} E,?-ޔX43&&VK%Oxyw*-<*kqd{2Lp~^@$ cr=}/lk~Mă$O#EMU.KK Sew9y#?E!|W)|*ɉ׽T5TA|(H%k{p4Sz}o[гyzE_戄sA>W20eO(2E|\(. R:+G.L\3l+UR =>ȼ.ؙ|j ҫ(mjA*:9c4PgA9뽹Rɻ⦍7VNN` a ryPe|hjxgkvvgvz!?}]ؕ̚gg~y5Q_WV&w# 55epP<.:f|zTf;qWI(Q\# S]7e:qL F햄c  #!s1ـr9֪i`bB)5" %;^TK7WX9l8"zai3x?{_\rn@C|\F)­w\?r7wn4 :~7Uڣzʯ 6]n`>Җ)U,g!S#`:8vxÀߣwlҔ {À3P$,3aLte/3sZlK&o({\kQ`e]}AJ,3ϓ\Cn!G:š~lN:/+$[ߟ&La0%yrqQlo2tلυ KB}R܆#[ ~3sLΐ+7ں !'fQX& &Q5 &` Wd.?\ʓ5r0!z:Ml̕Y'b^Iݖ)_adc#| }'rp00-t.Cf|!&uHwbH(y\&Pln$'b"ezG~j$< pvF{{܏:|n\otT)UzA 0w>]}9'#Ȋ9cJ_7^Ԋ̯(64. 9Y$ZwZ'3bǍ]짞AWj&{wYuUPVTOvńnQ~1|s>iRuٌo H (Mn(j>B,ϨE\'/wqM:0TE VixU$ɫ=: }0 |sapąYDN] AJF=Xf_^Ps3X6D:]jK=F~nRbsdM#Oo c%@S`%&5( fnp0 2K SV\@}V{uƕ;anE]M327imҗc*7jdXVrDK*KtxжVLAPk9BEg}\ܿFtzǐv]<#[^  &&G?Csd4CvIqﰕwj&qKq7<L t.KDn٩w:CZ~Zoۏ-i7z~l8#A)tIсzlG 55^凩ZU|:T&X6OC҉|ۻ8mmUV:@ DaY>sCaae@;j>5Ƅ㫯i4WxR| ϑo9ET;Ž_GQC?]Ba }u~k0$bGP` Ib^yga?sm+ggF$2!Khu u:KіozԗMGѰ]wtK =eކz]a?ŽA *k4%̫e ̣r)[i0;TB͕~W) Ξс&!Zk;v/ Q ݺ[APX(iYb5хH&FJD88x;+ryE`/G\Ӽ<ߠyHvjX8LA_~8n UFͰ ^Дc[g{>"}>}9ϒk,60k؇]bl9~|?#$mkɻ^SQ9> X8l~2:ufWho_lL-m vNvH8fH$=/U|GuG+׆[?(>?a,v?:J0 Q<"&+:mE&1]GDvZl.oFFYJ35- ]f [)I gG`)^OD%%\wK| 3̂gM-LMtHE|9oYqK/n_wwI8 v}Vx1fj$Q8v<9Hu52kiu"+̷@(dU_R3R׀! Gm/7;U6jL[G\nq ,8TVrNF7p}ă޼ Z~hr"S4?㌷U[$'xd0A:a*!/.4k3[E.!{1,O@f ǰS Z/8cdbPL^bRf[?ӅDs+y'+Vl צlOn!h٦!:>QqXtz! bݤ?#efjX(|ݿݏ{J8ZF\fD@{6a k]<2wqMmpqiq~=#S~TϬ̪yti=F+.~]لUEg3&y?U۲9!#֑L;pӯDUה%RO![)SXD7N%kq2{—i4;^RW8?yW6f qӟ>HN%3N ZNS~nH률b1XyoMYqWv%Y5zA@| 3hh4߆/RB}m, OХZʜ*~|Ɯnz8 <֩Yr5pTCɍdx*p^mdSN$vNVb W~Mju,b=@RYz2cIw[Q=y+w>NC}=ѣZXø'/O8dSEǗv#O:HҜِc:cW/8ۨ酆ä+C~K9,ְ ?7$ O`^th> 6kF?A4=˥ٙ#|ȩLAm厾-Hn 5i1dqت/},U˜Q?G^?k,ј./]U-X=`M3s;WGr뗏A,a.*`X^.&(=%#$\+ "C1!iMq./s`I>SgY%[|tY(\|[N 0=R`:11\שNQb{ԑsc\~Ja\:Ï5/Jے;P*ztwPٳqmO)@,â򦣩T@!jG\ ^+{?o;PR-[3/Xgb{qyBY`?W ql:!P.J{ړXĀ-.i&!*7bK.8M}TW}܂s<QtS7'{+#Bt$X7);u֛_Yn$!|zA_x+a|EZQH?y*$#L 0,8sH78Ԕ8OXF!'k\*Vcg~|w&p|lGVpAĤ$eJs$qC},oތ4yHd|hs71 &>ytIdkB jb;_NM{H0O6S=~Mi,~1Lم< czD>aj/6 %I.¾tb".89î76"ΧTh"=~#QMDh8JC!;3OB}; [%$y )ۨ LÓ z^C Oc_Z:YۉVY{$hױ]˻5lwUl}/pgԂpO]1udƙƅYGD{EF%$EqC6s@p-OԱ2Zb&[ ݌mϒݓ $($tϮXaXhr>,3*1zyխذmSLc1M$"agS=ɵ-%6:ˏP@r7$1 4v/dG ǰ%T@A4ϢqVEBJ7 ?^>.3Hޭ"3$~Is2S*~ݑP, kDJy 'yWiVH LĹsMy/ż+ C- $ "M.J-@+ {>5Zp˜>p>ygʪ"doav{sm/m* X>tB띏A"G6 vdE6͍">̗sK-f֦$`òW6G(}-v~)wq%[D+߼ \$-D ?峮'{=z`<#LŜݘXp'8KN'LᨢMs^509N9L[Ven&kSkUܱPfC /b'd:R d v֖ ~5y7$Ƽ:c WS5L:s/\I,?Ս9S/[}zR.,VwB- qetB%_4 ɂ$<hqC8\yO[_vci^ia/&'T^W0I>#rnNՙEZ[ޜ bMqЭۘg5,QhAPiHK% <=b6Cq=dkWW`Kl+q=٭$o+Ѽ xȗ9CYV]>9O[@{ #iYO@>n8#iS$7ܻ~ 7:NCr7)5j  $`ULb(r Ûܳ8/}̷J_:ׅD\--3Di&-Ur [U_vfjZw,ey2;=I/]{ey5֜U;rW$L`]pۚ,Y%EY# 󮟹Ex$9*@F{P^b;R< $]EK ? ݵLXϯ |ꗇ62Pʢ+ӁyfVb:LOZ r_tX]Q}_+>T1/mrkxDkKnAh+ |JcPǒ2x(jǩ|~Kڈ/ZilBܭ Diz,4{*2LU Wz'_x? á,Wd3*pp/)^wVD#݆J' :sp x}>_;cj`Ipl'+/&ήKG||HTf!ʱ+ߟGMI<{(,8$>hɏуMd;ޛ8{hME,sK M1S<A֎&?Mf\WW43Ld藍k^!/4&fbXƇd&4.9+v4YRs:ǽ[?Z dz77 Hg3׆׾qݸOeLNzpRuLCǾoh+$O| =>f'.0ݣ븀~ ̱;K/sH'<HK?tu≵pPt+X;BxhC]\ycQQs 9"(ać3q3@W :Zȉr^)YM'g}UPZ@,mIt7 $;Jw ~q,N#YlsA P_w)Y|Nvѫp3wޫ'LHj*,϶E\(Zlw쭕6*)4I$:7#'9*kR>ǧ[re=Xa^v,\ Q7#NA2ϯ?P h$ٝ:9ͰK9KC8#q<zkhj|s<Sb&͓e^(V'Wӫ=3GVVOw]Hb(y  EWC)|`-*s hÜ;; IitlM=LO*'Dq,}"cs!Xcl 4E/a7D R>֢T]Mhcc;6pJR}\:O_1-d%sc.R$m ~rMYMjgQJnN=eè Yͦ<+^q-@o) ɹW!lYFwӳ3wyowlL2B)p?2QH+F Ö*pBzN{N9m ]f/z9(fEkޥF3p?UVp:~LI+\(kkm>t5RyǓp(8m{e4kkyR\^/~h=Gۈz#cqͱL!eydbhO#&VqsEbOʎgKdZ#E$q$[| L oY/>o!0fre7ӑ|gٰ*=o<:!x7f59!5?n ԭ0fOS9fB rN)nёʙkQȮ'  Fl8G*&/z/-I3(kײ0]1,Pdq}bWrn:(:ќ5F]2;jiF80n? am@^"B \ʐmR񟢡N{o h?02{3q,)IXnW&V&[w-d:`).$W@r ˉ$uYE5]+ӢƐ2E.P"/E-E6XHslUprX{OO{)K".1C?Ҙ)>nKV/81E姂ZԊr0Iqm/a+C!oQHVoԺH8<]sqݟaF-eSxg$w>s O'GXHdMmXt`n.V^~gBkiu1>e#vhD{thk :Ed >_jtG}=-n.qW.%ݨ$S z}tMrȵ[6=|cW ވ}@g ]Qyş]1n汱#`|jg'{+E>kѧgNQya-=riwQþA^@Wnwx'Σm'E {"4]3fx˭<|ehi/QyAJN GxP[/âZIsJV(Gk 454byR4#;x7EӢR~myUYd8 mlE 6e]|{WBc*M k嵯C~t;\_)i3w&>A?F~ ,09|/эOEk5ahD4})I6GbUO}xZ(V.L jF|m!_ 94Wz'ܫD Up?m:>p?T?aK"Vnگ #^iiL|n ѽo (Z'=x.,y.Ls ׁ]R6Ir geN㹃`RipI0n}lJ7N3WXs#lPG^I>cq&J'!?_$BcކɗiDwn!;lB$G4K e|wS^\NAks- u~cϢ^ A5 $ǡ'h~E[u:hFmj p>gul)C 'K+W {ʴQ8+ATOk_Si{ <?Y֚L{Q̴dWU.KӞ!#==oH4QTYL{)Qxu.|T3z89Jj!Eotߝ\O:ɤ&pt[ȟzT_ 5Pü#H9{If2ϕ4u0D+?S"3k`ߣۓ7 |~{0ݸ_u{QhR/cq5nUP k@UiU0emZҒָ7ylpɊw&Wj _=]޲[ۇ끸QH ^}oދ=S~QZ$ISٝIyB#@Ϗiv~wKi̮B/ڀCĂ>x MCzx`9aj]#dDv9e薥|㇫Xyʍ܄y7P[׾z8|OPMs_ıdC\J6U^nscHD{'3 _ȄĖJS%lDݒE (>`ҰIsܺ?Ƹ[_s8heZ*3!#SfT# z.bq⼐i3|kz-EwݿTy@ćo藑8$ױ{Fb"@ 'K.˱.ckS$qm&\4{p͙duC>iec%FnOUfW dsA2/;.ו&q}k8 BXn!Uu.,S)Kfp Z#aX]6(BߣLq52n",7kg5U~%u8JmGӲIQ=.2C͚xx#/\Z&HԮh.6+׸8^I8rK2w!]}"eâoP^QN|u JnlԾԀObhUE|:yv~j$_A6Э_ 4k'^a ڵ|%:4̖dAc\p*m(R_y`Șa@ľ #I #qV5NaDh؝:Њ݂W8#m`x6ş?sZKޏcwĎ -PcY[:im$wSBuY!Ps5l[ӿsmCݯH浽E*tӡoh[bFA 1V kJQ/ <rEoVG~Ep; TޘN/}}b?>(#LOc@./Fn6Y$Ԃk$<.W@ c^L#$JeT/ ?!4r^szxw+jX*A$Cv8m۽zt3aGL.#O>Ο}I#Šp>8e y|49@ 'sW(o_( sxߛiX2 KK~Ё[:*R Ǣ,g#Si]{&v7nMI>4Ѱ9q>;6eRs_}9 >#Bv7'( Za+-2fS;iWv?eQ"Q~{9L[ۊYQN2:iSM>#al;{Mu׵!<Ċr4-?XerC˼"HjPȠ4#a"> :>}.FqWn]so^ˍ'1DjTvl#GN|*GlQQѯ>x,tM=Kvc9lRlouD>#Xl(%cJ~w@S"LJ ⯮5hK$RwClbU3cjFB CA4Dlq:[sc7[LXIZ u(ڭ@/Eg5%NJVx +{٩Or'Ld yvsH EUYFÀ}a2H|H~[0C<'"K2O$DE]54 D7n5sz+B)o/JXD^1~yq]')R(y&? *70w*hB>?[л\:_$S_tJc._~#i89Ne, =:xvV֟^=Ml̊A~w4!Hs< 4?L?SǦ${86mo-.E?yWuD+hC?\Ips{EK7="mҍ$plbZQxlBI&2XUM@#h>ϧ E_*>=uܖ+ v,cwxKVD1o`<=W+z{ː ZX<3m8} ,=Ng7~ L;|kF?ұ>n8[M۟I &D=-w6.Xq%ֱZA6+Qgfh;},q)Z"|!]">rcmapԦP{48ܻ2E.f:;`&3 yy;Isz߃mYnjCՐyL_ZXzc6dn!V*j7PXi|CLB}/l ?OR-*Fx!@Vc_JkER"LLNdɞH>vė`s=3p2I]j}!?痾Ak|"B /C401$ O8F\aqU(*['!lu0bĒ SWaS:9{~2r\J|w\6_О  vD:ы NV<$̶XL'OM}CzڙQ/<؉j"؉R >!,цꎟw fıdJ{\xiqס|\P~2C)4LY1{nV:HPs .]H="_ +TZz:mZf&>S9^t8_-Xsnpu|/&y 5םI:2>8K 9]Lb=z"/zGڢxL!H,(*#f>vFڝ3H~gK/] f烪(8܄/ ƜԥވCE a㢣oD/uՕ~puA'A SX3͕wY>#خ߾I3w@E/d/s] on1vksA?><ڍӵe"ThfQ.S{ͪH"X ,aF@˜? >j&<чJ&UJ/eI $l,Sd"JЭoUƀse˼~rHjz[ioVN%}ܖCWˈ4\z˜2f0fF0ENt+6r~n2K`jf5>8b7p |W]qy`;OL dln>|o ~``ɱRʼa@2?xry@ƚP ʛDz Qet`ۻί@26򿚨2b1yPm\ϓq*̡9D"Jzڻ Ws߱;zu[EOA]W?Ĥ[oM+/}E܇cluΦcf{.7"*j(2='oo<QOi2OUC(ǖ ~Ă&?_ >7"܏/}CrzT_Oaׇ1$5x99S MQT_Y,i2FDGm4AH1jrG/rhy[4"ƈW9DߖZ~ʐγ+?HVjG$1kA@HƫWLtsABFNpX(҇4!fPw,Fhma q}|^#@UpY0L,~GPJ?B:10}?O/C8#7pS"n8At?'S@"NyR ӁFjR3cOSyWx[&p]WBtwN_=d:nA`@34oL`: PBm6lbꐒ=Q?{|042pNӁ3V~:4A y:d5V2UђnHN$m5|簟j!@쌿hJ/QQgO…^UH *WcޙģO%͏xEqlwo2R%7(v} =`{tlO@Xn rd=kLO_9O2MWvl8xr&Z,lk$Y:1s}5V8% N.NDF<8tԷJʀŗOxqp+`JlZ (mRtLs EhF#o-Ed_uFF$P| 4ݮ:JfT }3Rv ,jo|=7-5"08tnJݏ;\t,<ߛ0͆N!Bn2cEExf@\ހRϬg=2 *mSs?d:Bׄ1=SSsN|SQlrA,Z]~f&_6 fcL7&5lwJ,$Ƿf8_kW WcjSYu c SeƏWoWtZf`Uj176tw*^,{a/(Ɖ1IJ>|$qD`^6;*N7]p5 F5A-slH.*V$;W_cS[6 m2F _wjc$e ~!0 6o0=u; 's!7^ DD3I'oQ*! h;;#.c?H0??+א.d: ,>?3М%zH"3y4#.T$eD 'XJn3̣%)|K/ Q]bHRI !NhҲ3:S~Q8^D`RX?Җ6m7'0dpwљ+X1*OFB5XDT{"ԽWD.=`|0?_=AYI`rvXHz)oir$~Yׅia x4-]4,_0o}!BHD?JWLUj?F.s%HQ>x%Y=kXp8K0ߧ!k*е s\~0֧`^=|SP,Qt9gW3#gWɟ?Gv4#֍ޔmE*Oּ:}h;l ԏMwaڕE3gl󫲒l5$cIGI=F 9c=`Y^vk }Xl >[4N#cҵe}-u{ n|) /VܮS}&TY y0}& P {m v.B,\=j\k= ☁q҄WNRZ=N0i a?CM8xA a*hl y  qHwӁ9) Qc=s_nmZvl-ʕCK{2f{N_wXŮTp>vW,Mޛ<-d=*ɶ#plD^z? 0a^ÿ4=gzkR!ƃ(02l@A+~`܌GK磢2(b̒JKMYXɰ$U~^̛Tt3qO!ρ80]U 5ѽ\_ ? > N_d?U^GPM V)zwYQ ?/?@MSͶD0YvK+(ӏ*cT>fϔl[xV:(*wG.BH젽Lc4u%MAbz -ܰLb$vG V^f[-cy'{Mmo2d5)ߢlzp6y+Vd50mi.X"Zz(u9L*{v0rAB[\H.\dzTr3m#C>V,ڹ^m2鋄}Y25oW[{yK~^ -CG: WZ`ELM h]v$~ͧ5ocݰba,c7|\".:36%6yvR7y}nmfslci`gVCφo" ܥM] ;e0ox ?DVM/NpQʤ=[r1\{Cꂧf H V;ܩRGEO?V8 z~Af~RGV 65nS+ VkՏntjzѩDڇNM8^X4E'8>A֟>M: P;1G}VzهMمMM5)PGuȳbj:ɫB?{j?ۡ83"t>+ @K3 'bXBxa6|2 +P.Iýojy` sZQ\}=y'q{`xS!f:odzzDK5͊"tX_pWZ la4L o 祼/!4kjɺ乾ܝ kwE^1{4xs*ajq=\^!phMm$wwh sk |&5ǰܗ!-H#hCk+W DGMˢu4^cSN&XbKQOYSjkBxsࠞ ߅eeDc\ r]L0v9z( Y2 {ZrIjsC-ہk#r"_NcV秅f3n lLqUy/oa)Ù#q$I0xZ 7[+a+sg6(Π>U05hT̚D0mxW,)_x6(QaG':Ix+I#8.1KXHI_4V`n)$`a3= +lE}d5 aKUN .{`GAԍR:2-K,H=v[R2.soVyG c2\^#'Lam+"1kyVJx"bVb?;9OCJ08/[cGoc;H['*<()qV˛ȸ7KJAg#o'@klG}#?ˮR8Zƥ\n$Xf`e'b(KD6׼ ڲ#3#o(]_{)*>|,E>Y,-z.EWunnzn vU8j.@0禵_n*QV{O_X9K Cކ7%0.PĂ {11]Č;91Wza}^G\e4.fLa|?'kVI˗sbPF(7,Rqa5^l>?, } koN 0ӭyHpX Mw`muݕI r7$՝ JW0Ԭ>fk gbٚo ɽ!pE<+ɼ ,swl#**a6:?00UFW lVe\ckN1t\g^ ,[k옑3xv v |斯G>OӠƓӭ>N `=C,_qLA Y gY}L56G $SmwkCH.׋RXUmn{WE)(`Qi'>/׮A[4QE&nƾXN#^|O J}mI^ƑK%-ɞ*m醖]pk;Zh z7ݎouƉ]ip]CC_Q6jxC_[%*ӄȓ3GO7Nm+uWqz g40;ܦ!־?moO״“<4čn5:_Y}Pjx;k]zP$Z{.|3P]&C9XC _'4l!'7 7OI#^t@#{ًa#R& GSu{c͢\̕Fc!] ?" k:8+X7܂;ʐ֧TtmxhT6)m.x CqE[Hvr|HD"Kwh]ڱtFC\wQΊ$[ErOl1feGq,܏:H~!"C;Pq|xbVza[h2ks,/^U Yfc Ol#_óeg2}0- r%a_g Imڠ Z-y<XQx<|M jI lBlrTұ3} I=Bxp?38BG^>UoîBzڅNA~ ajm^o4E_nW PwSW0$dPGVA P0N[&ϑ8/dqCۇS%9g5Zpb;s\o-|p6C ~gg5֢v%2(2ho!zCv&_=rrآӰ=jV9y^Wrj@zbǜLWաMdP}|W4-smeP"R1c_2]>g O@CP>CWjN>7T/?Igct#";= V` QꃤыfƓ0ڠ|)0\8㩣4 , Qe BwA-gī?\0|\3{x_IQh&1T3nۻ̍tI $! fV2(F0{.aZXHGثQr꡷9D4!_^ `+#ky<[h(}c0\[39+?ngz:yTs@|Fy46XbnPw-J'`ٕ_wj׹Kbr6;oO|;iZ[ŽEtwl|]L $SyvKVN:+2iiDq_z_aG"sY"Oh~FA>eiԟm^|#{XKؒpThh?hK06[ 3YA 2Iz5mc0E P2:00"sN s3; 5G'*Ŭ,MĝMRp.  }%?M4M{>u 9Q:=WNI@"ZM8Hi !KMgٍ<F/($0ɉ)QGM*W6 1l[>>(z"5I26O?|E:Uf*ճԧK[VMESL?U3oyfgUMF.jO.%nJ+rb(X iժE+m#:~<nעe :mK[~ UixOyg5l} t~VTŶdU<"5GġLa;b\%Kw`P[qYgxj}Ɩ&g!N{\l}'륋ձLct|NGtgPB_,7N>,i{F'O:zZL*+sScI-8nqy&}鍢+tc)?ɀ%/@DzY'sɕ~;QkH΢̶-ItH_ΣGP᧠8!2)=g/gidB[)ZE (1'JAY=?2~U)=bY&,ak~-g9W,EK+m VKϽ<2<&;qp;jIZ5qxti| "K\;  AFT`n,={m2:xp=f]Xy_,}+ِKwwf_a-\:ⷸ 'tXZv*( =-O?E.0;Wq1H{0 S8Ry$\h_4y*ٔw+~B3N7w!p?0Kn vAzd@/M#npa`bKxE~4mp_ͼâHoٷ/rJTfv b1@&+O+ o>5Ű¯=fv=wJÿt Z|lX {ްlr ԬձF%dǼOsy sQkrG >qN@5f3GJh_TVt:Zs.9]k>  y2,{J /f U Hxc^j`Ғg}/k_5ϴ{%1qGT<". ʞEdeZ5ٱZ1"75 Dj&}@WǑf]Wo_*@^Vu~7Dԝ5l5C%`Y;`&1և2gߺ#\Z$CĘ ֆAt;s\BY$]o0a(\O6G9XTRxyu")ː(̣=EGΘOC+љƾDYSvE=0XI?۸\쓡3ȓ,c薍{O5UKv(OMLӕ^"sʞj:~+6Pea,T1e0-4wD=gMdZA3mx MvpXhY>n6a'nbXݠΕCutk^쑡 COSM9$$#Q3]K*K-^+|G)ڛ-]Ļe|!>D#՟o4)rUQL3ܦn!ъ^yY0vM]5"ON)O3%$*@ҭCe2h]+Wh|\[}0s34t[1DƤ)anyؖk[68D&y:~?'_NK}pi. o>j#q|HpU|cJ<(t/WTi-5_Kτ{?͸MT<5"aؙayUէO~j=g61$#6`-djs<&`  ,5ePf@˘I|j:L _).J#cSC#-{ S'Z2IݯXD|Iv8Fas8hx :ʌb,ۛ|m桔$#ݲ^" zêާ's]̚U&\8Azx T3lplyt >=\:0d֎$B ېm(pR[ى8/mè1x1I О.+C@bH=U1R+zEfCdբhQ׈%(Br6|gdz'+;1v{$WWEϤUFs"*:sYi8)H/ke۞#j`5 mQ/ Ψzm)zd0|7L#a֣wwIznԛ+`kp^_ 5AbIjq4P~pvAcXבO?8V9o2?r|"@.%#(a& [#a#opiҢa8,;nPf8WnŌ f6[&dԇ\[?Fg)N{_1ef r` IL;$sLW3l5(mL\{l8MuPqDms3;2EI-rm}t-J46 36r-. @ v*h’8>c .7 T{CaS#31#ڼra $CYE޼rRUYwTV[ӜVajtϙ-S X >K~vr7c<C+5&ثQZ!ͳñLkv]aIp/\t :Ngv2 XbW;DٓKE~!~Г62*pѤ7KFW4vǭS  KhvY 4Y_Q}PTE$m+/a s,y%5Vjq.}uZ"?Zjx^ -"Iڜ$/IN ^W#&UiW'WO=T_nxƩ|Zq.jlF2nFD hs2gg&S*a|#RT;$fŀ}=U(ށb)Sp5R>heآB 7HQ煦tQ-]_6@| P= Jd 2Jk1BŏaSu%sJ~fψt! Ο7 =$ ~ H#&~*mK<|)/sCh񈛳. 0s;$PG xe}(Vo=vP}rUauk>(@o0r)RFp&PUۙ4r)Áam2T!.A]2 Rc4vX#+t9&!0H"RiA4&4'rңrQ/Mk^2x@l\D5iI|i2OYa`kAlu׍EG]vy[jTrrqeD:@EX `õx]EXmTr}/GD,W.InAV K稦s&+O\L/7ʗ4-O,y[qƟ!%-,l OnUwO,~"@bV^p!ZrvQ16 C̜{k엖DlpF#4Q`^QʲG<^67%`o*$.n,m#1d^y<¥!bYJ)/7BTq9֞Kf ~K$م׮emO1A1/.]%DLnLf!ik^уUyVxW)BƸ(Ye7p*21׌92MCg7F{18yލ?ݔa 6ȹhV yדy%bulEN6u)#k@;{sapgc@w:(Yr{E=_j^h X}һ1盱>ѝ,Iv7"JjAN!"CT{WWe:ʃz&(o{E-#p*SV<[!tk`$xMڇEϡ.('%$D>9AI/N{‡*XjoE>85u͛ŠAͼ=^|j,;\~5?圁؆]:6/l oCIqwH`$RaVyD!-ɚ)Т2~gN2`W5:\t>fw }JCiMŎ1oc]ћ\f_}syQ`8i?ԃn%MjVH|rT- "} ([?=]2NyUF?P{3O!ME}/S;;3E#KUeް"0g&8uƒزiyӇ6fMt)FQmӇ^5(kS ]B rszbTǷ/ݙaEί:Vس)"ڄ> %<5%6+w v>O, A:/EJ *Ԑ2yzWo"9;f)]1vve8WxA73w3VzφJZdw37CmV^'|Wn#0,o˃w)#+yV) :C`+ |ZcX?ΗzVv bld9 ߒy,5zfL"0zVi8&\fV$lZ`Mhc#.bdWz|t^64z9k*^% +eRȗU^md MѶԐҙ,8%)UBNn ; ?g9] Q{5Ld#6 +~_oedT+Mw+}~9U]N#7]:7j7ʯp0Ok<27ނ败5L. \}K|7!~߅tWw5v?EI[w7|e YݡMY61ֆŌI.'#9heuh2&5O/,q"Z=jo]miaRE;}T>rLLx~a%XFExQqLWt\0*<࣭iVudk`hig!՟؜)) GL=N#y6ʵCUONv/R̆5 Y(^`~nȗKMױ:k=0?'0eF`͋Rq1.i [ds!1f7rU sz#(.m r-3|^!yM&0f C8V~i6X? hFf n, O['ڌrMw,gzW] h[vŽ*K Zx7` i#;ٵ3#N,!K♖aznLftʘBS6ŘS*Řz']tԗD5 hг_lVx#QY^C[Ô_c'<ďȥF1gC 9!>r86? V+22j5yGir*=cYث ,}6d@5gqyQ<8~F+xf7TRxN\os-7sRc%9Skk^ MKzS+ٻ!wstݖ)*R5kٜu;]8cS AEnI=\Xkt0 VV:9z[W޺h.}PM~zNw%$T?J;wkʼݥ'l:Lj>)x!Y-YHފS=X2[j!}XZ ,P;NZ_S6Dr}5j|pW6aرCTDJ-Gȼg6*} _I9cٴ Ƕw\ï*h$T5Τ_ӭlOWcyq˼sh$)xnAH Ӄ ᳾'JGZX&=f0}#[ƓmcBxCmK8׈6,,4ۂu}SiDoF,zQ%sq_N+ 'YhUT&KdeW#oO=46Nѧ~ُfܝ{\Ͷ7ϮǾ'v=i*y@PofE9Dc&,Hm̞(b^ "BѬ귅X{+Aч>eXΠvq.n(8wxs˳Si$`oel+zF/sڅ]n#+2x]mݣ<s IbTE:^m^Y1 nݰcn~+O/`>GEbD/4/؋pSf-j3@C[< ˽pOX}ķDv>B3 O-w^E9EvE -?yM>b3h]4 aߴhzҶAc vH!3_R߲ eT`2K|J4)sDέ_siI0$Ƶrlްm'c\2i B8CbRh,bƔϲcd=lwd*X)_?[U7NJس̋,Wxk(uPWAX XѩT͖fѽKzЈm>tִO̫[D.y_}T?v9n1'2ߜ+Qk4`r[§ 4?ts/SfV k󍵯!A@(\};%n} (Xġݼs3Lne}Wc4D<̑(cI@ J/XdSRkkD<5n` ZYS؇|u m5ϝsBLJm)j@Qj疤ZiX{ ZghyuVuH?g[QAD߈zA=h/1 v[1+ym8bsn{RHB6ʳ5ijad62<>£rYu`3$~վ«oK+11{~>Jc t[wѝFy$ ;P4IMwXy^zL'$P=4[n ]#A%cnm\_Xkc >y,$:"DEH $u(hH4eZ߯iae,Qֵ_XiK/bUϨ?e<\~N0F$=ryT߆d \RzfH"]Hu/ak5=}\X~js_8ot!3C-_*=T<ߟ:#|`o2GPЫIEQdnv OgМ?sp~!XbikBL+Ciڶ j+mvyr\K˭ EtxwB)Lz"y]dٿo kM n+8~|pVN޸V!VϗmC*H_F `!{iKDQYUPyDN`޺'E{0z&)q}yG?!xvkj('}g=B 2G~YR~n'#.3yr0tdz< ]/;_$(C鼺r$ kpņ=׊7իqk,Sq~\o=K( ϙS rW44Y,"Ij|ĝ]ݘːW1%)][Xn$D3U1j( הc˧X: ӜFZXs9*}oM)HˁU˿!~.F}FM/<\LESD SߜAtȀxKXׇixˆكC%նV&S[GgU),Ò LWMo/}t5g𖑡t[=*:ias%[]̓enDaS"Gee%Ю*TEyl"4lʜ3辦ON5Kf-F2kўңbH?v̪y?5w[ұV,w5TcY&2,M;&hs= ځa;J!(rxkVhgeLf( bE$fR&[C{4n0#( ` kcmfg^3b_vPS`]T##QTH ;64P LK߱1Z$>K_0klEWF=KXtkiH8 ?dz{ E범 {d1MY9hdۺxH>[.Rԍ9I<&)Tq3n.K(dR/}n \Rp nz@58MJ#΁pWXpW.Ǖ#>,On3 .^*0Qzf'i6ۃ>03/%k;IV>%C]"}&[b~U$A9P:W[U< rZ W\&/vAt+i-"GsǻkY4.[*%ѝl>b:߯%`KIOֶr׾ DpYnE_  uBIn™ 8n )n}BV-Ln.k;W̪ث}(~@Ih{|e:9,~~ݿGu1E^r=n봿 i 7n{lNMh nhFpU_Z+g͏!4Al4_ PQ#m,yqQ!2SF'[n67[!n1jbT(/RH.!ׯCEx9رz]A}|o+6?.d "gc%P92jG ]ZI-JД{1H~y{_?͛NJ3ǚB'"0 KJD-sRW(lXkQ^:|+C˒w={P{qK<z=6 ^-Q{j?3!rxP4 )صHl>&>=ƍJ r@p=&ϑTY[~=ц2֗rgM b~x8&ݐ^ lHy)'Y$~{e@؅q=b_GV¬][5xu~{>q bWy%{vtϹtBn0r"a#$\;t^4;+F!me,qNI.ɴr,k5!,2[qԶ: Oeb*p7v\iRI3MnR.D7'\:cGh F A͞T/f =4‚ OAEp'L\{65g]'F}!cL3$hQ}l*z,v{G'_h ǚɁ9h3!ő:>W+.yd<@}e}l2E2Cg*KATQ C{:4eH%_̆2VM"9iܙwho!M%-K :jn7 '͠-0[g7Y)ҧA]$ uQUw͢}`^ݎ[LDɊu;0N<%՜CѩN{S26x'1#r~E\,+ j#攌`:TUhN$ zI,ekO22"D,ft[+#cg˥ĮX9 ԦZ?A4 . &Zs>_b/ v65ܳ\#eNP9i0:-}CHSSsB<$+:ĉN cGmV9"N`\ ) Xz"HiHqYB3 X;.G`/D+flIr+ O7f܂(9#q3gQQ>%]ר1pf;[D]=tҥIG5v3,Nlmum?!Z'`{Ip|\ܟS, Ua<2b?9q^{(3?bѺ!r>-|:z^ְ44auCuOߘtM YU>gw>][--b~j[6VNp|*IИ_ϢZr_in[Ǹ_tZZj-eVp4G_t{:nC2kUVyn0V:}HtٛF'jCS)^6y֟cA*®-YZ5pLI𱫭sl_f Sk{!ZLAڊZ&ݜO\2fMюʚ(O۸MK{֖M+/4^Q:H%7 MvmO)ƒ|-ys9}󹓷?P~91|;Ի^ƹS-`UW׶^2ķ>#\\k$z~Բ0Yi֖4MC'l~C{ xj7Gyoǵ-BG[vOС!c)6mg!&wO;i{{] oi ӈ=ކ ;Z؅lJ]>Z[:tưݽ{18B\4gh/g^eOWˎfՇطjR_;1HnVzoy?+Z\ytkޅ6J[425{U~ﮄ9៹ޱvbcȾ BJ!]I$}7k cxOM"͏׮iuɋ< C䥵OY<`9&o?RqxSltƩlj04OgƳр| ,#ߎ0L4py?L?\fg tMe mTpZ7|?$3G˚{Ztѷe?ٚ4C8w1Bꉐm+Tj6:ԓ^ m**dSqT<(b=O^d>~`ֶ*wcv75 9؛F^ ) .?/=O=x^^ooF)-i'^`͹^aZ6O^m؊6Vxs=d)jQ;!?C';]J }-|3bR+QCW8 zw|Rة[i~WRtt<25]~uͰj &vRjGWp^AA5װ?s|j?ל%Nܻvȗ$w/Naȇ V*";vA1 v`g"13TA3L4G_.yJ/!qه*UWx &DK?U$tڝG71 as52NJTqg5j)wkGsb',DTofQ]iP8( d_euTDg[^T4K8$GsK9pd)ť!y̟#׵yA ۞O {=36_)8ʼ;/8h̅W`ztGfW֭T8OZ&ʸm&Ha #SK0]|i^L=,F/X{x=J}KV1*(dR M{V?+)q~A 91G%뭙>dҗiᾕ|uѱg 'q,.OQ9~eG'GSϗ$'%– nD>Pf.PÝ3+3U5tM0l:'f1p|f \K؁t5`#(O57_ImFϭkvv<חf:%3 Sŵ:D&xqn9F.c_0%9$$ŌU[\pTS/MG9vhYFstdSPɗ'FbP" lBj}pN:*7g(-su;s{33Fp#g'h1 ztn&ЏA$2^_ۣ 1SG5bW}~{ &Ab VG!o9>юK8:F:s})Ay*o_Uk?qfě o>US.pWGm R{%sQuCmכLoe=~)*]]7T) 'л{z Ek)>6 pOQ uXRDm-; u>E%eemlG"Eƚ膫a-*ߍMA}C?aQuI+Q~L0T';D)<`^2B .v،X[ e2|^&*ěܔ4Ih0`M#[E+JfDUTEhO`G ºא=ʫ>C}znwf_O^w&|#F")c0loEErGXz#N {hoR(^Ay( z#Q ̶о"\O2#0pG<;"QVCC>~:t.!,؍e!=V/tqro^T* x:i0Y)wyQ#R+6# J/-E~u 25b_%\;$7Vt3]'CxHUXp,sidxM{pr jVP*Pb="x^ zŊ3H H]f_\hAX`"^An,_Hm㉤Z$ 3$eD#aF3l4hػЕ@x}nh ĥ= לE"Q?Em-Uʠp)`㟁QQ8͸7¦-)>d9c؞)hz-2L~gӇĔ5n^F "(,|zvmXno~aA+OYȔ'VnMtT]tkmWApM"ʃNnS5ű#\*sgFl]d,/YQij*Z<]m,}}1fCOfoCpZCl@:I5*UG}RK>#;,= \M 2M甈 dˤkֹh+EBxX^v/\#+~v/?oCir& 8Ou߹J8>8%Co=SM)Ypc5mJ')T|FJ&(.g,asUU 5ƹC &`k%8xfB \`l0GcV+NKTayDnA}2[9hMg5: 'gRz ,~ҹeCײ;,@=O_>),=DHv FKǤ2Q2L'd-3G!rn.rs6=w$қ5O@Po b#qLߨHP}^]=ȷnbތ&K-<ֳT{ ؿҡ5t;f%8ԑlASJ]_b:~T_ R1Ryt/r ɉXSU*$1 X0S°@pQNX3dƞ,7762_=#ˈ5mg%--j\!qh?_`V!A+wNqh8zɈw!Wx#5OGTSZIi6m1;8htlz" 1s 9]PGzD 5V;36K)$]3{)x%}xLLNC&:&X?"Ntf$(oy[=~@asnπV!.BC|'*Ew@g뽽`\gCWh^uidVRK8[uq6r~ \ vqc\.=P+wQRU;AT>EC6Ypr>U!hsi>SfD { pGᠳX=Qe]8Pn}(=Qy+n2ۣ&zr!r+baWsoա6' v);oqkૄ{"~AAtvPK.>;7̮΂7sc|zX~L\#їC:?3ja!! [|f&W?겱D g`7~c5|x4] 'BAM4Z/Ii7A) e;nIweacNMGm=>@QB1Sjg/o8 |jݟ爌\bezT+6g`_Y~ ӕw OQ3OHu'7M]Tv{,LxjO}%aݕ t] E< QӦG2Y qׅI{`!n=ʷŸpket/ "npeE zءo bʐm*"$t0q:`?e| ^*7D^H&NdOfcAd-A LpHd3vz{$1'a۫5_{l#Wi*`de,mA`ZЎPRz< ,IyyAHKo%p虆n{0qD>X9OK H'k{˗:5Q}ZO_"ܬyStJ:la'/eny'fR*M)fS•osA.Y[ncO-& =~tu~U`:΄~QEnACPX6||Z^l+v>>$#FC"D}(Dcм&3~}/*hq;< :f&hAcL$v͘AG˦KFQ;i|uGI]v4FS΃QOkçMJ(Zs2|5f,oC`BsQW lJ~;鑸MhOq]9z')"T!C~B]6w ~IA&پU77no Mt!I[;Y`1tQsUեQAچ\H.n(Vh41rmkLHɕsSkaMI^4 .\LRY7?|L Z+V4.j_//*ZnrO>k 3jNxc1UXy,ڞy[ރUo4t0 ѰwQFF@S ZZOJUUZ ͏#3`S~b@Vz #reS+`t ̑ NGz^+(N%.18s4llB20J٢5̡z"|''{z0 yP!5pZM.YI庑]9.a:Ls`9hf9'b<8Ы//yĸYH,dZo Ҳ؅~8zə0~!Q$ϡI$b*8DzIC~z*jLnoE,-I؍ xd?f2 F=*]u険4;jHίeEN$ýL첟XoAD iRoJ| 3ÙY>b#^y^K:I%Kj韄&cQv12k/e,_Z_(Jr#E(89&M6ȡ~IE1e 쩚;g)i22K5/FP8C]=T0^BVOR,ɽJlX7IK+c 6'Cò`b[z*/7gKwI#DG[z,U+>" GC[p߲7dOZj_VSxH=GE$]Bi8"VRpԁ0q?d3 S\9N #C DPh'p[w}&>ln1TW`5--np Ы,^ t..0D׹5fg$pREHY & :7,=˦;; |Z71~_fSL9,XԄȃY ୉hP|iCJrmk(\#Ϯ^hby&qgFJpdjWd$Wiq156UT,UDE^U 2n7x!C%ټm  fm׮&6S/P$[QtG-s_h?a0|G^Jwsʯh^v¶ !,a 5.N&nS5g>_A#B]FՖz ^Lö́9b#G .f7jk wwh%`ݶ P}[YGieoW/GdXYVbQrʰso{_g\b'sp=%fչ -8 =Ĥ Ζf6dixHO=o)v>bxK)Њւ~i;6@%2B>Ω`St97{Zr cHXjmfދ%PB52vJS '@:xv:@<ٯ%xqͯ!5 B58 7,rt-*'xE\Pm& e432J$&PFíos,rMK6X K~őq5}7}.Q&R&>v149]xx8hRk]a㦐$HM1D01gB4t&~o9y[6u[W)5ǯ"o*o#ƶ$- 6;PzH Nv,'=SA4?V a})Rqݏ=iS*ݮxs Fn`֍'Vib:b̘ڔ;`쾯V,'óC)m$.( &L#lV 7'H(T碩t! Frߌ0eg{m &0/1&{%Dq.F4̋s%m(? &2 ޗCI~utG]{l+;$}ʄnA:sw3+8XB'gVgK_Q#MO:Fjr. Kx-ji14JH>)VIۄЏ ?ZRm}F`'!W:˘cQ=AMi;2uo-8 AO"P.J,nAGo :^?2w0/?9WJ= Y ]ZrѳMFOPK&~8Rΐ4iWJaf@0 {eWIuUxqrnV/Xk=tOMi/noiMϟ~JO{~VRa)O?`8{|AD t)I=}%'8r%UꄁiW_[[VwNvˆhH-X{+]Qr7 EUʒ4U?ٟ8"+]<imA&1ù?w@92iDo־̇V5d! AvbM~Yma;|ՕR p>EpygȻۯy连M፞} zѼq*9bcCT6k!N^ή_9]Q2Sĭo1~k6PovJ:Gw{qЖnCQ5K٬ $xup~qbO*"p}bE›,Msڲb C>q %GǐWTOoks*Hx+bbdYB^L$$7sZYNg_fǬM'hn] rA{@N*-"`u)h\pROrb72&N6 abŸO Wl {hc7iwL=e b{n`m)ݤ|Hwǂ cI8JPv,;ڷ4sʔGl1BkZ;OZ'?ARxH;\|\? W^?5"LV99QX}WSヨY.ƉM!8nz5RVtWyh2髊}i(d gցwߩr#*׍HU9_yE(Gk[JL=g\(>}T͎D迻,MsGX;ۓouuq'R&z#|AUͻ / h'1Nc?YFKeK)XvgR0jMU}4f*= %2e6ҭک `NN &}G2bMl5{J- 1 5П=ƚ2f>jl OrwWS8'IJ^>Gh#ncP\NzחCtTBTj![bKLr W-t\KTDO>r!чZ'" O$QN?3NJ7o2[oT[r Ҥ&{P2Q"TX'X/~;HQWFAdn yET w1ξE_Um揀jl џ`4+FjcDUN)2ZmٸKqه.3DM!,jؑ)hMڐ$6\5s(<͒ @"V)g}Ff"2 p}_Pwq_YQ1W] K,7l]%fq&M3O7c%zR9Oj%yȊY7  Ѡ;#Dj`@>eux:b"I4ٸUEVxfϤ572'UEŖ"$J'2wO}9A/A`oЧ-/CTo*r>e_տl&% ,_puz! !MX+0w=]H˾@'NtI{1U/K䐄ǖ75UoM_ m~}EMnm"H:y~C-7Qu Lκr vpԙ:8;9%rI9eEvIņ>ueI_7 rVxksɠ,hQmin7`Hv(OL ^}a*htV|\d9 8,Pb$Rb$S~@4H<.-vy|`FmEJ̃#EHsJhf:U`"dG[ $quoj-xZm*K!Y'r֒K?OgUb<-xBt{mMEKPsY nMyTuYT-(Q/;e95=Ll/\}u7 (%(O R-r4%&4 j id ed,t 2BѰ T4[_bU4oۉɨQQѫSgv}[ʌN|:&y/: v}8陈@2N6L ]g&_s % +׫l+C1W\+{rQ FrxEx}_ANom%e0}ֺJ5IGTULmd[xjZ5۬7Q)%{^ ro"KF8p bD5cnԌU>9s%88`Lft%j !17a*Q48n|*J v%a_ 鮶OrYIϝ0pptn1cPw&Km4wbib̡s?ƶ60j[<(C/(x:/ߪFXE񫡏Qf>I2XaWdyRDul\-jMѳ-X*c~ˤUM0vXI&c O.YJ _愚hJc;n_. 7n""- l3.7 &BbKMPugjH pܘʊM* ]-Ly)Y0 <$Si`gÎڗү+^,dc5sj"AE63Wg$c͂HutT֕Z/ 52M]$w%3z)|N8=fRx0D3!Kxez>FS->.2]{8Ji<-Ϲ&qv`C8#LS<35Є7x}\B+ }skɿ`ȍ46BH8״%T[ IAHn" Ev؅)K`YN1]NPyLjtQmg|n] y1ԆuN]k7=38!Ӻe3ݮkf6d]SImͶu {[ IYi{};%5}q IL՜Uudw qCKYU@߁5ڧgjkf؄1ƇWv%5HKyu j~Őa0T)fHgۗįH]AI dsߊ)_Vh*6SL%Nwj Cb{f"[7ܲc "sH8U=!XPD9I,]c,@%o4\L%. Mi0sh&q/ns,cER.SK#{CJt眚^ehIޯyNWWPMRŇ'!]AZE]ƃΚY`spüf?i㫻e6$ GsIdZO&͹KXjFc|{Lrg3cNnO 'ڿOtbSvMRŰLt?~ZO4O,Akw2@pb+O m-aD7.ӕGmf]>7`PDi ۞̞$Nt;(}NZr"Tv8&.kFjc #Qa*I3ϚpۿӽQNC1ћctsw=w] wd3x羷=@֐ӇntbE;542pX]#d?]t'fA*i[%%c&W om"[Kj|߼^ڧ_8>A[nI4T(>͉>Sv׀+68eH s7^_zgq I{z~ޟDH$ 鴘\ĝ&>{gM̶bnS)4ajN}N&1IӉ::p9 ܡ3>uNꯌ˫[= r w̑ " npvyL>/mguXXiTӷ[SJtˢ%cܢFu>Nӣ!e볋[<FX}Lz vT,G$?n ,߹DB{&U<%B}pbvӚ`w"A 7@}IĄ'! gI)ےxg͵duXn@Nql>f^—XPBi Jm-p aHO{n:%>{.fNīb0^ۂ4C%F/z҈5ڐf!M ٤0,ad"C(h3+ܧ+x>T=#4b7sS[daV] 2szٶy`0H_)/nRi:niDbЬoEh!.˖:c"BpkQ:Qb_Ґ19\scypOQeM^Jb>m7m^U#$ӺS7!㹾p;emY)[W-13_4#.?':Ik̼w&;dWŹy|`පN}i)-O%3Ii|6LFSv%-i {>x8:t|"}fsTVH/$9ݱՕ^;|L|)LƠ\glh!t8U0[DO0|095++5Dp2΍bY'Mt_%EdwHLk_T0ƥElTTp~QdX[JT#[G4jR*MY.^E- KeXRO]IX2N vHZBR7oToBwϯewfټԸ q%uׄ5R MĻ޸BM:Ոл|ymZ 0XC3>55]Rryh=6#B2^{yOX#)ȘNkR֯1f!аBo㼺[Ap@1/_oIXq4*vk2j8khMZ6 Qy2X: ɪh-,_D aTݫ+m#'~=ZvX`&LoU48fubuܱ}2)͘seJYr`bBkTzҁ#quޟlivK[[ȞHKmJ;`Zq{N]JEA 4l}XlIڲpوsIӢad-wd/Vuڣ9-mqF[˻9!=t'mM_a; &DRga^j6,S|}{[/]2[~wmw =/yB]r?=$6dz$ˑlM!: \mҥI2|OH{%c#G}|!%Iox9[(cG#iy2v! ǵID=HȂpjϱX;Q?j>tWRJN5-PZ%)a_!.MσE' D__KL_at٘ k/k~l`ǾRqH@~pa 8Ѷ`- pRJ1 U@QFV1s%d$aKZm? SG58*cIaE2T&B  71!eS,(#,{T̡cڗ&CG1g,/{-҅~oXVSkjUG71(8CO:> 9=8~:ϗ-jL}B`e֌V9xuׯ ~&: b|qcRt/ Vx(/^>[=ᇁĔ,[HyEP[QeU#W?^t41 }#Gp܄}.ܪ6- *ЕrET[D}C+۠J-kPv Bzbӻ"p ~qȭҷg_`ˬ7u~"^"nxg`/2+ҲZJ( 94Ua0Ij^b3BSP bsOϦ5?g=02 weTlIB7Rϣbcb#Io8Mc0bC` 3Z]HG#ؘ:VIJ #.S|; G;d da"[skT2&0[P6%3}˪&8=KRTQ 撡!3w 0T'mJ(XLtĔ 0g dA8~W=&$FtEGjN:Gud'<0;! ơ2QɆ.?x%O3'b3;SlBq/gcNʅx{jֻ (tOV:?%PJ3U+T~H^T̜5MH]AK2򢗈lQQΌiLO/jyvKNǁ sJN>k$%ujlhd,VC#D7`|3$wJF}q4´qJ-NZRRx6SY]uk&iX!Ō巵tOYݖg-pP7mZ2A9N9=5եM\rx52%>+h!" !jI>]JڏX=ٚB5 >n{Yڷ 2N9Ȁ't~R|BI%SmH`W7<~ɾ!1_߁ø`L$8!IdsG"9C ţD6LO (#iٖ"*K^9b'Ő5~AUa >VKeۍyp8G 8K ϗE&oBKCBń]pA00QF34Â%cW]y2J'ud$T3^Ã:!ؠ{[S5M.0IͯSkyZ1@GxW7#^_]~I~E3 [9~v_GJCe0Ֆ9 HfCdҵJpȨdE/0X2Q7!xC%J?1iƳ 9 JTj؆ BAFա2XJb0 IgD?]ɂL ᑿAçp@75g3@M{հZed|z{`.loFd Cƀq%ɬ&BklIG:Wf8b A<p5gK} 2 .ϙ+`ƕth$b`7|ŃIiIM1Z(h Y/0R!mrt:d`ڍ17dk/T "U|uw_~WLۈm0A'93,ai!ٸS7>L}%?\1)R;u5j[.vCN%c;R}P.)> sUɵ L #b"x'GlVL]dߚ )WşI> OS,p͹ ? ъ<ҼL+1R`R~H7Mn12by#`3U3\yppiWUeaQNK{:L_n9V~O0Ο7[X-Wz,Z O얦яF$  bY"hJ"5lF "L1C`!æhU XA!Lw.!pW"T 1[3(K0 "Ѝp4i[E=r2?Ocx>=5o];Nt[0 RĆ&]Sg.&1 & 3k&;Wm:Ӡ͎#?`<왝[).| hwG'_D xցc h =Yz^I[<;ьƏ8v{?[klEC^B2:)\/ߝ y{{ơāf+$XL*}Z_46?Hq@>KrH_2`!$vRVmIl:q 4 MS9/Z$k 9hk|k)S1:cɾd_e T;UҒ24qZEݪ+am^}Pڳa؝K0 (,6 g+P\>Ui^oʈRͨaRMXi6@ _22a^K+Tz;s渀Wod(.r 诏Oi۵>Bv|ei2?MSNga5MdOΞ&=/n.0O P,xhfTS%&-Ӟ!5xB~> RH%%u0W`1hngH22iX - vm%zc J۱*t"5Dmji0&{Zg}^ 4 +t*8kչЖVT4PɲKUHq KE0Ϸ{W>m>m|~^Y-Y?ON<٭'Qࡒ<6VoZJ&Af|FJ[ݤʓ>~| ,; \ˇPHR|m ӴK!<+κv6p8L+3Fd 6Ko0\M%ʚYU%M=};^XǀT:t~m 4e1Iwz^=F6Q_`zyƲ>2OH5qꔅfM`}"mCIsݳ{j;Wק, `y7WB~`,kY^x70GWGK8} Ƣ2&zW H'6&=y.*xN`GȞEM?\jJj'3T?.f{t7߽̗IB&tebhĚҿuꣿU5Vo :u}‚=1Ƈ.ۊ0ߵtzvz:DzaqLz36Z J7-+Y)E=fi+6hooMY> ےVmʈhkI=q/l\Ô?Yi%YC2HѼϐ*:mf pk$56OcY ~"vTJRDٗ=sN[^vSGTC(%j"k2 7V@{ _aEHgk|M- f➹C#n"r+*7z%4qǴb߀K%,o{u1}J-ڹ ,#+"MN,rO9J~W;:]r){5v~gϛ<#Nqۻa[_}a;  X~GcA1k#9:ldÒv>8O,ko6k@\ Ȉ3"ד ^}ѸI朋b;eoaGdbCC0QX5SuӠGGqZ̡Z܏-p[2b%닞T.}iW"Gєܨá^Vgn!q+" fWw@9/k" @n"6 5gKӁM QObՠNQѹZ5_xj$*|+s>:k_/ 8֓L&)9_:D*u7xo9 h j8Op5]2 /wrYY6(Y׬\ծRsM܉;[~U{7RAb5l@u茂_'e|huj__G/jF 6[&jIاI /D[ 'd3V\|ܶpIpKt`$1m"=L~c<6ǧ`? Ho,uKX0%@c4c, CR#Vuƞԇ Z#c( A؆^t/aW6ѻ\0rIkRnUYM Ѹ-#e%!ܥlZ S~rNPQ2/Ld}P_l vvuAAgMoiYєlfV-\k嵽:넝^qClUr3.&F|Y[}*Ctb~MS\7y]\H$˧Jn9=Gٮ*͐Oi^YC$&^2sB&☌n 14ݗ_jBhOWVɢClIP`pK!' !.5Q%8wէUp͹^=dxᡏb KoyX(,ї$ L& m ,ezf {R.&64hޙa!>`(1/뚏>XÐQ,ȾObLj #Cӧ)>f]9Ս*RRbtPکgh ά]u0a"kCԸ -BE`9 NI 0p?^zjjɌZ+1Nj?C(jKچЮc S8R!b n"G2e|$0^+ $>ʱn=ՁW?碆z]HkM0kɹ7g9,V1[ґw VPs{q=6atBO?BcmWE W̮i"S${MA$AhHJn̋ 3 h͟ڦzh<3M%D=~8a'I\sYuBDerD?Rc4vnjl,q/WWhn2|VhBԠ .wY "#DإsM@>F, ɫ>۝&H'TOJC\QwIK(#Yς՘?@MlE,=r|Mv %Uj"~/fv0ǖ!ˎ:9HMF!>gyfPʷ~SCccC[ E&X&(` /b@J?c4"L-!rxПI=Y/Q2J)v]O%ǰQ7*{}챮O-]\] 5Qu+c<=VAf߽*F)!Z₈z$HSo]Ρp2@X5Q[>Gej! rMm,63ei39e;ͤU*O'B 0Y= t3`n$]MR:D"IJxjΣkq,fujGtTTԗ%t ٣ߺݭQӭ[/*k#|i黎kx{HCd4w,ި([3=!^>JpY䔶J=XMN 6r7TS$ sn qJOwi)KTCSz}0i[[y5ޖ9vݹpJH>ݴ}~iާ"g7?]|DIxM^nOѝg|ޡNW٥>myp:4amzJ85e}MЙ($ n3l-Ȗs؟{_O]ޯmܝC^"R44 &5V5 3Kss7OŽEwAVkYa."S[O$gj@(x2HX>(Jkz1^xa<3R hMx]vi薽B)CGf>a* _J CK%Kt"eBN+W9!}T+k2[%^;[:]NJӣ$SC;G,?[S?⢒򹁿'cbDO/c37? ʊLWbViH@;ׄ-T+lo%ygSDS:`|i/瞆wd֪!~gENe7S>nupm߻(7p4Y箰L򰒖4Nf 'iP'ܑ, e߯#tk`(!_Tk G)Q:zW|R_ԁ*[A:N>z'񷵝ΖȖyKZqyxRm/$PoX?}WYRػxٙtK$@}!i6J$(Fz[$S⫹-6 NhYwv\9dͩP;vY/p-܎Œ]F{”. F9&~MkHB 1ӒFj,J7Z}6!&8"!>#?[KN=R?E+<\ Ü[+.2It=0&ǤYj_^͞pRLi, .W'f8M/3IP1B /P~PÜ`(kBL%{XzO2ǮwN03T7͹JLogTK7Ni3%a4vfnk0OHtH>ˆE{iѭ(礄@ *(غٽ-8iS6[r6ĘPFg|i\Eؽ'1Z7JBXwE4P1{eJ wdu e?"bR8,Mp _O3:D*[y"JKYM u!\ \௔U!^<=]a< eS4qJDΧkia{b6ʜ 3>_4yU,lb`i/ӹQD$N'Fؓ"2G-s8t'do)+WPXCgX5V9 )65yiWHH npʃŦrDd1vg2M Alю8TF}}rH:VU% LQ)폿D&),s,LT%5xU3OhHMD^)("rr(O|S)o&{f8iN[mC]^/Q'QAIۼ)ϧzԈ aԙSBZ@b~JynC'Rn'2ņc&Hcz SS îV)ѣY򗪧rCAV3[%e'm0R29D㑝iЙH>$/|sfc[5]FM:V q٬})8v?0(S&z gr=SOi&>n2qicM$i@Rwh%P!o ZӀPL<6l9a2N[[rzRq*ΖNߙB߹7tM6ε/LOߞ%A@z2\P]LkP*Nͺ-S=)Z|~t &,=GXh/Ǹ8_ G6mW[nۂ\AᗩJ&wXsG0tߌ ֺ*f+t#5^-ZކDPB\  Q!7Xシ˧ E, k%<_bqmu7,L]۶f/7YOK!* 2XݡSuQMqv(I>_[oCRV,z0mWfo0Uջb*UU=*:S!@TV MXti ;N\5WϦ]xcl/H+JEM[>A4VpU3L'FP{߃įԧ*קE!^՘晧abuEi86!H/ʡjΗM>$ex]"1'g,$S4 :_މ Xs=RfS oCmQ,6+$\pGZ@BDAj*s[^HhmtSޅ+%:jF4n?gBjcR \ZWZ&)}ndbJy#Wöq-t)Hxw.#Y^5KY(y_w ُW!\h+lʭZSxqvZ,ĂbI{ ˬuL9{M0\sId[ sm BOah_; <~FîmfƍgL"&b!]/3ui`{,)6~dilBmP/r; ;0_]_MomoD_@EwnJl_mn#F˳Lo|hRpVk PK1y=@HKr۱ bsd-hashes.txtUT ~%O~%Oux =1j@ ~O2)6Ȗ4#!$&`J<%~?>0c*AHqVBoƷji3&j `BJ)vmD(#M"9u\ n_G%:bk]Y<5Oy>/yѠ%ǙE0^YH PK1y=@OE nsrlfile.txtUT ~%O~%Oux -PN1 (9qy8UծJ[_yl`Mg^jZ :m80{9/e94/&ӸvUݙ WFLbbv0B]0-[kܲ'N"x%E%+Lxg9!vhuyc 9H}.ܤq`!JzL#+/L$wnPzn'GPK1y=@_ؽ/0 1072-at.txtUT~%Oux PK1y=@l30 t1072-plus.txtUT~%Oux PK1y=@kMfJ copying.txtUT~%Oux PK 1y=@ deadbeef.txtUT~%Oux PK 1y=@@unicode_circled_bullet_⦿.txtUT~%Oux PK1y=@ Yunicode_snowman_☃.txtUT~%Oux PK1y=@F3Qfoo.txtUT~%Oux PK1y=@ $ &install.txtUT~%Oux PK 1y=@܃g-one-byte-file.txtUT~%Oux PK 1y=@-zero-byte-file.txtUT~%Oux PK1y=@#(>` & -dir_a/web2UT~%Oux PK1y=@#*=s dir_a/dir_b/web2aUT}%Oux PK1y=@HKr۱ bsd-hashes.txtUT~%Oux PK1y=@OE nsrlfile.txtUT~%Oux PKmd5deep-4.2/tests/tests.sh000077500000000000000000000255121176640446200155640ustar00rootroot00000000000000#!/bin/bash # TEST_BIN is where the executable is that we are testing: # GOOD_BIN is the directory containing the executable that is known to be good # TESTFILES_DIR is where the test files are located. # TMP is where the testfiles are installed for testing. # HTMP is the location of the testfiles to be passed to the hashing programs # this matters on windows, where bash (and the Unix utilities) will have a # different set of paths than cygwin-compiled executables. # to deal with newline issues, we just always remove \r from the output TESTFILES_DIR=testfiles unicode="yes" verbose="no" # Process args # http://www.zanecorp.com/wiki/index.php/Processing_Options_in_Bash prog=$0 until [ x$1 == x ]; do case $1 in -n|--nounicode) unicode="no";; -v|--verbose) verbose="yes";; -h|--help|*) echo "usage: $prog [options]" echo " -h, --help -- print this message" echo " -n, --nounicode -- delete any test file that begin " echo " with \"unicode\*\" in its file name." echo " -v, --verbose -- print commands when run" exit 0 esac shift # move the arg list to the next option or '--' done shift # remove the '--', now $1 positioned at first argument if any # TMP is the temp directory to use in this script # HTMP is the temp dierctory to pass to the executable. case `uname -s` in CYGWIN*WOW64) echo You are running on 64-bit Windows EXE="64.exe" TMP='/cygdrive/c/tmp/test' HTMP='c:/tmp/test' windows=1 ;; CYGWIN*) echo You are running on 32-bit Windows EXE=".exe" TMP='/cygdrive/c/tmp/test' HTMP='c:/tmp/test' windows=1 ;; *) echo You are running on Linux or Mac. EXE="" TMP='/tmp/test' HTMP='/tmp/test' windows="" ;; esac # TEST_BIN is the program under test if [ x$TEST_BIN = x ] ; then TEST_BIN=../src; fi if [ ! -r $TEST_BIN/md5deep$EXE ] ; then echo cannot find md5deep$EXE in $TEST_BIN echo Please set TEST_BIN with the directory of the executables being tested. exit 1 fi # GOOD_BIN is the program that is known to be good if [ x$GOOD_BIN = x ] ; then GOOD_BIN=$1 ; fi if [ x$GOOD_BIN = x ] ; then WHERE=`which md5deep 2>/dev/null` GOOD_BIN=`dirname $WHERE` fi if [ x$GOOD_BIN = x ] ; then echo Unable to locate installed md5deep executable. echo Define GOOD_BIN or specify the directory with the known good executables echo on the command line. exit 1 fi if [ ! -d $TMP ]; then echo No $TMP directory detected. Will try to create. mkdir $TMP if [ ! -d $TMP ]; then echo Cannot create $TMP. echo Finished. exit 1 fi fi good_ver=`$GOOD_BIN/md5deep -v` test_ver=`$TEST_BIN/md5deep -v` echo REFERENCE VERSION: $good_ver echo TEST VERSION: $test_ver if [ $good_ver = $test_ver ]; then echo It makes no sense to test a version against itself. echo Press return to continue test, ^c to terminate. read fi echo Reference output will go to ref/ echo Test output will go to tst/ echo Files to test will go in $TMP echo /bin/rm -rf ref tst mkdir ref tst echo Removing files in $TMP /bin/rm -rf $TMP echo Installing test files in $TMP mkdir $TMP (cd $TESTFILES_DIR >/dev/null; tar cf - .) | (cd $TMP;tar xpBf - ) echo Removing any '.svn' files that might have gotten into $TMP by accident find $TMP -depth -name '.svn' -exec rm -rf {} \; if [ $unicode = "no" ] ; then echo Removing filenames beginning with unicode find $TMP -name 'unicode*.txt' -exec rm {} \; fi echo Erasing the hashlist database files in the current directory /bin/rm -f hashlist-*.txt echo Creating hashlist files with no-match-em and two files with installed program $GOOD_BIN/hashdeep$EXE -l $HTMP/deadbeef.txt $HTMP/foo.txt > hashlist-hashdeep-partial.txt tail -1 hashlist-hashdeep-partial.txt | sed s+$HTMP/foo.txt+/no/match/em+ \ | sed s/[012345]/6/g >> hashlist-hashdeep-partial.txt $GOOD_BIN/md5deep$EXE -l $HTMP/deadbeef.txt $HTMP/foo.txt > hashlist-md5deep-partial.txt tail -1 hashlist-md5deep-partial.txt | sed s+$HTMP/foo.txt+/no/match/em+ \ | sed s/[012345]/6/g >> hashlist-md5deep-partial.txt $GOOD_BIN/hashdeep$EXE -l -r $HTMP > hashlist-hashdeep-full.txt 2>/dev/null $GOOD_BIN/md5deep$EXE -l -r $HTMP > hashlist-md5deep-full.txt 2>/dev/null # Create the test files for audit test case /bin/rm -f foo bar moo cow known1 known2 echo foo > foo echo bar > bar echo moo > moo echo cow > cow $GOOD_BIN/hashdeep$EXE -bc md5 foo bar > known1 $GOOD_BIN/hashdeep$EXE -bc sha1 moo cow > known2 # Now run the tests! for mode in generate test do echo $mode mode. if [ $mode = "generate" ] then # generate mode uses the known good code BASE=$GOOD_BIN else # test mode uses the version we are developing BASE=$TEST_BIN fi fails=0 for ((i=1;;i++)) do cmd="" case $i in # try lots of different versions of md5deep 1) cmd="$BASE/md5deep$EXE -r $HTMP " ;; 2) cmd="$BASE/md5deep$EXE -p512 $HTMP/deadbeef.txt " ;; 3) cmd="$BASE/md5deep$EXE -zr $HTMP " ;; 4) cmd="$BASE/md5deep$EXE -b $HTMP/deadbeef.txt " ;; 5) cmd="$BASE/md5deep$EXE -m hashlist-md5deep-partial.txt -r $HTMP " ;; 6) cmd="$BASE/md5deep$EXE -x hashlist-md5deep-partial.txt -r $HTMP " ;; 7) cmd="$BASE/md5deep$EXE -M hashlist-md5deep-partial.txt -r $HTMP " ;; 8) cmd="$BASE/md5deep$EXE -X hashlist-md5deep-partial.txt -r $HTMP " ;; 9) cmd="$BASE/md5deep$EXE -m hashlist-md5deep-partial.txt -w -r $HTMP " ;; 10) cmd="$BASE/md5deep$EXE -m hashlist-md5deep-partial.txt -n -r $HTMP " ;; 11) cmd="$BASE/md5deep$EXE -w -a deadbeefb303ba89ae055ad0234eb7e8 -r $HTMP " ;; 12) cmd="$BASE/md5deep$EXE -w -A deadbeefb303ba89ae055ad0234eb7e8 -r $HTMP " ;; 13) cmd="$BASE/md5deep$EXE -k $HTMP/deadbeef.txt " ;; 14) cmd="$BASE/md5deep$EXE -i1000 -r $HTMP " ;; 15) cmd="$BASE/md5deep$EXE -I1000 -r $HTMP " ;; 16) cmd="$BASE/md5deep$EXE -p512 -r $HTMP " ;; 17) cmd="$BASE/md5deep$EXE -Z $HTMP/*.txt " ;; 18) cmd="$BASE/md5deep$EXE -m $TESTFILES_DIR/known.txt $HTMP" ;; 19) cmd="$BASE/md5deep$EXE -Sm $TESTFILES_DIR/known.txt $HTMP" ;; 20) cmd="$BASE/md5deep$EXE -sm $TESTFILES_DIR/known.txt $HTMP" ;; 21) cmd="$BASE/md5deep$EXE /dev/null ";; # Now try all of the different deeps in regular mode and piecewise hashing mode 22) cmd="$BASE/md5deep$EXE -r $HTMP " ;; 23) cmd="$BASE/md5deep$EXE -p512 -r $HTMP " ;; 24) cmd="$BASE/sha1deep$EXE -r $HTMP " ;; 25) cmd="$BASE/sha1deep$EXE -p512 -r $HTMP " ;; 26) cmd="$BASE/sha256deep$EXE -r $HTMP " ;; 27) cmd="$BASE/sha256deep$EXE -p512 -r $HTMP" ;; 28) cmd="$BASE/tigerdeep$EXE -r $HTMP " ;; 29) cmd="$BASE/tigerdeep$EXE -p512 -r $HTMP " ;; 30) cmd="$BASE/whirlpooldeep$EXE -r $HTMP " ;; 31) cmd="$BASE/whirlpooldeep$EXE -p512 -r $HTMP " ;; 32) cmd="$BASE/hashdeep$EXE -r $HTMP " ;; 33) cmd="$BASE/hashdeep$EXE -p512 -r $HTMP " ;; 34) cmd="$BASE/hashdeep$EXE -m -k hashlist-hashdeep-partial.txt $HTMP/*.txt " ;; 35) cmd="$BASE/hashdeep$EXE -M -k hashlist-hashdeep-partial.txt $HTMP/*.txt " ;; 36) cmd="$BASE/hashdeep$EXE -w -m -k hashlist-hashdeep-partial.txt $HTMP/*.txt " ;; 37) cmd="$BASE/hashdeep$EXE -x -k hashlist-hashdeep-partial.txt $HTMP/*.txt " ;; 38) cmd="$BASE/hashdeep$EXE -x -w -k hashlist-hashdeep-partial.txt $HTMP/*.txt " ;; 39) cmd="$BASE/hashdeep$EXE -r -a -k hashlist-hashdeep-full.txt $HTMP " ;; 40) cmd="$BASE/hashdeep$EXE -v -r -a -k hashlist-hashdeep-full.txt $HTMP " ;; 41) cmd="$BASE/hashdeep$EXE /dev/null ";; # The stdin tests 42) cmd="echo README.txt | $BASE/hashdeep$EXE" ;; 43) cmd="echo README.txt | $BASE/md5deep$EXE" ;; 44) cmd="echo README.txt | $BASE/sha1deep$EXE" ;; 45) cmd="echo README.txt | $BASE/sha256deep$EXE" ;; 46) cmd="echo README.txt | $BASE/whirlpooldeep$EXE" ;; # Additional tests as errors are discovered 47) cmd="$BASE/hashdeep$EXE -vvvbak known1 -k known2 foo bar moo cow" ;; # BSD style hashes, iLook hashes. # iLook has different behavior with the algorithms, so we test with all 48) cmd="$BASE/md5deep$EXE -Sm $TESTFILES_DIR/bsd-hashes.txt -r $HTMP" ;; 49) cmd="$BASE/md5deep$EXE -m $TESTFILES_DIR/ilookv4.hsh -r $HTMP" ;; 50) cmd="$BASE/sha1deep$EXE -m $TESTFILES_DIR/ilookv4.hsh -r $HTMP" ;; 51) cmd="$BASE/md5deep$EXE -m $TESTFILES_DIR/nsrlfile.txt -r $HTMP" ;; 52) cmd="$BASE/sha1deep$EXE -m $TESTFILES_DIR/nsrlfile.txt -r $HTMP" ;; esac if [ x"$cmd" = "x" ] then break fi ### ### run the test! ### Standard output gets sorted to deal with multi-threading issues ### Standard error simply gets captured ## /bin/echo -n $mode $i ... /bin/rm -f $HTMP$i.out if [ $verbose = "yes" ]; then echo $cmd fi # STDOUT needs to have the executable directory removed. # On Windows, path names are inconsistent between the name that is provided # and the name the command thinks that it is being run under. # So we unify the prompt and remove C:.*hashdeep and replace with hashdeep. ### ### HERE IT IS: ### $cmd 2>test$i.err | sed s+$BASE/++ \ | sed s+"## C:[^ ]*>"+"## C:>"+ | sed s+"C:[^> ]*hashdeep"+C:/hashdeep+ | sort > test$i.out ### ### if [ $mode = "generate" ]; then tr -d \\r < test$i.out > ref/test$i.out tr -d \\r < test$i.err > ref/test$i.err # extra addition for test 47 if [ $i = 47 ]; then echo " Input files examined: 0" >> ref/test$i.out echo " Known files expecting: 0" >> ref/test$i.out sort ref/test$i.out > ref/test$i.out2 mv ref/test$i.out2 ref/test$i.out fi echo ok else tr -d \\r < test$i.out > hold; mv hold test$i.out tr -d \\r < test$i.err > hold; mv hold test$i.err fi if [ $mode = "test" ] then fail=no mv -f test$i.out tst/test$i.out mv -f test$i.err tst/test$i.err if ! diff ref/test$i.out tst/test$i.out ; then echo ====================================== echo TEST $i FAILED --- STDOUT DIFFERENT echo COMMAND: $cmd echo REFERENCE STDOUT: cat ref/test$i.out echo echo TEST STDOUT: cat tst/test$i.out echo ====================================== fail=yes fi if ! diff ref/test$i.err tst/test$i.err ; then echo ====================================== echo TEST $i FAILED --- STDERR DIFFERENT echo COMMAND: $cmd echo REFERENCE STDERR: cat ref/test$i.err echo echo TEST STDERR: cat tst/test$i.err echo ====================================== fail=yes fi if [ $fail = "yes" ] then ((fails++)) else echo passes. fi fi done done echo Total Failures: $fails exit $fails