--- contrib/libarchive/COPYING.orig +++ contrib/libarchive/COPYING @@ -20,7 +20,7 @@ libarchive/mtree.5 * The following source files are in the public domain: - libarchive/archive_getdate.c + libarchive/archive_parse_date.c * The following source files are triple-licensed with the ability to choose from CC0 1.0 Universal, OpenSSL or Apache 2.0 licenses: --- contrib/libarchive/NEWS.orig +++ contrib/libarchive/NEWS @@ -1,3 +1,11 @@ +Jun 01, 2026: libarchive 3.8.1 released + +May 20, 2025: libarchive 3.8.0 released + +Mar 30, 2025: libarchive 3.7.9 released + +Mar 20, 2025: libarchive 3.7.8 released + Oct 13, 2024: libarchive 3.7.7 released Sep 23, 2024: libarchive 3.7.6 released --- contrib/libarchive/README.md.orig +++ contrib/libarchive/README.md @@ -85,13 +85,14 @@ * PWB binary cpio * ISO9660 CD-ROM images (with optional Rockridge or Joliet extensions) * ZIP archives (with uncompressed or "deflate" compressed entries, including support for encrypted Zip archives) - * ZIPX archives (with support for bzip2, ppmd8, lzma and xz compressed entries) + * ZIPX archives (with support for bzip2, zstd, ppmd8, lzma and xz compressed entries) * GNU and BSD 'ar' archives * 'mtree' format * 7-Zip archives (including archives that use zstandard compression) * Microsoft CAB format * LHA and LZH archives * RAR and RAR 5.0 archives (with some limitations due to RAR's proprietary status) + * WARC archives * XAR archives The library also detects and handles any of the following before evaluating the archive: @@ -120,15 +121,18 @@ * PWB binary cpio * shar archives * ZIP archives (with uncompressed or "deflate" compressed entries) + * ZIPX archives (with bzip2, zstd, lzma or xz compressed entries) * GNU and BSD 'ar' archives * 'mtree' format * ISO9660 format - * 7-Zip archives + * 7-Zip archives (including archives that use zstandard compression) + * WARC archives * XAR archives When creating archives, the result can be filtered with any of the following: * uuencode + * base64 * gzip compression * bzip2 compression * compress/LZW compression @@ -241,4 +245,3 @@ appropriate. It has many advantages over other tar formats (including the legacy GNU tar format) and is widely supported by current tar implementations. - --- /dev/null +++ contrib/libarchive/build/ci/github_actions/install-macos-dependencies.sh @@ -0,0 +1,19 @@ +#!/bin/sh +set -eux + +# Uncommenting these adds a full minute to the CI time +#brew update > /dev/null +#brew upgrade > /dev/null + +# This does an upgrade if the package is already installed +brew install \ + autoconf \ + automake \ + libtool \ + pkg-config \ + cmake \ + xz \ + lz4 \ + zstd \ + libxml2 \ + openssl --- contrib/libarchive/cpio/cpio.c.orig +++ contrib/libarchive/cpio/cpio.c @@ -1206,7 +1206,7 @@ else strcpy(date, "invalid mtime"); - fprintf(out, "%s%3d %-8s %-8s %8s %12s %s", + fprintf(out, "%s%3u %-8s %-8s %8s %12s %s", archive_entry_strmode(entry), archive_entry_nlink(entry), uname, gname, size, date, --- contrib/libarchive/cpio/test/test_format_newc.c.orig +++ contrib/libarchive/cpio/test/test_format_newc.c @@ -189,10 +189,10 @@ gid = from_hex(e + 30, 8); /* gid */ assertEqualMem(e + 38, "00000003", 8); /* nlink */ t = from_hex(e + 46, 8); /* mtime */ - failure("t=%#08jx now=%#08jx=%jd", (intmax_t)t, (intmax_t)now, + failure("t=%#08jx now=%#08jx=%jd", (uintmax_t)t, (uintmax_t)now, (intmax_t)now); assert(t <= now); /* File wasn't created in future. */ - failure("t=%#08jx now - 2=%#08jx=%jd", (intmax_t)t, (intmax_t)now - 2, + failure("t=%#08jx now - 2=%#08jx=%jd", (uintmax_t)t, (uintmax_t)now - 2, (intmax_t)now - 2); assert(t >= now - 2); /* File was created w/in last 2 secs. */ failure("newc format stores body only with last appearance of a link\n" @@ -219,7 +219,7 @@ assert(is_hex(e, 110)); assertEqualMem(e + 0, "070701", 6); /* Magic */ assert(is_hex(e + 6, 8)); /* ino */ -#if defined(_WIN32) && !defined(CYGWIN) +#if defined(_WIN32) && !defined(__CYGWIN__) /* Mode: Group members bits and others bits do not work. */ assertEqualInt(0xa180, from_hex(e + 14, 8) & 0xffc0); #else @@ -230,7 +230,7 @@ assertEqualMem(e + 38, "00000001", 8); /* nlink */ t2 = from_hex(e + 46, 8); /* mtime */ failure("First entry created at t=%#08jx this entry created" - " at t2=%#08jx", (intmax_t)t, (intmax_t)t2); + " at t2=%#08jx", (uintmax_t)t, (uintmax_t)t2); assert(t2 == t || t2 == t + 1); /* Almost same as first entry. */ assertEqualMem(e + 54, "00000005", 8); /* File size */ fs = (uint64_t)from_hex(e + 54, 8); @@ -266,7 +266,7 @@ #endif t2 = from_hex(e + 46, 8); /* mtime */ failure("First entry created at t=%#08jx this entry created at" - "t2=%#08jx", (intmax_t)t, (intmax_t)t2); + "t2=%#08jx", (uintmax_t)t, (uintmax_t)t2); assert(t2 == t || t2 == t + 1); /* Almost same as first entry. */ assertEqualMem(e + 54, "00000000", 8); /* File size */ fs = (uint64_t)from_hex(e + 54, 8); @@ -300,7 +300,7 @@ assertEqualMem(e + 38, "00000003", 8); /* nlink */ t2 = from_hex(e + 46, 8); /* mtime */ failure("First entry created at t=%#08jx this entry created at" - "t2=%#08jx", (intmax_t)t, (intmax_t)t2); + "t2=%#08jx", (uintmax_t)t, (uintmax_t)t2); assert(t2 == t || t2 == t + 1); /* Almost same as first entry. */ assertEqualInt(10, from_hex(e + 54, 8)); /* File size */ fs = (uint64_t)from_hex(e + 54, 8); --- contrib/libarchive/cpio/test/test_option_a.c.orig +++ contrib/libarchive/cpio/test/test_option_a.c @@ -52,7 +52,7 @@ * #ifdef this section out. Most of the test below is * still valid. */ memset(×, 0, sizeof(times)); -#if defined(_WIN32) && !defined(CYGWIN) +#if defined(_WIN32) && !defined(__CYGWIN__) times.actime = 86400; times.modtime = 86400; #else --- contrib/libarchive/cpio/test/test_option_c.c.orig +++ contrib/libarchive/cpio/test/test_option_c.c @@ -18,7 +18,7 @@ return (1); } -static long long int +static unsigned long long int from_octal(const char *p, size_t l) { long long int r = 0; @@ -117,7 +117,7 @@ gid = (int)from_octal(e + 30, 6); assertEqualMem(e + 36, "000001", 6); /* nlink */ failure("file entries should not have rdev set (dev field was 0%o)", - dev); + (unsigned int)dev); assertEqualMem(e + 42, "000000", 6); /* rdev */ t = from_octal(e + 48, 11); /* mtime */ assert(t <= now); /* File wasn't created in future. */ @@ -133,7 +133,7 @@ assert(is_octal(e, 76)); /* Entire header is octal digits. */ assertEqualMem(e + 0, "070707", 6); /* Magic */ assertEqualInt(dev, from_octal(e + 6, 6)); /* dev */ - assert(ino != from_octal(e + 12, 6)); /* ino */ + assert(ino != (int)from_octal(e + 12, 6)); /* ino */ #if !defined(_WIN32) || defined(__CYGWIN__) /* On Windows, symbolic link and group members bits and * others bits do not work. */ @@ -163,7 +163,7 @@ assertEqualInt(dev, from_octal(e + 6, 6)); /* Ino must be different from first entry. */ assert(is_octal(e + 12, 6)); /* ino */ - assert(ino != from_octal(e + 12, 6)); + assert(ino != (int)from_octal(e + 12, 6)); #if defined(_WIN32) && !defined(__CYGWIN__) /* Group members bits and others bits do not work. */ assertEqualMem(e + 18, "040777", 6); /* Mode */ --- contrib/libarchive/libarchive/archive.h.orig +++ contrib/libarchive/libarchive/archive.h @@ -34,12 +34,15 @@ * assert that ARCHIVE_VERSION_NUMBER >= 2012108. */ /* Note: Compiler will complain if this does not match archive_entry.h! */ -#define ARCHIVE_VERSION_NUMBER 3007007 +#define ARCHIVE_VERSION_NUMBER 3008001 #include #include /* for wchar_t */ #include /* For FILE * */ +#if ARCHIVE_VERSION_NUMBER < 4000000 +/* time_t is slated to be removed from public includes in 4.0 */ #include /* For time_t */ +#endif /* * Note: archive.h is for use outside of libarchive; the configuration @@ -63,12 +66,15 @@ #define __LA_INT64_T_DEFINED # if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) typedef __int64 la_int64_t; +typedef unsigned __int64 la_uint64_t; # else # include /* ssize_t */ # if defined(_SCO_DS) || defined(__osf__) typedef long long la_int64_t; +typedef unsigned long long la_uint64_t; # else typedef int64_t la_int64_t; +typedef uint64_t la_uint64_t; # endif # endif #endif @@ -94,6 +100,22 @@ # endif #endif +#if ARCHIVE_VERSION_NUMBER < 4000000 +/* Use the platform types for time_t */ +#define __LA_TIME_T time_t +#else +/* Use 64-bits integer types for time_t */ +#define __LA_TIME_T la_int64_t +#endif + +#if ARCHIVE_VERSION_NUMBER < 4000000 +/* Use the platform types for dev_t */ +#define __LA_DEV_T dev_t +#else +/* Use 64-bits integer types for dev_t */ +#define __LA_DEV_T la_int64_t +#endif + /* Large file support for Android */ #if defined(__LIBARCHIVE_BUILD) && defined(__ANDROID__) #include "android_lf.h" @@ -132,7 +154,7 @@ #define __LA_PRINTF(fmtarg, firstvararg) /* nothing */ #endif -#if defined(__GNUC__) && __GNUC__ >= 3 && __GNUC_MINOR__ >= 1 +#if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) # define __LA_DEPRECATED __attribute__((deprecated)) #else # define __LA_DEPRECATED @@ -155,7 +177,7 @@ /* * Textual name/version of the library, useful for version displays. */ -#define ARCHIVE_VERSION_ONLY_STRING "3.7.7" +#define ARCHIVE_VERSION_ONLY_STRING "3.8.1" #define ARCHIVE_VERSION_STRING "libarchive " ARCHIVE_VERSION_ONLY_STRING __LA_DECL const char * archive_version_string(void); @@ -178,6 +200,23 @@ __LA_DECL const char * archive_bzlib_version(void); __LA_DECL const char * archive_liblz4_version(void); __LA_DECL const char * archive_libzstd_version(void); +__LA_DECL const char * archive_liblzo2_version(void); +__LA_DECL const char * archive_libexpat_version(void); +__LA_DECL const char * archive_libbsdxml_version(void); +__LA_DECL const char * archive_libxml2_version(void); +__LA_DECL const char * archive_mbedtls_version(void); +__LA_DECL const char * archive_nettle_version(void); +__LA_DECL const char * archive_openssl_version(void); +__LA_DECL const char * archive_libmd_version(void); +__LA_DECL const char * archive_commoncrypto_version(void); +__LA_DECL const char * archive_cng_version(void); +__LA_DECL const char * archive_wincrypt_version(void); +__LA_DECL const char * archive_librichacl_version(void); +__LA_DECL const char * archive_libacl_version(void); +__LA_DECL const char * archive_libattr_version(void); +__LA_DECL const char * archive_libiconv_version(void); +__LA_DECL const char * archive_libpcre_version(void); +__LA_DECL const char * archive_libpcre2_version(void); /* Declare our basic types. */ struct archive; @@ -449,6 +488,8 @@ __LA_DECL int archive_read_support_format_cab(struct archive *); __LA_DECL int archive_read_support_format_cpio(struct archive *); __LA_DECL int archive_read_support_format_empty(struct archive *); +/* archive_read_support_format_gnutar() is an alias for historical reasons + * of archive_read_support_format_tar(). */ __LA_DECL int archive_read_support_format_gnutar(struct archive *); __LA_DECL int archive_read_support_format_iso9660(struct archive *); __LA_DECL int archive_read_support_format_lha(struct archive *); @@ -828,6 +869,10 @@ __LA_DECL int archive_write_set_format_filter_by_ext_def(struct archive *a, const char *filename, const char * def_ext); __LA_DECL int archive_write_zip_set_compression_deflate(struct archive *); __LA_DECL int archive_write_zip_set_compression_store(struct archive *); +__LA_DECL int archive_write_zip_set_compression_lzma(struct archive *); +__LA_DECL int archive_write_zip_set_compression_xz(struct archive *); +__LA_DECL int archive_write_zip_set_compression_bzip2(struct archive *); +__LA_DECL int archive_write_zip_set_compression_zstd(struct archive *); /* Deprecated; use archive_write_open2 instead */ __LA_DECL int archive_write_open(struct archive *, void *, archive_open_callback *, archive_write_callback *, @@ -1083,6 +1128,10 @@ __LA_DEPRECATED; #endif +/* Parses a date string relative to the current time. + * NOTE: This is not intended for general date parsing, and the resulting timestamp should only be used for libarchive. */ +__LA_DECL time_t archive_parse_date(time_t now, const char *datestr); + __LA_DECL int archive_errno(struct archive *); __LA_DECL const char *archive_error_string(struct archive *); __LA_DECL const char *archive_format_name(struct archive *); @@ -1201,8 +1250,10 @@ const wchar_t *); /* Utility functions */ +#if ARCHIVE_VERSION_NUMBER < 4000000 /* Convenience function to sort a NULL terminated list of strings */ __LA_DECL int archive_utility_string_sort(char **); +#endif #ifdef __cplusplus } --- contrib/libarchive/libarchive/archive_acl.c.orig +++ contrib/libarchive/libarchive/archive_acl.c @@ -1185,8 +1185,13 @@ /* Set remaining fields to blank. */ for (n = fields; n < numfields; ++n) field[n].start = field[n].end = NULL; + + if (field[0].start == NULL || field[0].end == NULL) { + /* This should never happen */ + return (ARCHIVE_FATAL); + } - if (field[0].start != NULL && *(field[0].start) == L'#') { + if (*(field[0].start) == L'#') { /* Comment, skip entry */ continue; } @@ -1676,7 +1681,12 @@ for (n = fields; n < numfields; ++n) field[n].start = field[n].end = NULL; - if (field[0].start != NULL && *(field[0].start) == '#') { + if (field[0].start == NULL || field[0].end == NULL) { + /* This should never happen */ + return (ARCHIVE_FATAL); + } + + if (*(field[0].start) == '#') { /* Comment, skip entry */ continue; } --- contrib/libarchive/libarchive/archive_acl_private.h.orig +++ contrib/libarchive/libarchive/archive_acl_private.h @@ -80,4 +80,4 @@ int archive_acl_from_text_nl(struct archive_acl *, const char * /* text */, size_t /* size of text */, int /* type */, struct archive_string_conv *); -#endif /* ARCHIVE_ENTRY_PRIVATE_H_INCLUDED */ +#endif /* !ARCHIVE_ACL_PRIVATE_H_INCLUDED */ --- contrib/libarchive/libarchive/archive_cmdline.c.orig +++ contrib/libarchive/libarchive/archive_cmdline.c @@ -71,7 +71,7 @@ archive_string_empty(as); /* Skip beginning space characters. */ - while (*s != '\0' && *s == ' ') + while (*s == ' ') s++; /* Copy non-space characters. */ while (*s != '\0' && *s != ' ') { --- contrib/libarchive/libarchive/archive_cryptor_private.h.orig +++ contrib/libarchive/libarchive/archive_cryptor_private.h @@ -64,6 +64,7 @@ #elif defined(_WIN32) && !defined(__CYGWIN__) && defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA #include +#define ARCHIVE_CRYPTOR_USE_CNG 1 /* Common in other bcrypt implementations, but missing from VS2008. */ #ifndef BCRYPT_SUCCESS @@ -86,6 +87,7 @@ #include #include #include +#define ARCHIVE_CRYPTOR_USE_MBED 1 #define AES_MAX_KEY_SIZE 32 #define AES_BLOCK_SIZE 16 @@ -105,6 +107,7 @@ #endif #include #include +#define ARCHIVE_CRYPTOR_USE_NETTLE 1 typedef struct { #if NETTLE_VERSION_MAJOR < 3 @@ -125,6 +128,7 @@ #elif defined(HAVE_LIBCRYPTO) #include "archive_openssl_evp_private.h" +#define ARCHIVE_CRYPTOR_USE_OPENSSL 1 #define AES_BLOCK_SIZE 16 #define AES_MAX_KEY_SIZE 32 @@ -140,6 +144,10 @@ #else +#if defined(_WIN32) && !defined(__CYGWIN__) && !(defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA) +#define ARCHIVE_CRYPTOR_USE_WINCRYPT 1 +#endif + #define AES_BLOCK_SIZE 16 #define AES_MAX_KEY_SIZE 32 typedef int archive_crypto_ctx; --- contrib/libarchive/libarchive/archive_digest.c.orig +++ contrib/libarchive/libarchive/archive_digest.c @@ -196,6 +196,13 @@ #elif defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM) +// These functions are available in macOS 10.4 and later, but deprecated from 10.15 onwards. +// We need to continue supporting this feature regardless, so suppress the warnings. +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#endif + static int __archive_md5init(archive_md5_ctx *ctx) { @@ -218,13 +225,46 @@ return (ARCHIVE_OK); } +#if defined(__clang__) +#pragma clang diagnostic pop +#endif + +#elif defined(ARCHIVE_CRYPTO_MD5_WIN) + +static int +__archive_md5init(archive_md5_ctx *ctx) +{ +#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA + return (win_crypto_init(ctx, BCRYPT_MD5_ALGORITHM)); +#else + return (win_crypto_init(ctx, PROV_RSA_FULL, CALG_MD5)); +#endif +} + +static int +__archive_md5update(archive_md5_ctx *ctx, const void *indata, + size_t insize) +{ + return (win_crypto_Update(ctx, indata, insize)); +} + +static int +__archive_md5final(archive_md5_ctx *ctx, void *md) +{ + return (win_crypto_Final(md, 16, ctx)); +} + #elif defined(ARCHIVE_CRYPTO_MD5_MBEDTLS) static int __archive_md5init(archive_md5_ctx *ctx) { mbedtls_md5_init(ctx); +#if MBEDTLS_VERSION_NUMBER > 0x03000000 + if (mbedtls_md5_starts(ctx) == 0) +#else if (mbedtls_md5_starts_ret(ctx) == 0) +#endif return (ARCHIVE_OK); else return (ARCHIVE_FATAL); @@ -234,7 +274,11 @@ __archive_md5update(archive_md5_ctx *ctx, const void *indata, size_t insize) { +#if MBEDTLS_VERSION_NUMBER > 0x03000000 + if (mbedtls_md5_update(ctx, indata, insize) == 0) +#else if (mbedtls_md5_update_ret(ctx, indata, insize) == 0) +#endif return (ARCHIVE_OK); else return (ARCHIVE_FATAL); @@ -243,7 +287,11 @@ static int __archive_md5final(archive_md5_ctx *ctx, void *md) { +#if MBEDTLS_VERSION_NUMBER > 0x03000000 + if (mbedtls_md5_finish(ctx, md) == 0) { +#else if (mbedtls_md5_finish_ret(ctx, md) == 0) { +#endif mbedtls_md5_free(ctx); return (ARCHIVE_OK); } else { @@ -311,31 +359,6 @@ return (ARCHIVE_OK); } -#elif defined(ARCHIVE_CRYPTO_MD5_WIN) - -static int -__archive_md5init(archive_md5_ctx *ctx) -{ -#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA - return (win_crypto_init(ctx, BCRYPT_MD5_ALGORITHM)); -#else - return (win_crypto_init(ctx, PROV_RSA_FULL, CALG_MD5)); -#endif -} - -static int -__archive_md5update(archive_md5_ctx *ctx, const void *indata, - size_t insize) -{ - return (win_crypto_Update(ctx, indata, insize)); -} - -static int -__archive_md5final(archive_md5_ctx *ctx, void *md) -{ - return (win_crypto_Final(md, 16, ctx)); -} - #else static int @@ -420,7 +443,11 @@ __archive_ripemd160init(archive_rmd160_ctx *ctx) { mbedtls_ripemd160_init(ctx); +#if MBEDTLS_VERSION_NUMBER > 0x03000000 + if (mbedtls_ripemd160_starts(ctx) == 0) +#else if (mbedtls_ripemd160_starts_ret(ctx) == 0) +#endif return (ARCHIVE_OK); else return (ARCHIVE_FATAL); @@ -430,7 +457,11 @@ __archive_ripemd160update(archive_rmd160_ctx *ctx, const void *indata, size_t insize) { +#if MBEDTLS_VERSION_NUMBER > 0x03000000 + if (mbedtls_ripemd160_update(ctx, indata, insize) == 0) +#else if (mbedtls_ripemd160_update_ret(ctx, indata, insize) == 0) +#endif return (ARCHIVE_OK); else return (ARCHIVE_FATAL); @@ -439,7 +470,11 @@ static int __archive_ripemd160final(archive_rmd160_ctx *ctx, void *md) { +#if MBEDTLS_VERSION_NUMBER > 0x03000000 + if (mbedtls_ripemd160_finish(ctx, md) == 0) { +#else if (mbedtls_ripemd160_finish_ret(ctx, md) == 0) { +#endif mbedtls_ripemd160_free(ctx); return (ARCHIVE_OK); } else { @@ -605,13 +640,42 @@ return (ARCHIVE_OK); } +#elif defined(ARCHIVE_CRYPTO_SHA1_WIN) + +static int +__archive_sha1init(archive_sha1_ctx *ctx) +{ +#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA + return (win_crypto_init(ctx, BCRYPT_SHA1_ALGORITHM)); +#else + return (win_crypto_init(ctx, PROV_RSA_FULL, CALG_SHA1)); +#endif +} + +static int +__archive_sha1update(archive_sha1_ctx *ctx, const void *indata, + size_t insize) +{ + return (win_crypto_Update(ctx, indata, insize)); +} + +static int +__archive_sha1final(archive_sha1_ctx *ctx, void *md) +{ + return (win_crypto_Final(md, 20, ctx)); +} + #elif defined(ARCHIVE_CRYPTO_SHA1_MBEDTLS) static int __archive_sha1init(archive_sha1_ctx *ctx) { mbedtls_sha1_init(ctx); +#if MBEDTLS_VERSION_NUMBER > 0x03000000 + if (mbedtls_sha1_starts(ctx) == 0) +#else if (mbedtls_sha1_starts_ret(ctx) == 0) +#endif return (ARCHIVE_OK); else return (ARCHIVE_FATAL); @@ -621,7 +685,11 @@ __archive_sha1update(archive_sha1_ctx *ctx, const void *indata, size_t insize) { +#if MBEDTLS_VERSION_NUMBER > 0x03000000 + if (mbedtls_sha1_update(ctx, indata, insize) == 0) +#else if (mbedtls_sha1_update_ret(ctx, indata, insize) == 0) +#endif return (ARCHIVE_OK); else return (ARCHIVE_FATAL); @@ -630,7 +698,11 @@ static int __archive_sha1final(archive_sha1_ctx *ctx, void *md) { +#if MBEDTLS_VERSION_NUMBER > 0x03000000 + if (mbedtls_sha1_finish(ctx, md) == 0) { +#else if (mbedtls_sha1_finish_ret(ctx, md) == 0) { +#endif mbedtls_sha1_free(ctx); return (ARCHIVE_OK); } else { @@ -698,31 +770,6 @@ return (ARCHIVE_OK); } -#elif defined(ARCHIVE_CRYPTO_SHA1_WIN) - -static int -__archive_sha1init(archive_sha1_ctx *ctx) -{ -#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA - return (win_crypto_init(ctx, BCRYPT_SHA1_ALGORITHM)); -#else - return (win_crypto_init(ctx, PROV_RSA_FULL, CALG_SHA1)); -#endif -} - -static int -__archive_sha1update(archive_sha1_ctx *ctx, const void *indata, - size_t insize) -{ - return (win_crypto_Update(ctx, indata, insize)); -} - -static int -__archive_sha1final(archive_sha1_ctx *ctx, void *md) -{ - return (win_crypto_Final(md, 20, ctx)); -} - #else static int @@ -873,13 +920,42 @@ return (ARCHIVE_OK); } +#elif defined(ARCHIVE_CRYPTO_SHA256_WIN) + +static int +__archive_sha256init(archive_sha256_ctx *ctx) +{ +#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA + return (win_crypto_init(ctx, BCRYPT_SHA256_ALGORITHM)); +#else + return (win_crypto_init(ctx, PROV_RSA_AES, CALG_SHA_256)); +#endif +} + +static int +__archive_sha256update(archive_sha256_ctx *ctx, const void *indata, + size_t insize) +{ + return (win_crypto_Update(ctx, indata, insize)); +} + +static int +__archive_sha256final(archive_sha256_ctx *ctx, void *md) +{ + return (win_crypto_Final(md, 32, ctx)); +} + #elif defined(ARCHIVE_CRYPTO_SHA256_MBEDTLS) static int __archive_sha256init(archive_sha256_ctx *ctx) { mbedtls_sha256_init(ctx); +#if MBEDTLS_VERSION_NUMBER > 0x03000000 + if (mbedtls_sha256_starts(ctx, 0) == 0) +#else if (mbedtls_sha256_starts_ret(ctx, 0) == 0) +#endif return (ARCHIVE_OK); else return (ARCHIVE_FATAL); @@ -889,7 +965,11 @@ __archive_sha256update(archive_sha256_ctx *ctx, const void *indata, size_t insize) { +#if MBEDTLS_VERSION_NUMBER > 0x03000000 + if (mbedtls_sha256_update(ctx, indata, insize) == 0) +#else if (mbedtls_sha256_update_ret(ctx, indata, insize) == 0) +#endif return (ARCHIVE_OK); else return (ARCHIVE_FATAL); @@ -898,7 +978,11 @@ static int __archive_sha256final(archive_sha256_ctx *ctx, void *md) { +#if MBEDTLS_VERSION_NUMBER > 0x03000000 + if (mbedtls_sha256_finish(ctx, md) == 0) { +#else if (mbedtls_sha256_finish_ret(ctx, md) == 0) { +#endif mbedtls_sha256_free(ctx); return (ARCHIVE_OK); } else { @@ -962,31 +1046,6 @@ return (ARCHIVE_OK); } -#elif defined(ARCHIVE_CRYPTO_SHA256_WIN) - -static int -__archive_sha256init(archive_sha256_ctx *ctx) -{ -#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA - return (win_crypto_init(ctx, BCRYPT_SHA256_ALGORITHM)); -#else - return (win_crypto_init(ctx, PROV_RSA_AES, CALG_SHA_256)); -#endif -} - -static int -__archive_sha256update(archive_sha256_ctx *ctx, const void *indata, - size_t insize) -{ - return (win_crypto_Update(ctx, indata, insize)); -} - -static int -__archive_sha256final(archive_sha256_ctx *ctx, void *md) -{ - return (win_crypto_Final(md, 32, ctx)); -} - #else static int @@ -1113,13 +1172,42 @@ return (ARCHIVE_OK); } +#elif defined(ARCHIVE_CRYPTO_SHA384_WIN) + +static int +__archive_sha384init(archive_sha384_ctx *ctx) +{ +#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA + return (win_crypto_init(ctx, BCRYPT_SHA384_ALGORITHM)); +#else + return (win_crypto_init(ctx, PROV_RSA_AES, CALG_SHA_384)); +#endif +} + +static int +__archive_sha384update(archive_sha384_ctx *ctx, const void *indata, + size_t insize) +{ + return (win_crypto_Update(ctx, indata, insize)); +} + +static int +__archive_sha384final(archive_sha384_ctx *ctx, void *md) +{ + return (win_crypto_Final(md, 48, ctx)); +} + #elif defined(ARCHIVE_CRYPTO_SHA384_MBEDTLS) static int __archive_sha384init(archive_sha384_ctx *ctx) { mbedtls_sha512_init(ctx); +#if MBEDTLS_VERSION_NUMBER > 0x03000000 + if (mbedtls_sha512_starts(ctx, 1) == 0) +#else if (mbedtls_sha512_starts_ret(ctx, 1) == 0) +#endif return (ARCHIVE_OK); else return (ARCHIVE_FATAL); @@ -1129,7 +1217,11 @@ __archive_sha384update(archive_sha384_ctx *ctx, const void *indata, size_t insize) { +#if MBEDTLS_VERSION_NUMBER > 0x03000000 + if (mbedtls_sha512_update(ctx, indata, insize) == 0) +#else if (mbedtls_sha512_update_ret(ctx, indata, insize) == 0) +#endif return (ARCHIVE_OK); else return (ARCHIVE_FATAL); @@ -1138,7 +1230,11 @@ static int __archive_sha384final(archive_sha384_ctx *ctx, void *md) { +#if MBEDTLS_VERSION_NUMBER > 0x03000000 + if (mbedtls_sha512_finish(ctx, md) == 0) { +#else if (mbedtls_sha512_finish_ret(ctx, md) == 0) { +#endif mbedtls_sha512_free(ctx); return (ARCHIVE_OK); } else { @@ -1202,31 +1298,6 @@ return (ARCHIVE_OK); } -#elif defined(ARCHIVE_CRYPTO_SHA384_WIN) - -static int -__archive_sha384init(archive_sha384_ctx *ctx) -{ -#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA - return (win_crypto_init(ctx, BCRYPT_SHA384_ALGORITHM)); -#else - return (win_crypto_init(ctx, PROV_RSA_AES, CALG_SHA_384)); -#endif -} - -static int -__archive_sha384update(archive_sha384_ctx *ctx, const void *indata, - size_t insize) -{ - return (win_crypto_Update(ctx, indata, insize)); -} - -static int -__archive_sha384final(archive_sha384_ctx *ctx, void *md) -{ - return (win_crypto_Final(md, 48, ctx)); -} - #else static int @@ -1377,13 +1448,42 @@ return (ARCHIVE_OK); } +#elif defined(ARCHIVE_CRYPTO_SHA512_WIN) + +static int +__archive_sha512init(archive_sha512_ctx *ctx) +{ +#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA + return (win_crypto_init(ctx, BCRYPT_SHA512_ALGORITHM)); +#else + return (win_crypto_init(ctx, PROV_RSA_AES, CALG_SHA_512)); +#endif +} + +static int +__archive_sha512update(archive_sha512_ctx *ctx, const void *indata, + size_t insize) +{ + return (win_crypto_Update(ctx, indata, insize)); +} + +static int +__archive_sha512final(archive_sha512_ctx *ctx, void *md) +{ + return (win_crypto_Final(md, 64, ctx)); +} + #elif defined(ARCHIVE_CRYPTO_SHA512_MBEDTLS) static int __archive_sha512init(archive_sha512_ctx *ctx) { mbedtls_sha512_init(ctx); +#if MBEDTLS_VERSION_NUMBER > 0x03000000 + if (mbedtls_sha512_starts(ctx, 0) == 0) +#else if (mbedtls_sha512_starts_ret(ctx, 0) == 0) +#endif return (ARCHIVE_OK); else return (ARCHIVE_FATAL); @@ -1393,7 +1493,11 @@ __archive_sha512update(archive_sha512_ctx *ctx, const void *indata, size_t insize) { +#if MBEDTLS_VERSION_NUMBER > 0x03000000 + if (mbedtls_sha512_update(ctx, indata, insize) == 0) +#else if (mbedtls_sha512_update_ret(ctx, indata, insize) == 0) +#endif return (ARCHIVE_OK); else return (ARCHIVE_FATAL); @@ -1402,7 +1506,11 @@ static int __archive_sha512final(archive_sha512_ctx *ctx, void *md) { +#if MBEDTLS_VERSION_NUMBER > 0x03000000 + if (mbedtls_sha512_finish(ctx, md) == 0) { +#else if (mbedtls_sha512_finish_ret(ctx, md) == 0) { +#endif mbedtls_sha512_free(ctx); return (ARCHIVE_OK); } else { @@ -1466,31 +1574,6 @@ return (ARCHIVE_OK); } -#elif defined(ARCHIVE_CRYPTO_SHA512_WIN) - -static int -__archive_sha512init(archive_sha512_ctx *ctx) -{ -#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA - return (win_crypto_init(ctx, BCRYPT_SHA512_ALGORITHM)); -#else - return (win_crypto_init(ctx, PROV_RSA_AES, CALG_SHA_512)); -#endif -} - -static int -__archive_sha512update(archive_sha512_ctx *ctx, const void *indata, - size_t insize) -{ - return (win_crypto_Update(ctx, indata, insize)); -} - -static int -__archive_sha512final(archive_sha512_ctx *ctx, void *md) -{ - return (win_crypto_Final(md, 64, ctx)); -} - #else static int @@ -1525,11 +1608,12 @@ * 1. libc * 2. libc2 * 3. libc3 - * 4. libSystem - * 5. Nettle - * 6. OpenSSL - * 7. libmd - * 8. Windows API + * 4. libmd + * 5. libSystem + * 6. Windows API + * 7. mbedTLS + * 8. Nettle + * 9. OpenSSL */ const struct archive_digest __archive_digest = { --- contrib/libarchive/libarchive/archive_digest_private.h.orig +++ contrib/libarchive/libarchive/archive_digest_private.h @@ -113,6 +113,7 @@ defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM) ||\ defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM) #include +#define ARCHIVE_CRYPTO_CommonCrypto 1 #endif /* mbed TLS crypto headers */ @@ -167,6 +168,7 @@ #if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA /* don't use bcrypt when XP needs to be supported */ #include +#define ARCHIVE_CRYPTO_CNG 1 typedef struct { int valid; BCRYPT_ALG_HANDLE hAlg; @@ -175,6 +177,7 @@ #else #include #include +#define ARCHIVE_CRYPTO_WINCRYPT 1 typedef struct { int valid; HCRYPTPROV cryptProv; @@ -190,14 +193,16 @@ typedef MD5_CTX archive_md5_ctx; #elif defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM) typedef CC_MD5_CTX archive_md5_ctx; +#elif defined(ARCHIVE_CRYPTO_MD5_WIN) +typedef Digest_CTX archive_md5_ctx; #elif defined(ARCHIVE_CRYPTO_MD5_MBEDTLS) +#define ARCHIVE_CRYPTO_MBED 1 typedef mbedtls_md5_context archive_md5_ctx; #elif defined(ARCHIVE_CRYPTO_MD5_NETTLE) +#define ARCHIVE_CRYPTO_NETTLE 1 typedef struct md5_ctx archive_md5_ctx; #elif defined(ARCHIVE_CRYPTO_MD5_OPENSSL) typedef EVP_MD_CTX *archive_md5_ctx; -#elif defined(ARCHIVE_CRYPTO_MD5_WIN) -typedef Digest_CTX archive_md5_ctx; #else typedef unsigned char archive_md5_ctx; #endif @@ -207,8 +212,10 @@ #elif defined(ARCHIVE_CRYPTO_RMD160_LIBMD) typedef RIPEMD160_CTX archive_rmd160_ctx; #elif defined(ARCHIVE_CRYPTO_RMD160_MBEDTLS) +#define ARCHIVE_CRYPTO_MBED 1 typedef mbedtls_ripemd160_context archive_rmd160_ctx; #elif defined(ARCHIVE_CRYPTO_RMD160_NETTLE) +#define ARCHIVE_CRYPTO_NETTLE 1 typedef struct ripemd160_ctx archive_rmd160_ctx; #elif defined(ARCHIVE_CRYPTO_RMD160_OPENSSL) typedef EVP_MD_CTX *archive_rmd160_ctx; @@ -222,14 +229,16 @@ typedef SHA1_CTX archive_sha1_ctx; #elif defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM) typedef CC_SHA1_CTX archive_sha1_ctx; +#elif defined(ARCHIVE_CRYPTO_SHA1_WIN) +typedef Digest_CTX archive_sha1_ctx; #elif defined(ARCHIVE_CRYPTO_SHA1_MBEDTLS) +#define ARCHIVE_CRYPTO_MBED 1 typedef mbedtls_sha1_context archive_sha1_ctx; #elif defined(ARCHIVE_CRYPTO_SHA1_NETTLE) +#define ARCHIVE_CRYPTO_NETTLE 1 typedef struct sha1_ctx archive_sha1_ctx; #elif defined(ARCHIVE_CRYPTO_SHA1_OPENSSL) typedef EVP_MD_CTX *archive_sha1_ctx; -#elif defined(ARCHIVE_CRYPTO_SHA1_WIN) -typedef Digest_CTX archive_sha1_ctx; #else typedef unsigned char archive_sha1_ctx; #endif @@ -244,14 +253,16 @@ typedef SHA256_CTX archive_sha256_ctx; #elif defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM) typedef CC_SHA256_CTX archive_sha256_ctx; +#elif defined(ARCHIVE_CRYPTO_SHA256_WIN) +typedef Digest_CTX archive_sha256_ctx; #elif defined(ARCHIVE_CRYPTO_SHA256_MBEDTLS) +#define ARCHIVE_CRYPTO_MBED 1 typedef mbedtls_sha256_context archive_sha256_ctx; #elif defined(ARCHIVE_CRYPTO_SHA256_NETTLE) +#define ARCHIVE_CRYPTO_NETTLE 1 typedef struct sha256_ctx archive_sha256_ctx; #elif defined(ARCHIVE_CRYPTO_SHA256_OPENSSL) typedef EVP_MD_CTX *archive_sha256_ctx; -#elif defined(ARCHIVE_CRYPTO_SHA256_WIN) -typedef Digest_CTX archive_sha256_ctx; #else typedef unsigned char archive_sha256_ctx; #endif @@ -264,14 +275,16 @@ typedef SHA2_CTX archive_sha384_ctx; #elif defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM) typedef CC_SHA512_CTX archive_sha384_ctx; +#elif defined(ARCHIVE_CRYPTO_SHA384_WIN) +typedef Digest_CTX archive_sha384_ctx; #elif defined(ARCHIVE_CRYPTO_SHA384_MBEDTLS) +#define ARCHIVE_CRYPTO_MBED 1 typedef mbedtls_sha512_context archive_sha384_ctx; #elif defined(ARCHIVE_CRYPTO_SHA384_NETTLE) +#define ARCHIVE_CRYPTO_NETTLE 1 typedef struct sha384_ctx archive_sha384_ctx; #elif defined(ARCHIVE_CRYPTO_SHA384_OPENSSL) typedef EVP_MD_CTX *archive_sha384_ctx; -#elif defined(ARCHIVE_CRYPTO_SHA384_WIN) -typedef Digest_CTX archive_sha384_ctx; #else typedef unsigned char archive_sha384_ctx; #endif @@ -286,14 +299,16 @@ typedef SHA512_CTX archive_sha512_ctx; #elif defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM) typedef CC_SHA512_CTX archive_sha512_ctx; +#elif defined(ARCHIVE_CRYPTO_SHA512_WIN) +typedef Digest_CTX archive_sha512_ctx; #elif defined(ARCHIVE_CRYPTO_SHA512_MBEDTLS) +#define ARCHIVE_CRYPTO_MBED 1 typedef mbedtls_sha512_context archive_sha512_ctx; #elif defined(ARCHIVE_CRYPTO_SHA512_NETTLE) +#define ARCHIVE_CRYPTO_NETTLE 1 typedef struct sha512_ctx archive_sha512_ctx; #elif defined(ARCHIVE_CRYPTO_SHA512_OPENSSL) typedef EVP_MD_CTX *archive_sha512_ctx; -#elif defined(ARCHIVE_CRYPTO_SHA512_WIN) -typedef Digest_CTX archive_sha512_ctx; #else typedef unsigned char archive_sha512_ctx; #endif --- contrib/libarchive/libarchive/archive_disk_acl_freebsd.c.orig +++ contrib/libarchive/libarchive/archive_disk_acl_freebsd.c @@ -262,7 +262,7 @@ } for (i = 0; i < acl_nfs4_flag_map_size; ++i) { r = acl_get_flag_np(acl_flagset, - acl_nfs4_flag_map[i].p_perm); + (acl_flag_t)acl_nfs4_flag_map[i].p_perm); if (r == -1) { archive_set_error(&a->archive, errno, "Failed to check flag in a NFSv4 " @@ -517,7 +517,7 @@ for (i = 0; i < acl_nfs4_flag_map_size; ++i) { if (ae_permset & acl_nfs4_flag_map[i].a_perm) { if (acl_add_flag_np(acl_flagset, - acl_nfs4_flag_map[i].p_perm) != 0) { + (acl_flag_t)acl_nfs4_flag_map[i].p_perm) != 0) { archive_set_error(a, errno, "Failed to add flag to " "NFSv4 ACL flagset"); --- contrib/libarchive/libarchive/archive_entry.c.orig +++ contrib/libarchive/libarchive/archive_entry.c @@ -275,7 +275,7 @@ * Functions for reading fields from an archive_entry. */ -time_t +__LA_TIME_T archive_entry_atime(struct archive_entry *entry) { return (entry->ae_stat.aest_atime); @@ -293,7 +293,7 @@ return (entry->ae_set & AE_SET_ATIME); } -time_t +__LA_TIME_T archive_entry_birthtime(struct archive_entry *entry) { return (entry->ae_stat.aest_birthtime); @@ -311,7 +311,7 @@ return (entry->ae_set & AE_SET_BIRTHTIME); } -time_t +__LA_TIME_T archive_entry_ctime(struct archive_entry *entry) { return (entry->ae_stat.aest_ctime); @@ -329,7 +329,7 @@ return (entry->ae_stat.aest_ctime_nsec); } -dev_t +__LA_DEV_T archive_entry_dev(struct archive_entry *entry) { if (entry->ae_stat.aest_dev_is_broken_down) @@ -345,7 +345,7 @@ return (entry->ae_set & AE_SET_DEV); } -dev_t +__LA_DEV_T archive_entry_devmajor(struct archive_entry *entry) { if (entry->ae_stat.aest_dev_is_broken_down) @@ -354,7 +354,7 @@ return major(entry->ae_stat.aest_dev); } -dev_t +__LA_DEV_T archive_entry_devminor(struct archive_entry *entry) { if (entry->ae_stat.aest_dev_is_broken_down) @@ -568,7 +568,7 @@ return (entry->acl.mode); } -time_t +__LA_TIME_T archive_entry_mtime(struct archive_entry *entry) { return (entry->ae_stat.aest_mtime); @@ -667,7 +667,7 @@ return (entry->ae_set & AE_SET_RDEV); } -dev_t +__LA_DEV_T archive_entry_rdev(struct archive_entry *entry) { if (archive_entry_rdev_is_set(entry)) { @@ -681,7 +681,7 @@ } } -dev_t +__LA_DEV_T archive_entry_rdevmajor(struct archive_entry *entry) { if (archive_entry_rdev_is_set(entry)) { @@ -694,7 +694,7 @@ } } -dev_t +__LA_DEV_T archive_entry_rdevminor(struct archive_entry *entry) { if (archive_entry_rdev_is_set(entry)) { @@ -984,7 +984,9 @@ archive_entry_set_ino(struct archive_entry *entry, la_int64_t ino) { if (ino < 0) { - ino = 0; + entry->stat_valid = 0; + entry->ae_set &= ~AE_SET_INO; + return; } entry->stat_valid = 0; entry->ae_set |= AE_SET_INO; @@ -995,7 +997,9 @@ archive_entry_set_ino64(struct archive_entry *entry, la_int64_t ino) { if (ino < 0) { - ino = 0; + entry->stat_valid = 0; + entry->ae_set &= ~AE_SET_INO; + return; } entry->stat_valid = 0; entry->ae_set |= AE_SET_INO; @@ -1088,7 +1092,7 @@ } void -archive_entry_set_atime(struct archive_entry *entry, time_t t, long ns) +archive_entry_set_atime(struct archive_entry *entry, __LA_TIME_T t, long ns) { FIX_NS(t, ns); entry->stat_valid = 0; @@ -1105,7 +1109,7 @@ } void -archive_entry_set_birthtime(struct archive_entry *entry, time_t t, long ns) +archive_entry_set_birthtime(struct archive_entry *entry, __LA_TIME_T t, long ns) { FIX_NS(t, ns); entry->stat_valid = 0; @@ -1122,7 +1126,7 @@ } void -archive_entry_set_ctime(struct archive_entry *entry, time_t t, long ns) +archive_entry_set_ctime(struct archive_entry *entry, __LA_TIME_T t, long ns) { FIX_NS(t, ns); entry->stat_valid = 0; @@ -1139,7 +1143,7 @@ } void -archive_entry_set_dev(struct archive_entry *entry, dev_t d) +archive_entry_set_dev(struct archive_entry *entry, __LA_DEV_T d) { entry->stat_valid = 0; entry->ae_set |= AE_SET_DEV; @@ -1148,7 +1152,7 @@ } void -archive_entry_set_devmajor(struct archive_entry *entry, dev_t m) +archive_entry_set_devmajor(struct archive_entry *entry, __LA_DEV_T m) { entry->stat_valid = 0; entry->ae_set |= AE_SET_DEV; @@ -1157,7 +1161,7 @@ } void -archive_entry_set_devminor(struct archive_entry *entry, dev_t m) +archive_entry_set_devminor(struct archive_entry *entry, __LA_DEV_T m) { entry->stat_valid = 0; entry->ae_set |= AE_SET_DEV; @@ -1243,7 +1247,7 @@ } void -archive_entry_set_mtime(struct archive_entry *entry, time_t t, long ns) +archive_entry_set_mtime(struct archive_entry *entry, __LA_TIME_T t, long ns) { FIX_NS(t, ns); entry->stat_valid = 0; @@ -1319,7 +1323,7 @@ } void -archive_entry_set_rdev(struct archive_entry *entry, dev_t m) +archive_entry_set_rdev(struct archive_entry *entry, __LA_DEV_T m) { entry->stat_valid = 0; entry->ae_stat.aest_rdev = m; @@ -1330,7 +1334,7 @@ } void -archive_entry_set_rdevmajor(struct archive_entry *entry, dev_t m) +archive_entry_set_rdevmajor(struct archive_entry *entry, __LA_DEV_T m) { entry->stat_valid = 0; entry->ae_stat.aest_rdev_is_broken_down = 1; @@ -1340,7 +1344,7 @@ } void -archive_entry_set_rdevminor(struct archive_entry *entry, dev_t m) +archive_entry_set_rdevminor(struct archive_entry *entry, __LA_DEV_T m) { entry->stat_valid = 0; entry->ae_stat.aest_rdev_is_broken_down = 1; @@ -1603,21 +1607,27 @@ switch (type) { case ARCHIVE_ENTRY_DIGEST_MD5: copy_digest(entry, md5, digest); + entry->mset_digest |= AE_MSET_DIGEST_MD5; break; case ARCHIVE_ENTRY_DIGEST_RMD160: copy_digest(entry, rmd160, digest); + entry->mset_digest |= AE_MSET_DIGEST_RMD160; break; case ARCHIVE_ENTRY_DIGEST_SHA1: copy_digest(entry, sha1, digest); + entry->mset_digest |= AE_MSET_DIGEST_SHA1; break; case ARCHIVE_ENTRY_DIGEST_SHA256: copy_digest(entry, sha256, digest); + entry->mset_digest |= AE_MSET_DIGEST_SHA256; break; case ARCHIVE_ENTRY_DIGEST_SHA384: copy_digest(entry, sha384, digest); + entry->mset_digest |= AE_MSET_DIGEST_SHA384; break; case ARCHIVE_ENTRY_DIGEST_SHA512: copy_digest(entry, sha512, digest); + entry->mset_digest |= AE_MSET_DIGEST_SHA512; break; default: return ARCHIVE_WARN; --- contrib/libarchive/libarchive/archive_entry.h.orig +++ contrib/libarchive/libarchive/archive_entry.h @@ -28,7 +28,7 @@ #define ARCHIVE_ENTRY_H_INCLUDED /* Note: Compiler will complain if this does not match archive.h! */ -#define ARCHIVE_VERSION_NUMBER 3007007 +#define ARCHIVE_VERSION_NUMBER 3008001 /* * Note: archive_entry.h is for use outside of libarchive; the @@ -40,8 +40,11 @@ #include #include /* for wchar_t */ -#include +#include /* for C99 int64_t, etc. */ +#if ARCHIVE_VERSION_NUMBER < 4000000 +/* time_t is slated to be removed from public includes in 4.0 */ #include +#endif #if defined(_WIN32) && !defined(__CYGWIN__) #include @@ -55,12 +58,15 @@ #define __LA_INT64_T_DEFINED # if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) typedef __int64 la_int64_t; +typedef unsigned __int64 la_uint64_t; # else #include # if defined(_SCO_DS) || defined(__osf__) typedef long long la_int64_t; +typedef unsigned long long la_uint64_t; # else typedef int64_t la_int64_t; +typedef uint64_t la_uint64_t; # endif # endif #endif @@ -96,6 +102,30 @@ # define __LA_MODE_T mode_t #endif +#if ARCHIVE_VERSION_NUMBER < 4000000 +/* Use the platform types for time_t */ +#define __LA_TIME_T time_t +#else +/* Use 64-bits integer types for time_t */ +#define __LA_TIME_T la_int64_t +#endif + +#if ARCHIVE_VERSION_NUMBER < 4000000 +/* Use the platform types for dev_t */ +#define __LA_DEV_T dev_t +#else +/* Use 64-bits integer types for dev_t */ +#define __LA_DEV_T la_int64_t +#endif + +#if ARCHIVE_VERSION_NUMBER < 4000000 +/* Libarchive 3.x used signed int64 for inode numbers */ +#define __LA_INO_T la_int64_t +#else +/* Switch to unsigned for libarchive 4.0 */ +#define __LA_INO_T la_uint64_t +#endif + /* Large file support for Android */ #if defined(__LIBARCHIVE_BUILD) && defined(__ANDROID__) #include "android_lf.h" @@ -127,7 +157,8 @@ # define __LA_DECL #endif -#if defined(__GNUC__) && __GNUC__ >= 3 && __GNUC_MINOR__ >= 1 +#if defined(__GNUC__) && (__GNUC__ > 3 || \ + (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) # define __LA_DEPRECATED __attribute__((deprecated)) #else # define __LA_DEPRECATED @@ -235,19 +266,19 @@ * also return NULL when implicit character set conversions fail. * This is usually what you want. */ -__LA_DECL time_t archive_entry_atime(struct archive_entry *); +__LA_DECL __LA_TIME_T archive_entry_atime(struct archive_entry *); __LA_DECL long archive_entry_atime_nsec(struct archive_entry *); __LA_DECL int archive_entry_atime_is_set(struct archive_entry *); -__LA_DECL time_t archive_entry_birthtime(struct archive_entry *); +__LA_DECL __LA_TIME_T archive_entry_birthtime(struct archive_entry *); __LA_DECL long archive_entry_birthtime_nsec(struct archive_entry *); __LA_DECL int archive_entry_birthtime_is_set(struct archive_entry *); -__LA_DECL time_t archive_entry_ctime(struct archive_entry *); +__LA_DECL __LA_TIME_T archive_entry_ctime(struct archive_entry *); __LA_DECL long archive_entry_ctime_nsec(struct archive_entry *); __LA_DECL int archive_entry_ctime_is_set(struct archive_entry *); -__LA_DECL dev_t archive_entry_dev(struct archive_entry *); +__LA_DECL __LA_DEV_T archive_entry_dev(struct archive_entry *); __LA_DECL int archive_entry_dev_is_set(struct archive_entry *); -__LA_DECL dev_t archive_entry_devmajor(struct archive_entry *); -__LA_DECL dev_t archive_entry_devminor(struct archive_entry *); +__LA_DECL __LA_DEV_T archive_entry_devmajor(struct archive_entry *); +__LA_DECL __LA_DEV_T archive_entry_devminor(struct archive_entry *); __LA_DECL __LA_MODE_T archive_entry_filetype(struct archive_entry *); __LA_DECL int archive_entry_filetype_is_set(struct archive_entry *); __LA_DECL void archive_entry_fflags(struct archive_entry *, @@ -264,8 +295,8 @@ __LA_DECL const char *archive_entry_hardlink_utf8(struct archive_entry *); __LA_DECL const wchar_t *archive_entry_hardlink_w(struct archive_entry *); __LA_DECL int archive_entry_hardlink_is_set(struct archive_entry *); -__LA_DECL la_int64_t archive_entry_ino(struct archive_entry *); -__LA_DECL la_int64_t archive_entry_ino64(struct archive_entry *); +__LA_DECL __LA_INO_T archive_entry_ino(struct archive_entry *); +__LA_DECL __LA_INO_T archive_entry_ino64(struct archive_entry *); __LA_DECL int archive_entry_ino_is_set(struct archive_entry *); __LA_DECL __LA_MODE_T archive_entry_mode(struct archive_entry *); __LA_DECL time_t archive_entry_mtime(struct archive_entry *); @@ -278,9 +309,9 @@ __LA_DECL __LA_MODE_T archive_entry_perm(struct archive_entry *); __LA_DECL int archive_entry_perm_is_set(struct archive_entry *); __LA_DECL int archive_entry_rdev_is_set(struct archive_entry *); -__LA_DECL dev_t archive_entry_rdev(struct archive_entry *); -__LA_DECL dev_t archive_entry_rdevmajor(struct archive_entry *); -__LA_DECL dev_t archive_entry_rdevminor(struct archive_entry *); +__LA_DECL __LA_DEV_T archive_entry_rdev(struct archive_entry *); +__LA_DECL __LA_DEV_T archive_entry_rdevmajor(struct archive_entry *); +__LA_DECL __LA_DEV_T archive_entry_rdevminor(struct archive_entry *); __LA_DECL const char *archive_entry_sourcepath(struct archive_entry *); __LA_DECL const wchar_t *archive_entry_sourcepath_w(struct archive_entry *); __LA_DECL la_int64_t archive_entry_size(struct archive_entry *); @@ -309,18 +340,18 @@ * always copied. */ -__LA_DECL void archive_entry_set_atime(struct archive_entry *, time_t, long); +__LA_DECL void archive_entry_set_atime(struct archive_entry *, __LA_TIME_T, long); __LA_DECL void archive_entry_unset_atime(struct archive_entry *); #if defined(_WIN32) && !defined(__CYGWIN__) __LA_DECL void archive_entry_copy_bhfi(struct archive_entry *, BY_HANDLE_FILE_INFORMATION *); #endif -__LA_DECL void archive_entry_set_birthtime(struct archive_entry *, time_t, long); +__LA_DECL void archive_entry_set_birthtime(struct archive_entry *, __LA_TIME_T, long); __LA_DECL void archive_entry_unset_birthtime(struct archive_entry *); -__LA_DECL void archive_entry_set_ctime(struct archive_entry *, time_t, long); +__LA_DECL void archive_entry_set_ctime(struct archive_entry *, __LA_TIME_T, long); __LA_DECL void archive_entry_unset_ctime(struct archive_entry *); -__LA_DECL void archive_entry_set_dev(struct archive_entry *, dev_t); -__LA_DECL void archive_entry_set_devmajor(struct archive_entry *, dev_t); -__LA_DECL void archive_entry_set_devminor(struct archive_entry *, dev_t); +__LA_DECL void archive_entry_set_dev(struct archive_entry *, __LA_DEV_T); +__LA_DECL void archive_entry_set_devmajor(struct archive_entry *, __LA_DEV_T); +__LA_DECL void archive_entry_set_devminor(struct archive_entry *, __LA_DEV_T); __LA_DECL void archive_entry_set_filetype(struct archive_entry *, unsigned int); __LA_DECL void archive_entry_set_fflags(struct archive_entry *, unsigned long /* set */, unsigned long /* clear */); @@ -343,15 +374,15 @@ __LA_DECL void archive_entry_copy_hardlink(struct archive_entry *, const char *); __LA_DECL void archive_entry_copy_hardlink_w(struct archive_entry *, const wchar_t *); __LA_DECL int archive_entry_update_hardlink_utf8(struct archive_entry *, const char *); -__LA_DECL void archive_entry_set_ino(struct archive_entry *, la_int64_t); -__LA_DECL void archive_entry_set_ino64(struct archive_entry *, la_int64_t); +__LA_DECL void archive_entry_set_ino(struct archive_entry *, __LA_INO_T); +__LA_DECL void archive_entry_set_ino64(struct archive_entry *, __LA_INO_T); __LA_DECL void archive_entry_set_link(struct archive_entry *, const char *); __LA_DECL void archive_entry_set_link_utf8(struct archive_entry *, const char *); __LA_DECL void archive_entry_copy_link(struct archive_entry *, const char *); __LA_DECL void archive_entry_copy_link_w(struct archive_entry *, const wchar_t *); __LA_DECL int archive_entry_update_link_utf8(struct archive_entry *, const char *); __LA_DECL void archive_entry_set_mode(struct archive_entry *, __LA_MODE_T); -__LA_DECL void archive_entry_set_mtime(struct archive_entry *, time_t, long); +__LA_DECL void archive_entry_set_mtime(struct archive_entry *, __LA_TIME_T, long); __LA_DECL void archive_entry_unset_mtime(struct archive_entry *); __LA_DECL void archive_entry_set_nlink(struct archive_entry *, unsigned int); __LA_DECL void archive_entry_set_pathname(struct archive_entry *, const char *); @@ -360,9 +391,9 @@ __LA_DECL void archive_entry_copy_pathname_w(struct archive_entry *, const wchar_t *); __LA_DECL int archive_entry_update_pathname_utf8(struct archive_entry *, const char *); __LA_DECL void archive_entry_set_perm(struct archive_entry *, __LA_MODE_T); -__LA_DECL void archive_entry_set_rdev(struct archive_entry *, dev_t); -__LA_DECL void archive_entry_set_rdevmajor(struct archive_entry *, dev_t); -__LA_DECL void archive_entry_set_rdevminor(struct archive_entry *, dev_t); +__LA_DECL void archive_entry_set_rdev(struct archive_entry *, __LA_DEV_T); +__LA_DECL void archive_entry_set_rdevmajor(struct archive_entry *, __LA_DEV_T); +__LA_DECL void archive_entry_set_rdevminor(struct archive_entry *, __LA_DEV_T); __LA_DECL void archive_entry_set_size(struct archive_entry *, la_int64_t); __LA_DECL void archive_entry_unset_size(struct archive_entry *); __LA_DECL void archive_entry_copy_sourcepath(struct archive_entry *, const char *); @@ -418,6 +449,7 @@ #define ARCHIVE_ENTRY_DIGEST_SHA512 0x00000006 __LA_DECL const unsigned char * archive_entry_digest(struct archive_entry *, int /* type */); +__LA_DECL int archive_entry_set_digest(struct archive_entry *, int, const unsigned char *); /* * ACL routines. This used to simply store and return text-format ACL --- contrib/libarchive/libarchive/archive_entry_link_resolver.c.orig +++ contrib/libarchive/libarchive/archive_entry_link_resolver.c @@ -280,6 +280,10 @@ dev_t dev; int64_t ino; + if (!archive_entry_ino_is_set(entry) || !archive_entry_dev_is_set(entry)) { + return (NULL); + } + /* Free a held entry. */ if (res->spare != NULL) { archive_entry_free(res->spare->canonical); @@ -369,6 +373,10 @@ struct links_entry *le; size_t hash, bucket; + if (!archive_entry_ino_is_set(entry) || !archive_entry_dev_is_set(entry)) { + return (NULL); + } + /* Add this entry to the links cache. */ le = calloc(1, sizeof(struct links_entry)); if (le == NULL) --- contrib/libarchive/libarchive/archive_entry_locale.h.orig +++ contrib/libarchive/libarchive/archive_entry_locale.h @@ -87,4 +87,4 @@ int _archive_entry_copy_uname_l(struct archive_entry *, const char *, size_t, struct archive_string_conv *); -#endif /* ARCHIVE_ENTRY_LOCALE_H_INCLUDED */ +#endif /* !ARCHIVE_ENTRY_LOCALE_H_INCLUDED */ --- contrib/libarchive/libarchive/archive_entry_private.h.orig +++ contrib/libarchive/libarchive/archive_entry_private.h @@ -174,6 +174,13 @@ size_t mac_metadata_size; /* Digest support. */ +#define AE_MSET_DIGEST_MD5 1 +#define AE_MSET_DIGEST_RMD160 2 +#define AE_MSET_DIGEST_SHA1 4 +#define AE_MSET_DIGEST_SHA256 8 +#define AE_MSET_DIGEST_SHA384 16 +#define AE_MSET_DIGEST_SHA512 32 + uint_least32_t mset_digest; struct ae_digest digest; /* ACL support. */ @@ -195,8 +202,4 @@ int ae_symlink_type; }; -int -archive_entry_set_digest(struct archive_entry *entry, int type, - const unsigned char *digest); - -#endif /* ARCHIVE_ENTRY_PRIVATE_H_INCLUDED */ +#endif /* !ARCHIVE_ENTRY_PRIVATE_H_INCLUDED */ --- contrib/libarchive/libarchive/archive_getdate.c.orig +++ contrib/libarchive/libarchive/archive_getdate.c @@ -1,1100 +0,0 @@ -/* - * This code is in the public domain and has no copyright. - * - * This is a plain C recursive-descent translation of an old - * public-domain YACC grammar that has been used for parsing dates in - * very many open-source projects. - * - * Since the original authors were generous enough to donate their - * work to the public domain, I feel compelled to match their - * generosity. - * - * Tim Kientzle, February 2009. - */ - -/* - * Header comment from original getdate.y: - */ - -/* -** Originally written by Steven M. Bellovin while -** at the University of North Carolina at Chapel Hill. Later tweaked by -** a couple of people on Usenet. Completely overhauled by Rich $alz -** and Jim Berets in August, 1990; -** -** This grammar has 10 shift/reduce conflicts. -** -** This code is in the public domain and has no copyright. -*/ - -#include "archive_platform.h" - -#include -#include -#include -#include -#include - -#define __LIBARCHIVE_BUILD 1 -#include "archive_getdate.h" - -/* Basic time units. */ -#define EPOCH 1970 -#define MINUTE (60L) -#define HOUR (60L * MINUTE) -#define DAY (24L * HOUR) - -/* Daylight-savings mode: on, off, or not yet known. */ -enum DSTMODE { DSTon, DSToff, DSTmaybe }; -/* Meridian: am or pm. */ -enum { tAM, tPM }; -/* Token types returned by nexttoken() */ -enum { tAGO = 260, tDAY, tDAYZONE, tAMPM, tMONTH, tMONTH_UNIT, tSEC_UNIT, - tUNUMBER, tZONE, tDST }; -struct token { int token; time_t value; }; - -/* - * Parser state. - */ -struct gdstate { - struct token *tokenp; /* Pointer to next token. */ - /* HaveXxxx counts how many of this kind of phrase we've seen; - * it's a fatal error to have more than one time, zone, day, - * or date phrase. */ - int HaveYear; - int HaveMonth; - int HaveDay; - int HaveWeekDay; /* Day of week */ - int HaveTime; /* Hour/minute/second */ - int HaveZone; /* timezone and/or DST info */ - int HaveRel; /* time offset; we can have more than one */ - /* Absolute time values. */ - time_t Timezone; /* Seconds offset from GMT */ - time_t Day; - time_t Hour; - time_t Minutes; - time_t Month; - time_t Seconds; - time_t Year; - /* DST selection */ - enum DSTMODE DSTmode; - /* Day of week accounting, e.g., "3rd Tuesday" */ - time_t DayOrdinal; /* "3" in "3rd Tuesday" */ - time_t DayNumber; /* "Tuesday" in "3rd Tuesday" */ - /* Relative time values: hour/day/week offsets are measured in - * seconds, month/year are counted in months. */ - time_t RelMonth; - time_t RelSeconds; -}; - -/* - * A series of functions that recognize certain common time phrases. - * Each function returns 1 if it managed to make sense of some of the - * tokens, zero otherwise. - */ - -/* - * hour:minute or hour:minute:second with optional AM, PM, or numeric - * timezone offset - */ -static int -timephrase(struct gdstate *gds) -{ - if (gds->tokenp[0].token == tUNUMBER - && gds->tokenp[1].token == ':' - && gds->tokenp[2].token == tUNUMBER - && gds->tokenp[3].token == ':' - && gds->tokenp[4].token == tUNUMBER) { - /* "12:14:18" or "22:08:07" */ - ++gds->HaveTime; - gds->Hour = gds->tokenp[0].value; - gds->Minutes = gds->tokenp[2].value; - gds->Seconds = gds->tokenp[4].value; - gds->tokenp += 5; - } - else if (gds->tokenp[0].token == tUNUMBER - && gds->tokenp[1].token == ':' - && gds->tokenp[2].token == tUNUMBER) { - /* "12:14" or "22:08" */ - ++gds->HaveTime; - gds->Hour = gds->tokenp[0].value; - gds->Minutes = gds->tokenp[2].value; - gds->Seconds = 0; - gds->tokenp += 3; - } - else if (gds->tokenp[0].token == tUNUMBER - && gds->tokenp[1].token == tAMPM) { - /* "7" is a time if it's followed by "am" or "pm" */ - ++gds->HaveTime; - gds->Hour = gds->tokenp[0].value; - gds->Minutes = gds->Seconds = 0; - /* We'll handle the AM/PM below. */ - gds->tokenp += 1; - } else { - /* We can't handle this. */ - return 0; - } - - if (gds->tokenp[0].token == tAMPM) { - /* "7:12pm", "12:20:13am" */ - if (gds->Hour == 12) - gds->Hour = 0; - if (gds->tokenp[0].value == tPM) - gds->Hour += 12; - gds->tokenp += 1; - } - if (gds->tokenp[0].token == '+' - && gds->tokenp[1].token == tUNUMBER) { - /* "7:14+0700" */ - gds->HaveZone++; - gds->DSTmode = DSToff; - gds->Timezone = - ((gds->tokenp[1].value / 100) * HOUR - + (gds->tokenp[1].value % 100) * MINUTE); - gds->tokenp += 2; - } - if (gds->tokenp[0].token == '-' - && gds->tokenp[1].token == tUNUMBER) { - /* "19:14:12-0530" */ - gds->HaveZone++; - gds->DSTmode = DSToff; - gds->Timezone = + ((gds->tokenp[1].value / 100) * HOUR - + (gds->tokenp[1].value % 100) * MINUTE); - gds->tokenp += 2; - } - return 1; -} - -/* - * Timezone name, possibly including DST. - */ -static int -zonephrase(struct gdstate *gds) -{ - if (gds->tokenp[0].token == tZONE - && gds->tokenp[1].token == tDST) { - gds->HaveZone++; - gds->Timezone = gds->tokenp[0].value; - gds->DSTmode = DSTon; - gds->tokenp += 1; - return 1; - } - - if (gds->tokenp[0].token == tZONE) { - gds->HaveZone++; - gds->Timezone = gds->tokenp[0].value; - gds->DSTmode = DSToff; - gds->tokenp += 1; - return 1; - } - - if (gds->tokenp[0].token == tDAYZONE) { - gds->HaveZone++; - gds->Timezone = gds->tokenp[0].value; - gds->DSTmode = DSTon; - gds->tokenp += 1; - return 1; - } - return 0; -} - -/* - * Year/month/day in various combinations. - */ -static int -datephrase(struct gdstate *gds) -{ - if (gds->tokenp[0].token == tUNUMBER - && gds->tokenp[1].token == '/' - && gds->tokenp[2].token == tUNUMBER - && gds->tokenp[3].token == '/' - && gds->tokenp[4].token == tUNUMBER) { - gds->HaveYear++; - gds->HaveMonth++; - gds->HaveDay++; - if (gds->tokenp[0].value >= 13) { - /* First number is big: 2004/01/29, 99/02/17 */ - gds->Year = gds->tokenp[0].value; - gds->Month = gds->tokenp[2].value; - gds->Day = gds->tokenp[4].value; - } else if ((gds->tokenp[4].value >= 13) - || (gds->tokenp[2].value >= 13)) { - /* Last number is big: 01/07/98 */ - /* Middle number is big: 01/29/04 */ - gds->Month = gds->tokenp[0].value; - gds->Day = gds->tokenp[2].value; - gds->Year = gds->tokenp[4].value; - } else { - /* No significant clues: 02/03/04 */ - gds->Month = gds->tokenp[0].value; - gds->Day = gds->tokenp[2].value; - gds->Year = gds->tokenp[4].value; - } - gds->tokenp += 5; - return 1; - } - - if (gds->tokenp[0].token == tUNUMBER - && gds->tokenp[1].token == '/' - && gds->tokenp[2].token == tUNUMBER) { - /* "1/15" */ - gds->HaveMonth++; - gds->HaveDay++; - gds->Month = gds->tokenp[0].value; - gds->Day = gds->tokenp[2].value; - gds->tokenp += 3; - return 1; - } - - if (gds->tokenp[0].token == tUNUMBER - && gds->tokenp[1].token == '-' - && gds->tokenp[2].token == tUNUMBER - && gds->tokenp[3].token == '-' - && gds->tokenp[4].token == tUNUMBER) { - /* ISO 8601 format. yyyy-mm-dd. */ - gds->HaveYear++; - gds->HaveMonth++; - gds->HaveDay++; - gds->Year = gds->tokenp[0].value; - gds->Month = gds->tokenp[2].value; - gds->Day = gds->tokenp[4].value; - gds->tokenp += 5; - return 1; - } - - if (gds->tokenp[0].token == tUNUMBER - && gds->tokenp[1].token == '-' - && gds->tokenp[2].token == tMONTH - && gds->tokenp[3].token == '-' - && gds->tokenp[4].token == tUNUMBER) { - gds->HaveYear++; - gds->HaveMonth++; - gds->HaveDay++; - if (gds->tokenp[0].value > 31) { - /* e.g. 1992-Jun-17 */ - gds->Year = gds->tokenp[0].value; - gds->Month = gds->tokenp[2].value; - gds->Day = gds->tokenp[4].value; - } else { - /* e.g. 17-JUN-1992. */ - gds->Day = gds->tokenp[0].value; - gds->Month = gds->tokenp[2].value; - gds->Year = gds->tokenp[4].value; - } - gds->tokenp += 5; - return 1; - } - - if (gds->tokenp[0].token == tMONTH - && gds->tokenp[1].token == tUNUMBER - && gds->tokenp[2].token == ',' - && gds->tokenp[3].token == tUNUMBER) { - /* "June 17, 2001" */ - gds->HaveYear++; - gds->HaveMonth++; - gds->HaveDay++; - gds->Month = gds->tokenp[0].value; - gds->Day = gds->tokenp[1].value; - gds->Year = gds->tokenp[3].value; - gds->tokenp += 4; - return 1; - } - - if (gds->tokenp[0].token == tMONTH - && gds->tokenp[1].token == tUNUMBER) { - /* "May 3" */ - gds->HaveMonth++; - gds->HaveDay++; - gds->Month = gds->tokenp[0].value; - gds->Day = gds->tokenp[1].value; - gds->tokenp += 2; - return 1; - } - - if (gds->tokenp[0].token == tUNUMBER - && gds->tokenp[1].token == tMONTH - && gds->tokenp[2].token == tUNUMBER) { - /* "12 Sept 1997" */ - gds->HaveYear++; - gds->HaveMonth++; - gds->HaveDay++; - gds->Day = gds->tokenp[0].value; - gds->Month = gds->tokenp[1].value; - gds->Year = gds->tokenp[2].value; - gds->tokenp += 3; - return 1; - } - - if (gds->tokenp[0].token == tUNUMBER - && gds->tokenp[1].token == tMONTH) { - /* "12 Sept" */ - gds->HaveMonth++; - gds->HaveDay++; - gds->Day = gds->tokenp[0].value; - gds->Month = gds->tokenp[1].value; - gds->tokenp += 2; - return 1; - } - - return 0; -} - -/* - * Relative time phrase: "tomorrow", "yesterday", "+1 hour", etc. - */ -static int -relunitphrase(struct gdstate *gds) -{ - if (gds->tokenp[0].token == '-' - && gds->tokenp[1].token == tUNUMBER - && gds->tokenp[2].token == tSEC_UNIT) { - /* "-3 hours" */ - gds->HaveRel++; - gds->RelSeconds -= gds->tokenp[1].value * gds->tokenp[2].value; - gds->tokenp += 3; - return 1; - } - if (gds->tokenp[0].token == '+' - && gds->tokenp[1].token == tUNUMBER - && gds->tokenp[2].token == tSEC_UNIT) { - /* "+1 minute" */ - gds->HaveRel++; - gds->RelSeconds += gds->tokenp[1].value * gds->tokenp[2].value; - gds->tokenp += 3; - return 1; - } - if (gds->tokenp[0].token == tUNUMBER - && gds->tokenp[1].token == tSEC_UNIT) { - /* "1 day" */ - gds->HaveRel++; - gds->RelSeconds += gds->tokenp[0].value * gds->tokenp[1].value; - gds->tokenp += 2; - return 1; - } - if (gds->tokenp[0].token == '-' - && gds->tokenp[1].token == tUNUMBER - && gds->tokenp[2].token == tMONTH_UNIT) { - /* "-3 months" */ - gds->HaveRel++; - gds->RelMonth -= gds->tokenp[1].value * gds->tokenp[2].value; - gds->tokenp += 3; - return 1; - } - if (gds->tokenp[0].token == '+' - && gds->tokenp[1].token == tUNUMBER - && gds->tokenp[2].token == tMONTH_UNIT) { - /* "+5 years" */ - gds->HaveRel++; - gds->RelMonth += gds->tokenp[1].value * gds->tokenp[2].value; - gds->tokenp += 3; - return 1; - } - if (gds->tokenp[0].token == tUNUMBER - && gds->tokenp[1].token == tMONTH_UNIT) { - /* "2 years" */ - gds->HaveRel++; - gds->RelMonth += gds->tokenp[0].value * gds->tokenp[1].value; - gds->tokenp += 2; - return 1; - } - if (gds->tokenp[0].token == tSEC_UNIT) { - /* "now", "tomorrow" */ - gds->HaveRel++; - gds->RelSeconds += gds->tokenp[0].value; - gds->tokenp += 1; - return 1; - } - if (gds->tokenp[0].token == tMONTH_UNIT) { - /* "month" */ - gds->HaveRel++; - gds->RelMonth += gds->tokenp[0].value; - gds->tokenp += 1; - return 1; - } - return 0; -} - -/* - * Day of the week specification. - */ -static int -dayphrase(struct gdstate *gds) -{ - if (gds->tokenp[0].token == tDAY) { - /* "tues", "wednesday," */ - gds->HaveWeekDay++; - gds->DayOrdinal = 1; - gds->DayNumber = gds->tokenp[0].value; - gds->tokenp += 1; - if (gds->tokenp[0].token == ',') - gds->tokenp += 1; - return 1; - } - if (gds->tokenp[0].token == tUNUMBER - && gds->tokenp[1].token == tDAY) { - /* "second tues" "3 wed" */ - gds->HaveWeekDay++; - gds->DayOrdinal = gds->tokenp[0].value; - gds->DayNumber = gds->tokenp[1].value; - gds->tokenp += 2; - return 1; - } - return 0; -} - -/* - * Try to match a phrase using one of the above functions. - * This layer also deals with a couple of generic issues. - */ -static int -phrase(struct gdstate *gds) -{ - if (timephrase(gds)) - return 1; - if (zonephrase(gds)) - return 1; - if (datephrase(gds)) - return 1; - if (dayphrase(gds)) - return 1; - if (relunitphrase(gds)) { - if (gds->tokenp[0].token == tAGO) { - gds->RelSeconds = -gds->RelSeconds; - gds->RelMonth = -gds->RelMonth; - gds->tokenp += 1; - } - return 1; - } - - /* Bare numbers sometimes have meaning. */ - if (gds->tokenp[0].token == tUNUMBER) { - if (gds->HaveTime && !gds->HaveYear && !gds->HaveRel) { - gds->HaveYear++; - gds->Year = gds->tokenp[0].value; - gds->tokenp += 1; - return 1; - } - - if(gds->tokenp[0].value > 10000) { - /* "20040301" */ - gds->HaveYear++; - gds->HaveMonth++; - gds->HaveDay++; - gds->Day= (gds->tokenp[0].value)%100; - gds->Month= (gds->tokenp[0].value/100)%100; - gds->Year = gds->tokenp[0].value/10000; - gds->tokenp += 1; - return 1; - } - - if (gds->tokenp[0].value < 24) { - gds->HaveTime++; - gds->Hour = gds->tokenp[0].value; - gds->Minutes = 0; - gds->Seconds = 0; - gds->tokenp += 1; - return 1; - } - - if ((gds->tokenp[0].value / 100 < 24) - && (gds->tokenp[0].value % 100 < 60)) { - /* "513" is same as "5:13" */ - gds->Hour = gds->tokenp[0].value / 100; - gds->Minutes = gds->tokenp[0].value % 100; - gds->Seconds = 0; - gds->tokenp += 1; - return 1; - } - } - - return 0; -} - -/* - * A dictionary of time words. - */ -static struct LEXICON { - size_t abbrev; - const char *name; - int type; - time_t value; -} const TimeWords[] = { - /* am/pm */ - { 0, "am", tAMPM, tAM }, - { 0, "pm", tAMPM, tPM }, - - /* Month names. */ - { 3, "january", tMONTH, 1 }, - { 3, "february", tMONTH, 2 }, - { 3, "march", tMONTH, 3 }, - { 3, "april", tMONTH, 4 }, - { 3, "may", tMONTH, 5 }, - { 3, "june", tMONTH, 6 }, - { 3, "july", tMONTH, 7 }, - { 3, "august", tMONTH, 8 }, - { 3, "september", tMONTH, 9 }, - { 3, "october", tMONTH, 10 }, - { 3, "november", tMONTH, 11 }, - { 3, "december", tMONTH, 12 }, - - /* Days of the week. */ - { 2, "sunday", tDAY, 0 }, - { 3, "monday", tDAY, 1 }, - { 2, "tuesday", tDAY, 2 }, - { 3, "wednesday", tDAY, 3 }, - { 2, "thursday", tDAY, 4 }, - { 2, "friday", tDAY, 5 }, - { 2, "saturday", tDAY, 6 }, - - /* Timezones: Offsets are in seconds. */ - { 0, "gmt", tZONE, 0*HOUR }, /* Greenwich Mean */ - { 0, "ut", tZONE, 0*HOUR }, /* Universal (Coordinated) */ - { 0, "utc", tZONE, 0*HOUR }, - { 0, "wet", tZONE, 0*HOUR }, /* Western European */ - { 0, "bst", tDAYZONE, 0*HOUR }, /* British Summer */ - { 0, "wat", tZONE, 1*HOUR }, /* West Africa */ - { 0, "at", tZONE, 2*HOUR }, /* Azores */ - /* { 0, "bst", tZONE, 3*HOUR }, */ /* Brazil Standard: Conflict */ - /* { 0, "gst", tZONE, 3*HOUR }, */ /* Greenland Standard: Conflict*/ - { 0, "nft", tZONE, 3*HOUR+30*MINUTE }, /* Newfoundland */ - { 0, "nst", tZONE, 3*HOUR+30*MINUTE }, /* Newfoundland Standard */ - { 0, "ndt", tDAYZONE, 3*HOUR+30*MINUTE }, /* Newfoundland Daylight */ - { 0, "ast", tZONE, 4*HOUR }, /* Atlantic Standard */ - { 0, "adt", tDAYZONE, 4*HOUR }, /* Atlantic Daylight */ - { 0, "est", tZONE, 5*HOUR }, /* Eastern Standard */ - { 0, "edt", tDAYZONE, 5*HOUR }, /* Eastern Daylight */ - { 0, "cst", tZONE, 6*HOUR }, /* Central Standard */ - { 0, "cdt", tDAYZONE, 6*HOUR }, /* Central Daylight */ - { 0, "mst", tZONE, 7*HOUR }, /* Mountain Standard */ - { 0, "mdt", tDAYZONE, 7*HOUR }, /* Mountain Daylight */ - { 0, "pst", tZONE, 8*HOUR }, /* Pacific Standard */ - { 0, "pdt", tDAYZONE, 8*HOUR }, /* Pacific Daylight */ - { 0, "yst", tZONE, 9*HOUR }, /* Yukon Standard */ - { 0, "ydt", tDAYZONE, 9*HOUR }, /* Yukon Daylight */ - { 0, "hst", tZONE, 10*HOUR }, /* Hawaii Standard */ - { 0, "hdt", tDAYZONE, 10*HOUR }, /* Hawaii Daylight */ - { 0, "cat", tZONE, 10*HOUR }, /* Central Alaska */ - { 0, "ahst", tZONE, 10*HOUR }, /* Alaska-Hawaii Standard */ - { 0, "nt", tZONE, 11*HOUR }, /* Nome */ - { 0, "idlw", tZONE, 12*HOUR }, /* Intl Date Line West */ - { 0, "cet", tZONE, -1*HOUR }, /* Central European */ - { 0, "met", tZONE, -1*HOUR }, /* Middle European */ - { 0, "mewt", tZONE, -1*HOUR }, /* Middle European Winter */ - { 0, "mest", tDAYZONE, -1*HOUR }, /* Middle European Summer */ - { 0, "swt", tZONE, -1*HOUR }, /* Swedish Winter */ - { 0, "sst", tDAYZONE, -1*HOUR }, /* Swedish Summer */ - { 0, "fwt", tZONE, -1*HOUR }, /* French Winter */ - { 0, "fst", tDAYZONE, -1*HOUR }, /* French Summer */ - { 0, "eet", tZONE, -2*HOUR }, /* Eastern Eur, USSR Zone 1 */ - { 0, "bt", tZONE, -3*HOUR }, /* Baghdad, USSR Zone 2 */ - { 0, "it", tZONE, -3*HOUR-30*MINUTE },/* Iran */ - { 0, "zp4", tZONE, -4*HOUR }, /* USSR Zone 3 */ - { 0, "zp5", tZONE, -5*HOUR }, /* USSR Zone 4 */ - { 0, "ist", tZONE, -5*HOUR-30*MINUTE },/* Indian Standard */ - { 0, "zp6", tZONE, -6*HOUR }, /* USSR Zone 5 */ - /* { 0, "nst", tZONE, -6.5*HOUR }, */ /* North Sumatra: Conflict */ - /* { 0, "sst", tZONE, -7*HOUR }, */ /* So Sumatra, USSR 6: Conflict */ - { 0, "wast", tZONE, -7*HOUR }, /* West Australian Standard */ - { 0, "wadt", tDAYZONE, -7*HOUR }, /* West Australian Daylight */ - { 0, "jt", tZONE, -7*HOUR-30*MINUTE },/* Java (3pm in Cronusland!)*/ - { 0, "cct", tZONE, -8*HOUR }, /* China Coast, USSR Zone 7 */ - { 0, "jst", tZONE, -9*HOUR }, /* Japan Std, USSR Zone 8 */ - { 0, "cast", tZONE, -9*HOUR-30*MINUTE },/* Ctrl Australian Std */ - { 0, "cadt", tDAYZONE, -9*HOUR-30*MINUTE },/* Ctrl Australian Daylt */ - { 0, "east", tZONE, -10*HOUR }, /* Eastern Australian Std */ - { 0, "eadt", tDAYZONE, -10*HOUR }, /* Eastern Australian Daylt */ - { 0, "gst", tZONE, -10*HOUR }, /* Guam Std, USSR Zone 9 */ - { 0, "nzt", tZONE, -12*HOUR }, /* New Zealand */ - { 0, "nzst", tZONE, -12*HOUR }, /* New Zealand Standard */ - { 0, "nzdt", tDAYZONE, -12*HOUR }, /* New Zealand Daylight */ - { 0, "idle", tZONE, -12*HOUR }, /* Intl Date Line East */ - - { 0, "dst", tDST, 0 }, - - /* Time units. */ - { 4, "years", tMONTH_UNIT, 12 }, - { 5, "months", tMONTH_UNIT, 1 }, - { 9, "fortnights", tSEC_UNIT, 14 * DAY }, - { 4, "weeks", tSEC_UNIT, 7 * DAY }, - { 3, "days", tSEC_UNIT, DAY }, - { 4, "hours", tSEC_UNIT, HOUR }, - { 3, "minutes", tSEC_UNIT, MINUTE }, - { 3, "seconds", tSEC_UNIT, 1 }, - - /* Relative-time words. */ - { 0, "tomorrow", tSEC_UNIT, DAY }, - { 0, "yesterday", tSEC_UNIT, -DAY }, - { 0, "today", tSEC_UNIT, 0 }, - { 0, "now", tSEC_UNIT, 0 }, - { 0, "last", tUNUMBER, -1 }, - { 0, "this", tSEC_UNIT, 0 }, - { 0, "next", tUNUMBER, 2 }, - { 0, "first", tUNUMBER, 1 }, - { 0, "1st", tUNUMBER, 1 }, -/* { 0, "second", tUNUMBER, 2 }, */ - { 0, "2nd", tUNUMBER, 2 }, - { 0, "third", tUNUMBER, 3 }, - { 0, "3rd", tUNUMBER, 3 }, - { 0, "fourth", tUNUMBER, 4 }, - { 0, "4th", tUNUMBER, 4 }, - { 0, "fifth", tUNUMBER, 5 }, - { 0, "5th", tUNUMBER, 5 }, - { 0, "sixth", tUNUMBER, 6 }, - { 0, "seventh", tUNUMBER, 7 }, - { 0, "eighth", tUNUMBER, 8 }, - { 0, "ninth", tUNUMBER, 9 }, - { 0, "tenth", tUNUMBER, 10 }, - { 0, "eleventh", tUNUMBER, 11 }, - { 0, "twelfth", tUNUMBER, 12 }, - { 0, "ago", tAGO, 1 }, - - /* Military timezones. */ - { 0, "a", tZONE, 1*HOUR }, - { 0, "b", tZONE, 2*HOUR }, - { 0, "c", tZONE, 3*HOUR }, - { 0, "d", tZONE, 4*HOUR }, - { 0, "e", tZONE, 5*HOUR }, - { 0, "f", tZONE, 6*HOUR }, - { 0, "g", tZONE, 7*HOUR }, - { 0, "h", tZONE, 8*HOUR }, - { 0, "i", tZONE, 9*HOUR }, - { 0, "k", tZONE, 10*HOUR }, - { 0, "l", tZONE, 11*HOUR }, - { 0, "m", tZONE, 12*HOUR }, - { 0, "n", tZONE, -1*HOUR }, - { 0, "o", tZONE, -2*HOUR }, - { 0, "p", tZONE, -3*HOUR }, - { 0, "q", tZONE, -4*HOUR }, - { 0, "r", tZONE, -5*HOUR }, - { 0, "s", tZONE, -6*HOUR }, - { 0, "t", tZONE, -7*HOUR }, - { 0, "u", tZONE, -8*HOUR }, - { 0, "v", tZONE, -9*HOUR }, - { 0, "w", tZONE, -10*HOUR }, - { 0, "x", tZONE, -11*HOUR }, - { 0, "y", tZONE, -12*HOUR }, - { 0, "z", tZONE, 0*HOUR }, - - /* End of table. */ - { 0, NULL, 0, 0 } -}; - -/* - * Year is either: - * = A number from 0 to 99, which means a year from 1970 to 2069, or - * = The actual year (>=100). - */ -static time_t -Convert(time_t Month, time_t Day, time_t Year, - time_t Hours, time_t Minutes, time_t Seconds, - time_t Timezone, enum DSTMODE DSTmode) -{ - signed char DaysInMonth[12] = { - 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 - }; - time_t Julian; - int i; - struct tm *ltime; -#if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S) - struct tm tmbuf; -#endif - - if (Year < 69) - Year += 2000; - else if (Year < 100) - Year += 1900; - DaysInMonth[1] = Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0) - ? 29 : 28; - /* Checking for 2038 bogusly assumes that time_t is 32 bits. But - I'm too lazy to try to check for time_t overflow in another way. */ - if (Year < EPOCH || Year >= 2038 - || Month < 1 || Month > 12 - /* Lint fluff: "conversion from long may lose accuracy" */ - || Day < 1 || Day > DaysInMonth[(int)--Month] - || Hours < 0 || Hours > 23 - || Minutes < 0 || Minutes > 59 - || Seconds < 0 || Seconds > 59) - return -1; - - Julian = Day - 1; - for (i = 0; i < Month; i++) - Julian += DaysInMonth[i]; - for (i = EPOCH; i < Year; i++) - Julian += 365 + (i % 4 == 0); - Julian *= DAY; - Julian += Timezone; - Julian += Hours * HOUR + Minutes * MINUTE + Seconds; -#if defined(HAVE_LOCALTIME_S) - ltime = localtime_s(&tmbuf, &Julian) ? NULL : &tmbuf; -#elif defined(HAVE_LOCALTIME_R) - ltime = localtime_r(&Julian, &tmbuf); -#else - ltime = localtime(&Julian); -#endif - if (DSTmode == DSTon - || (DSTmode == DSTmaybe && ltime->tm_isdst)) - Julian -= HOUR; - return Julian; -} - -static time_t -DSTcorrect(time_t Start, time_t Future) -{ - time_t StartDay; - time_t FutureDay; - struct tm *ltime; -#if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S) - struct tm tmbuf; -#endif -#if defined(HAVE_LOCALTIME_S) - ltime = localtime_s(&tmbuf, &Start) ? NULL : &tmbuf; -#elif defined(HAVE_LOCALTIME_R) - ltime = localtime_r(&Start, &tmbuf); -#else - ltime = localtime(&Start); -#endif - StartDay = (ltime->tm_hour + 1) % 24; -#if defined(HAVE_LOCALTIME_S) - ltime = localtime_s(&tmbuf, &Future) ? NULL : &tmbuf; -#elif defined(HAVE_LOCALTIME_R) - ltime = localtime_r(&Future, &tmbuf); -#else - ltime = localtime(&Future); -#endif - FutureDay = (ltime->tm_hour + 1) % 24; - return (Future - Start) + (StartDay - FutureDay) * HOUR; -} - - -static time_t -RelativeDate(time_t Start, time_t zone, int dstmode, - time_t DayOrdinal, time_t DayNumber) -{ - struct tm *tm; - time_t t, now; -#if defined(HAVE_GMTIME_R) || defined(HAVE_GMTIME_S) - struct tm tmbuf; -#endif - - t = Start - zone; -#if defined(HAVE_GMTIME_S) - tm = gmtime_s(&tmbuf, &t) ? NULL : &tmbuf; -#elif defined(HAVE_GMTIME_R) - tm = gmtime_r(&t, &tmbuf); -#else - tm = gmtime(&t); -#endif - now = Start; - now += DAY * ((DayNumber - tm->tm_wday + 7) % 7); - now += 7 * DAY * (DayOrdinal <= 0 ? DayOrdinal : DayOrdinal - 1); - if (dstmode == DSTmaybe) - return DSTcorrect(Start, now); - return now - Start; -} - - -static time_t -RelativeMonth(time_t Start, time_t Timezone, time_t RelMonth) -{ - struct tm *tm; - time_t Month; - time_t Year; -#if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S) - struct tm tmbuf; -#endif - - if (RelMonth == 0) - return 0; -#if defined(HAVE_LOCALTIME_S) - tm = localtime_s(&tmbuf, &Start) ? NULL : &tmbuf; -#elif defined(HAVE_LOCALTIME_R) - tm = localtime_r(&Start, &tmbuf); -#else - tm = localtime(&Start); -#endif - Month = 12 * (tm->tm_year + 1900) + tm->tm_mon + RelMonth; - Year = Month / 12; - Month = Month % 12 + 1; - return DSTcorrect(Start, - Convert(Month, (time_t)tm->tm_mday, Year, - (time_t)tm->tm_hour, (time_t)tm->tm_min, (time_t)tm->tm_sec, - Timezone, DSTmaybe)); -} - -/* - * Tokenizer. - */ -static int -nexttoken(const char **in, time_t *value) -{ - char c; - char buff[64]; - - for ( ; ; ) { - while (isspace((unsigned char)**in)) - ++*in; - - /* Skip parenthesized comments. */ - if (**in == '(') { - int Count = 0; - do { - c = *(*in)++; - if (c == '\0') - return c; - if (c == '(') - Count++; - else if (c == ')') - Count--; - } while (Count > 0); - continue; - } - - /* Try the next token in the word table first. */ - /* This allows us to match "2nd", for example. */ - { - const char *src = *in; - const struct LEXICON *tp; - unsigned i = 0; - - /* Force to lowercase and strip '.' characters. */ - while (*src != '\0' - && (isalnum((unsigned char)*src) || *src == '.') - && i < sizeof(buff)-1) { - if (*src != '.') { - if (isupper((unsigned char)*src)) - buff[i++] = tolower((unsigned char)*src); - else - buff[i++] = *src; - } - src++; - } - buff[i] = '\0'; - - /* - * Find the first match. If the word can be - * abbreviated, make sure we match at least - * the minimum abbreviation. - */ - for (tp = TimeWords; tp->name; tp++) { - size_t abbrev = tp->abbrev; - if (abbrev == 0) - abbrev = strlen(tp->name); - if (strlen(buff) >= abbrev - && strncmp(tp->name, buff, strlen(buff)) - == 0) { - /* Skip over token. */ - *in = src; - /* Return the match. */ - *value = tp->value; - return tp->type; - } - } - } - - /* - * Not in the word table, maybe it's a number. Note: - * Because '-' and '+' have other special meanings, I - * don't deal with signed numbers here. - */ - if (isdigit((unsigned char)(c = **in))) { - for (*value = 0; isdigit((unsigned char)(c = *(*in)++)); ) - *value = 10 * *value + c - '0'; - (*in)--; - return (tUNUMBER); - } - - return *(*in)++; - } -} - -#define TM_YEAR_ORIGIN 1900 - -/* Yield A - B, measured in seconds. */ -static long -difftm (struct tm *a, struct tm *b) -{ - int ay = a->tm_year + (TM_YEAR_ORIGIN - 1); - int by = b->tm_year + (TM_YEAR_ORIGIN - 1); - int days = ( - /* difference in day of year */ - a->tm_yday - b->tm_yday - /* + intervening leap days */ - + ((ay >> 2) - (by >> 2)) - - (ay/100 - by/100) - + ((ay/100 >> 2) - (by/100 >> 2)) - /* + difference in years * 365 */ - + (long)(ay-by) * 365 - ); - return (days * DAY + (a->tm_hour - b->tm_hour) * HOUR - + (a->tm_min - b->tm_min) * MINUTE - + (a->tm_sec - b->tm_sec)); -} - -/* - * - * The public function. - * - * TODO: tokens[] array should be dynamically sized. - */ -time_t -__archive_get_date(time_t now, const char *p) -{ - struct token tokens[256]; - struct gdstate _gds; - struct token *lasttoken; - struct gdstate *gds; - struct tm local, *tm; - struct tm gmt, *gmt_ptr; - time_t Start; - time_t tod; - long tzone; - - /* Clear out the parsed token array. */ - memset(tokens, 0, sizeof(tokens)); - /* Initialize the parser state. */ - memset(&_gds, 0, sizeof(_gds)); - gds = &_gds; - - /* Look up the current time. */ -#if defined(HAVE_LOCALTIME_S) - tm = localtime_s(&local, &now) ? NULL : &local; -#elif defined(HAVE_LOCALTIME_R) - tm = localtime_r(&now, &local); -#else - memset(&local, 0, sizeof(local)); - tm = localtime(&now); -#endif - if (tm == NULL) - return -1; -#if !defined(HAVE_LOCALTIME_R) && !defined(HAVE_LOCALTIME_S) - local = *tm; -#endif - - /* Look up UTC if we can and use that to determine the current - * timezone offset. */ -#if defined(HAVE_GMTIME_S) - gmt_ptr = gmtime_s(&gmt, &now) ? NULL : &gmt; -#elif defined(HAVE_GMTIME_R) - gmt_ptr = gmtime_r(&now, &gmt); -#else - memset(&gmt, 0, sizeof(gmt)); - gmt_ptr = gmtime(&now); - if (gmt_ptr != NULL) { - /* Copy, in case localtime and gmtime use the same buffer. */ - gmt = *gmt_ptr; - } -#endif - if (gmt_ptr != NULL) - tzone = difftm (&gmt, &local); - else - /* This system doesn't understand timezones; fake it. */ - tzone = 0; - if(local.tm_isdst) - tzone += HOUR; - - /* Tokenize the input string. */ - lasttoken = tokens; - while ((lasttoken->token = nexttoken(&p, &lasttoken->value)) != 0) { - ++lasttoken; - if (lasttoken > tokens + 255) - return -1; - } - gds->tokenp = tokens; - - /* Match phrases until we run out of input tokens. */ - while (gds->tokenp < lasttoken) { - if (!phrase(gds)) - return -1; - } - - /* Use current local timezone if none was specified. */ - if (!gds->HaveZone) { - gds->Timezone = tzone; - gds->DSTmode = DSTmaybe; - } - - /* If a timezone was specified, use that for generating the default - * time components instead of the local timezone. */ - if (gds->HaveZone && gmt_ptr != NULL) { - now -= gds->Timezone; -#if defined(HAVE_GMTIME_S) - gmt_ptr = gmtime_s(&gmt, &now) ? NULL : &gmt; -#elif defined(HAVE_GMTIME_R) - gmt_ptr = gmtime_r(&now, &gmt); -#else - gmt_ptr = gmtime(&now); -#endif - if (gmt_ptr != NULL) - local = *gmt_ptr; - now += gds->Timezone; - } - - if (!gds->HaveYear) - gds->Year = local.tm_year + 1900; - if (!gds->HaveMonth) - gds->Month = local.tm_mon + 1; - if (!gds->HaveDay) - gds->Day = local.tm_mday; - /* Note: No default for hour/min/sec; a specifier that just - * gives date always refers to 00:00 on that date. */ - - /* If we saw more than one time, timezone, weekday, year, month, - * or day, then give up. */ - if (gds->HaveTime > 1 || gds->HaveZone > 1 || gds->HaveWeekDay > 1 - || gds->HaveYear > 1 || gds->HaveMonth > 1 || gds->HaveDay > 1) - return -1; - - /* Compute an absolute time based on whatever absolute information - * we collected. */ - if (gds->HaveYear || gds->HaveMonth || gds->HaveDay - || gds->HaveTime || gds->HaveWeekDay) { - Start = Convert(gds->Month, gds->Day, gds->Year, - gds->Hour, gds->Minutes, gds->Seconds, - gds->Timezone, gds->DSTmode); - if (Start < 0) - return -1; - } else { - Start = now; - if (!gds->HaveRel) - Start -= local.tm_hour * HOUR + local.tm_min * MINUTE - + local.tm_sec; - } - - /* Add the relative offset. */ - Start += gds->RelSeconds; - Start += RelativeMonth(Start, gds->Timezone, gds->RelMonth); - - /* Adjust for day-of-week offsets. */ - if (gds->HaveWeekDay - && !(gds->HaveYear || gds->HaveMonth || gds->HaveDay)) { - tod = RelativeDate(Start, gds->Timezone, - gds->DSTmode, gds->DayOrdinal, gds->DayNumber); - Start += tod; - } - - /* -1 is an error indicator, so return 0 instead of -1 if - * that's the actual time. */ - return Start == -1 ? 0 : Start; -} - - -#if defined(TEST) - -/* ARGSUSED */ -int -main(int argc, char **argv) -{ - time_t d; - time_t now = time(NULL); - - while (*++argv != NULL) { - (void)printf("Input: %s\n", *argv); - d = get_date(now, *argv); - if (d == -1) - (void)printf("Bad format - couldn't convert.\n"); - else - (void)printf("Output: %s\n", ctime(&d)); - } - exit(0); - /* NOTREACHED */ -} -#endif /* defined(TEST) */ --- contrib/libarchive/libarchive/archive_getdate.h.orig +++ contrib/libarchive/libarchive/archive_getdate.h @@ -1,37 +0,0 @@ -/*- - * Copyright (c) 2003-2015 Tim Kientzle - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR(S) 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. - */ - -#ifndef ARCHIVE_GETDATE_H_INCLUDED -#define ARCHIVE_GETDATE_H_INCLUDED - -#ifndef __LIBARCHIVE_BUILD -#error This header is only to be used internally to libarchive. -#endif - -#include - -time_t __archive_get_date(time_t now, const char *); - -#endif --- contrib/libarchive/libarchive/archive_hmac_private.h.orig +++ contrib/libarchive/libarchive/archive_hmac_private.h @@ -116,4 +116,4 @@ }; extern const struct archive_hmac __archive_hmac; -#endif /* ARCHIVE_HMAC_PRIVATE_H_INCLUDED */ +#endif /* !ARCHIVE_HMAC_PRIVATE_H_INCLUDED */ --- contrib/libarchive/libarchive/archive_match.c.orig +++ contrib/libarchive/libarchive/archive_match.c @@ -35,14 +35,17 @@ #ifdef HAVE_STRING_H #include #endif +#ifdef HAVE_LIMITS_H +#include +#endif #include "archive.h" #include "archive_private.h" #include "archive_entry.h" -#include "archive_getdate.h" #include "archive_pathmatch.h" #include "archive_rb.h" #include "archive_string.h" +#include "archive_time_private.h" struct match { struct match *next; @@ -53,8 +56,7 @@ struct match_list { struct match *first; struct match **last; - int count; - int unmatched_count; + size_t unmatched_count; struct match *unmatched_next; int unmatched_eof; }; @@ -73,7 +75,6 @@ struct entry_list { struct match_file *first; struct match_file **last; - int count; }; struct id_array { @@ -144,12 +145,15 @@ const char *); static int add_pattern_wcs(struct archive_match *, struct match_list *, const wchar_t *); +#if !defined(_WIN32) || defined(__CYGWIN__) static int cmp_key_mbs(const struct archive_rb_node *, const void *); -static int cmp_key_wcs(const struct archive_rb_node *, const void *); static int cmp_node_mbs(const struct archive_rb_node *, const struct archive_rb_node *); +#else +static int cmp_key_wcs(const struct archive_rb_node *, const void *); static int cmp_node_wcs(const struct archive_rb_node *, const struct archive_rb_node *); +#endif static void entry_list_add(struct entry_list *, struct match_file *); static void entry_list_free(struct entry_list *); static void entry_list_init(struct entry_list *); @@ -187,14 +191,14 @@ struct archive_entry *); static int validate_time_flag(struct archive *, int, const char *); -#define get_date __archive_get_date +#define get_date archive_parse_date -static const struct archive_rb_tree_ops rb_ops_mbs = { +static const struct archive_rb_tree_ops rb_ops = { +#if !defined(_WIN32) || defined(__CYGWIN__) cmp_node_mbs, cmp_key_mbs -}; - -static const struct archive_rb_tree_ops rb_ops_wcs = { +#else cmp_node_wcs, cmp_key_wcs +#endif }; /* @@ -228,7 +232,7 @@ a->recursive_include = 1; match_list_init(&(a->inclusions)); match_list_init(&(a->exclusions)); - __archive_rb_tree_init(&(a->exclusion_tree), &rb_ops_mbs); + __archive_rb_tree_init(&(a->exclusion_tree), &rb_ops); entry_list_init(&(a->exclusion_entry_list)); match_list_init(&(a->inclusion_unames)); match_list_init(&(a->inclusion_gnames)); @@ -507,7 +511,9 @@ ARCHIVE_STATE_NEW, "archive_match_unmatched_inclusions"); a = (struct archive_match *)_a; - return (a->inclusions.unmatched_count); + if (a->inclusions.unmatched_count > (size_t)INT_MAX) + return INT_MAX; + return (int)(a->inclusions.unmatched_count); } int @@ -650,7 +656,7 @@ break; } } else { - if (*b == 0x0d || *b == 0x0a) { + if (*b == 0x0d || *b == 0x0a) { found_separator = 1; break; } @@ -735,7 +741,7 @@ } } - /* Exclusions take priority */ + /* Exclusions take priority. */ for (match = a->exclusions.first; match != NULL; match = match->next){ r = match_path_exclusion(a, match, mbs, pathname); @@ -834,7 +840,6 @@ { list->first = NULL; list->last = &(list->first); - list->count = 0; } static void @@ -855,7 +860,6 @@ { *list->last = m; list->last = &(m->next); - list->count++; list->unmatched_count++; } @@ -1145,36 +1149,15 @@ } #if defined(_WIN32) && !defined(__CYGWIN__) -#define EPOC_TIME ARCHIVE_LITERAL_ULL(116444736000000000) static int set_timefilter_find_data(struct archive_match *a, int timetype, - DWORD ftLastWriteTime_dwHighDateTime, DWORD ftLastWriteTime_dwLowDateTime, - DWORD ftCreationTime_dwHighDateTime, DWORD ftCreationTime_dwLowDateTime) + const FILETIME* ftLastWriteTime, const FILETIME* ftCreationTime) { - ULARGE_INTEGER utc; time_t ctime_sec, mtime_sec; - long ctime_ns, mtime_ns; + uint32_t ctime_ns, mtime_ns; - utc.HighPart = ftCreationTime_dwHighDateTime; - utc.LowPart = ftCreationTime_dwLowDateTime; - if (utc.QuadPart >= EPOC_TIME) { - utc.QuadPart -= EPOC_TIME; - ctime_sec = (time_t)(utc.QuadPart / 10000000); - ctime_ns = (long)(utc.QuadPart % 10000000) * 100; - } else { - ctime_sec = 0; - ctime_ns = 0; - } - utc.HighPart = ftLastWriteTime_dwHighDateTime; - utc.LowPart = ftLastWriteTime_dwLowDateTime; - if (utc.QuadPart >= EPOC_TIME) { - utc.QuadPart -= EPOC_TIME; - mtime_sec = (time_t)(utc.QuadPart / 10000000); - mtime_ns = (long)(utc.QuadPart % 10000000) * 100; - } else { - mtime_sec = 0; - mtime_ns = 0; - } + ntfs_to_unix(FILETIME_to_ntfs(ftLastWriteTime), &mtime_sec, &mtime_ns); + ntfs_to_unix(FILETIME_to_ntfs(ftCreationTime), &ctime_sec, &ctime_ns); return set_timefilter(a, timetype, mtime_sec, mtime_ns, ctime_sec, ctime_ns); } @@ -1199,9 +1182,7 @@ return (ARCHIVE_FAILED); } FindClose(h); - return set_timefilter_find_data(a, timetype, - d.ftLastWriteTime.dwHighDateTime, d.ftLastWriteTime.dwLowDateTime, - d.ftCreationTime.dwHighDateTime, d.ftCreationTime.dwLowDateTime); + return set_timefilter_find_data(a, timetype, &d.ftLastWriteTime, &d.ftCreationTime); } static int @@ -1223,9 +1204,7 @@ return (ARCHIVE_FAILED); } FindClose(h); - return set_timefilter_find_data(a, timetype, - d.ftLastWriteTime.dwHighDateTime, d.ftLastWriteTime.dwLowDateTime, - d.ftCreationTime.dwHighDateTime, d.ftCreationTime.dwLowDateTime); + return set_timefilter_find_data(a, timetype, &d.ftLastWriteTime, &d.ftCreationTime); } #else /* _WIN32 && !__CYGWIN__ */ @@ -1300,6 +1279,7 @@ /* * Call back functions for archive_rb. */ +#if !defined(_WIN32) || defined(__CYGWIN__) static int cmp_node_mbs(const struct archive_rb_node *n1, const struct archive_rb_node *n2) @@ -1316,7 +1296,7 @@ return (-1); return (strcmp(p1, p2)); } - + static int cmp_key_mbs(const struct archive_rb_node *n, const void *key) { @@ -1328,7 +1308,7 @@ return (-1); return (strcmp(p, (const char *)key)); } - +#else static int cmp_node_wcs(const struct archive_rb_node *n1, const struct archive_rb_node *n2) @@ -1345,7 +1325,7 @@ return (-1); return (wcscmp(p1, p2)); } - + static int cmp_key_wcs(const struct archive_rb_node *n, const void *key) { @@ -1357,13 +1337,13 @@ return (-1); return (wcscmp(p, (const wchar_t *)key)); } +#endif static void entry_list_init(struct entry_list *list) { list->first = NULL; list->last = &(list->first); - list->count = 0; } static void @@ -1384,7 +1364,6 @@ { *list->last = file; list->last = &(file->next); - list->count++; } static int @@ -1407,9 +1386,7 @@ return (ARCHIVE_FAILED); } archive_mstring_copy_wcs(&(f->pathname), pathname); - a->exclusion_tree.rbt_ops = &rb_ops_wcs; #else - (void)rb_ops_wcs; pathname = archive_entry_pathname(entry); if (pathname == NULL) { free(f); @@ -1417,7 +1394,6 @@ return (ARCHIVE_FAILED); } archive_mstring_copy_mbs(&(f->pathname), pathname); - a->exclusion_tree.rbt_ops = &rb_ops_mbs; #endif f->flag = flag; f->mtime_sec = archive_entry_mtime(entry); @@ -1542,16 +1518,13 @@ } /* If there is no exclusion list, include the file. */ - if (a->exclusion_entry_list.count == 0) + if (a->exclusion_entry_list.first == NULL) return (0); #if defined(_WIN32) && !defined(__CYGWIN__) pathname = archive_entry_pathname_w(entry); - a->exclusion_tree.rbt_ops = &rb_ops_wcs; #else - (void)rb_ops_wcs; pathname = archive_entry_pathname(entry); - a->exclusion_tree.rbt_ops = &rb_ops_mbs; #endif if (pathname == NULL) return (0); @@ -1707,7 +1680,7 @@ static int add_owner_id(struct archive_match *a, struct id_array *ids, int64_t id) { - unsigned i; + size_t i; if (ids->count + 1 >= ids->size) { void *p; @@ -1744,10 +1717,10 @@ static int match_owner_id(struct id_array *ids, int64_t id) { - unsigned b, m, t; + size_t b, m, t; t = 0; - b = (unsigned)ids->count; + b = ids->count; while (t < b) { m = (t + b)>>1; if (ids->ids[m] == id) @@ -1842,7 +1815,7 @@ return (1); } - if (a->inclusion_unames.count) { + if (a->inclusion_unames.first != NULL) { #if defined(_WIN32) && !defined(__CYGWIN__) r = match_owner_name_wcs(a, &(a->inclusion_unames), archive_entry_uname_w(entry)); @@ -1856,7 +1829,7 @@ return (r); } - if (a->inclusion_gnames.count) { + if (a->inclusion_gnames.first != NULL) { #if defined(_WIN32) && !defined(__CYGWIN__) r = match_owner_name_wcs(a, &(a->inclusion_gnames), archive_entry_gname_w(entry)); @@ -1871,4 +1844,3 @@ } return (0); } - --- contrib/libarchive/libarchive/archive_options.c.orig +++ contrib/libarchive/libarchive/archive_options.c @@ -38,7 +38,7 @@ int _archive_set_option(struct archive *a, const char *m, const char *o, const char *v, - int magic, const char *fn, option_handler use_option) + unsigned int magic, const char *fn, option_handler use_option) { const char *mp, *op, *vp; int r; @@ -97,7 +97,7 @@ int _archive_set_options(struct archive *a, const char *options, - int magic, const char *fn, option_handler use_option) + unsigned int magic, const char *fn, option_handler use_option) { int allok = 1, anyok = 0, ignore_mod_err = 0, r; char *data; --- contrib/libarchive/libarchive/archive_options_private.h.orig +++ contrib/libarchive/libarchive/archive_options_private.h @@ -35,11 +35,11 @@ int _archive_set_option(struct archive *a, const char *mod, const char *opt, const char *val, - int magic, const char *fn, option_handler use_option); + unsigned int magic, const char *fn, option_handler use_option); int _archive_set_options(struct archive *a, const char *options, - int magic, const char *fn, option_handler use_option); + unsigned int magic, const char *fn, option_handler use_option); int _archive_set_either_option(struct archive *a, --- contrib/libarchive/libarchive/archive_pack_dev.h.orig +++ contrib/libarchive/libarchive/archive_pack_dev.h @@ -46,4 +46,4 @@ (((y) << 12) & 0xfff00000) | \ (((y) << 0) & 0x000000ff))) -#endif /* ARCHIVE_PACK_DEV_H */ +#endif /* !ARCHIVE_PACK_DEV_H */ --- /dev/null +++ contrib/libarchive/libarchive/archive_parse_date.c @@ -0,0 +1,1147 @@ +/* + * This code is in the public domain and has no copyright. + * + * This is a plain C recursive-descent translation of an old + * public-domain YACC grammar that has been used for parsing dates in + * very many open-source projects. + * + * Since the original authors were generous enough to donate their + * work to the public domain, I feel compelled to match their + * generosity. + * + * Tim Kientzle, February 2009. + */ + +/* + * Header comment from original getdate.y: + */ + +/* +** Originally written by Steven M. Bellovin while +** at the University of North Carolina at Chapel Hill. Later tweaked by +** a couple of people on Usenet. Completely overhauled by Rich $alz +** and Jim Berets in August, 1990; +** +** This grammar has 10 shift/reduce conflicts. +** +** This code is in the public domain and has no copyright. +*/ + +#include "archive_platform.h" + +#include +#include +#include +#include +#include + +#include "archive.h" + +/* Basic time units. */ +#define EPOCH 1970 +#define MINUTE (60L) +#define HOUR (60L * MINUTE) +#define DAY (24L * HOUR) + +/* Daylight-savings mode: on, off, or not yet known. */ +enum DSTMODE { DSTon, DSToff, DSTmaybe }; +/* Meridian: am or pm. */ +enum { tAM, tPM }; +/* Token types returned by nexttoken() */ +enum { tAGO = 260, tDAY, tDAYZONE, tAMPM, tMONTH, tMONTH_UNIT, tSEC_UNIT, + tUNUMBER, tZONE, tDST }; +struct token { int token; time_t value; }; + +/* + * Parser state. + */ +struct gdstate { + struct token *tokenp; /* Pointer to next token. */ + /* HaveXxxx counts how many of this kind of phrase we've seen; + * it's a fatal error to have more than one time, zone, day, + * or date phrase. */ + int HaveYear; + int HaveMonth; + int HaveDay; + int HaveWeekDay; /* Day of week */ + int HaveTime; /* Hour/minute/second */ + int HaveZone; /* timezone and/or DST info */ + int HaveRel; /* time offset; we can have more than one */ + /* Absolute time values. */ + time_t Timezone; /* Seconds offset from GMT */ + time_t Day; + time_t Hour; + time_t Minutes; + time_t Month; + time_t Seconds; + time_t Year; + /* DST selection */ + enum DSTMODE DSTmode; + /* Day of week accounting, e.g., "3rd Tuesday" */ + time_t DayOrdinal; /* "3" in "3rd Tuesday" */ + time_t DayNumber; /* "Tuesday" in "3rd Tuesday" */ + /* Relative time values: hour/day/week offsets are measured in + * seconds, month/year are counted in months. */ + time_t RelMonth; + time_t RelSeconds; +}; + +/* + * A series of functions that recognize certain common time phrases. + * Each function returns 1 if it managed to make sense of some of the + * tokens, zero otherwise. + */ + +/* + * hour:minute or hour:minute:second with optional AM, PM, or numeric + * timezone offset + */ +static int +timephrase(struct gdstate *gds) +{ + if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == ':' + && gds->tokenp[2].token == tUNUMBER + && gds->tokenp[3].token == ':' + && gds->tokenp[4].token == tUNUMBER) { + /* "12:14:18" or "22:08:07" */ + ++gds->HaveTime; + gds->Hour = gds->tokenp[0].value; + gds->Minutes = gds->tokenp[2].value; + gds->Seconds = gds->tokenp[4].value; + gds->tokenp += 5; + } + else if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == ':' + && gds->tokenp[2].token == tUNUMBER) { + /* "12:14" or "22:08" */ + ++gds->HaveTime; + gds->Hour = gds->tokenp[0].value; + gds->Minutes = gds->tokenp[2].value; + gds->Seconds = 0; + gds->tokenp += 3; + } + else if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == tAMPM) { + /* "7" is a time if it's followed by "am" or "pm" */ + ++gds->HaveTime; + gds->Hour = gds->tokenp[0].value; + gds->Minutes = gds->Seconds = 0; + /* We'll handle the AM/PM below. */ + gds->tokenp += 1; + } else { + /* We can't handle this. */ + return 0; + } + + if (gds->tokenp[0].token == tAMPM) { + /* "7:12pm", "12:20:13am" */ + if (gds->Hour == 12) + gds->Hour = 0; + if (gds->tokenp[0].value == tPM) + gds->Hour += 12; + gds->tokenp += 1; + } + if (gds->tokenp[0].token == '+' + && gds->tokenp[1].token == tUNUMBER) { + /* "7:14+0700" */ + gds->HaveZone++; + gds->DSTmode = DSToff; + gds->Timezone = - ((gds->tokenp[1].value / 100) * HOUR + + (gds->tokenp[1].value % 100) * MINUTE); + gds->tokenp += 2; + } + if (gds->tokenp[0].token == '-' + && gds->tokenp[1].token == tUNUMBER) { + /* "19:14:12-0530" */ + gds->HaveZone++; + gds->DSTmode = DSToff; + gds->Timezone = + ((gds->tokenp[1].value / 100) * HOUR + + (gds->tokenp[1].value % 100) * MINUTE); + gds->tokenp += 2; + } + return 1; +} + +/* + * Timezone name, possibly including DST. + */ +static int +zonephrase(struct gdstate *gds) +{ + if (gds->tokenp[0].token == tZONE + && gds->tokenp[1].token == tDST) { + gds->HaveZone++; + gds->Timezone = gds->tokenp[0].value; + gds->DSTmode = DSTon; + gds->tokenp += 1; + return 1; + } + + if (gds->tokenp[0].token == tZONE) { + gds->HaveZone++; + gds->Timezone = gds->tokenp[0].value; + gds->DSTmode = DSToff; + gds->tokenp += 1; + return 1; + } + + if (gds->tokenp[0].token == tDAYZONE) { + gds->HaveZone++; + gds->Timezone = gds->tokenp[0].value; + gds->DSTmode = DSTon; + gds->tokenp += 1; + return 1; + } + return 0; +} + +/* + * Year/month/day in various combinations. + */ +static int +datephrase(struct gdstate *gds) +{ + if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == '/' + && gds->tokenp[2].token == tUNUMBER + && gds->tokenp[3].token == '/' + && gds->tokenp[4].token == tUNUMBER) { + gds->HaveYear++; + gds->HaveMonth++; + gds->HaveDay++; + if (gds->tokenp[0].value >= 13) { + /* First number is big: 2004/01/29, 99/02/17 */ + gds->Year = gds->tokenp[0].value; + gds->Month = gds->tokenp[2].value; + gds->Day = gds->tokenp[4].value; + } else if ((gds->tokenp[4].value >= 13) + || (gds->tokenp[2].value >= 13)) { + /* Last number is big: 01/07/98 */ + /* Middle number is big: 01/29/04 */ + gds->Month = gds->tokenp[0].value; + gds->Day = gds->tokenp[2].value; + gds->Year = gds->tokenp[4].value; + } else { + /* No significant clues: 02/03/04 */ + gds->Month = gds->tokenp[0].value; + gds->Day = gds->tokenp[2].value; + gds->Year = gds->tokenp[4].value; + } + gds->tokenp += 5; + return 1; + } + + if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == '/' + && gds->tokenp[2].token == tUNUMBER) { + /* "1/15" */ + gds->HaveMonth++; + gds->HaveDay++; + gds->Month = gds->tokenp[0].value; + gds->Day = gds->tokenp[2].value; + gds->tokenp += 3; + return 1; + } + + if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == '-' + && gds->tokenp[2].token == tUNUMBER + && gds->tokenp[3].token == '-' + && gds->tokenp[4].token == tUNUMBER) { + /* ISO 8601 format. yyyy-mm-dd. */ + gds->HaveYear++; + gds->HaveMonth++; + gds->HaveDay++; + gds->Year = gds->tokenp[0].value; + gds->Month = gds->tokenp[2].value; + gds->Day = gds->tokenp[4].value; + gds->tokenp += 5; + return 1; + } + + if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == '-' + && gds->tokenp[2].token == tMONTH + && gds->tokenp[3].token == '-' + && gds->tokenp[4].token == tUNUMBER) { + gds->HaveYear++; + gds->HaveMonth++; + gds->HaveDay++; + if (gds->tokenp[0].value > 31) { + /* e.g. 1992-Jun-17 */ + gds->Year = gds->tokenp[0].value; + gds->Month = gds->tokenp[2].value; + gds->Day = gds->tokenp[4].value; + } else { + /* e.g. 17-JUN-1992. */ + gds->Day = gds->tokenp[0].value; + gds->Month = gds->tokenp[2].value; + gds->Year = gds->tokenp[4].value; + } + gds->tokenp += 5; + return 1; + } + + if (gds->tokenp[0].token == tMONTH + && gds->tokenp[1].token == tUNUMBER + && gds->tokenp[2].token == ',' + && gds->tokenp[3].token == tUNUMBER) { + /* "June 17, 2001" */ + gds->HaveYear++; + gds->HaveMonth++; + gds->HaveDay++; + gds->Month = gds->tokenp[0].value; + gds->Day = gds->tokenp[1].value; + gds->Year = gds->tokenp[3].value; + gds->tokenp += 4; + return 1; + } + + if (gds->tokenp[0].token == tMONTH + && gds->tokenp[1].token == tUNUMBER) { + /* "May 3" */ + gds->HaveMonth++; + gds->HaveDay++; + gds->Month = gds->tokenp[0].value; + gds->Day = gds->tokenp[1].value; + gds->tokenp += 2; + return 1; + } + + if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == tMONTH + && gds->tokenp[2].token == tUNUMBER) { + /* "12 Sept 1997" */ + gds->HaveYear++; + gds->HaveMonth++; + gds->HaveDay++; + gds->Day = gds->tokenp[0].value; + gds->Month = gds->tokenp[1].value; + gds->Year = gds->tokenp[2].value; + gds->tokenp += 3; + return 1; + } + + if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == tMONTH) { + /* "12 Sept" */ + gds->HaveMonth++; + gds->HaveDay++; + gds->Day = gds->tokenp[0].value; + gds->Month = gds->tokenp[1].value; + gds->tokenp += 2; + return 1; + } + + return 0; +} + +/* + * Relative time phrase: "tomorrow", "yesterday", "+1 hour", etc. + */ +static int +relunitphrase(struct gdstate *gds) +{ + if (gds->tokenp[0].token == '-' + && gds->tokenp[1].token == tUNUMBER + && gds->tokenp[2].token == tSEC_UNIT) { + /* "-3 hours" */ + gds->HaveRel++; + gds->RelSeconds -= gds->tokenp[1].value * gds->tokenp[2].value; + gds->tokenp += 3; + return 1; + } + if (gds->tokenp[0].token == '+' + && gds->tokenp[1].token == tUNUMBER + && gds->tokenp[2].token == tSEC_UNIT) { + /* "+1 minute" */ + gds->HaveRel++; + gds->RelSeconds += gds->tokenp[1].value * gds->tokenp[2].value; + gds->tokenp += 3; + return 1; + } + if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == tSEC_UNIT) { + /* "1 day" */ + gds->HaveRel++; + gds->RelSeconds += gds->tokenp[0].value * gds->tokenp[1].value; + gds->tokenp += 2; + return 1; + } + if (gds->tokenp[0].token == '-' + && gds->tokenp[1].token == tUNUMBER + && gds->tokenp[2].token == tMONTH_UNIT) { + /* "-3 months" */ + gds->HaveRel++; + gds->RelMonth -= gds->tokenp[1].value * gds->tokenp[2].value; + gds->tokenp += 3; + return 1; + } + if (gds->tokenp[0].token == '+' + && gds->tokenp[1].token == tUNUMBER + && gds->tokenp[2].token == tMONTH_UNIT) { + /* "+5 years" */ + gds->HaveRel++; + gds->RelMonth += gds->tokenp[1].value * gds->tokenp[2].value; + gds->tokenp += 3; + return 1; + } + if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == tMONTH_UNIT) { + /* "2 years" */ + gds->HaveRel++; + gds->RelMonth += gds->tokenp[0].value * gds->tokenp[1].value; + gds->tokenp += 2; + return 1; + } + if (gds->tokenp[0].token == tSEC_UNIT) { + /* "now", "tomorrow" */ + gds->HaveRel++; + gds->RelSeconds += gds->tokenp[0].value; + gds->tokenp += 1; + return 1; + } + if (gds->tokenp[0].token == tMONTH_UNIT) { + /* "month" */ + gds->HaveRel++; + gds->RelMonth += gds->tokenp[0].value; + gds->tokenp += 1; + return 1; + } + return 0; +} + +/* + * Day of the week specification. + */ +static int +dayphrase(struct gdstate *gds) +{ + if (gds->tokenp[0].token == tDAY) { + /* "tues", "wednesday," */ + gds->HaveWeekDay++; + gds->DayOrdinal = 1; + gds->DayNumber = gds->tokenp[0].value; + gds->tokenp += 1; + if (gds->tokenp[0].token == ',') + gds->tokenp += 1; + return 1; + } + if (gds->tokenp[0].token == tUNUMBER + && gds->tokenp[1].token == tDAY) { + /* "second tues" "3 wed" */ + gds->HaveWeekDay++; + gds->DayOrdinal = gds->tokenp[0].value; + gds->DayNumber = gds->tokenp[1].value; + gds->tokenp += 2; + return 1; + } + return 0; +} + +/* + * Try to match a phrase using one of the above functions. + * This layer also deals with a couple of generic issues. + */ +static int +phrase(struct gdstate *gds) +{ + if (timephrase(gds)) + return 1; + if (zonephrase(gds)) + return 1; + if (datephrase(gds)) + return 1; + if (dayphrase(gds)) + return 1; + if (relunitphrase(gds)) { + if (gds->tokenp[0].token == tAGO) { + gds->RelSeconds = -gds->RelSeconds; + gds->RelMonth = -gds->RelMonth; + gds->tokenp += 1; + } + return 1; + } + + /* Bare numbers sometimes have meaning. */ + if (gds->tokenp[0].token == tUNUMBER) { + if (gds->HaveTime && !gds->HaveYear && !gds->HaveRel) { + gds->HaveYear++; + gds->Year = gds->tokenp[0].value; + gds->tokenp += 1; + return 1; + } + + if(gds->tokenp[0].value > 10000) { + /* "20040301" */ + gds->HaveYear++; + gds->HaveMonth++; + gds->HaveDay++; + gds->Day= (gds->tokenp[0].value)%100; + gds->Month= (gds->tokenp[0].value/100)%100; + gds->Year = gds->tokenp[0].value/10000; + gds->tokenp += 1; + return 1; + } + + if (gds->tokenp[0].value < 24) { + gds->HaveTime++; + gds->Hour = gds->tokenp[0].value; + gds->Minutes = 0; + gds->Seconds = 0; + gds->tokenp += 1; + return 1; + } + + if ((gds->tokenp[0].value / 100 < 24) + && (gds->tokenp[0].value % 100 < 60)) { + /* "513" is same as "5:13" */ + gds->Hour = gds->tokenp[0].value / 100; + gds->Minutes = gds->tokenp[0].value % 100; + gds->Seconds = 0; + gds->tokenp += 1; + return 1; + } + } + + return 0; +} + +/* + * A dictionary of time words. + */ +static struct LEXICON { + size_t abbrev; + const char *name; + int type; + time_t value; +} const TimeWords[] = { + /* am/pm */ + { 0, "am", tAMPM, tAM }, + { 0, "pm", tAMPM, tPM }, + + /* Month names. */ + { 3, "january", tMONTH, 1 }, + { 3, "february", tMONTH, 2 }, + { 3, "march", tMONTH, 3 }, + { 3, "april", tMONTH, 4 }, + { 3, "may", tMONTH, 5 }, + { 3, "june", tMONTH, 6 }, + { 3, "july", tMONTH, 7 }, + { 3, "august", tMONTH, 8 }, + { 3, "september", tMONTH, 9 }, + { 3, "october", tMONTH, 10 }, + { 3, "november", tMONTH, 11 }, + { 3, "december", tMONTH, 12 }, + + /* Days of the week. */ + { 2, "sunday", tDAY, 0 }, + { 3, "monday", tDAY, 1 }, + { 2, "tuesday", tDAY, 2 }, + { 3, "wednesday", tDAY, 3 }, + { 2, "thursday", tDAY, 4 }, + { 2, "friday", tDAY, 5 }, + { 2, "saturday", tDAY, 6 }, + + /* Timezones: Offsets are in seconds. */ + { 0, "gmt", tZONE, 0*HOUR }, /* Greenwich Mean */ + { 0, "ut", tZONE, 0*HOUR }, /* Universal (Coordinated) */ + { 0, "utc", tZONE, 0*HOUR }, + { 0, "wet", tZONE, 0*HOUR }, /* Western European */ + { 0, "bst", tDAYZONE, 0*HOUR }, /* British Summer */ + { 0, "wat", tZONE, 1*HOUR }, /* West Africa */ + { 0, "at", tZONE, 2*HOUR }, /* Azores */ + /* { 0, "bst", tZONE, 3*HOUR }, */ /* Brazil Standard: Conflict */ + /* { 0, "gst", tZONE, 3*HOUR }, */ /* Greenland Standard: Conflict*/ + { 0, "nft", tZONE, 3*HOUR+30*MINUTE }, /* Newfoundland */ + { 0, "nst", tZONE, 3*HOUR+30*MINUTE }, /* Newfoundland Standard */ + { 0, "ndt", tDAYZONE, 3*HOUR+30*MINUTE }, /* Newfoundland Daylight */ + { 0, "ast", tZONE, 4*HOUR }, /* Atlantic Standard */ + { 0, "adt", tDAYZONE, 4*HOUR }, /* Atlantic Daylight */ + { 0, "est", tZONE, 5*HOUR }, /* Eastern Standard */ + { 0, "edt", tDAYZONE, 5*HOUR }, /* Eastern Daylight */ + { 0, "cst", tZONE, 6*HOUR }, /* Central Standard */ + { 0, "cdt", tDAYZONE, 6*HOUR }, /* Central Daylight */ + { 0, "mst", tZONE, 7*HOUR }, /* Mountain Standard */ + { 0, "mdt", tDAYZONE, 7*HOUR }, /* Mountain Daylight */ + { 0, "pst", tZONE, 8*HOUR }, /* Pacific Standard */ + { 0, "pdt", tDAYZONE, 8*HOUR }, /* Pacific Daylight */ + { 0, "yst", tZONE, 9*HOUR }, /* Yukon Standard */ + { 0, "ydt", tDAYZONE, 9*HOUR }, /* Yukon Daylight */ + { 0, "hst", tZONE, 10*HOUR }, /* Hawaii Standard */ + { 0, "hdt", tDAYZONE, 10*HOUR }, /* Hawaii Daylight */ + { 0, "cat", tZONE, 10*HOUR }, /* Central Alaska */ + { 0, "ahst", tZONE, 10*HOUR }, /* Alaska-Hawaii Standard */ + { 0, "nt", tZONE, 11*HOUR }, /* Nome */ + { 0, "idlw", tZONE, 12*HOUR }, /* Intl Date Line West */ + { 0, "cet", tZONE, -1*HOUR }, /* Central European */ + { 0, "met", tZONE, -1*HOUR }, /* Middle European */ + { 0, "mewt", tZONE, -1*HOUR }, /* Middle European Winter */ + { 0, "mest", tDAYZONE, -1*HOUR }, /* Middle European Summer */ + { 0, "swt", tZONE, -1*HOUR }, /* Swedish Winter */ + { 0, "sst", tDAYZONE, -1*HOUR }, /* Swedish Summer */ + { 0, "fwt", tZONE, -1*HOUR }, /* French Winter */ + { 0, "fst", tDAYZONE, -1*HOUR }, /* French Summer */ + { 0, "eet", tZONE, -2*HOUR }, /* Eastern Eur, USSR Zone 1 */ + { 0, "bt", tZONE, -3*HOUR }, /* Baghdad, USSR Zone 2 */ + { 0, "it", tZONE, -3*HOUR-30*MINUTE },/* Iran */ + { 0, "zp4", tZONE, -4*HOUR }, /* USSR Zone 3 */ + { 0, "zp5", tZONE, -5*HOUR }, /* USSR Zone 4 */ + { 0, "ist", tZONE, -5*HOUR-30*MINUTE },/* Indian Standard */ + { 0, "zp6", tZONE, -6*HOUR }, /* USSR Zone 5 */ + /* { 0, "nst", tZONE, -6.5*HOUR }, */ /* North Sumatra: Conflict */ + /* { 0, "sst", tZONE, -7*HOUR }, */ /* So Sumatra, USSR 6: Conflict */ + { 0, "wast", tZONE, -7*HOUR }, /* West Australian Standard */ + { 0, "wadt", tDAYZONE, -7*HOUR }, /* West Australian Daylight */ + { 0, "jt", tZONE, -7*HOUR-30*MINUTE },/* Java (3pm in Cronusland!)*/ + { 0, "cct", tZONE, -8*HOUR }, /* China Coast, USSR Zone 7 */ + { 0, "jst", tZONE, -9*HOUR }, /* Japan Std, USSR Zone 8 */ + { 0, "cast", tZONE, -9*HOUR-30*MINUTE },/* Ctrl Australian Std */ + { 0, "cadt", tDAYZONE, -9*HOUR-30*MINUTE },/* Ctrl Australian Daylt */ + { 0, "east", tZONE, -10*HOUR }, /* Eastern Australian Std */ + { 0, "eadt", tDAYZONE, -10*HOUR }, /* Eastern Australian Daylt */ + { 0, "gst", tZONE, -10*HOUR }, /* Guam Std, USSR Zone 9 */ + { 0, "nzt", tZONE, -12*HOUR }, /* New Zealand */ + { 0, "nzst", tZONE, -12*HOUR }, /* New Zealand Standard */ + { 0, "nzdt", tDAYZONE, -12*HOUR }, /* New Zealand Daylight */ + { 0, "idle", tZONE, -12*HOUR }, /* Intl Date Line East */ + + { 0, "dst", tDST, 0 }, + + /* Time units. */ + { 4, "years", tMONTH_UNIT, 12 }, + { 5, "months", tMONTH_UNIT, 1 }, + { 9, "fortnights", tSEC_UNIT, 14 * DAY }, + { 4, "weeks", tSEC_UNIT, 7 * DAY }, + { 3, "days", tSEC_UNIT, DAY }, + { 4, "hours", tSEC_UNIT, HOUR }, + { 3, "minutes", tSEC_UNIT, MINUTE }, + { 3, "seconds", tSEC_UNIT, 1 }, + + /* Relative-time words. */ + { 0, "tomorrow", tSEC_UNIT, DAY }, + { 0, "yesterday", tSEC_UNIT, -DAY }, + { 0, "today", tSEC_UNIT, 0 }, + { 0, "now", tSEC_UNIT, 0 }, + { 0, "last", tUNUMBER, -1 }, + { 0, "this", tSEC_UNIT, 0 }, + { 0, "next", tUNUMBER, 2 }, + { 0, "first", tUNUMBER, 1 }, + { 0, "1st", tUNUMBER, 1 }, +/* { 0, "second", tUNUMBER, 2 }, */ + { 0, "2nd", tUNUMBER, 2 }, + { 0, "third", tUNUMBER, 3 }, + { 0, "3rd", tUNUMBER, 3 }, + { 0, "fourth", tUNUMBER, 4 }, + { 0, "4th", tUNUMBER, 4 }, + { 0, "fifth", tUNUMBER, 5 }, + { 0, "5th", tUNUMBER, 5 }, + { 0, "sixth", tUNUMBER, 6 }, + { 0, "seventh", tUNUMBER, 7 }, + { 0, "eighth", tUNUMBER, 8 }, + { 0, "ninth", tUNUMBER, 9 }, + { 0, "tenth", tUNUMBER, 10 }, + { 0, "eleventh", tUNUMBER, 11 }, + { 0, "twelfth", tUNUMBER, 12 }, + { 0, "ago", tAGO, 1 }, + + /* Military timezones. */ + { 0, "a", tZONE, 1*HOUR }, + { 0, "b", tZONE, 2*HOUR }, + { 0, "c", tZONE, 3*HOUR }, + { 0, "d", tZONE, 4*HOUR }, + { 0, "e", tZONE, 5*HOUR }, + { 0, "f", tZONE, 6*HOUR }, + { 0, "g", tZONE, 7*HOUR }, + { 0, "h", tZONE, 8*HOUR }, + { 0, "i", tZONE, 9*HOUR }, + { 0, "k", tZONE, 10*HOUR }, + { 0, "l", tZONE, 11*HOUR }, + { 0, "m", tZONE, 12*HOUR }, + { 0, "n", tZONE, -1*HOUR }, + { 0, "o", tZONE, -2*HOUR }, + { 0, "p", tZONE, -3*HOUR }, + { 0, "q", tZONE, -4*HOUR }, + { 0, "r", tZONE, -5*HOUR }, + { 0, "s", tZONE, -6*HOUR }, + { 0, "t", tZONE, -7*HOUR }, + { 0, "u", tZONE, -8*HOUR }, + { 0, "v", tZONE, -9*HOUR }, + { 0, "w", tZONE, -10*HOUR }, + { 0, "x", tZONE, -11*HOUR }, + { 0, "y", tZONE, -12*HOUR }, + { 0, "z", tZONE, 0*HOUR }, + + /* End of table. */ + { 0, NULL, 0, 0 } +}; + +/* + * Year is either: + * = A number from 0 to 99, which means a year from 1970 to 2069, or + * = The actual year (>=100). + */ +static time_t +Convert(time_t Month, time_t Day, time_t Year, + time_t Hours, time_t Minutes, time_t Seconds, + time_t Timezone, enum DSTMODE DSTmode) +{ + signed char DaysInMonth[12] = { + 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 + }; + time_t Julian; + int i; + struct tm *ltime; +#if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S) + struct tm tmbuf; +#endif + + if (Year < 69) + Year += 2000; + else if (Year < 100) + Year += 1900; + DaysInMonth[1] = Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0) + ? 29 : 28; + /* Checking for 2038 bogusly assumes that time_t is 32 bits. But + I'm too lazy to try to check for time_t overflow in another way. */ + if (Year < EPOCH || Year >= 2038 + || Month < 1 || Month > 12 + /* Lint fluff: "conversion from long may lose accuracy" */ + || Day < 1 || Day > DaysInMonth[(int)--Month] + || Hours < 0 || Hours > 23 + || Minutes < 0 || Minutes > 59 + || Seconds < 0 || Seconds > 59) + return -1; + + Julian = Day - 1; + for (i = 0; i < Month; i++) + Julian += DaysInMonth[i]; + for (i = EPOCH; i < Year; i++) + Julian += 365 + (i % 4 == 0); + Julian *= DAY; + Julian += Timezone; + Julian += Hours * HOUR + Minutes * MINUTE + Seconds; +#if defined(HAVE_LOCALTIME_S) + ltime = localtime_s(&tmbuf, &Julian) ? NULL : &tmbuf; +#elif defined(HAVE_LOCALTIME_R) + ltime = localtime_r(&Julian, &tmbuf); +#else + ltime = localtime(&Julian); +#endif + if (DSTmode == DSTon + || (DSTmode == DSTmaybe && ltime->tm_isdst)) + Julian -= HOUR; + return Julian; +} + +static time_t +DSTcorrect(time_t Start, time_t Future) +{ + time_t StartDay; + time_t FutureDay; + struct tm *ltime; +#if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S) + struct tm tmbuf; +#endif +#if defined(HAVE_LOCALTIME_S) + ltime = localtime_s(&tmbuf, &Start) ? NULL : &tmbuf; +#elif defined(HAVE_LOCALTIME_R) + ltime = localtime_r(&Start, &tmbuf); +#else + ltime = localtime(&Start); +#endif + StartDay = (ltime->tm_hour + 1) % 24; +#if defined(HAVE_LOCALTIME_S) + ltime = localtime_s(&tmbuf, &Future) ? NULL : &tmbuf; +#elif defined(HAVE_LOCALTIME_R) + ltime = localtime_r(&Future, &tmbuf); +#else + ltime = localtime(&Future); +#endif + FutureDay = (ltime->tm_hour + 1) % 24; + return (Future - Start) + (StartDay - FutureDay) * HOUR; +} + + +static time_t +RelativeDate(time_t Start, time_t zone, int dstmode, + time_t DayOrdinal, time_t DayNumber) +{ + struct tm *tm; + time_t t, now; +#if defined(HAVE_GMTIME_R) || defined(HAVE_GMTIME_S) + struct tm tmbuf; +#endif + + t = Start - zone; +#if defined(HAVE_GMTIME_S) + tm = gmtime_s(&tmbuf, &t) ? NULL : &tmbuf; +#elif defined(HAVE_GMTIME_R) + tm = gmtime_r(&t, &tmbuf); +#else + tm = gmtime(&t); +#endif + now = Start; + now += DAY * ((DayNumber - tm->tm_wday + 7) % 7); + now += 7 * DAY * (DayOrdinal <= 0 ? DayOrdinal : DayOrdinal - 1); + if (dstmode == DSTmaybe) + return DSTcorrect(Start, now); + return now - Start; +} + + +static time_t +RelativeMonth(time_t Start, time_t Timezone, time_t RelMonth) +{ + struct tm *tm; + time_t Month; + time_t Year; +#if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S) + struct tm tmbuf; +#endif + + if (RelMonth == 0) + return 0; +#if defined(HAVE_LOCALTIME_S) + tm = localtime_s(&tmbuf, &Start) ? NULL : &tmbuf; +#elif defined(HAVE_LOCALTIME_R) + tm = localtime_r(&Start, &tmbuf); +#else + tm = localtime(&Start); +#endif + Month = 12 * (tm->tm_year + 1900) + tm->tm_mon + RelMonth; + Year = Month / 12; + Month = Month % 12 + 1; + return DSTcorrect(Start, + Convert(Month, (time_t)tm->tm_mday, Year, + (time_t)tm->tm_hour, (time_t)tm->tm_min, (time_t)tm->tm_sec, + Timezone, DSTmaybe)); +} + +/* + * Parses and consumes an unsigned number. + * Returns 1 if any number is parsed. Otherwise, *value is unchanged. + */ +static char +consume_unsigned_number(const char **in, time_t *value) +{ + char c; + if (isdigit((unsigned char)(c = **in))) { + for (*value = 0; isdigit((unsigned char)(c = *(*in)++)); ) + *value = 10 * *value + c - '0'; + (*in)--; + return 1; + } + return 0; +} + +/* + * Tokenizer. + */ +static int +nexttoken(const char **in, time_t *value) +{ + char c; + char buff[64]; + + for ( ; ; ) { + while (isspace((unsigned char)**in)) + ++*in; + + /* Skip parenthesized comments. */ + if (**in == '(') { + int Count = 0; + do { + c = *(*in)++; + if (c == '\0') + return c; + if (c == '(') + Count++; + else if (c == ')') + Count--; + } while (Count > 0); + continue; + } + + /* Try the next token in the word table first. */ + /* This allows us to match "2nd", for example. */ + { + const char *src = *in; + const struct LEXICON *tp; + unsigned i = 0; + + /* Force to lowercase and strip '.' characters. */ + while (*src != '\0' + && (isalnum((unsigned char)*src) || *src == '.') + && i < sizeof(buff)-1) { + if (*src != '.') { + if (isupper((unsigned char)*src)) + buff[i++] = (char)tolower( + (unsigned char)*src); + else + buff[i++] = *src; + } + src++; + } + buff[i] = '\0'; + + /* + * Find the first match. If the word can be + * abbreviated, make sure we match at least + * the minimum abbreviation. + */ + for (tp = TimeWords; tp->name; tp++) { + size_t abbrev = tp->abbrev; + if (abbrev == 0) + abbrev = strlen(tp->name); + if (strlen(buff) >= abbrev + && strncmp(tp->name, buff, strlen(buff)) + == 0) { + /* Skip over token. */ + *in = src; + /* Return the match. */ + *value = tp->value; + return tp->type; + } + } + } + + /* + * Not in the word table, maybe it's a number. Note: + * Because '-' and '+' have other special meanings, I + * don't deal with signed numbers here. + */ + if (consume_unsigned_number(in, value)) { + return (tUNUMBER); + } + + return *(*in)++; + } +} + +#define TM_YEAR_ORIGIN 1900 + +/* Yield A - B, measured in seconds. */ +static long +difftm (struct tm *a, struct tm *b) +{ + int ay = a->tm_year + (TM_YEAR_ORIGIN - 1); + int by = b->tm_year + (TM_YEAR_ORIGIN - 1); + long days = ( + /* difference in day of year */ + a->tm_yday - b->tm_yday + /* + intervening leap days */ + + ((ay >> 2) - (by >> 2)) + - (ay/100 - by/100) + + ((ay/100 >> 2) - (by/100 >> 2)) + /* + difference in years * 365 */ + + (long)(ay-by) * 365 + ); + return (days * DAY + (a->tm_hour - b->tm_hour) * HOUR + + (a->tm_min - b->tm_min) * MINUTE + + (a->tm_sec - b->tm_sec)); +} + +/* + * Parses a Unix epoch timestamp (seconds). + * This supports a subset of what GNU tar accepts from black box testing, + * but covers common use cases. + */ +static time_t +parse_unix_epoch(const char *p) +{ + time_t epoch; + + /* may begin with + */ + if (*p == '+') { + p++; + } + + /* followed by some number */ + if (!consume_unsigned_number(&p, &epoch)) + return (time_t)-1; + + /* ...and nothing else */ + if (*p != '\0') + return (time_t)-1; + + return epoch; +} + +/* + * + * The public function. + * + * TODO: tokens[] array should be dynamically sized. + */ +time_t +archive_parse_date(time_t now, const char *p) +{ + struct token tokens[256]; + struct gdstate _gds; + struct token *lasttoken; + struct gdstate *gds; + struct tm local, *tm; + struct tm gmt, *gmt_ptr; + time_t Start; + time_t tod; + long tzone; + + /* + * @-prefixed Unix epoch timestamps (seconds) + * Skip the complex tokenizer - We do not want to accept strings like "@tenth" + */ + if (*p == '@') + return parse_unix_epoch(p + 1); + + /* Clear out the parsed token array. */ + memset(tokens, 0, sizeof(tokens)); + /* Initialize the parser state. */ + memset(&_gds, 0, sizeof(_gds)); + gds = &_gds; + + /* Look up the current time. */ +#if defined(HAVE_LOCALTIME_S) + tm = localtime_s(&local, &now) ? NULL : &local; +#elif defined(HAVE_LOCALTIME_R) + tm = localtime_r(&now, &local); +#else + memset(&local, 0, sizeof(local)); + tm = localtime(&now); +#endif + if (tm == NULL) + return -1; +#if !defined(HAVE_LOCALTIME_R) && !defined(HAVE_LOCALTIME_S) + local = *tm; +#endif + + /* Look up UTC if we can and use that to determine the current + * timezone offset. */ +#if defined(HAVE_GMTIME_S) + gmt_ptr = gmtime_s(&gmt, &now) ? NULL : &gmt; +#elif defined(HAVE_GMTIME_R) + gmt_ptr = gmtime_r(&now, &gmt); +#else + memset(&gmt, 0, sizeof(gmt)); + gmt_ptr = gmtime(&now); + if (gmt_ptr != NULL) { + /* Copy, in case localtime and gmtime use the same buffer. */ + gmt = *gmt_ptr; + } +#endif + if (gmt_ptr != NULL) + tzone = difftm (&gmt, &local); + else + /* This system doesn't understand timezones; fake it. */ + tzone = 0; + if(local.tm_isdst) + tzone += HOUR; + + /* Tokenize the input string. */ + lasttoken = tokens; + while ((lasttoken->token = nexttoken(&p, &lasttoken->value)) != 0) { + ++lasttoken; + if (lasttoken > tokens + 255) + return -1; + } + gds->tokenp = tokens; + + /* Match phrases until we run out of input tokens. */ + while (gds->tokenp < lasttoken) { + if (!phrase(gds)) + return -1; + } + + /* Use current local timezone if none was specified. */ + if (!gds->HaveZone) { + gds->Timezone = tzone; + gds->DSTmode = DSTmaybe; + } + + /* If a timezone was specified, use that for generating the default + * time components instead of the local timezone. */ + if (gds->HaveZone && gmt_ptr != NULL) { + now -= gds->Timezone; +#if defined(HAVE_GMTIME_S) + gmt_ptr = gmtime_s(&gmt, &now) ? NULL : &gmt; +#elif defined(HAVE_GMTIME_R) + gmt_ptr = gmtime_r(&now, &gmt); +#else + gmt_ptr = gmtime(&now); +#endif + if (gmt_ptr != NULL) + local = *gmt_ptr; + now += gds->Timezone; + } + + if (!gds->HaveYear) + gds->Year = local.tm_year + 1900; + if (!gds->HaveMonth) + gds->Month = local.tm_mon + 1; + if (!gds->HaveDay) + gds->Day = local.tm_mday; + /* Note: No default for hour/min/sec; a specifier that just + * gives date always refers to 00:00 on that date. */ + + /* If we saw more than one time, timezone, weekday, year, month, + * or day, then give up. */ + if (gds->HaveTime > 1 || gds->HaveZone > 1 || gds->HaveWeekDay > 1 + || gds->HaveYear > 1 || gds->HaveMonth > 1 || gds->HaveDay > 1) + return -1; + + /* Compute an absolute time based on whatever absolute information + * we collected. */ + if (gds->HaveYear || gds->HaveMonth || gds->HaveDay + || gds->HaveTime || gds->HaveWeekDay) { + Start = Convert(gds->Month, gds->Day, gds->Year, + gds->Hour, gds->Minutes, gds->Seconds, + gds->Timezone, gds->DSTmode); + if (Start < 0) + return -1; + } else { + Start = now; + if (!gds->HaveRel) + Start -= local.tm_hour * HOUR + local.tm_min * MINUTE + + local.tm_sec; + } + + /* Add the relative offset. */ + Start += gds->RelSeconds; + Start += RelativeMonth(Start, gds->Timezone, gds->RelMonth); + + /* Adjust for day-of-week offsets. */ + if (gds->HaveWeekDay + && !(gds->HaveYear || gds->HaveMonth || gds->HaveDay)) { + tod = RelativeDate(Start, gds->Timezone, + gds->DSTmode, gds->DayOrdinal, gds->DayNumber); + Start += tod; + } + + /* -1 is an error indicator, so return 0 instead of -1 if + * that's the actual time. */ + return Start == -1 ? 0 : Start; +} + + +#if defined(TEST) + +/* ARGSUSED */ +int +main(int argc, char **argv) +{ + time_t d; + time_t now = time(NULL); + + while (*++argv != NULL) { + (void)printf("Input: %s\n", *argv); + d = get_date(now, *argv); + if (d == -1) + (void)printf("Bad format - couldn't convert.\n"); + else + (void)printf("Output: %s\n", ctime(&d)); + } + exit(0); + /* NOTREACHED */ +} +#endif /* defined(TEST) */ --- contrib/libarchive/libarchive/archive_platform.h.orig +++ contrib/libarchive/libarchive/archive_platform.h @@ -61,6 +61,11 @@ # endif #endif +/* For cygwin, to avoid missing LONG, ULONG, PUCHAR, ... definitions */ +#ifdef __CYGWIN__ +#include +#endif + /* It should be possible to get rid of this by extending the feature-test * macros to cover Windows API functions, probably along with non-trivial * refactoring of code to find structures that sit more cleanly on top of --- contrib/libarchive/libarchive/archive_platform_acl.h.orig +++ contrib/libarchive/libarchive/archive_platform_acl.h @@ -50,4 +50,4 @@ #define ARCHIVE_ACL_SUPPORT 1 #endif -#endif /* ARCHIVE_PLATFORM_ACL_H_INCLUDED */ +#endif /* !ARCHIVE_PLATFORM_ACL_H_INCLUDED */ --- contrib/libarchive/libarchive/archive_platform_xattr.h.orig +++ contrib/libarchive/libarchive/archive_platform_xattr.h @@ -42,4 +42,4 @@ #define ARCHIVE_XATTR_SUPPORT 1 #endif -#endif /* ARCHIVE_PLATFORM_XATTR_H_INCLUDED */ +#endif /* !ARCHIVE_PLATFORM_XATTR_H_INCLUDED */ --- contrib/libarchive/libarchive/archive_ppmd7.c.orig +++ contrib/libarchive/libarchive/archive_ppmd7.c @@ -287,9 +287,14 @@ return AllocUnitsRare(p, indx); } -#define MyMem12Cpy(dest, src, num) \ - { UInt32 *d = (UInt32 *)dest; const UInt32 *s = (const UInt32 *)src; UInt32 n = num; \ - do { d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; s += 3; d += 3; } while(--n); } +#define MyMem12Cpy(dest, src, num) do { \ + UInt32 *d = (UInt32 *)dest; \ + const UInt32 *s = (const UInt32 *)src; \ + UInt32 n = num; \ + do { \ + d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; s += 3; d += 3; \ + } while(--n); \ +} while (0) static void *ShrinkUnits(CPpmd7 *p, void *oldPtr, unsigned oldNU, unsigned newNU) { --- contrib/libarchive/libarchive/archive_ppmd8.c.orig +++ contrib/libarchive/libarchive/archive_ppmd8.c @@ -242,9 +242,14 @@ return AllocUnitsRare(p, indx); } -#define MyMem12Cpy(dest, src, num) \ - { UInt32 *d = (UInt32 *)dest; const UInt32 *z = (const UInt32 *)src; UInt32 n = num; \ - do { d[0] = z[0]; d[1] = z[1]; d[2] = z[2]; z += 3; d += 3; } while (--n); } +#define MyMem12Cpy(dest, src, num) do { \ + UInt32 *d = (UInt32 *)dest; \ + const UInt32 *z = (const UInt32 *)src; \ + UInt32 n = num; \ + do { \ + d[0] = z[0]; d[1] = z[1]; d[2] = z[2]; z += 3; d += 3; \ + } while (--n); \ +} while (0) static void *ShrinkUnits(CPpmd8 *p, void *oldPtr, unsigned oldNU, unsigned newNU) { @@ -341,7 +346,9 @@ (p)->SuccessorHigh = (UInt16)(((UInt32)(v) >> 16) & 0xFFFF); } -#define RESET_TEXT(offs) { p->Text = p->Base + p->AlignOffset + (offs); } +#define RESET_TEXT(offs) do { \ + p->Text = p->Base + p->AlignOffset + (offs); \ +} while (0) static void RestartModel(CPpmd8 *p) { --- contrib/libarchive/libarchive/archive_ppmd_private.h.orig +++ contrib/libarchive/libarchive/archive_ppmd_private.h @@ -109,8 +109,12 @@ Byte Count; /* Count to next change of Shift */ } CPpmd_See; -#define Ppmd_See_Update(p) if ((p)->Shift < PPMD_PERIOD_BITS && --(p)->Count == 0) \ - { (p)->Summ <<= 1; (p)->Count = (Byte)(3 << (p)->Shift++); } +#define Ppmd_See_Update(p) do { \ + if ((p)->Shift < PPMD_PERIOD_BITS && --(p)->Count == 0) { \ + (p)->Summ <<= 1; \ + (p)->Count = (Byte)(3 << (p)->Shift++); \ + } \ +} while (0) typedef struct { @@ -144,8 +148,12 @@ #endif CPpmd_Byte_Ref; -#define PPMD_SetAllBitsIn256Bytes(p) \ - { unsigned j; for (j = 0; j < 256 / sizeof(p[0]); j += 8) { \ - p[j+7] = p[j+6] = p[j+5] = p[j+4] = p[j+3] = p[j+2] = p[j+1] = p[j+0] = ~(size_t)0; }} +#define PPMD_SetAllBitsIn256Bytes(p) do { \ + unsigned j; \ + for (j = 0; j < 256 / sizeof(p[0]); j += 8) { \ + p[j+7] = p[j+6] = p[j+5] = p[j+4] = \ + p[j+3] = p[j+2] = p[j+1] = p[j+0] = ~(size_t)0; \ + } \ +} while (0) #endif --- contrib/libarchive/libarchive/archive_random_private.h.orig +++ contrib/libarchive/libarchive/archive_random_private.h @@ -33,4 +33,4 @@ /* Random number generator. */ int archive_random(void *buf, size_t nbytes); -#endif /* ARCHIVE_RANDOM_PRIVATE_H_INCLUDED */ +#endif /* !ARCHIVE_RANDOM_PRIVATE_H_INCLUDED */ --- contrib/libarchive/libarchive/archive_rb.h.orig +++ contrib/libarchive/libarchive/archive_rb.h @@ -110,4 +110,4 @@ __archive_rb_tree_iterate(struct archive_rb_tree *, struct archive_rb_node *, const unsigned int); -#endif /* ARCHIVE_RB_H_*/ +#endif /* !ARCHIVE_RB_H_INCLUDED */ --- contrib/libarchive/libarchive/archive_read.c.orig +++ contrib/libarchive/libarchive/archive_read.c @@ -176,15 +176,9 @@ return 0; if (self->archive->client.skipper != NULL) { - /* Seek requests over 1GiB are broken down into - * multiple seeks. This avoids overflows when the - * requests get passed through 32-bit arguments. */ - int64_t skip_limit = (int64_t)1 << 30; int64_t total = 0; for (;;) { int64_t get, ask = request; - if (ask > skip_limit) - ask = skip_limit; get = (self->archive->client.skipper) (&self->archive->archive, self->data, ask); total += get; --- contrib/libarchive/libarchive/archive_read_append_filter.c.orig +++ contrib/libarchive/libarchive/archive_read_append_filter.c @@ -96,6 +96,10 @@ strcpy(str, "lzip"); r1 = archive_read_support_filter_lzip(_a); break; + case ARCHIVE_FILTER_LZOP: + strcpy(str, "lzop"); + r1 = archive_read_support_filter_lzop(_a); + break; case ARCHIVE_FILTER_LRZIP: strcpy(str, "lrzip"); r1 = archive_read_support_filter_lrzip(_a); --- contrib/libarchive/libarchive/archive_read_disk_entry_from_file.c.orig +++ contrib/libarchive/libarchive/archive_read_disk_entry_from_file.c @@ -888,7 +888,7 @@ count = (sizeof(buff) - sizeof(*fm))/sizeof(*fe); fm = (struct fiemap *)buff; fm->fm_start = 0; - fm->fm_length = ~0ULL;; + fm->fm_length = ~0ULL; fm->fm_flags = FIEMAP_FLAG_SYNC; fm->fm_extent_count = count; do_fiemap = 1; --- contrib/libarchive/libarchive/archive_read_disk_posix.c.orig +++ contrib/libarchive/libarchive/archive_read_disk_posix.c @@ -276,7 +276,7 @@ #endif /* Initiate/terminate a tree traversal. */ -static struct tree *tree_open(const char *, int, int); +static struct tree *tree_open(const char *, char, int); static struct tree *tree_reopen(struct tree *, const char *, int); static void tree_close(struct tree *); static void tree_free(struct tree *); @@ -514,7 +514,7 @@ static void setup_symlink_mode(struct archive_read_disk *a, char symlink_mode, - int follow_symlinks) + char follow_symlinks) { a->symlink_mode = symlink_mode; a->follow_symlinks = follow_symlinks; @@ -778,7 +778,8 @@ */ if (t->current_sparse->offset > t->entry_total) { if (lseek(t->entry_fd, - (off_t)t->current_sparse->offset, SEEK_SET) < 0) { + (off_t)t->current_sparse->offset, SEEK_SET) != + t->current_sparse->offset) { archive_set_error(&a->archive, errno, "Seek error"); r = ARCHIVE_FATAL; a->archive.state = ARCHIVE_STATE_FATAL; @@ -2180,7 +2181,7 @@ * Open a directory tree for traversal. */ static struct tree * -tree_open(const char *path, int symlink_mode, int restore_time) +tree_open(const char *path, char symlink_mode, int restore_time) { struct tree *t; --- contrib/libarchive/libarchive/archive_read_disk_private.h.orig +++ contrib/libarchive/libarchive/archive_read_disk_private.h @@ -52,10 +52,11 @@ /* * Since symlink interaction changes, we need to track whether - * we're following symlinks for the current item. 'L' mode above - * sets this true, 'P' sets it false, 'H' changes it as we traverse. + * we're following symlinks for the current item, governed by the above + * symlink_mode. 'L' sets this true, 'P' sets it false, 'H' changes it + * as we traverse. */ - char follow_symlinks; /* Either 'L' or 'P'. */ + char follow_symlinks; /* Either 0 or 1. */ /* Directory traversals. */ struct tree *tree; --- contrib/libarchive/libarchive/archive_read_format.3.orig +++ contrib/libarchive/libarchive/archive_read_format.3 @@ -37,8 +37,10 @@ .Nm archive_read_support_format_lha , .Nm archive_read_support_format_mtree , .Nm archive_read_support_format_rar , +.Nm archive_read_support_format_rar5 , .Nm archive_read_support_format_raw , .Nm archive_read_support_format_tar , +.Nm archive_read_support_format_warc , .Nm archive_read_support_format_xar , .Nm archive_read_support_format_zip .Nd functions for reading streaming archives @@ -70,10 +72,14 @@ .Ft int .Fn archive_read_support_format_rar "struct archive *" .Ft int +.Fn archive_read_support_format_rar5 "struct archive *" +.Ft int .Fn archive_read_support_format_raw "struct archive *" .Ft int .Fn archive_read_support_format_tar "struct archive *" .Ft int +.Fn archive_read_support_format_warc "struct archive *" +.Ft int .Fn archive_read_support_format_xar "struct archive *" .Ft int .Fn archive_read_support_format_zip "struct archive *" @@ -89,8 +95,10 @@ .Fn archive_read_support_format_lha , .Fn archive_read_support_format_mtree , .Fn archive_read_support_format_rar , +.Fn archive_read_support_format_rar5 , .Fn archive_read_support_format_raw , .Fn archive_read_support_format_tar , +.Fn archive_read_support_format_warc , .Fn archive_read_support_format_xar , .Fn archive_read_support_format_zip .Xc @@ -100,6 +108,13 @@ .Fn archive_read_support_format_tar enables support for a variety of standard tar formats, old-style tar, ustar, pax interchange format, and many common variants. +.Fn archive_read_support_format_zip +enables support for both the streaming and the seeking zip readers, +which can separately be enabled by respectively +.Fn archive_read_support_format_zip_streamable +and +.Fn archive_read_support_format_zip_seekable +. .It Fn archive_read_support_format_all Enables support for all available formats except the .Dq raw --- contrib/libarchive/libarchive/archive_read_open_fd.c.orig +++ contrib/libarchive/libarchive/archive_read_open_fd.c @@ -52,6 +52,7 @@ struct read_fd_data { int fd; size_t block_size; + int64_t size; char use_lseek; void *buffer; }; @@ -95,6 +96,7 @@ if (S_ISREG(st.st_mode)) { archive_read_extract_set_skip_file(a, st.st_dev, st.st_ino); mine->use_lseek = 1; + mine->size = st.st_size; } #if defined(__CYGWIN__) || defined(_WIN32) setmode(mine->fd, O_BINARY); @@ -131,7 +133,7 @@ file_skip(struct archive *a, void *client_data, int64_t request) { struct read_fd_data *mine = (struct read_fd_data *)client_data; - int64_t skip = request; + off_t skip = (off_t)request; int64_t old_offset, new_offset; int skip_bits = sizeof(skip) * 8 - 1; /* off_t is a signed type. */ @@ -140,20 +142,25 @@ /* Reduce a request that would overflow the 'skip' variable. */ if (sizeof(request) > sizeof(skip)) { - int64_t max_skip = + const int64_t max_skip = (((int64_t)1 << (skip_bits - 1)) - 1) * 2 + 1; if (request > max_skip) - skip = max_skip; + skip = (off_t)max_skip; } - /* Reduce request to the next smallest multiple of block_size */ - request = (request / mine->block_size) * mine->block_size; - if (request == 0) + /* Reduce 'skip' to the next smallest multiple of block_size */ + skip = (off_t)(((int64_t)skip / mine->block_size) * mine->block_size); + if (skip == 0) return (0); - if (((old_offset = lseek(mine->fd, 0, SEEK_CUR)) >= 0) && - ((new_offset = lseek(mine->fd, skip, SEEK_CUR)) >= 0)) - return (new_offset - old_offset); + if ((old_offset = lseek(mine->fd, 0, SEEK_CUR)) >= 0) { + if (old_offset >= mine->size || + skip > mine->size - old_offset) { + /* Do not seek past end of file. */ + errno = ESPIPE; + } else if ((new_offset = lseek(mine->fd, skip, SEEK_CUR)) >= 0) + return (new_offset - old_offset); + } /* If seek failed once, it will probably fail again. */ mine->use_lseek = 0; @@ -178,11 +185,24 @@ file_seek(struct archive *a, void *client_data, int64_t request, int whence) { struct read_fd_data *mine = (struct read_fd_data *)client_data; + off_t seek = (off_t)request; int64_t r; + int seek_bits = sizeof(seek) * 8 - 1; /* off_t is a signed type. */ /* We use off_t here because lseek() is declared that way. */ - /* See above for notes about when off_t is less than 64 bits. */ - r = lseek(mine->fd, request, whence); + + /* Reduce a request that would overflow the 'seek' variable. */ + if (sizeof(request) > sizeof(seek)) { + const int64_t max_seek = + (((int64_t)1 << (seek_bits - 1)) - 1) * 2 + 1; + const int64_t min_seek = ~max_seek; + if (request > max_seek) + seek = (off_t)max_seek; + else if (request < min_seek) + seek = (off_t)min_seek; + } + + r = lseek(mine->fd, seek, whence); if (r >= 0) return r; --- contrib/libarchive/libarchive/archive_read_open_file.c.orig +++ contrib/libarchive/libarchive/archive_read_open_file.c @@ -52,13 +52,15 @@ struct read_FILE_data { FILE *f; size_t block_size; + int64_t size; void *buffer; char can_skip; }; -static int file_close(struct archive *, void *); -static ssize_t file_read(struct archive *, void *, const void **buff); -static int64_t file_skip(struct archive *, void *, int64_t request); +static int FILE_close(struct archive *, void *); +static ssize_t FILE_read(struct archive *, void *, const void **buff); +static int64_t FILE_seek(struct archive *, void *, int64_t, int); +static int64_t FILE_skip(struct archive *, void *, int64_t); int archive_read_open_FILE(struct archive *a, FILE *f) @@ -69,7 +71,7 @@ void *b; archive_clear_error(a); - mine = malloc(sizeof(*mine)); + mine = calloc(1, sizeof(*mine)); b = malloc(block_size); if (mine == NULL || b == NULL) { archive_set_error(a, ENOMEM, "No memory"); @@ -90,22 +92,23 @@ archive_read_extract_set_skip_file(a, st.st_dev, st.st_ino); /* Enable the seek optimization only for regular files. */ mine->can_skip = 1; - } else - mine->can_skip = 0; + mine->size = st.st_size; + } #if defined(__CYGWIN__) || defined(_WIN32) setmode(fileno(mine->f), O_BINARY); #endif - archive_read_set_read_callback(a, file_read); - archive_read_set_skip_callback(a, file_skip); - archive_read_set_close_callback(a, file_close); + archive_read_set_read_callback(a, FILE_read); + archive_read_set_skip_callback(a, FILE_skip); + archive_read_set_seek_callback(a, FILE_seek); + archive_read_set_close_callback(a, FILE_close); archive_read_set_callback_data(a, mine); return (archive_read_open1(a)); } static ssize_t -file_read(struct archive *a, void *client_data, const void **buff) +FILE_read(struct archive *a, void *client_data, const void **buff) { struct read_FILE_data *mine = (struct read_FILE_data *)client_data; size_t bytes_read; @@ -119,16 +122,17 @@ } static int64_t -file_skip(struct archive *a, void *client_data, int64_t request) +FILE_skip(struct archive *a, void *client_data, int64_t request) { struct read_FILE_data *mine = (struct read_FILE_data *)client_data; -#if HAVE_FSEEKO - off_t skip = (off_t)request; -#elif HAVE__FSEEKI64 +#if HAVE__FSEEKI64 int64_t skip = request; +#elif HAVE_FSEEKO + off_t skip = (off_t)request; #else long skip = (long)request; #endif + int64_t old_offset, new_offset = -1; int skip_bits = sizeof(skip) * 8 - 1; (void)a; /* UNUSED */ @@ -144,7 +148,7 @@ /* If request is too big for a long or an off_t, reduce it. */ if (sizeof(request) > sizeof(skip)) { - int64_t max_skip = + const int64_t max_skip = (((int64_t)1 << (skip_bits - 1)) - 1) * 2 + 1; if (request > max_skip) skip = max_skip; @@ -152,23 +156,92 @@ #ifdef __ANDROID__ /* fileno() isn't safe on all platforms ... see above. */ - if (lseek(fileno(mine->f), skip, SEEK_CUR) < 0) + old_offset = lseek(fileno(mine->f), 0, SEEK_CUR); #elif HAVE__FSEEKI64 - if (_fseeki64(mine->f, skip, SEEK_CUR) != 0) + old_offset = _ftelli64(mine->f); #elif HAVE_FSEEKO - if (fseeko(mine->f, skip, SEEK_CUR) != 0) + old_offset = ftello(mine->f); #else - if (fseek(mine->f, skip, SEEK_CUR) != 0) + old_offset = ftell(mine->f); #endif - { - mine->can_skip = 0; - return (0); + if (old_offset >= 0) { + if (old_offset < mine->size && + skip <= mine->size - old_offset) { +#ifdef __ANDROID__ + new_offset = lseek(fileno(mine->f), skip, SEEK_CUR); +#elif HAVE__FSEEKI64 + if (_fseeki64(mine->f, skip, SEEK_CUR) == 0) + new_offset = _ftelli64(mine->f); +#elif HAVE_FSEEKO + if (fseeko(mine->f, skip, SEEK_CUR) == 0) + new_offset = ftello(mine->f); +#else + if (fseek(mine->f, skip, SEEK_CUR) == 0) + new_offset = ftell(mine->f); +#endif + if (new_offset >= 0) + return (new_offset - old_offset); + } + } + + mine->can_skip = 0; + return (0); +} + +/* + * TODO: Store the offset and use it in the read callback. + */ +static int64_t +FILE_seek(struct archive *a, void *client_data, int64_t request, int whence) +{ + struct read_FILE_data *mine = (struct read_FILE_data *)client_data; +#if HAVE__FSEEKI64 + int64_t seek = request; +#elif HAVE_FSEEKO + off_t seek = (off_t)request; +#else + long seek = (long)request; +#endif + int seek_bits = sizeof(seek) * 8 - 1; + (void)a; /* UNUSED */ + + /* Reduce a request that would overflow the 'seek' variable. */ + if (sizeof(request) > sizeof(seek)) { + const int64_t max_seek = + (((int64_t)1 << (seek_bits - 1)) - 1) * 2 + 1; + const int64_t min_seek = ~max_seek; + if (request > max_seek) + seek = max_seek; + else if (request < min_seek) + seek = min_seek; } - return (request); + +#ifdef __ANDROID__ + /* Newer Android versions have fseeko...to meditate. */ + int64_t ret = lseek(fileno(mine->f), seek, whence); + if (ret >= 0) { + return ret; + } +#elif HAVE__FSEEKI64 + if (_fseeki64(mine->f, seek, whence) == 0) { + return _ftelli64(mine->f); + } +#elif HAVE_FSEEKO + if (fseeko(mine->f, seek, whence) == 0) { + return ftello(mine->f); + } +#else + if (fseek(mine->f, seek, whence) == 0) { + return ftell(mine->f); + } +#endif + /* If we arrive here, the input is corrupted or truncated so fail. */ + archive_set_error(a, errno, "Error seeking in FILE* pointer"); + return (ARCHIVE_FATAL); } static int -file_close(struct archive *a, void *client_data) +FILE_close(struct archive *a, void *client_data) { struct read_FILE_data *mine = (struct read_FILE_data *)client_data; --- contrib/libarchive/libarchive/archive_read_open_filename.c.orig +++ contrib/libarchive/libarchive/archive_read_open_filename.c @@ -74,6 +74,7 @@ size_t block_size; void *buffer; mode_t st_mode; /* Mode bits for opened file. */ + int64_t size; char use_lseek; enum fnt_e { FNT_STDIN, FNT_MBS, FNT_WCS } filename_type; union { @@ -303,7 +304,7 @@ } if (fd < 0) { archive_set_error(a, errno, - "Failed to open '%S'", wfilename); + "Failed to open '%ls'", wfilename); return (ARCHIVE_FATAL); } #else @@ -315,7 +316,7 @@ if (fstat(fd, &st) != 0) { #if defined(_WIN32) && !defined(__CYGWIN__) if (mine->filename_type == FNT_WCS) - archive_set_error(a, errno, "Can't stat '%S'", + archive_set_error(a, errno, "Can't stat '%ls'", wfilename); else #endif @@ -400,8 +401,10 @@ mine->st_mode = st.st_mode; /* Disk-like inputs can use lseek(). */ - if (is_disk_like) + if (is_disk_like) { mine->use_lseek = 1; + mine->size = st.st_size; + } return (ARCHIVE_OK); fail: @@ -447,7 +450,7 @@ "Error reading '%s'", mine->filename.m); else archive_set_error(a, errno, - "Error reading '%S'", mine->filename.w); + "Error reading '%ls'", mine->filename.w); } return (bytes_read); } @@ -479,21 +482,30 @@ struct read_file_data *mine = (struct read_file_data *)client_data; #if defined(_WIN32) && !defined(__CYGWIN__) /* We use _lseeki64() on Windows. */ - int64_t old_offset, new_offset; + int64_t old_offset, new_offset, skip = request; #else - off_t old_offset, new_offset; + off_t old_offset, new_offset, skip = (off_t)request; #endif + int skip_bits = sizeof(skip) * 8 - 1; /* We use off_t here because lseek() is declared that way. */ - /* TODO: Deal with case where off_t isn't 64 bits. - * This shouldn't be a problem on Linux or other POSIX - * systems, since the configuration logic for libarchive - * tries to obtain a 64-bit off_t. - */ - if ((old_offset = lseek(mine->fd, 0, SEEK_CUR)) >= 0 && - (new_offset = lseek(mine->fd, request, SEEK_CUR)) >= 0) - return (new_offset - old_offset); + /* Reduce a request that would overflow the 'skip' variable. */ + if (sizeof(request) > sizeof(skip)) { + const int64_t max_skip = + (((int64_t)1 << (skip_bits - 1)) - 1) * 2 + 1; + if (request > max_skip) + skip = max_skip; + } + + if ((old_offset = lseek(mine->fd, 0, SEEK_CUR)) >= 0) { + if (old_offset >= mine->size || + skip > mine->size - old_offset) { + /* Do not seek past end of file. */ + errno = ESPIPE; + } else if ((new_offset = lseek(mine->fd, skip, SEEK_CUR)) >= 0) + return (new_offset - old_offset); + } /* If lseek() fails, don't bother trying again. */ mine->use_lseek = 0; @@ -509,7 +521,7 @@ archive_set_error(a, errno, "Error seeking in '%s'", mine->filename.m); else - archive_set_error(a, errno, "Error seeking in '%S'", + archive_set_error(a, errno, "Error seeking in '%ls'", mine->filename.w); return (-1); } @@ -540,11 +552,24 @@ file_seek(struct archive *a, void *client_data, int64_t request, int whence) { struct read_file_data *mine = (struct read_file_data *)client_data; + off_t seek = (off_t)request; int64_t r; + int seek_bits = sizeof(seek) * 8 - 1; /* We use off_t here because lseek() is declared that way. */ - /* See above for notes about when off_t is less than 64 bits. */ - r = lseek(mine->fd, request, whence); + + /* Reduce a request that would overflow the 'seek' variable. */ + if (sizeof(request) > sizeof(seek)) { + const int64_t max_seek = + (((int64_t)1 << (seek_bits - 1)) - 1) * 2 + 1; + const int64_t min_seek = ~max_seek; + if (request > max_seek) + seek = (off_t)max_seek; + else if (request < min_seek) + seek = (off_t)min_seek; + } + + r = lseek(mine->fd, seek, whence); if (r >= 0) return r; @@ -555,7 +580,7 @@ archive_set_error(a, errno, "Error seeking in '%s'", mine->filename.m); else - archive_set_error(a, errno, "Error seeking in '%S'", + archive_set_error(a, errno, "Error seeking in '%ls'", mine->filename.w); return (ARCHIVE_FATAL); } --- contrib/libarchive/libarchive/archive_read_support_filter_by_code.c.orig +++ contrib/libarchive/libarchive/archive_read_support_filter_by_code.c @@ -37,46 +37,32 @@ switch (filter_code) { case ARCHIVE_FILTER_NONE: return archive_read_support_filter_none(a); - break; case ARCHIVE_FILTER_GZIP: return archive_read_support_filter_gzip(a); - break; case ARCHIVE_FILTER_BZIP2: return archive_read_support_filter_bzip2(a); - break; case ARCHIVE_FILTER_COMPRESS: return archive_read_support_filter_compress(a); - break; case ARCHIVE_FILTER_LZMA: return archive_read_support_filter_lzma(a); - break; case ARCHIVE_FILTER_XZ: return archive_read_support_filter_xz(a); - break; case ARCHIVE_FILTER_UU: return archive_read_support_filter_uu(a); - break; case ARCHIVE_FILTER_RPM: return archive_read_support_filter_rpm(a); - break; case ARCHIVE_FILTER_LZIP: return archive_read_support_filter_lzip(a); - break; case ARCHIVE_FILTER_LRZIP: return archive_read_support_filter_lrzip(a); - break; case ARCHIVE_FILTER_LZOP: return archive_read_support_filter_lzop(a); - break; case ARCHIVE_FILTER_GRZIP: return archive_read_support_filter_grzip(a); - break; case ARCHIVE_FILTER_LZ4: return archive_read_support_filter_lz4(a); - break; case ARCHIVE_FILTER_ZSTD: return archive_read_support_filter_zstd(a); - break; } return (ARCHIVE_FATAL); } --- contrib/libarchive/libarchive/archive_read_support_filter_compress.c.orig +++ contrib/libarchive/libarchive/archive_read_support_filter_compress.c @@ -328,6 +328,7 @@ static int debug_buff[1024]; static unsigned debug_index; +again: code = newcode = getbits(self, state->bits); if (code < 0) return (code); @@ -360,7 +361,7 @@ state->section_end_code = (1 << state->bits) - 1; state->free_ent = 257; state->oldcode = -1; - return (next_code(self)); + goto again; } if (code > state->free_ent --- contrib/libarchive/libarchive/archive_read_support_filter_lz4.c.orig +++ contrib/libarchive/libarchive/archive_read_support_filter_lz4.c @@ -323,7 +323,6 @@ archive_set_error(&self->archive->archive, ARCHIVE_ERRNO_MISC, "Program error."); return (ARCHIVE_FATAL); - break; } while (state->stage == SELECT_STREAM) { --- contrib/libarchive/libarchive/archive_read_support_format_7zip.c.orig +++ contrib/libarchive/libarchive/archive_read_support_format_7zip.c @@ -28,6 +28,9 @@ #ifdef HAVE_ERRNO_H #include #endif +#if HAVE_STDINT_H +#include +#endif #ifdef HAVE_STDLIB_H #include #endif @@ -50,6 +53,7 @@ #include "archive_ppmd7_private.h" #include "archive_private.h" #include "archive_read_private.h" +#include "archive_time_private.h" #include "archive_endian.h" #ifndef HAVE_ZLIB_H @@ -59,7 +63,26 @@ #define _7ZIP_SIGNATURE "7z\xBC\xAF\x27\x1C" #define SFX_MIN_ADDR 0x27000 #define SFX_MAX_ADDR 0x60000 +#define SFX_MAX_OFFSET (SFX_MAX_ADDR - SFX_MIN_ADDR) +/* + * PE format + */ +#define PE_DOS_HDR_LEN 0x40 +#define PE_DOS_HDR_ELFANEW_OFFSET 0x3c +#define PE_COFF_HDR_LEN 0x18 +#define PE_COFF_HDR_SEC_CNT_OFFSET 0x6 +#define PE_COFF_HDR_OPT_SZ_OFFSET 0x14 +#define PE_SEC_HDR_LEN 0x28 +#define PE_SEC_HDR_RAW_ADDR_OFFSET 0x14 +#define PE_SEC_HDR_RAW_SZ_OFFSET 0x10 + +/* + * ELF format + */ +#define ELF_HDR_MIN_LEN 0x34 +#define ELF_HDR_EI_CLASS_OFFSET 0x04 +#define ELF_HDR_EI_DATA_OFFSET 0x05 /* * Codec ID @@ -83,6 +106,7 @@ #define _7Z_ARM 0x03030501 #define _7Z_ARMTHUMB 0x03030701 #define _7Z_ARM64 0xa +#define _7Z_RISCV 0xb #define _7Z_SPARC 0x03030805 #define _7Z_ZSTD 0x4F71101 /* Copied from https://github.com/mcmilk/7-Zip-zstd.git */ @@ -144,7 +168,6 @@ uint32_t *digests; }; - struct _7z_folder { uint64_t numCoders; struct _7z_coder { @@ -224,13 +247,13 @@ #define CRC32_IS_SET (1<<3) #define HAS_STREAM (1<<4) - time_t mtime; - time_t atime; - time_t ctime; - long mtime_ns; - long atime_ns; - long ctime_ns; - uint32_t mode; + int64_t mtime; + int64_t atime; + int64_t ctime; + uint32_t mtime_ns; + uint32_t atime_ns; + uint32_t ctime_ns; + __LA_MODE_T mode; uint32_t attr; }; @@ -388,7 +411,6 @@ static int decompress(struct archive_read *, struct _7zip *, void *, size_t *, const void *, size_t *); static ssize_t extract_pack_stream(struct archive_read *, size_t); -static void fileTimeToUtc(uint64_t, time_t *, long *); static uint64_t folder_uncompressed_size(struct _7z_folder *); static void free_CodersInfo(struct _7z_coders_info *); static void free_Digest(struct _7z_digests *); @@ -424,7 +446,9 @@ size_t); static int seek_pack(struct archive_read *); static int64_t skip_stream(struct archive_read *, size_t); -static int skip_sfx(struct archive_read *, ssize_t); +static int skip_sfx(struct archive_read *, const ssize_t); +static ssize_t find_pe_overlay(struct archive_read *); +static ssize_t find_elf_data_sec(struct archive_read *); static int slurp_central_directory(struct archive_read *, struct _7zip *, struct _7z_header_info *); static int setup_decode_folder(struct archive_read *, struct _7z_folder *, @@ -435,6 +459,8 @@ static size_t arm_Convert(struct _7zip *, uint8_t *, size_t); static size_t arm64_Convert(struct _7zip *, uint8_t *, size_t); static ssize_t Bcj2_Decode(struct _7zip *, uint8_t *, size_t); +static size_t sparc_Convert(struct _7zip *, uint8_t *, size_t); +static size_t powerpc_Convert(struct _7zip *, uint8_t *, size_t); int @@ -522,15 +548,17 @@ * It may a 7-Zip SFX archive file. If first two bytes are * 'M' and 'Z' available on Windows or first four bytes are * "\x7F\x45LF" available on posix like system, seek the 7-Zip - * signature. Although we will perform a seek when reading - * a header, what we do not use __archive_read_seek() here is - * due to a bidding performance. + * signature. While find_pe_overlay can be performed without + * performing a seek, find_elf_data_sec requires one, + * thus a performance difference between the two is expected. */ if ((p[0] == 'M' && p[1] == 'Z') || memcmp(p, "\x7F\x45LF", 4) == 0) { - ssize_t offset = SFX_MIN_ADDR; + const ssize_t min_addr = p[0] == 'M' ? find_pe_overlay(a) : + find_elf_data_sec(a); + ssize_t offset = min_addr; ssize_t window = 4096; ssize_t bytes_avail; - while (offset + window <= (SFX_MAX_ADDR)) { + while (offset + window <= (min_addr + SFX_MAX_OFFSET)) { const char *buff = __archive_read_ahead(a, offset + window, &bytes_avail); if (buff == NULL) { @@ -580,21 +608,14 @@ } static int -skip_sfx(struct archive_read *a, ssize_t bytes_avail) +skip_sfx(struct archive_read *a, const ssize_t min_addr) { const void *h; const char *p, *q; size_t skip, offset; ssize_t bytes, window; - /* - * If bytes_avail > SFX_MIN_ADDR we do not have to call - * __archive_read_seek() at this time since we have - * already had enough data. - */ - if (bytes_avail > SFX_MIN_ADDR) - __archive_read_consume(a, SFX_MIN_ADDR); - else if (__archive_read_seek(a, SFX_MIN_ADDR, SEEK_SET) < 0) + if (__archive_read_seek(a, min_addr, SEEK_SET) < 0) return (ARCHIVE_FATAL); offset = 0; @@ -627,7 +648,7 @@ (struct _7zip *)a->format->data; skip = p - (const char *)h; __archive_read_consume(a, skip); - zip->seek_base = SFX_MIN_ADDR + offset + skip; + zip->seek_base = min_addr + offset + skip; return (ARCHIVE_OK); } p += step; @@ -644,6 +665,207 @@ return (ARCHIVE_FATAL); } +static ssize_t +find_pe_overlay(struct archive_read *a) +{ + const char *h; + ssize_t bytes, max_offset, offset, sec_end; + ssize_t opt_hdr_sz, sec_cnt; + + for (;;) { + /* + * Read Dos header to find e_lfanew + */ + h = __archive_read_ahead(a, PE_DOS_HDR_LEN, &bytes); + if (h == NULL || h[0] != 'M' || h[1] != 'Z') { + break; + } + offset = archive_le32dec(h + PE_DOS_HDR_ELFANEW_OFFSET); + + /* + * Read COFF header to find opt header size and sec cnt + */ + if (bytes < offset + PE_COFF_HDR_LEN) { + h = __archive_read_ahead(a, offset + PE_COFF_HDR_LEN, + &bytes); + if (h == NULL || h[offset] != 'P' || + h[offset + 1] != 'E') { + break; + } + } + sec_cnt = archive_le16dec( + h + offset + PE_COFF_HDR_SEC_CNT_OFFSET); + opt_hdr_sz = archive_le16dec( + h + offset + PE_COFF_HDR_OPT_SZ_OFFSET); + + /* + * Skip optional header + */ + if (opt_hdr_sz != 0) { + offset += PE_COFF_HDR_LEN + opt_hdr_sz; + } else { + break; + } + + /* + * Traverse sec table to find max raw offset (i.e., overlay) + */ + if (bytes < offset + sec_cnt * PE_SEC_HDR_LEN) { + h = __archive_read_ahead(a, + offset + sec_cnt * PE_SEC_HDR_LEN, NULL); + if (h == NULL) { + break; + } + } + max_offset = offset; + while (sec_cnt > 0) { + sec_end = archive_le32dec( + h + offset + PE_SEC_HDR_RAW_SZ_OFFSET) + + archive_le32dec( + h + offset + PE_SEC_HDR_RAW_ADDR_OFFSET); + if (sec_end > max_offset) { + max_offset = sec_end; + } + offset += PE_SEC_HDR_LEN; + sec_cnt--; + } + return (max_offset); + } + + /* + * If encounter any weirdness, revert to old brute-force style search + */ + return (SFX_MIN_ADDR); +} + +static ssize_t +find_elf_data_sec(struct archive_read *a) +{ + const char *h; + char big_endian, format_64; + ssize_t bytes, min_addr = SFX_MIN_ADDR; + uint64_t e_shoff, strtab_offset, strtab_size; + uint16_t e_shentsize, e_shnum, e_shstrndx; + uint16_t (*dec16)(const void *); + uint32_t (*dec32)(const void *); + uint64_t (*dec64)(const void *); + + for (;;) { + /* + * Read Elf header to find bitness & endianness + */ + h = __archive_read_ahead(a, ELF_HDR_MIN_LEN, &bytes); + if (h == NULL || memcmp(h, "\x7F\x45LF", 4) != 0) { + break; + } + format_64 = h[ELF_HDR_EI_CLASS_OFFSET] == 0x2; + big_endian = h[ELF_HDR_EI_DATA_OFFSET] == 0x2; + if (big_endian) { + dec16 = &archive_be16dec; + dec32 = &archive_be32dec; + dec64 = &archive_be64dec; + } else { + dec16 = &archive_le16dec; + dec32 = &archive_le32dec; + dec64 = &archive_le64dec; + } + + /* + * Read section header table info + */ + if (format_64) { + e_shoff = (*dec64)(h + 0x28); + e_shentsize = (*dec16)(h + 0x3A); + e_shnum = (*dec16)(h + 0x3C); + e_shstrndx = (*dec16)(h + 0x3E); + if (e_shnum < e_shstrndx || e_shentsize < 0x28) + break; + + } else { + e_shoff = (*dec32)(h + 0x20); + e_shentsize = (*dec16)(h + 0x2E); + e_shnum = (*dec16)(h + 0x30); + e_shstrndx = (*dec16)(h + 0x32); + if (e_shnum < e_shstrndx || e_shentsize < 0x18) + break; + } + + /* + * Reading the section table to find strtab section + */ + if (__archive_read_seek(a, e_shoff, SEEK_SET) < 0) { + break; + } + h = __archive_read_ahead(a, (size_t)e_shnum * (size_t)e_shentsize, NULL); + if (h == NULL) { + break; + } + if (format_64) { + strtab_offset = (*dec64)( + h + e_shstrndx * e_shentsize + 0x18); + strtab_size = (*dec64)( + h + e_shstrndx * e_shentsize + 0x20); + } else { + strtab_offset = (*dec32)( + h + e_shstrndx * e_shentsize + 0x10); + strtab_size = (*dec32)( + h + e_shstrndx * e_shentsize + 0x14); + } + + /* + * Read the STRTAB section to find the .data offset + */ + if (__archive_read_seek(a, strtab_offset, SEEK_SET) < 0) { + break; + } + h = __archive_read_ahead(a, strtab_size, NULL); + if (h == NULL) { + break; + } + ssize_t data_sym_offset = -1; + for (size_t offset = 0; offset < strtab_size - 6; offset++) { + if (memcmp(h + offset, ".data\00", 6) == 0) { + data_sym_offset = offset; + break; + } + } + if (data_sym_offset == -1) { + break; + } + + /* + * Find the section with the .data name + */ + if (__archive_read_seek(a, e_shoff, SEEK_SET) < 0) { + break; + } + h = __archive_read_ahead(a, (size_t)e_shnum * (size_t)e_shentsize, NULL); + if (h == NULL) { + break; + } + ssize_t sec_tbl_offset = 0, name_offset; + while (e_shnum > 0) { + name_offset = (*dec32)(h + sec_tbl_offset); + if (name_offset == data_sym_offset) { + if (format_64) { + min_addr = (*dec64)( + h + sec_tbl_offset + 0x18); + } else { + min_addr = (*dec32)( + h + sec_tbl_offset + 0x10); + } + break; + } + sec_tbl_offset += e_shentsize; + e_shnum--; + } + break; + } + + __archive_read_seek(a, 0, SEEK_SET); + return (min_addr); +} + static int archive_read_format_7zip_read_header(struct archive_read *a, struct archive_entry *entry) @@ -770,7 +992,7 @@ /* allocate for ",rdonly,hidden,system" */ fflags_text = malloc(22 * sizeof(*fflags_text)); if (fflags_text != NULL) { - ptr = fflags_text; + ptr = fflags_text; if (zip_entry->attr & FILE_ATTRIBUTE_READONLY) { strcpy(ptr, ",rdonly"); ptr = ptr + 7; @@ -1109,7 +1331,9 @@ if (coder2->codec != _7Z_X86 && coder2->codec != _7Z_X86_BCJ2 && coder2->codec != _7Z_ARM && - coder2->codec != _7Z_ARM64) { + coder2->codec != _7Z_ARM64 && + coder2->codec != _7Z_POWERPC && + coder2->codec != _7Z_SPARC) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "Unsupported filter %lx for %lx", @@ -1223,6 +1447,12 @@ filters[fi].id = LZMA_FILTER_ARM64; fi++; break; +#endif +#ifdef LZMA_FILTER_RISCV + case _7Z_RISCV: + filters[fi].id = LZMA_FILTER_RISCV; + fi++; + break; #endif case _7Z_SPARC: filters[fi].id = LZMA_FILTER_SPARC; @@ -1396,6 +1626,7 @@ case _7Z_ARM: case _7Z_ARMTHUMB: case _7Z_ARM64: + case _7Z_RISCV: case _7Z_SPARC: case _7Z_DELTA: archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, @@ -1708,6 +1939,10 @@ *outbytes = arm_Convert(zip, buff, *outbytes); } else if (zip->codec2 == _7Z_ARM64) { *outbytes = arm64_Convert(zip, buff, *outbytes); + } else if (zip->codec2 == _7Z_SPARC) { + *outbytes = sparc_Convert(zip, buff, *outbytes); + } else if (zip->codec2 == _7Z_POWERPC) { + *outbytes = powerpc_Convert(zip, buff, *outbytes); } } @@ -2841,23 +3076,6 @@ return (0); } -#define EPOC_TIME ARCHIVE_LITERAL_ULL(116444736000000000) -static void -fileTimeToUtc(uint64_t fileTime, time_t *timep, long *ns) -{ - - if (fileTime >= EPOC_TIME) { - fileTime -= EPOC_TIME; - /* milli seconds base */ - *timep = (time_t)(fileTime / 10000000); - /* nano seconds base */ - *ns = (long)(fileTime % 10000000) * 100; - } else { - *timep = 0; - *ns = 0; - } -} - static int read_Times(struct archive_read *a, struct _7z_header_info *h, int type) { @@ -2900,19 +3118,19 @@ goto failed; switch (type) { case kCTime: - fileTimeToUtc(archive_le64dec(p), + ntfs_to_unix(archive_le64dec(p), &(entries[i].ctime), &(entries[i].ctime_ns)); entries[i].flg |= CTIME_IS_SET; break; case kATime: - fileTimeToUtc(archive_le64dec(p), + ntfs_to_unix(archive_le64dec(p), &(entries[i].atime), &(entries[i].atime_ns)); entries[i].flg |= ATIME_IS_SET; break; case kMTime: - fileTimeToUtc(archive_le64dec(p), + ntfs_to_unix(archive_le64dec(p), &(entries[i].mtime), &(entries[i].mtime_ns)); entries[i].flg |= MTIME_IS_SET; @@ -3007,7 +3225,9 @@ if ((p[0] == 'M' && p[1] == 'Z') || memcmp(p, "\x7F\x45LF", 4) == 0) { /* This is an executable ? Must be self-extracting... */ - r = skip_sfx(a, bytes_avail); + const ssize_t min_addr = p[0] == 'M' ? find_pe_overlay(a) : + find_elf_data_sec(a); + r = skip_sfx(a, min_addr); if (r < ARCHIVE_WARN) return (r); if ((p = __archive_read_ahead(a, 32, &bytes_avail)) == NULL) @@ -4007,6 +4227,121 @@ return i; } +static size_t +sparc_Convert(struct _7zip *zip, uint8_t *buf, size_t size) +{ + // This function was adapted from + // static size_t bcj_sparc(struct xz_dec_bcj *s, uint8_t *buf, size_t size) + // in https://git.tukaani.org/xz-embedded.git + + /* + * Branch/Call/Jump (BCJ) filter decoders + * + * Authors: Lasse Collin + * Igor Pavlov + * + * Copyright (C) The XZ Embedded authors and contributors + * + * Permission to use, copy, modify, and/or distribute this + * software for any purpose with or without fee is hereby granted. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL + * THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + + size_t i; + uint32_t instr; + + size &= ~(size_t)3; + + for (i = 0; i < size; i += 4) { + instr = (uint32_t)(buf[i] << 24) + | ((uint32_t)buf[i+1] << 16) + | ((uint32_t)buf[i+2] << 8) + | (uint32_t)buf[i+3]; + + if ((instr >> 22) == 0x100 || (instr >> 22) == 0x1FF) { + instr <<= 2; + instr -= zip->bcj_ip + (uint32_t)i; + instr >>= 2; + instr = ((uint32_t)0x40000000 - (instr & 0x400000)) + | 0x40000000 | (instr & 0x3FFFFF); + + buf[i] = (uint8_t)(instr >> 24); + buf[i+1] = (uint8_t)(instr >> 16); + buf[i+2] = (uint8_t)(instr >> 8); + buf[i+3] = (uint8_t)instr; + } + } + + zip->bcj_ip += (uint32_t)i; + + return i; +} + +static size_t +powerpc_Convert(struct _7zip *zip, uint8_t *buf, size_t size) +{ + // This function was adapted from + // static size_t powerpc_code(void *simple, uint32_t now_pos, bool is_encoder, uint8_t *buffer, size_t size) + // in https://git.tukaani.org/xz.git + + /* + * Filter for PowerPC (big endian) binaries + * + * Authors: Igor Pavlov + * Lasse Collin + * + * Copyright (C) The XZ Utils authors and contributors + * + * Permission to use, copy, modify, and/or distribute this + * software for any purpose with or without fee is hereby granted. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL + * THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + + size &= ~(size_t)3; + + size_t i; + for (i = 0; i < size; i += 4) { + // PowerPC branch 6(48) 24(Offset) 1(Abs) 1(Link) + if ((buf[i] >> 2) == 0x12 + && ((buf[i + 3] & 3) == 1)) { + + const uint32_t src + = (((uint32_t)(buf[i + 0]) & 3) << 24) + | ((uint32_t)(buf[i + 1]) << 16) + | ((uint32_t)(buf[i + 2]) << 8) + | ((uint32_t)(buf[i + 3]) & ~UINT32_C(3)); + + uint32_t dest = src - (zip->bcj_ip + (uint32_t)(i)); + + buf[i + 0] = 0x48 | ((dest >> 24) & 0x03); + buf[i + 1] = (dest >> 16); + buf[i + 2] = (dest >> 8); + buf[i + 3] &= 0x03; + buf[i + 3] |= dest; + } + } + + zip->bcj_ip += (uint32_t)i; + + return i; +} + /* * Brought from LZMA SDK. * @@ -4029,8 +4364,17 @@ #define RC_READ_BYTE (*buffer++) #define RC_TEST { if (buffer == bufferLim) return SZ_ERROR_DATA; } -#define RC_INIT2 zip->bcj2_code = 0; zip->bcj2_range = 0xFFFFFFFF; \ - { int ii; for (ii = 0; ii < 5; ii++) { RC_TEST; zip->bcj2_code = (zip->bcj2_code << 8) | RC_READ_BYTE; }} +#define RC_INIT2 do { \ + zip->bcj2_code = 0; \ + zip->bcj2_range = 0xFFFFFFFF; \ + { \ + int ii; \ + for (ii = 0; ii < 5; ii++) { \ + RC_TEST; \ + zip->bcj2_code = (zip->bcj2_code << 8) | RC_READ_BYTE; \ + } \ + } \ +} while (0) #define NORMALIZE if (zip->bcj2_range < kTopValue) { RC_TEST; zip->bcj2_range <<= 8; zip->bcj2_code = (zip->bcj2_code << 8) | RC_READ_BYTE; } @@ -4177,4 +4521,3 @@ return ((ssize_t)outPos); } - --- contrib/libarchive/libarchive/archive_read_support_format_by_code.c.orig +++ contrib/libarchive/libarchive/archive_read_support_format_by_code.c @@ -41,49 +41,34 @@ switch (format_code & ARCHIVE_FORMAT_BASE_MASK) { case ARCHIVE_FORMAT_7ZIP: return archive_read_support_format_7zip(a); - break; case ARCHIVE_FORMAT_AR: return archive_read_support_format_ar(a); - break; case ARCHIVE_FORMAT_CAB: return archive_read_support_format_cab(a); - break; case ARCHIVE_FORMAT_CPIO: return archive_read_support_format_cpio(a); - break; case ARCHIVE_FORMAT_EMPTY: return archive_read_support_format_empty(a); - break; case ARCHIVE_FORMAT_ISO9660: return archive_read_support_format_iso9660(a); - break; case ARCHIVE_FORMAT_LHA: return archive_read_support_format_lha(a); - break; case ARCHIVE_FORMAT_MTREE: return archive_read_support_format_mtree(a); - break; case ARCHIVE_FORMAT_RAR: return archive_read_support_format_rar(a); - break; case ARCHIVE_FORMAT_RAR_V5: return archive_read_support_format_rar5(a); - break; case ARCHIVE_FORMAT_RAW: return archive_read_support_format_raw(a); - break; case ARCHIVE_FORMAT_TAR: return archive_read_support_format_tar(a); - break; case ARCHIVE_FORMAT_WARC: return archive_read_support_format_warc(a); - break; case ARCHIVE_FORMAT_XAR: return archive_read_support_format_xar(a); - break; case ARCHIVE_FORMAT_ZIP: return archive_read_support_format_zip(a); - break; } archive_set_error(a, ARCHIVE_ERRNO_PROGRAMMER, "Invalid format code specified"); --- contrib/libarchive/libarchive/archive_read_support_format_cab.c.orig +++ contrib/libarchive/libarchive/archive_read_support_format_cab.c @@ -363,7 +363,12 @@ return (ARCHIVE_FATAL); } archive_string_init(&cab->ws); - archive_wstring_ensure(&cab->ws, 256); + if (archive_wstring_ensure(&cab->ws, 256) == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate memory"); + free(cab); + return (ARCHIVE_FATAL); + } r = __archive_read_register_format(a, cab, --- contrib/libarchive/libarchive/archive_read_support_format_cpio.c.orig +++ contrib/libarchive/libarchive/archive_read_support_format_cpio.c @@ -189,6 +189,7 @@ }; static int64_t atol16(const char *, unsigned); +static uint64_t atol16u(const char *, unsigned); static int64_t atol8(const char *, unsigned); static int archive_read_format_cpio_bid(struct archive_read *, int); static int archive_read_format_cpio_options(struct archive_read *, @@ -835,6 +836,7 @@ struct archive_entry *entry, size_t *namelength, size_t *name_pad) { int64_t t; + uint64_t u; const void *h; const char *header; @@ -851,12 +853,12 @@ archive_entry_set_dev(entry, (dev_t)atol16(header + afiol_dev_offset, afiol_dev_size)); - t = atol16(header + afiol_ino_offset, afiol_ino_size); - if (t < 0) { - archive_set_error(&a->archive, 0, "Nonsensical ino value"); - return (ARCHIVE_FATAL); - } - archive_entry_set_ino(entry, t); + u = atol16u(header + afiol_ino_offset, afiol_ino_size); +#if ARCHIVE_VERSION_NUMBER < 4000000 + archive_entry_set_ino(entry, (int64_t)(u & INT64_MAX)); +#else + archive_entry_set_ino(entry, u); +#endif archive_entry_set_mode(entry, (mode_t)atol8(header + afiol_mode_offset, afiol_mode_size)); archive_entry_set_uid(entry, atol16(header + afiol_uid_offset, afiol_uid_size)); @@ -1030,6 +1032,12 @@ static int64_t atol16(const char *p, unsigned char_cnt) +{ + return ((int64_t)atol16u(p, char_cnt)); +} + +static uint64_t +atol16u(const char *p, unsigned char_cnt) { uint64_t l; int digit; @@ -1048,7 +1056,7 @@ l <<= 4; l |= digit; } - return ((int64_t)l); + return (l); } static int --- contrib/libarchive/libarchive/archive_read_support_format_iso9660.c.orig +++ contrib/libarchive/libarchive/archive_read_support_format_iso9660.c @@ -1429,7 +1429,7 @@ * information first, then store all file bodies. */ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "Ignoring out-of-order file @%jx (%s) %jd < %jd", - (intmax_t)file->number, + (uintmax_t)file->number, iso9660->pathname.s, (intmax_t)file->offset, (intmax_t)iso9660->current_position); @@ -2273,7 +2273,7 @@ if (version == 1) { if (data_length >= 8) file->mode - = toi(data, 4); + = (__LA_MODE_T)toi(data, 4); if (data_length >= 16) file->nlinks = toi(data + 8, 4); --- contrib/libarchive/libarchive/archive_read_support_format_lha.c.orig +++ contrib/libarchive/libarchive/archive_read_support_format_lha.c @@ -43,6 +43,7 @@ #include "archive_entry_locale.h" #include "archive_private.h" #include "archive_read_private.h" +#include "archive_time_private.h" #include "archive_endian.h" @@ -162,12 +163,12 @@ #define ATIME_IS_SET 2 #define UNIX_MODE_IS_SET 4 #define CRC_IS_SET 8 - time_t birthtime; - long birthtime_tv_nsec; - time_t mtime; - long mtime_tv_nsec; - time_t atime; - long atime_tv_nsec; + int64_t birthtime; + uint32_t birthtime_tv_nsec; + int64_t mtime; + uint32_t mtime_tv_nsec; + int64_t atime; + uint32_t atime_tv_nsec; mode_t mode; int64_t uid; int64_t gid; @@ -230,8 +231,6 @@ struct lha *, uint16_t *, int, uint64_t, size_t *); static size_t lha_check_header_format(const void *); static int lha_skip_sfx(struct archive_read *); -static time_t lha_dos_time(const unsigned char *); -static time_t lha_win_time(uint64_t, long *); static unsigned char lha_calcsum(unsigned char, const void *, int, size_t); static int lha_parse_linkname(struct archive_wstring *, @@ -819,7 +818,7 @@ headersum = p[H0_HEADER_SUM_OFFSET]; lha->compsize = archive_le32dec(p + H0_COMP_SIZE_OFFSET); lha->origsize = archive_le32dec(p + H0_ORIG_SIZE_OFFSET); - lha->mtime = lha_dos_time(p + H0_DOS_TIME_OFFSET); + lha->mtime = dos_to_unix(archive_le32dec(p + H0_DOS_TIME_OFFSET)); namelen = p[H0_NAME_LEN_OFFSET]; extdsize = (int)lha->header_size - H0_FIXED_SIZE - namelen; if ((namelen > 221 || extdsize < 0) && extdsize != -2) { @@ -919,7 +918,7 @@ /* Note: An extended header size is included in a compsize. */ lha->compsize = archive_le32dec(p + H1_COMP_SIZE_OFFSET); lha->origsize = archive_le32dec(p + H1_ORIG_SIZE_OFFSET); - lha->mtime = lha_dos_time(p + H1_DOS_TIME_OFFSET); + lha->mtime = dos_to_unix(archive_le32dec(p + H1_DOS_TIME_OFFSET)); namelen = p[H1_NAME_LEN_OFFSET]; /* Calculate a padding size. The result will be normally 0 only(?) */ padding = ((int)lha->header_size) - H1_FIXED_SIZE - namelen; @@ -1090,7 +1089,7 @@ if (archive_le16dec(p + H3_FIELD_LEN_OFFSET) != 4) goto invalid; - lha->header_size =archive_le32dec(p + H3_HEADER_SIZE_OFFSET); + lha->header_size = archive_le32dec(p + H3_HEADER_SIZE_OFFSET); lha->compsize = archive_le32dec(p + H3_COMP_SIZE_OFFSET); lha->origsize = archive_le32dec(p + H3_ORIG_SIZE_OFFSET); lha->mtime = archive_le32dec(p + H3_TIME_OFFSET); @@ -1326,16 +1325,16 @@ break; case EXT_TIMESTAMP: if (datasize == (sizeof(uint64_t) * 3)) { - lha->birthtime = lha_win_time( - archive_le64dec(extdheader), + ntfs_to_unix(archive_le64dec(extdheader), + &lha->birthtime, &lha->birthtime_tv_nsec); extdheader += sizeof(uint64_t); - lha->mtime = lha_win_time( - archive_le64dec(extdheader), + ntfs_to_unix(archive_le64dec(extdheader), + &lha->mtime, &lha->mtime_tv_nsec); extdheader += sizeof(uint64_t); - lha->atime = lha_win_time( - archive_le64dec(extdheader), + ntfs_to_unix(archive_le64dec(extdheader), + &lha->atime, &lha->atime_tv_nsec); lha->setflag |= BIRTHTIME_IS_SET | ATIME_IS_SET; @@ -1716,45 +1715,6 @@ return (0); } -/* Convert an MSDOS-style date/time into Unix-style time. */ -static time_t -lha_dos_time(const unsigned char *p) -{ - int msTime, msDate; - struct tm ts; - - msTime = archive_le16dec(p); - msDate = archive_le16dec(p+2); - - memset(&ts, 0, sizeof(ts)); - ts.tm_year = ((msDate >> 9) & 0x7f) + 80; /* Years since 1900. */ - ts.tm_mon = ((msDate >> 5) & 0x0f) - 1; /* Month number. */ - ts.tm_mday = msDate & 0x1f; /* Day of month. */ - ts.tm_hour = (msTime >> 11) & 0x1f; - ts.tm_min = (msTime >> 5) & 0x3f; - ts.tm_sec = (msTime << 1) & 0x3e; - ts.tm_isdst = -1; - return (mktime(&ts)); -} - -/* Convert an MS-Windows-style date/time into Unix-style time. */ -static time_t -lha_win_time(uint64_t wintime, long *ns) -{ -#define EPOC_TIME ARCHIVE_LITERAL_ULL(116444736000000000) - - if (wintime >= EPOC_TIME) { - wintime -= EPOC_TIME; /* 1970-01-01 00:00:00 (UTC) */ - if (ns != NULL) - *ns = (long)(wintime % 10000000) * 100; - return (wintime / 10000000); - } else { - if (ns != NULL) - *ns = 0; - return (0); - } -} - static unsigned char lha_calcsum(unsigned char sum, const void *pp, int offset, size_t size) { @@ -2917,4 +2877,3 @@ /* This bit pattern needs to be found out at a huffman tree. */ return (lzh_decode_huffman_tree(hf, rbits, c)); } - --- contrib/libarchive/libarchive/archive_read_support_format_rar.c.orig +++ contrib/libarchive/libarchive/archive_read_support_format_rar.c @@ -335,8 +335,8 @@ int found_first_header; char has_endarc_header; struct data_block_offsets *dbo; - unsigned int cursor; - unsigned int nodes; + size_t cursor; + size_t nodes; char filename_must_match; /* LZSS members */ @@ -451,7 +451,7 @@ static int rar_decode_byte(struct archive_read*, uint8_t *); static int execute_filter(struct archive_read*, struct rar_filter *, struct rar_virtual_machine *, size_t); -static int copy_from_lzss_window(struct archive_read *, void *, int64_t, int); +static int copy_from_lzss_window(struct archive_read *, uint8_t *, int64_t, int); static inline void vm_write_32(struct rar_virtual_machine*, size_t, uint32_t); static inline uint32_t vm_read_32(struct rar_virtual_machine*, size_t); @@ -475,7 +475,7 @@ ((rar_br_has(br, (n)) || rar_br_fillup(a, br)) || rar_br_has(br, (n))) /* Notify how many bits we consumed. */ #define rar_br_consume(br, n) ((br)->cache_avail -= (n)) -#define rar_br_consume_unalined_bits(br) ((br)->cache_avail &= ~7) +#define rar_br_consume_unaligned_bits(br) ((br)->cache_avail &= ~7) static const uint32_t cache_masks[] = { 0x00000000, 0x00000001, 0x00000003, 0x00000007, @@ -741,11 +741,11 @@ return (ARCHIVE_FATAL); } - /* - * Until enough data has been read, we cannot tell about - * any encrypted entries yet. - */ - rar->has_encrypted_entries = ARCHIVE_READ_FORMAT_ENCRYPTION_DONT_KNOW; + /* + * Until enough data has been read, we cannot tell about + * any encrypted entries yet. + */ + rar->has_encrypted_entries = ARCHIVE_READ_FORMAT_ENCRYPTION_DONT_KNOW; r = __archive_read_register_format(a, rar, @@ -768,21 +768,21 @@ static int archive_read_support_format_rar_capabilities(struct archive_read * a) { - (void)a; /* UNUSED */ - return (ARCHIVE_READ_FORMAT_CAPS_ENCRYPT_DATA - | ARCHIVE_READ_FORMAT_CAPS_ENCRYPT_METADATA); + (void)a; /* UNUSED */ + return (ARCHIVE_READ_FORMAT_CAPS_ENCRYPT_DATA + | ARCHIVE_READ_FORMAT_CAPS_ENCRYPT_METADATA); } static int archive_read_format_rar_has_encrypted_entries(struct archive_read *_a) { - if (_a && _a->format) { - struct rar * rar = (struct rar *)_a->format->data; - if (rar) { - return rar->has_encrypted_entries; - } - } - return ARCHIVE_READ_FORMAT_ENCRYPTION_DONT_KNOW; + if (_a && _a->format) { + struct rar * rar = (struct rar *)_a->format->data; + if (rar) { + return rar->has_encrypted_entries; + } + } + return ARCHIVE_READ_FORMAT_ENCRYPTION_DONT_KNOW; } @@ -793,7 +793,7 @@ /* If there's already a bid > 30, we'll never win. */ if (best_bid > 30) - return (-1); + return (-1); if ((p = __archive_read_ahead(a, 7, NULL)) == NULL) return (-1); @@ -865,7 +865,7 @@ } skip = p - (const char *)h; __archive_read_consume(a, skip); - total += skip; + total += skip; } fatal: archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, @@ -910,7 +910,7 @@ const void *h; const char *p; struct rar *rar; - size_t skip; + int64_t skip; char head_type; int ret; unsigned flags; @@ -930,7 +930,7 @@ * as well. */ if (rar->has_encrypted_entries == ARCHIVE_READ_FORMAT_ENCRYPTION_DONT_KNOW) { - rar->has_encrypted_entries = 0; + rar->has_encrypted_entries = 0; } /* RAR files can be generated without EOF headers, so return ARCHIVE_EOF if @@ -953,8 +953,11 @@ { unsigned long crc32_val; - if ((h = __archive_read_ahead(a, 7, NULL)) == NULL) + if ((h = __archive_read_ahead(a, 7, NULL)) == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Failed to read next header."); return (ARCHIVE_FATAL); + } p = h; head_type = p[2]; @@ -972,7 +975,7 @@ case MAIN_HEAD: rar->main_flags = archive_le16dec(p + 3); skip = archive_le16dec(p + 5); - if (skip < 7 + sizeof(rar->reserved1) + sizeof(rar->reserved2)) { + if ((size_t)skip < 7 + sizeof(rar->reserved1) + sizeof(rar->reserved2)) { archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "Invalid header size"); return (ARCHIVE_FATAL); @@ -984,7 +987,8 @@ memcpy(rar->reserved2, p + 7 + sizeof(rar->reserved1), sizeof(rar->reserved2)); if (rar->main_flags & MHD_ENCRYPTVER) { - if (skip < 7 + sizeof(rar->reserved1) + sizeof(rar->reserved2)+1) { + if ((size_t)skip < + 7 + sizeof(rar->reserved1) + sizeof(rar->reserved2) + 1) { archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "Invalid header size"); return (ARCHIVE_FATAL); @@ -1053,28 +1057,30 @@ /* Skim the entire header and compute the CRC. */ crc32_val = 0; while (skip > 0) { - size_t to_read = skip; - if (to_read > 32 * 1024) - to_read = 32 * 1024; - if ((h = __archive_read_ahead(a, to_read, NULL)) == NULL) { - archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, - "Bad RAR file"); - return (ARCHIVE_FATAL); - } - p = h; - crc32_val = crc32(crc32_val, (const unsigned char *)p, (unsigned int)to_read); - __archive_read_consume(a, to_read); - skip -= to_read; + unsigned to_read; + if (skip > 32 * 1024) + to_read = 32 * 1024; + else + to_read = (unsigned)skip; + if ((h = __archive_read_ahead(a, to_read, NULL)) == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Bad RAR file"); + return (ARCHIVE_FATAL); + } + p = h; + crc32_val = crc32(crc32_val, (const unsigned char *)p, to_read); + __archive_read_consume(a, to_read); + skip -= to_read; } if ((crc32_val & 0xffff) != crc32_expected) { #ifndef DONT_FAIL_ON_CRC_ERROR - archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, - "Header CRC error"); - return (ARCHIVE_FATAL); + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Header CRC error"); + return (ARCHIVE_FATAL); #endif } if (head_type == ENDARC_HEAD) - return (ARCHIVE_EOF); + return (ARCHIVE_EOF); break; case NEWSUB_HEAD: @@ -1083,7 +1089,7 @@ break; default: - archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "Bad RAR file"); return (ARCHIVE_FATAL); } @@ -1098,7 +1104,7 @@ int ret; if (rar->has_encrypted_entries == ARCHIVE_READ_FORMAT_ENCRYPTION_DONT_KNOW) { - rar->has_encrypted_entries = 0; + rar->has_encrypted_entries = 0; } if (rar->bytes_unconsumed > 0) { @@ -1186,7 +1192,7 @@ int whence) { int64_t client_offset, ret; - unsigned int i; + size_t i; struct rar *rar = (struct rar *)(a->format->data); if (rar->compression_method == COMPRESS_METHOD_STORE) @@ -1433,7 +1439,11 @@ } if ((h = __archive_read_ahead(a, (size_t)header_size - 7, NULL)) == NULL) + { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Failed to read full header content."); return (ARCHIVE_FATAL); + } /* File Header CRC check. */ crc32_computed = crc32(crc32_computed, h, (unsigned)(header_size - 7)); @@ -1460,8 +1470,8 @@ if (rar->file_flags & FHD_PASSWORD) { - archive_entry_set_is_data_encrypted(entry, 1); - rar->has_encrypted_entries = 1; + archive_entry_set_is_data_encrypted(entry, 1); + rar->has_encrypted_entries = 1; archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "RAR encryption support unavailable."); /* Since it is only the data part itself that is encrypted we can at least @@ -1506,10 +1516,23 @@ */ if (head_type == NEWSUB_HEAD) { size_t distance = p - (const char *)h; + if (rar->packed_size > INT64_MAX - header_size) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Extended header size too large."); + return (ARCHIVE_FATAL); + } header_size += rar->packed_size; + if ((uintmax_t)header_size > SIZE_MAX) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Unable to read extended header data."); + return (ARCHIVE_FATAL); + } /* Make sure we have the extended data. */ - if ((h = __archive_read_ahead(a, (size_t)header_size - 7, NULL)) == NULL) - return (ARCHIVE_FATAL); + if ((h = __archive_read_ahead(a, (size_t)header_size - 7, NULL)) == NULL) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Failed to read extended header data."); + return (ARCHIVE_FATAL); + } p = h; endp = p + header_size - 7; p += distance; @@ -1670,6 +1693,8 @@ !memcmp(rar->filename, rar->filename_save, filename_size + 1)) { __archive_read_consume(a, header_size - 7); + rar->br.avail_in = 0; + rar->br.next_in = NULL; rar->cursor++; if (rar->cursor >= rar->nodes) { @@ -1689,6 +1714,12 @@ } if (rar->dbo[rar->cursor].start_offset < 0) { + if (rar->packed_size > INT64_MAX - a->filter->position) + { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Unable to store offsets."); + return (ARCHIVE_FATAL); + } rar->dbo[rar->cursor].start_offset = a->filter->position; rar->dbo[rar->cursor].end_offset = rar->dbo[rar->cursor].start_offset + rar->packed_size; @@ -1745,6 +1776,11 @@ } __archive_read_consume(a, header_size - 7); + if (rar->packed_size > INT64_MAX - a->filter->position) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Unable to store offsets."); + return (ARCHIVE_FATAL); + } rar->dbo[0].start_offset = a->filter->position; rar->dbo[0].end_offset = rar->dbo[0].start_offset + rar->packed_size; @@ -1753,7 +1789,7 @@ case OS_MSDOS: case OS_OS2: case OS_WIN32: - rar->mode = archive_le32dec(file_header.file_attr); + rar->mode = (__LA_MODE_T)archive_le32dec(file_header.file_attr); if (rar->mode & FILE_ATTRIBUTE_DIRECTORY) rar->mode = AE_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH; else @@ -1764,7 +1800,7 @@ case OS_UNIX: case OS_MAC_OS: case OS_BEOS: - rar->mode = archive_le32dec(file_header.file_attr); + rar->mode = (__LA_MODE_T)archive_le32dec(file_header.file_attr); break; default: @@ -1780,6 +1816,7 @@ rar->offset_outgoing = 0; rar->br.cache_avail = 0; rar->br.avail_in = 0; + rar->br.next_in = NULL; rar->crc_calculated = 0; rar->entry_eof = 0; rar->valid = 1; @@ -1941,8 +1978,18 @@ int ret = (ARCHIVE_OK); rar = (struct rar *)(a->format->data); + if ((uintmax_t)rar->packed_size > SIZE_MAX) + { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Unable to read link."); + return (ARCHIVE_FATAL); + } if ((h = rar_read_ahead(a, (size_t)rar->packed_size, NULL)) == NULL) + { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Failed to read link."); return (ARCHIVE_FATAL); + } p = h; if (archive_entry_copy_symlink_l(entry, @@ -2224,7 +2271,7 @@ ret = expand(a, &end); if (ret != ARCHIVE_OK) - return (ret); + return (ret); rar->bytes_uncopied = end - start; rar->filters.lastend = end; @@ -2276,7 +2323,7 @@ free_codes(a); /* Skip to the next byte */ - rar_br_consume_unalined_bits(br); + rar_br_consume_unaligned_bits(br); /* PPMd block flag */ if (!rar_br_read_ahead(a, br, 1)) @@ -2332,9 +2379,9 @@ __archive_ppmd7_functions.Ppmd7_Construct(&rar->ppmd7_context); if (rar->dictionary_size == 0) { - archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "Invalid zero dictionary size"); - return (ARCHIVE_FATAL); + return (ARCHIVE_FATAL); } if (!__archive_ppmd7_functions.Ppmd7_Alloc(&rar->ppmd7_context, @@ -2803,7 +2850,7 @@ else code->tablesize = code->maxlength; - code->table = calloc(1U << code->tablesize, sizeof(*code->table)); + code->table = calloc(((size_t)1U) << code->tablesize, sizeof(*code->table)); return make_table_recurse(a, code, 0, code->table, 0, code->tablesize); } @@ -2929,11 +2976,11 @@ } if ((symbol = read_next_symbol(a, &rar->maincode)) < 0) - return (ARCHIVE_FATAL); + goto bad_data; if (symbol < 256) { - lzss_emit_literal(rar, symbol); + lzss_emit_literal(rar, (uint8_t)symbol); continue; } else if (symbol == 256) @@ -2956,14 +3003,14 @@ else { if (parse_codes(a) != ARCHIVE_OK) - return (ARCHIVE_FATAL); + goto bad_data; continue; } } else if(symbol==257) { if (!read_filter(a, end)) - return (ARCHIVE_FATAL); + goto bad_data; continue; } else if(symbol==258) @@ -3048,7 +3095,7 @@ { if ((lowoffsetsymbol = read_next_symbol(a, &rar->lowoffsetcode)) < 0) - return (ARCHIVE_FATAL); + goto bad_data; if(lowoffsetsymbol == 16) { rar->numlowoffsetrepeats = 15; @@ -3096,7 +3143,7 @@ } static int -copy_from_lzss_window(struct archive_read *a, void *buffer, +copy_from_lzss_window(struct archive_read *a, uint8_t *buffer, int64_t startpos, int length) { int windowoffs, firstpart; @@ -3111,7 +3158,7 @@ } if (firstpart < length) { memcpy(buffer, &rar->lzss.window[windowoffs], firstpart); - memcpy(buffer, &rar->lzss.window[0], length - firstpart); + memcpy(buffer + firstpart, &rar->lzss.window[0], length - firstpart); } else { memcpy(buffer, &rar->lzss.window[windowoffs], length); } @@ -3180,8 +3227,12 @@ rar_read_ahead(struct archive_read *a, size_t min, ssize_t *avail) { struct rar *rar = (struct rar *)(a->format->data); - const void *h = __archive_read_ahead(a, min, avail); + const void *h; int ret; + +again: + h = __archive_read_ahead(a, min, avail); + if (avail) { if (a->archive.read_data_is_posix_read && *avail > (ssize_t)a->archive.read_data_requested) @@ -3203,7 +3254,7 @@ rar->filename_must_match = 0; if (ret != (ARCHIVE_OK)) return NULL; - return rar_read_ahead(a, min, avail); + goto again; } } return h; @@ -3266,6 +3317,9 @@ else blocklength = prog ? prog->oldfilterlength : 0; + if (blocklength > rar->dictionary_size) + return 0; + registers[3] = PROGRAM_SYSTEM_GLOBAL_ADDRESS; registers[4] = blocklength; registers[5] = prog ? prog->usagecount : 0; --- contrib/libarchive/libarchive/archive_read_support_format_rar5.c.orig +++ contrib/libarchive/libarchive/archive_read_support_format_rar5.c @@ -46,6 +46,7 @@ #include "archive_entry_locale.h" #include "archive_ppmd7_private.h" #include "archive_entry_private.h" +#include "archive_time_private.h" #ifdef HAVE_BLAKE2_H #include @@ -100,10 +101,12 @@ uint8_t dir : 1; /* Is this file entry a directory? */ /* Optional time fields. */ - uint64_t e_mtime; - uint64_t e_ctime; - uint64_t e_atime; - uint32_t e_unix_ns; + int64_t e_mtime; + int64_t e_ctime; + int64_t e_atime; + uint32_t e_mtime_ns; + uint32_t e_ctime_ns; + uint32_t e_atime_ns; /* Optional hash fields. */ uint32_t stored_crc32; @@ -691,7 +694,8 @@ default: archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, - "Unsupported filter type: 0x%x", flt->type); + "Unsupported filter type: 0x%x", + (unsigned int)flt->type); return ARCHIVE_FATAL; } @@ -1100,22 +1104,22 @@ return ARCHIVE_OK; } -static int read_u32(struct archive_read* a, uint32_t* pvalue) { +static char read_u32(struct archive_read* a, uint32_t* pvalue) { const uint8_t* p; if(!read_ahead(a, 4, &p)) return 0; *pvalue = archive_le32dec(p); - return ARCHIVE_OK == consume(a, 4) ? 1 : 0; + return ARCHIVE_OK == consume(a, 4); } -static int read_u64(struct archive_read* a, uint64_t* pvalue) { +static char read_u64(struct archive_read* a, uint64_t* pvalue) { const uint8_t* p; if(!read_ahead(a, 8, &p)) return 0; *pvalue = archive_le64dec(p); - return ARCHIVE_OK == consume(a, 8) ? 1 : 0; + return ARCHIVE_OK == consume(a, 8); } static int bid_standard(struct archive_read* a) { @@ -1293,21 +1297,15 @@ *extra_data_size -= hash_size; } else { archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, - "Unsupported hash type (0x%x)", (int) hash_type); + "Unsupported hash type (0x%jx)", (uintmax_t)hash_type); return ARCHIVE_FATAL; } return ARCHIVE_OK; } -static uint64_t time_win_to_unix(uint64_t win_time) { - const size_t ns_in_sec = 10000000; - const uint64_t sec_to_unix = 11644473600LL; - return win_time / ns_in_sec - sec_to_unix; -} - static int parse_htime_item(struct archive_read* a, char unix_time, - uint64_t* where, int64_t* extra_data_size) + int64_t* sec, uint32_t* nsec, int64_t* extra_data_size) { if(unix_time) { uint32_t time_val; @@ -1315,13 +1313,13 @@ return ARCHIVE_EOF; *extra_data_size -= 4; - *where = (uint64_t) time_val; + *sec = (int64_t) time_val; } else { uint64_t windows_time; if(!read_u64(a, &windows_time)) return ARCHIVE_EOF; - *where = time_win_to_unix(windows_time); + ntfs_to_unix(windows_time, sec, nsec); *extra_data_size -= 8; } @@ -1385,7 +1383,7 @@ static int parse_file_extra_htime(struct archive_read* a, struct archive_entry* e, struct rar5* rar, int64_t* extra_data_size) { - char unix_time = 0; + char unix_time, has_unix_ns, has_mtime, has_ctime, has_atime; size_t flags = 0; size_t value_len; @@ -1406,32 +1404,62 @@ } unix_time = flags & IS_UNIX; + has_unix_ns = unix_time && (flags & HAS_UNIX_NS); + has_mtime = flags & HAS_MTIME; + has_atime = flags & HAS_ATIME; + has_ctime = flags & HAS_CTIME; + rar->file.e_atime_ns = rar->file.e_ctime_ns = rar->file.e_mtime_ns = 0; - if(flags & HAS_MTIME) { + if(has_mtime) { parse_htime_item(a, unix_time, &rar->file.e_mtime, - extra_data_size); - archive_entry_set_mtime(e, rar->file.e_mtime, 0); + &rar->file.e_mtime_ns, extra_data_size); } - if(flags & HAS_CTIME) { + if(has_ctime) { parse_htime_item(a, unix_time, &rar->file.e_ctime, - extra_data_size); - archive_entry_set_ctime(e, rar->file.e_ctime, 0); + &rar->file.e_ctime_ns, extra_data_size); } - if(flags & HAS_ATIME) { + if(has_atime) { parse_htime_item(a, unix_time, &rar->file.e_atime, - extra_data_size); - archive_entry_set_atime(e, rar->file.e_atime, 0); + &rar->file.e_atime_ns, extra_data_size); } - if(flags & HAS_UNIX_NS) { - if(!read_u32(a, &rar->file.e_unix_ns)) + if(has_mtime && has_unix_ns) { + if(!read_u32(a, &rar->file.e_mtime_ns)) return ARCHIVE_EOF; *extra_data_size -= 4; } + if(has_ctime && has_unix_ns) { + if(!read_u32(a, &rar->file.e_ctime_ns)) + return ARCHIVE_EOF; + + *extra_data_size -= 4; + } + + if(has_atime && has_unix_ns) { + if(!read_u32(a, &rar->file.e_atime_ns)) + return ARCHIVE_EOF; + + *extra_data_size -= 4; + } + + /* The seconds and nanoseconds are either together, or separated in two + * fields so we parse them, then set the archive_entry's times. */ + if(has_mtime) { + archive_entry_set_mtime(e, rar->file.e_mtime, rar->file.e_mtime_ns); + } + + if(has_ctime) { + archive_entry_set_ctime(e, rar->file.e_ctime, rar->file.e_ctime_ns); + } + + if(has_atime) { + archive_entry_set_atime(e, rar->file.e_atime, rar->file.e_atime_ns); + } + return ARCHIVE_OK; } @@ -1896,7 +1924,8 @@ } else { /* Unknown host OS */ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, - "Unsupported Host OS: 0x%x", (int) host_os); + "Unsupported Host OS: 0x%jx", + (uintmax_t)host_os); return ARCHIVE_FATAL; } @@ -2104,8 +2133,8 @@ default: archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, - "Unsupported extra type (0x%x)", - (int) extra_field_id); + "Unsupported extra type (0x%jx)", + (uintmax_t)extra_field_id); return ARCHIVE_FATAL; } @@ -3093,7 +3122,7 @@ * can be stored in the output buffer directly. * * - Code 256 defines a new filter, which is later used to - * ransform the data block accordingly to the filter type. + * transform the data block accordingly to the filter type. * The data block needs to be fully uncompressed first. * * - Code bigger than 257 and smaller than 262 define @@ -3983,7 +4012,7 @@ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "Compression method not supported: 0x%x", - rar->cstate.method); + (unsigned int)rar->cstate.method); return ARCHIVE_FATAL; } --- contrib/libarchive/libarchive/archive_read_support_format_tar.c.orig +++ contrib/libarchive/libarchive/archive_read_support_format_tar.c @@ -129,7 +129,11 @@ int64_t entry_offset; int64_t entry_padding; int64_t entry_bytes_unconsumed; - int64_t realsize; + int64_t disk_size; + int64_t GNU_sparse_realsize; + int64_t GNU_sparse_size; + int64_t SCHILY_sparse_realsize; + int64_t pax_size; struct sparse_block *sparse_list; struct sparse_block *sparse_last; int64_t sparse_offset; @@ -138,6 +142,7 @@ int sparse_gnu_minor; char sparse_gnu_attributes_seen; char filetype; + char size_fields; /* Bits defined below */ struct archive_string localname; struct archive_string_conv *opt_sconv; @@ -148,9 +153,15 @@ int compat_2x; int process_mac_extensions; int read_concatenated_archives; - int realsize_override; }; +/* Track which size fields were present in the headers */ +#define TAR_SIZE_PAX_SIZE 1 +#define TAR_SIZE_GNU_SPARSE_REALSIZE 2 +#define TAR_SIZE_GNU_SPARSE_SIZE 4 +#define TAR_SIZE_SCHILY_SPARSE_REALSIZE 8 + + static int archive_block_is_null(const char *p); static char *base64_decode(const char *, size_t, size_t *); static int gnu_add_sparse_entry(struct archive_read *, struct tar *, @@ -158,36 +169,36 @@ static void gnu_clear_sparse_list(struct tar *); static int gnu_sparse_old_read(struct archive_read *, struct tar *, - const struct archive_entry_header_gnutar *header, size_t *); + const struct archive_entry_header_gnutar *header, int64_t *); static int gnu_sparse_old_parse(struct archive_read *, struct tar *, const struct gnu_sparse *sparse, int length); static int gnu_sparse_01_parse(struct archive_read *, struct tar *, const char *, size_t); -static ssize_t gnu_sparse_10_read(struct archive_read *, struct tar *, - size_t *); +static int64_t gnu_sparse_10_read(struct archive_read *, struct tar *, + int64_t *); static int header_Solaris_ACL(struct archive_read *, struct tar *, - struct archive_entry *, const void *, size_t *); + struct archive_entry *, const void *, int64_t *); static int header_common(struct archive_read *, struct tar *, struct archive_entry *, const void *); static int header_old_tar(struct archive_read *, struct tar *, struct archive_entry *, const void *); static int header_pax_extension(struct archive_read *, struct tar *, - struct archive_entry *, const void *, size_t *); + struct archive_entry *, const void *, int64_t *); static int header_pax_global(struct archive_read *, struct tar *, - struct archive_entry *, const void *h, size_t *); + struct archive_entry *, const void *h, int64_t *); static int header_gnu_longlink(struct archive_read *, struct tar *, - struct archive_entry *, const void *h, size_t *); + struct archive_entry *, const void *h, int64_t *); static int header_gnu_longname(struct archive_read *, struct tar *, - struct archive_entry *, const void *h, size_t *); + struct archive_entry *, const void *h, int64_t *); static int is_mac_metadata_entry(struct archive_entry *entry); static int read_mac_metadata_blob(struct archive_read *, - struct archive_entry *, size_t *); + struct archive_entry *, int64_t *); static int header_volume(struct archive_read *, struct tar *, - struct archive_entry *, const void *h, size_t *); + struct archive_entry *, const void *h, int64_t *); static int header_ustar(struct archive_read *, struct tar *, struct archive_entry *, const void *h); static int header_gnutar(struct archive_read *, struct tar *, - struct archive_entry *, const void *h, size_t *); + struct archive_entry *, const void *h, int64_t *); static int archive_read_format_tar_bid(struct archive_read *, int); static int archive_read_format_tar_options(struct archive_read *, const char *, const char *); @@ -200,7 +211,7 @@ static int checksum(struct archive_read *, const void *); static int pax_attribute(struct archive_read *, struct tar *, struct archive_entry *, const char *key, size_t key_length, - size_t value_length, size_t *unconsumed); + size_t value_length, int64_t *unconsumed); static int pax_attribute_LIBARCHIVE_xattr(struct archive_entry *, const char *, size_t, const char *, size_t); static int pax_attribute_SCHILY_acl(struct archive_read *, struct tar *, @@ -209,20 +220,20 @@ struct archive_entry *, const char *, size_t); static void pax_time(const char *, size_t, int64_t *sec, long *nanos); static ssize_t readline(struct archive_read *, struct tar *, const char **, - ssize_t limit, size_t *); + ssize_t limit, int64_t *); static int read_body_to_string(struct archive_read *, struct tar *, - struct archive_string *, const void *h, size_t *); + struct archive_string *, const void *h, int64_t *); static int read_bytes_to_string(struct archive_read *, - struct archive_string *, size_t, size_t *); + struct archive_string *, size_t, int64_t *); static int64_t tar_atol(const char *, size_t); static int64_t tar_atol10(const char *, size_t); static int64_t tar_atol256(const char *, size_t); static int64_t tar_atol8(const char *, size_t); static int tar_read_header(struct archive_read *, struct tar *, - struct archive_entry *, size_t *); + struct archive_entry *, int64_t *); static int tohex(int c); static char *url_decode(const char *, size_t); -static void tar_flush_unconsumed(struct archive_read *, size_t *); +static void tar_flush_unconsumed(struct archive_read *, int64_t *); /* Sanity limits: These numbers should be low enough to * prevent a maliciously-crafted archive from forcing us to @@ -467,7 +478,7 @@ * anything outstanding since we're going to do read_aheads */ static void -tar_flush_unconsumed(struct archive_read *a, size_t *unconsumed) +tar_flush_unconsumed(struct archive_read *a, int64_t *unconsumed) { if (*unconsumed) { /* @@ -515,7 +526,8 @@ const char *p; const wchar_t *wp; int r; - size_t l, unconsumed = 0; + size_t l; + int64_t unconsumed = 0; /* Assign default device/inode values. */ archive_entry_set_dev(entry, 1 + default_dev); /* Don't use zero. */ @@ -529,8 +541,7 @@ tar = (struct tar *)(a->format->data); tar->entry_offset = 0; gnu_clear_sparse_list(tar); - tar->realsize = -1; /* Mark this as "unset" */ - tar->realsize_override = 0; + tar->size_fields = 0; /* We don't have any size info yet */ /* Setup default string conversion. */ tar->sconv = tar->opt_sconv; @@ -617,12 +628,15 @@ /* If we're at end of file, return EOF. */ if (tar->sparse_list == NULL || tar->entry_bytes_remaining == 0) { - if (__archive_read_consume(a, tar->entry_padding) < 0) + int64_t request = tar->entry_bytes_remaining + + tar->entry_padding; + + if (__archive_read_consume(a, request) != request) return (ARCHIVE_FATAL); tar->entry_padding = 0; *buff = NULL; *size = 0; - *offset = tar->realsize; + *offset = tar->disk_size; return (ARCHIVE_EOF); } @@ -655,29 +669,15 @@ static int archive_read_format_tar_skip(struct archive_read *a) { - int64_t bytes_skipped; int64_t request; - struct sparse_block *p; struct tar* tar; tar = (struct tar *)(a->format->data); - /* Do not consume the hole of a sparse file. */ - request = 0; - for (p = tar->sparse_list; p != NULL; p = p->next) { - if (!p->hole) { - if (p->remaining >= INT64_MAX - request) { - return ARCHIVE_FATAL; - } - request += p->remaining; - } - } - if (request > tar->entry_bytes_remaining) - request = tar->entry_bytes_remaining; - request += tar->entry_padding + tar->entry_bytes_unconsumed; + request = tar->entry_bytes_remaining + tar->entry_padding + + tar->entry_bytes_unconsumed; - bytes_skipped = __archive_read_consume(a, request); - if (bytes_skipped < 0) + if (__archive_read_consume(a, request) != request) return (ARCHIVE_FATAL); tar->entry_bytes_remaining = 0; @@ -690,13 +690,29 @@ return (ARCHIVE_OK); } +/* + * This function resets the accumulated state while reading + * a header. + */ +static void +tar_reset_header_state(struct tar *tar) +{ + tar->pax_hdrcharset_utf8 = 1; + tar->sparse_gnu_attributes_seen = 0; + archive_string_empty(&(tar->entry_gname)); + archive_string_empty(&(tar->entry_pathname)); + archive_string_empty(&(tar->entry_pathname_override)); + archive_string_empty(&(tar->entry_uname)); + archive_string_empty(&tar->entry_linkpath); +} + /* * This function reads and interprets all of the headers associated * with a single entry. */ static int tar_read_header(struct archive_read *a, struct tar *tar, - struct archive_entry *entry, size_t *unconsumed) + struct archive_entry *entry, int64_t *unconsumed) { ssize_t bytes; int err = ARCHIVE_OK, err2; @@ -715,13 +731,7 @@ static const int32_t seen_x_header = 32; /* Also X */ static const int32_t seen_mac_metadata = 512; - tar->pax_hdrcharset_utf8 = 1; - tar->sparse_gnu_attributes_seen = 0; - archive_string_empty(&(tar->entry_gname)); - archive_string_empty(&(tar->entry_pathname)); - archive_string_empty(&(tar->entry_pathname_override)); - archive_string_empty(&(tar->entry_uname)); - archive_string_empty(&tar->entry_linkpath); + tar_reset_header_state(tar); /* Ensure format is set. */ if (a->archive.archive_format_name == NULL) { @@ -750,7 +760,7 @@ * if there's no regular header, then this is * a premature EOF. */ archive_set_error(&a->archive, EINVAL, - "Damaged tar archive"); + "Damaged tar archive (end-of-archive within a sequence of headers)"); return (ARCHIVE_FATAL); } else { return (ARCHIVE_EOF); @@ -760,7 +770,7 @@ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "Truncated tar archive" - " detected while reading next heaader"); + " detected while reading next header"); return (ARCHIVE_FATAL); } *unconsumed += 512; @@ -787,7 +797,8 @@ /* This is NOT a null block, so it must be a valid header. */ if (!checksum(a, h)) { tar_flush_unconsumed(a, unconsumed); - archive_set_error(&a->archive, EINVAL, "Damaged tar archive"); + archive_set_error(&a->archive, EINVAL, + "Damaged tar archive (bad header checksum)"); /* If we've read some critical information (pax headers, etc) * and _then_ see a bad header, we can't really recover. */ if (eof_fatal) { @@ -804,6 +815,8 @@ switch(header->typeflag[0]) { case 'A': /* Solaris tar ACL */ if (seen_headers & seen_A_header) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Redundant 'A' header"); return (ARCHIVE_FATAL); } seen_headers |= seen_A_header; @@ -813,6 +826,8 @@ break; case 'g': /* POSIX-standard 'g' header. */ if (seen_headers & seen_g_header) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Redundant 'g' header"); return (ARCHIVE_FATAL); } seen_headers |= seen_g_header; @@ -822,27 +837,41 @@ break; case 'K': /* Long link name (GNU tar, others) */ if (seen_headers & seen_K_header) { - return (ARCHIVE_FATAL); + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Damaged archive: Redundant 'K' headers may cause linknames to be incorrect"); + err = err_combine(err, ARCHIVE_WARN); } seen_headers |= seen_K_header; + a->archive.archive_format = ARCHIVE_FORMAT_TAR_GNUTAR; + a->archive.archive_format_name = "GNU tar format"; err2 = header_gnu_longlink(a, tar, entry, h, unconsumed); break; case 'L': /* Long filename (GNU tar, others) */ if (seen_headers & seen_L_header) { - return (ARCHIVE_FATAL); + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Damaged archive: Redundant 'L' headers may cause filenames to be incorrect"); + err = err_combine(err, ARCHIVE_WARN); } seen_headers |= seen_L_header; + a->archive.archive_format = ARCHIVE_FORMAT_TAR_GNUTAR; + a->archive.archive_format_name = "GNU tar format"; err2 = header_gnu_longname(a, tar, entry, h, unconsumed); break; case 'V': /* GNU volume header */ if (seen_headers & seen_V_header) { - return (ARCHIVE_FATAL); + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Redundant 'V' header"); + err = err_combine(err, ARCHIVE_WARN); } seen_headers |= seen_V_header; + a->archive.archive_format = ARCHIVE_FORMAT_TAR_GNUTAR; + a->archive.archive_format_name = "GNU tar format"; err2 = header_volume(a, tar, entry, h, unconsumed); break; case 'X': /* Used by SUN tar; same as 'x'. */ if (seen_headers & seen_x_header) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Redundant 'X'/'x' header"); return (ARCHIVE_FATAL); } seen_headers |= seen_x_header; @@ -853,6 +882,8 @@ break; case 'x': /* POSIX-standard 'x' header. */ if (seen_headers & seen_x_header) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Redundant 'x' header"); return (ARCHIVE_FATAL); } seen_headers |= seen_x_header; @@ -904,6 +935,7 @@ err = err_combine(err, err2); /* Note: Other headers can appear again. */ seen_headers = seen_mac_metadata; + tar_reset_header_state(tar); break; } @@ -1032,13 +1064,13 @@ */ static int header_Solaris_ACL(struct archive_read *a, struct tar *tar, - struct archive_entry *entry, const void *h, size_t *unconsumed) + struct archive_entry *entry, const void *h, int64_t *unconsumed) { const struct archive_entry_header_ustar *header; struct archive_string acl_text; size_t size; int err, acl_type; - int64_t type; + uint64_t type; char *acl, *p; header = (const struct archive_entry_header_ustar *)h; @@ -1075,7 +1107,7 @@ } p++; } - switch ((int)type & ~0777777) { + switch (type & ~0777777) { case 01000000: /* POSIX.1e ACL */ acl_type = ARCHIVE_ENTRY_ACL_TYPE_ACCESS; @@ -1086,8 +1118,8 @@ break; default: archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "Malformed Solaris ACL attribute (unsupported type %o)", - (int)type); + "Malformed Solaris ACL attribute (unsupported type %llu)", + (unsigned long long)type); archive_string_free(&acl_text); return (ARCHIVE_WARN); } @@ -1138,14 +1170,16 @@ */ static int header_gnu_longlink(struct archive_read *a, struct tar *tar, - struct archive_entry *entry, const void *h, size_t *unconsumed) + struct archive_entry *entry, const void *h, int64_t *unconsumed) { int err; struct archive_string linkpath; archive_string_init(&linkpath); err = read_body_to_string(a, tar, &linkpath, h, unconsumed); - archive_entry_set_link(entry, linkpath.s); + if (err == ARCHIVE_OK) { + archive_entry_set_link(entry, linkpath.s); + } archive_string_free(&linkpath); return (err); } @@ -1170,7 +1204,7 @@ */ static int header_gnu_longname(struct archive_read *a, struct tar *tar, - struct archive_entry *entry, const void *h, size_t *unconsumed) + struct archive_entry *entry, const void *h, int64_t *unconsumed) { int err; struct archive_string longname; @@ -1191,7 +1225,7 @@ */ static int header_volume(struct archive_read *a, struct tar *tar, - struct archive_entry *entry, const void *h, size_t *unconsumed) + struct archive_entry *entry, const void *h, int64_t *unconsumed) { const struct archive_entry_header_ustar *header; int64_t size, to_consume; @@ -1217,7 +1251,7 @@ static int read_bytes_to_string(struct archive_read *a, struct archive_string *as, size_t size, - size_t *unconsumed) { + int64_t *unconsumed) { const void *src; /* Fail if we can't make our buffer big enough. */ @@ -1250,7 +1284,7 @@ */ static int read_body_to_string(struct archive_read *a, struct tar *tar, - struct archive_string *as, const void *h, size_t *unconsumed) + struct archive_string *as, const void *h, int64_t *unconsumed) { int64_t size; const struct archive_entry_header_ustar *header; @@ -1259,18 +1293,21 @@ (void)tar; /* UNUSED */ header = (const struct archive_entry_header_ustar *)h; size = tar_atol(header->size, sizeof(header->size)); - if (size > entry_limit) { + if (size < 0 || size > entry_limit) { + archive_set_error(&a->archive, EINVAL, + "Special header has invalid size: %lld", + (long long)size); return (ARCHIVE_FATAL); } - if ((size > (int64_t)pathname_limit) || (size < 0)) { + if (size > (int64_t)pathname_limit) { archive_string_empty(as); int64_t to_consume = ((size + 511) & ~511); if (to_consume != __archive_read_consume(a, to_consume)) { return (ARCHIVE_FATAL); } archive_set_error(&a->archive, EINVAL, - "Special header too large: %d > 1MiB", - (int)size); + "Special header too large: %lld > 1MiB", + (long long)size); return (ARCHIVE_WARN); } r = read_bytes_to_string(a, as, size, unconsumed); @@ -1287,6 +1324,11 @@ * allows header_old_tar and header_ustar * to handle filenames differently, while still putting most of the * common parsing into one place. + * + * This is called _after_ ustar, GNU tar, Schily, etc, special + * fields have already been parsed into the `tar` structure. + * So we can make final decisions here about how to reconcile + * size, mode, etc, information. */ static int header_common(struct archive_read *a, struct tar *tar, @@ -1308,34 +1350,73 @@ archive_entry_set_perm(entry, (mode_t)tar_atol(header->mode, sizeof(header->mode))); } + + /* Set uid, gid, mtime if not already set */ if (!archive_entry_uid_is_set(entry)) { archive_entry_set_uid(entry, tar_atol(header->uid, sizeof(header->uid))); } if (!archive_entry_gid_is_set(entry)) { archive_entry_set_gid(entry, tar_atol(header->gid, sizeof(header->gid))); } + if (!archive_entry_mtime_is_set(entry)) { + archive_entry_set_mtime(entry, tar_atol(header->mtime, sizeof(header->mtime)), 0); + } + + /* Reconcile the size info. */ + /* First, how big is the file on disk? */ + if ((tar->size_fields & TAR_SIZE_GNU_SPARSE_REALSIZE) != 0) { + /* GNU sparse format 1.0 uses `GNU.sparse.realsize` + * to hold the size of the file on disk. */ + tar->disk_size = tar->GNU_sparse_realsize; + } else if ((tar->size_fields & TAR_SIZE_GNU_SPARSE_SIZE) != 0 + && (tar->sparse_gnu_major == 0)) { + /* GNU sparse format 0.0 and 0.1 use `GNU.sparse.size` + * to hold the size of the file on disk. */ + tar->disk_size = tar->GNU_sparse_size; + } else if ((tar->size_fields & TAR_SIZE_SCHILY_SPARSE_REALSIZE) != 0) { + tar->disk_size = tar->SCHILY_sparse_realsize; + } else if ((tar->size_fields & TAR_SIZE_PAX_SIZE) != 0) { + tar->disk_size = tar->pax_size; + } else { + /* There wasn't a suitable pax header, so use the ustar info */ + tar->disk_size = tar_atol(header->size, sizeof(header->size)); + } - tar->entry_bytes_remaining = tar_atol(header->size, sizeof(header->size)); + if (tar->disk_size < 0) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Tar entry has negative file size"); + return (ARCHIVE_FATAL); + } else if (tar->disk_size > entry_limit) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Tar entry size overflow"); + return (ARCHIVE_FATAL); + } else { + archive_entry_set_size(entry, tar->disk_size); + } + + /* Second, how big is the data in the archive? */ + if ((tar->size_fields & TAR_SIZE_GNU_SPARSE_SIZE) != 0 + && (tar->sparse_gnu_major == 1)) { + /* GNU sparse format 1.0 uses `GNU.sparse.size` + * to hold the size of the data in the archive. */ + tar->entry_bytes_remaining = tar->GNU_sparse_size; + } else if ((tar->size_fields & TAR_SIZE_PAX_SIZE) != 0) { + tar->entry_bytes_remaining = tar->pax_size; + } else { + tar->entry_bytes_remaining + = tar_atol(header->size, sizeof(header->size)); + } if (tar->entry_bytes_remaining < 0) { tar->entry_bytes_remaining = 0; archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "Tar entry has negative size"); + "Tar entry has negative size"); return (ARCHIVE_FATAL); - } - if (tar->entry_bytes_remaining > entry_limit) { + } else if (tar->entry_bytes_remaining > entry_limit) { tar->entry_bytes_remaining = 0; archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "Tar entry size overflow"); + "Tar entry size overflow"); return (ARCHIVE_FATAL); } - if (!tar->realsize_override) { - tar->realsize = tar->entry_bytes_remaining; - } - archive_entry_set_size(entry, tar->realsize); - - if (!archive_entry_mtime_is_set(entry)) { - archive_entry_set_mtime(entry, tar_atol(header->mtime, sizeof(header->mtime)), 0); - } /* Handle the tar type flag appropriately. */ tar->filetype = header->typeflag[0]; @@ -1597,7 +1678,7 @@ */ static int read_mac_metadata_blob(struct archive_read *a, - struct archive_entry *entry, size_t *unconsumed) + struct archive_entry *entry, int64_t *unconsumed) { int64_t size; size_t msize; @@ -1654,7 +1735,7 @@ */ static int header_pax_global(struct archive_read *a, struct tar *tar, - struct archive_entry *entry, const void *h, size_t *unconsumed) + struct archive_entry *entry, const void *h, int64_t *unconsumed) { const struct archive_entry_header_ustar *header; int64_t size, to_consume; @@ -1665,7 +1746,10 @@ header = (const struct archive_entry_header_ustar *)h; size = tar_atol(header->size, sizeof(header->size)); - if (size > entry_limit) { + if (size < 0 || size > entry_limit) { + archive_set_error(&a->archive, EINVAL, + "Special header has invalid size: %lld", + (long long)size); return (ARCHIVE_FATAL); } to_consume = ((size + 511) & ~511); @@ -1761,7 +1845,7 @@ static int header_pax_extension(struct archive_read *a, struct tar *tar, - struct archive_entry *entry, const void *h, size_t *unconsumed) + struct archive_entry *entry, const void *h, int64_t *unconsumed) { /* Sanity checks: The largest `x` body I've ever heard of was * a little over 4MB. So I doubt there has ever been a @@ -1812,8 +1896,8 @@ return (ARCHIVE_FATAL); } archive_set_error(&a->archive, EINVAL, - "Ignoring oversized pax extensions: %d > %d", - (int)ext_size, (int)ext_size_limit); + "Ignoring oversized pax extensions: %lld > %lld", + (long long)ext_size, (long long)ext_size_limit); return (ARCHIVE_WARN); } tar_flush_unconsumed(a, unconsumed); @@ -1912,6 +1996,13 @@ *unconsumed += p - attr_start; tar_flush_unconsumed(a, unconsumed); + if (value_length == 0) { + archive_set_error(&a->archive, EINVAL, + "Malformed pax attributes"); + *unconsumed += ext_size + ext_padding; + return (ARCHIVE_WARN); + } + /* pax_attribute will consume value_length - 1 */ r = pax_attribute(a, tar, entry, attr_name.s, archive_strlen(&attr_name), value_length - 1, unconsumed); ext_size -= value_length - 1; @@ -2121,8 +2212,9 @@ if (value_length > acl_limit) { __archive_read_consume(a, value_length); archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "Unreasonably large ACL: %d > %d", - (int)value_length, (int)acl_limit); + "Unreasonably large ACL: %llu > %llu", + (unsigned long long)value_length, + (unsigned long long)acl_limit); return (ARCHIVE_WARN); } @@ -2154,7 +2246,7 @@ } static int -pax_attribute_read_time(struct archive_read *a, size_t value_length, int64_t *ps, long *pn, size_t *unconsumed) { +pax_attribute_read_time(struct archive_read *a, size_t value_length, int64_t *ps, long *pn, int64_t *unconsumed) { struct archive_string as; int r; @@ -2169,12 +2261,16 @@ r = read_bytes_to_string(a, &as, value_length, unconsumed); if (r < ARCHIVE_OK) { archive_string_free(&as); + *ps = 0; + *pn = 0; return (r); } pax_time(as.s, archive_strlen(&as), ps, pn); archive_string_free(&as); - if (*ps < 0 || *ps == INT64_MAX) { + if (*ps == INT64_MIN) { + *ps = 0; + *pn = 0; return (ARCHIVE_WARN); } return (ARCHIVE_OK); @@ -2183,7 +2279,7 @@ static int pax_attribute_read_number(struct archive_read *a, size_t value_length, int64_t *result) { struct archive_string as; - size_t unconsumed = 0; + int64_t unconsumed = 0; int r; if (value_length > 64) { @@ -2197,6 +2293,7 @@ tar_flush_unconsumed(a, &unconsumed); if (r < ARCHIVE_OK) { archive_string_free(&as); + *result = 0; return (r); } @@ -2223,7 +2320,7 @@ */ static int pax_attribute(struct archive_read *a, struct tar *tar, struct archive_entry *entry, - const char *key, size_t key_length, size_t value_length, size_t *unconsumed) + const char *key, size_t key_length, size_t value_length, int64_t *unconsumed) { int64_t t; long n; @@ -2289,10 +2386,13 @@ } else if (key_length == 4 && memcmp(key, "size", 4) == 0) { /* GNU.sparse.size */ + /* This is either the size of stored entry OR the size of data on disk, + * depending on which GNU sparse format version is in use. + * Since pax attributes can be in any order, we may not actually + * know at this point how to interpret this. */ if ((err = pax_attribute_read_number(a, value_length, &t)) == ARCHIVE_OK) { - tar->realsize = t; - archive_entry_set_size(entry, tar->realsize); - tar->realsize_override = 1; + tar->GNU_sparse_size = t; + tar->size_fields |= TAR_SIZE_GNU_SPARSE_SIZE; } return (err); } @@ -2304,8 +2404,9 @@ tar->sparse_gnu_minor = 1; if (value_length > sparse_map_limit) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "Unreasonably large sparse map: %d > %d", - (int)value_length, (int)sparse_map_limit); + "Unreasonably large sparse map: %llu > %llu", + (unsigned long long)value_length, + (unsigned long long)sparse_map_limit); err = ARCHIVE_FAILED; } else { p = __archive_read_ahead(a, value_length, &bytes_read); @@ -2360,11 +2461,10 @@ return (err); } else if (key_length == 8 && memcmp(key, "realsize", 8) == 0) { - /* GNU.sparse.realsize */ + /* GNU.sparse.realsize = size of file on disk */ if ((err = pax_attribute_read_number(a, value_length, &t)) == ARCHIVE_OK) { - tar->realsize = t; - archive_entry_set_size(entry, tar->realsize); - tar->realsize_override = 1; + tar->GNU_sparse_realsize = t; + tar->size_fields |= TAR_SIZE_GNU_SPARSE_REALSIZE; } return (err); } @@ -2413,8 +2513,8 @@ } else { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "symlink type is very long" - "(longest recognized value is 4 bytes, this is %d)", - (int)value_length); + "(longest recognized value is 4 bytes, this is %llu)", + (unsigned long long)value_length); err = ARCHIVE_WARN; } __archive_read_consume(a, value_length); @@ -2450,8 +2550,9 @@ if (value_length > xattr_limit) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "Ignoring unreasonably large security.selinux attribute:" - " %d > %d", - (int)value_length, (int)xattr_limit); + " %llu > %llu", + (unsigned long long)value_length, + (unsigned long long)xattr_limit); /* TODO: Should this be FAILED instead? */ err = ARCHIVE_WARN; } else { @@ -2545,12 +2646,12 @@ } else if (key_length == 8 && memcmp(key, "realsize", 8) == 0) { if ((err = pax_attribute_read_number(a, value_length, &t)) == ARCHIVE_OK) { - tar->realsize = t; - tar->realsize_override = 1; - archive_entry_set_size(entry, tar->realsize); + tar->SCHILY_sparse_realsize = t; + tar->size_fields |= TAR_SIZE_SCHILY_SPARSE_REALSIZE; } return (err); } + /* TODO: Is there a SCHILY.sparse.size similar to GNU.sparse.size ? */ else if (key_length > 6 && memcmp(key, "xattr.", 6) == 0) { key_length -= 6; key += 6; @@ -2568,8 +2669,9 @@ } } else { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "Unreasonably large xattr: %d > %d", - (int)value_length, (int)xattr_limit); + "Unreasonably large xattr: %llu > %llu", + (unsigned long long)value_length, + (unsigned long long)xattr_limit); err = ARCHIVE_WARN; } __archive_read_consume(a, value_length); @@ -2599,8 +2701,9 @@ } } else { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "Unreasonably large sparse map: %d > %d", - (int)value_length, (int)sparse_map_limit); + "Unreasonably large sparse map: %llu > %llu", + (unsigned long long)value_length, + (unsigned long long)sparse_map_limit); err = ARCHIVE_FAILED; } __archive_read_consume(a, value_length); @@ -2669,8 +2772,8 @@ } } else { archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, - "hdrcharset attribute is unreasonably large (%d bytes)", - (int)value_length); + "hdrcharset attribute is unreasonably large (%llu bytes)", + (unsigned long long)value_length); err = ARCHIVE_WARN; } __archive_read_consume(a, value_length); @@ -2717,19 +2820,8 @@ if (key_length == 4 && memcmp(key, "size", 4) == 0) { /* "size" is the size of the data in the entry. */ if ((err = pax_attribute_read_number(a, value_length, &t)) == ARCHIVE_OK) { - tar->entry_bytes_remaining = t; - /* - * The "size" pax header keyword always overrides the - * "size" field in the tar header. - * GNU.sparse.realsize, GNU.sparse.size and - * SCHILY.realsize override this value. - */ - if (!tar->realsize_override) { - archive_entry_set_size(entry, - tar->entry_bytes_remaining); - tar->realsize - = tar->entry_bytes_remaining; - } + tar->pax_size = t; + tar->size_fields |= TAR_SIZE_PAX_SIZE; } else if (t == INT64_MAX) { /* Note: pax_attr_read_number returns INT64_MAX on overflow or < 0 */ @@ -2768,7 +2860,9 @@ /* - * parse a decimal time value, which may include a fractional portion + * Parse a decimal time value, which may include a fractional portion + * + * Sets ps to INT64_MIN on error. */ static void pax_time(const char *p, size_t length, int64_t *ps, long *pn) @@ -2784,6 +2878,7 @@ if (length <= 0) { *ps = 0; + *pn = 0; return; } s = 0; @@ -2797,8 +2892,9 @@ digit = *p - '0'; if (s > limit || (s == limit && digit > last_digit_limit)) { - s = INT64_MAX; - break; + *ps = INT64_MIN; + *pn = 0; + return; } s = (s * 10) + digit; ++p; @@ -2829,7 +2925,7 @@ */ static int header_gnutar(struct archive_read *a, struct tar *tar, - struct archive_entry *entry, const void *h, size_t *unconsumed) + struct archive_entry *entry, const void *h, int64_t *unconsumed) { const struct archive_entry_header_gnutar *header; int64_t t; @@ -2841,11 +2937,6 @@ * filename is stored as in old-style archives. */ - /* Grab fields common to all tar variants. */ - err = header_common(a, tar, entry, h); - if (err == ARCHIVE_FATAL) - return (err); - /* Copy filename over (to ensure null termination). */ header = (const struct archive_entry_header_gnutar *)h; const char *existing_pathname = archive_entry_pathname(entry); @@ -2894,8 +2985,6 @@ archive_entry_set_rdev(entry, 0); } - tar->entry_padding = 0x1ff & (-tar->entry_bytes_remaining); - /* Grab GNU-specific fields. */ if (!archive_entry_atime_is_set(entry)) { t = tar_atol(header->atime, sizeof(header->atime)); @@ -2909,10 +2998,10 @@ } if (header->realsize[0] != 0) { - tar->realsize + /* Treat as a synonym for the pax GNU.sparse.realsize attr */ + tar->GNU_sparse_realsize = tar_atol(header->realsize, sizeof(header->realsize)); - archive_entry_set_size(entry, tar->realsize); - tar->realsize_override = 1; + tar->size_fields |= TAR_SIZE_GNU_SPARSE_REALSIZE; } if (header->sparse[0].offset[0] != 0) { @@ -2925,6 +3014,13 @@ } } + /* Grab fields common to all tar variants. */ + err = header_common(a, tar, entry, h); + if (err == ARCHIVE_FATAL) + return (err); + + tar->entry_padding = 0x1ff & (-tar->entry_bytes_remaining); + return (err); } @@ -2980,7 +3076,7 @@ static int gnu_sparse_old_read(struct archive_read *a, struct tar *tar, - const struct archive_entry_header_gnutar *header, size_t *unconsumed) + const struct archive_entry_header_gnutar *header, int64_t *unconsumed) { ssize_t bytes_read; const void *data; @@ -3104,8 +3200,7 @@ * it's not possible to support both variants. This code supports * the later variant at the expense of not supporting the former. * - * This variant also replaced GNU.sparse.size with GNU.sparse.realsize - * and introduced the GNU.sparse.major/GNU.sparse.minor attributes. + * This variant also introduced the GNU.sparse.major/GNU.sparse.minor attributes. */ /* @@ -3115,7 +3210,7 @@ */ static int64_t gnu_sparse_10_atol(struct archive_read *a, struct tar *tar, - int64_t *remaining, size_t *unconsumed) + int64_t *remaining, int64_t *unconsumed) { int64_t l, limit, last_digit_limit; const char *p; @@ -3160,12 +3255,10 @@ * Returns length (in bytes) of the sparse data description * that was read. */ -static ssize_t -gnu_sparse_10_read(struct archive_read *a, struct tar *tar, size_t *unconsumed) +static int64_t +gnu_sparse_10_read(struct archive_read *a, struct tar *tar, int64_t *unconsumed) { - ssize_t bytes_read; - int entries; - int64_t offset, size, to_skip, remaining; + int64_t bytes_read, entries, offset, size, to_skip, remaining; /* Clear out the existing sparse list. */ gnu_clear_sparse_list(tar); @@ -3173,7 +3266,7 @@ remaining = tar->entry_bytes_remaining; /* Parse entries. */ - entries = (int)gnu_sparse_10_atol(a, tar, &remaining, unconsumed); + entries = gnu_sparse_10_atol(a, tar, &remaining, unconsumed); if (entries < 0) return (ARCHIVE_FATAL); /* Parse the individual entries. */ @@ -3191,14 +3284,14 @@ } /* Skip rest of block... */ tar_flush_unconsumed(a, unconsumed); - bytes_read = (ssize_t)(tar->entry_bytes_remaining - remaining); + bytes_read = tar->entry_bytes_remaining - remaining; to_skip = 0x1ff & -bytes_read; /* Fail if tar->entry_bytes_remaing would get negative */ if (to_skip > remaining) return (ARCHIVE_FATAL); if (to_skip != __archive_read_consume(a, to_skip)) return (ARCHIVE_FATAL); - return ((ssize_t)(bytes_read + to_skip)); + return (bytes_read + to_skip); } /* @@ -3408,7 +3501,7 @@ */ static ssize_t readline(struct archive_read *a, struct tar *tar, const char **start, - ssize_t limit, size_t *unconsumed) + ssize_t limit, int64_t *unconsumed) { ssize_t bytes_read; ssize_t total_size = 0; --- contrib/libarchive/libarchive/archive_read_support_format_warc.c.orig +++ contrib/libarchive/libarchive/archive_read_support_format_warc.c @@ -386,7 +386,8 @@ case LAST_WT: default: /* consume the content and start over */ - _warc_skip(a); + if (_warc_skip(a) < 0) + return (ARCHIVE_FATAL); goto start_over; } return (ARCHIVE_OK); @@ -439,7 +440,9 @@ { struct warc_s *w = a->format->data; - __archive_read_consume(a, w->cntlen + 4U/*\r\n\r\n separator*/); + if (__archive_read_consume(a, w->cntlen) < 0 || + __archive_read_consume(a, 4U/*\r\n\r\n separator*/) < 0) + return (ARCHIVE_FATAL); w->cntlen = 0U; w->cntoff = 0U; return (ARCHIVE_OK); --- contrib/libarchive/libarchive/archive_read_support_format_xar.c.orig +++ contrib/libarchive/libarchive/archive_read_support_format_xar.c @@ -36,6 +36,10 @@ #include #elif HAVE_EXPAT_H #include +#elif HAVE_XMLLITE_H +#include +#include +#include #endif #ifdef HAVE_BZLIB_H #include @@ -56,12 +60,13 @@ #include "archive_read_private.h" #if (!defined(HAVE_LIBXML_XMLREADER_H) && \ - !defined(HAVE_BSDXML_H) && !defined(HAVE_EXPAT_H)) ||\ + !defined(HAVE_BSDXML_H) && !defined(HAVE_EXPAT_H) && \ + !defined(HAVE_XMLLITE_H)) ||\ !defined(HAVE_ZLIB_H) || \ !defined(ARCHIVE_HAS_MD5) || !defined(ARCHIVE_HAS_SHA1) /* * xar needs several external libraries. - * o libxml2 or expat --- XML parser + * o libxml2, expat or (Windows only) xmllite --- XML parser * o openssl or MD5/SHA1 hash function * o zlib * o bzlib2 (option) @@ -438,6 +443,8 @@ static void expat_end_cb(void *, const XML_Char *); static void expat_data_cb(void *, const XML_Char *, int); static int expat_read_toc(struct archive_read *); +#elif defined(HAVE_XMLLITE_H) +static int xmllite_read_toc(struct archive_read *); #endif int @@ -589,6 +596,8 @@ r = xml2_read_toc(a); #elif defined(HAVE_BSDXML_H) || defined(HAVE_EXPAT_H) r = expat_read_toc(a); +#elif defined(HAVE_XMLLITE_H) + r = xmllite_read_toc(a); #endif if (r != ARCHIVE_OK) return (r); @@ -1110,17 +1119,17 @@ while (bsize && psize > 1) { unsigned char x; - if (p[0] >= 'a' && p[0] <= 'z') + if (p[0] >= 'a' && p[0] <= 'f') x = (p[0] - 'a' + 0x0a) << 4; - else if (p[0] >= 'A' && p[0] <= 'Z') + else if (p[0] >= 'A' && p[0] <= 'F') x = (p[0] - 'A' + 0x0a) << 4; else if (p[0] >= '0' && p[0] <= '9') x = (p[0] - '0') << 4; else return (-1); - if (p[1] >= 'a' && p[1] <= 'z') + if (p[1] >= 'a' && p[1] <= 'f') x |= p[1] - 'a' + 0x0a; - else if (p[1] >= 'A' && p[1] <= 'Z') + else if (p[1] >= 'A' && p[1] <= 'F') x |= p[1] - 'A' + 0x0a; else if (p[1] >= '0' && p[1] <= '9') x |= p[1] - '0'; @@ -1745,15 +1754,6 @@ #if defined(HAVE_LZMA_H) && defined(HAVE_LIBLZMA) if (xar->lzstream_valid) lzma_end(&(xar->lzstream)); -#elif defined(HAVE_LZMA_H) && defined(HAVE_LIBLZMA) - if (xar->lzstream_valid) { - if (lzmadec_end(&(xar->lzstream)) != LZMADEC_OK) { - archive_set_error(&a->archive, - ARCHIVE_ERRNO_MISC, - "Failed to clean up lzmadec decompressor"); - r = ARCHIVE_FATAL; - } - } #endif return (r); } @@ -2070,7 +2070,7 @@ if (xar->file->link > 0) if (add_link(a, xar, xar->file) != ARCHIVE_OK) { return (ARCHIVE_FATAL); - }; + } } } } @@ -2851,7 +2851,6 @@ xar->file->has |= HAS_XATTR; archive_strncpy(&(xar->xattr->fstype), s, len); break; - break; case FILE_ACL_DEFAULT: case FILE_ACL_ACCESS: case FILE_ACL_APPLEEXTENDED: @@ -3343,6 +3342,326 @@ XML_ParserFree(parser); return (ud.state); } -#endif /* defined(HAVE_BSDXML_H) || defined(HAVE_EXPAT_H) */ + +#elif defined(HAVE_XMLLITE_H) + +struct ArchiveStreamAdapter { + const ISequentialStreamVtbl *lpVtbl; /* see asaStaticVtable */ + struct archive_read *a; +}; + +static HRESULT STDMETHODCALLTYPE +asaQueryInterface(ISequentialStream *this, REFIID riid, void **ppv) +{ + if (!IsEqualIID(riid, &IID_ISequentialStream)) { + *ppv = NULL; + return E_NOINTERFACE; + } + *ppv = this; + return S_OK; +} + +/* + * We can dispense with reference counting as we tightly manage the lifetime + * of an ArchiveStreamAdapter. + */ +static ULONG STDMETHODCALLTYPE +asaAddRef(ISequentialStream *this) +{ + (void)this; /* UNUSED */ + return ULONG_MAX; +} + +static ULONG STDMETHODCALLTYPE +asaRelease(ISequentialStream *this) +{ + (void)this; /* UNUSED */ + return ULONG_MAX; +} + +static HRESULT STDMETHODCALLTYPE +asaRead(ISequentialStream *this, void *pv, ULONG cb, ULONG *pcbRead) +{ + struct ArchiveStreamAdapter *asa = (struct ArchiveStreamAdapter *)this; + struct archive_read *a; + struct xar *xar; + const void *d = pv; + size_t outbytes = cb; + size_t used = 0; + int r; + + a = asa->a; + xar = (struct xar *)(a->format->data); + + *pcbRead = 0; + + if (xar->toc_remaining <= 0) + return cb != 0 ? S_FALSE : S_OK; + + r = rd_contents(a, &d, &outbytes, &used, xar->toc_remaining); + if (r != ARCHIVE_OK) + return E_FAIL; + __archive_read_consume(a, used); + xar->toc_remaining -= used; + xar->offset += used; + xar->toc_total += outbytes; + PRINT_TOC(pv, outbytes); + + *pcbRead = (ULONG)outbytes; + return outbytes < cb ? S_FALSE : S_OK; +} + +static HRESULT STDMETHODCALLTYPE +asaWrite(ISequentialStream *this, const void *pv, ULONG cb, ULONG *pcbWritten) +{ + (void)this; /* UNUSED */ + (void)pv; /* UNUSED */ + (void)cb; /* UNUSED */ + if (!pcbWritten) return E_INVALIDARG; + *pcbWritten = 0; + return E_NOTIMPL; +} + +static const ISequentialStreamVtbl asaStaticVtable = { + .QueryInterface = asaQueryInterface, + .AddRef = asaAddRef, + .Release = asaRelease, + .Read = asaRead, + .Write = asaWrite, +}; + +static int +xmllite_create_stream_adapter(struct archive_read *a, + struct ArchiveStreamAdapter **pasa) +{ + struct ArchiveStreamAdapter *asa = + calloc(1, sizeof(struct ArchiveStreamAdapter)); + if (!asa) { + archive_set_error(&(a->archive), ENOMEM, "Out of memory"); + return (ARCHIVE_FATAL); + } + asa->lpVtbl = &asaStaticVtable; + asa->a = a; + *pasa = asa; + return (ARCHIVE_OK); +} + +typedef HRESULT(STDMETHODCALLTYPE *xmllite_wstr_func)(IXmlReader *, LPCWSTR *, + UINT *); + +/* + * Returns an narrow-char archive_string in *as after calling + * the wide-char COM API callee() on the XmlReader reader. + * Sets an appropriate error on the archive if it fails. + */ +static int +xmllite_call_return_as(struct archive_read *a, struct archive_string *as, + IXmlReader *reader, xmllite_wstr_func callee) +{ + LPCWSTR wcs; + UINT wlen; + + if (FAILED(callee(reader, &wcs, &wlen))) { + archive_set_error(&(a->archive), ARCHIVE_ERRNO_MISC, + "Failed to read XML data"); + return (ARCHIVE_FATAL); + } + + archive_string_init(as); + if (archive_string_append_from_wcs(as, wcs, (size_t)wlen) < 0) { + archive_string_free(as); + archive_set_error(&(a->archive), ENOMEM, "Out of memory"); + return (ARCHIVE_FATAL); + } + + return (ARCHIVE_OK); +} + +static char * +xmllite_call_return_mbs(struct archive_read *a, IXmlReader *reader, + xmllite_wstr_func callee) +{ + char *ret; + struct archive_string as; + + if (xmllite_call_return_as(a, &as, reader, callee) < 0) { + return NULL; + } + + ret = strdup(as.s); + archive_string_free(&as); + if (ret == NULL) { + archive_set_error(&(a->archive), ENOMEM, "Out of memory"); + return NULL; + } + return ret; +} + +static int +xmllite_xmlattr_setup(struct archive_read *a, + struct xmlattr_list *list, IXmlReader *reader) +{ + struct xmlattr *attr; + HRESULT hr; + + list->first = NULL; + list->last = &(list->first); + hr = reader->lpVtbl->MoveToFirstAttribute(reader); + /* Contrary to other checks, we're not using SUCCEEDED/FAILED + * because MoveToNextAttribute returns *S_FALSE* (success!) + * when it runs out of attributes. + */ + while (hr == S_OK) { + /* Attributes implied as being default by the DTD are ignored */ + if (reader->lpVtbl->IsDefault(reader)) + continue; + + attr = malloc(sizeof*(attr)); + if (attr == NULL) { + archive_set_error(&(a->archive), ENOMEM, + "Out of memory"); + return (ARCHIVE_FATAL); + } + + attr->name = xmllite_call_return_mbs(a, reader, + reader->lpVtbl->GetLocalName); + if (attr->name == NULL) { + free(attr); + /* xmllite_call_return_mbs sets an appropriate error */ + return (ARCHIVE_FATAL); + } + + attr->value = xmllite_call_return_mbs(a, reader, + reader->lpVtbl->GetValue); + if (attr->value == NULL) { + free(attr->name); + free(attr); + /* xmllite_call_return_mbs sets an appropriate error */ + return (ARCHIVE_FATAL); + } + + attr->next = NULL; + *list->last = attr; + list->last = &(attr->next); + hr = reader->lpVtbl->MoveToNextAttribute(reader); + } + + if (FAILED(hr)) { + archive_set_error(&(a->archive), ARCHIVE_ERRNO_FILE_FORMAT, + "Failed to parse XML document"); + return (ARCHIVE_FAILED); + } + + return (ARCHIVE_OK); +} + +static int +xmllite_read_toc(struct archive_read *a) +{ + struct ArchiveStreamAdapter *asa = NULL; + char *name; + struct archive_string as; + BOOL empty; + XmlNodeType type; + struct xmlattr_list list; + IXmlReader *reader = NULL; + int r = ARCHIVE_OK; + + if ((r = xmllite_create_stream_adapter(a, &asa)) < 0) { + goto out; + } + + if (FAILED(CreateXmlReader(&IID_IXmlReader, (void **)&reader, NULL))) { + r = ARCHIVE_FATAL; + goto out; + } + + if (FAILED(reader->lpVtbl->SetInput(reader, (IUnknown *)asa))) { + archive_set_error(&(a->archive), ARCHIVE_ERRNO_MISC, + "Failed to prepare XML stream"); + r = ARCHIVE_FATAL; + goto out; + } + + while (!reader->lpVtbl->IsEOF(reader)) { + if (FAILED(reader->lpVtbl->Read(reader, &type))) { + archive_set_error(&(a->archive), ARCHIVE_ERRNO_MISC, + "Failed to read XML stream"); + r = ARCHIVE_FATAL; + goto out; + } + + switch (type) { + case XmlNodeType_Element: + empty = reader->lpVtbl->IsEmptyElement(reader); + + name = xmllite_call_return_mbs(a, reader, + reader->lpVtbl->GetLocalName); + if (name == NULL) { + /* xmllite_call_return_mbs sets an appropriate error */ + r = ARCHIVE_FATAL; + goto out; + } + + r = xmllite_xmlattr_setup(a, &list, reader); + if (r == ARCHIVE_OK) { + r = xml_start(a, name, &list); + } + xmlattr_cleanup(&list); + if (r == ARCHIVE_OK && empty) { + xml_end(a, name); + } + + free(name); + if (r != ARCHIVE_OK) { + goto out; + } + + break; + case XmlNodeType_EndElement: + name = xmllite_call_return_mbs(a, reader, + reader->lpVtbl->GetLocalName); + if (name == NULL) { + /* xmllite_call_return_mbs sets an appropriate error */ + r = ARCHIVE_FATAL; + goto out; + } + + xml_end(a, name); + free(name); + break; + case XmlNodeType_Text: + r = xmllite_call_return_as(a, &as, reader, + reader->lpVtbl->GetValue); + if (r != ARCHIVE_OK) { + /* xmllite_call_return_as sets an appropriate error */ + goto out; + } + + xml_data(a, as.s, (int)archive_strlen(&as)); + archive_string_free(&as); + + case XmlNodeType_None: + case XmlNodeType_Attribute: + case XmlNodeType_CDATA: + case XmlNodeType_ProcessingInstruction: + case XmlNodeType_Comment: + case XmlNodeType_DocumentType: + case XmlNodeType_Whitespace: + case XmlNodeType_XmlDeclaration: + default: + break; + } + } + +out: + if (reader) + reader->lpVtbl->Release(reader); + + free(asa); + + return r; +} +#endif /* defined(XMLLITE) */ #endif /* Support xar format */ --- contrib/libarchive/libarchive/archive_read_support_format_zip.c.orig +++ contrib/libarchive/libarchive/archive_read_support_format_zip.c @@ -71,6 +71,7 @@ #include "archive_private.h" #include "archive_rb.h" #include "archive_read_private.h" +#include "archive_time_private.h" #include "archive_ppmd8_private.h" #ifndef HAVE_ZLIB_H @@ -465,27 +466,6 @@ return "??"; } -/* Convert an MSDOS-style date/time into Unix-style time. */ -static time_t -zip_time(const char *p) -{ - int msTime, msDate; - struct tm ts; - - msTime = (0xff & (unsigned)p[0]) + 256 * (0xff & (unsigned)p[1]); - msDate = (0xff & (unsigned)p[2]) + 256 * (0xff & (unsigned)p[3]); - - memset(&ts, 0, sizeof(ts)); - ts.tm_year = ((msDate >> 9) & 0x7f) + 80; /* Years since 1900. */ - ts.tm_mon = ((msDate >> 5) & 0x0f) - 1; /* Month number. */ - ts.tm_mday = msDate & 0x1f; /* Day of month. */ - ts.tm_hour = (msTime >> 11) & 0x1f; - ts.tm_min = (msTime >> 5) & 0x3f; - ts.tm_sec = (msTime << 1) & 0x3e; - ts.tm_isdst = -1; - return mktime(&ts); -} - /* * The extra data is stored as a list of * id1+size1+data1 + id2+size2+data2 ... @@ -978,7 +958,7 @@ } zip->init_decryption = (zip_entry->zip_flags & ZIP_ENCRYPTED); zip_entry->compression = (char)archive_le16dec(p + 8); - zip_entry->mtime = zip_time(p + 10); + zip_entry->mtime = dos_to_unix(archive_le32dec(p + 10)); zip_entry->crc32 = archive_le32dec(p + 14); if (zip_entry->zip_flags & ZIP_LENGTH_AT_END) zip_entry->decdat = p[11]; @@ -2134,15 +2114,15 @@ if(order < 2 || restore_method > 2) { archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, - "Invalid parameter set in PPMd8 stream (order=%" PRId32 ", " - "restore=%" PRId32 ")", order, restore_method); + "Invalid parameter set in PPMd8 stream (order=%" PRIu32 ", " + "restore=%" PRIu32 ")", order, restore_method); return (ARCHIVE_FAILED); } /* Allocate the memory needed to properly decompress the file. */ if(!__archive_ppmd8_functions.Ppmd8_Alloc(&zip->ppmd8, mem << 20)) { archive_set_error(&a->archive, ENOMEM, - "Unable to allocate memory for PPMd8 stream: %" PRId32 " bytes", + "Unable to allocate memory for PPMd8 stream: %" PRIu32 " bytes", mem << 20); return (ARCHIVE_FATAL); } @@ -3168,7 +3148,6 @@ /* We can't decompress this entry, but we will * be able to skip() it and try the next entry. */ return (ARCHIVE_FAILED); - break; } if (r != ARCHIVE_OK) return (r); @@ -3987,7 +3966,7 @@ zip->has_encrypted_entries = 1; } zip_entry->compression = (char)archive_le16dec(p + 10); - zip_entry->mtime = zip_time(p + 12); + zip_entry->mtime = dos_to_unix(archive_le32dec(p + 12)); zip_entry->crc32 = archive_le32dec(p + 16); if (zip_entry->zip_flags & ZIP_LENGTH_AT_END) zip_entry->decdat = p[13]; --- contrib/libarchive/libarchive/archive_string.c.orig +++ contrib/libarchive/libarchive/archive_string.c @@ -154,7 +154,6 @@ struct archive_string_conv *); static int archive_string_append_from_wcs_in_codepage(struct archive_string *, const wchar_t *, size_t, struct archive_string_conv *); -static int is_big_endian(void); static int strncat_in_codepage(struct archive_string *, const void *, size_t, struct archive_string_conv *); static int win_strncat_from_utf16be(struct archive_string *, const void *, @@ -199,6 +198,29 @@ static int archive_string_append_unicode(struct archive_string *, const void *, size_t, struct archive_string_conv *); +#if defined __LITTLE_ENDIAN__ + #define IS_BIG_ENDIAN 0 +#elif defined __BIG_ENDIAN__ + #define IS_BIG_ENDIAN 1 +#elif defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) + #define IS_BIG_ENDIAN 0 +#elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) + #define IS_BIG_ENDIAN 1 +#elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64) || defined(_M_ARM64)) + #define IS_BIG_ENDIAN 0 +#else +// Detect endianness at runtime. +static int +is_big_endian(void) +{ + uint16_t d = 1; + + return (archive_be16dec(&d) == 1); +} + +#define IS_BIG_ENDIAN is_big_endian() +#endif + static struct archive_string * archive_string_append(struct archive_string *as, const char *p, size_t s) { @@ -450,7 +472,8 @@ archive_wstring_append_from_mbs_in_codepage(struct archive_wstring *dest, const char *s, size_t length, struct archive_string_conv *sc) { - int count, ret = 0; + int ret = 0; + size_t count; UINT from_cp; if (sc != NULL) @@ -472,7 +495,7 @@ ws = dest->s + dest->length; mp = (const unsigned char *)s; count = 0; - while (count < (int)length && *mp) { + while (count < length && *mp) { *ws++ = (wchar_t)*mp++; count++; } @@ -485,7 +508,7 @@ struct archive_string u16; int saved_flag = sc->flag;/* save current flag. */ - if (is_big_endian()) + if (IS_BIG_ENDIAN) sc->flag |= SCONV_TO_UTF16BE; else sc->flag |= SCONV_TO_UTF16LE; @@ -495,16 +518,16 @@ * UTF-16BE/LE NFD ===> UTF-16 NFC * UTF-16BE/LE NFC ===> UTF-16 NFD */ - count = (int)utf16nbytes(s, length); + count = utf16nbytes(s, length); } else { /* * UTF-8 NFD ===> UTF-16 NFC * UTF-8 NFC ===> UTF-16 NFD */ - count = (int)mbsnbytes(s, length); + count = mbsnbytes(s, length); } u16.s = (char *)dest->s; - u16.length = dest->length << 1;; + u16.length = dest->length << 1; u16.buffer_length = dest->buffer_length; if (sc->flag & SCONV_NORMALIZATION_C) ret = archive_string_normalize_C(&u16, s, count, sc); @@ -516,23 +539,23 @@ sc->flag = saved_flag;/* restore the saved flag. */ return (ret); } else if (sc != NULL && (sc->flag & SCONV_FROM_UTF16)) { - count = (int)utf16nbytes(s, length); + count = utf16nbytes(s, length); count >>= 1; /* to be WCS length */ /* Allocate memory for WCS. */ if (NULL == archive_wstring_ensure(dest, dest->length + count + 1)) return (-1); wmemcpy(dest->s + dest->length, (const wchar_t *)s, count); - if ((sc->flag & SCONV_FROM_UTF16BE) && !is_big_endian()) { + if ((sc->flag & SCONV_FROM_UTF16BE) && !IS_BIG_ENDIAN) { uint16_t *u16 = (uint16_t *)(dest->s + dest->length); - int b; + size_t b; for (b = 0; b < count; b++) { uint16_t val = archive_le16dec(u16+b); archive_be16enc(u16+b, val); } - } else if ((sc->flag & SCONV_FROM_UTF16LE) && is_big_endian()) { + } else if ((sc->flag & SCONV_FROM_UTF16LE) && IS_BIG_ENDIAN) { uint16_t *u16 = (uint16_t *)(dest->s + dest->length); - int b; + size_t b; for (b = 0; b < count; b++) { uint16_t val = archive_be16dec(u16+b); archive_le16enc(u16+b, val); @@ -556,21 +579,28 @@ buffsize = dest->length + length + 1; do { + int r; + + /* MultiByteToWideChar is limited to int. */ + if (length > (size_t)INT_MAX || + (dest->buffer_length >> 1) > (size_t)INT_MAX) + return (-1); /* Allocate memory for WCS. */ if (NULL == archive_wstring_ensure(dest, buffsize)) return (-1); /* Convert MBS to WCS. */ - count = MultiByteToWideChar(from_cp, + r = MultiByteToWideChar(from_cp, mbflag, s, (int)length, dest->s + dest->length, (int)(dest->buffer_length >> 1) -1); - if (count == 0 && + if (r == 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER) { /* Expand the WCS buffer. */ buffsize = dest->buffer_length << 1; continue; } - if (count == 0 && length != 0) + if (r == 0 && length != 0) ret = -1; + count = (size_t)r; break; } while (1); } @@ -679,9 +709,9 @@ const wchar_t *ws, size_t len, struct archive_string_conv *sc) { BOOL defchar_used, *dp; - int count, ret = 0; + int ret = 0; UINT to_cp; - int wslen = (int)len; + size_t count, wslen = len; if (sc != NULL) to_cp = sc->to_cp; @@ -720,13 +750,13 @@ count = 0; defchar_used = 0; if (sc->flag & SCONV_TO_UTF16BE) { - while (count < (int)len && *ws) { + while (count < len && *ws) { archive_be16enc(u16+count, *ws); ws++; count++; } } else { - while (count < (int)len && *ws) { + while (count < len && *ws) { archive_le16enc(u16+count, *ws); ws++; count++; @@ -739,15 +769,21 @@ archive_string_ensure(as, as->length + len * 2 + 1)) return (-1); do { + int r; + defchar_used = 0; if (to_cp == CP_UTF8 || sc == NULL) dp = NULL; else dp = &defchar_used; - count = WideCharToMultiByte(to_cp, 0, ws, wslen, + /* WideCharToMultiByte is limited to int. */ + if (as->buffer_length - as->length - 1 > (size_t)INT_MAX || + wslen > (size_t)INT_MAX) + return (-1); + r = WideCharToMultiByte(to_cp, 0, ws, (int)wslen, as->s + as->length, - (int)as->buffer_length - (int)as->length - 1, NULL, dp); - if (count == 0 && + (int)(as->buffer_length - as->length - 1), NULL, dp); + if (r == 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER) { /* Expand the MBS buffer and retry. */ if (NULL == archive_string_ensure(as, @@ -755,8 +791,9 @@ return (-1); continue; } - if (count == 0) + if (r == 0) ret = -1; + count = (size_t)r; break; } while (1); } @@ -2032,7 +2069,7 @@ char *outp; size_t avail, bs; int return_value = 0; /* success */ - int to_size, from_size; + size_t to_size, from_size; if (sc->flag & SCONV_TO_UTF16) to_size = 2; @@ -2051,7 +2088,7 @@ remaining = length; outp = as->s + as->length; avail = as->buffer_length - as->length - to_size; - while (remaining >= (size_t)from_size) { + while (remaining >= from_size) { size_t result = iconv(cd, &itp, &remaining, &outp, &avail); if (result != (size_t)-1) @@ -2174,6 +2211,8 @@ if (codepage != CP_UTF8) mbflag |= MB_PRECOMPOSED; + if (n > (size_t)INT_MAX) + return (-1); /* Invalid */ if (MultiByteToWideChar(codepage, mbflag, p, (int)n, NULL, 0) == 0) return (-1); /* Invalid */ return (0); /* Okay */ @@ -2327,7 +2366,7 @@ cnt = utf8_count[ch]; /* Invalid sequence or there are not plenty bytes. */ - if ((int)n < cnt) { + if (n < (size_t)cnt) { cnt = (int)n; for (i = 1; i < cnt; i++) { if ((s[i] & 0xc0) != 0x80) { @@ -2396,7 +2435,7 @@ cnt = 6; else cnt = 1; - if ((int)n < cnt) + if (n < (size_t)cnt) cnt = (int)n; for (i = 1; i < cnt; i++) { if ((s[i] & 0xc0) != 0x80) { @@ -2612,7 +2651,7 @@ } else { if (remaining < 2) return (0); - archive_be16enc(utf16, uc); + archive_be16enc(utf16, (uint16_t)uc); return (2); } } @@ -2634,7 +2673,7 @@ } else { if (remaining < 2) return (0); - archive_le16enc(utf16, uc); + archive_le16enc(utf16, (uint16_t)uc); return (2); } } @@ -3499,10 +3538,9 @@ { struct archive_string tmp; const char *u16; - int ll; BOOL defchar; char *mbs; - size_t mbs_size, b; + size_t mbs_size, b, ll; int ret = 0; bytes &= ~1; @@ -3538,7 +3576,7 @@ archive_string_init(&tmp); if (be) { - if (is_big_endian()) { + if (IS_BIG_ENDIAN) { u16 = _p; } else { if (archive_string_ensure(&tmp, bytes+2) == NULL) @@ -3551,7 +3589,7 @@ u16 = tmp.s; } } else { - if (!is_big_endian()) { + if (!IS_BIG_ENDIAN) { u16 = _p; } else { if (archive_string_ensure(&tmp, bytes+2) == NULL) @@ -3566,18 +3604,24 @@ } do { + int r; defchar = 0; - ll = WideCharToMultiByte(sc->to_cp, 0, + /* WideCharToMultiByte is limited to int. */ + if (bytes > (size_t)INT_MAX || mbs_size > (size_t)INT_MAX) + return (-1); + r = WideCharToMultiByte(sc->to_cp, 0, (LPCWSTR)u16, (int)bytes>>1, mbs, (int)mbs_size, NULL, &defchar); /* Exit loop if we succeeded */ - if (ll != 0 || + if (r != 0 || GetLastError() != ERROR_INSUFFICIENT_BUFFER) { + ll = (size_t)r; break; } /* Else expand buffer and loop to try again. */ - ll = WideCharToMultiByte(sc->to_cp, 0, + r = WideCharToMultiByte(sc->to_cp, 0, (LPCWSTR)u16, (int)bytes, NULL, 0, NULL, NULL); + ll = (size_t)r; if (archive_string_ensure(as, ll +1) == NULL) return (-1); mbs = as->s + as->length; @@ -3605,14 +3649,6 @@ return (win_strncat_from_utf16(as, _p, bytes, sc, 0)); } -static int -is_big_endian(void) -{ - uint16_t d = 1; - - return (archive_be16dec(&d) == 1); -} - /* * Convert a current locale string to UTF-16BE/LE and copy the result. * Return -1 if conversion fails. @@ -3651,16 +3687,21 @@ return (0); } do { - count = MultiByteToWideChar(sc->from_cp, + int r; + if (length > (size_t)INT_MAX || (avail >> 1) > (size_t)INT_MAX) + return (-1); + r = MultiByteToWideChar(sc->from_cp, MB_PRECOMPOSED, s, (int)length, (LPWSTR)u16, (int)avail>>1); /* Exit loop if we succeeded */ - if (count != 0 || + if (r != 0 || GetLastError() != ERROR_INSUFFICIENT_BUFFER) { + count = (size_t)r; break; } /* Expand buffer and try again */ - count = MultiByteToWideChar(sc->from_cp, + r = MultiByteToWideChar(sc->from_cp, MB_PRECOMPOSED, s, (int)length, NULL, 0); + count = (size_t)r; if (archive_string_ensure(as16, (count +1) * 2) == NULL) return (-1); @@ -3673,7 +3714,7 @@ if (count == 0) return (-1); - if (is_big_endian()) { + if (IS_BIG_ENDIAN) { if (!bigendian) { while (count > 0) { uint16_t v = archive_be16dec(u16); @@ -3811,9 +3852,9 @@ ret = -1; } if (bigendian) - archive_be16enc(utf16, c); + archive_be16enc(utf16, (uint16_t)c); else - archive_le16enc(utf16, c); + archive_le16enc(utf16, (uint16_t)c); utf16 += 2; } as16->length = utf16 - as16->s; --- contrib/libarchive/libarchive/archive_string_composition.h.orig +++ contrib/libarchive/libarchive/archive_string_composition.h @@ -2286,5 +2286,4 @@ { 0x110AB , 0x110A5 , 0x110BA }, }; -#endif /* ARCHIVE_STRING_COMPOSITION_H_INCLUDED */ - +#endif /* !ARCHIVE_STRING_COMPOSITION_H_INCLUDED */ --- contrib/libarchive/libarchive/archive_string_sprintf.c.orig +++ contrib/libarchive/libarchive/archive_string_sprintf.c @@ -116,8 +116,14 @@ long_flag = '\0'; switch(*p) { - case 'j': case 'l': + if (p[1] == 'l') { + long_flag = 'L'; + p += 2; + break; + } + __LA_FALLTHROUGH; + case 'j': case 'z': long_flag = *p; p++; @@ -136,6 +142,7 @@ switch(long_flag) { case 'j': s = va_arg(ap, intmax_t); break; case 'l': s = va_arg(ap, long); break; + case 'L': s = va_arg(ap, long long); break; case 'z': s = va_arg(ap, ssize_t); break; default: s = va_arg(ap, int); break; } @@ -144,6 +151,7 @@ case 's': switch(long_flag) { case 'l': + case 'L': pw = va_arg(ap, wchar_t *); if (pw == NULL) pw = L"(null)"; @@ -172,6 +180,7 @@ switch(long_flag) { case 'j': u = va_arg(ap, uintmax_t); break; case 'l': u = va_arg(ap, unsigned long); break; + case 'L': u = va_arg(ap, unsigned long long); break; case 'z': u = va_arg(ap, size_t); break; default: u = va_arg(ap, unsigned int); break; } --- /dev/null +++ contrib/libarchive/libarchive/archive_time.c @@ -0,0 +1,163 @@ +/*- + * Copyright © 2025 ARJANEN Loïc Jean David + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) 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. + */ + +#include "archive_platform.h" +#include "archive_private.h" +#include "archive_time_private.h" +#include +#include +#include + +#define NTFS_EPOC_TIME ARCHIVE_LITERAL_ULL(11644473600) +#define NTFS_TICKS ARCHIVE_LITERAL_ULL(10000000) +#define NTFS_EPOC_TICKS (NTFS_EPOC_TIME * NTFS_TICKS) +#define DOS_MIN_TIME 0x00210000U +#define DOS_MAX_TIME 0xff9fbf7dU + +#if defined(_WIN32) && !defined(__CYGWIN__) +#include +/* Windows FILETIME to NTFS time. */ +uint64_t +FILETIME_to_ntfs(const FILETIME* filetime) +{ + ULARGE_INTEGER utc; + utc.HighPart = filetime->dwHighDateTime; + utc.LowPart = filetime->dwLowDateTime; + return utc.QuadPart; +} +#endif + +/* Convert an MSDOS-style date/time into Unix-style time. */ +int64_t +dos_to_unix(uint32_t dos_time) +{ + uint16_t msTime, msDate; + struct tm ts; + time_t t; + + msTime = (0xFFFF & dos_time); + msDate = (dos_time >> 16); + + memset(&ts, 0, sizeof(ts)); + ts.tm_year = ((msDate >> 9) & 0x7f) + 80; /* Years since 1900. */ + ts.tm_mon = ((msDate >> 5) & 0x0f) - 1; /* Month number. */ + ts.tm_mday = msDate & 0x1f; /* Day of month. */ + ts.tm_hour = (msTime >> 11) & 0x1f; + ts.tm_min = (msTime >> 5) & 0x3f; + ts.tm_sec = (msTime << 1) & 0x3e; + ts.tm_isdst = -1; + t = mktime(&ts); + return (int64_t)(t == (time_t)-1 ? INT32_MAX : t); +} + +/* Convert into MSDOS-style date/time. */ +uint32_t +unix_to_dos(int64_t unix_time) +{ + struct tm *t; + uint32_t dt; + time_t ut = unix_time; +#if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S) + struct tm tmbuf; +#endif + + if (sizeof(time_t) < sizeof(int64_t) && (int64_t)ut != unix_time) { + ut = (time_t)(unix_time > 0 ? INT32_MAX : INT32_MIN); + } + +#if defined(HAVE_LOCALTIME_S) + t = localtime_s(&tmbuf, &ut) ? NULL : &tmbuf; +#elif defined(HAVE_LOCALTIME_R) + t = localtime_r(&ut, &tmbuf); +#else + t = localtime(&ut); +#endif + dt = 0; + if (t != NULL && t->tm_year >= INT_MIN + 80) { + const int year = t->tm_year - 80; + + if (year & ~0x7f) { + dt = year > 0 ? DOS_MAX_TIME : DOS_MIN_TIME; + } + else { + dt += (year & 0x7f) << 9; + dt += ((t->tm_mon + 1) & 0x0f) << 5; + dt += (t->tm_mday & 0x1f); + dt <<= 16; + dt += (t->tm_hour & 0x1f) << 11; + dt += (t->tm_min & 0x3f) << 5; + /* Only counting every 2 seconds. */ + dt += (t->tm_sec & 0x3e) >> 1; + } + } + if (dt > DOS_MAX_TIME) { + dt = DOS_MAX_TIME; + } + else if (dt < DOS_MIN_TIME) { + dt = DOS_MIN_TIME; + } + return dt; +} + +/* Convert NTFS time to Unix sec/nsec */ +void +ntfs_to_unix(uint64_t ntfs, int64_t* secs, uint32_t* nsecs) +{ + if (ntfs > INT64_MAX) { + ntfs -= NTFS_EPOC_TICKS; + *secs = ntfs / NTFS_TICKS; + *nsecs = 100 * (ntfs % NTFS_TICKS); + } + else { + lldiv_t tdiv; + int64_t value = (int64_t)ntfs - (int64_t)NTFS_EPOC_TICKS; + + tdiv = lldiv(value, NTFS_TICKS); + *secs = tdiv.quot; + *nsecs = (uint32_t)(tdiv.rem * 100); + } +} + +/* Convert Unix sec/nsec to NTFS time */ +uint64_t +unix_to_ntfs(int64_t secs, uint32_t nsecs) +{ + uint64_t ntfs; + + if (secs < -(int64_t)NTFS_EPOC_TIME) + return 0; + + ntfs = secs + NTFS_EPOC_TIME; + + if (ntfs > UINT64_MAX / NTFS_TICKS) + return UINT64_MAX; + + ntfs *= NTFS_TICKS; + + if (ntfs > UINT64_MAX - nsecs/100) + return UINT64_MAX; + + return ntfs + nsecs/100; +} --- /dev/null +++ contrib/libarchive/libarchive/archive_time_private.h @@ -0,0 +1,47 @@ +/*- + * Copyright © 2025 ARJANEN Loïc Jean David + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) 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. + */ +#ifndef ARCHIVE_TIME_PRIVATE_H_INCLUDED +#define ARCHIVE_TIME_PRIVATE_H_INCLUDED + +#ifndef __LIBARCHIVE_BUILD +#error This header is only to be used internally to libarchive. +#endif +#include + +/* NTFS time to Unix sec/nsec. */ +void ntfs_to_unix(uint64_t ntfs, int64_t* secs, uint32_t* nsecs); +/* DOS time to Unix sec. */ +int64_t dos_to_unix(uint32_t dos); +/* Unix sec/nsec to NTFS time. */ +uint64_t unix_to_ntfs(int64_t secs, uint32_t nsecs); +/* Unix sec to DOS time. */ +uint32_t unix_to_dos(int64_t secs); +#if defined(_WIN32) && !defined(__CYGWIN__) +#include +#include +/* Windows FILETIME to NTFS time. */ +uint64_t FILETIME_to_ntfs(const FILETIME* filetime); +#endif +#endif /* ARCHIVE_TIME_PRIVATE_H_INCLUDED */ --- contrib/libarchive/libarchive/archive_util.c.orig +++ contrib/libarchive/libarchive/archive_util.c @@ -77,7 +77,9 @@ #define O_CLOEXEC 0 #endif -static int archive_utility_string_sort_helper(char **, unsigned int); +#if ARCHIVE_VERSION_NUMBER < 4000000 +static int __LA_LIBC_CC archive_utility_string_sort_helper(const void *, const void *); +#endif /* Generic initialization of 'struct archive' objects. */ int @@ -629,74 +631,28 @@ #endif } +#if ARCHIVE_VERSION_NUMBER < 4000000 /* - * Utility function to sort a group of strings using quicksort. + * Utility functions to sort a group of strings using quicksort. */ static int -archive_utility_string_sort_helper(char **strings, unsigned int n) +__LA_LIBC_CC +archive_utility_string_sort_helper(const void *p1, const void *p2) { - unsigned int i, lesser_count, greater_count; - char **lesser, **greater, **tmp, *pivot; - int retval1, retval2; - - /* A list of 0 or 1 elements is already sorted */ - if (n <= 1) - return (ARCHIVE_OK); - - lesser_count = greater_count = 0; - lesser = greater = NULL; - pivot = strings[0]; - for (i = 1; i < n; i++) - { - if (strcmp(strings[i], pivot) < 0) - { - lesser_count++; - tmp = realloc(lesser, lesser_count * sizeof(*tmp)); - if (!tmp) { - free(greater); - free(lesser); - return (ARCHIVE_FATAL); - } - lesser = tmp; - lesser[lesser_count - 1] = strings[i]; - } - else - { - greater_count++; - tmp = realloc(greater, greater_count * sizeof(*tmp)); - if (!tmp) { - free(greater); - free(lesser); - return (ARCHIVE_FATAL); - } - greater = tmp; - greater[greater_count - 1] = strings[i]; - } - } + const char * const * const s1 = p1; + const char * const * const s2 = p2; - /* quicksort(lesser) */ - retval1 = archive_utility_string_sort_helper(lesser, lesser_count); - for (i = 0; i < lesser_count; i++) - strings[i] = lesser[i]; - free(lesser); - - /* pivot */ - strings[lesser_count] = pivot; - - /* quicksort(greater) */ - retval2 = archive_utility_string_sort_helper(greater, greater_count); - for (i = 0; i < greater_count; i++) - strings[lesser_count + 1 + i] = greater[i]; - free(greater); - - return (retval1 < retval2) ? retval1 : retval2; + return strcmp(*s1, *s2); } int archive_utility_string_sort(char **strings) { - unsigned int size = 0; - while (strings[size] != NULL) + size_t size = 0; + while (strings[size] != NULL) size++; - return archive_utility_string_sort_helper(strings, size); + qsort(strings, size, sizeof(char *), + archive_utility_string_sort_helper); + return (ARCHIVE_OK); } +#endif --- contrib/libarchive/libarchive/archive_version_details.c.orig +++ contrib/libarchive/libarchive/archive_version_details.c @@ -46,11 +46,125 @@ #endif #ifdef HAVE_ZSTD_H #include +#include +#endif +#ifdef HAVE_LZO_LZOCONF_H +#include +#endif +#if HAVE_LIBXML_XMLVERSION_H +#include +#elif HAVE_BSDXML_H +#include +#elif HAVE_EXPAT_H +#include +#endif +#if HAVE_MBEDTLS_VERSION_H +#include +#endif +#if HAVE_NETTLE_VERSION_H +#include +#include +#endif +#if HAVE_OPENSSL_OPENSSLV_H +#include +#include +#endif +#if HAVE_ICONV_H +#include +#endif +#if HAVE_PCRE_H +#include +#endif +#if HAVE_PCRE2_H +#include #endif #include "archive.h" #include "archive_private.h" #include "archive_string.h" +#include "archive_cryptor_private.h" +#include "archive_digest_private.h" + +static void +archive_regex_version(struct archive_string* str) +{ +#if HAVE_LIBPCREPOSIX && HAVE_PCRE_H + archive_strcat(str, " libpcre/"); + archive_strcat(str, archive_libpcre_version()); +#elif HAVE_LIBPCRE2POSIX && HAVE_PCRE2_H + archive_strcat(str, " libpcre2/"); + archive_strcat(str, archive_libpcre2_version()); +#else + (void)str; /* UNUSED */ +#endif +} + +static void +archive_xml_version(struct archive_string* str) +{ +#if HAVE_LIBXML_XMLVERSION_H && HAVE_LIBXML2 + archive_strcat(str, " libxml2/"); + archive_strcat(str, archive_libxml2_version()); +#elif HAVE_BSDXML_H && HAVE_LIBBSDXML + archive_strcat(str, " bsdxml/"); + archive_strcat(str, archive_libbsdxml_version()); +#elif HAVE_EXPAT_H && HAVE_LIBEXPAT + archive_strcat(str, " expat/"); + archive_strcat(str, archive_libexpat_version()); +#else + (void)str; /* UNUSED */ +#endif +} + +static void +archive_libb2_version(struct archive_string* str) +{ + archive_strcat(str, " libb2/"); +#if HAVE_BLAKE2_H && HAVE_LIBB2 +#if defined(LIBB2_PKGCONFIG_VERSION) + archive_strcat(str, LIBB2_PKGCONFIG_VERSION); +#else + archive_strcat(str, "system"); +#endif +#else + archive_strcat(str, "bundled"); +#endif +} + +static void +archive_crypto_version(struct archive_string* str) +{ +#if defined(ARCHIVE_CRYPTOR_USE_Apple_CommonCrypto) + archive_strcat(str, " CommonCrypto/"); + archive_strcat(str, archive_commoncrypto_version()); +#endif +#if defined(ARCHIVE_CRYPTOR_USE_CNG) + archive_strcat(str, " cng/"); + archive_strcat(str, archive_cng_version()); +#endif +#if defined(ARCHIVE_CRYPTOR_USE_MBED) + archive_strcat(str, " mbedtls/"); + archive_strcat(str, archive_mbedtls_version()); +#endif +#if defined(ARCHIVE_CRYPTOR_USE_NETTLE) + archive_strcat(str, " nettle/"); + archive_strcat(str, archive_nettle_version()); +#endif +#if defined(ARCHIVE_CRYPTOR_USE_OPENSSL) + archive_strcat(str, " openssl/"); + archive_strcat(str, archive_openssl_version()); +#endif +#if defined(ARCHIVE_CRYPTOR_USE_LIBMD) + archive_strcat(str, " libmd/"); + archive_strcat(str, archive_libmd_version()); +#endif +#if defined(ARCHIVE_CRYPTOR_USE_WINCRYPT) + archive_strcat(str, " WinCrypt/"); + archive_strcat(str, archive_wincrypt_version()); +#endif + // Just in case + (void)str; /* UNUSED */ +} const char * archive_version_details(void) @@ -62,12 +176,17 @@ const char *bzlib = archive_bzlib_version(); const char *liblz4 = archive_liblz4_version(); const char *libzstd = archive_libzstd_version(); + const char *liblzo = archive_liblzo2_version(); + const char *libiconv = archive_libiconv_version(); + const char *libacl = archive_libacl_version(); + const char *librichacl = archive_librichacl_version(); + const char *libattr = archive_libacl_version(); if (!init) { archive_string_init(&str); archive_strcat(&str, ARCHIVE_VERSION_STRING); - if (zlib != NULL) { + if (zlib) { archive_strcat(&str, " zlib/"); archive_strcat(&str, zlib); } @@ -91,6 +210,30 @@ archive_strcat(&str, " libzstd/"); archive_strcat(&str, libzstd); } + if (liblzo) { + archive_strcat(&str, " liblzo2/"); + archive_strcat(&str, liblzo); + } + archive_xml_version(&str); + archive_regex_version(&str); + archive_crypto_version(&str); + archive_libb2_version(&str); + if (librichacl) { + archive_strcat(&str, " librichacl/"); + archive_strcat(&str, librichacl); + } + if (libacl) { + archive_strcat(&str, " libacl/"); + archive_strcat(&str, libacl); + } + if (libattr) { + archive_strcat(&str, " libattr/"); + archive_strcat(&str, libattr); + } + if (libiconv) { + archive_strcat(&str, " libiconv/"); + archive_strcat(&str, libiconv); + } } return str.s; } @@ -98,8 +241,8 @@ const char * archive_zlib_version(void) { -#ifdef HAVE_ZLIB_H - return ZLIB_VERSION; +#if HAVE_ZLIB_H && HAVE_LIBZ + return zlibVersion(); #else return NULL; #endif @@ -108,8 +251,8 @@ const char * archive_liblzma_version(void) { -#ifdef HAVE_LZMA_H - return LZMA_VERSION_STRING; +#if HAVE_LZMA_H && HAVE_LIBLZMA + return lzma_version_string(); #else return NULL; #endif @@ -118,7 +261,7 @@ const char * archive_bzlib_version(void) { -#ifdef HAVE_BZLIB_H +#if HAVE_BZLIB_H && HAVE_LIBBZ2 return BZ2_bzlibVersion(); #else return NULL; @@ -128,12 +271,22 @@ const char * archive_liblz4_version(void) { -#if defined(HAVE_LZ4_H) && defined(HAVE_LIBLZ4) +#if HAVE_LZ4_H && HAVE_LIBLZ4 +#if LZ4_VERSION_NUMBER > 10705 + return LZ4_versionString(); +#elif LZ4_VERSION_NUMBER > 10300 + div_t major = div(LZ4_versionNumber(), 10000); + div_t minor = div(major.rem, 100); + static char lz4_version[9]; + snprintf(lz4_version, 9, "%d.%d.%d", major.quot, minor.quot, minor.rem); + return lz4_version; +#else #define str(s) #s #define NUMBER(x) str(x) return NUMBER(LZ4_VERSION_MAJOR) "." NUMBER(LZ4_VERSION_MINOR) "." NUMBER(LZ4_VERSION_RELEASE); #undef NUMBER #undef str +#endif #else return NULL; #endif @@ -143,7 +296,243 @@ archive_libzstd_version(void) { #if HAVE_ZSTD_H && HAVE_LIBZSTD - return ZSTD_VERSION_STRING; +#if ZSTD_VERSION_NUMBER > 10300 + return ZSTD_versionString(); +#else + div_t major = div(ZSTD_versionNumber(), 10000); + div_t minor = div(major.rem, 100); + static char zstd_version[9]; + snprintf(zstd_version, 9, "%d.%d.%d", major.quot, minor.quot, minor.rem); + return zstd_version; +#endif +#else + return NULL; +#endif +} + +const char * +archive_liblzo2_version(void) +{ +#if HAVE_LZO_LZOCONF_H && HAVE_LIBLZO2 + return LZO_VERSION_STRING; +#else + return NULL; +#endif +} + +const char * +archive_libbsdxml_version(void) +{ +#if HAVE_BSDXML_H && HAVE_LIBBSDXML + return XML_ExpatVersion(); +#else + return NULL; +#endif +} + +const char * +archive_libxml2_version(void) +{ +#if HAVE_LIBXML_XMLREADER_H && HAVE_LIBXML2 + return LIBXML_DOTTED_VERSION; +#else + return NULL; +#endif +} + +const char * +archive_libexpat_version(void) +{ +#if HAVE_EXPAT_H && HAVE_LIBEXPAT + return XML_ExpatVersion(); +#else + return NULL; +#endif +} + +const char * +archive_mbedtls_version(void) +{ +#if defined(ARCHIVE_CRYPTOR_USE_MBED) || defined(ARCHIVE_CRYPTO_MBED) + static char mbed_version[9]; + mbedtls_version_get_string(mbed_version); + return mbed_version; +#else + return NULL; +#endif +} + +const char * +archive_nettle_version(void) +{ +#if defined(ARCHIVE_CRYPTOR_USE_NETTLE) || defined(ARCHIVE_CRYPTO_NETTLE) + static char nettle_version[6]; + snprintf(nettle_version, 6, "%d.%d", nettle_version_major(), nettle_version_minor()); + return nettle_version; +#else + return NULL; +#endif +} + +const char * +archive_openssl_version(void) +{ +#if defined(ARCHIVE_CRYPTOR_USE_OPENSSL) || defined(ARCHIVE_CRYPTO_OPENSSL) +#ifdef OPENSSL_VERSION_STR + return OPENSSL_VERSION_STR; +#else +#define OPENSSL_MAJOR (OPENSSL_VERSION_NUMBER >> 28) +#define OPENSSL_MINOR ((OPENSSL_VERSION_NUMBER >> 20) & 0xFF) + static char openssl_version[6]; + snprintf(openssl_version, 6, "%ld.%ld", OPENSSL_MAJOR, OPENSSL_MINOR); + return openssl_version; +#undef OPENSSL_MAJOR +#undef OPENSSL_MINOR +#endif +#else + return NULL; +#endif +} + +const char * +archive_libmd_version(void) +{ +#if defined(ARCHIVE_CRYPTOR_USE_LIBMD) || defined(ARCHIVE_CRYPTO_LIBMD) + return "system"; +#else + return NULL; +#endif +} + +const char * +archive_commoncrypto_version(void) +{ +#if defined(ARCHIVE_CRYPTOR_USE_Apple_CommonCrypto) || defined(ARCHIVE_CRYPTO_CommonCrypto) + return "system"; +#else + return NULL; +#endif +} + +const char * +archive_cng_version(void) +{ +#if defined(ARCHIVE_CRYPTOR_USE_CNG) || defined(ARCHIVE_CRYPTO_CNG) +#ifdef BCRYPT_HASH_INTERFACE_MAJORVERSION_2 + return "2.0"; +#else + return "1.0"; +#endif +#else + return NULL; +#endif +} + +const char * +archive_wincrypt_version(void) +{ +#if defined(ARCHIVE_CRYPTOR_USE_WINCRYPT) || defined(ARCHIVE_CRYPTO_WINCRYPT) + HCRYPTPROV prov; + if (!CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { + if (GetLastError() != (DWORD)NTE_BAD_KEYSET) + return NULL; + if (!CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) + return NULL; + } + DWORD version, length = sizeof(version); + if (!CryptGetProvParam(prov, PP_VERSION, (BYTE *)&version, &length, 0)) { + return NULL; + } else { + char major = (version >> 8) & 0xFF; + char minor = version & 0xFF; + static char wincrypt_version[6]; + snprintf(wincrypt_version, 6, "%hhd.%hhd", major, minor); + return wincrypt_version; + } +#else + return NULL; +#endif +} + +const char * +archive_librichacl_version(void) +{ +#if HAVE_LIBRICHACL +#if defined(LIBRICHACL_PKGCONFIG_VERSION) + return LIBRICHACL_PKGCONFIG_VERSION; +#else + return "system"; +#endif +#else + return NULL; +#endif +} + +const char * +archive_libacl_version(void) +{ +#if HAVE_LIBACL +#if defined(LIBACL_PKGCONFIG_VERSION) + return LIBACL_PKGCONFIG_VERSION; +#else + return "system"; +#endif +#else + return NULL; +#endif +} + +const char * +archive_libattr_version(void) +{ +#if HAVE_LIBATTR +#if defined(LIBATTR_PKGCONFIG_VERSION) + return LIBATTR_PKGCONFIG_VERSION; +#else + return "system"; +#endif +#else + return NULL; +#endif +} + +const char * +archive_libiconv_version(void) +{ +#if HAVE_LIBCHARSET && HAVE_ICONV_H + char major = _libiconv_version >> 8; + char minor = _libiconv_version & 0xFF; + static char charset_version[6]; + snprintf(charset_version, 6, "%hhd.%hhd", major, minor); + return charset_version; +#else + return NULL; +#endif +} + +const char * +archive_libpcre_version(void) +{ +#if HAVE_LIBPCREPOSIX && HAVE_PCRE_H +#define str(s) #s +#define NUMBER(x) str(x) + return NUMBER(PCRE_MAJOR) "." NUMBER(PCRE_MINOR); +#undef NUMBER +#undef str +#else + return NULL; +#endif +} + +const char * +archive_libpcre2_version(void) +{ +#if HAVE_LIBPCRE2POSIX && HAVE_PCRE2_H +#define str(s) #s +#define NUMBER(x) str(x) + return NUMBER(PCRE2_MAJOR) "." NUMBER(PCRE2_MINOR); +#undef NUMBER +#undef str #else return NULL; #endif --- contrib/libarchive/libarchive/archive_write.c.orig +++ contrib/libarchive/libarchive/archive_write.c @@ -283,7 +283,7 @@ } /* - * Close all filtes + * Close all filters */ static int __archive_write_filters_close(struct archive_write *a) --- contrib/libarchive/libarchive/archive_write_add_filter_b64encode.c.orig +++ contrib/libarchive/libarchive/archive_write_add_filter_b64encode.c @@ -166,7 +166,7 @@ } archive_string_sprintf(&state->encoded_buff, "begin-base64 %o %s\n", - state->mode, state->name.s); + (unsigned int)state->mode, state->name.s); f->data = state; return (0); --- contrib/libarchive/libarchive/archive_write_add_filter_gzip.c.orig +++ contrib/libarchive/libarchive/archive_write_add_filter_gzip.c @@ -58,6 +58,7 @@ struct private_data { int compression_level; int timestamp; + char *original_filename; #ifdef HAVE_ZLIB_H z_stream stream; int64_t total_in; @@ -113,6 +114,8 @@ f->free = &archive_compressor_gzip_free; f->code = ARCHIVE_FILTER_GZIP; f->name = "gzip"; + + data->original_filename = NULL; #ifdef HAVE_ZLIB_H data->compression_level = Z_DEFAULT_COMPRESSION; return (ARCHIVE_OK); @@ -140,6 +143,7 @@ #else __archive_write_program_free(data->pdata); #endif + free((void*)data->original_filename); free(data); f->data = NULL; return (ARCHIVE_OK); @@ -165,6 +169,13 @@ data->timestamp = (value == NULL)?-1:1; return (ARCHIVE_OK); } + if (strcmp(key, "original-filename") == 0) { + free((void*)data->original_filename); + data->original_filename = NULL; + if (value) + data->original_filename = strdup(value); + return (ARCHIVE_OK); + } /* Note: The "warn" return is just to inform the options * supervisor that we didn't handle it. It will generate @@ -210,7 +221,7 @@ data->compressed[0] = 0x1f; /* GZip signature bytes */ data->compressed[1] = 0x8b; data->compressed[2] = 0x08; /* "Deflate" compression */ - data->compressed[3] = 0; /* No options */ + data->compressed[3] = data->original_filename == NULL ? 0 : 0x8; if (data->timestamp >= 0) { time_t t = time(NULL); data->compressed[4] = (uint8_t)(t)&0xff; /* Timestamp */ @@ -229,6 +240,12 @@ data->stream.next_out += 10; data->stream.avail_out -= 10; + if (data->original_filename != NULL) { + strcpy((char*)data->compressed + 10, data->original_filename); + data->stream.next_out += strlen(data->original_filename) + 1; + data->stream.avail_out -= strlen(data->original_filename) + 1; + } + f->write = archive_compressor_gzip_write; /* Initialize compression library. */ --- contrib/libarchive/libarchive/archive_write_add_filter_uuencode.c.orig +++ contrib/libarchive/libarchive/archive_write_add_filter_uuencode.c @@ -155,7 +155,7 @@ } archive_string_sprintf(&state->encoded_buff, "begin %o %s\n", - state->mode, state->name.s); + (unsigned int)state->mode, state->name.s); f->data = state; return (0); --- contrib/libarchive/libarchive/archive_write_disk_posix.c.orig +++ contrib/libarchive/libarchive/archive_write_disk_posix.c @@ -478,9 +478,11 @@ case AE_IFLNK: ret = (S_ISLNK(mode)); break; +#ifdef S_ISSOCK case AE_IFSOCK: ret = (S_ISSOCK(mode)); break; +#endif case AE_IFCHR: ret = (S_ISCHR(mode)); break; @@ -3605,7 +3607,7 @@ tstamp.atime.tv_sec = atime; tstamp.mtime.tv_sec = mtime; tstamp.ctime.tv_sec = ctime; -#if defined (__hpux) && defined (__ia64) +#if defined (__hpux) && ( defined (__ia64) || defined (__hppa) ) tstamp.atime.tv_nsec = atime_nsec; tstamp.mtime.tv_nsec = mtime_nsec; tstamp.ctime.tv_nsec = ctime_nsec; @@ -3788,7 +3790,7 @@ * permissions on symlinks, so a failure here has no * impact. */ - if (lchmod(a->name, mode) != 0) { + if (lchmod(a->name, (mode_t)mode) != 0) { switch (errno) { case ENOTSUP: case ENOSYS: @@ -3803,7 +3805,8 @@ break; default: archive_set_error(&a->archive, errno, - "Can't set permissions to 0%o", (int)mode); + "Can't set permissions to 0%o", + (unsigned int)mode); r = ARCHIVE_WARN; } } @@ -3817,16 +3820,16 @@ */ #ifdef HAVE_FCHMOD if (a->fd >= 0) - r2 = fchmod(a->fd, mode); + r2 = fchmod(a->fd, (mode_t)mode); else #endif /* If this platform lacks fchmod(), then * we'll just use chmod(). */ - r2 = chmod(a->name, mode); + r2 = chmod(a->name, (mode_t)mode); if (r2 != 0) { archive_set_error(&a->archive, errno, - "Can't set permissions to 0%o", (int)mode); + "Can't set permissions to 0%o", (unsigned int)mode); r = ARCHIVE_WARN; } } --- contrib/libarchive/libarchive/archive_write_open_filename.c.orig +++ contrib/libarchive/libarchive/archive_write_open_filename.c @@ -118,7 +118,7 @@ (const char *)filename); else archive_set_error(a, ARCHIVE_ERRNO_MISC, - "Can't convert '%S' to MBS", + "Can't convert '%ls' to MBS", (const wchar_t *)filename); return (ARCHIVE_FAILED); } @@ -170,7 +170,7 @@ else { archive_mstring_get_wcs(a, &mine->filename, &wcs); archive_set_error(a, errno, - "Can't convert '%S' to MBS", wcs); + "Can't convert '%ls' to MBS", wcs); } return (ARCHIVE_FATAL); } @@ -181,7 +181,7 @@ if (mbs != NULL) archive_set_error(a, errno, "Failed to open '%s'", mbs); else - archive_set_error(a, errno, "Failed to open '%S'", wcs); + archive_set_error(a, errno, "Failed to open '%ls'", wcs); return (ARCHIVE_FATAL); } @@ -189,7 +189,7 @@ if (mbs != NULL) archive_set_error(a, errno, "Couldn't stat '%s'", mbs); else - archive_set_error(a, errno, "Couldn't stat '%S'", wcs); + archive_set_error(a, errno, "Couldn't stat '%ls'", wcs); return (ARCHIVE_FATAL); } --- contrib/libarchive/libarchive/archive_write_set_format_7zip.c.orig +++ contrib/libarchive/libarchive/archive_write_set_format_7zip.c @@ -28,7 +28,12 @@ #ifdef HAVE_ERRNO_H #include #endif +#ifdef HAVE_STDLIB_H #include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif #ifdef HAVE_BZLIB_H #include #endif @@ -38,6 +43,9 @@ #ifdef HAVE_ZLIB_H #include #endif +#ifdef HAVE_ZSTD_H +#include +#endif #include "archive.h" #ifndef HAVE_ZLIB_H @@ -50,6 +58,7 @@ #include "archive_private.h" #include "archive_rb.h" #include "archive_string.h" +#include "archive_time_private.h" #include "archive_write_private.h" #include "archive_write_set_format_private.h" @@ -63,6 +72,8 @@ #define _7Z_BZIP2 0x040202 #define _7Z_PPMD 0x030401 +#define _7Z_ZSTD 0x4F71101 /* Copied from https://github.com/mcmilk/7-Zip-zstd.git */ + /* * 7-Zip header property IDs. */ @@ -110,6 +121,9 @@ // the attr field along with the unix permissions. #define FILE_ATTRIBUTE_UNIX_EXTENSION 0x8000 +// Many systems define min or MIN, but not all. +#define sevenzipmin(a,b) ((a) < (b) ? (a) : (b)) + enum la_zaction { ARCHIVE_Z_FINISH, ARCHIVE_Z_RUN @@ -209,7 +223,11 @@ #define ENCODED_CRC32 2 unsigned opt_compression; + int opt_compression_level; + int opt_zstd_compression_level; // This requires a different default value. + + int opt_threads; struct la_zstream stream; struct coder coder; @@ -285,12 +303,19 @@ static int compression_end_lzma(struct archive *, struct la_zstream *); #endif static int compression_init_encoder_ppmd(struct archive *, - struct la_zstream *, unsigned, uint32_t); + struct la_zstream *, uint8_t, uint32_t); static int compression_code_ppmd(struct archive *, struct la_zstream *, enum la_zaction); static int compression_end_ppmd(struct archive *, struct la_zstream *); static int _7z_compression_init_encoder(struct archive_write *, unsigned, int); +static int compression_init_encoder_zstd(struct archive *, + struct la_zstream *, int, int); +#if defined(HAVE_ZSTD_H) +static int compression_code_zstd(struct archive *, + struct la_zstream *, enum la_zaction); +static int compression_end_zstd(struct archive *, struct la_zstream *); +#endif static int compression_code(struct archive *, struct la_zstream *, enum la_zaction); static int compression_end(struct archive *, @@ -301,6 +326,21 @@ static int make_streamsInfo(struct archive_write *, uint64_t, uint64_t, uint64_t, int, struct coder *, int, uint32_t); +static int +string_to_number(const char *string, intmax_t *numberp) +{ + char *end; + + if (string == NULL || *string == '\0') + return (ARCHIVE_WARN); + *numberp = strtoimax(string, &end, 10); + if (end == string || *end != '\0' || errno == EOVERFLOW) { + *numberp = 0; + return (ARCHIVE_WARN); + } + return (ARCHIVE_OK); +} + int archive_write_set_format_7zip(struct archive *_a) { @@ -335,11 +375,24 @@ zip->opt_compression = _7Z_BZIP2; #elif defined(HAVE_ZLIB_H) zip->opt_compression = _7Z_DEFLATE; +#elif HAVE_ZSTD_H + zip->opt_compression = _7Z_ZSTD; #else zip->opt_compression = _7Z_COPY; #endif + zip->opt_compression_level = 6; +#ifdef ZSTD_CLEVEL_DEFAULT + // Zstandard compression needs a different default + // value than other encoders. + zip->opt_zstd_compression_level = ZSTD_CLEVEL_DEFAULT; +#else + zip->opt_zstd_compression_level = 3; +#endif + + zip->opt_threads = 1; + a->format_data = zip; a->format_name = "7zip"; @@ -397,6 +450,13 @@ zip->opt_compression = _7Z_LZMA2; #else name = "lzma2"; +#endif + else if (strcmp(value, "zstd") == 0 || + strcmp(value, "ZSTD") == 0) +#if HAVE_ZSTD_H + zip->opt_compression = _7Z_ZSTD; +#else + name = "zstd"; #endif else if (strcmp(value, "ppmd") == 0 || strcmp(value, "PPMD") == 0 || @@ -420,16 +480,68 @@ return (ARCHIVE_OK); } if (strcmp(key, "compression-level") == 0) { - if (value == NULL || - !(value[0] >= '0' && value[0] <= '9') || - value[1] != '\0') { - archive_set_error(&(a->archive), - ARCHIVE_ERRNO_MISC, - "Illegal value `%s'", - value); + if (value == NULL || *value == '\0') { + archive_set_error(&(a->archive), ARCHIVE_ERRNO_MISC, + "Invalid compression-level option value `%s'", value); + return (ARCHIVE_FAILED); + } + + char *end = NULL; + long lvl = strtol(value, &end, 10); + if (end == NULL || *end != '\0') { + archive_set_error(&(a->archive), ARCHIVE_ERRNO_MISC, + "parsing compression-level option value failed `%s'", value); + return (ARCHIVE_FAILED); + } + +#if HAVE_ZSTD_H && HAVE_ZSTD_compressStream && HAVE_ZSTD_minCLevel + int min_level = sevenzipmin(0, ZSTD_minCLevel()); +#else + const int min_level = 0; +#endif + +#if HAVE_ZSTD_H && HAVE_ZSTD_compressStream + int max_level = ZSTD_maxCLevel(); +#else + const int max_level = 9; +#endif + + if (lvl < min_level || lvl > max_level) { + archive_set_error(&(a->archive), ARCHIVE_ERRNO_MISC, + "compression-level option value `%ld' out of range", lvl); return (ARCHIVE_FAILED); } - zip->opt_compression_level = value[0] - '0'; + + // Note: we don't know here if this value is for zstd (negative to ~22), + // or zlib-style 0-9. If zstd is enabled but not in use, we will need to + // validate opt_compression_level before use. + zip->opt_compression_level = (int)lvl; + + zip->opt_zstd_compression_level = (int)lvl; + return (ARCHIVE_OK); + } + if (strcmp(key, "threads") == 0) { + intmax_t threads; + if (string_to_number(value, &threads) != ARCHIVE_OK) { + return (ARCHIVE_WARN); + } + if (threads < 0) { + return (ARCHIVE_WARN); + } + if (threads == 0) { +#if defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_ONLN) + threads = sysconf(_SC_NPROCESSORS_ONLN); +#elif !defined(__CYGWIN__) && defined(_WIN32_WINNT) && \ + _WIN32_WINNT >= 0x0601 /* _WIN32_WINNT_WIN7 */ + DWORD winCores = GetActiveProcessorCount( + ALL_PROCESSOR_GROUPS); + threads = (intmax_t)winCores; +#else + threads = 1; +#endif + } + + zip->opt_threads = (int)threads; return (ARCHIVE_OK); } @@ -495,8 +607,20 @@ * Init compression. */ if ((zip->total_number_entry - zip->total_number_empty_entry) == 1) { - r = _7z_compression_init_encoder(a, zip->opt_compression, - zip->opt_compression_level); + + int level = zip->opt_compression_level; +#if HAVE_ZSTD_H + if (zip->opt_compression == _7Z_ZSTD) { + level = zip->opt_zstd_compression_level; + } else if (level < 0 || level > 9) { + archive_set_error(&(a->archive), ARCHIVE_ERRNO_MISC, + "compression-level option value `%d' out of range 0-9", level); + file_free(file); + return (ARCHIVE_FATAL); + } +#endif + + r = _7z_compression_init_encoder(a, zip->opt_compression, level); if (r < 0) { file_free(file); return (ARCHIVE_FATAL); @@ -785,8 +909,12 @@ #else header_compression = _7Z_COPY; #endif - r = _7z_compression_init_encoder(a, header_compression, - zip->opt_compression_level); + + int level = zip->opt_compression_level; + if (level < 0) level = 0; + else if (level > 9) level = 9; + + r = _7z_compression_init_encoder(a, header_compression, level); if (r < 0) return (r); zip->crc32flg = PRECODE_CRC32; @@ -844,7 +972,7 @@ header_offset = header_size = 0; header_crc32 = 0; } - + length = zip->temp_offset; /* @@ -1164,20 +1292,6 @@ return (ARCHIVE_OK); } - -#define EPOC_TIME ARCHIVE_LITERAL_ULL(116444736000000000) -static uint64_t -utcToFiletime(time_t t, long ns) -{ - uint64_t fileTime; - - fileTime = t; - fileTime *= 10000000; - fileTime += ns / 100; - fileTime += EPOC_TIME; - return (fileTime); -} - static int make_time(struct archive_write *a, uint8_t type, unsigned flg, int ti) { @@ -1249,7 +1363,6 @@ if (r < 0) return (r); - /* * Make Times. */ @@ -1257,7 +1370,7 @@ for (;file != NULL; file = file->next) { if ((file->flg & flg) == 0) continue; - archive_le64enc(filetime, utcToFiletime(file->times[ti].time, + archive_le64enc(filetime, unix_to_ntfs(file->times[ti].time, file->times[ti].time_ns)); r = (int)compress_out(a, filetime, 8, ARCHIVE_Z_RUN); if (r < 0) @@ -1504,7 +1617,7 @@ return (memcmp(f1->utf16name, f2->utf16name, f1->name_len)); return (f1->name_len > f2->name_len)?1:-1; } - + static int file_cmp_key(const struct archive_rb_node *n, const void *key) { @@ -1646,7 +1759,8 @@ } #if !defined(HAVE_ZLIB_H) || !defined(HAVE_BZLIB_H) ||\ - !defined(BZ_CONFIG_ERROR) || !defined(HAVE_LZMA_H) + !defined(BZ_CONFIG_ERROR) || !defined(HAVE_LZMA_H) ||\ + !(HAVE_ZSTD_H && HAVE_ZSTD_compressStream) static int compression_unsupported_encoder(struct archive *a, struct la_zstream *lastrm, const char *name) @@ -2159,7 +2273,7 @@ static int compression_init_encoder_ppmd(struct archive *a, - struct la_zstream *lastrm, unsigned maxOrder, uint32_t msize) + struct la_zstream *lastrm, uint8_t maxOrder, uint32_t msize) { struct ppmd_stream *strm; uint8_t *props; @@ -2279,6 +2393,117 @@ return (ARCHIVE_OK); } +#if HAVE_ZSTD_H && HAVE_ZSTD_compressStream +static int +compression_init_encoder_zstd(struct archive *a, struct la_zstream *lastrm, int level, int threads) +{ + if (lastrm->valid) + compression_end(a, lastrm); + + ZSTD_CStream *strm = ZSTD_createCStream(); + if (strm == NULL) { + archive_set_error(a, ENOMEM, + "Can't allocate memory for zstd stream"); + return (ARCHIVE_FATAL); + } + + if (ZSTD_isError(ZSTD_initCStream(strm, level))) { + ZSTD_freeCStream(strm); + archive_set_error(a, ARCHIVE_ERRNO_MISC, + "Internal error initializing zstd compressor object"); + return (ARCHIVE_FATAL); + } + + ZSTD_CCtx_setParameter(strm, ZSTD_c_nbWorkers, threads); + + // p7zip-zstd fails to unpack archives that don't have prop_size 5. + // 7-Zip-zstd fails to unpack archives that don't have prop_size 3 or 5. + // So let's use 5... + lastrm->prop_size = 5; + lastrm->props = calloc(5, 1); + if (lastrm->props == NULL) { + ZSTD_freeCStream(strm); + archive_set_error(a, ARCHIVE_ERRNO_MISC, + "Internal error initializing zstd compressor properties"); + return (ARCHIVE_FATAL); + } + + // Refer to the DProps struct in 7-Zip-zstd's ZstdDecoder.h: + // https://github.com/mcmilk/7-Zip-zstd/blob/79b2c78e9e7735ddf90147129b75cf2797ff6522/CPP/7zip/Compress/ZstdDecoder.h#L34S + lastrm->props[0] = ZSTD_VERSION_MAJOR; + lastrm->props[1] = ZSTD_VERSION_MINOR; + lastrm->props[2] = level; + // lastrm->props[3] and lastrm->props[4] are reserved. Leave them as 0. + + lastrm->real_stream = strm; + lastrm->valid = 1; + lastrm->code = compression_code_zstd; + lastrm->end = compression_end_zstd; + + return (ARCHIVE_OK); +} + +static int +compression_code_zstd(struct archive *a, + struct la_zstream *lastrm, enum la_zaction action) +{ + ZSTD_CStream *strm = (ZSTD_CStream *)lastrm->real_stream; + + ZSTD_outBuffer out = { .dst = lastrm->next_out, .size = lastrm->avail_out, .pos = 0 }; + ZSTD_inBuffer in = { .src = lastrm->next_in, .size = lastrm->avail_in, .pos = 0 }; + + size_t zret; + + ZSTD_EndDirective mode = (action == ARCHIVE_Z_RUN) ? ZSTD_e_continue : ZSTD_e_end; + + zret = ZSTD_compressStream2(strm, &out, &in, mode); + if (ZSTD_isError(zret)) { + archive_set_error(a, ARCHIVE_ERRNO_MISC, + "zstd compression failed, ZSTD_compressStream2 returned: %s", + ZSTD_getErrorName(zret)); + return (ARCHIVE_FATAL); + } + + lastrm->next_in += in.pos; + lastrm->avail_in -= in.pos; + lastrm->total_in += in.pos; + + lastrm->next_out += out.pos; + lastrm->avail_out -= out.pos; + lastrm->total_out += out.pos; + + if (action == ARCHIVE_Z_FINISH && zret == 0) + return (ARCHIVE_EOF); // All done. + + return (ARCHIVE_OK); // More work to do. +} + +static int +compression_end_zstd(struct archive *a, struct la_zstream *lastrm) +{ + ZSTD_CStream *strm; + + (void)a; /* UNUSED */ + strm = (ZSTD_CStream *)lastrm->real_stream; + ZSTD_freeCStream(strm); + lastrm->valid = 0; + lastrm->real_stream = NULL; + return (ARCHIVE_OK); +} + +#else + +static int +compression_init_encoder_zstd(struct archive *a, struct la_zstream *lastrm, int level, int threads) +{ + (void) level; /* UNUSED */ + (void) threads; /* UNUSED */ + if (lastrm->valid) + compression_end(a, lastrm); + return (compression_unsupported_encoder(a, lastrm, "zstd")); +} +#endif + /* * Universal compressor initializer. */ @@ -2316,6 +2541,11 @@ &(a->archive), &(zip->stream), PPMD7_DEFAULT_ORDER, PPMD7_DEFAULT_MEM_SIZE); break; + case _7Z_ZSTD: + r = compression_init_encoder_zstd( + &(a->archive), &(zip->stream), + compression_level, zip->opt_threads); + break; case _7Z_COPY: default: r = compression_init_encoder_copy( @@ -2352,5 +2582,3 @@ } return (ARCHIVE_OK); } - - --- contrib/libarchive/libarchive/archive_write_set_format_gnutar.c.orig +++ contrib/libarchive/libarchive/archive_write_set_format_gnutar.c @@ -153,7 +153,7 @@ static int archive_write_gnutar_options(struct archive_write *, const char *, const char *); static int archive_format_gnutar_header(struct archive_write *, char h[512], - struct archive_entry *, int tartype); + struct archive_entry *, char tartype); static int archive_write_gnutar_header(struct archive_write *, struct archive_entry *entry); static ssize_t archive_write_gnutar_data(struct archive_write *a, const void *buff, @@ -274,7 +274,7 @@ { char buff[512]; int r, ret, ret2 = ARCHIVE_OK; - int tartype; + char tartype; struct gnutar *gnutar; struct archive_string_conv *sconv; struct archive_entry *entry_main; @@ -504,7 +504,7 @@ archive_entry_set_uname(temp, "root"); archive_entry_set_gname(temp, "wheel"); - archive_entry_set_pathname(temp, "././@LongLink"); + archive_entry_set_pathname(temp, "././@LongName"); archive_entry_set_size(temp, length); ret = archive_format_gnutar_header(a, buff, temp, 'L'); archive_entry_free(temp); @@ -562,7 +562,7 @@ static int archive_format_gnutar_header(struct archive_write *a, char h[512], - struct archive_entry *entry, int tartype) + struct archive_entry *entry, char tartype) { unsigned int checksum; int i, ret; @@ -640,7 +640,7 @@ if (format_number(archive_entry_uid(entry), h + GNUTAR_uid_offset, GNUTAR_uid_size, GNUTAR_uid_max_size)) { archive_set_error(&a->archive, ERANGE, - "Numeric user ID %jd too large", + "Numeric user ID %jd too large for gnutar format", (intmax_t)archive_entry_uid(entry)); ret = ARCHIVE_FAILED; } @@ -649,7 +649,7 @@ if (format_number(archive_entry_gid(entry), h + GNUTAR_gid_offset, GNUTAR_gid_size, GNUTAR_gid_max_size)) { archive_set_error(&a->archive, ERANGE, - "Numeric group ID %jd too large", + "Numeric group ID %jd too large for gnutar format", (intmax_t)archive_entry_gid(entry)); ret = ARCHIVE_FAILED; } @@ -672,7 +672,7 @@ h + GNUTAR_rdevmajor_offset, GNUTAR_rdevmajor_size)) { archive_set_error(&a->archive, ERANGE, - "Major device number too large"); + "Major device number too large for gnutar format"); ret = ARCHIVE_FAILED; } @@ -680,7 +680,7 @@ h + GNUTAR_rdevminor_offset, GNUTAR_rdevminor_size)) { archive_set_error(&a->archive, ERANGE, - "Minor device number too large"); + "Minor device number too large for gnutar format"); ret = ARCHIVE_FAILED; } } --- contrib/libarchive/libarchive/archive_write_set_format_iso9660.c.orig +++ contrib/libarchive/libarchive/archive_write_set_format_iso9660.c @@ -911,7 +911,7 @@ static int iso9660_close(struct archive_write *); static int iso9660_free(struct archive_write *); -static void get_system_identitier(char *, size_t); +static void get_system_identifier(char *, size_t); static void set_str(unsigned char *, const char *, size_t, char, const char *); static inline int joliet_allowed_char(unsigned char, unsigned char); @@ -1167,7 +1167,12 @@ iso9660->primary.rootent->parent = iso9660->primary.rootent; iso9660->cur_dirent = iso9660->primary.rootent; archive_string_init(&(iso9660->cur_dirstr)); - archive_string_ensure(&(iso9660->cur_dirstr), 1); + if (archive_string_ensure(&(iso9660->cur_dirstr), 1) == NULL) { + free(iso9660); + archive_set_error(&a->archive, ENOMEM, + "Can't allocate memory"); + return (ARCHIVE_FATAL); + } iso9660->cur_dirstr.s[0] = 0; iso9660->sconv_to_utf16be = NULL; iso9660->sconv_from_utf16be = NULL; @@ -2166,7 +2171,7 @@ * Get the System Identifier */ static void -get_system_identitier(char *system_id, size_t size) +get_system_identifier(char *system_id, size_t size) { #if defined(HAVE_SYS_UTSNAME_H) struct utsname u; @@ -3872,7 +3877,7 @@ /* Unused Field */ set_unused_field_bp(bp, 8, 8); /* System Identifier */ - get_system_identitier(identifier, sizeof(identifier)); + get_system_identifier(identifier, sizeof(identifier)); r = set_str_a_characters_bp(a, bp, 9, 40, identifier, vdc); if (r != ARCHIVE_OK) return (r); @@ -4037,7 +4042,7 @@ case KEY_HEX: d = va_arg(ap, int); archive_string_sprintf(info, "%c%s=%x", - prefix, key, d); + prefix, key, (unsigned int)d); break; } va_end(ap); @@ -5666,9 +5671,15 @@ * inserted. */ iso9660->cur_dirent = dent; archive_string_empty(&(iso9660->cur_dirstr)); - archive_string_ensure(&(iso9660->cur_dirstr), + if (archive_string_ensure(&(iso9660->cur_dirstr), archive_strlen(&(dent->file->parentdir)) + - archive_strlen(&(dent->file->basename)) + 2); + archive_strlen(&(dent->file->basename)) + 2) == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate memory"); + _isoent_free(isoent); + *isoentpp = NULL; + return (ARCHIVE_FATAL); + } if (archive_strlen(&(dent->file->parentdir)) + archive_strlen(&(dent->file->basename)) == 0) iso9660->cur_dirstr.s[0] = 0; --- contrib/libarchive/libarchive/archive_write_set_format_mtree.c.orig +++ contrib/libarchive/libarchive/archive_write_set_format_mtree.c @@ -54,7 +54,7 @@ int count; }; -struct att_counter_set { +struct attr_counter_set { struct attr_counter *uid_list; struct attr_counter *gid_list; struct attr_counter *mode_list; @@ -82,6 +82,7 @@ struct reg_info { int compute_sum; uint32_t crc; + uint_least32_t mset_digest; struct ae_digest digest; }; @@ -141,7 +142,7 @@ unsigned long fflags_set; unsigned long fflags_clear; } set; - struct att_counter_set acs; + struct attr_counter_set acs; int classic; int depth; @@ -437,7 +438,7 @@ { struct archive_string setstr; struct archive_string unsetstr; - struct att_counter_set *acs; + struct attr_counter_set *acs; int keys, oldkeys, effkeys; archive_string_init(&setstr); @@ -638,7 +639,7 @@ attr_counter_set_collect(struct mtree_writer *mtree, struct mtree_entry *me) { struct attr_counter *ac, *last; - struct att_counter_set *acs = &mtree->acs; + struct attr_counter_set *acs = &mtree->acs; int keys = mtree->keys; if (keys & (F_UNAME | F_UID)) { @@ -714,7 +715,7 @@ static void attr_counter_set_free(struct mtree_writer *mtree) { - struct att_counter_set *acs = &mtree->acs; + struct attr_counter_set *acs = &mtree->acs; attr_counter_free(&acs->uid_list); attr_counter_free(&acs->gid_list); @@ -862,6 +863,50 @@ free(me); } +static void +mtree_copy_ae_digests(struct reg_info *reg, struct archive_entry *entry, int compute_sum) +{ + reg->compute_sum = compute_sum; + reg->mset_digest = entry->mset_digest; + + if ((reg->compute_sum & F_MD5) + && (reg->mset_digest & AE_MSET_DIGEST_MD5)) { + + memcpy(®->digest.md5, entry->digest.md5, + sizeof(reg->digest.md5)); + } + if ((reg->compute_sum & F_RMD160) + && (reg->mset_digest & AE_MSET_DIGEST_RMD160)) { + + memcpy(®->digest.rmd160, entry->digest.rmd160, + sizeof(reg->digest.rmd160)); + } + if ((reg->compute_sum & F_SHA1) + && (reg->mset_digest & AE_MSET_DIGEST_SHA1)) { + + memcpy(®->digest.sha1, entry->digest.sha1, + sizeof(reg->digest.sha1)); + } + if ((reg->compute_sum & F_SHA256) + && (reg->mset_digest & AE_MSET_DIGEST_SHA256)) { + + memcpy(®->digest.sha256, entry->digest.sha256, + sizeof(reg->digest.sha256)); + } + if ((reg->compute_sum & F_SHA384) + && (reg->mset_digest & AE_MSET_DIGEST_SHA384)) { + + memcpy(®->digest.sha384, entry->digest.sha384, + sizeof(reg->digest.sha384)); + } + if ((reg->compute_sum & F_SHA512) + && (reg->mset_digest & AE_MSET_DIGEST_SHA512)) { + + memcpy(®->digest.sha512, entry->digest.sha512, + sizeof(reg->digest.sha512)); + } +} + static int archive_write_mtree_header(struct archive_write *a, struct archive_entry *entry) @@ -896,8 +941,12 @@ /* If the current file is a regular file, we have to * compute the sum of its content. * Initialize a bunch of checksum context. */ - if (mtree_entry->reg_info) + if (mtree_entry->reg_info) { sum_init(mtree); + /* honor archive_entry_set_digest() calls. These values will be + * overwritten if archive_write_mtree_data() is called */ + mtree_copy_ae_digests(mtree_entry->reg_info, entry, mtree->compute_sum); + } return (r2); } @@ -1516,28 +1565,46 @@ mtree->crc_len += n; } #ifdef ARCHIVE_HAS_MD5 - if (mtree->compute_sum & F_MD5) + if (mtree->compute_sum & F_MD5) { archive_md5_update(&mtree->md5ctx, buff, n); + mtree->mtree_entry->reg_info->mset_digest &= + ~AE_MSET_DIGEST_MD5; + } #endif #ifdef ARCHIVE_HAS_RMD160 - if (mtree->compute_sum & F_RMD160) + if (mtree->compute_sum & F_RMD160) { archive_rmd160_update(&mtree->rmd160ctx, buff, n); + mtree->mtree_entry->reg_info->mset_digest &= + ~AE_MSET_DIGEST_RMD160; + } #endif #ifdef ARCHIVE_HAS_SHA1 - if (mtree->compute_sum & F_SHA1) + if (mtree->compute_sum & F_SHA1) { archive_sha1_update(&mtree->sha1ctx, buff, n); + mtree->mtree_entry->reg_info->mset_digest &= + ~AE_MSET_DIGEST_SHA1; + } #endif #ifdef ARCHIVE_HAS_SHA256 - if (mtree->compute_sum & F_SHA256) + if (mtree->compute_sum & F_SHA256) { archive_sha256_update(&mtree->sha256ctx, buff, n); + mtree->mtree_entry->reg_info->mset_digest &= + ~AE_MSET_DIGEST_SHA256; + } #endif #ifdef ARCHIVE_HAS_SHA384 - if (mtree->compute_sum & F_SHA384) + if (mtree->compute_sum & F_SHA384) { archive_sha384_update(&mtree->sha384ctx, buff, n); + mtree->mtree_entry->reg_info->mset_digest &= + ~AE_MSET_DIGEST_SHA384; + } #endif #ifdef ARCHIVE_HAS_SHA512 - if (mtree->compute_sum & F_SHA512) + if (mtree->compute_sum & F_SHA512) { archive_sha512_update(&mtree->sha512ctx, buff, n); + mtree->mtree_entry->reg_info->mset_digest &= + ~AE_MSET_DIGEST_SHA512; + } #endif } @@ -1553,27 +1620,39 @@ reg->crc = ~mtree->crc; } #ifdef ARCHIVE_HAS_MD5 - if (mtree->compute_sum & F_MD5) + if ((mtree->compute_sum & F_MD5) + && !(reg->mset_digest & AE_MSET_DIGEST_MD5)) + archive_md5_final(&mtree->md5ctx, reg->digest.md5); #endif #ifdef ARCHIVE_HAS_RMD160 - if (mtree->compute_sum & F_RMD160) + if ((mtree->compute_sum & F_RMD160) + && !(reg->mset_digest & AE_MSET_DIGEST_RMD160)) + archive_rmd160_final(&mtree->rmd160ctx, reg->digest.rmd160); #endif #ifdef ARCHIVE_HAS_SHA1 - if (mtree->compute_sum & F_SHA1) + if ((mtree->compute_sum & F_SHA1) + && !(reg->mset_digest & AE_MSET_DIGEST_SHA1)) + archive_sha1_final(&mtree->sha1ctx, reg->digest.sha1); #endif #ifdef ARCHIVE_HAS_SHA256 - if (mtree->compute_sum & F_SHA256) + if ((mtree->compute_sum & F_SHA256) + && !(reg->mset_digest & AE_MSET_DIGEST_SHA256)) + archive_sha256_final(&mtree->sha256ctx, reg->digest.sha256); #endif #ifdef ARCHIVE_HAS_SHA384 - if (mtree->compute_sum & F_SHA384) + if ((mtree->compute_sum & F_SHA384) + && !(reg->mset_digest & AE_MSET_DIGEST_SHA384)) + archive_sha384_final(&mtree->sha384ctx, reg->digest.sha384); #endif #ifdef ARCHIVE_HAS_SHA512 - if (mtree->compute_sum & F_SHA512) + if ((mtree->compute_sum & F_SHA512) + && !(reg->mset_digest & AE_MSET_DIGEST_SHA512)) + archive_sha512_final(&mtree->sha512ctx, reg->digest.sha512); #endif /* Save what types of sum are computed. */ @@ -2130,9 +2209,13 @@ * inserted. */ mtree->cur_dirent = dent; archive_string_empty(&(mtree->cur_dirstr)); - archive_string_ensure(&(mtree->cur_dirstr), + if (archive_string_ensure(&(mtree->cur_dirstr), archive_strlen(&(dent->parentdir)) + - archive_strlen(&(dent->basename)) + 2); + archive_strlen(&(dent->basename)) + 2) == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate memory"); + return (ARCHIVE_FATAL); + } if (archive_strlen(&(dent->parentdir)) + archive_strlen(&(dent->basename)) == 0) mtree->cur_dirstr.s[0] = 0; --- contrib/libarchive/libarchive/archive_write_set_format_pax.c.orig +++ contrib/libarchive/libarchive/archive_write_set_format_pax.c @@ -1414,7 +1414,7 @@ struct archive_entry *pax_attr_entry; time_t s; int64_t uid, gid; - int mode; + __LA_MODE_T mode; pax_attr_entry = archive_entry_new2(&a->archive); p = entry_name.s; @@ -1571,7 +1571,7 @@ const char *filename, *filename_end; char *p; int need_slash = 0; /* Was there a trailing slash? */ - size_t suffix_length = 99; + size_t suffix_length = 98; /* 99 - 1 for trailing slash */ size_t insert_length; /* Length of additional dir element to be added. */ @@ -1623,7 +1623,7 @@ /* Step 2: Locate the "prefix" section of the dirname, including * trailing '/'. */ prefix = src; - prefix_end = prefix + 155; + prefix_end = prefix + 154 /* 155 - 1 for trailing / */; if (prefix_end > filename) prefix_end = filename; while (prefix_end > prefix && *prefix_end != '/') --- contrib/libarchive/libarchive/archive_write_set_format_xar.c.orig +++ contrib/libarchive/libarchive/archive_write_set_format_xar.c @@ -34,6 +34,14 @@ #include #if HAVE_LIBXML_XMLWRITER_H #include +#if defined(LIBXML_VERSION) && LIBXML_VERSION >= 20703 +#define XAR_WRITER_HAS_XML +#endif /* LIBXML_VERSION */ +#elif HAVE_XMLLITE_H +#include +#include +#include +#define XAR_WRITER_HAS_XML #endif #ifdef HAVE_BZLIB_H #include @@ -70,13 +78,12 @@ * */ -#if !(defined(HAVE_LIBXML_XMLWRITER_H) && defined(LIBXML_VERSION) &&\ - LIBXML_VERSION >= 20703) ||\ +#if !defined(XAR_WRITER_HAS_XML) ||\ !defined(HAVE_ZLIB_H) || \ !defined(ARCHIVE_HAS_MD5) || !defined(ARCHIVE_HAS_SHA1) /* * xar needs several external libraries. - * o libxml2 + * o libxml2 or xmllite (on Windows) * o openssl or MD5/SHA1 hash function * o zlib * o bzlib2 (option) @@ -94,9 +101,26 @@ #else /* Support xar format */ -/*#define DEBUG_PRINT_TOC 1 */ +struct xml_writer; +static int xml_writer_create(struct xml_writer **pctx); +static int xml_writer_start_document(struct xml_writer *ctx); +static int xml_writer_end_document(struct xml_writer *ctx); +static int xml_writer_set_indent(struct xml_writer *ctx, unsigned int indent); +static int xml_writer_start_element(struct xml_writer *ctx, + const char *localName); +static int xml_writer_write_attribute(struct xml_writer *ctx, const char *key, + const char *value); +static int xml_writer_write_attributef(struct xml_writer *ctx, const char *key, + const char *format, ...); +static int xml_writer_write_string(struct xml_writer *ctx, const char *string); +static int xml_writer_write_base64(struct xml_writer* ctx, + const char *data, size_t start, size_t len); +static int xml_writer_end_element(struct xml_writer *ctx); +static int xml_writer_get_final_content_and_length(struct xml_writer *ctx, + const char **out, size_t *size); +static int xml_writer_destroy(struct xml_writer *ctx); -#define BAD_CAST_CONST (const xmlChar *) +/*#define DEBUG_PRINT_TOC 1 */ #define HEADER_MAGIC 0x78617221 #define HEADER_SIZE 28 @@ -807,50 +831,49 @@ } static int -xmlwrite_string_attr(struct archive_write *a, xmlTextWriterPtr writer, +xmlwrite_string_attr(struct archive_write *a, struct xml_writer *writer, const char *key, const char *value, const char *attrkey, const char *attrvalue) { int r; - r = xmlTextWriterStartElement(writer, BAD_CAST_CONST(key)); + r = xml_writer_start_element(writer, key); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterStartElement() failed: %d", r); + "xml_writer_start_element() failed: %d", r); return (ARCHIVE_FATAL); } if (attrkey != NULL && attrvalue != NULL) { - r = xmlTextWriterWriteAttribute(writer, - BAD_CAST_CONST(attrkey), BAD_CAST_CONST(attrvalue)); + r = xml_writer_write_attribute(writer, attrkey, attrvalue); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterWriteAttribute() failed: %d", r); + "xml_writer_write_attribute() failed: %d", r); return (ARCHIVE_FATAL); } } if (value != NULL) { - r = xmlTextWriterWriteString(writer, BAD_CAST_CONST(value)); + r = xml_writer_write_string(writer, value); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterWriteString() failed: %d", r); + "xml_writer_write_string() failed: %d", r); return (ARCHIVE_FATAL); } } - r = xmlTextWriterEndElement(writer); + r = xml_writer_end_element(writer); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterEndElement() failed: %d", r); + "xml_writer_end_element() failed: %d", r); return (ARCHIVE_FATAL); } return (ARCHIVE_OK); } static int -xmlwrite_string(struct archive_write *a, xmlTextWriterPtr writer, +xmlwrite_string(struct archive_write *a, struct xml_writer *writer, const char *key, const char *value) { int r; @@ -858,34 +881,34 @@ if (value == NULL) return (ARCHIVE_OK); - r = xmlTextWriterStartElement(writer, BAD_CAST_CONST(key)); + r = xml_writer_start_element(writer, key); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterStartElement() failed: %d", r); + "xml_writer_start_element() failed: %d", r); return (ARCHIVE_FATAL); } if (value != NULL) { - r = xmlTextWriterWriteString(writer, BAD_CAST_CONST(value)); + r = xml_writer_write_string(writer, value); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterWriteString() failed: %d", r); + "xml_writer_write_string() failed: %d", r); return (ARCHIVE_FATAL); } } - r = xmlTextWriterEndElement(writer); + r = xml_writer_end_element(writer); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterEndElement() failed: %d", r); + "xml_writer_end_element() failed: %d", r); return (ARCHIVE_FATAL); } return (ARCHIVE_OK); } static int -xmlwrite_fstring(struct archive_write *a, xmlTextWriterPtr writer, +xmlwrite_fstring(struct archive_write *a, struct xml_writer *writer, const char *key, const char *fmt, ...) { struct xar *xar; @@ -900,7 +923,7 @@ } static int -xmlwrite_time(struct archive_write *a, xmlTextWriterPtr writer, +xmlwrite_time(struct archive_write *a, struct xml_writer *writer, const char *key, time_t t, int z) { char timestr[100]; @@ -922,7 +945,7 @@ } static int -xmlwrite_mode(struct archive_write *a, xmlTextWriterPtr writer, +xmlwrite_mode(struct archive_write *a, struct xml_writer *writer, const char *key, mode_t mode) { char ms[5]; @@ -937,7 +960,7 @@ } static int -xmlwrite_sum(struct archive_write *a, xmlTextWriterPtr writer, +xmlwrite_sum(struct archive_write *a, struct xml_writer *writer, const char *key, struct chksumval *sum) { const char *algname; @@ -971,7 +994,7 @@ } static int -xmlwrite_heap(struct archive_write *a, xmlTextWriterPtr writer, +xmlwrite_heap(struct archive_write *a, struct xml_writer *writer, struct heap_data *heap) { const char *encname; @@ -1029,7 +1052,7 @@ * Our implements records both and if it's necessary. */ static int -make_fflags_entry(struct archive_write *a, xmlTextWriterPtr writer, +make_fflags_entry(struct archive_write *a, struct xml_writer *writer, const char *element, const char *fflags_text) { static const struct flagentry { @@ -1119,11 +1142,11 @@ } while (p != NULL); if (n > 0) { - r = xmlTextWriterStartElement(writer, BAD_CAST_CONST(element)); + r = xml_writer_start_element(writer, element); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterStartElement() failed: %d", r); + "xml_writer_start_element() failed: %d", r); return (ARCHIVE_FATAL); } for (i = 0; i < n; i++) { @@ -1133,29 +1156,59 @@ return (r); } - r = xmlTextWriterEndElement(writer); + r = xml_writer_end_element(writer); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterEndElement() failed: %d", r); + "xml_writer_end_element() failed: %d", r); return (ARCHIVE_FATAL); } } return (ARCHIVE_OK); } +/* + * This function determines whether a UTF-8 string contains + * only codepoints that are convertible to Latin-1. Strings + * beyond Latin-1 are stored base64-encoded in the XAR TOC. + */ static int -make_file_entry(struct archive_write *a, xmlTextWriterPtr writer, +is_u8_zstring_latin1(const char *in) +{ + unsigned int c; + while (*in) { + c = *in++; + if (c < 0x80) continue; + /* + * Filter out non-continuation, any continuation of 2-3 + * bytes, and any continuation of 1 byte whose high 3 bits + * are non-zero. Recall, 1-byte continuations can store 11 + * bits whereas Latin-1 codepoints are only 8 bits wide. + */ + if ((c & 0xFC) != 0xC0) + return (0); + c = *in++; + /* + * If we get any non-continuation byte (including 0x00!), + * the string is not valid UTF-8. + */ + if ((c & 0xC0) != 0x80) + return (0); /* invalid unicode */ + } + return (1); +} + +static int +make_file_entry(struct archive_write *a, struct xml_writer *writer, struct file *file) { struct xar *xar; const char *filetype, *filelink, *fflags; struct archive_string linkto; struct heap_data *heap; - unsigned char *tmp; const char *p; size_t len; - int r, r2, l, ll; + int r, r2; xar = (struct xar *)a->format_data; r2 = ARCHIVE_OK; @@ -1163,44 +1216,35 @@ /* * Make a file name entry, "". */ - l = ll = (int)archive_strlen(&(file->basename)); - tmp = malloc(l); - if (tmp == NULL) { - archive_set_error(&a->archive, ENOMEM, - "Can't allocate memory"); - return (ARCHIVE_FATAL); - } - r = UTF8Toisolat1(tmp, &l, BAD_CAST(file->basename.s), &ll); - free(tmp); - if (r < 0) { - r = xmlTextWriterStartElement(writer, BAD_CAST("name")); + if (!is_u8_zstring_latin1(file->basename.s)) { + r = xml_writer_start_element(writer, "name"); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterStartElement() failed: %d", r); + "xml_writer_start_element() failed: %d", r); return (ARCHIVE_FATAL); } - r = xmlTextWriterWriteAttribute(writer, - BAD_CAST("enctype"), BAD_CAST("base64")); + r = xml_writer_write_attribute(writer, + "enctype", "base64"); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterWriteAttribute() failed: %d", r); + "xml_writer_write_attribute() failed: %d", r); return (ARCHIVE_FATAL); } - r = xmlTextWriterWriteBase64(writer, file->basename.s, + r = xml_writer_write_base64(writer, file->basename.s, 0, (int)archive_strlen(&(file->basename))); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterWriteBase64() failed: %d", r); + "xml_writer_write_base64() failed: %d", r); return (ARCHIVE_FATAL); } - r = xmlTextWriterEndElement(writer); + r = xml_writer_end_element(writer); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterEndElement() failed: %d", r); + "xml_writer_end_element() failed: %d", r); return (ARCHIVE_FATAL); } } else { @@ -1281,11 +1325,11 @@ break; case AE_IFCHR: case AE_IFBLK: - r = xmlTextWriterStartElement(writer, BAD_CAST("device")); + r = xml_writer_start_element(writer, "device"); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterStartElement() failed: %d", r); + "xml_writer_start_element() failed: %d", r); return (ARCHIVE_FATAL); } r = xmlwrite_fstring(a, writer, "major", @@ -1296,11 +1340,11 @@ "%d", archive_entry_rdevminor(file->entry)); if (r < 0) return (ARCHIVE_FATAL); - r = xmlTextWriterEndElement(writer); + r = xml_writer_end_element(writer); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterEndElement() failed: %d", r); + "xml_writer_end_element() failed: %d", r); return (ARCHIVE_FATAL); } break; @@ -1436,19 +1480,19 @@ archive_entry_xattr_next(file->entry, &name, &value, &size); - r = xmlTextWriterStartElement(writer, BAD_CAST("ea")); + r = xml_writer_start_element(writer, "ea"); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterStartElement() failed: %d", r); + "xml_writer_start_element() failed: %d", r); return (ARCHIVE_FATAL); } - r = xmlTextWriterWriteFormatAttribute(writer, - BAD_CAST("id"), "%d", heap->id); + r = xml_writer_write_attributef(writer, + "id", "%d", heap->id); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterWriteAttribute() failed: %d", r); + "xml_writer_write_attributef() failed: %d", r); return (ARCHIVE_FATAL); } r = xmlwrite_heap(a, writer, heap); @@ -1458,11 +1502,11 @@ if (r < 0) return (ARCHIVE_FATAL); - r = xmlTextWriterEndElement(writer); + r = xml_writer_end_element(writer); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterEndElement() failed: %d", r); + "xml_writer_end_element() failed: %d", r); return (ARCHIVE_FATAL); } } @@ -1471,11 +1515,11 @@ * Make a file data entry, "". */ if (file->data.length > 0) { - r = xmlTextWriterStartElement(writer, BAD_CAST("data")); + r = xml_writer_start_element(writer, "data"); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterStartElement() failed: %d", r); + "xml_writer_start_element() failed: %d", r); return (ARCHIVE_FATAL); } @@ -1483,21 +1527,21 @@ if (r < 0) return (ARCHIVE_FATAL); - r = xmlTextWriterEndElement(writer); + r = xml_writer_end_element(writer); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterEndElement() failed: %d", r); + "xml_writer_end_element() failed: %d", r); return (ARCHIVE_FATAL); } } if (archive_strlen(&file->script) > 0) { - r = xmlTextWriterStartElement(writer, BAD_CAST("content")); + r = xml_writer_start_element(writer, "content"); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterStartElement() failed: %d", r); + "xml_writer_start_element() failed: %d", r); return (ARCHIVE_FATAL); } @@ -1510,11 +1554,11 @@ if (r < 0) return (ARCHIVE_FATAL); - r = xmlTextWriterEndElement(writer); + r = xml_writer_end_element(writer); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterEndElement() failed: %d", r); + "xml_writer_end_element() failed: %d", r); return (ARCHIVE_FATAL); } } @@ -1530,8 +1574,9 @@ { struct xar *xar; struct file *np; - xmlBufferPtr bp; - xmlTextWriterPtr writer; + struct xml_writer *writer; + const char* content; + size_t use; int algsize; int r, ret; @@ -1543,51 +1588,43 @@ * Initialize xml writer. */ writer = NULL; - bp = xmlBufferCreate(); - if (bp == NULL) { - archive_set_error(&a->archive, ENOMEM, - "xmlBufferCreate() " - "couldn't create xml buffer"); - goto exit_toc; - } - writer = xmlNewTextWriterMemory(bp, 0); - if (writer == NULL) { + r = xml_writer_create(&writer); + if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlNewTextWriterMemory() " - "couldn't create xml writer"); + "xml_writer_create() failed: %d", r); goto exit_toc; } - r = xmlTextWriterStartDocument(writer, "1.0", "UTF-8", NULL); + r = xml_writer_set_indent(writer, 4); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterStartDocument() failed: %d", r); + "xml_writer_set_indent() failed: %d", r); goto exit_toc; } - r = xmlTextWriterSetIndent(writer, 4); + r = xml_writer_start_document(writer); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterSetIndent() failed: %d", r); + "xml_writer_start_document() failed: %d", r); goto exit_toc; } /* * Start recording TOC */ - r = xmlTextWriterStartElement(writer, BAD_CAST("xar")); + r = xml_writer_start_element(writer, "xar"); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterStartElement() failed: %d", r); + "xml_writer_start_element() failed: %d", r); goto exit_toc; } - r = xmlTextWriterStartElement(writer, BAD_CAST("toc")); + r = xml_writer_start_element(writer, "toc"); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterStartDocument() failed: %d", r); + "xml_writer_start_element() failed: %d", r); goto exit_toc; } @@ -1606,19 +1643,19 @@ /* * Record TOC checksum */ - r = xmlTextWriterStartElement(writer, BAD_CAST("checksum")); + r = xml_writer_start_element(writer, "checksum"); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterStartElement() failed: %d", r); + "xml_writer_start_element() failed: %d", r); goto exit_toc; } - r = xmlTextWriterWriteAttribute(writer, BAD_CAST("style"), - BAD_CAST_CONST(getalgname(xar->opt_toc_sumalg))); + r = xml_writer_write_attribute(writer, "style", + getalgname(xar->opt_toc_sumalg)); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterWriteAttribute() failed: %d", r); + "xml_writer_write_attribute() failed: %d", r); goto exit_toc; } @@ -1636,11 +1673,11 @@ if (r < 0) goto exit_toc; - r = xmlTextWriterEndElement(writer); + r = xml_writer_end_element(writer); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterEndElement() failed: %d", r); + "xml_writer_end_element() failed: %d", r); goto exit_toc; } } @@ -1656,32 +1693,32 @@ if (np->dir && np->children.first != NULL) { /* Enter to sub directories. */ np = np->children.first; - r = xmlTextWriterStartElement(writer, - BAD_CAST("file")); + r = xml_writer_start_element(writer, + "file"); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterStartElement() " + "xml_writer_start_element() " "failed: %d", r); goto exit_toc; } - r = xmlTextWriterWriteFormatAttribute( - writer, BAD_CAST("id"), "%d", np->id); + r = xml_writer_write_attributef( + writer, "id", "%d", np->id); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterWriteAttribute() " + "xml_writer_write_attributef() " "failed: %d", r); goto exit_toc; } continue; } while (np != np->parent) { - r = xmlTextWriterEndElement(writer); + r = xml_writer_end_element(writer); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterEndElement() " + "xml_writer_end_element() " "failed: %d", r); goto exit_toc; } @@ -1690,21 +1727,21 @@ np = np->parent; } else { np = np->chnext; - r = xmlTextWriterStartElement(writer, - BAD_CAST("file")); + r = xml_writer_start_element(writer, + "file"); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterStartElement() " + "xml_writer_start_element() " "failed: %d", r); goto exit_toc; } - r = xmlTextWriterWriteFormatAttribute( - writer, BAD_CAST("id"), "%d", np->id); + r = xml_writer_write_attributef( + writer, "id", "%d", np->id); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterWriteAttribute() " + "xml_writer_write_attributef() " "failed: %d", r); goto exit_toc; } @@ -1713,31 +1750,40 @@ } } while (np != np->parent); - r = xmlTextWriterEndDocument(writer); + r = xml_writer_end_document(writer); if (r < 0) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "xmlTextWriterEndDocument() failed: %d", r); + "xml_writer_end_document() failed: %d", r); goto exit_toc; } + + r = xml_writer_get_final_content_and_length(writer, &content, &use); + if (r < 0) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_MISC, + "xml_writer_get_final_content_and_length() failed: %d", r); + goto exit_toc; + } + #if DEBUG_PRINT_TOC fprintf(stderr, "\n---TOC-- %d bytes --\n%s\n", - strlen((const char *)bp->content), bp->content); + (int)strlen(content), content); #endif /* * Compress the TOC and calculate the sum of the TOC. */ xar->toc.temp_offset = xar->temp_offset; - xar->toc.size = bp->use; + xar->toc.size = (uint64_t)use; checksum_init(&(xar->a_sumwrk), xar->opt_toc_sumalg); r = compression_init_encoder_gzip(&(a->archive), &(xar->stream), 6, 1); if (r != ARCHIVE_OK) goto exit_toc; - xar->stream.next_in = bp->content; - xar->stream.avail_in = bp->use; + xar->stream.next_in = (const unsigned char *)content; + xar->stream.avail_in = use; xar->stream.total_in = 0; xar->stream.next_out = xar->wbuff; xar->stream.avail_out = sizeof(xar->wbuff); @@ -1768,9 +1814,7 @@ ret = ARCHIVE_OK; exit_toc: if (writer) - xmlFreeTextWriter(writer); - if (bp) - xmlBufferFree(bp); + xml_writer_destroy(writer); return (ret); } @@ -3251,4 +3295,404 @@ } } +#if HAVE_LIBXML_XMLWRITER_H + +#define BAD_CAST_CONST (const xmlChar *) + +struct xml_writer { + xmlTextWriterPtr writer; + xmlBufferPtr bp; + unsigned int indent; +}; + +static int +xml_writer_create(struct xml_writer **pctx) +{ + struct xml_writer *ctx = calloc(1, sizeof(struct xml_writer)); + if (ctx == NULL) { + return (-1); + } + + ctx->bp = xmlBufferCreate(); + if (ctx->bp == NULL) { + free(ctx); + return (-1); + } + + ctx->writer = xmlNewTextWriterMemory(ctx->bp, 0); + if (ctx->writer == NULL) { + xmlBufferFree(ctx->bp); + free(ctx); + return (-1); + } + + *pctx = ctx; + return (0); +} + +static int +xml_writer_destroy(struct xml_writer *ctx) +{ + xmlFreeTextWriter(ctx->writer); + xmlBufferFree(ctx->bp); + free(ctx); + return (0); +} + +static int +xml_writer_start_document(struct xml_writer *ctx) +{ + int r; + r = xmlTextWriterStartDocument(ctx->writer, "1.0", "UTF-8", NULL); + if (r < 0) { + return (r); + } + + r = xmlTextWriterSetIndent(ctx->writer, (int)ctx->indent); + return (r); +} + +static int +xml_writer_end_document(struct xml_writer *ctx) +{ + return (xmlTextWriterEndDocument(ctx->writer)); +} + +static int +xml_writer_set_indent(struct xml_writer *ctx, unsigned int indent) +{ + /* libxml2 only lets you set the indent after starting the document */ + ctx->indent = indent; + return (0); +} + +static int +xml_writer_start_element(struct xml_writer *ctx, const char *localName) +{ + return (xmlTextWriterStartElement(ctx->writer, + BAD_CAST_CONST(localName))); +} + +static int +xml_writer_write_attribute(struct xml_writer *ctx, + const char *key, const char *value) +{ + return (xmlTextWriterWriteAttribute(ctx->writer, + BAD_CAST_CONST(key), BAD_CAST_CONST(value))); +} + +static int +xml_writer_write_attributef(struct xml_writer *ctx, + const char *key, const char *format, ...) +{ + va_list ap; + int ret; + va_start(ap, format); + ret = xmlTextWriterWriteVFormatAttribute(ctx->writer, + BAD_CAST_CONST(key), format, ap); + va_end(ap); + return (ret); +} + +static int +xml_writer_write_string(struct xml_writer *ctx, const char *string) +{ + return (xmlTextWriterWriteString(ctx->writer, BAD_CAST_CONST(string))); +} + +static int +xml_writer_write_base64(struct xml_writer* ctx, + const char *data, size_t start, size_t len) +{ + return (xmlTextWriterWriteBase64(ctx->writer, data, + (int)start, (int)len)); +} + +static int +xml_writer_end_element(struct xml_writer *ctx) +{ + return (xmlTextWriterEndElement(ctx->writer)); +} + +static int +xml_writer_get_final_content_and_length(struct xml_writer *ctx, + const char **out, size_t *size) +{ + *out = (const char*)ctx->bp->content; + *size = (size_t)ctx->bp->use; + return (0); +} + +#elif HAVE_XMLLITE_H + +struct xml_writer { + IXmlWriter *writer; + IStream *stream; + HGLOBAL global; +}; + +static int +xml_writer_create(struct xml_writer **pctx) +{ + struct xml_writer *ctx; + HRESULT hr; + + ctx = calloc(1, sizeof(struct xml_writer)); + if (ctx == NULL) { + return (E_OUTOFMEMORY); + } + + hr = CreateStreamOnHGlobal(NULL, TRUE, &ctx->stream); + if (FAILED(hr)) { + free(ctx); + return (hr); + } + + hr = CreateXmlWriter(&IID_IXmlWriter, (void **)&ctx->writer, NULL); + if (FAILED(hr)) { + ctx->stream->lpVtbl->Release(ctx->stream); + free(ctx); + return (hr); + } + + hr = ctx->writer->lpVtbl->SetOutput(ctx->writer, + (IUnknown *)ctx->stream); + if (FAILED(hr)) { + ctx->writer->lpVtbl->Release(ctx->writer); + ctx->stream->lpVtbl->Release(ctx->stream); + free(ctx); + return (hr); + } + + *pctx = ctx; + return (S_OK); +} + +static int +xml_writer_destroy(struct xml_writer *ctx) +{ + if (ctx->global) + GlobalUnlock(ctx->global); + ctx->writer->lpVtbl->Release(ctx->writer); /* Destroys only writer */ + ctx->stream->lpVtbl->Release(ctx->stream); /* Destroys stream, global */ + free(ctx); + return (S_OK); +} + +static int +xml_writer_start_document(struct xml_writer *ctx) +{ + return ctx->writer->lpVtbl->WriteStartDocument(ctx->writer, + XmlStandalone_Omit); +} + +static int +xml_writer_end_document(struct xml_writer *ctx) +{ + return ctx->writer->lpVtbl->WriteEndDocument(ctx->writer); +} + +static int +xml_writer_set_indent(struct xml_writer *ctx, unsigned int indent) +{ + /* Windows' xmllite does not support indent sizes; will always be 2 */ + (void)indent; + return ctx->writer->lpVtbl->SetProperty(ctx->writer, + XmlWriterProperty_Indent, (LONG_PTR)TRUE); +} + +static int +xml_writer_start_element(struct xml_writer *ctx, const char *localName) +{ + struct archive_wstring as; + HRESULT hr; + archive_string_init(&as); + if (archive_wstring_append_from_mbs(&as, localName, + strlen(localName))) { + hr = E_OUTOFMEMORY; + goto exit_hr; + } + hr = ctx->writer->lpVtbl->WriteStartElement(ctx->writer, NULL, + as.s, NULL); + +exit_hr: + archive_wstring_free(&as); + return hr; +} + +static int +xml_writer_write_attribute(struct xml_writer *ctx, + const char *key, const char *value) +{ + struct archive_wstring ask, asv; + HRESULT hr; + archive_string_init(&ask); + archive_string_init(&asv); + if (archive_wstring_append_from_mbs(&ask, key, strlen(key))) { + hr = E_OUTOFMEMORY; + goto exit_hr; + } + if (archive_wstring_append_from_mbs(&asv, value, strlen(value))) { + hr = E_OUTOFMEMORY; + goto exit_hr; + } + hr = ctx->writer->lpVtbl->WriteAttributeString(ctx->writer, NULL, + ask.s, NULL, asv.s); + +exit_hr: + archive_wstring_free(&asv); + archive_wstring_free(&ask); + return hr; +} + +static int +xml_writer_write_attributef(struct xml_writer *ctx, + const char *key, const char *format, ...) +{ + struct archive_wstring ask, asv; + struct archive_string asf; + HRESULT hr; + va_list ap; + + va_start(ap, format); + archive_string_init(&ask); + archive_string_init(&asv); + archive_string_init(&asf); + + if (archive_wstring_append_from_mbs(&ask, key, strlen(key))) { + hr = E_OUTOFMEMORY; + goto exit_hr; + } + + archive_string_vsprintf(&asf, format, ap); + if (archive_wstring_append_from_mbs(&asv, asf.s, asf.length)) { + hr = E_OUTOFMEMORY; + goto exit_hr; + } + + hr = ctx->writer->lpVtbl->WriteAttributeString(ctx->writer, NULL, + ask.s, NULL, asv.s); + +exit_hr: + archive_string_free(&asf); + archive_wstring_free(&asv); + archive_wstring_free(&ask); + va_end(ap); + + return hr; +} + +static int +xml_writer_write_string(struct xml_writer *ctx, const char *string) +{ + struct archive_wstring as; + HRESULT hr; + archive_string_init(&as); + if (archive_wstring_append_from_mbs(&as, string, strlen(string))) { + hr = E_OUTOFMEMORY; + goto exit_hr; + } + hr = ctx->writer->lpVtbl->WriteString(ctx->writer, as.s); + +exit_hr: + archive_wstring_free(&as); + return hr; +} + +static const wchar_t base64[] = { + L'A', L'B', L'C', L'D', L'E', L'F', L'G', L'H', + L'I', L'J', L'K', L'L', L'M', L'N', L'O', L'P', + L'Q', L'R', L'S', L'T', L'U', L'V', L'W', L'X', + L'Y', L'Z', L'a', L'b', L'c', L'd', L'e', L'f', + L'g', L'h', L'i', L'j', L'k', L'l', L'm', L'n', + L'o', L'p', L'q', L'r', L's', L't', L'u', L'v', + L'w', L'x', L'y', L'z', L'0', L'1', L'2', L'3', + L'4', L'5', L'6', L'7', L'8', L'9', L'+', L'/' +}; + +static void +la_b64_wencode(struct archive_wstring *as, const unsigned char *p, size_t len) +{ + int c; + + for (; len >= 3; p += 3, len -= 3) { + c = p[0] >> 2; + archive_wstrappend_wchar(as, base64[c]); + c = ((p[0] & 0x03) << 4) | ((p[1] & 0xf0) >> 4); + archive_wstrappend_wchar(as, base64[c]); + c = ((p[1] & 0x0f) << 2) | ((p[2] & 0xc0) >> 6); + archive_wstrappend_wchar(as, base64[c]); + c = p[2] & 0x3f; + archive_wstrappend_wchar(as, base64[c]); + } + if (len > 0) { + c = p[0] >> 2; + archive_wstrappend_wchar(as, base64[c]); + c = (p[0] & 0x03) << 4; + if (len == 1) { + archive_wstrappend_wchar(as, base64[c]); + archive_wstrappend_wchar(as, '='); + archive_wstrappend_wchar(as, '='); + } else { + c |= (p[1] & 0xf0) >> 4; + archive_wstrappend_wchar(as, base64[c]); + c = (p[1] & 0x0f) << 2; + archive_wstrappend_wchar(as, base64[c]); + archive_wstrappend_wchar(as, '='); + } + } +} + +static int +xml_writer_write_base64(struct xml_writer* ctx, + const char *data, size_t start, size_t len) +{ + struct archive_wstring as; + HRESULT hr; + archive_string_init(&as); + la_b64_wencode(&as, (const unsigned char *)data + start, len - start); + hr = ctx->writer->lpVtbl->WriteString(ctx->writer, as.s); + archive_wstring_free(&as); + return hr; +} + +static int +xml_writer_end_element(struct xml_writer *ctx) +{ + return ctx->writer->lpVtbl->WriteEndElement(ctx->writer); +} + +static int +xml_writer_get_final_content_and_length(struct xml_writer *ctx, + const char **out, size_t *size) +{ + HGLOBAL gbl; + HRESULT hr; + + hr = ctx->writer->lpVtbl->Flush(ctx->writer); + if (FAILED(hr)) { + return (hr); + } + + hr = GetHGlobalFromStream(ctx->stream, &gbl); + if (FAILED(hr)) { + return (hr); + } + + *out = (const char *)GlobalLock(gbl); + if (*out == NULL) { + hr = HRESULT_FROM_WIN32(GetLastError()); + return (hr); + } + + /* GlobalUnlock is called in + * xml_writer_destroy. + */ + *size = (size_t)GlobalSize(gbl); + ctx->global = gbl; + return (hr); +} + +#endif /* HAVE_LIBXML_XMLWRITER_H */ + #endif /* Support xar format */ --- contrib/libarchive/libarchive/archive_write_set_format_zip.c.orig +++ contrib/libarchive/libarchive/archive_write_set_format_zip.c @@ -43,9 +43,24 @@ #ifdef HAVE_STRING_H #include #endif +#ifdef HAVE_LIMITS_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif #ifdef HAVE_ZLIB_H #include #endif +#ifdef HAVE_LZMA_H +#include +#endif +#ifdef HAVE_BZLIB_H +#include +#endif +#ifdef HAVE_ZSTD_H +#include +#endif #include "archive.h" #include "archive_cryptor_private.h" @@ -55,6 +70,7 @@ #include "archive_hmac_private.h" #include "archive_private.h" #include "archive_random_private.h" +#include "archive_time_private.h" #include "archive_write_private.h" #include "archive_write_set_format_private.h" @@ -62,8 +78,12 @@ #include "archive_crc32.h" #endif -#define ZIP_ENTRY_FLAG_ENCRYPTED (1<<0) -#define ZIP_ENTRY_FLAG_LENGTH_AT_END (1<<3) +#define ZIP_ENTRY_FLAG_ENCRYPTED (1 << 0) +#define ZIP_ENTRY_FLAG_LZMA_EOPM (1 << 1) +#define ZIP_ENTRY_FLAG_DEFLATE_MAX (1 << 1) /* i.e. compression levels 8 & 9 */ +#define ZIP_ENTRY_FLAG_DEFLATE_FAST (1 << 2) /* i.e. compression levels 3 & 4 */ +#define ZIP_ENTRY_FLAG_DEFLATE_SUPER_FAST (1 << 1) | (1 << 2) /* i.e. compression levels 1 & 2 */ +#define ZIP_ENTRY_FLAG_LENGTH_AT_END (1 << 3) #define ZIP_ENTRY_FLAG_UTF8_NAME (1 << 11) #define ZIP_4GB_MAX ARCHIVE_LITERAL_LL(0xffffffff) @@ -72,7 +92,11 @@ enum compression { COMPRESSION_UNSPECIFIED = -1, COMPRESSION_STORE = 0, - COMPRESSION_DEFLATE = 8 + COMPRESSION_DEFLATE = 8, + COMPRESSION_BZIP2 = 12, + COMPRESSION_LZMA = 14, + COMPRESSION_ZSTD = 93, + COMPRESSION_XZ = 95 }; #ifdef HAVE_ZLIB_H @@ -119,7 +143,6 @@ }; struct zip { - int64_t entry_offset; int64_t entry_compressed_size; int64_t entry_uncompressed_size; @@ -155,17 +178,45 @@ struct archive_string_conv *opt_sconv; struct archive_string_conv *sconv_default; enum compression requested_compression; - int deflate_compression_level; + short compression_level; int init_default_conversion; - enum encryption encryption_type; + enum encryption encryption_type; + short threads; #define ZIP_FLAG_AVOID_ZIP64 1 #define ZIP_FLAG_FORCE_ZIP64 2 #define ZIP_FLAG_EXPERIMENT_xl 4 int flags; - +#if defined(HAVE_LZMA_H) || defined(HAVE_ZLIB_H) || defined(HAVE_BZLIB_H) || defined(HAVE_ZSTD_H) + union { +#ifdef HAVE_LZMA_H + /* ZIP's XZ format (id 95) is easy enough: copy Deflate, mutatis + * mutandis the library changes. ZIP's LZMA format (id 14), + * however, is rather more involved, starting here: it being a + * modified LZMA Alone format requires a bit more + * book-keeping. */ + struct { + char headers_to_write; + lzma_options_lzma options; + lzma_stream context; + } lzma; +#endif #ifdef HAVE_ZLIB_H - z_stream stream; + z_stream deflate; +#endif +#ifdef HAVE_BZLIB_H + bz_stream bzip2; +#endif +#if defined(HAVE_ZSTD_H) && HAVE_ZSTD_compressStream + struct { + /* Libzstd's init function gives a pointer to a memory area + * it manages rather than asking for memory to initialise. */ + ZSTD_CStream* context; + ZSTD_inBuffer in; + ZSTD_outBuffer out; + } zstd; +#endif + } stream; #endif size_t len_buf; unsigned char *buf; @@ -184,7 +235,6 @@ struct archive_entry *); static int archive_write_zip_options(struct archive_write *, const char *, const char *); -static unsigned int dos_time(const time_t); static size_t path_length(struct archive_entry *); static int write_path(struct archive_entry *, struct archive_write *); static void copy_path(struct archive_entry *, unsigned char *); @@ -197,6 +247,44 @@ static int init_winzip_aes_encryption(struct archive_write *); static int is_winzip_aes_encryption_supported(int encryption); +#ifdef HAVE_LZMA_H +/* ZIP's LZMA format requires the use of a alas not exposed in LibLZMA + * function to write the ZIP header. Given our internal version never + * fails, no need for a non-void return type. */ +static void +lzma_lzma_props_encode(const lzma_options_lzma* options, uint8_t* out) +{ + out[0] = (options->pb * 5 + options->lp) * 9 + options->lc; + archive_le32enc(out + 1, options->dict_size); +} +#endif + +#if defined(HAVE_LZMA_H) && !defined(HAVE_LZMA_STREAM_ENCODER_MT) +/* Dummy mt declarations, to avoid spaghetti includes below. Defined with + * macros being renamed afterwards to shadow liblzma's types in order to + * avoid some compiler errors. */ +#define lzma_stream_encoder_mt(str, opt) dummy_mt(str, opt) +#define lzma_mt dummy_options + +typedef struct { + void* filters; + uint32_t preset; + lzma_check check; + short threads; + char flags; + char block_size; + char timeout; +} dummy_options; + +static inline lzma_ret +dummy_mt(lzma_stream* stream, const lzma_mt* options) +{ + (void)stream; /* UNUSED */ + (void)options; /* UNUSED */ + return LZMA_PROG_ERROR; +} +#endif + static unsigned char * cd_alloc(struct zip *zip, size_t length) { @@ -274,26 +362,104 @@ } else if (strcmp(val, "store") == 0) { zip->requested_compression = COMPRESSION_STORE; ret = ARCHIVE_OK; + } else if (strcmp(val, "bzip2") == 0) { +#ifdef HAVE_BZLIB_H + zip->requested_compression = COMPRESSION_BZIP2; + ret = ARCHIVE_OK; +#else + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "bzip2 compression not supported"); +#endif + } else if (strcmp(val, "lzma") == 0) { +#ifdef HAVE_LZMA_H + zip->requested_compression = COMPRESSION_LZMA; + ret = ARCHIVE_OK; +#else + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "lzma compression not supported"); +#endif + } else if (strcmp(val, "xz") == 0) { +#ifdef HAVE_LZMA_H + zip->requested_compression = COMPRESSION_XZ; + ret = ARCHIVE_OK; +#else + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "xz compression not supported"); +#endif + } else if (strcmp(val, "zstd") == 0) { +#if defined(HAVE_ZSTD_H) && HAVE_ZSTD_compressStream + zip->requested_compression = COMPRESSION_ZSTD; + ret = ARCHIVE_OK; +#else + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "zstd compression not supported"); +#endif } return (ret); } else if (strcmp(key, "compression-level") == 0) { - if (val == NULL || !(val[0] >= '0' && val[0] <= '9') || val[1] != '\0') { - return ARCHIVE_WARN; + char *endptr; + + if (val == NULL) + return (ARCHIVE_WARN); + errno = 0; + zip->compression_level = (short)strtoul(val, &endptr, 10); + if (errno != 0 || *endptr != '\0' || zip->compression_level < 0 || + zip->compression_level > 9) { + zip->compression_level = 6; // set to default + return (ARCHIVE_WARN); } - if (val[0] == '0') { + if (zip->compression_level == 0) { zip->requested_compression = COMPRESSION_STORE; return ARCHIVE_OK; } else { +#if defined(HAVE_ZLIB_H) || defined(HAVE_LZMA_H) || defined(HAVE_BZLIB_H) || (defined(HAVE_ZSTD_H) && HAVE_ZSTD_compressStream) + // Not forcing an already specified compression algorithm + if (zip->requested_compression == COMPRESSION_UNSPECIFIED) { #ifdef HAVE_ZLIB_H - zip->requested_compression = COMPRESSION_DEFLATE; - zip->deflate_compression_level = val[0] - '0'; + zip->requested_compression = COMPRESSION_DEFLATE; +#elif defined(HAVE_BZLIB_H) + zip->requested_compression = COMPRESSION_BZIP2; +#elif defined(HAVE_LZMA_H) + // Arbitrarily choosing LZMA of the two LZMA methods + zip->requested_compression = COMPRESSION_LZMA; +#else + zip->requested_compression = COMPRESSION_ZSTD; +#endif + } return ARCHIVE_OK; #else archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "deflate compression not supported"); + "compression not supported"); +#endif + } + } else if (strcmp(key, "threads") == 0) { + char *endptr; + + if (val == NULL) + return (ARCHIVE_FAILED); + errno = 0; + zip->threads = (short)strtoul(val, &endptr, 10); + if (errno != 0 || *endptr != '\0') { + zip->threads = 1; + archive_set_error(&(a->archive), ARCHIVE_ERRNO_MISC, + "Illegal value `%s'", val); + return (ARCHIVE_FAILED); + } + if (zip->threads == 0) { +#ifdef HAVE_LZMA_STREAM_ENCODER_MT + zip->threads = lzma_cputhreads(); +#elif defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_ONLN) + zip->threads = sysconf(_SC_NPROCESSORS_ONLN); +#elif !defined(__CYGWIN__) && defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0601 + /* Windows 7 and up */ + DWORD activeProcs = GetActiveProcessorCount(ALL_PROCESSOR_GROUPS); + zip->threads = activeProcs <= SHRT_MAX ? (short)activeProcs : SHRT_MAX; +#else + zip->threads = 1; #endif } + return (ARCHIVE_OK); } else if (strcmp(key, "encryption") == 0) { if (val == NULL) { zip->encryption_type = ENCRYPTION_NONE; @@ -305,8 +471,7 @@ zip->encryption_type = ENCRYPTION_TRADITIONAL; ret = ARCHIVE_OK; } else { - archive_set_error(&a->archive, - ARCHIVE_ERRNO_MISC, + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "encryption not supported"); } } else if (strcmp(val, "aes128") == 0) { @@ -315,8 +480,7 @@ zip->encryption_type = ENCRYPTION_WINZIP_AES128; ret = ARCHIVE_OK; } else { - archive_set_error(&a->archive, - ARCHIVE_ERRNO_MISC, + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "encryption not supported"); } } else if (strcmp(val, "aes256") == 0) { @@ -325,14 +489,12 @@ zip->encryption_type = ENCRYPTION_WINZIP_AES256; ret = ARCHIVE_OK; } else { - archive_set_error(&a->archive, - ARCHIVE_ERRNO_MISC, + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "encryption not supported"); } } else { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "%s: unknown encryption '%s'", - a->format_name, val); + "%s: unknown encryption '%s'", a->format_name, val); } return (ret); } else if (strcmp(key, "experimental") == 0) { @@ -421,6 +583,118 @@ return (ret); } +int +archive_write_zip_set_compression_bzip2(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + int ret = ARCHIVE_FAILED; + + archive_check_magic(_a, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_NEW | ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA, + "archive_write_zip_set_compression_bzip2"); + if (a->archive.archive_format != ARCHIVE_FORMAT_ZIP) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Can only use archive_write_zip_set_compression_bzip2" + " with zip format"); + ret = ARCHIVE_FATAL; + } else { +#ifdef HAVE_BZLIB_H + struct zip *zip = a->format_data; + zip->requested_compression = COMPRESSION_BZIP2; + ret = ARCHIVE_OK; +#else + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "bzip2 compression not supported"); + ret = ARCHIVE_FAILED; +#endif + } + return (ret); +} + +int +archive_write_zip_set_compression_zstd(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + int ret = ARCHIVE_FAILED; + + archive_check_magic(_a, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_NEW | ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA, + "archive_write_zip_set_compression_zstd"); + if (a->archive.archive_format != ARCHIVE_FORMAT_ZIP) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Can only use archive_write_zip_set_compression_zstd" + " with zip format"); + ret = ARCHIVE_FATAL; + } else { +#if defined(HAVE_ZSTD_H) && HAVE_ZSTD_compressStream + struct zip *zip = a->format_data; + zip->requested_compression = COMPRESSION_ZSTD; + ret = ARCHIVE_OK; +#else + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "zstd compression not supported"); + ret = ARCHIVE_FAILED; +#endif + } + return (ret); +} + +int +archive_write_zip_set_compression_lzma(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + int ret = ARCHIVE_FAILED; + + archive_check_magic(_a, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_NEW | ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA, + "archive_write_zip_set_compression_lzma"); + if (a->archive.archive_format != ARCHIVE_FORMAT_ZIP) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Can only use archive_write_zip_set_compression_lzma" + " with zip format"); + ret = ARCHIVE_FATAL; + } else { +#ifdef HAVE_LZMA_H + struct zip *zip = a->format_data; + zip->requested_compression = COMPRESSION_LZMA; + ret = ARCHIVE_OK; +#else + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "lzma compression not supported"); + ret = ARCHIVE_FAILED; +#endif + } + return (ret); +} + +int +archive_write_zip_set_compression_xz(struct archive *_a) +{ + struct archive_write *a = (struct archive_write *)_a; + int ret = ARCHIVE_FAILED; + + archive_check_magic(_a, ARCHIVE_WRITE_MAGIC, + ARCHIVE_STATE_NEW | ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA, + "archive_write_zip_set_compression_xz"); + if (a->archive.archive_format != ARCHIVE_FORMAT_ZIP) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "Can only use archive_write_zip_set_compression_xz" + " with zip format"); + ret = ARCHIVE_FATAL; + } else { +#ifdef HAVE_LZMA_H + struct zip *zip = a->format_data; + zip->requested_compression = COMPRESSION_XZ; + ret = ARCHIVE_OK; +#else + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "xz compression not supported"); + ret = ARCHIVE_FAILED; +#endif + } + return (ret); +} + int archive_write_zip_set_compression_store(struct archive *_a) { @@ -430,7 +704,7 @@ archive_check_magic(_a, ARCHIVE_WRITE_MAGIC, ARCHIVE_STATE_NEW | ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA, - "archive_write_zip_set_compression_deflate"); + "archive_write_zip_set_compression_store"); if (a->archive.archive_format != ARCHIVE_FORMAT_ZIP) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "Can only use archive_write_zip_set_compression_store" @@ -465,9 +739,14 @@ /* "Unspecified" lets us choose the appropriate compression. */ zip->requested_compression = COMPRESSION_UNSPECIFIED; -#ifdef HAVE_ZLIB_H - zip->deflate_compression_level = Z_DEFAULT_COMPRESSION; -#endif + /* Following the 7-zip write support's lead, setting the default + * compression level explicitly to 6 no matter what. */ + zip->compression_level = 6; + /* Following the xar write support's lead, the default number of + * threads is 1 (i.e. the xz compression, the only one caring about + * that, not being multi-threaded even if the multi-threaded encoder + * were available) */ + zip->threads = 1; zip->crc32func = real_crc32; /* A buffer used for both compression and encryption. */ @@ -529,7 +808,7 @@ __archive_write_entry_filetype_unsupported( &a->archive, entry, "zip"); return ARCHIVE_FAILED; - }; + } /* If we're not using Zip64, reject large files. */ if (zip->flags & ZIP_FLAG_AVOID_ZIP64) { @@ -552,7 +831,6 @@ if (type != AE_IFREG) archive_entry_set_size(entry, 0); - /* Reset information from last entry. */ zip->entry_offset = zip->written_bytes; zip->entry_uncompressed_limit = INT64_MAX; @@ -589,7 +867,6 @@ } } - #if defined(_WIN32) && !defined(__CYGWIN__) /* Make sure the path separators in pathname, hardlink and symlink * are all slash '/', not the Windows path separator '\'. */ @@ -685,13 +962,49 @@ if (zip->entry_compression == COMPRESSION_UNSPECIFIED) { zip->entry_compression = COMPRESSION_DEFAULT; } - if (zip->entry_compression == COMPRESSION_STORE) { + switch (zip->entry_compression) { + case COMPRESSION_STORE: zip->entry_compressed_size = size; zip->entry_uncompressed_size = size; MIN_VERSION_NEEDED(10); - } else { + break; + case COMPRESSION_ZSTD: + zip->entry_uncompressed_size = size; + MIN_VERSION_NEEDED(63); + break; + case COMPRESSION_LZMA: zip->entry_uncompressed_size = size; + zip->entry_flags |= ZIP_ENTRY_FLAG_LZMA_EOPM; + MIN_VERSION_NEEDED(63); + break; + case COMPRESSION_XZ: + zip->entry_uncompressed_size = size; + MIN_VERSION_NEEDED(63); + break; + case COMPRESSION_BZIP2: + zip->entry_uncompressed_size = size; + MIN_VERSION_NEEDED(46); + break; + default: // i.e. deflate compression + zip->entry_uncompressed_size = size; + switch (zip->compression_level) { + case 1: + case 2: + zip->entry_flags |= ZIP_ENTRY_FLAG_DEFLATE_SUPER_FAST; + break; + case 3: + case 4: + zip->entry_flags |= ZIP_ENTRY_FLAG_DEFLATE_FAST; + break; + case 8: + case 9: + zip->entry_flags |= ZIP_ENTRY_FLAG_DEFLATE_MAX; + break; + default: + break; + } MIN_VERSION_NEEDED(20); + break; } if (zip->entry_flags & ZIP_ENTRY_FLAG_ENCRYPTED) { @@ -741,9 +1054,8 @@ /* We don't know the size. Use the default * compression unless specified otherwise. */ - zip->entry_compression = zip->requested_compression; - if(zip->entry_compression == COMPRESSION_UNSPECIFIED){ + if (zip->entry_compression == COMPRESSION_UNSPECIFIED) { zip->entry_compression = COMPRESSION_DEFAULT; } @@ -751,10 +1063,43 @@ if ((zip->flags & ZIP_FLAG_AVOID_ZIP64) == 0) { /* We might use zip64 extensions, so require 4.5 */ MIN_VERSION_NEEDED(45); - } else if (zip->entry_compression == COMPRESSION_STORE) { + } + switch (zip->entry_compression) { + case COMPRESSION_STORE: MIN_VERSION_NEEDED(10); - } else { + break; + case COMPRESSION_ZSTD: + MIN_VERSION_NEEDED(63); + break; + case COMPRESSION_LZMA: + zip->entry_flags |= ZIP_ENTRY_FLAG_LZMA_EOPM; + MIN_VERSION_NEEDED(63); + break; + case COMPRESSION_XZ: + MIN_VERSION_NEEDED(63); + break; + case COMPRESSION_BZIP2: + MIN_VERSION_NEEDED(46); + break; + default: // i.e. deflate compression + switch (zip->compression_level) { + case 1: + case 2: + zip->entry_flags |= ZIP_ENTRY_FLAG_DEFLATE_SUPER_FAST; + break; + case 3: + case 4: + zip->entry_flags |= ZIP_ENTRY_FLAG_DEFLATE_FAST; + break; + case 8: + case 9: + zip->entry_flags |= ZIP_ENTRY_FLAG_DEFLATE_MAX; + break; + default: + break; + } MIN_VERSION_NEEDED(20); + break; } if (zip->entry_flags & ZIP_ENTRY_FLAG_ENCRYPTED) { @@ -782,7 +1127,7 @@ else archive_le16enc(local_header + 8, zip->entry_compression); archive_le32enc(local_header + 10, - dos_time(archive_entry_mtime(zip->entry))); + unix_to_dos(archive_entry_mtime(zip->entry))); if ((zip->entry_flags & ZIP_ENTRY_FLAG_LENGTH_AT_END) == 0) { archive_le32enc(local_header + 14, zip->entry_crc32); archive_le32enc(local_header + 18, (uint32_t)zip->entry_compressed_size); @@ -813,7 +1158,7 @@ else archive_le16enc(zip->file_header + 10, zip->entry_compression); archive_le32enc(zip->file_header + 12, - dos_time(archive_entry_mtime(zip->entry))); + unix_to_dos(archive_entry_mtime(zip->entry))); archive_le16enc(zip->file_header + 28, (uint16_t)filename_length); /* Following Info-Zip, store mode in the "external attributes" field. */ archive_le32enc(zip->file_header + 38, @@ -983,21 +1328,147 @@ zip->written_bytes += slink_size; } + switch (zip->entry_compression) { #ifdef HAVE_ZLIB_H - if (zip->entry_compression == COMPRESSION_DEFLATE) { - zip->stream.zalloc = Z_NULL; - zip->stream.zfree = Z_NULL; - zip->stream.opaque = Z_NULL; - zip->stream.next_out = zip->buf; - zip->stream.avail_out = (uInt)zip->len_buf; - if (deflateInit2(&zip->stream, zip->deflate_compression_level, + case COMPRESSION_DEFLATE: + zip->stream.deflate.zalloc = Z_NULL; + zip->stream.deflate.zfree = Z_NULL; + zip->stream.deflate.opaque = Z_NULL; + zip->stream.deflate.next_out = zip->buf; + zip->stream.deflate.avail_out = (uInt)zip->len_buf; + if (deflateInit2(&zip->stream.deflate, zip->compression_level, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY) != Z_OK) { archive_set_error(&a->archive, ENOMEM, "Can't init deflate compressor"); return (ARCHIVE_FATAL); } - } + break; +#endif +#ifdef HAVE_BZLIB_H + case COMPRESSION_BZIP2: + memset(&zip->stream.bzip2, 0, sizeof(bz_stream)); + zip->stream.bzip2.next_out = (char*)zip->buf; + zip->stream.bzip2.avail_out = (unsigned int)zip->len_buf; + if (BZ2_bzCompressInit(&zip->stream.bzip2, zip->compression_level, 0, 0) != BZ_OK) { + archive_set_error(&a->archive, ENOMEM, + "Can't init bzip2 compressor"); + return (ARCHIVE_FATAL); + } + break; +#endif +#if defined(HAVE_ZSTD_H) && HAVE_ZSTD_compressStream + case COMPRESSION_ZSTD: + {/* Libzstd, contrary to many compression libraries, doesn't use + * zlib's 0 to 9 scale and its negative scale is way bigger than + * its positive one. So setting 1 as the lowest allowed compression + * level and rescaling to 2 to 9 to libzstd's positive scale. */ + int zstd_compression_level = zip->compression_level == 1 + ? ZSTD_minCLevel() // ZSTD_minCLevel is negative ! + : (zip->compression_level - 1) * ZSTD_maxCLevel() / 8; + zip->stream.zstd.context = ZSTD_createCStream(); + size_t zret = ZSTD_initCStream(zip->stream.zstd.context, zstd_compression_level); + if (ZSTD_isError(zret)) { + archive_set_error(&a->archive, ENOMEM, + "Can't init zstd compressor"); + return (ARCHIVE_FATAL); + } + /* Asking for the multi-threaded compressor is a no-op in zstd if + * it's not supported, so no need to explicitly check for it */ + ZSTD_CCtx_setParameter(zip->stream.zstd.context, ZSTD_c_nbWorkers, zip->threads); + zip->stream.zstd.out.dst = zip->buf; + zip->stream.zstd.out.size = zip->len_buf; + zip->stream.zstd.out.pos = 0; + break;} +#endif +#ifdef HAVE_LZMA_H + case COMPRESSION_LZMA: + {/* Set compression level 9 as the no-holds barred one */ + uint32_t lzma_compression_level = zip->compression_level == 9 + ? LZMA_PRESET_EXTREME | zip->compression_level + : (uint32_t)zip->compression_level; + /* Forcibly setting up the encoder to use the LZMA1 variant, as + * it is the one LZMA Alone uses. */ + lzma_filter filters[2] = { + { + .id = LZMA_FILTER_LZMA1, + .options = &zip->stream.lzma.options + }, + { + .id = LZMA_VLI_UNKNOWN + } + }; + memset(&zip->stream.lzma.context, 0, sizeof(lzma_stream)); + lzma_lzma_preset(&zip->stream.lzma.options, lzma_compression_level); + zip->stream.lzma.headers_to_write = 1; + /* We'll be writing the headers ourselves, so using the raw + * encoder */ + if (lzma_raw_encoder(&zip->stream.lzma.context, filters) != LZMA_OK) { + archive_set_error(&a->archive, ENOMEM, + "Can't init lzma compressor"); + return (ARCHIVE_FATAL); + } + zip->stream.lzma.context.next_out = zip->buf; + zip->stream.lzma.context.avail_out = (unsigned int)zip->len_buf; + break;} + case COMPRESSION_XZ: + {/* Set compression level 9 as the no-holds barred one */ + uint32_t lzma_compression_level = zip->compression_level == 9 + ? LZMA_PRESET_EXTREME | zip->compression_level + : (uint32_t)zip->compression_level; + lzma_ret retval; +#ifndef HAVE_LZMA_STREAM_ENCODER_MT + /* Force the number of threads to one, and thus to a mono-threaded + * encoder in case we don't have the multi-threaded one */ + zip->threads = 1; #endif + memset(&zip->stream.lzma.context, 0, sizeof(lzma_stream)); + /* The XZ check will be arbitrarily set to none: ZIP already has + * a CRC-32 check of its own */ + if (zip->threads == 1) { + /* XZ uses LZMA2. */ + lzma_filter filters[2] = { + { + .id = LZMA_FILTER_LZMA2, + .options = &zip->stream.lzma.options + }, + { + .id = LZMA_VLI_UNKNOWN + } + }; + /* Might as well use the lzma_options we already allocated, + * even if we'll never use it after the initialisation */ + lzma_lzma_preset(&zip->stream.lzma.options, lzma_compression_level); + /* 1 thread requested, so non multi-threaded encoder */ + retval = lzma_stream_encoder(&zip->stream.lzma.context, + filters, LZMA_CHECK_NONE); + } + else { + lzma_mt options = { + .flags = 0, + .block_size = 0, + .timeout = 0, + .filters = NULL, + .check = LZMA_CHECK_NONE, + .preset = lzma_compression_level, + .threads = zip->threads + }; + /* More than 1 thread requested, so multi-threaded encoder + * which always outputs XZ */ + retval = lzma_stream_encoder_mt(&zip->stream.lzma.context, + &options); + } + if (retval != LZMA_OK) { + archive_set_error(&a->archive, ENOMEM, + "Can't init xz compressor"); + return (ARCHIVE_FATAL); + } + zip->stream.lzma.context.next_out = zip->buf; + zip->stream.lzma.context.avail_out = (unsigned int)zip->len_buf; + break;} +#endif + default: + break; + } return (ret2); } @@ -1082,15 +1553,15 @@ zip->entry_compressed_written += s; } break; -#if HAVE_ZLIB_H +#ifdef HAVE_ZLIB_H case COMPRESSION_DEFLATE: - zip->stream.next_in = (unsigned char*)(uintptr_t)buff; - zip->stream.avail_in = (uInt)s; + zip->stream.deflate.next_in = (unsigned char*)(uintptr_t)buff; + zip->stream.deflate.avail_in = (uInt)s; do { - ret = deflate(&zip->stream, Z_NO_FLUSH); + ret = deflate(&zip->stream.deflate, Z_NO_FLUSH); if (ret == Z_STREAM_ERROR) return (ARCHIVE_FATAL); - if (zip->stream.avail_out == 0) { + if (zip->stream.deflate.avail_out == 0) { if (zip->tctx_valid) { trad_enc_encrypt_update(&zip->tctx, zip->buf, zip->len_buf, @@ -1116,13 +1587,223 @@ return (ret); zip->entry_compressed_written += zip->len_buf; zip->written_bytes += zip->len_buf; - zip->stream.next_out = zip->buf; - zip->stream.avail_out = (uInt)zip->len_buf; + zip->stream.deflate.next_out = zip->buf; + zip->stream.deflate.avail_out = (uInt)zip->len_buf; } - } while (zip->stream.avail_in != 0); + } while (zip->stream.deflate.avail_in != 0); + break; +#endif +#if defined(HAVE_ZSTD_H) && HAVE_ZSTD_compressStream + case COMPRESSION_ZSTD: + zip->stream.zstd.in.src = buff; + zip->stream.zstd.in.size = s; + zip->stream.zstd.in.pos = 0; + do { + size_t zret = ZSTD_compressStream(zip->stream.zstd.context, + &zip->stream.zstd.out, &zip->stream.zstd.in); + if (ZSTD_isError(zret)) + return (ARCHIVE_FATAL); + if (zip->stream.zstd.out.pos == zip->stream.zstd.out.size) { + if (zip->tctx_valid) { + trad_enc_encrypt_update(&zip->tctx, + zip->buf, zip->len_buf, + zip->buf, zip->len_buf); + } else if (zip->cctx_valid) { + size_t outl = zip->len_buf; + ret = archive_encrypto_aes_ctr_update( + &zip->cctx, + zip->buf, zip->len_buf, + zip->buf, &outl); + if (ret < 0) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_MISC, + "Failed to encrypt file"); + return (ARCHIVE_FAILED); + } + archive_hmac_sha1_update(&zip->hctx, + zip->buf, zip->len_buf); + } + ret = __archive_write_output(a, zip->buf, + zip->len_buf); + if (ret != ARCHIVE_OK) + return (ret); + zip->entry_compressed_written += zip->len_buf; + zip->written_bytes += zip->len_buf; + zip->stream.zstd.out.dst = zip->buf; + zip->stream.zstd.out.size = zip->len_buf; + zip->stream.zstd.out.pos = 0; + } + } while (zip->stream.zstd.in.pos != zip->stream.zstd.in.size); + break; +#endif +#ifdef HAVE_BZLIB_H + case COMPRESSION_BZIP2: + zip->stream.bzip2.next_in = (char*)(uintptr_t)buff; + zip->stream.bzip2.avail_in = (unsigned int)s; + do { + ret = BZ2_bzCompress(&zip->stream.bzip2, BZ_RUN); + if (ret != BZ_RUN_OK) + return (ARCHIVE_FATAL); + if (zip->stream.bzip2.avail_out == 0) { + if (zip->tctx_valid) { + trad_enc_encrypt_update(&zip->tctx, + zip->buf, zip->len_buf, + zip->buf, zip->len_buf); + } else if (zip->cctx_valid) { + size_t outl = zip->len_buf; + ret = archive_encrypto_aes_ctr_update( + &zip->cctx, + zip->buf, zip->len_buf, + zip->buf, &outl); + if (ret < 0) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_MISC, + "Failed to encrypt file"); + return (ARCHIVE_FAILED); + } + archive_hmac_sha1_update(&zip->hctx, + zip->buf, zip->len_buf); + } + ret = __archive_write_output(a, zip->buf, + zip->len_buf); + if (ret != ARCHIVE_OK) + return (ret); + zip->entry_compressed_written += zip->len_buf; + zip->written_bytes += zip->len_buf; + zip->stream.bzip2.next_out = (char*)zip->buf; + zip->stream.bzip2.avail_out = (unsigned int)zip->len_buf; + } + } while (zip->stream.bzip2.avail_in != 0); + break; +#endif +#ifdef HAVE_LZMA_H + case COMPRESSION_LZMA: + if (zip->stream.lzma.headers_to_write) { + /* LZMA Alone and ZIP's LZMA format (i.e. id 14) are almost + * the same. Here's an example of a structure of LZMA Alone: + * + * $ cat /bin/ls | lzma | xxd | head -n 1 + * 00000000: 5d00 0080 00ff ffff ffff ffff ff00 2814 + * + * 5 bytes 8 bytes n bytes + * + * + * lzma_params is a 5-byte blob that has to be decoded to + * extract parameters of this LZMA stream. The + * uncompressed_size field is an uint64_t value that contains + * information about the size of the uncompressed file, or + * UINT64_MAX if this value is unknown. The part is + * the actual LZMA-compressed data stream. + * + * Now here's the structure of ZIP's LZMA format: + * + * $ cat stream_inside_zipx | xxd | head -n 1 + * 00000000: 0914 0500 5d00 8000 0000 2814 .... .... + * + * 2byte 2byte 5 bytes n bytes + * + * + * This means that ZIP's LZMA format contains an additional + * magic1 and magic2 headers, the lzma_params field contains + * the same parameter set as in LZMA Alone, and the + * field is the same as in LZMA Alone as well. However, note + * that ZIP's format is missing the uncompressed_size field. + * + * So we need to write a raw LZMA stream, set up for LZMA1 + * (i.e. the algorithm variant LZMA Alone uses), which was + * done above in the initialisation but first we need to + * write ZIP's LZMA header, as if it were Stored data. Then + * we can use the raw stream as if it were any other. magic1 + * being version numbers and magic2 being lzma_params's size, + * they get written in without further ado but lzma_params + * requires to use other functions than the usual lzma_stream + * manipulating ones, hence the additional book-keeping + * required alongside the lzma_stream. + */ + uint8_t buf[9] = { LZMA_VERSION_MAJOR, LZMA_VERSION_MINOR, 5, 0 }; + lzma_lzma_props_encode(&zip->stream.lzma.options, buf + 4); + const size_t sh = 9; + if (zip->tctx_valid || zip->cctx_valid) { + uint8_t* header = buf; + const uint8_t * const rh = header + sh; + + while (header < rh) { + size_t l; + + if (zip->tctx_valid) { + l = trad_enc_encrypt_update(&zip->tctx, + header, rh - header, + zip->buf, zip->len_buf); + } else { + l = zip->len_buf; + ret = archive_encrypto_aes_ctr_update( + &zip->cctx, + header, rh - header, zip->buf, &l); + if (ret < 0) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_MISC, + "Failed to encrypt file"); + return (ARCHIVE_FAILED); + } + archive_hmac_sha1_update(&zip->hctx, + zip->buf, l); + } + ret = __archive_write_output(a, zip->buf, l); + if (ret != ARCHIVE_OK) + return (ret); + zip->entry_compressed_written += l; + zip->written_bytes += l; + header += l; + } + } else { + ret = __archive_write_output(a, buf, sh); + if (ret != ARCHIVE_OK) + return (ret); + zip->written_bytes += sh; + zip->entry_compressed_written += sh; + } + zip->stream.lzma.headers_to_write = 0; + } + /* FALLTHROUGH */ + case COMPRESSION_XZ: + zip->stream.lzma.context.next_in = (unsigned char*)(uintptr_t)buff; + zip->stream.lzma.context.avail_in = (unsigned int)s; + do { + ret = lzma_code(&zip->stream.lzma.context, LZMA_RUN); + if (ret == LZMA_MEM_ERROR) + return (ARCHIVE_FATAL); + if (zip->stream.lzma.context.avail_out == 0) { + if (zip->tctx_valid) { + trad_enc_encrypt_update(&zip->tctx, + zip->buf, zip->len_buf, + zip->buf, zip->len_buf); + } else if (zip->cctx_valid) { + size_t outl = zip->len_buf; + ret = archive_encrypto_aes_ctr_update( + &zip->cctx, + zip->buf, zip->len_buf, + zip->buf, &outl); + if (ret < 0) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_MISC, + "Failed to encrypt file"); + return (ARCHIVE_FAILED); + } + archive_hmac_sha1_update(&zip->hctx, + zip->buf, zip->len_buf); + } + ret = __archive_write_output(a, zip->buf, + zip->len_buf); + if (ret != ARCHIVE_OK) + return (ret); + zip->entry_compressed_written += zip->len_buf; + zip->written_bytes += zip->len_buf; + zip->stream.lzma.context.next_out = zip->buf; + zip->stream.lzma.context.avail_out = (unsigned int)zip->len_buf; + } + } while (zip->stream.lzma.context.avail_in != 0); break; #endif - case COMPRESSION_UNSPECIFIED: default: archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, @@ -1135,7 +1816,6 @@ zip->entry_crc32 = zip->crc32func(zip->entry_crc32, buff, (unsigned)s); return (s); - } static int @@ -1143,16 +1823,20 @@ { struct zip *zip = a->format_data; int ret; +#if defined(HAVE_BZLIB_H) || (defined(HAVE_ZSTD_H) && HAVE_ZSTD_compressStream) || HAVE_LZMA_H + char finishing; +#endif -#if HAVE_ZLIB_H - if (zip->entry_compression == COMPRESSION_DEFLATE) { + switch (zip->entry_compression) { +#ifdef HAVE_ZLIB_H + case COMPRESSION_DEFLATE: for (;;) { size_t remainder; - ret = deflate(&zip->stream, Z_FINISH); + ret = deflate(&zip->stream.deflate, Z_FINISH); if (ret == Z_STREAM_ERROR) return (ARCHIVE_FATAL); - remainder = zip->len_buf - zip->stream.avail_out; + remainder = zip->len_buf - zip->stream.deflate.avail_out; if (zip->tctx_valid) { trad_enc_encrypt_update(&zip->tctx, zip->buf, remainder, zip->buf, remainder); @@ -1175,14 +1859,145 @@ return (ret); zip->entry_compressed_written += remainder; zip->written_bytes += remainder; - zip->stream.next_out = zip->buf; - if (zip->stream.avail_out != 0) + zip->stream.deflate.next_out = zip->buf; + if (zip->stream.deflate.avail_out != 0) break; - zip->stream.avail_out = (uInt)zip->len_buf; + zip->stream.deflate.avail_out = (uInt)zip->len_buf; } - deflateEnd(&zip->stream); - } + deflateEnd(&zip->stream.deflate); + break; #endif +#ifdef HAVE_BZLIB_H + case COMPRESSION_BZIP2: + finishing = 1; + do { + size_t remainder; + + ret = BZ2_bzCompress(&zip->stream.bzip2, BZ_FINISH); + if (ret == BZ_STREAM_END) + finishing = 0; + else if (ret != BZ_RUN_OK && ret != BZ_FINISH_OK) + return (ARCHIVE_FATAL); + remainder = zip->len_buf - zip->stream.bzip2.avail_out; + if (zip->tctx_valid) { + trad_enc_encrypt_update(&zip->tctx, + zip->buf, remainder, zip->buf, remainder); + } else if (zip->cctx_valid) { + size_t outl = remainder; + ret = archive_encrypto_aes_ctr_update( + &zip->cctx, zip->buf, remainder, + zip->buf, &outl); + if (ret < 0) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_MISC, + "Failed to encrypt file"); + return (ARCHIVE_FAILED); + } + archive_hmac_sha1_update(&zip->hctx, + zip->buf, remainder); + } + ret = __archive_write_output(a, zip->buf, remainder); + if (ret != ARCHIVE_OK) + return (ret); + zip->entry_compressed_written += remainder; + zip->written_bytes += remainder; + zip->stream.bzip2.next_out = (char*)zip->buf; + if (zip->stream.bzip2.avail_out != 0) + finishing = 0; + zip->stream.bzip2.avail_out = (unsigned int)zip->len_buf; + } while (finishing); + BZ2_bzCompressEnd(&zip->stream.bzip2); + break; +#endif +#if defined(HAVE_ZSTD_H) && HAVE_ZSTD_compressStream + case COMPRESSION_ZSTD: + finishing = 1; + do { + size_t remainder; + + size_t zret = ZSTD_endStream(zip->stream.zstd.context, &zip->stream.zstd.out); + if (zret == 0) + finishing = 0; + else if (ZSTD_isError(zret)) + return (ARCHIVE_FATAL); + remainder = zip->len_buf - (zip->stream.zstd.out.size - zip->stream.zstd.out.pos); + if (zip->tctx_valid) { + trad_enc_encrypt_update(&zip->tctx, + zip->buf, remainder, zip->buf, remainder); + } else if (zip->cctx_valid) { + size_t outl = remainder; + ret = archive_encrypto_aes_ctr_update( + &zip->cctx, zip->buf, remainder, + zip->buf, &outl); + if (ret < 0) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_MISC, + "Failed to encrypt file"); + return (ARCHIVE_FAILED); + } + archive_hmac_sha1_update(&zip->hctx, + zip->buf, remainder); + } + ret = __archive_write_output(a, zip->buf, remainder); + if (ret != ARCHIVE_OK) + return (ret); + zip->entry_compressed_written += remainder; + zip->written_bytes += remainder; + zip->stream.zstd.out.dst = zip->buf; + if (zip->stream.zstd.out.pos != zip->stream.zstd.out.size) + finishing = 0; + zip->stream.zstd.out.size = zip->len_buf; + } while (finishing); + ZSTD_freeCStream(zip->stream.zstd.context); + break; +#endif +#ifdef HAVE_LZMA_H + /* XZ and LZMA share clean-up code */ + case COMPRESSION_LZMA: + case COMPRESSION_XZ: + finishing = 1; + do { + size_t remainder; + + ret = lzma_code(&zip->stream.lzma.context, LZMA_FINISH); + if (ret == LZMA_STREAM_END) + finishing = 0; + else if (ret == LZMA_MEM_ERROR) + return (ARCHIVE_FATAL); + remainder = zip->len_buf - zip->stream.lzma.context.avail_out; + if (zip->tctx_valid) { + trad_enc_encrypt_update(&zip->tctx, + zip->buf, remainder, zip->buf, remainder); + } else if (zip->cctx_valid) { + size_t outl = remainder; + ret = archive_encrypto_aes_ctr_update( + &zip->cctx, zip->buf, remainder, + zip->buf, &outl); + if (ret < 0) { + archive_set_error(&a->archive, + ARCHIVE_ERRNO_MISC, + "Failed to encrypt file"); + return (ARCHIVE_FAILED); + } + archive_hmac_sha1_update(&zip->hctx, + zip->buf, remainder); + } + ret = __archive_write_output(a, zip->buf, remainder); + if (ret != ARCHIVE_OK) + return (ret); + zip->entry_compressed_written += remainder; + zip->written_bytes += remainder; + zip->stream.lzma.context.next_out = zip->buf; + if (zip->stream.lzma.context.avail_out != 0) + finishing = 0; + zip->stream.lzma.context.avail_out = (unsigned int)zip->len_buf; + } while (finishing); + lzma_end(&zip->stream.lzma.context); + break; +#endif + default: + break; + } if (zip->hctx_valid) { uint8_t hmac[20]; size_t hmac_len = 20; @@ -1366,7 +2181,6 @@ if (ret != ARCHIVE_OK) return (ARCHIVE_FATAL); zip->written_bytes += 20; - } /* Format and write end of central directory. */ @@ -1413,44 +2227,6 @@ return (ARCHIVE_OK); } -/* Convert into MSDOS-style date/time. */ -static unsigned int -dos_time(const time_t unix_time) -{ - struct tm *t; - unsigned int dt; -#if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S) - struct tm tmbuf; -#endif - -#if defined(HAVE_LOCALTIME_S) - t = localtime_s(&tmbuf, &unix_time) ? NULL : &tmbuf; -#elif defined(HAVE_LOCALTIME_R) - t = localtime_r(&unix_time, &tmbuf); -#else - t = localtime(&unix_time); -#endif - - /* MSDOS-style date/time is only between 1980-01-01 and 2107-12-31 */ - if (t->tm_year < 1980 - 1900) - /* Set minimum date/time '1980-01-01 00:00:00'. */ - dt = 0x00210000U; - else if (t->tm_year > 2107 - 1900) - /* Set maximum date/time '2107-12-31 23:59:58'. */ - dt = 0xff9fbf7dU; - else { - dt = 0; - dt += ((t->tm_year - 80) & 0x7f) << 9; - dt += ((t->tm_mon + 1) & 0x0f) << 5; - dt += (t->tm_mday & 0x1f); - dt <<= 16; - dt += (t->tm_hour & 0x1f) << 11; - dt += (t->tm_min & 0x3f) << 5; - dt += (t->tm_sec & 0x3e) >> 1; /* Only counting every 2 seconds. */ - } - return dt; -} - static size_t path_length(struct archive_entry *entry) { @@ -1518,7 +2294,6 @@ p[pathlen] = '/'; } - static struct archive_string_conv * get_sconv(struct archive_write *a, struct zip *zip) { @@ -1576,7 +2351,6 @@ static int trad_enc_init(struct trad_enc_ctx *ctx, const char *pw, size_t pw_len) { - ctx->keys[0] = 305419896L; ctx->keys[1] = 591751049L; ctx->keys[2] = 878082192L; --- contrib/libarchive/libarchive/archive_write_set_options.3.orig +++ contrib/libarchive/libarchive/archive_write_set_options.3 @@ -263,7 +263,7 @@ The value is interpreted as a decimal integer specifying the number of threads for multi-threaded zstd compression. If set to 0, zstd will attempt to detect and use the number -of physical CPU cores. +of active physical CPU cores. .El .It Format 7zip .Bl -tag -compact -width indent @@ -274,9 +274,10 @@ .Dq deflate , .Dq bzip2 , .Dq lzma1 , -.Dq lzma2 +.Dq lzma2 , +.Dq ppmd , or -.Dq ppmd +.Dq zstd to indicate how the following entries should be compressed. The values .Dq store @@ -289,9 +290,16 @@ The value is interpreted as a decimal integer specifying the compression level. Values between 0 and 9 are supported, with the exception of bzip2 -which only supports values between 1 and 9. +which only supports values between 1 and 9, and zstd which may +support negative values depending on the library version and +commonly used values 1 through 22. The interpretation of the compression level depends on the chosen compression method. +.It Cm threads +The value is interpreted as a decimal integer specifying the +number of threads for multi-threaded compression (for compressors +like zstd that support it). If set to 0, an attempt will be made +to discover the number of CPU cores. .El .It Format bin .Bl -tag -compact -width indent @@ -632,9 +640,13 @@ .Bl -tag -compact -width indent .It Cm compression The value is either -.Dq store +.Dq store , +.Dq deflate , +.Dq bzip2 , +.Dq lzma , +.Dq xz , or -.Dq deflate +.Dq zstd to indicate how the following entries should be compressed. Note that this setting is ignored for directories, symbolic links, and other special entries. @@ -645,8 +657,23 @@ A compression level of 0 switches the compression method to .Dq store , other values will enable -.Dq deflate -compression with the given level. +.Dq deflate , +.Dq bzip2 , +.Dq lzma , +or +.Dq zstd +compression (in order of priority, depending on what libraries +are linked) with the given level. +.It Cm threads +The value is interpreted as a decimal integer specifying the +number of threads to use for compression. +It is supported only for +.Dq xz +or +.Dq zstd +compression and ignored for any other. +A threads value of 0 is a special one requesting to detect and use as +many threads as the number of active physical CPU cores. .It Cm encryption Enable encryption using traditional zip encryption. .It Cm encryption Ns = Ns Ar type --- contrib/libarchive/libarchive/libarchive-formats.5.orig +++ contrib/libarchive/libarchive/libarchive-formats.5 @@ -327,10 +327,26 @@ Libarchive can read and write zip format archives that have uncompressed entries and entries compressed with the .Dq deflate +, +.Dq LZMA +, +.Dq XZ +, +.Dq BZIP2 +and +.Dq ZSTD +algorithms. +Libarchive can also read, but not write, zip format archives that +have entries compressed with the +.Dq PPMd algorithm. Other zip compression algorithms are not supported. -It can extract jar archives, archives that use Zip64 extensions and -self-extracting zip archives. +The extensions supported by libarchive are Zip64, Libarchive's +extensions to better support streaming, PKZIP's traditional +ZIP encryption, Info-ZIP's Unix extra fields, extra time, and +Unicode path, as well as WinZIP's AES encryption. +It can extract jar archives, __MACOSX resource forks extension +for OS X, and self-extracting zip archives. Libarchive can use either of two different strategies for reading Zip archives: a streaming strategy which is fast and can handle extremely --- contrib/libarchive/libarchive/test/read_open_memory.c.orig +++ contrib/libarchive/libarchive/test/read_open_memory.c @@ -167,7 +167,7 @@ (void)a; /* UNUSED */ /* We can't skip by more than is available. */ - if ((off_t)skip > (off_t)(mine->end - mine->p)) + if (skip > mine->end - mine->p) skip = mine->end - mine->p; /* Always do small skips by prime amounts. */ if (skip > 71) --- contrib/libarchive/libarchive/test/test_7zip_filename_encoding.c.orig +++ contrib/libarchive/libarchive/test/test_7zip_filename_encoding.c @@ -1,100 +1,100 @@ -/* - * Copyright (c) 2003-2018 - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer - * in this position and unchanged. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR(S) 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. - */ -#include "test.h" - -DEFINE_TEST(test_7zip_filename_encoding_UTF16_win) -{ -#if !defined(_WIN32) || defined(__CYGWIN__) - skipping("This test is meant to verify unicode string handling" - " on Windows with UTF-16 names"); - return; -#else - struct archive *a; - struct archive_entry *entry; - char buff[4096]; - size_t used; - - /* - * Don't call setlocale because we're verifying that the '_w' functions - * work as expected - */ - - a = archive_write_new(); - assertEqualInt(ARCHIVE_OK, archive_write_set_format_7zip(a)); - assertEqualInt(ARCHIVE_OK, - archive_write_open_memory(a, buff, sizeof(buff), &used)); - - /* Part 1: file */ - entry = archive_entry_new2(a); - archive_entry_copy_pathname_w(entry, L"\u8868.txt"); - archive_entry_set_filetype(entry, AE_IFREG); - archive_entry_set_size(entry, 0); - assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry)); - - /* Part 2: directory */ - archive_entry_clear(entry); - archive_entry_copy_pathname_w(entry, L"\u8868"); - archive_entry_set_filetype(entry, AE_IFDIR); - archive_entry_set_size(entry, 0); - assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry)); - - /* Part 3: symlink */ - archive_entry_clear(entry); - archive_entry_set_pathname(entry, "link.txt"); - archive_entry_copy_symlink_w(entry, L"\u8868.txt"); - archive_entry_set_filetype(entry, AE_IFLNK); - archive_entry_set_symlink_type(entry, AE_SYMLINK_TYPE_FILE); - archive_entry_set_size(entry, 0); - assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry)); - - /* NOTE: 7zip does not support hardlinks */ - - archive_entry_free(entry); - assertEqualInt(ARCHIVE_OK, archive_write_free(a)); - - /* Ensure that the archive contents can be read properly */ - /* NOTE: 7zip file contents are not in the order we wrote them! */ - a = archive_read_new(); - archive_read_support_format_all(a); - archive_read_support_filter_all(a); - assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7)); - - /* Read part 3: symlink */ - assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); - assertEqualWString(L"\u8868.txt", archive_entry_symlink_w(entry)); - - /* Read part 1: file */ - assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); - assertEqualWString(L"\u8868.txt", archive_entry_pathname_w(entry)); - - /* Read part 2: directory */ - assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); - /* NOTE: Trailing slash added automatically for us */ - assertEqualWString(L"\u8868/", archive_entry_pathname_w(entry)); - - archive_read_free(a); -#endif -} \ No newline at end of file +/* + * Copyright (c) 2003-2018 + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) 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. + */ +#include "test.h" + +DEFINE_TEST(test_7zip_filename_encoding_UTF16_win) +{ +#if !defined(_WIN32) || defined(__CYGWIN__) + skipping("This test is meant to verify unicode string handling" + " on Windows with UTF-16 names"); + return; +#else + struct archive *a; + struct archive_entry *entry; + char buff[4096]; + size_t used; + + /* + * Don't call setlocale because we're verifying that the '_w' functions + * work as expected + */ + + a = archive_write_new(); + assertEqualInt(ARCHIVE_OK, archive_write_set_format_7zip(a)); + assertEqualInt(ARCHIVE_OK, + archive_write_open_memory(a, buff, sizeof(buff), &used)); + + /* Part 1: file */ + entry = archive_entry_new2(a); + archive_entry_copy_pathname_w(entry, L"\u8868.txt"); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_size(entry, 0); + assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry)); + + /* Part 2: directory */ + archive_entry_clear(entry); + archive_entry_copy_pathname_w(entry, L"\u8868"); + archive_entry_set_filetype(entry, AE_IFDIR); + archive_entry_set_size(entry, 0); + assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry)); + + /* Part 3: symlink */ + archive_entry_clear(entry); + archive_entry_set_pathname(entry, "link.txt"); + archive_entry_copy_symlink_w(entry, L"\u8868.txt"); + archive_entry_set_filetype(entry, AE_IFLNK); + archive_entry_set_symlink_type(entry, AE_SYMLINK_TYPE_FILE); + archive_entry_set_size(entry, 0); + assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry)); + + /* NOTE: 7zip does not support hardlinks */ + + archive_entry_free(entry); + assertEqualInt(ARCHIVE_OK, archive_write_free(a)); + + /* Ensure that the archive contents can be read properly */ + /* NOTE: 7zip file contents are not in the order we wrote them! */ + a = archive_read_new(); + archive_read_support_format_all(a); + archive_read_support_filter_all(a); + assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, buff, used, 7)); + + /* Read part 3: symlink */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + assertEqualWString(L"\u8868.txt", archive_entry_symlink_w(entry)); + + /* Read part 1: file */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + assertEqualWString(L"\u8868.txt", archive_entry_pathname_w(entry)); + + /* Read part 2: directory */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + /* NOTE: Trailing slash added automatically for us */ + assertEqualWString(L"\u8868/", archive_entry_pathname_w(entry)); + + archive_read_free(a); +#endif +} --- contrib/libarchive/libarchive/test/test_acl_pax.c.orig +++ contrib/libarchive/libarchive/test/test_acl_pax.c @@ -287,7 +287,7 @@ failure("Basic ACLs shouldn't be stored as extended ACLs"); assert(0 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); failure("Basic ACLs should set mode to 0142, not %04o", - archive_entry_mode(ae)&0777); + (unsigned int)archive_entry_mode(ae)&0777); assert((archive_entry_mode(ae) & 0777) == 0142); /* Second item has a few ACLs */ @@ -297,7 +297,7 @@ assertEntryCompareAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]), ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0142); failure("Basic ACLs should set mode to 0142, not %04o", - archive_entry_mode(ae)&0777); + (unsigned int)archive_entry_mode(ae)&0777); assert((archive_entry_mode(ae) & 0777) == 0142); /* Third item has pretty extensive ACLs */ @@ -307,7 +307,7 @@ assertEntryCompareAcls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]), ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0543); failure("Basic ACLs should set mode to 0543, not %04o", - archive_entry_mode(ae)&0777); + (unsigned int)archive_entry_mode(ae)&0777); assert((archive_entry_mode(ae) & 0777) == 0543); /* Fourth item has no ACLs */ @@ -315,7 +315,7 @@ failure("Basic ACLs shouldn't be stored as extended ACLs"); assert(0 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); failure("Basic ACLs should set mode to 0142, not %04o", - archive_entry_mode(ae)&0777); + (unsigned int)archive_entry_mode(ae)&0777); assert((archive_entry_mode(ae) & 0777) == 0142); /* Close the archive. */ --- contrib/libarchive/libarchive/test/test_acl_platform_nfs4.c.orig +++ contrib/libarchive/libarchive/test/test_acl_platform_nfs4.c @@ -424,7 +424,7 @@ #if ARCHIVE_ACL_SUNOS_NFS4 || ARCHIVE_ACL_LIBRICHACL if (flags & perms[i].machine) #else - if (acl_get_flag_np(opaque_fs, perms[i].machine)) + if (acl_get_flag_np(opaque_fs, (acl_flag_t)perms[i].machine)) #endif flagset |= perms[i].portable; return flagset; @@ -772,7 +772,8 @@ failure(" ACL entry %d missing from %s: " "type=%#010x,permset=%#010x,tag=%d,qual=%d,name=``%s''\n", marker[i], filename, - myacls[marker[i]].type, myacls[marker[i]].permset, + (unsigned int)myacls[marker[i]].type, + (unsigned int)myacls[marker[i]].permset, myacls[marker[i]].tag, myacls[marker[i]].qual, myacls[marker[i]].name); assert(0); /* Record this as a failure. */ @@ -824,7 +825,7 @@ failure("ACL entry on file that shouldn't be there: " "type=%#010x,permset=%#010x,tag=%d,qual=%d", - type,permset,tag,qual); + (unsigned int)type, (unsigned int)permset, tag, qual); assert(matched == 1); } @@ -833,7 +834,8 @@ failure(" ACL entry %d missing from %s: " "type=%#010x,permset=%#010x,tag=%d,qual=%d,name=``%s''\n", marker[i], filename, - myacls[marker[i]].type, myacls[marker[i]].permset, + (unsigned int)myacls[marker[i]].type, + (unsigned int)myacls[marker[i]].permset, myacls[marker[i]].tag, myacls[marker[i]].qual, myacls[marker[i]].name); assert(0); /* Record this as a failure. */ --- contrib/libarchive/libarchive/test/test_acl_platform_posix1e.c.orig +++ contrib/libarchive/libarchive/test/test_acl_platform_posix1e.c @@ -274,7 +274,8 @@ for (i = 0; i < n; ++i) { failure(" ACL entry missing from file: " "type=%#010x,permset=%#010x,tag=%d,qual=%d,name=``%s''\n", - myacls[marker[i]].type, myacls[marker[i]].permset, + (unsigned int)myacls[marker[i]].type, + (unsigned int)myacls[marker[i]].permset, myacls[marker[i]].tag, myacls[marker[i]].qual, myacls[marker[i]].name); assert(0); /* Record this as a failure. */ --- contrib/libarchive/libarchive/test/test_acl_posix1e.c.orig +++ contrib/libarchive/libarchive/test/test_acl_posix1e.c @@ -119,7 +119,7 @@ failure("Basic ACLs shouldn't be stored as extended ACLs"); assert(0 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); failure("Basic ACLs should set mode to 0142, not %04o", - archive_entry_mode(ae)&0777); + (unsigned int)archive_entry_mode(ae)&0777); assert((archive_entry_mode(ae) & 0777) == 0142); /* With any extended ACL entry, we should read back a full set. */ @@ -136,7 +136,7 @@ assertEntryCompareAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]), ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0142); failure("Basic ACLs should set mode to 0142, not %04o", - archive_entry_mode(ae)&0777); + (unsigned int)archive_entry_mode(ae)&0777); assert((archive_entry_mode(ae) & 0777) == 0142); @@ -146,7 +146,7 @@ assertEntryCompareAcls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]), ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0543); failure("Basic ACLs should set mode to 0543, not %04o", - archive_entry_mode(ae)&0777); + (unsigned int)archive_entry_mode(ae)&0777); assert((archive_entry_mode(ae) & 0777) == 0543); /* @@ -157,7 +157,7 @@ failure("Basic ACLs shouldn't be stored as extended ACLs"); assert(0 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS)); failure("Basic ACLs should set mode to 0142, not %04o", - archive_entry_mode(ae)&0777); + (unsigned int)archive_entry_mode(ae)&0777); assert((archive_entry_mode(ae) & 0777) == 0142); /* --- contrib/libarchive/libarchive/test/test_acl_text.c.orig +++ contrib/libarchive/libarchive/test/test_acl_text.c @@ -132,7 +132,7 @@ ARCHIVE_ENTRY_ACL_EVERYONE, 0, "" }, }; -const char* acltext[] = { +static const char* acltext[] = { "user::rwx\n" "group::r-x\n" "other::r-x\n" --- contrib/libarchive/libarchive/test/test_archive_getdate.c.orig +++ contrib/libarchive/libarchive/test/test_archive_getdate.c @@ -1,88 +0,0 @@ -/*- - * Copyright (c) 2003-2007 Tim Kientzle - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR(S) 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. - */ -#include "test.h" - -#include - -#define __LIBARCHIVE_BUILD 1 -#include "archive_getdate.h" - -/* - * Verify that the getdate() function works. - */ - -#define get_date __archive_get_date - -DEFINE_TEST(test_archive_getdate) -{ - time_t now = time(NULL); - - assertEqualInt(get_date(now, "Jan 1, 1970 UTC"), 0); - assertEqualInt(get_date(now, "7:12:18-0530 4 May 1983"), 420900138); - assertEqualInt(get_date(now, "2004/01/29 513 mest"), 1075345980); - assertEqualInt(get_date(now, "99/02/17 7pm utc"), 919278000); - assertEqualInt(get_date(now, "02/17/99 7:11am est"), 919253460); - assertEqualInt(get_date(now, "now - 2 hours"), - get_date(now, "2 hours ago")); - assertEqualInt(get_date(now, "2 hours ago"), - get_date(now, "+2 hours ago")); - assertEqualInt(get_date(now, "now - 2 hours"), - get_date(now, "-2 hours")); - /* It's important that we handle ctime() format. */ - assertEqualInt(get_date(now, "Sun Feb 22 17:38:26 PST 2009"), - 1235353106); - /* Basic relative offsets. */ - /* If we use the actual current time as the reference, then - * these tests break around DST changes, so it's actually - * important to use a specific reference time here. */ - assertEqualInt(get_date(0, "tomorrow"), 24 * 60 * 60); - assertEqualInt(get_date(0, "yesterday"), - 24 * 60 * 60); - assertEqualInt(get_date(0, "now + 1 hour"), 60 * 60); - assertEqualInt(get_date(0, "now + 1 hour + 1 minute"), 60 * 60 + 60); - /* Repeat the above for a different start time. */ - now = 1231113600; /* Jan 5, 2009 00:00 UTC */ - assertEqualInt(get_date(0, "Jan 5, 2009 00:00 UTC"), now); - assertEqualInt(get_date(now, "tomorrow"), now + 24 * 60 * 60); - assertEqualInt(get_date(now, "yesterday"), now - 24 * 60 * 60); - assertEqualInt(get_date(now, "now + 1 hour"), now + 60 * 60); - assertEqualInt(get_date(now, "now + 1 hour + 1 minute"), - now + 60 * 60 + 60); - assertEqualInt(get_date(now, "tomorrow 5:16am UTC"), - now + 24 * 60 * 60 + 5 * 60 * 60 + 16 * 60); - assertEqualInt(get_date(now, "UTC 5:16am tomorrow"), - now + 24 * 60 * 60 + 5 * 60 * 60 + 16 * 60); - - /* Jan 5, 2009 was a Monday. */ - assertEqualInt(get_date(now, "monday UTC"), now); - assertEqualInt(get_date(now, "sunday UTC"), now + 6 * 24 * 60 * 60); - assertEqualInt(get_date(now, "tuesday UTC"), now + 24 * 60 * 60); - /* "next tuesday" is one week after "tuesday" */ - assertEqualInt(get_date(now, "UTC next tuesday"), - now + 8 * 24 * 60 * 60); - /* "last tuesday" is one week before "tuesday" */ - assertEqualInt(get_date(now, "last tuesday UTC"), - now - 6 * 24 * 60 * 60); - /* TODO: Lots more tests here. */ -} --- contrib/libarchive/libarchive/test/test_archive_match_time.c.orig +++ contrib/libarchive/libarchive/test/test_archive_match_time.c @@ -25,8 +25,7 @@ #include "test.h" -#define __LIBARCHIVE_BUILD 1 -#include "archive_getdate.h" +#define parse_date archive_parse_date static void test_newer_time(void) @@ -102,27 +101,27 @@ /* Test1: Allow newer time. */ archive_entry_copy_pathname(ae, "file1"); - t = __archive_get_date(now, "1980/2/1 0:0:0 UTC"); + t = parse_date(now, "1980/2/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should be excluded"); assertEqualInt(1, archive_match_time_excluded(m, ae)); assertEqualInt(1, archive_match_excluded(m, ae)); - t = __archive_get_date(now, "1980/1/1 0:0:0 UTC"); + t = parse_date(now, "1980/1/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should be excluded"); assertEqualInt(1, archive_match_time_excluded(m, ae)); assertEqualInt(1, archive_match_excluded(m, ae)); - t = __archive_get_date(now, "1980/2/1 0:0:1 UTC"); + t = parse_date(now, "1980/2/1 0:0:1 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should not be excluded"); assertEqualInt(0, archive_match_time_excluded(m, ae)); assertEqualInt(0, archive_match_excluded(m, ae)); - t = __archive_get_date(now, "1980/2/1 0:0:0 UTC"); + t = parse_date(now, "1980/2/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 1); archive_entry_set_ctime(ae, t, 0); failure("Its mtime should be excluded"); @@ -143,20 +142,20 @@ "1980/2/1 0:0:0 UTC")); archive_entry_copy_pathname(ae, "file1"); - t = __archive_get_date(now, "1980/2/1 0:0:0 UTC"); + t = parse_date(now, "1980/2/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should not be excluded"); assertEqualInt(0, archive_match_time_excluded(m, ae)); assertEqualInt(0, archive_match_excluded(m, ae)); - t = __archive_get_date(now, "1980/1/1 0:0:0 UTC"); + t = parse_date(now, "1980/1/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should be excluded"); assertEqualInt(1, archive_match_time_excluded(m, ae)); assertEqualInt(1, archive_match_excluded(m, ae)); - t = __archive_get_date(now, "1980/2/1 0:0:1 UTC"); + t = parse_date(now, "1980/2/1 0:0:1 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should not be excluded"); @@ -190,27 +189,27 @@ /* Test1: Allow newer time. */ archive_entry_copy_pathname(ae, "file1"); - t = __archive_get_date(now, "1980/2/1 0:0:0 UTC"); + t = parse_date(now, "1980/2/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should be excluded"); assertEqualInt(1, archive_match_time_excluded(m, ae)); assertEqualInt(1, archive_match_excluded(m, ae)); - t = __archive_get_date(now, "1980/1/1 0:0:0 UTC"); + t = parse_date(now, "1980/1/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should be excluded"); assertEqualInt(1, archive_match_time_excluded(m, ae)); assertEqualInt(1, archive_match_excluded(m, ae)); - t = __archive_get_date(now, "1980/2/1 0:0:1 UTC"); + t = parse_date(now, "1980/2/1 0:0:1 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should not be excluded"); assertEqualInt(0, archive_match_time_excluded(m, ae)); assertEqualInt(0, archive_match_excluded(m, ae)); - t = __archive_get_date(now, "1980/2/1 0:0:0 UTC"); + t = parse_date(now, "1980/2/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 1); archive_entry_set_ctime(ae, t, 0); failure("Its mtime should be excluded"); @@ -231,20 +230,20 @@ L"1980/2/1 0:0:0 UTC")); archive_entry_copy_pathname(ae, "file1"); - t = __archive_get_date(now, "1980/2/1 0:0:0 UTC"); + t = parse_date(now, "1980/2/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should not be excluded"); assertEqualInt(0, archive_match_time_excluded(m, ae)); assertEqualInt(0, archive_match_excluded(m, ae)); - t = __archive_get_date(now, "1980/1/1 0:0:0 UTC"); + t = parse_date(now, "1980/1/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should be excluded"); assertEqualInt(1, archive_match_time_excluded(m, ae)); assertEqualInt(1, archive_match_excluded(m, ae)); - t = __archive_get_date(now, "1980/2/1 0:0:1 UTC"); + t = parse_date(now, "1980/2/1 0:0:1 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should not be excluded"); @@ -569,37 +568,37 @@ ARCHIVE_MATCH_OLDER, "1980/2/1 0:0:0 UTC")); archive_entry_copy_pathname(ae, "file1"); - t = __archive_get_date(now, "1980/2/1 0:0:0 UTC"); + t = parse_date(now, "1980/2/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should be excluded"); assertEqualInt(1, archive_match_time_excluded(m, ae)); assertEqualInt(1, archive_match_excluded(m, ae)); - t = __archive_get_date(now, "1980/1/1 0:0:0 UTC"); + t = parse_date(now, "1980/1/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should not be excluded"); assertEqualInt(0, archive_match_time_excluded(m, ae)); assertEqualInt(0, archive_match_excluded(m, ae)); - t = __archive_get_date(now, "1980/3/1 0:0:0 UTC"); + t = parse_date(now, "1980/3/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should be excluded"); assertEqualInt(1, archive_match_time_excluded(m, ae)); assertEqualInt(1, archive_match_excluded(m, ae)); - t = __archive_get_date(now, "1980/3/1 0:0:0 UTC"); + t = parse_date(now, "1980/3/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); - t = __archive_get_date(now, "1980/1/1 0:0:0 UTC"); + t = parse_date(now, "1980/1/1 0:0:0 UTC"); archive_entry_set_ctime(ae, t, 0); failure("Its mtime should be excluded"); assertEqualInt(1, archive_match_time_excluded(m, ae)); assertEqualInt(1, archive_match_excluded(m, ae)); - t = __archive_get_date(now, "1980/1/1 0:0:0 UTC"); + t = parse_date(now, "1980/1/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); - t = __archive_get_date(now, "1980/3/1 0:0:0 UTC"); + t = parse_date(now, "1980/3/1 0:0:0 UTC"); archive_entry_set_ctime(ae, t, 0); failure("Its ctime should be excluded"); assertEqualInt(1, archive_match_time_excluded(m, ae)); @@ -612,20 +611,20 @@ "1980/2/1 0:0:0 UTC")); archive_entry_copy_pathname(ae, "file1"); - t = __archive_get_date(now, "1980/2/1 0:0:0 UTC"); + t = parse_date(now, "1980/2/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should not be excluded"); assertEqualInt(0, archive_match_time_excluded(m, ae)); assertEqualInt(0, archive_match_excluded(m, ae)); - t = __archive_get_date(now, "1980/1/1 0:0:0 UTC"); + t = parse_date(now, "1980/1/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should not be excluded"); assertEqualInt(0, archive_match_time_excluded(m, ae)); assertEqualInt(0, archive_match_excluded(m, ae)); - t = __archive_get_date(now, "1980/3/1 0:0:0 UTC"); + t = parse_date(now, "1980/3/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should be excluded"); @@ -659,37 +658,37 @@ ARCHIVE_MATCH_OLDER, L"1980/2/1 0:0:0 UTC")); archive_entry_copy_pathname(ae, "file1"); - t = __archive_get_date(now, "1980/2/1 0:0:0 UTC"); + t = parse_date(now, "1980/2/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should be excluded"); assertEqualInt(1, archive_match_time_excluded(m, ae)); assertEqualInt(1, archive_match_excluded(m, ae)); - t = __archive_get_date(now, "1980/1/1 0:0:0 UTC"); + t = parse_date(now, "1980/1/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should not be excluded"); assertEqualInt(0, archive_match_time_excluded(m, ae)); assertEqualInt(0, archive_match_excluded(m, ae)); - t = __archive_get_date(now, "1980/3/1 0:0:0 UTC"); + t = parse_date(now, "1980/3/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should be excluded"); assertEqualInt(1, archive_match_time_excluded(m, ae)); assertEqualInt(1, archive_match_excluded(m, ae)); - t = __archive_get_date(now, "1980/3/1 0:0:0 UTC"); + t = parse_date(now, "1980/3/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); - t = __archive_get_date(now, "1980/1/1 0:0:0 UTC"); + t = parse_date(now, "1980/1/1 0:0:0 UTC"); archive_entry_set_ctime(ae, t, 0); failure("Its mtime should be excluded"); assertEqualInt(1, archive_match_time_excluded(m, ae)); assertEqualInt(1, archive_match_excluded(m, ae)); - t = __archive_get_date(now, "1980/1/1 0:0:0 UTC"); + t = parse_date(now, "1980/1/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); - t = __archive_get_date(now, "1980/3/1 0:0:0 UTC"); + t = parse_date(now, "1980/3/1 0:0:0 UTC"); archive_entry_set_ctime(ae, t, 0); failure("Its ctime should be excluded"); assertEqualInt(1, archive_match_time_excluded(m, ae)); @@ -702,20 +701,20 @@ L"1980/2/1 0:0:0 UTC")); archive_entry_copy_pathname(ae, "file1"); - t = __archive_get_date(now, "1980/2/1 0:0:0 UTC"); + t = parse_date(now, "1980/2/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should not be excluded"); assertEqualInt(0, archive_match_time_excluded(m, ae)); assertEqualInt(0, archive_match_excluded(m, ae)); - t = __archive_get_date(now, "1980/1/1 0:0:0 UTC"); + t = parse_date(now, "1980/1/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should not be excluded"); assertEqualInt(0, archive_match_time_excluded(m, ae)); assertEqualInt(0, archive_match_excluded(m, ae)); - t = __archive_get_date(now, "1980/3/1 0:0:0 UTC"); + t = parse_date(now, "1980/3/1 0:0:0 UTC"); archive_entry_set_mtime(ae, t, 0); archive_entry_set_ctime(ae, t, 0); failure("Both Its mtime and ctime should be excluded"); --- /dev/null +++ contrib/libarchive/libarchive/test/test_archive_parse_date.c @@ -0,0 +1,97 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) 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. + */ +#include "test.h" + +#include + +/* + * Verify that the archive_parse_date() function works. + */ + +#define get_date archive_parse_date + +DEFINE_TEST(test_archive_parse_date) +{ + time_t now = time(NULL); + + assertEqualInt(get_date(now, "Jan 1, 1970 UTC"), 0); + assertEqualInt(get_date(now, "7:12:18-0530 4 May 1983"), 420900138); + assertEqualInt(get_date(now, "2004/01/29 513 mest"), 1075345980); + assertEqualInt(get_date(now, "99/02/17 7pm utc"), 919278000); + assertEqualInt(get_date(now, "02/17/99 7:11am est"), 919253460); + assertEqualInt(get_date(now, "now - 2 hours"), + get_date(now, "2 hours ago")); + assertEqualInt(get_date(now, "2 hours ago"), + get_date(now, "+2 hours ago")); + assertEqualInt(get_date(now, "now - 2 hours"), + get_date(now, "-2 hours")); + /* It's important that we handle ctime() format. */ + assertEqualInt(get_date(now, "Sun Feb 22 17:38:26 PST 2009"), + 1235353106); + /* Basic relative offsets. */ + /* If we use the actual current time as the reference, then + * these tests break around DST changes, so it's actually + * important to use a specific reference time here. */ + assertEqualInt(get_date(0, "tomorrow"), 24 * 60 * 60); + assertEqualInt(get_date(0, "yesterday"), - 24 * 60 * 60); + assertEqualInt(get_date(0, "now + 1 hour"), 60 * 60); + assertEqualInt(get_date(0, "now + 1 hour + 1 minute"), 60 * 60 + 60); + /* Repeat the above for a different start time. */ + now = 1231113600; /* Jan 5, 2009 00:00 UTC */ + assertEqualInt(get_date(0, "Jan 5, 2009 00:00 UTC"), now); + assertEqualInt(get_date(now, "tomorrow"), now + 24 * 60 * 60); + assertEqualInt(get_date(now, "yesterday"), now - 24 * 60 * 60); + assertEqualInt(get_date(now, "now + 1 hour"), now + 60 * 60); + assertEqualInt(get_date(now, "now + 1 hour + 1 minute"), + now + 60 * 60 + 60); + assertEqualInt(get_date(now, "tomorrow 5:16am UTC"), + now + 24 * 60 * 60 + 5 * 60 * 60 + 16 * 60); + assertEqualInt(get_date(now, "UTC 5:16am tomorrow"), + now + 24 * 60 * 60 + 5 * 60 * 60 + 16 * 60); + + /* Jan 5, 2009 was a Monday. */ + assertEqualInt(get_date(now, "monday UTC"), now); + assertEqualInt(get_date(now, "sunday UTC"), now + 6 * 24 * 60 * 60); + assertEqualInt(get_date(now, "tuesday UTC"), now + 24 * 60 * 60); + /* "next tuesday" is one week after "tuesday" */ + assertEqualInt(get_date(now, "UTC next tuesday"), + now + 8 * 24 * 60 * 60); + /* "last tuesday" is one week before "tuesday" */ + assertEqualInt(get_date(now, "last tuesday UTC"), + now - 6 * 24 * 60 * 60); + + /* Unix epoch timestamps */ + assertEqualInt(get_date(now, "@0"), 0); + assertEqualInt(get_date(now, "@100"), 100); + assertEqualInt(get_date(now, "@+100"), 100); + + assertEqualInt(get_date(now, "@"), -1); + assertEqualInt(get_date(now, "@-"), -1); + assertEqualInt(get_date(now, "@+"), -1); + assertEqualInt(get_date(now, "@tenth"), -1); + assertEqualInt(get_date(now, "@100 tomorrow"), -1); + + /* TODO: Lots more tests here. */ +} --- contrib/libarchive/libarchive/test/test_archive_string_conversion.c.orig +++ contrib/libarchive/libarchive/test/test_archive_string_conversion.c @@ -91,7 +91,7 @@ archive_be16enc(utf16+2, (uc & 0x3ff) + 0xDC00); return (4); } else { - archive_be16enc(utf16, uc); + archive_be16enc(utf16, (uint16_t)uc); return (2); } } @@ -118,7 +118,7 @@ archive_le16enc(utf16+2, (uc & 0x3ff) + 0xDC00); return (4); } else { - archive_le16enc(utf16, uc); + archive_le16enc(utf16, (uint16_t)uc); return (2); } } --- /dev/null +++ contrib/libarchive/libarchive/test/test_compat_gtar_large.c @@ -0,0 +1,224 @@ +/*- + * Copyright (c) 2003-2024 Tim Kientzle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) 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. + */ +#include "test.h" + +/* + * Verify reading a GNU tar pax format archive with >8GB entry. + * + * Sample data created with GNU tar 1.35: + * $ dd if=/dev/zero of=test.bin bs=1048576 count=8192 + * $ gnutar --format=posix -cvf test.tar test.bin + * $ hexdump -C -v test.tar | head -n 96 + */ + +static const unsigned char test_compat_gtar_large_data[] = { + /* 00000000 */ 0x2e, 0x2f, 0x50, 0x61, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x74, 0x65, 0x73, /* |./PaxHeaders/tes| */ + /* 00000010 */ 0x74, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |t.bin...........| */ + /* 00000020 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000030 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000040 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000050 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000060 */ 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x36, 0x34, 0x34, 0x00, 0x30, 0x30, 0x30, 0x30, /* |....0000644.0000| */ + /* 00000070 */ 0x30, 0x30, 0x30, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x30, 0x30, 0x30, 0x30, /* |000.0000000.0000| */ + /* 00000080 */ 0x30, 0x30, 0x30, 0x30, 0x31, 0x35, 0x35, 0x00, 0x31, 0x34, 0x37, 0x31, 0x31, 0x35, 0x36, 0x36, /* |0000155.14711566| */ + /* 00000090 */ 0x30, 0x31, 0x33, 0x00, 0x30, 0x31, 0x31, 0x37, 0x35, 0x33, 0x00, 0x20, 0x78, 0x00, 0x00, 0x00, /* |013.011753. x...| */ + /* 000000a0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000000b0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000000c0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000000d0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000000e0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000000f0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000100 */ 0x00, 0x75, 0x73, 0x74, 0x61, 0x72, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |.ustar.00.......| */ + /* 00000110 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000120 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000130 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000140 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000150 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000160 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000170 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000180 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000190 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000001a0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000001b0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000001c0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000001d0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000001e0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000001f0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000200 */ 0x31, 0x39, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x3d, 0x38, 0x35, 0x38, 0x39, 0x39, 0x33, 0x34, 0x35, /* |19 size=85899345| */ + /* 00000210 */ 0x39, 0x32, 0x0a, 0x33, 0x30, 0x20, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x3d, 0x31, 0x37, 0x33, 0x30, /* |92.30 mtime=1730| */ + /* 00000220 */ 0x36, 0x30, 0x34, 0x30, 0x34, 0x33, 0x2e, 0x30, 0x34, 0x36, 0x38, 0x33, 0x33, 0x30, 0x31, 0x31, /* |604043.046833011| */ + /* 00000230 */ 0x0a, 0x33, 0x30, 0x20, 0x61, 0x74, 0x69, 0x6d, 0x65, 0x3d, 0x31, 0x37, 0x33, 0x30, 0x36, 0x30, /* |.30 atime=173060| */ + /* 00000240 */ 0x34, 0x30, 0x33, 0x39, 0x2e, 0x38, 0x30, 0x37, 0x30, 0x38, 0x31, 0x33, 0x31, 0x39, 0x0a, 0x33, /* |4039.807081319.3| */ + /* 00000250 */ 0x30, 0x20, 0x63, 0x74, 0x69, 0x6d, 0x65, 0x3d, 0x31, 0x37, 0x33, 0x30, 0x36, 0x30, 0x34, 0x30, /* |0 ctime=17306040| */ + /* 00000260 */ 0x34, 0x33, 0x2e, 0x30, 0x34, 0x36, 0x38, 0x33, 0x33, 0x30, 0x31, 0x31, 0x0a, 0x00, 0x00, 0x00, /* |43.046833011....| */ + /* 00000270 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000280 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000290 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000002a0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000002b0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000002c0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000002d0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000002e0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000002f0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000300 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000310 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000320 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000330 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000340 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000350 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000360 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000370 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000380 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000390 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000003a0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000003b0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000003c0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000003d0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000003e0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000003f0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000400 */ 0x74, 0x65, 0x73, 0x74, 0x2e, 0x62, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |test.bin........| */ + /* 00000410 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000420 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000430 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000440 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000450 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000460 */ 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x36, 0x34, 0x34, 0x00, 0x30, 0x30, 0x30, 0x30, /* |....0000644.0000| */ + /* 00000470 */ 0x37, 0x36, 0x35, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x32, 0x34, 0x00, 0x30, 0x30, 0x30, 0x30, /* |765.0000024.0000| */ + /* 00000480 */ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x31, 0x34, 0x37, 0x31, 0x31, 0x35, 0x36, 0x36, /* |0000000.14711566| */ + /* 00000490 */ 0x30, 0x31, 0x33, 0x00, 0x30, 0x31, 0x31, 0x32, 0x33, 0x35, 0x00, 0x20, 0x30, 0x00, 0x00, 0x00, /* |013.011235. 0...| */ + /* 000004a0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000004b0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000004c0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000004d0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000004e0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000004f0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000500 */ 0x00, 0x75, 0x73, 0x74, 0x61, 0x72, 0x00, 0x30, 0x30, 0x74, 0x69, 0x6d, 0x00, 0x00, 0x00, 0x00, /* |.ustar.00tim....| */ + /* 00000510 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000520 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x74, 0x61, 0x66, 0x66, 0x00, 0x00, /* |.........staff..| */ + /* 00000530 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000540 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000550 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000560 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000570 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000580 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 00000590 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000005a0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000005b0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000005c0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000005d0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000005e0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ + /* 000005f0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* |................| */ +}; + +/* + * Followed by 16777218 blocks, each consisting of 512 zeros: + * Entry is 8GB = 2^24 = 16777216 blocks + * Plus 2 zero blocks for end-of-archive + */ + +struct my_reader { + const void *prefix; + int prefix_length; + int zero_blocks_remaining; + void *zero_block; +}; + +/* + * Custom reader returns first the prefix, then + * the expected number of zero blocks, then EOF. + */ +static ssize_t +myread(struct archive *a, void *client_data, const void **buff) +{ + struct my_reader *reader = client_data; + (void)a; /* UNUSED */ + + if (reader->prefix != NULL) { + *buff = reader->prefix; + reader->prefix = NULL; + return reader->prefix_length; + } else if (reader->zero_blocks_remaining > 0) { + *buff = reader->zero_block; + reader->zero_blocks_remaining -= 1; + return 512; + } else { + return 0; + } +} + +/* + * test_compat_gtar_large verifies that we can read + * the archive encoded above. + */ +DEFINE_TEST(test_compat_gtar_large) +{ + struct archive *a; + struct archive_entry *ae; + struct my_reader reader = { + test_compat_gtar_large_data, + sizeof(test_compat_gtar_large_data), + 16777218, /* 2^24 + 2 ; See above */ + NULL + }; + int r; + + reader.zero_block = calloc(1, 512); + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open(a, &reader, NULL, myread, NULL)); + + /* Read first entry. */ + assertEqualIntA(a, ARCHIVE_OK, r = archive_read_next_header(a, &ae)); + if (r != ARCHIVE_OK) { + archive_read_free(a); + return; + } + assertEqualString("test.bin", archive_entry_pathname(ae)); + assertEqualInt(1730604043, archive_entry_mtime(ae)); + assertEqualInt(501, archive_entry_uid(ae)); + assertEqualString("tim", archive_entry_uname(ae)); + assertEqualInt(20, archive_entry_gid(ae)); + assertEqualString("staff", archive_entry_gname(ae)); + assertEqualInt(0100644, archive_entry_mode(ae)); + assertEqualInt(8589934592LL, archive_entry_size(ae)); + + /* TODO: Read and verify contents: 8GB of zeros */ + + /* Verify the end-of-archive. */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + /* Verify that the format detection worked. */ + assertEqualInt(archive_filter_code(a, 0), ARCHIVE_FILTER_NONE); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE); + + /* Verify that the reader actually read to the end of data */ + assertEqualInt(reader.zero_blocks_remaining, 0); + + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + free(reader.zero_block); +} --- contrib/libarchive/libarchive/test/test_compat_solaris_tar_acl.c.orig +++ contrib/libarchive/libarchive/test/test_compat_solaris_tar_acl.c @@ -229,7 +229,7 @@ assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]), ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0644); failure("Basic ACLs should set mode to 0644, not %04o", - archive_entry_mode(ae)&0777); + (unsigned int)archive_entry_mode(ae)&0777); assert((archive_entry_mode(ae) & 0777) == 0644); /* Second item has default and access ACLs */ @@ -239,7 +239,7 @@ assertEntryCompareAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]), ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0750); failure("Basic ACLs should set mode to 0750, not %04o", - archive_entry_mode(ae)&0777); + (unsigned int)archive_entry_mode(ae)&0777); assert((archive_entry_mode(ae) & 0777) == 0750); assertEqualInt(6, archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_DEFAULT)); --- contrib/libarchive/libarchive/test/test_compat_star_acl.c.orig +++ contrib/libarchive/libarchive/test/test_compat_star_acl.c @@ -251,7 +251,7 @@ assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]), ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0142); failure("Basic ACLs should set mode to 0142, not %04o", - archive_entry_mode(ae)&0777); + (unsigned int)archive_entry_mode(ae)&0777); assert((archive_entry_mode(ae) & 0777) == 0142); /* Second item has pretty extensive ACLs */ @@ -261,7 +261,7 @@ assertEntryCompareAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]), ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0543); failure("Basic ACLs should set mode to 0543, not %04o", - archive_entry_mode(ae)&0777); + (unsigned int)archive_entry_mode(ae)&0777); assert((archive_entry_mode(ae) & 0777) == 0543); /* Third item has default ACLs */ @@ -271,7 +271,7 @@ assertEntryCompareAcls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]), ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 0142); failure("Basic ACLs should set mode to 0142, not %04o", - archive_entry_mode(ae)&0777); + (unsigned int)archive_entry_mode(ae)&0777); assert((archive_entry_mode(ae) & 0777) == 0142); /* Close the archive. */ --- contrib/libarchive/libarchive/test/test_entry.c.orig +++ contrib/libarchive/libarchive/test/test_entry.c @@ -436,7 +436,7 @@ archive_entry_fflags(e, &set, &clear); assertEqualInt(UF_HIDDEN, set); assertEqualInt(UF_NODUMP | UF_IMMUTABLE | UF_APPEND, clear); -#elif defined(_WIN32) && !defined(CYGWIN) +#elif defined(_WIN32) && !defined(__CYGWIN__) archive_entry_copy_fflags_text_w(e, L"rdonly,hidden,nosystem"); archive_entry_fflags(e, &set, &clear); assertEqualInt(FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN, set); --- contrib/libarchive/libarchive/test/test_open_file.c.orig +++ contrib/libarchive/libarchive/test/test_open_file.c @@ -31,14 +31,14 @@ struct archive *a; FILE *f; - f = fopen("test.tar", "wb"); + f = fopen("test.7z", "wb"); assert(f != NULL); if (f == NULL) return; /* Write an archive through this FILE *. */ assert((a = archive_write_new()) != NULL); - assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_7zip(a)); assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a)); assertEqualIntA(a, ARCHIVE_OK, archive_write_open_FILE(a, f)); @@ -70,9 +70,10 @@ fclose(f); /* - * Now, read the data back. + * Now, read the data back. 7z requiring seeking, that also + * tests that the seeking support works. */ - f = fopen("test.tar", "rb"); + f = fopen("test.7z", "rb"); assert(f != NULL); if (f == NULL) return; --- contrib/libarchive/libarchive/test/test_read_disk_directory_traversals.c.orig +++ contrib/libarchive/libarchive/test/test_read_disk_directory_traversals.c @@ -39,7 +39,7 @@ { const char *fn = "fs_noatime"; struct stat st; -#if defined(_WIN32) && !defined(CYGWIN) +#if defined(_WIN32) && !defined(__CYGWIN__) char *buff = NULL; char *ptr; int r; --- contrib/libarchive/libarchive/test/test_read_format_7zip.c.orig +++ contrib/libarchive/libarchive/test/test_read_format_7zip.c @@ -24,13 +24,16 @@ */ #include "test.h" +#if HAVE_LZMA_H +#include +#endif + #if defined(_WIN32) && !defined(__CYGWIN__) #define close _close #define open _open #endif #define __LIBARCHIVE_BUILD -#include /* * Extract a non-encoded file. @@ -402,7 +405,7 @@ la_ssize_t bytes_read = archive_read_data(a, buff, sizeof(buff)); assert(bytes_read >= 0); if (bytes_read == 0) break; - computed_crc = crc32(computed_crc, buff, bytes_read); + computed_crc = bitcrc32(computed_crc, buff, bytes_read); } assertEqualInt(computed_crc, expected_crc); @@ -929,6 +932,10 @@ if (ARCHIVE_OK != archive_read_support_filter_zstd(a)) { skipping( "7zip:zstd decoding is not supported on this platform"); + } else if (ARCHIVE_OK != archive_read_support_filter_xz(a)) { + // The directory header entries in the test file uses lzma. + skipping( + "7zip:lzma decoding is not supported on this platform"); } else { test_extract_all_files_zstd("test_read_format_7zip_zstd.7z"); } @@ -946,6 +953,10 @@ if (ARCHIVE_OK != archive_read_support_filter_zstd(a)) { skipping( "7zip:zstd decoding is not supported on this platform"); + } else if (ARCHIVE_OK != archive_read_support_filter_xz(a)) { + // The directory header entries in the test file uses lzma. + skipping( + "7zip:lzma decoding is not supported on this platform"); } else { test_extract_all_files_zstd("test_read_format_7zip_solid_zstd.7z"); } @@ -1063,7 +1074,7 @@ assertEqualString("hw-gnueabihf", archive_entry_pathname(ae)); assertEqualInt(sizeof(buff), archive_entry_size(ae)); assertEqualInt(sizeof(buff), archive_read_data(a, buff, sizeof(buff))); - computed_crc = crc32(computed_crc, buff, sizeof(buff)); + computed_crc = bitcrc32(computed_crc, buff, sizeof(buff)); assertEqualInt(computed_crc, expected_crc); assertEqualInt(1, archive_file_count(a)); @@ -1137,7 +1148,7 @@ assertEqualString("hw-arm64", archive_entry_pathname(ae)); assertEqualInt(sizeof(buff), archive_entry_size(ae)); assertEqualInt(sizeof(buff), archive_read_data(a, buff, sizeof(buff))); - computed_crc = crc32(computed_crc, buff, sizeof(buff)); + computed_crc = bitcrc32(computed_crc, buff, sizeof(buff)); assertEqualInt(computed_crc, expected_crc); assertEqualInt(1, archive_file_count(a)); @@ -1150,7 +1161,7 @@ DEFINE_TEST(test_read_format_7zip_lzma2_arm64) { -#ifdef HAVE_LZMA_FILTER_ARM64 +#ifdef LZMA_FILTER_ARM64 struct archive *a; assert((a = archive_read_new()) != NULL); @@ -1260,6 +1271,97 @@ assertEqualInt(ARCHIVE_OK, archive_read_free(a)); } +DEFINE_TEST(test_read_format_7zip_sfx_pe) +{ + /* + * This is a regular 7z SFX PE file + * created by 7z tool v22.01 on Windows 64-bit + */ + struct archive *a; + struct archive_entry *ae; + int bs = 10240; + char buff[32]; + const char reffile[] = "test_read_format_7zip_sfx_pe.exe"; + const char test_txt[] = "123"; + int size = sizeof(test_txt) - 1; + + extract_reference_file(reffile); + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_filter_all(a)); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_open_filename(a, reffile, bs)); + + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualString("test.txt.txt", archive_entry_pathname(ae)); + + assertA(size == archive_read_data(a, buff, size)); + assertEqualMem(buff, test_txt, size); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + +DEFINE_TEST(test_read_format_7zip_sfx_modified_pe) +{ + /* + * This test simulates a modified 7z SFX PE + * the compressed data in the SFX file is still stored as PE overlay + * but the decompressor code is replaced + */ + struct archive *a; + struct archive_entry *ae; + int bs = 10240; + char buff[32]; + const char reffile[] = "test_read_format_7zip_sfx_modified_pe.exe"; + const char test_txt[] = "123"; + int size = sizeof(test_txt) - 1; + + extract_reference_file(reffile); + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_filter_all(a)); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_open_filename(a, reffile, bs)); + + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualString("test.txt.txt", archive_entry_pathname(ae)); + + assertA(size == archive_read_data(a, buff, size)); + assertEqualMem(buff, test_txt, size); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + +DEFINE_TEST(test_read_format_7zip_sfx_elf) +{ + /* + * This is a regular 7z SFX ELF file + * created by 7z tool v16.02 on Ubuntu + */ + struct archive *a; + struct archive_entry *ae; + int bs = 10240; + char buff[32]; + const char reffile[] = "test_read_format_7zip_sfx_elf.elf"; + const char test_txt[] = "123"; + int size = sizeof(test_txt) - 1; + + extract_reference_file(reffile); + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_filter_all(a)); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_open_filename(a, reffile, bs)); + + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualString("test.txt.txt", archive_entry_pathname(ae)); + + assertA(size == archive_read_data(a, buff, size)); + assertEqualMem(buff, test_txt, size); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + DEFINE_TEST(test_read_format_7zip_extract_second) { struct archive *a; @@ -1301,3 +1403,206 @@ assertEqualInt(ARCHIVE_OK, archive_read_free(a)); } + +#ifdef LZMA_FILTER_RISCV +static void +test_riscv_filter(const char *refname) +{ + struct archive *a; + struct archive_entry *ae; + char buff[8488]; + uint32_t computed_crc = 0; + uint32_t expected_crc = 0xf7ed24e7; + + assert((a = archive_read_new()) != NULL); + + extract_reference_file(refname); + + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_filename(a, refname, 10240)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt((AE_IFREG | 0775), archive_entry_mode(ae)); + assertEqualString("hw-riscv64", archive_entry_pathname(ae)); + assertEqualInt(sizeof(buff), archive_entry_size(ae)); + assertEqualInt(sizeof(buff), archive_read_data(a, buff, sizeof(buff))); + + computed_crc = bitcrc32(computed_crc, buff, sizeof(buff)); + assertEqualInt(computed_crc, expected_crc); + + assertEqualInt(1, archive_file_count(a)); + + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} +#endif + +DEFINE_TEST(test_read_format_7zip_lzma2_riscv) +{ +#ifdef LZMA_FILTER_RISCV + struct archive *a; + + assert((a = archive_read_new()) != NULL); + + if (ARCHIVE_OK != archive_read_support_filter_lzma(a)) { + skipping("7zip:lzma decoding is not supported on this platform"); + } else { + test_riscv_filter("test_read_format_7zip_lzma2_riscv.7z"); + } +#else + skipping("This version of liblzma does not support LZMA_FILTER_RISCV"); +#endif +} + +static void +test_sparc_filter(const char *refname) +{ + struct archive *a; + struct archive_entry *ae; + size_t expected_entry_size = 1053016; + char *buff = malloc(expected_entry_size); + uint32_t computed_crc = 0; + uint32_t expected_crc = 0x6b5b364d; + + assert((a = archive_read_new()) != NULL); + + extract_reference_file(refname); + + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_filename(a, refname, 10240)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt((AE_IFREG | 0775), archive_entry_mode(ae)); + assertEqualString("hw-sparc64", archive_entry_pathname(ae)); + assertEqualInt(expected_entry_size, archive_entry_size(ae)); + assertEqualInt(expected_entry_size, archive_read_data(a, buff, expected_entry_size)); + + computed_crc = bitcrc32(computed_crc, buff, expected_entry_size); + assertEqualInt(computed_crc, expected_crc); + + assertEqualInt(1, archive_file_count(a)); + + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + + free(buff); +} + +DEFINE_TEST(test_read_format_7zip_lzma2_sparc) +{ + struct archive *a; + + assert((a = archive_read_new()) != NULL); + + if (ARCHIVE_OK != archive_read_support_filter_lzma(a)) { + skipping( + "7zip:lzma decoding is not supported on this platform"); + } else { + test_sparc_filter("test_read_format_7zip_lzma2_sparc.7z"); + } + + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + +DEFINE_TEST(test_read_format_7zip_zstd_sparc) +{ + struct archive *a; + + assert((a = archive_read_new()) != NULL); + + if (ARCHIVE_OK != archive_read_support_filter_zstd(a)) { + skipping( + "7zip:zstd decoding is not supported on this platform"); + } else { + test_sparc_filter("test_read_format_7zip_zstd_sparc.7z"); + } + + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + +static void +test_powerpc_filter(const char *refname) +{ + struct archive *a; + struct archive_entry *ae; + size_t expected_entry_size = 68340; + char *buff = malloc(expected_entry_size); + uint32_t computed_crc = 0; + uint32_t expected_crc = 0x71fb03c9; + + assert((a = archive_read_new()) != NULL); + + extract_reference_file(refname); + + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_filename(a, refname, 10240)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt((AE_IFREG | 0775), archive_entry_mode(ae)); + assertEqualString("hw-powerpc", archive_entry_pathname(ae)); + assertEqualInt(expected_entry_size, archive_entry_size(ae)); + assertEqualInt(expected_entry_size, archive_read_data(a, buff, expected_entry_size)); + + computed_crc = bitcrc32(computed_crc, buff, expected_entry_size); + assertEqualInt(computed_crc, expected_crc); + + assertEqualInt(1, archive_file_count(a)); + + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + + free(buff); +} + +DEFINE_TEST(test_read_format_7zip_deflate_powerpc) +{ + struct archive *a; + + assert((a = archive_read_new()) != NULL); + + if (ARCHIVE_OK != archive_read_support_filter_gzip(a)) { + skipping( + "7zip:deflate decoding is not supported on this platform"); + } else { + test_powerpc_filter("test_read_format_7zip_deflate_powerpc.7z"); + } + + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + +DEFINE_TEST(test_read_format_7zip_lzma2_powerpc) +{ + struct archive *a; + + assert((a = archive_read_new()) != NULL); + + if (ARCHIVE_OK != archive_read_support_filter_gzip(a)) { + skipping( + "7zip:deflate decoding is not supported on this platform"); + } else { + test_powerpc_filter("test_read_format_7zip_lzma2_powerpc.7z"); + } + + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} --- /dev/null +++ contrib/libarchive/libarchive/test/test_read_format_7zip_deflate_powerpc.7z.uu @@ -0,0 +1,55 @@ +begin 664 test_read_format_7zip_deflate_powerpc.7z +M-WJ\KR<<``2:7;DH@`@```````!R`````````#:LFQ3LU$MK$U$4P/$SDZB1 +M)#)*%$'1$0,JB&\D14M,?56J]8%N=)%6(QJ,5FW%(BD97XC@HN(#7(@K@QO! +MA6Y%-R*"7\$GKMQTX4*P.IX[*%#_!_U=.YMZYY][<5'/'LZ'I?AR2MI'2_G[/AO;S)NR8 +M8T.\*(PIHU'H1SQB/G]]]YPXM+M<8U7TO8[=I83B.7&H,1M3_^S!J7DVM+_% +M1#)6&_JR1[_*]VSHO?E1_!G?*Y.PZWLZON^?_65,)/6M;-0/KVS45@P.K%AM +M)MG[!7,NVWL/2->;^Z^F/4M_>]9U;/KU\&:^R;%2<:UQS7_. +MSVS:3W+2+S[W/)YDK[.3QJSXXOW3WV:[R4J.GD7.K#=39(94=^RN#@[5ZJ>J +MYP:/UN3TN:%!J5:ULB-ZN__L4/5D?_V4F+ZI<[ULW[FC:W-US8I5$ZVUZW3" +ML9,#I^R$:ER%UN28OZB>)Y-O7OSJ:UY@X;YG<=TN!"UW6B[ +MLVT[K6E).Z,Y4?OVHG"LF7';HXX4;KV43-<#F=)Z[;;+[\3=\.YG)E@0CJ\, +M1"K/)=,MZ8N!YC4SJ?9ES2TM$J\WB(^EN2P[O'^1K#?S1QZY[=+$VBFSMI3? +MBMN9-VN.O[[Z:/Q#MQYCG^8DL;'/F7.Z>66&AG/G?W/[[-YN?91<^8/G7B]+ +MT>1LTISD++HEU=_ABV/JO:?C42 +MT;U)J3[%TS,[H^O(R.*>X8Z6^$%6TM%:7\/QD?Y#P[I6M)].K>?B"),0ERX?>.$S].-Z>GVLWLP<+%&_H]?0<+R9Q)XS_/ +MP:2_MRO.\:.-QL!R__S`V48M>LKFI!_127]B3RTKE?=X1 +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````````#PN]UJ +M!Y$:BJ(WF5E===2L_R\,..`_C!\4Q,+9CQ_PA^X*-CXSF[@3G$G6)*.[%B*B +MJ""B:*%6EEM:J+5@8R%BIZ4V%F*AH"(BCN?EW;CCD$8;FQPX\][)/;EY[[Z7 +MO,F0(4.&#!DR9,B0(4.&#!DR9/C?,"AO&)1[B:X&K@0+!NFOT7`+]`^TRJ?W6SR\&:1/H=^&^16BG0#]#.QT<`F>`!CB?%'*&3A+R +MMP3.`Z>""W'_0]E'*_-U@V5P&E@8E4FTUF>_U?J)^!C:EAPSVH_0'OT#D*^] +M#C?`V^`=0S]?0CN/.K"KKV];<=50M>E%S>*&3>8FL[Q^2S.6&\]MW&R6-Z_F +MRY0*U&60@!R1QMIFK;.^PCK'>H)UGO4SUET$R'JSGL+:8SV5]1CK;M9)OFFL +M'[*>SOHUZQE*YXJL"URC-ZQG*MU58#V+=>*?S7H[:X,`N8]8][#^P7I.LAZL +MY[+^R'I>K'5*XO-9)\]?P+K$>B$Q6,LZ:<3(4^L3FFZN=U%3]9Z#^:XC"37? +M91W^E8@?)T!7\=70-]KT=GZ/$GV(QZ-I:CS'DOEJ:KZ7Y+O7YK^9U$=3]7G0 +M_OR4\3Q"?:^QWR"@(_Y4[F..R_J\2.JKJ?J^2M:+U'J]E^\7Q^?)WP1SU%WK +M#%V-H1CGTY8G]3:4+B7[8XY.,Z'7L#^);^W(MY,81:6'#%UU>_387^7]E>^) +M]Y=V"O%5G&\A=)GWYV;D*T"?YO$D\0O\#N_F^&6.)_EOR?W.XYU!PT&TP?1) +M"*OJBL@:H1$_$G6KZM1E*(R:)TZ8PV0[@3/BAI$3B*@AANN^YX2XQ_;%2-VO +M6G5A1WX0"JLY1L-^8[3N1(YMEM,=XH3KN<(*`FM<.%X4C-.)P&HXPFXV&N.X +MI4T).*,_K+4S&(T0.P]5]@V(@?W]0I`XW%\1O97#`^CV']U?V;>G#XY=^X?$ +MP&XV[NX_1&+7W@.]E;WBP,Z=AP<&Q6"E=Z^\0]3=ZK`((RN(1,-RO1V[]N[I +M[1,;S4V;23BV%5D4#QA.*9231IM1F#CC>8XT?(^S"&D-?5&S/+OND-AS``'; +M]40S=&S"/&P8JF'(J>1#<6%P7Q_/)YXTD1F.-R*KBC8*5%M+>JZ'A1@ET_,C +MQQSQFF:UZ=;M]:[-ERJ]>];+I8QC-2NLD6F/>\@7M\BB(J>=('1][P\A$`N< +MNB6-W!NM1_*1+GXC9PR_LAR(^7%Q3*?&*U:S@TDE[TB63MW!?9G8:KC#>*J/ +M7"H'JD$F-DX#BTQ_@Z7\?=/5&2-),XG!,8D5X%3VV1232C2)/"EL:?-=(?Y. +MIOCZSK2GS,_>`,]CVCF'20U+FEL<<`CX`YYZ[./"G_+[!OC&)2N>.Y$F=EGWT3%),*[?-@?9'[O>KLE*02^^:W +M^:YS_BGJ&R-)_2GUNSWIRQ4IIO:$)F&0PKW$I[ZQDK0N)=]]]NGJVRE)/2F^ +MB39?D6+2LA3?XS;?=HI)@RD^.>998$Z=82#'&'GFS33]PO$\"^M1V^A'K;U8-(_4#^U^9U3MZ/:6!NTI>7/W=3GMOSIZ]+>KYW +M^GX!`00&``$)B(``!PL!``(#!`$(!`,#`@4!``S!]`K!]`H`"`H!R0/[<0`` +M!0$9#P```````````````````!$7`&@`=P`M`'``;P!W`&4`<@!P`&,````9 +;!``````4"@$`>7-\NFY9VP$5!@$`((#]@0`` +` +end --- contrib/libarchive/libarchive/test/test_read_format_7zip_extract_second.7z.uu.orig +++ contrib/libarchive/libarchive/test/test_read_format_7zip_extract_second.7z.uu @@ -1,11 +1,11 @@ -begin 644 test_read_format_7zip_extract_second.7z -M-WJ\KR<<``-N%=VX!@$````````B`````````*R\U.<`&`Q"DFIGO`[1,RO\ -MN,RA7-QU1L&_]O_/$0MMLIEBUR3'BDX@M2C-5'VG./-4,5@W3Q@*__^7_,[H -MEO`DB'[ZI>@H2_E>/W.2G$$.P01-X!YN5";SS[3#7Z4Q1G/EF.0'^D*[S8&8 -M[FV9DYX7,SA%^.Q\'?__P!@`````@3,'K@_4WV/Q0A7VLXG$X?GH4=5W^`UM -M$N_EX$)LE*?K$W5?WLP:X0T[Q%V^?A!0E\VZRBB,)(MO`C`LO[O!3(1YL)<: -MJ."`';WU;>GP5',%Z=6?*/H9*Z)&\*!2^,RV`R30UOBH8+5.;;2IKF -M0W://&'?"L?0L2!)`*]F30B0&/_'<4``%P9Z`0F`C``'"P$``2,#`0$%70`` --@``,@*@*`6]FB2D````` -` -end +begin 644 test_read_format_7zip_extract_second.7z +M-WJ\KR<<``-N%=VX!@$````````B`````````*R\U.<`&`Q"DFIGO`[1,RO\ +MN,RA7-QU1L&_]O_/$0MMLIEBUR3'BDX@M2C-5'VG./-4,5@W3Q@*__^7_,[H +MEO`DB'[ZI>@H2_E>/W.2G$$.P01-X!YN5";SS[3#7Z4Q1G/EF.0'^D*[S8&8 +M[FV9DYX7,SA%^.Q\'?__P!@`````@3,'K@_4WV/Q0A7VLXG$X?GH4=5W^`UM +M$N_EX$)LE*?K$W5?WLP:X0T[Q%V^?A!0E\VZRBB,)(MO`C`LO[O!3(1YL)<: +MJ."`';WU;>GP5',%Z=6?*/H9*Z)&\*!2^,RV`R30UOBH8+5.;;2IKF +M0W://&'?"L?0L2!)`*]F30B0&/_'<4``%P9Z`0F`C``'"P$``2,#`0$%70`` +-@``,@*@*`6]FB2D````` +` +end --- /dev/null +++ contrib/libarchive/libarchive/test/test_read_format_7zip_lzma2_powerpc.7z.uu @@ -0,0 +1,48 @@ +begin 664 libarchive/test/test_read_format_7zip_lzma2_powerpc.7z +M-WJ\KR<<``3$^AU-00<```````!R`````````-SC-5?A"O,'.5T`/Y%%A&@T +MB@D*0&*NI,NQR,0S-H]24V>HUJ)S8G8?UTBL>Q5 +MG.4VRG`GX;NVN!)QZV9EE-86\EX/-AGSD8"!_9OCIVXS85?#W'27\3@+6C5[ +MNF\X^*^Y;RXP>O=WDX`WFTS!C`ZZ+4=K-.AWX[@*@)]I$[S64O;XZL +MAMD8<%,25+2ZFN6C=QD/7BQW"%!J\Q]5:/P\JOWIO1&Z)XJPAH]RU>Q=R:'" +M1.D[?\\09!A4R'EED]]!$(`P\VJ>\*'QH^,1[W<'/KHPYR\>YQ>)7;$Q1$2Q +MT;Y'@(N5GF.QDBD^[&@!Z7!)8T:A8G>LO#(-C]Q]RQ+RP8)+;A49<3:R@[<. +M6QP1PPEA<]\\J&[Z4Q.3D4JF=[9(>PZ;PH1=9X$OB2+-JWD+(MY@9)+.RBE\ +M-(YGOM"(P#:$I2]OP+Z`!T:_-7`>%UH]^X%9I;=?%F'`?%@SZGPK7U7P.NY1 +MO^(M\S$TG0-!QBLO4NVWI'9=V=59:L$<)=R(B=><7E`EHU>+9U:R60*?H+;L:IXHASE[EX="AL9^\TE8<]4\'P<.8X63DC$%-'EF2+XYRU/NJEAQ8^I(QUY>=IH']H+>E?4H15L`[6A?? +MYQ%.OP=9FA1\3D^6X28B!N^S0C/K(YJNUH-"Z();:A$'BXD)LNBZ4M;S-:$< +MD?F)EG-N&&1W;@208KQ-ROM$$L^-"LM93&YH!3<9G"EL[^E+P!=UCPJ6MX8E +MD_G.B!(=0CA`.\TB&<%GU8CS!`4F_T$*IV'T;,6>X1#"0H?_EN"/R^EE'3BUH(JL&GR=V\DK6^W& +MQ4&"6)M)";27.MU5=J:`5'\[Q +MRGVNDF%%,496/=".O2\%0/:L/DYAK$@8N&Q-MB\(B,I&D44;Z$"5OEOZ&+[3 +MP<6Y""AA;7[-PHA'VM!.P?%2&UY&RV1PV8A%_E\W>C?4AZ$."9483$_WT@>? +MP9Q@;):Q=!M6*6%B<=I/2O&&TR;`%8C,>AU);W2__21.`.E&3R*"# +MF/E^)UDT^O^">DN`G0X?YMDA0(VD##Q!=#AJ2_GU(R]"BT\9=G]06IVXB*N> +MD._HN.P#'34_+GN3+-R$,309TH/LS@S@U\MI$#2K3\^7&&MXU4$XN0"Q\X9" +M@"F6:AQACT&WF>-H#X#L62S\U$Z^I@#R%"^PAU[* +M_S%['0[X>],*)X36#OJ=S>JW>URI18]C)/IPC>%O$O87NK;/*'LSFF`&O=UON5U$^V>E]4BYF!=EJ=>W>!L!))2)WXN[6.R9KY6OYB_%D\LB@UJKV$X?$3X!__S,A$L(9TJ;'"/_KQD_`[B8%4 +M@:*M>W7>7:^#T%>UD!F&2U9MH!,&+NCL8_C0R1,V,<09?&_#YQ,:=OX`P`>Z +M$F2Q3)V#BA^O*^SVX_H(":;Y1R\E%.2")3UKK[GS4LK?/)MTMK9O,;C_&^1Z +M]YV_L72P)(`*4@G2BS"T#+0MFF+[2@%^L.Y+G;/_G;O3U]9V>BO?AA(@YY1T +M(PZ_RW(H!:>:2"-VPA#,?7A`^W<*16&L'FSQ0>S*^?^%4M.0J!D;_PJV@M9U +MX^RVHWG(^4T*27L?-?N_,&Z9_L+B`5FC2$7OSN:!R!T>@:PS.!&G%]<=TRUW +MO$"BL"1/8WVCYVY[)O0#BGT7+'4)(8$#PDBKX[G8`5IV^HOM);AWVK;N2=?O +M6Z(82J?PP3)M":X^V\^4P/`JLI6D3E(0Y,&R?38!2J\A?)$FA9N-)=C.8TM7 +M;NY.1S63C),^$)LC$@<'B:M(DW@!)1#8/",9(Z%V@<#;N=,QJ>GQ\7@6```! +M!`8``0F'00`'"P$``B$A`0D$`P,"!0$`#,'T"L'T"@`("@')`_MQ```%`1D/ +M````````````````````$1<`:`!W`"T`<`!O`'<`90!R`'``8P```!D$```` +7`!0*`0!T7'CG;UG;`14&`0`@@/V!```` +` +end --- /dev/null +++ contrib/libarchive/libarchive/test/test_read_format_7zip_lzma2_riscv.7z.uu @@ -0,0 +1,49 @@ +begin 664 test_read_format_7zip_lzma2_riscv.7z +M-WJ\KR<<``2#$,U9>P<```````!B`````````/NM+,3@(2<'5VNZVMMC.M1:6A'_@4B7D:$-^A7OC]^75)8S5[+EBS'O"X%U.;J +MIP3!?I?]\-&D0*0_ +M8\P?X^=GN)?^"&< +M8F?3+:T?=0[F$8D0,>.@/W@?.H_*3R#+OM.JM\::8JT52"_:`"T^IFT#HJ&E +MG?=B5!4EX?D"/N"[9/+^W956RS)T4MN,MPSU'BH$'6>.O!%>MM[Q1M\*?-:,ZA.LC4S*%X\>2A +M`A!MM\`L.#S5]OZSD.^1E^WI&^?6F,*]*G."0CI6H8W.9"#Z_6ZN<@;G-2.= +MT][M[&X3["?7[V$_E354K.RAM%W%]K=@-LG+<"*P\S=2`=&JS5Y(DY7CT!03 +MHW%SJ900'-CH(?!5OE0H$4K#Z(2OI<]5&X]"W)0TM&W$$F3GQ;,]!=OAC50% +M0^&+<+E;OMQ$NM:OT+PBPC.UIS`9V##GY2Q!&\VMUPK.(]I:2^O=\&*_+P2` +MSQ;RDC)U?8.'V.H3CD<%HEJFBY@;9B.?>RSO`Z*LF3IYHBM#W"L')Q8P*'5$ +MI:[H>M4CA0P,'R?M%_JJIKVCEK0L=U<&@>F8]L'_HK6W*/B7\WE^E8NL5 +M+I?\#G/4K>2*9==_\M[[L0]5+C",0H-Q]@"S>,%VY+S&9RV_!NCCNRF8KO6( +M28T%N->@QV&8E^W3$.1)I=N?7?EJJSC9/2,Q6"RQ1D!EYW_2]['@E-]V66+= +MX+Y:#/L9;[2A/3DB2BM[%M73D]L=*T8RO&7\@Z7?RP]2SH52\,/YJ[5R5U%+ +M\C@I[JTT!7[J)502-;,3_4CD1LZ/[*M()M=BD%P8[$]0H=F[=E:3WCZZPVGS +MD>(O_"VNIFCO;2\>S;\4GE8,#'FKL+O'E999,FO+U +M7<$4N)[FL%?263W@TVD]/=,)<[Z9USX_P:N+(U@S[()YQ\?5,[P*IF0`EX<@ +M^.GX!Z\?!M76Q]9KJ.5J2VHC579C,X1RIE<60O#5%:9',_ +M*B24>2\83;TIM&K.XR'DB*?&[E[R*%\:Q[[G[7`KF`F5F"GRR;%3/96U +M:,#>O*5M0,2^<..K%T*'C#.7>S8QPK;]>GJ20ZB]&P#K+\XL)Z!%).]9:1]) +MR\1H[/]I:U!ZX)^D+H-_B%48^]$&^>W09_2LD?(7X_,?`I%F(ZYPQVGI(><\ +M)S;)H(Z3?+J.>U1-^.1=Y_!_[\AU;E=5CTIR`9EED2T]PYY@&97N0+EW$`C5 +M50K)B)UG(Z5[<"$Y]:/>WF)'F4:'`\G^6@>.C_Q&S$7X(#A#:\HHDPNA3&Q[ +MGN._G\F.-KJD/R9IWQ#JQ3DBJX.RC+-W#,%&5$-W^>:=^63U;.?UHG"+IEJ< +MM^F2KMRWL)07J'E:JU:B@6KD-2X@J&32G>R_PV +MSJ\"11HX4^R3--6FN`]3E9[S\+$U!X0VOR)N1;HN#Y_Y&M2WYN`X)<(>`&W0 +M2SN#@M8>+=04++7&-!FD76*=WO:L99[,FZL> +MO#5R7EMF=ZWCA#?>]5C)I=_E1H^SDQX72:*)?L)AVKW"Z=S\8$7;;"1R0H51 +M5I@-MLZ()+]B88&)P^C^S;8D62W$"V.Z-GU"DI\TBOGK&8BW*H4LOMG])),V +MD\436(;$T\J.LQ[-]\&@2@!_UAZ\'\6,*A"R[6_QUV7%5=0M40X<0!#PYXZ' +MZ":.-1>U'DD=JHOL]XD5B5K[/^D;$VQ6YD\E(L)O2SX*B?/\!KG%A>^4)"'P +M9O\TIJ'OF%R%G7)H99X0_6_YDG$`RV4+ZNU**RUAOWUCW'6S(%)KCB&FT*J* +M`&0U;``BUN4KQ<01(`"X)ED'5'57KXT,%'-!\.D71?[:@&6;[$X$SBATYB;" +M7RH6L$VOJWCPADUR@>/DE]Y+FY'CP8*DV8XJO<;,.8,$EX:32RB_\T]13VFQ +M<+#:+Z2/"T_B-````00&``$)AWL`!PL!``(A(0$#`0L!``RA**$H``@*`>'?U2E@?=@^5X!K6EVT<$4NCHF?DMTN)_D0A*']W)L'Z%[C!D#%Y!:S#"T[CWFG]LXC']WLL'!9\"+`GHW+D/-^/!QXPGPB*2!. +M&?09NH<7;YVN5R,.-)TZ,3Z02@1?D6E^K*PC3[:&6'/!,LVQ%I$W&4[9AN4H +M(CO]U]07P);P2!)3%9:,R>I3?`MRC-]B-0Q"VZZ/O5-9%`@K-K4V1BV(]-*\EV(]UK_[`!>/-93[9'TW>4C[PM_CL +MD/O':;6X+-;Z,AK??'U1&%LC>HO773Q5J_0Y9--2OI+3= +MQH_VD')4E65;)ZC;-27Z?WZ`QKO&#T#'A<1UYZ/ +MQR6=`OU_Q@1`D`""M0F.^4JB]:>K3E +M.L"=A%OKG9\4]`](:-9)`_U74PFQ?5]B:'LYYX"!(O`?Z)O;ZYGAX+NX/^TX +M0K75$*-U`.[W!@/&3>#LK>&,$^-7LYGR.NW.]OR5ZUID9$)KF83C3_(T`VC:+$#)> +M_J)O-N(.,D9*@##LJ#L6)@"0(SIS23[971FJOCGB:F-@KH8 +M^NW=UPME7UOPB-B1R-20(%:V"C(Z6^LP$9O9*_5KJD2/(NU"#J(66A;9L[:@ +M:DQ*AA6U(]38*!(>D&:^#<2X.9/]B0Z[ER1POL6BS5EKD4]@6C465`N[(]*, +M1]6:T99]16KXHV0E2G^R%J-\H(^K1V;-N5RH!KF8Z2U).4>YC.EJI#>:]WOP +MU+8[3UBF4]5WKQ5W619%/BB*5WQ*JCJ19!*@4K]%=/7W0`@Z6-E1HN>[U7CE +M]`%]W)W`!IA-F/W8K]60#\0E4_CUD38Q!:6P[F_!<$U'#-&1$:JM8!VZSK$G +M&%Q9ANEF4EB^Z7:L6>3E6P4(^ +M`YH,USJ&*2&?3ML,ADZAK_>3'O!:"CB($W22J.O\G$CE..,RWP:DJL#='-?Y +M*2W,E'ZN]S``7)5/K;EZA>=GJO:77RNU+S"3#]V\A^_.YDJTUN'\D&V.:+'M +MX;1P_8RY.GKK:U['95&:`LQT2+^G+9DJ.'SBT($]6)6X>4%8E6R>QI9F&#%( +MB*1]Q80;B^[*-X?J+PGIHY#5CZ1N,Q'MEK5W?+BE2'R6^D2A:W!POR\V79;) +MM,8D?C2](B[0)SW)<3]RNOH4SEX?06<'J[<&OJDWA_MH@C)87X.(@/:FHB[` +M,`9=MXE'=%I_EJ2UB:JTC;*.H\3]&GE^X"DQ2TM#53B$QR12B +MEY?G$IQ57"8+OXW?3YF.%:61.T?Z->H2PWS!2AZ1IJY=:(*.UB?-JHMJ2?(%&IW=*:VRA\'=*T'"ZH5?UCU_5-H\VD9?(PNF;GJ;Z +MIL_*^CQVY;0)8N:T3="V$US\M"[D)[YJ/YD;OG +M@D+M+#Q3%@?=[)`;XS$B,2A*D?),85#?5^10N\2#"DKDL,, +MA6NA6U>I0\:CP/E9,(`8^.8@7I94A`P5?74_%[NN#<4@18-TB>M\32JW*?&O +M&=[=TN=VPE\@Y$8\&Z>Q>PAZ_GSR?Q/=.LDV\='/S7*`N*V0>BB"5_9JF?=, +MB*\+@&D8[#W[^X*`ATPU[WRK">MUA3+YLZQ\?"F7!X.V0T9W4[?/_1+<+UZ? +M:=0+KHF`W(I%SP1C%MDQJ^M*Y^5@TE1[83"SIQ_<'R'=AR4E7C5"EJ0YCT8D +M4FI1(Y(H;#Y[A*;Y!Z7D=&&F^Z4ERQ>CQD$C;.GCY>JDTZPQ1?"4W0^D#T9` +M)+,/HN?5_Y'H#_@M<,VE(0@(X\G3W(#_S4C>D-7S/E`Z3DS#+M**S]YQ%*N@9RMHM#M?<:\,=^D +MA*_IR`W7;2OJK".[-`T'*-#209OXHBX0B%$P3#$5D+VE1/4$'J.D^9I[V+VH +M&WN#Y"AO'3Q`6"T60J[ZCT,*T1(=4I;!&6+F4G!]D75J$F5>:'%?M'DE8&I@ +MQ_L``00&``$)A\P`!PL!``(A(0$1!`,#"`4!``S06!'06!$`"`H!339;:P`` +M!0$9#P```````````````````!$7`&@`=P`M`',`<`!A`'(`8P`V`#0````9 +;!``````4"@$`@,:@07(HVP$5!@$`((#]@0`` +` +end --- /dev/null +++ contrib/libarchive/libarchive/test/test_read_format_7zip_sfx_elf.elf.uu @@ -0,0 +1,9442 @@ +begin 775 test_read_format_7zip_sfx_elf.elf +M?T5,1@(!`0````````````,`/@`!````D`0!``````!``````````&!R!@`` +M`````````$``.``.`$``(0`@``8````$````0`````````!``````````$`` +M````````$`,````````0`P````````@``````````P````0```"4`P`````` +M`)0#````````E`,````````<`````````!P``````````0`````````!```` +M!````````````````````````````````````"B:````````*)H````````` +M$`````````$````%`````*``````````H`````````"@````````/:@$```` +M```]J`0````````0`````````0````0`````4`4```````!0!0```````%`% +M``````"`U@```````(#6`````````!`````````!````!@````@V!@`````` +M"#8&```````(-@8``````(@Z````````>)$`````````$`````````(````& +M````N&H&``````"X:@8``````+AJ!@``````$`(````````0`@````````@` +M````````!`````0```!0`P```````%`#````````4`,````````@```````` +M`"``````````"``````````$````!````'`#````````<`,```````!P`P`` +M`````"0`````````)``````````$``````````0````$````A"4&``````"$ +M)08``````(0E!@``````_`````````#\``````````0`````````4^5T9`0` +M``!0`P```````%`#````````4`,````````@`````````"``````````"``` +M``````!0Y71D!````#![!0``````,'L%```````P>P4``````$P;```````` +M3!L````````$`````````%'E=&0&```````````````````````````````` +M`````````````````````````!``````````4N5T9`0````(-@8```````@V +M!@``````"#8&``````#X.0```````/@Y`````````0`````````$````$``` +M``4```!'3E4``H``P`0````!``````````0````4`````P```$=.50"0T\R# +MH+X,"UX.#8M-C0N0$``!(`````````````````````````M`(``!(` +M````````````````````````G0(``!(`````````````````````````F`0` +M`!$`````````````````````````=00``!(````````````````````````` +M^0,``!$`````````````````````````)@(``!(````````````````````` +M````,0$``!(`````````````````````````.P```!(````````````````` +M````````_@(``!$`````````````````````````EP$``!(````````````` +M````````````IP$``!(`````````````````````````S0$``!(````````` +M````````````````@@0``!(`````````````````````````5@```!(````` +M````````````````````^@```!(`````````````````````````?@```!(` +M````````````````````````AP(``!(`````````````````````````>@(` +M`!(`````````````````````````E@,``!$````````````````````````` +MIP(``!(`````````````````````````,P```!(````````````````````` +M````J00``!(`````````````````````````8`0``!(````````````````` +M````````7`$``!(`````````````````````````N00``!$````````````` +M`````````````P(``!(`````````````````````````IP```!(````````` +M````````````````QP,``!(`````````````````````````\`$``!(````` +M````````````````````.@(``!(`````````````````````````9`,``!$` +M````````````````````````+@,``"``````````````````````````\P0` +M`!(`````````````````````````$@,``!(````````````````````````` +M\0(``!(`````````````````````````1P(``!(````````````````````` +M````[P$``!(`````````````````````````30$``!(````````````````` +M````````@`(``!(`````````````````````````'P,``"`````````````` +M````````````-`0``"(`````````````````````````2@,``"`````````` +M````````````````V````!(`````````````````````````;`(``!(````` +M````````````````````<0$``!(`````````````````````````D`0``!(` +M````````````````````````QP$``!(`````````````````````````$P`` +M`"(``````````````````````````%]?;&EB8U]S=&%R=%]M86EN`%]?8WAA +M7V9I;F%L:7IE`%]?%]M96UA;&EG;@!P=&AR96%D7VUU=&5X7VQO8VL`<'1H%]U;FQO8VL`<'1H5]C:&L`7U]W;65M8W!Y7V-H:P!P=&AR96%D7VUU +M=&5X7V1E0!F<'5T8P!F +M<'5T7-C;VYF`'-Y0!W8W-C;7`` +M&%B:78Q,C%?7W9M:5]C;&%S7!E7VEN9F]%`%]:5$E02V,`7UI425!+ +M=P!?7V-X85]C86QL7W1E&%B:78Q,3=?7V-L87-S7W1Y<&5?:6YF +M;T4`7UI45DXQ,%]?8WAX86)I=C$R,%]?&%?86QL +M;V-A=&5?97AC97!T:6]N`%]?9WAX7W!E7!E +M7VEN9F]%`%]?9V-C7W!E%P&```````X/`8```````@`````````(`X" +M``````!`/`8```````@`````````H`X"``````!(/`8```````@````````` +M`"@"``````!0/`8```````@`````````L`X"``````!@/`8```````@````` +M````R%P&``````!H/`8```````@`````````0`,"``````!P/`8```````@` +M````````P`,"``````!X/`8```````@`````````X&L"``````"`/`8````` +M``@`````````4',"``````"(/`8```````@`````````P&X"``````"0/`8` +M``````@`````````L'0"``````"@/`8```````@`````````>%T&``````"H +M/`8```````@`````````D``"``````"P/`8```````@`````````D`("```` +M``"X/`8```````@`````````D&<"``````#`/`8```````@`````````4&P" +M``````#(/`8```````@`````````@&T"``````#0/`8```````@````````` +M$&X"``````#8/`8```````@`````````D&\"``````#@/`8```````@````` +M````4'$"``````#H/`8```````@`````````$(X"``````#P/`8```````@` +M````````,&\"````````/08```````@`````````>%T&```````(/08````` +M``@`````````@`("```````0/08```````@`````````T`("```````8/08` +M``````@``````````&L"```````@/08```````@`````````L&X"```````P +M/08```````@`````````>%T&```````X/08```````@`````````<`("```` +M``!`/08```````@`````````P`("``````!(/08```````@`````````(&H" +M``````!0/08```````@`````````0'$"``````!@/08```````@````````` +M>%T&``````!H/08```````@`````````8`("``````!P/08```````@````` +M````L`("``````!X/08```````@`````````0&D"``````"`/08```````@` +M````````X'("``````"0/08```````@`````````>%T&``````"8/08````` +M``@`````````4`("``````"@/08```````@`````````H`("``````"H/08` +M``````@`````````8&@"``````"P/08```````@`````````P)$"``````"X +M/08```````@`````````\'("``````#(/08```````@`````````8%X&```` +M``#0/08```````@`````````0`0"``````#8/08```````@`````````@/T! +M``````#@/08```````@`````````L!,"``````#H/08```````@````````` +MP(D"``````#P/08```````@`````````T`L"``````#X/08```````@````` +M````8`L"````````/@8```````@`````````8`P"```````(/@8```````@` +M````````\`P"```````0/@8```````@`````````,'T"```````8/@8````` +M``@`````````$`D"```````@/@8```````@`````````H`D"```````H/@8` +M``````@`````````P$X"```````P/@8```````@`````````\"0"```````X +M/@8```````@`````````,`@"``````!`/@8```````@`````````4`@"```` +M``!(/@8```````@`````````8`T"``````!0/@8```````@`````````D`T" +M``````!8/@8```````@`````````P`T"``````!@/@8```````@````````` +M\`T"``````!P/@8```````@`````````8%X&``````!X/@8```````@````` +M````(`@"``````"`/@8```````@`````````,/X!``````"(/@8```````@` +M`````````","``````"0/@8```````@`````````$`P"``````"@/@8````` +M``@`````````8%X&``````"H/@8```````@`````````$`@"``````"P/@8` +M``````@`````````(/X!``````"X/@8```````@`````````D"$"``````#` +M/@8```````@`````````D`L"``````#0/@8```````@`````````8%X&```` +M``#8/@8```````@```````````@"``````#@/@8```````@`````````$/X! +M``````#H/@8```````@`````````("`"``````#P/@8```````@````````` +ML`P"``````#X/@8```````@`````````,`T"```````(/P8```````@````` +M````8%X&```````0/P8```````@`````````\`<"```````8/P8```````@` +M`````````/X!```````@/P8```````@`````````P!X"```````H/P8````` +M``@`````````P'\"```````X/P8```````@`````````8%X&``````!`/P8` +M``````@`````````X`<"``````!(/P8```````@`````````\/T!``````!0 +M/P8```````@`````````4!T"``````!8/P8```````@`````````8`D"```` +M``!@/P8```````@`````````X`D"``````!P/P8```````@`````````8%X& +M``````!X/P8```````@`````````T`<"``````"`/P8```````@````````` +MX/T!``````"(/P8```````@`````````\!L"``````"0/P8```````@````` +M````P$\"``````"@/P8```````@`````````8%X&``````"H/P8```````@` +M````````P`<"``````"P/P8```````@`````````T/T!``````"X/P8````` +M``@`````````D!H"``````#`/P8```````@`````````\"<"``````#0/P8` +M``````@`````````8%X&``````#8/P8```````@`````````L`<"``````#@ +M/P8```````@`````````P/T!``````#H/P8```````@`````````,!D"```` +M``#P/P8```````@`````````0`@"``````#X/P8```````@`````````8`@" +M```````(0`8```````@`````````8%X&```````00`8```````@````````` +MH`<"```````80`8```````@`````````L/T!```````@0`8```````@````` +M````T!<"```````H0`8```````@`````````@`T"```````X0`8```````@` +M````````8%X&``````!`0`8```````@`````````D`<"``````!(0`8````` +M``@`````````H/T!``````!00`8```````@`````````#\&``````"P1`8```````@`````````V#\&``````"X +M1`8```````@`````````0$`&``````#`1`8```````@`````````,#8&```` +M``#(1`8```````@`````````R#8&``````#01`8```````@`````````*#<& +M``````#81`8```````@`````````@`4!``````#@1`8```````@````````` +M(`P!``````#H1`8```````@`````````,'$!``````#P1`8```````@````` +M````6$,&``````#X1`8```````@`````````X$,&````````108```````@` +M````````@$(&```````(108```````@`````````^$(&```````0108````` +M``@`````````>&$&```````8108```````@`````````R$$&```````@108` +M``````@`````````.$$&```````H108```````@`````````J$`&```````P +M108```````@`````````J#P&```````X108```````@`````````.#T&```` +M``!(108```````@`````````:&(&``````!0108```````@`````````$,L# +M``````!8108```````@`````````,,L#``````!@108```````@````````` +M,!`$``````!H108```````@`````````P/0#``````!P108```````@````` +M`````/4#``````!X108```````@`````````@/H#``````"`108```````@` +M````````P/H#``````"0108```````@`````````@&(&``````"8108````` +M``@`````````<,<#``````"@108```````@`````````L,H#``````"H108` +M``````@`````````,/X#``````"P108```````@`````````,`\$``````"X +M108```````@`````````L`\$``````#`108```````@`````````X.@#```` +M``#(108```````@`````````D`D$``````#0108```````@`````````L.T# +M``````#8108```````@`````````$.0#``````#@108```````@````````` +MP.X#``````#H108```````@`````````8#0$``````#P108```````@````` +M````$/`#``````#X108```````@`````````X/`#````````1@8```````@` +M````````\,L#```````(1@8```````@``````````.@#```````01@8````` +M``@``````````/D#```````81@8```````@`````````$/L#```````@1@8` +M``````@`````````T/L#```````P1@8```````@`````````@&(&```````X +M1@8```````@``````````/`#``````!`1@8```````@`````````L$,$```` +M``!(1@8```````@`````````T/`#``````!01@8```````@`````````L/0# +M``````!81@8```````@`````````$,P#``````!H1@8```````@````````` +M@&(&``````!P1@8```````@`````````D,D#``````!X1@8```````@````` +M````\,H#``````"`1@8```````@`````````(``$``````"(1@8```````@` +M````````<.@#``````"81@8```````@`````````@&(&``````"@1@8````` +M``@`````````<,@#``````"H1@8```````@`````````T,H#``````"P1@8` +M``````@`````````(/\#``````"X1@8```````@`````````8/D#``````#( +M1@8```````@`````````@&(&``````#01@8```````@`````````$,L#```` +M``#81@8```````@`````````,,L#``````#@1@8```````@`````````,!`$ +M``````#H1@8```````@`````````P/0#``````#P1@8```````@````````` +M`/4#``````#X1@8```````@`````````H/P#````````1P8```````@````` +M````8/T#```````01P8```````@`````````^&(&```````81P8```````@` +M````````8"\#```````@1P8```````@`````````4#,#```````H1P8````` +M``@`````````<(`#```````P1P8```````@`````````H$H#```````X1P8` +M``````@`````````D#,#``````!`1P8```````@`````````T)T#``````!( +M1P8```````@`````````P#8#``````!01P8```````@`````````H(<#```` +M``!81P8```````@`````````0,(#``````!@1P8```````@`````````(#<# +M``````!H1P8```````@`````````<#0#``````!X1P8```````@````````` +M^&(&``````"`1P8```````@`````````4#(#``````"(1P8```````@````` +M````@#,#``````"01P8```````@`````````P'0#``````"81P8```````@` +M````````$,8#``````"H1P8```````@`````````^&(&``````"P1P8````` +M``@`````````4#$#``````"X1P8```````@`````````<#,#``````#`1P8` +M``````@``````````'`#``````#(1P8```````@`````````$#@#``````#8 +M1P8```````@`````````^&(&``````#@1P8```````@`````````4#`#```` +M``#H1P8```````@`````````8#,#``````#P1P8```````@`````````,&L# +M``````#X1P8```````@`````````D#0#```````(2`8```````@````````` +M8&,&```````02`8```````@`````````D)@"```````82`8```````@````` +M````()D"```````@2`8```````@`````````D!T#```````H2`8```````@` +M````````$+<"```````X2`8```````@`````````P&,&``````!`2`8````` +M``@`````````\)8"``````!(2`8```````@`````````<)@"``````!02`8` +M``````@`````````\+P"``````!82`8```````@``````````-$"``````!@ +M2`8```````@`````````P+`"``````!H2`8```````@`````````H)D"```` +M``!P2`8```````@`````````4,$"``````!X2`8```````@``````````!X# +M``````"`2`8```````@`````````\*$"``````"(2`8```````@````````` +ML)D"``````"02`8```````@`````````P)D"``````"82`8```````@````` +M````L)D"``````"@2`8```````@`````````P)D"``````"H2`8```````@` +M````````()H"``````"P2`8```````@`````````8)H"``````"X2`8````` +M``@`````````L)D"``````#`2`8```````@`````````X)D"``````#02`8` +M``````@`````````P&,&``````#82`8```````@`````````L)<"``````#@ +M2`8```````@`````````@)@"``````#H2`8```````@`````````@+T"```` +M``#P2`8```````@`````````0)H"``````#X2`8```````@`````````T)H" +M````````208```````@`````````T)D"```````(208```````@````````` +M`)H"```````8208```````@`````````&&0&```````@208```````@````` +M````8)8"```````H208```````@`````````X)8"```````P208```````@` +M````````\)P"```````X208```````@`````````T*<"``````!(208````` +M``@`````````4&0&``````!0208```````@`````````\)4"``````!8208` +M``````@`````````4)8"``````!@208```````@`````````8*<"``````!P +M208```````@`````````B&0&``````!X208```````@`````````0)4"```` +M``"`208```````@`````````P)4"``````"(208```````@`````````D)P" +M``````"0208```````@`````````T)4"``````"@208```````@````````` +MT&0&``````"H208```````@`````````L)("``````"P208```````@````` +M````$),"``````"X208```````@`````````,),"``````#`208```````@` +M````````\/`"``````#(208```````@`````````@/4"``````#0208````` +M``@`````````8),"``````#8208```````@`````````0*X"``````#@208` +M``````@`````````,*\"``````#H208```````@`````````0,<"``````#P +M208```````@`````````P/D"``````#X208```````@`````````H),"```` +M````2@8```````@``````````*P"```````(2@8```````@`````````X*T" +M```````82@8```````@`````````T&0&```````@2@8```````@````````` +MT*T"```````H2@8```````@`````````$*X"```````P2@8```````@````` +M````%P%``````"(3P8```````@`````````@5P%``````"0 +M3P8```````@`````````AUP%``````"83P8```````@`````````D5P%```` +M``"@3P8```````@`````````FUP%``````"H3P8```````@`````````J%P% +M``````"P3P8```````@`````````M%P%``````"X3P8```````@````````` +MQ%P%``````#`3P8```````@`````````2ET%``````#(3P8```````@````` +M````R%P%``````#03P8```````@`````````\E@%``````#83P8```````@` +M````````S5P%``````#@3P8```````@`````````U5P%``````#H3P8````` +M``@`````````X5P%``````#P3P8```````@`````````YEP%``````#X3P8` +M``````@`````````[%P%````````4`8```````@`````````WUX%```````( +M4`8```````@`````````\EP%```````04`8```````@`````````^UP%```` +M```84`8```````@`````````!UT%```````@4`8```````@`````````#UT% +M```````H4`8```````@`````````%5T%```````P4`8```````@````````` +M'5T%```````X4`8```````@`````````)%T%``````!`4`8```````@````` +M````2UH%``````!(4`8```````@`````````,%T%``````!04`8```````@` +M````````-ET%``````!84`8```````@`````````/5T%``````!@4`8````` +M``@`````````15T%``````!H4`8```````@`````````3UT%``````!P4`8` +M``````@`````````5ET%``````!X4`8```````@`````````85T%``````"` +M4`8```````@`````````MEX%``````"(4`8```````@`````````95T%```` +M``"04`8```````@`````````UT% +M``````"@4`8```````@`````````BUT%``````"H4`8```````@````````` +M15\%``````"P4`8```````@`````````FUT%``````"X4`8```````@````` +M````IET%``````#`4`8```````@`````````NET%``````#(4`8```````@` +M````````QET%``````#04`8```````@`````````RUT%``````#84`8````` +M``@`````````.5P%``````#@4`8```````@`````````V5T%``````#H4`8` +M``````@`````````Y%T%``````#P4`8```````@`````````[UT%``````#X +M4`8```````@`````````_%T%````````408```````@``````````EX%```` +M```(408```````@`````````#5X%```````0408```````@`````````%EX% +M```````8408```````@`````````(EX%```````@408```````@````````` +M,UX%```````H408```````@`````````-UX%```````P408```````@````` +M````/UX%```````X408```````@`````````1%X%``````!`408```````@` +M````````2EX%``````!(408```````@`````````4EX%``````!0408````` +M``@`````````'5L%``````!8408```````@`````````'5L%``````!@408` +M``````@`````````75X%``````!H408```````@`````````9EX%``````!P +M408```````@`````````>%X%``````!X408```````@`````````;EX%```` +M``"`408```````@`````````@%X%``````"(408```````@`````````EUX% +M``````"0408```````@`````````I%X%``````"8408```````@````````` +ML%X%``````"@408```````@`````````Q%X%``````"H408```````@````` +M````T5X%``````"P408```````@`````````V5X%``````"X408```````@` +M````````YUX%``````#`408```````@`````````\5X%``````#(408````` +M``@`````````8&4%``````#0408```````@`````````!5\%``````#8408` +M``````@`````````4EH%``````#@408```````@`````````&U\%``````#H +M408```````@`````````U%T%``````#P408```````@`````````+E\%```` +M``#X408```````@`````````.%\%````````4@8```````@`````````/E\% +M```````(4@8```````@`````````2%\%```````04@8```````@````````` +M4E\%```````84@8```````@`````````6U\%```````@4@8```````@````` +M````95\%```````H4@8```````@`````````<5\%```````P4@8```````@` +M````````>%\%```````X4@8```````@`````````B5\%``````!`4@8````` +M``@`````````D5\%``````!(4@8```````@`````````FE\%``````!04@8` +M``````@`````````IU\%``````!84@8```````@`````````M%\%``````!@ +M4@8```````@`````````OE\%``````!H4@8```````@`````````F$4&```` +M``!P4@8```````@`````````<$8&``````!X4@8```````@`````````0$@& +M``````"`4@8```````@`````````X&D&``````"(4@8```````@````````` +M>&D&``````"H4@8```````@`````````B'`&``````"P4@8```````@````` +M`````6`%``````"X4@8```````@``````````6`%``````#04@8```````@` +M`````````&4#```````04P8```````@`````````^ED%```````84P8````` +M``@`````````_5\%```````P4P8```````@`````````(*,"``````!@4P8` +M``````@``````````&8"``````!X4P8```````@`````````!&`%``````"@ +M4P8```````@`````````4%`"``````"X4P8```````@`````````"F`%```` +M``#@4P8```````@`````````0$<"``````#X4P8```````@`````````#V`% +M```````@5`8```````@`````````D$8"```````X5`8```````@````````` +M%&`%``````!@5`8```````@`````````D%@!``````!X5`8```````@````` +M````&F`%``````"@5`8```````@`````````(%@!``````"H5`8```````@` +M````````(%@!``````"X5`8```````@`````````(&`%``````#@5`8````` +M``@`````````T%#\&```````85P8```````@`````````V#\&```````@5P8` +M``````@`````````0$`&```````H5P8```````@`````````F$4&```````P +M5P8```````@`````````<$8&```````X5P8```````@`````````0$@&```` +M``!`5P8```````@`````````J$H&``````!(5P8```````@`````````2$L& +M``````!05P8```````@`````````X$L&``````!@5P8```````@````````` +M8%`%``````!H5P8```````@`````````@%L&``````!X5P8```````@````` +M````@%`%``````"`5P8```````@`````````@%L&``````"05P8```````@` +M````````H%`%``````"@5P8```````@`````````N%@&``````"P5P8````` +M``@`````````2%D&``````#`5P8```````@`````````B%H&``````#05P8` +M``````@`````````B%@&``````#@5P8```````@`````````6%H&``````#P +M5P8```````@`````````<%<&````````6`8```````@`````````6%<&```` +M```06`8```````@`````````D%L&```````H6`8```````@`````````P%`% +M```````X6`8```````@`````````X%`%``````!(6`8```````@````````` +MX%D&``````!86`8```````@`````````2%D&``````!H6`8```````@````` +M````D%L&``````!X6`8```````@`````````(%@&``````"06`8```````@` +M`````````%$%``````"86`8```````@`````````@%L&``````"H6`8````` +M``@`````````,%$%``````"P6`8```````@`````````@%L&``````#`6`8` +M``````@`````````4%$%``````#(6`8```````@`````````@%L&``````#8 +M6`8```````@`````````<%$%``````#H6`8```````@`````````N%@&```` +M``#X6`8```````@`````````H%@&```````(608```````@`````````H%L& +M```````8608```````@`````````B%H&```````H608```````@````````` +MB%@&```````X608```````@`````````D%L&``````!0608```````@````` +M````H%$%``````!8608```````@`````````@%L&``````!H608```````@` +M````````T%$%``````!X608```````@`````````X%D&``````"(608````` +M``@`````````2%D&``````"8608```````@`````````D%L&``````"P608` +M``````@`````````\%$%``````#`608```````@`````````X%D&``````#0 +M608```````@`````````D%L&``````#H608```````@`````````$%(%```` +M``#P608```````@`````````@%L&````````6@8```````@`````````,%(% +M```````06@8```````@`````````X%D&```````@6@8```````@````````` +MD%L&```````X6@8```````@`````````4%(%``````!(6@8```````@````` +M````@%(%``````!06@8```````@`````````,%H&``````!@6@8```````@` +M````````L%(%``````!H6@8```````@`````````@%L&``````!X6@8````` +M``@`````````X%(%``````"`6@8```````@`````````@%L&``````"06@8` +M``````@`````````$%,%``````"86@8```````@`````````@%L&``````"H +M6@8```````@`````````,%,%``````"P6@8```````@`````````@%L&```` +M``#`6@8```````@`````````4%,%``````#06@8```````@`````````H%H& +M``````#@6@8```````@`````````B%H&``````#P6@8```````@````````` +M<%H&````````6P8```````@`````````6%H&```````06P8```````@````` +M````D%L&```````@6P8```````@`````````0%H&```````X6P8```````@` +M````````<%,%``````!`6P8```````@`````````@%L&``````!06P8````` +M``@`````````D%,%``````!@6P8```````@`````````,%L&``````!P6P8` +M``````@`````````D%L&``````"(6P8```````@`````````J%,%``````"8 +M6P8```````@`````````P%,%``````"H6P8```````@`````````T%,%```` +M``"P6P8```````@`````````@%L&``````#`6P8```````@`````````\%,% +M``````#06P8```````@`````````H%L&``````#@6P8```````@````````` +MD%L&``````#X6P8```````@`````````J&@%```````(7`8```````@````` +M````8%T&```````87`8```````@`````````D%L&```````P7`8```````@` +M````````P&@%```````X7`8```````@`````````@%L&``````!(7`8````` +M``@`````````X&@%``````!87`8```````@`````````*%P&``````!H7`8` +M``````@`````````D%L&``````"`7`8```````@``````````&D%``````"0 +M7`8```````@`````````H%L&``````"@7`8```````@`````````D%L&```` +M``"X7`8```````@`````````(&D%``````#`7`8```````@`````````,%L& +M``````#07`8```````@`````````,&D%``````#@7`8```````@````````` +ML%P&``````#P7`8```````@`````````D%L&```````(708```````@````` +M````4&D%```````0708```````@`````````@%L&```````@708```````@` +M````````<&D%```````H708```````@`````````@%L&```````X708````` +M``@`````````D&D%``````!`708```````@`````````@%L&``````!0708` +M``````@`````````L&D%``````!8708```````@`````````@%L&``````!H +M708```````@`````````R&D%``````!P708```````@`````````H%L&```` +M``"`708```````@`````````X&D%``````"0708```````@`````````8%T& +M``````"@708```````@`````````2%T&``````"P708```````@````````` +M,%T&``````#`708```````@`````````&%T&``````#0708```````@````` +M`````%T&``````#@708```````@`````````D%L&``````#X708```````@` +M````````\&D%```````(7@8```````@`````````$&H%```````07@8````` +M``@`````````@%L&```````@7@8```````@`````````,&H%```````H7@8` +M``````@`````````@%L&```````X7@8```````@`````````4&H%``````!` +M7@8```````@`````````@%L&``````!07@8```````@`````````<&H%```` +M``!87@8```````@`````````@%L&``````!H7@8```````@`````````D&H% +M``````!X7@8```````@`````````N%@&``````"(7@8```````@````````` +M2%X&``````"87@8```````@`````````,%X&``````"H7@8```````@````` +M````H%@&``````"X7@8```````@`````````H%L&``````#(7@8```````@` +M````````&%X&``````#87@8```````@`````````,%L&``````#H7@8````` +M``@``````````%X&``````#X7@8```````@`````````6%H&```````(7P8` +M``````@`````````X%\&```````87P8```````@`````````<%\&```````H +M7P8```````@`````````2%D&```````X7P8```````@`````````D%L&```` +M``!(7P8```````@`````````\%T&``````!@7P8```````@`````````H&H% +M``````!H7P8```````@`````````B%\&``````!X7P8```````@````````` +MP&H%``````"`7P8```````@`````````@%L&``````"07P8```````@````` +M````X&H%``````"@7P8```````@`````````X%D&``````"P7P8```````@` +M````````<%\&``````#`7P8```````@`````````D%L&``````#87P8````` +M``@``````````&L%``````#H7P8```````@`````````(&L%``````#P7P8` +M``````@`````````@%L&````````8`8```````@`````````0&L%```````0 +M8`8```````@`````````X%D&```````@8`8```````@`````````X%\&```` +M```P8`8```````@`````````D%L&``````!`8`8```````@`````````T%\& +M``````!88`8```````@`````````8&L%``````!H8`8```````@````````` +M^%\&``````!X8`8```````@`````````2%D&``````"08`8```````@````` +M````@&L%``````"@8`8```````@`````````N%@&``````"P8`8```````@` +M````````2%D&``````#`8`8```````@`````````B%H&``````#08`8````` +M``@`````````B%@&``````#@8`8```````@`````````D%L&``````#X8`8` +M``````@`````````H&L%```````(808```````@`````````N%@&```````8 +M808```````@`````````2%D&```````H808```````@`````````B%H&```` +M```X808```````@`````````B%@&``````!(808```````@`````````6%H& +M``````!8808```````@`````````D%L&``````!P808```````@````````` +M^%\&``````"0808```````@`````````\%T"``````"8808```````@````` +M`````/P!``````"@808```````@``````````%T"``````#`808```````@` +M````````^%\&``````#@808```````@`````````X%T"``````#P808````` +M``@`````````\&T%````````8@8```````@`````````(&X%```````(8@8` +M``````@`````````@%L&```````88@8```````@`````````4&X%```````H +M8@8```````@`````````@&X%```````P8@8```````@`````````<&4&```` +M``!`8@8```````@`````````H&X%``````!(8@8```````@`````````@%L& +M``````!88@8```````@`````````T&X%``````!@8@8```````@````````` +M<&4&``````!P8@8```````@`````````\&X%``````!X8@8```````@````` +M````Z&$&``````"(8@8```````@`````````$&\%``````"88@8```````@` +M````````(&(&``````"H8@8```````@`````````$&(&``````"X8@8````` +M``@`````````^&$&``````#(8@8```````@`````````B&4&``````#88@8` +M``````@`````````:&(&``````#H8@8```````@`````````D%L&```````` +M8P8```````@`````````,&\%```````08P8```````@`````````4&(&```` +M```@8P8```````@`````````.&(&```````P8P8```````@`````````B&4& +M``````!`8P8```````@`````````*%P&``````!08P8```````@````````` +MD%L&``````!H8P8```````@`````````8&\%``````!X8P8```````@````` +M````,%L&``````"(8P8```````@`````````D%L&``````"@8P8```````@` +M````````H&\%``````"P8P8```````@`````````P&\%``````"X8P8````` +M``@`````````@%L&``````#(8P8```````@`````````X&\%``````#88P8` +M``````@`````````>&8&``````#H8P8```````@`````````J&,&``````#X +M8P8```````@`````````D%L&```````(9`8```````@`````````F&,&```` +M```@9`8```````@``````````'`%```````P9`8```````@`````````H%L& +M``````!`9`8```````@`````````D%L&``````!89`8```````@````````` +M0'`%``````!H9`8```````@`````````@%L&``````!X9`8```````@````` +M````D%L&``````"09`8```````@`````````<'`%``````"@9`8```````@` +M````````*%P&``````"P9`8```````@`````````D%L&``````#(9`8````` +M``@`````````D'`%``````#89`8```````@`````````L'`%``````#H9`8` +M``````@`````````@%L&``````#X9`8```````@`````````P&0&```````( +M908```````@`````````D%L&```````@908```````@`````````T'`%```` +M```P908```````@`````````Z'`%``````!`908```````@``````````'$% +M``````!0908```````@`````````&&4&``````!@908```````@````````` +M*&4&``````!X908```````@`````````('$%``````"`908```````@````` +M````@%L&``````"0908```````@`````````,'$%``````"8908```````@` +M````````@%L&``````"H908```````@`````````8'$%``````"P908````` +M``@`````````@%L&``````#`908```````@`````````@'$%``````#(908` +M``````@`````````@%L&``````#8908```````@`````````H'$%``````#@ +M908```````@`````````@%L&``````#P908```````@`````````P'$%```` +M````9@8```````@`````````T&4&```````09@8```````@`````````N&4& +M```````@9@8```````@`````````H&4&```````P9@8```````@````````` +MB&4&``````!`9@8```````@`````````<&4&``````!09@8```````@````` +M````D%L&``````!H9@8```````@`````````X'$%``````!P9@8```````@` +M````````@%L&``````"`9@8```````@`````````^'$%``````"(9@8````` +M``@`````````@%L&``````"89@8```````@`````````$'(%``````"H9@8` +M``````@`````````>&8&``````"X9@8```````@`````````8&8&``````#( +M9@8```````@`````````D%L&``````#@9@8```````@`````````@&T%```` +M``#P9@8```````@`````````P&T%``````#X9@8```````@`````````V&8& +M```````(9P8```````@`````````P&0&```````@9P8```````@````````` +MP*,"``````!H9P8```````@`````````*&4&``````"09P8```````@````` +M````4'0%``````"@9P8```````@`````````8%T&``````"P9P8```````@` +M````````2%T&``````#`9P8```````@`````````D%L&``````#89P8````` +M``@`````````<'0%``````#H9P8```````@`````````,%L&``````#X9P8` +M``````@`````````D%L&```````0:`8```````@`````````B'0%```````@ +M:`8```````@`````````@%L&```````P:`8```````@`````````D%L&```` +M``!(:`8```````@`````````H'0%``````!8:`8```````@`````````,%L& +M``````!H:`8```````@`````````D%L&``````"`:`8```````@````````` +MJ&,&``````#(:`8```````@`````````>&8&``````!`:08```````@````` +M````B&4&``````!P:08```````@`````````^&$&``````"@:08```````@` +M````````$&(&``````#8:08```````@`````````(&(&```````P:@8````` +M``@`````````>'@%``````!`:@8```````@`````````B'@%``````!0:@8` +M``````@`````````H'@%``````!@:@8```````@`````````P'@%``````!P +M:@8```````@`````````X'@%``````!X:@8```````@`````````.&H&```` +M``"(:@8```````@``````````'H%``````"8:@8```````@`````````H%L& +M``````"H:@8```````@`````````D%L&```````(<`8```````@````````` +M"'`&```````H<`8```````@``````````$(!```````P<`8```````@````` +M````V&8&```````X<`8```````@`````````Z&8&``````!`<`8```````@` +M````````6&H&``````!(<`8```````@`````````:&H&``````!0<`8````` +M``@`````````*&H&``````!8<`8```````@`````````.&H&``````!@<`8` +M``````@`````````2&H&``````!85P8```````$```!`````$`````````!P +M5P8```````$```!`````$`````````"(6`8```````$```!`````$``````` +M``"@6`8```````$```!`````$`````````"X6`8```````$```!`````$``` +M``````!(608```````$```!`````$`````````#@608```````$```!````` +M$`````````!`6@8```````$```!`````$`````````!86@8```````$```!` +M````$`````````!P6@8```````$```!`````$`````````"(6@8```````$` +M``!`````$`````````"@6@8```````$```!`````$``````````P6P8````` +M``$```!`````$`````````"@6P8```````$```!`````$``````````H7`8` +M``````$```!`````$`````````"P7`8```````$```!`````$``````````` +M708```````$```!`````$``````````8708```````$```!`````$``````` +M```P708```````$```!`````$`````````!(708```````$```!`````$``` +M``````!@708```````$```!`````$```````````7@8```````$```!````` +M$``````````87@8```````$```!`````$``````````P7@8```````$```!` +M````$`````````!(7@8```````$```!`````$`````````!87P8```````$` +M``!`````$`````````!P7P8```````$```!`````$`````````#@7P8````` +M``$```!`````$`````````#X808```````$```!`````$``````````@8@8` +M``````$```!`````$``````````X8@8```````$```!`````$`````````!0 +M8@8```````$```!`````$`````````!H8@8```````$```!`````$``````` +M``"H8P8```````$```!`````$`````````!P908```````$```!`````$``` +M``````"(908```````$```!`````$`````````"@908```````$```!````` +M$`````````"X908```````$```!`````$`````````#0908```````$```!` +M````$`````````!@9@8```````$```!`````$`````````!X9@8```````$` +M``!`````$`````````#H9@8```````$```!`````$`````````!H:@8````` +M``$```!`````$`````````"(5P8```````$```!:````$``````````P6`8` +M``````$```!:````$`````````#06`8```````$```!:````$`````````!@ +M608```````$```!:````$`````````"H608```````$```!:````$``````` +M``#X608```````$```!:````$`````````"X6@8```````$```!:````$``` +M``````!(6P8```````$```!:````$`````````"X6P8```````$```!:```` +M$`````````#P6P8```````$```!:````$`````````!`7`8```````$```!: +M````$`````````!X7`8```````$```!:````$`````````#(7`8```````$` +M``!:````$`````````!X708```````$```!:````$`````````!@7@8````` +M``$```!:````$`````````"(7P8```````$```!:````$`````````#X7P8` +M``````$```!:````$`````````!08`8```````$```!:````$`````````"( +M8`8```````$```!:````$`````````#P8`8```````$```!:````$``````` +M``"`8@8```````$```!:````$`````````#X8@8```````$```!:````$``` +M``````!@8P8```````$```!:````$`````````#`8P8```````$```!:```` +M$``````````89`8```````$```!:````$`````````!09`8```````$```!: +M````$`````````"(9`8```````$```!:````$`````````#09`8```````$` +M``!:````$``````````X908```````$```!:````$`````````#H908````` +M``$```!:````$`````````"09@8```````$```!:````$`````````"(9P8` +M``````$```!:````$`````````#09P8```````$```!:````$``````````( +M:`8```````$```!:````$`````````!`:`8```````$```!:````$``````` +M``"`:@8```````$```!:````$``````````@6`8```````$````<````$``` +M```````P6@8```````$````<````$`````````"`6P8```````$````<```` +M$`````````"06P8```````$````<````$`````````#P708```````$````< +M````$`````````#07P8```````$````<````$`````````#H808```````$` +M```<````$``````````08@8```````$````<````$`````````"88P8````` +M``$````<````$`````````#`9`8```````$````<````$``````````8908` +M``````$````<````$``````````H908```````$````<````$`````````#8 +M9@8```````$````<````$``````````H:@8```````$````<````$``````` +M```X:@8```````$````<````$`````````!8:@8```````$````<````$``` +M``````!X808```````$```!D``````````````"`808```````$```!D```` +M``````````"(808```````$```!D``````````````#(808```````$```!D +M``````````````#0808```````$```!D``````````````#8808```````$` +M``!D```````````````H9P8```````$```!D```````````````P9P8````` +M``$```!D```````````````X9P8```````$```!D``````````````!`9P8` +M``````$```!D``````````````!(9P8```````$```!D``````````````!0 +M9P8```````$```!D``````````````!89P8```````$```!D```````````` +M``"`9P8```````$```!D``````````````"(:`8```````$```!D```````` +M``````"0:`8```````$```!D``````````````"8:`8```````$```!D```` +M``````````"@:`8```````$```!D``````````````"H:`8```````$```!D +M``````````````"P:`8```````$```!D``````````````"X:`8```````$` +M``!D``````````````#0:`8```````$```!D``````````````#8:`8````` +M``$```!D``````````````#@:`8```````$```!D``````````````#H:`8` +M``````$```!D``````````````#P:`8```````$```!D``````````````#X +M:`8```````$```!D````````````````:08```````$```!D```````````` +M```(:08```````$```!D```````````````0:08```````$```!D```````` +M```````8:08```````$```!D```````````````@:08```````$```!D```` +M```````````H:08```````$```!D```````````````P:08```````$```!D +M``````````````!(:08```````$```!D``````````````!0:08```````$` +M``!D``````````````!8:08```````$```!D``````````````!@:08````` +M``$```!D``````````````!X:08```````$```!D``````````````"`:08` +M``````$```!D``````````````"(:08```````$```!D``````````````"0 +M:08```````$```!D``````````````"H:08```````$```!D```````````` +M``"P:08```````$```!D``````````````"X:08```````$```!D```````` +M``````#`:08```````$```!D``````````````#(:08```````$```!D```` +M``````````#@:08```````$```!D``````````````#H:08```````$```!D +M``````````````#P:08```````$```!D``````````````#X:08```````$` +M``!D````````````````:@8```````$```!D```````````````(:@8````` +M``$```!D```````````````0:@8```````$```!D```````````````8:@8` +M``````$```!D```````````````@:@8```````$```!D``````````````!( +M:@8```````$```!4````$`````````"@;P8```````8````"```````````` +M``"`<`8```````$````"``````````````"H;P8```````8````%```````` +M``````"P;P8```````8```!K``````````````"X;P8```````8````6```` +M``````````!H<`8```````$````6``````````````#`;P8```````8````> +M``````````````#(;P8```````8````A``````````````#0;P8```````8` +M``!$``````````````#8;P8```````8```!;``````````````#@;P8````` +M``8```!C``````````````#H;P8```````8```!E```````````````8<`8` +M``````$````(```````````````@<`8```````$```!2``````````````!P +M<`8```````$```!.``````````````!X<`8```````$````^```````````` +M``#@;`8```````<````!``````````````#H;`8```````<````#```````` +M``````#P;`8```````<````$``````````````#X;`8```````<````&```` +M````````````;08```````<````'```````````````(;08```````<````) +M```````````````0;08```````<````*```````````````8;08```````<` +M```+```````````````@;08```````<````,```````````````H;08````` +M``<````-```````````````P;08```````<````.```````````````X;08` +M``````<````/``````````````!`;08```````<````0``````````````!( +M;08```````<````1``````````````!0;08```````<````2```````````` +M``!8;08```````<````3``````````````!@;08```````<````4```````` +M``````!H;08```````<````5``````````````!P;08```````<````7```` +M``````````!X;08```````<````8``````````````"`;08```````<````9 +M``````````````"(;08```````<````:``````````````"0;08```````<` +M```;``````````````"8;08```````<````=``````````````"@;08````` +M``<````?``````````````"H;08```````<````@``````````````"P;08` +M``````<````B``````````````"X;08```````<````C``````````````#` +M;08```````<````D``````````````#(;08```````<````E```````````` +M``#0;08```````<````F``````````````#8;08```````<````G```````` +M``````#@;08```````<````H``````````````#H;08```````<````I```` +M``````````#P;08```````<````J``````````````#X;08```````<````K +M````````````````;@8```````<````L```````````````(;@8```````<` +M```M```````````````0;@8```````<````N```````````````8;@8````` +M``<````O```````````````@;@8```````<````P```````````````H;@8` +M``````<````Q```````````````P;@8```````<````R```````````````X +M;@8```````<````S``````````````!`;@8```````<````T```````````` +M``!(;@8```````<````U``````````````!0;@8```````<````V```````` +M``````!8;@8```````<````W``````````````!@;@8```````<````X```` +M``````````!H;@8```````<````Y``````````````!P;@8```````<````Z +M``````````````!X;@8```````<````[``````````````"`;@8```````<` +M```\``````````````"(;@8```````<````]``````````````"0;@8````` +M``<````_``````````````"8;@8```````<```!!``````````````"@;@8` +M``````<```!"``````````````"H;@8```````<```!#``````````````"P +M;@8```````<```!%``````````````"X;@8```````<```!&```````````` +M``#`;@8```````<```!'``````````````#(;@8```````<```!(```````` +M``````#0;@8```````<```!)``````````````#8;@8```````<```!*```` +M``````````#@;@8```````<```!+``````````````#H;@8```````<```!, +M``````````````#P;@8```````<```!-``````````````#X;@8```````<` +M``!/````````````````;P8```````<```!0```````````````(;P8````` +M``<```!1```````````````0;P8```````<```!3```````````````8;P8` +M``````<```!5```````````````@;P8```````<```!6```````````````H +M;P8```````<```!7```````````````P;P8```````<```!8```````````` +M```X;P8```````<```!9``````````````!`;P8```````<```!<```````` +M``````!(;P8```````<```!=``````````````!0;P8```````<```!>```` +M``````````!8;P8```````<```!?``````````````!@;P8```````<```!@ +M``````````````!H;P8```````<```!A``````````````!P;P8```````<` +M``!B``````````````!X;P8```````<```!F``````````````"`;P8````` +M``<```!G``````````````"(;P8```````<```!H``````````````"0;P8` +M``````<```!I``````````````"8;P8```````<```!J```````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````/,/'OI(@^P(2(L%T<\%`$B%P'0"_]!(@\0(PP``````_S6J +MS`4`_R6LS`4`#Q]``/\EJLP%`&@`````Z>#_____):+,!0!H`0```.G0____ +M_R6:S`4`:`(```#IP/____\EDLP%`&@#````Z;#_____)8K,!0!H!````.F@ +M_____R6"S`4`:`4```#ID/____\E>LP%`&@&````Z8#_____)7+,!0!H!P`` +M`.EP_____R5JS`4`:`@```#I8/____\E8LP%`&@)````Z5#_____)5K,!0!H +M"@```.E`_____R52S`4`:`L```#I,/____\E2LP%`&@,````Z2#_____)4+, +M!0!H#0```.D0_____R4ZS`4`:`X```#I`/____\E,LP%`&@/````Z?#^____ +M)2K,!0!H$````.G@_O___R4BS`4`:!$```#IT/[___\E&LP%`&@2````Z<#^ +M____)1+,!0!H$P```.FP_O___R4*S`4`:!0```#IH/[___\E`LP%`&@5```` +MZ9#^____)?K+!0!H%@```.F`_O___R7RRP4`:!<```#I++!0!H&0```.E0_O___R7:RP4`:!H```#I0/[___\ETLL% +M`&@;````Z3#^____)````Z0#^____);++!0!H'P```.GP_?___R6JRP4`:"````#IX/W_ +M__\EHLL%`&@A````Z=#]____)9K+!0!H(@```.G`_?___R62RP4`:",```#I +ML/W___\EBLL%`&@D````Z:#]____)8++!0!H)0```.F0_?___R5ZRP4`:"8` +M``#I@/W___\E#\____)2++!0!H,0```.G0 +M_/___R4:RP4`:#(```#IP/S___\E$LL%`&@S````Z;#\____)0K+!0!H-``` +M`.F@_/___R4"RP4`:#4```#ID/S___\E^LH%`&@V````Z8#\____)?+*!0!H +M-P```.EP_/___R7JR@4`:#@```#I8/S___\EXLH%`&@Y````Z5#\____)=K* +M!0!H.@```.E`_/___R72R@4`:#L```#I,/S___\ERLH%`&@\````Z2#\____ +M)<+*!0!H/0```.D0_/___R6ZR@4`:#X```#I`/S___\ELLH%`&@_````Z?#[ +M____):K*!0!H0````.G@^____R6BR@4`:$$```#IT/O___\EFLH%`&A"```` +MZ<#[____)9+*!0!H0P```.FP^____R6*R@4`:$0```#IH/O___\E@LH%`&A% +M````Z9#[____)7K*!0!H1@```.F`^____R5RR@4`:$<```#I +M^E6_!````$B)Y>@^^___2(LUQ\D%`#'2QP#E!P``2(G'Z-?^___S#Q[Z2(7_ +M>0G&!BU(]]](_\:X_____T@YQW\%Z=8%`0#I`=X#`)!5OP0```!(B>7H\OK_ +M_TB+-7O)!0`QTL<`K"DS`4B)Q^B+_O__D%6_!````$B)Y>C,^O__2(LU5C4_/__3(GGOA@```#HI_O__TR)[^@?_O__ +MD+\$````Z#3Z__](BS6]R`4`,=+'`*PI,P%(BAD2"L$)2@```!U"$R)Y^C+_?__Z&;[__]( +MBT7(9$@K!"4H````=2;H@O[__[X0````3(GOZ"7[__]-A?9U1DB+1@L^___\P\>^DB)P^O>2(M%R&1(*P0E*````'7CZ#_^__^^$``` +M`$R)_^CB^O__Z[M,BW6PZ[5,B??H\OO__^NP2(G?Z$C]___S#Q[Z5;\$```` +M2(GEZ%;Y__](BS7?QP4`,=+'`*PI,P%(BA(^___2(M]P$B%_W0%Z#K[__](BT789$@K!"4H````=0A( +MB=_H@_S__^@>^O__2(M]L$B%_W0%Z!#[__](BWW`2(7_=`7H`OO__TB+1=AD +M2"L$)2@```!U"$B)W^A+_/__Z.;Y__](BWW`2(7_=`7HV/K__TB+?=!(A?]T +M!>C*^O__2(M%Z&1(*P0E*````'4(2(G?Z!/\___HKOG__TB+?B@ +M^O__2(M]T$B%_W0%Z)+Z__](BT7H9$@K!"4H````=0A(B=_HV_O__^AV^?__ +M3(MUH$R)[^AJ^O__387V=`A,B??H7?K__TR)Y^A5^O__2(M%R&1(*P0E*``` +M`'4(2(G?Z)[[___H.?G__TB+?9B^$````.@+^?__387M=`A,B>_H'OK__TB+ +M1^DB)P^O-2(M%R&1(*P0E +M*````'0%Z.3X___H#_S__TB+1/HF_C__^N.D.CC^___3(G_OD@```#HAOC__TB)W^C^^O__3(GGZ`8``0!( +MBT7(9$@K!"4H````=3I(B=_HW_K__[X0````3(GGZ%+X__](BWVP2(7_=`7H +M9/G__TB+1UT +M"$R)[^@R^?__28L\)$B%_W0%Z"3Y__](BT7(9$@K!"4H````=0A(B=_H;?K_ +M_^@(^/__\P\>^E6_!````$B)Y>AV]O__2(LU_\0%`#'2QP`!````2(G'Z`_Z +M__^0\P\>^E5(B>532(G[48L_@___=!/HU?K__XG",<"%TG4(QP/_____L`%: +M6UW#2(M]L$B%_W0%Z*/X__](BWV@2(7_=`7HE?C__TB+1TB)W^C>^?__2(M]L$R+;9!(A?]T!>AL^/__2(-]@`!T"4B+?8#H7/C__TV% +M[70(3(GOZ$_X__](BT7(9$@K!"4H````=1)(B=_HF/G__TB+1:!(B46`Z\+H +M*??__TB+?;!(A?]T!>@;^/__2(M]H$B%_W2[Z`WX___KM.@&]___2(M]L$B% +M_W21Z/CW___KBDB+?;!(A?]TTNCH]___Z\M(BWVP2(7_=,+HV/?__^N[2(M] +ML$R+;9!(A?\/A&G____HP/?__^E?____3(MMD.E6____\P\>^E6_"````$B) +MY>@@]?__2(LUP<,%`#'22(G'2(T%H:L$`$B)!^BU^/__D/,/'OI(BS](A?]T +M#%5(BP=(B>7_4!!=P\.0Z)7Y__],B>>^2````.@X]O__2(G?Z+#X___H6_3_ +M_^@V^/__N`X`!X#IUK`!`$B+1^DB)P^L( +M3(GGZ(?V__](C3W`!P8`0;P.``>`Z"7U__](B=_H#?3__^CH]___Z82S`0#H +M[O7__S'`28E$)#!(BT789$@K!"4H````=07HR_W__^C.]?__\P\>^KY(```` +M3(GG28G%Z)KU__^^H````$B)W^B-]?__2(M%V&1(*P0E*````'4(3(GOZ/;W +M___HD?7__Y#S#Q[Z2(L_2(7_=`Q52(L'2(GE_U`07@1]O__ +M2(U[+.@J_?__3(GGZ&#W___S#Q[Z2(L_2(7_=`Q52(L'2(GE_U`07@@_O__Z,WT__^02(G?OE````#HG_3__TR)]^@7]___ +MD.C__?__D.B[\O__Z);V__^X#@`'@.DQ`P(`28M%`$R)[_]0$$F+!"1,B>?_ +M4!!(BWV@Z._^__](B=_HA_+__^AB]O__N0X`!X#IR`4"`$R)_^C0_O__2(M% +MR&1(*P0E*````'4(2(G?Z*GV___H1/3___,/'OI52(GE4TB)^U%(BW]82(7_ +M=`7H*?7__TB+>TA(A?]T!>@;]?__2(M[.$B%_W0%Z`WU__](BWL@2(7_=`7H +M__3__TB+>Q!(A?]T!>CQ]/__2(L[2(7_=`A:6UWIX?3__UA;7<.0\P\>^E5( +MB>532(G[44B+?Q!(A?]T!>C!]/__2(L[2(7_=`A:6UWIL?3__UA;7<.0\P\> +M^DB+/TB%_W0,54B+!TB)Y?]0$%W#P_,/'OI5OP$```!(B>7H`?+__S'22(TU +MP+<%`$B)Q^B@]?__\P\>^E6_`0```$B)Y>C>\?__,=)(C36MMP4`2(G'Z'WU +M__^0Z+3___^02(M%R&1(*P0E*````'49Z)____](BT7(9$@K!"4H````=0KH +MKO___^@9\___Z!3S___H?/___Y#H.?;__^@T]O__Z"_V___H*O;__^@E]O__ +MZ"#V___H^_#__\>#7`$```5``(!(BUWXR>G']/__D.@!]O__Z#G____H-/__ +M_^CR]?__2(M%R&1(*P0E*`````^%/`$``.C:]?__\P\>^DB+O=C]__])B<1) +MB=7HY`\"`$B-O<#^___HV`\"`$B#O2#^__\`=`Q(B[T@_O__Z'+S__](@[WX +M_?__`'0,2(N]^/W__^A<\___2(.]`/[__P!T#$B+O0#^___H1O/__TB+O2C^ +M___H7O[__TB+O8#^__](A?]T!>@I\___2(V]=,B>A(@_@"#X26````2(/X`P^$.@,``$F)_$B-O0#____HN?S_ +M_TB-O4#^___H`?[__TB+A3C^__](B[TH_O__2(F%X/[__^@C#0(`3(GGZ)OO +M__],B?_HL_\!`.AN\___0;X.``>`Z1\C`@#H;O'__TB+1@:\___ZA#\___Z`[P__](BX6P_O__2(F%(/[__^EG_?__2(N% +MD/[__TB)A0#^___I5/W__TB+A:#^__](B87X_?__Z4']__](B[W8_?__Z!D- +M`@#I,/W__TB+1^DF)QDF)U>F<_?__Z)SO +M___HE^____,/'OI)B<9)B=5,C:50_O__Z8C]__](BT7(9$@K!"4H````=75( +MC85@_O__3(VE4/[__TB)A0C^___HQ?O__TB+1C4^___ +MZ#_O__](BT7(9$@K!"4H````=2E(C85@_O__3(VE4/[__TB)A0C^___H@_O_ +M__,/'OI(B<=(B=#I*_W__^@"[___Z/WN___H^.[___,/'OI(BS__T'&AP("```!Z&SP___I("4"`.AR[O__2(M%R&1(*P0E*````'4% +MZ.[Z___H6>[__TB+1^DF)Q$F)U>E(_/__ +MZ#'N___H+.[__^@G[O__Z"+N___H'>[__Y!(BT7(9$@K!"4H````=37H./'_ +M__,/'OI(C7V@2(G#Z/CX__](C7V8Z&OW__](B=_H]^O__^C2[___N`X`!X#I +MQSD"`.C3[?__D.C]\/__D.CW\/__Z/+P__](BT7(9$@K!"4H````=07HWO#_ +M_^BI[?__2(M]B$B%_W0&2(L'_U`02(M]@$B%_W0&2(L'_U`02(M%R&1(*P0E +M*````'4(2(G?Z-3O___H;^W__Y!(BWV@2(7_=`7H8.[__TB+O7#___](A?]T +M!>A/[O__2(N]8/___TB%_W0%Z#[N__](B[U0____2(7_=`7H+>[__TB+O4#_ +M__](A?]T!>@<[O__3(NE*/___TV%Y'0I28L$)$B-%>6.`@!(BT`02#G0#X7. +M````08-L)"`!38UT)/@/A,<```!(B=]!O`X`!X#HZ>K__^C$[O__Z6=7`@!( +MBT7(9$@K!"4H````=07HZ^___^BV[/__\P\>^DB+O0C___](B_O__Z#GM___IU/[__^@O[/__Z"KL__],B>?_T.DY____2(T%F90% +M`$6+K"0(`0``\P]^!2&6!0!F2`]NV$B#P&A)B[PD``$``&8/;,-F2`]NX$B# +MP#!!#Q%$)/CS#WX%_94%`$F)1"089@]LQ$$/$40D"$6%[71#08U%_TR+/,=) +MB<5-A?]TZTF+?Q!(A?]T!>BK[/__28L_2(7_=`9(BP?_4!!,B?^^,````.AP +MZ___28N\)``!``#KN$B%_W0%Z'SL__])B[PD\````$B%_W0%Z&KL__])BWPD +M>$B%_W0%Z%OL__])BWPD:$B%_W0%Z$SL__])BWPD2$B%_W0%Z#WL__])BWPD +M.$B%_W0%Z"[L__]%BVPD,$F+?"0H187M=#%!C47_3(L\QTF)Q4V%_W3K28L_ +M2(7_=`7H`NS__TR)_[X0````Z-7J__])BWPD*.O*2(7_=`7HY.O__[XH`0`` +M3(GWZ+?J___IZ_W__TB+?9!(A?]T!>C$Z___2(M]@$B%_P^%'/[__^E9_O__ +M2(M%R&1(*P0E*````'4%Z,[M___HF>K__TB+?9!,BW6`2(7_#X3E_?__Z(/K +M___IV_W___,/'OI(BG__TB+NZ@```!%A?9URTB%_P^%]00``$B+NY@```!(A?\/ +MA>\$``!(B[N(````2(7_#X7I!```2(M[>$B%_P^%Y@0``$B+>W!(A?\/A>,$ +M``!,BWMH387_#X2^````28L'2(T5&T<#`$B+0!!(.=`/A=0$``!!@Z\@`0`` +M`4V-=_`/A94```!F#V^U\/[__V8/;[W@_O__2(T%E8T%`$F+OU@!``!)B4<0 +M00\1=_!!#Q$_2(7_#X6B!```28N_2`$``$B%_P^%G`0``$F+OS@!``!(A?\/ +MA98$``!)B[\H`0``2(7_#X60!```28N_$`$``$B-!;J+!0!)B4<02(7_#X5_ +M!```28U_&.@40`,`OL@!``!,B??HM^C__TB+6UA(A=L/A+<```!(BP-(C15@ +M1`,`2(M`$$@YT`^%$P0``(.K,`$```$/A9,```!F#V^M\/[__V8/;[7@_O__ +M2(T%SXP%`$B+NV@!``!(B4,@#Q$K#Q%S$$B%_P^%$`0``$B+NU@!``!(A?\/ +MA0H$``!(B[M(`0``2(7_#X4$!```2(N[.`$``$B%_P^%_@,``$B+NR`!``!( +MC07VB@4`2(E#($B%_P^%[0,``$B->RCH4#\#`+[(`0``2(G?Z//G__^^"`(` +M`$R)[^CFY___2(U]P.B-P0$`2(V]2/___^BM\___2(N]V/[__TB+!_]0$$B- +MO2#___]!OPX`!X#HXET"`$R)Y^C:Y?__Z+7I___I3&0"`$B+1@#^__]( +MA=L/A"#___](BP-(C15,N0(`2(M`$$@YT`^%S@```(-K&`%,C6OX#X7[_O__ +M2(T%ZHL%`$B+N^`!``#S#WX%$Y$%`&9(#V[X2(/`8&8/;,=F2`]NZ`\10_CS +M#WX%_9`%`&8/;,4/$4,(2(7_=`7HN^?__TR+L[`!``!(C15];`$`28L&2(M` +M$$@YT`^$G````$R)]__01(NSJ`$``$B+NZ`!``!%A?8/A,4```!!C4;_3(L\ +MQTF)QDV%_W3G28M_.$B%_W0%Z&/G__],B?^^2````.@VYO__2(N[H`$``.O# +M\P\>^DF)Q.FX_O__2(G?_]#I,?[__XN%//___S'VC5`!2,'B`NC3Y/__2(N] +M,/___S'`B84X____2(7_#X2W^___Z`;G___IK?O__T&#;@@!#X5>____28M^ +M&$B-!6-_!0!)B09(A?]T!DB+!_]0$$F+?A!(A?]T!DB+!_]0$+XX````3(GW +MZ*'E___I)/___TB%_W0%Z++F__]$B[.(`0``2(N[@`$``$6%]G0S08U&_TR+ +M/,=)B<9-A?]TZTF+/TB%_W0%Z(+F__],B?^^$````.A5Y?__2(N[@`$``.O( +M2(7_=`7H8N;__TB+NW@!``!(A?]T!DB+!_]0$$B+NV`!``!(A?]T!>@_YO__ +M2(N[6`$``$B%_W0&2(L'_U`02(N[(`$``$B%_W0%Z!SF__](B[L(`0``2(7_ +M=`7H"^;__TB+N\````!(A?]T!>CZY?__1(NSL````$B+NZ@```#I_?K__^CB +MY?__Z0'[___HV.7__^D'^___Z,[E___I#?O__^C$Y?__Z1#[__](BP?_4!#I +M$OO__^BOY?__Z:SZ__],B?__T.G)^___2(G?_]#I@_S__^B1Y?__Z53[___H +MA^7__^E:^___Z'WE___I8/O__^ASY?__Z6;[___H:>7__^EW^___Z%_E___I +MYOO__^A5Y?__Z>S[___H2^7__^GR^___Z$'E___I^/O__^@WY?__Z0G\___H +M/>+__^@8YO__N`X`!X#I(8T"`.@IXO__Z`3F__^X#@`'@.E=C0(`\P\>^E5( +MB>5!54%428G\4U&+7PA)BSPDA=MT+(U#_TR++,=(B<--A>UTZ4F+?0!(A?]T +M!>C1Y/__OA````!,B>_HI./__^O,2(7_=`Q:6T%<05U=Z;'D__]86T%<05U= +MPY#S#Q[Z54B)Y4%505132(G[442+9QA(BWL0187D="Y!C40D_TR++,=)B<1- +MA>UTYDF+?0!(A?]T!>AKY/__OA````!,B>_H/N/__^O)2(7_=`7H4N3__TB+ +M.TB%_W0,6EM!7$%=7>D^Y/__6%M!7$%=7<-,B>_H@N___TB)W^@VX?__NPX` +M!X#H#.7__^G$C@(`2(M]P$B%_W0%Z`GD__](BT789$@K!"4H````=2U(B=_H +M4N7__TB+?CDX___2(M%V&1(*P0E*````'4-2(G?Z"WE___HR.+_ +M_^C#XO__D$B+1>AD2"L$)2@```!U.NC\Z___\P\>^DB)PTB+?=!(A?]T!>B9 +MX___2(U]P.A`*`$`2(G?Z)C@___H<^3__[@.``>`Z5>0`@#H=.+__TB+1>AD +M2"L$)2@```!U!>BNZ___Z%OB___S#Q[Z2(G#Z[GS#Q[Z54B)Y5-(B?M12(M_ +M*$B%_W0%Z#?C__](BWL82(7_=`A:6UWI)N/__UA;7<-(BWVP2(7_=`7H%./_ +M_TB+1C*XO__2(M%R&1(*P0E*````'42 +M2(G?Z!/D___HKN'__^BIX?__Z*3A___S#Q[Z5;\$````2(GEZ!+@__](BS6; +MK@4`,=+'`)].`@!(B3__^C=[?__2(M%R&1(*P0E*````'5$ +MZ(SD__](BT7(9$@K!"4H````=2OHM>W___,/'OI,B>=(B'__TB+?:!(A?]T!>BSX?__2(M]F$B% +M_W0%Z*7A__](BWV02(7_=`7HE^'__TB+?8A(A?]T!>B)X?__2(M]@$B%_W0% +MZ'OA__](B[UX____2(7_=`7H:N'__TB+O7#___](A?]T!>A9X?__2(N]8/__ +M_TB%_W0%Z$CA__](B[U0____2(7_=`7H-^'__TB+O4C___](A?]T!>@FX?__ +M2(M%R&1(*P0E*````'4(2(G?Z&_B___H"N#__TB+1AC +M[/__2(M%R&1(*P0E*````'4>Z$_L___HW=___TB+1TCH'O@! +M`$B->T#HE>K__[XH`@``2(G?Z&C?__](BT7H9$@K!"4H````=0A,B??HT>'_ +M_^ALW___2(N[$`$``$B%_W0%Z%O@__](B[O(````2(7_=`7H2N#__TR)YTV) +M[.B7^___2(N[D````$B%_W0%Z"[@__](B[N`````2(7_=`7H'>#__TB->WCH +M:.O__TR+:W!-A>UT*DF+10!(C160/`,`2(M`$$@YT`^%X0```$&#K2`!```! +M38UU\`^$V0```$B+>V#HN"D$`$R)Y^@PX?__2(N[N`$``$B+!_]0$$2+L[`! +M``!(B[NH`0``187V=#1!C4;_3(L\QTF)QDV%_W3K28M_.$B%_W0%Z)+?__], +MB?^^2````.AEWO__2(N[J`$``.O'2(7_=`7HA)W___2(V[8`$``.BMZ/__2(N[*`$` +M`$B%_W0%Z"S?__](B[L0`0``2(7_#X3!_O__Z!??___IM_[__TR)[__0Z2?_ +M__](C06I@04`28N]6`$``/,/?@5JB04`9D@/;MA(@\!H9@]LPV9(#V[@2(/` +M,$$/$47P\P]^!4^)!0!)B4409@]LQ$$/$44`2(7_=`7HN-[__TF+O4@!``!( +MA?]T!>BGWO__28N].`$``$B%_W0%Z);>__])B[TH`0``2(7_=`7HA=[__TF+ +MO1`!``!(C04W@`4`28E%$$B%_W0%Z&G>__])C7T8Z)`T`P"^R`$``$R)]^@S +MW?__Z6W^__](BWVP2(7_=`7H0-[__TB+?:!(A?]T!>@RWO__2(M%R&1(*P0E +M*````'4(2(G?Z'O?___H%MW__TB+?:!(A?]T!>@(WO__2(M%V&1(*P0E*``` +M`'4(2(G?Z%'?___H[-S__^CWVO__Z-+>__^X#@`'@.F8P@(`O@@!``!,B??H +MJ]S__TB+1ACW?__2(M]@$B%_W0%Z%7=__](B=]!OPX`!X#H5]K_ +M_^@RWO__Z2K+`@#H.-S___,/'OI(B<-(BWV@2(7_=`7H(]W__TB+?9!(A?]T +MIDB+!_]0$.N>3(G_Z`KG___KE$B+1C?WO__2(M%R&1(*P0E*````'4DZ,O>___HEMO__TR) +M]^B.YO__OC````!,B??H8=O__^E+____Z'?;__](BWVP2(7_=`7H:=S__TB+ +M1^DB)P^MKZ)/:__](C;U@_O__Z*GB__]( +MB[U`_O__2(7_=`7H=MO__TB+O1C___](A?]T'>AEV___ZQ9)C7T0Z'SB__^^ +M:````$R)[^@MVO__2(N],/[__TB%_W0XZ#S;___K,;Y(````3(GOZ`W:__], +MB??H)=O__TB+O6#^__](A?\/A8(```!(C;U0_O__Z'GA``!(B[T@_O__2(7_ +M=`7H^-K__TB-O1#^___H7.3__TB)W^CTU___0;P.``>`Z,G;___I7-8"`/,/ +M'OI(C;U0_O__2(G#Z./A__](B[V8_O__2(7_#X2!`0``Z*S:__^+O6#^__^# +M__\/A!;____HJ-S__^D,____Z([:___I=/___[X0````3(GOZ%S9__](B[U0 +M_O__2(7_#X1C____Z&?:___I6?___TB+O;#^__](A?\/A>C^___I`/___[X0 +M````3(GOZ"#9__](B[VP_O__2(7_#X0X____Z"O:___I+O___TB+O6#^__]( +MA?]T!>@5VO__2(N]4/[__TB%_P^$C_[__^@`VO__Z87^__](B[VP_O__2(7_ +M#X3&_O__Z.;9___IO/[__TB+1^DB)P^N$ +MZ+_8__],B??HM]G__^D\_O__2(N]8/[__TB%_W0%Z*'9__](B[U0_O__2(7_ +M#X0*_O__Z(S9___I`/[__TB+1AKX/__Z&[8__](B[T@ +M_O__2(7_#X1F_O__Z%G9___I7/[__TB+O9C^__](A?\/A9/^___ID_[__TF+ +M10!,B>__4!#IX_W__XN]8/[__^F(_O__D%5(B>532(G[44B+?RA(A?]T!>@- +MV?__2(M[&$B%_W0(6EM=Z?S8__]86UW#2(M]H$B%_W0%Z.K8__](BT7(9$@K +M!"4H````=0A(B=_H,]K__^C.U___2(N],/___TB%_W0%Z+W8__](BT7(9$@K +M!"4H````=0A(B=_H!MK__^BAU___2(L%@NP%`$B%P'0.54B+.$B)Y>C9U___ +M7E+]```6T%<7<-(BWL82(7_ +M=`7H*-C__TR)]^B`V?__Z#/<__^02(M]L$B%_W0%Z`S8__](B=_HA-?__TB+ +M?9!(A?]T!>CVU___3(GOZ`[6__](BT789$@K!"4H````=0A(B=_H-]G__^C2 +MUO__2(N],/___TB%_W0%Z,'7__](BT7(9$@K!"4H````=0A(B=_H"MG__^BE +MUO__D$R)Y^B\U?__2(G?NPX`!X#HG]3__^AZV/__Z3$M`P!,B>?HG=7__TB) +MW[L.``>`Z(#4___H6]C__^ER+0,`2(M]D$B%_W5(3(GGZ%77__](BWV@2(7_ +M=`7H1]?__TV%[70(3(GOZ#K7__](BWV`2(7_=`7H+-?__TB+1@)UO__2(M%R&1(*P0E*````'4%Z"79___H +M\-7__TB+1@,V?__\P\>^DB)PTB+O5#____HR=;__TB# +MO6#___\`=`Q(B[U@____Z+/6__](@[U8____`'0,2(N]6/___^B=UO__2(M] +MD$B%_W0%Z(_6__](BT7(9$@K!"4H````#X6(````2(G?Z-37___H;]7__TB+ +M1:!(B858____ZZ_S#Q[Z2(G#2(N]:/___^C_&@$`3(GOZ%T+``!(@[U0____ +M``^$^DB)PT4Q[>O$ +M,?](B;U@____Z\%(BT7(9$@K!"4H````=0KH4//__^COU/__Z.K4__],BZUP +M____Z9?^__](BT7(9$@K!"4H````=0[H)O/___,/'OKI8____^B\U/__2(M] +ML$B%_P^$:/[__^BJU?__Z5[^__^02(N[Z````$B%_W0%Z)/5__](C;N8```` +MZ#7R__](BWM(2(7_=`7H>=7__TB+>SA(A?]T!>AKU?__2(M[*$B%_W0%Z%W5 +M__](BWL8Z%0*``!(BWL0Z&<7``!(C7L(Z$+?__](BSOH4`H``$R)Y^B2UO__ +M2(N[L````$B%_W2?Z"'5___KF$B+?@1U?__2(M]L$B%_W0%Z`/5 +M__](BT789$@K!"4H````=0A(B=_H3-;__^CGT___3(N]8/___TV%_W0(3(G_ +MZ-/4__](B[UP____2(7_=`7HPM3__TB%VW0(2(G?Z+74__](BT7(9$@K!"4H +M````=0A,B>?H_M7__^B9T___2(N=4/___^O.3(GWZ#@9`0!(BT7(9$@K!"4H +M````=0A(B=_HT=7__^ALT___2(M]P$B%_W0%Z%[4__](BT789$@K!"4H```` +M=0A(B=_HI]7__^A"T___2(M%@$B%P'0)2(UX_.B@T___2(M%R&1(*P0E*``` +M``^%O@```$B)W^AUU?__2(M]@$B%_W0%Z`?4__](BT7(9$@K!"4H````=4!( +MB=_H4-7__TB+O4C____HE!@!`$B+A7C___](A/SH/]/__TB+1B@T___2(M% +MR&1(*P0E*````'4M2(G?Z.G4__](BWV`2(7_=`7H>]/__TB+1^DF)Q$B+O=#^__](A?]T..CXTO__ZS'H\='__TB+1/W__^BGJ@$`2(N](/W__TR)X^AXV``` +M2(N]&/W__^ALV```2(N]@/W__TB%_W0%Z.O1__](B[V0_?__2(7_=`7HVM'_ +M_TF)W$B-G2#^__](C;TX_O__Z*0%`P!(B=],B>/H20,#`.M_\P\>^DB)Q^GP +M_O__Z*;1___I:O___TB+O;#^__](A?]U0$B-O9C^___H^=<``$B+O:#]__]( +MA?]T!>AXT?__2(N]$/W__^C +M^DF)Q.G[_O__2(N]T/[__TB%_P^$]_[__^@)T?__Z>W^__](B[W0_O__2(7_ +M=`7H\]#__TB-A<#]__](B84@_?__Z@$T/__28M]&$B%_W5YOC@```!,B>_HSL[__XN= +M`/___TB+O?C^__^%VP^$I0```(U#_TR++,=(B<--A>UTZ4F+?1!(A?]T!>B\ +MS___28M]`$B%_W0%Z*[/__],B>^^(````.B!SO__2(N]^/[__^NW\P\>^DB) +MP^F__O__Z(?/___I8____^A]S___ZX!(BT7(9$@K!"4H````=3-(C870_O__ +M2(F%:/W__^B)T?__OA````!,B??H+,[__TB-A=#^__](B85H_?__Z6#^___H +M-,[__TB%_W0%Z"K/__](B[WH_O__2(7_#X3W_/__Z!7/___I[?S__[\(```` +MZ(;,__](B<=(C058A@0`2(D'2(M%R&1(*P0E*````'4A2(LU"YL%`#'22(V= +M(/[__^@%T/__\P\>^DF)Q.GY_/__Z,3-__](B=^^$````$R)X^B4S?__2(N] +MT/[__TB%_P^$+/W__^B?SO__Z2+]___S#Q[Z2(G#Z]U(BT7(9$@K!"4H```` +M=23HK=#__TB)W^AUSO__2(M%R&1(*P0E*````'4-3(GGZ+[/___H629!0`QTNCESO__Z+#,__^^$````$B)W^B#S/__ +MZ97Z__](B[W0_O__2(7_#X2^^___Z(G-___IM/O__TB+O3#]___H.'X"`$B+ +MO0#^__](A?\/A"'[___H8\W__^D7^___2(N]`/___TB%_P^$(_O__^A)S?__ +MZ1G[__](B[M8`0``2(7_=`7H,\W__TB+NT@!``!(A?]T!>@BS?__2(N[.`$` +M`$B%_W4:3(GOZ/XC`P"^R`$``$B)W^CAR___Z=GZ___H]\S__^O?3(GWZ!TC +M`P#KW4R)YTV)[.B\\___2(N[J````$B%_W0%Z,_,__](B[N8````2(7_=`7H +MOLS__TB+NX@```!(A?]T!>BMS/__2(M[>$B%_W0%Z)_,__],B??H<_/__^N' +M28L\)$B%_W5ZOB````!,B>?H7\O__TB+O6#^__](A?]T!>ANS/__2(N]4/[_ +M_TB%_W5:2(N],/W__^C&T@``2(N]*/W__^BZT@``2(.]8/W__P!T#$B+O6#] +M___H-,S__TB#O4C]__\`28G<#X0U_/__2(N]2/W__^@7S/__Z23\___H#@=SO__OP0```#H8\G__\<` +M`4``@$B)QTB+1C#S?__Z([*__](BX7P_?__ +M2(F%8/W__^DQ____2(N%X/W__TB)A4C]___I*/___TB+O5#^__](A?\/A/;^ +M___H4\O__^GL_O__\P\>^DB)P^G#_O__Z*K6___HR-;__TB+.TB%_W0%Z"O+ +M__](BWW02(7_=`7H'AD2"L$)2@```!U"$R)Y^AFS/__Z`'*__^0 +M\P\>^DB%_W0,54B+!TB)Y?]0$%W#P_,/'OI(A?]T#%5(BP=(B>7_4!!=P\-( +MBT7(9$@K!"4H````#X6@````Z.S,__](BT7(9$@K!"4H````=07HV,S__^BC +MR?__3(GOZ+_5__](BT7(9$@K!"4H````=31(B=_HY,O___,/'OI(BWV@2(G# +M2(7_=`7H;\K__TB+1]7__^CFR/__2(M%R&1(*P0E*````'4=Z&+5__](BT7(9$@K!"4H```` +M#X5D`0``Z$K5___HMCVU/__2(M%R&1(*P0E*````'4*Z`75___H<,C__^AKR/__ +M2(M%R&1(*P0E*````'4=Z.?4__](BT7(9$@K!"4H````#X4;`0``Z,_4___H +M.LC__TB+1BVU/__2(M%R&1(*P0E*`````^%"`(``.B> +MU/__Z`G(__](BT7(9$@K!"4H````=5_HA=3___,/'OI(B<-(@[TX____`'0, +M2(N]./___^C8R/__2(.]6/___P!T#$B+O5C____HPLC__TB+O>C^___H!N4! +M`$B+1C2T___2(M%R&1(*P0E*````'4/Z+[3 +M___H*A&T___2(M% +MH$B)A3C____IV_[__^C$QO__Z+_&__](BT7(9$@K!"4H````=1WH.]/__TB+ +M1,/A#G___](B[WP +M_O__Z++%___I*/___TF+?>A)@^T@2(7_#X1M____Z)?%___I8____TB+1@.T?__Z'G$__](BT7(9$@K!"4H````=2KHTM#__TB+1CAT/__\P\>^DB)P^DT____Z$#$___H.\3___,/'OI(BBET/__Z!#$__](BT7(9$@K!"4H +M````=1GHC-#__TB+11T"DF+!"1,B>?_4!!( +M@[W@_O__``^$=_W__TB+O>#^___H#,3__^EF_?__2(N]0/___^C;DP,`Z7'] +M__](B[U`____2(7_="*+5_PQ]H/B_.B-P?__2(N%0/___TB%P'0)2(UX_.@X +MP___2(N]&/___TB%_P^$,_W__TB+!_]0$.DH_?__2(N%Z/[__S'22(E0>$B+ +M!"4`````#PM(BT7(9$@K!"4H````=2'HLL7___,/'OI(B[U`____2(G#2(7_ +M#X6T_?__Z>'\___H8<+__TB+`TB)WTR)X_]0$$R+I4C___]-A>1T'$F+!"1( +MC15^;@``2(M`$$@YT'5[08-L)"`!='I(B[U`____2(7_#X28_/__2(L'_U`0 +MZ8W\__](BT7(9$@K!"4H````=1](C85@____2(F%`/___^@@Q?__\P\>^DB) +MP^EU_/__Z-_!__](BT7(9$@K!"4H````=1'H6\[___,/'OI(B?H;\'_ +M_^E=____2(M%R&1(*P0E*`````^%10$``$B-A6#___](B84`____Z)3$__]( +MBT7(9$@K!"4H````#X76````2(V%8/___TB)A0#____H;L3__TB+1BZS?__Z"7!___HL,W___,/'OKIX/S__^@2P?__2(M%R&1(*P0E +M*````'4=Z([-__](BT7(9$@K!"4H````#X6^````Z%/-___HX<#__S'_2(F] +MP/[__[\$````Z$Z____'`&@#,P%(B<=(BT7(9$@K!"4H````=6=(BS6_C04` +M,=+HV,+__TB+1\#__^AVP/__Z''`___S#Q[ZZ3'\__](BT7(9$@K!"4H````=07HY,S_ +M_^A/P/__Z$K`___S#Q[Z2(G#Z2W[___S#Q[Z2(G#Z;GZ___H+<#__^@HP/__ +M\P\>^NGH^___Z$K#__],B>>^&````.CMO___2(G?Z&7"__](BT7(9$@K!"4H +M````=07H"<7__^CLO___2(M%R&1(*P0E*````'5%Z/#$__](BT7(9$@K!"4H +M````=3'HW,3___,/'OI(BWVP2(G#2(7_=`7HK\#__TB+1HP%`#'2Z)/!__](BT7(9$@K!"4H````#X6\`0``Z'O"___H1K__ +M_TB+1C/O___2(N]$/___TB%_W0%Z+Z_ +M__](C;T`____Z"+&``!(@[W8_O__`'0,2(N]V/[__^B/H>K___TB+O5#___](A?]T!>AIO___2(N] +M0/___TB%_P^%HP```#')2(F-V/[__^EK____Z$:^__](B[U0____2(7_=`7H +M-;___TB)W^@MO___3(GC,=)(B978_O__Z1____]%,^DB)P^F^_O__Z+:]___HL;[_ +M_^E3____\P\>^DB+O<#^__](BU,B:W8_O__Z:W^___S#Q[Z2(N]P/[__TB)P^@(`P$` +M3(GGZ*"<`@!,B>?HZ'0"`#'`28E$)"CI/_[__T4QY$R)I=C^___I7O[__TB+ +M15!5%-(BP=(B?M(BT`02#G0=6?_3PAU9/,/?@55<04`2(T%[F(%`$R- +M9_AF2`]NR&8/;,$/$4?X3(GGZ+W*`0!(B[L(`@``2(7_=`7H?+W__TB->T#H +M\]0!`$B+>SA(A?]T!DB+!_]0$%M,B>>^*`(``$%<7>DSO/___]!;05Q=P\.^ +M"`$``$R)[TR-O2#^___H%[S__TB-O>C[___HI\7__TB-O>#[___H'\?__TR) +M_^@W@@(`2(.]$/O__P!T#$B+O1#[___H`;W__TB+O0#\__](A?\/A<\```!( +MC;W0^___Z'77`0!(B[V@_/__2(7_#X6]````2(N]&/O__^B);0(`2(N]@/O_ +M_^A-@P(`2(N]B/W__TB%_P^%GP```$B-O<#[___HL3$"`$B#O3#[__\`=`Q( +MB[TP^___Z(N\__](@[V0^___`'0,2(N]D/O__^AUO/__2(M%R&1(*P0E*``` +M`'5B2(G?Z+Z]__](B[VP_/__2(7_=`7H3;S__TB+O3#\__](A?]T!>@\O/__ +M2(N](/S__TB%_P^$]?[__^@GO/__Z>O^___H';S__^DG____Z!.\___I.?__ +M_^@)O/__Z5?____H_[K__TB+O;#\__](A?]T!>CNN___3(V](/[__^FK_O__ +M2(N](/[__TB%_W0%Z-&[__](B[VP_/__2(7_=`7HP+O__TB+O3#\__](A?\/ +MA,O^___HJ[O__^G!_O__2(M%R&1(*P0E*````'4%Z,*]___HC;K__[X0`0`` +M3(GGZ&"Z__](B[T0_?__2(7_=`7H;[O__TB+O2#\__](A?\/A>0```!,B?_H +M=X`"`$B+O<#Z___H2\7__TB+OT/A!C^__]) +MBT4`2(T5Q+4!`$B+0!!(.=`/A6<$``!!@VT(`4V-9?@/A?']___S#WX%P&X% +M`$B-!C=NO__28M]($B%_W0% +MZ,^Z__]%BW4828M]$$6%]@^$/`0``$&-1O],BSS'28G&387_=.=)BS](A?]T +M!DB+!_]0$$R)_[X(````Z'.Y__])BWT0Z\:^$`$``$R)Y^A@N?__Z5S]___H +M=KK__^D2____2(M%R&1(*P0E*````'4%Z(V\___H6+G__TB+O=#^__](A?]T +M).A'NO__ZQU(B[T(____2(7_=`7H-+K__TB-O;C^___HUM;__TB+O6C^__]( +MA?]T!>@7NO__2(N]6/[__TB%_W0%Z`:Z__](B[U(_O__2(7_=`7H];G__TB+ +MO3C^___HZ>[__TB+O3#^___H^?O__TB-O2C^___HTB-N?__2(N]2/[__TB%_W0%Z'RY__](B[TX_O__Z'#N__](B[TP +M_O__Z(#[__](C;TH_O__Z%C#__](B[T@_O__Z&+N___I,/S___,/'OI(B@JN?__2(V]N/[__^C,U?__Z6K___](B[WX_?__ +M2(7_=`7H"+G__TB+O=#]__](A?]T!>CWN/__2(V]L/W__^A;OP``1(NEJ/W_ +M_TB+O:#]__]%A>1T-D&-1"3_3(LLQTF)Q$V%[73J3(GOZ-]]`@!,B>^^$`$` +M`.B2M___2(N]H/W__^O,2(N](/[__TB%_P^$W/O__^B4N/__Z=+[___S#Q[Z +M2(G#2(N](/[__TB%_W0%Z'>X__](B[VP_/__2(7_#X10^___Z&*X___I1OO_ +M_TB+A9C[__](B[B`````2(7_=`7H1;C__TB+A9C[__](BWAP2(7_=`7H,+C_ +M_TB+A9C[__](BWA02(7_=`7H&[C__TB+A9C[__](BWA`2(7_=`7H!KC__TB+ +MG9C[__](C7LPZ&:^``!(B=^^*`$``$R)X^C&MO__2(V%H/W__TB)A8#[___I +M[OK__TB+A1#\__](B840^___2(N](/[__TB%_W0%Z+2W__](C86@_?__2(F% +M@/O__^F*^O__2(N]\/K__[X(`@``Z'"V___IZOK__TB-A:#]__](B86`^___ +MZ6OZ__](B[V@_?__2(7_=`7H9[?__TB+O8C^__](A?\/A,SZ___H4K?__^G" +M^O__\P\>^DB)P^O=2(M%R&1(*P0E*````'4,3(V](/[__^A9N?__Z"2V___S +M#Q[Z2(G#Z?GY__^^$````$R)[^CKM?__Z7[^__],B[6P_/__387V=!Y)BP9( +MC14@5@(`2(M`$$@YT'4P08-N&`%-C6[P='9(BYV8^___Z7'[__](BT7(9$@K +M!"4H````=07H[+C__^BWM?__3(GW_]#KU$R)[__0Z8_Y__](B[WP^___2(7_ +M=`7HE;;__TB-A:#]__](B86`^___Z;GY__](A?]T!>AXMO__OE````!,B>?H +M2[7__^E/^?__9@]OO>#Z__](C05O7@4`18NF``$``$F)1A!)B[[X````00\1 +M?O!F#V^]T/K__T$/$3Y%A>1T0T&-1"3_2(LCBM?__28N^Z````$B%_W0%Z-&U__])BWYP2(7_=`7HP[7__TF+?F!(A?]T +M!>BUM?__28M^0$B%_W0%Z*>U__])BWXP2(7_=`7HF;7__T6+9BA)BWX@187D +M=#%!C40D_TB+',=)B<1(A=MTZDB+.TB%_W0%Z&ZU__](B=^^$````.A!M/__ +M28M^(.O*2(7_=`7H4;7__[XH`0``3(GOZ"2T___I8_[__TB+?;!(A?]T!>@Q +MM?__2(M]F.C8^0``2(M%R&1(*P0E*````'4(2(G?Z'&V___H#+3__V8N#Q^$ +M``````!FD/,/'OI5,<")P4B)Y5,/HEM=PV8N#Q^$```````/'T``\P\>^HL% +M1L4%`(/X/W<4C5`!B14XQ04`2(T5,<,%`$B)/,+#9BX/'X0``````&:0\P\> +M^E5(C05DR`4`2(GE05=!5D%508G]OP(```!!5%-(C1WIZ`(`2(/L2&1,BS0E +M*````$R)=2(T%%,@%`$B)!47(!0#HN+/__TB#^/\/ +MA)D```!(B=Z_#P```$F)Q.B>L___2(G#2(/X_W1)3(GV1(GOZ%I4`P!!B<5, +MB>:_`@```.AZL___2(G>OP\```#H;;/__TB+1A;05Q!74%>05]=P[\(````Z&*Q__](B<=(C07X=`0`2(D'2(M%R&1(*P0E +M*````'0WZ,&R___S#Q[Z2(G'2(G0ZS2_"````.@KL?__2(G'2(T%F70$`$B) +M!TB+1____ +MZ%"P__](@ST8QP4``$F)Q70C2(T])6L$`.BAVO__2(L]`,<%`$R)[NAXV0`` +M2(G'Z"#/``#H^[/__^NY\P\>^DF)Q>L32(M]D$B%_W0%Z/*R___HW;/__TR) +MYK\"````Z$"R__](B=Z_#P```.@SLO__2(M%R&1(*P0E*`````^%^O[__TR) +M[^@8M/__\P\>^DF)Q>N]Z+JO__](@SV"Q@4``$F)Q72-2(T]CVH$`.@+VO__ +M3(LU:L8%`$R)[TF+-NB?L?__3(GWZ(?.``#I8O___^A]K___28G%BP`]#@`' +M@`^%TP$``$B-/9YS!`!!O0@```#HQ=G__^@VL___Z1K^___H3*___TB#/13& +M!0``28G%#X0;____2(T]'6H$`.B9V?__28MU`$B+/?3%!0#H;]@``.GR_O__ +MZ!6O__]$BRCH7-G__TR+-=;%!0!-A?9TIDF+#KH2````3(U]H+X!````2(T] +MV6D$`.BTL___26/]3(G^Z"*T__])BS9,B?_HWK#__TR)]^C&S0``Z6;____S +M#Q[ZZ?3^___HLZ[__TB-/>1R!`!!O0@```#H"]G__^A\LO__Z6#]___HDJ[_ +M_TB#/5K%!0``1(LP#X2/````Z,O8__],BRU%Q04`NA(```!,C7V@O@$```!( +MC3U0:00`28M-`.@GL___26/^3(G^Z)6S__])BW4`3(G_Z%"P__],B>_H.,T` +M`.D3_O__Z"ZN__](C3WF:`0`28G%Z(G8__](BSWHQ`4`2(7_=!%)BW4`Z%K7 +M``!(BFN_/__\P\>^DF) +MQ>M@Z->M__](@SV?Q`4``$F)Q0^$IOW__TB-/:AH!`#H)-C__TR+-8/$!0!) +MBWT`28LVZ+>O__],B??HG\P``.EZ_?__/01``(!U(4B-/5]H!`!!O?\```#H +MZ]?__^DA_O__Z%>Q___I=?W__TB#/3K$!0``=$)(C3U#:`0`Z,;7__]!BW4` +M2(U]D$R+-1W$!0#HR.@``$B+=9!,B??HC-8``$B)Q^@TS```2(M]D$B%_W0% +MZ!:P__]!O0(```#IP/W___,/'OKI3OW___,/'OI)B<7I]OS__V8/'T0``/,/ +M'OI5,?9(B>5!5D%53(TMZ\`%`$%43(GO3(TE1WP%`%-(@>S0````Z%*P__], +MB>Y,C2TH@0$`3(GB3(GOZ"VN__^+!??`!0"`+9A\!0`!@_A'=S:)PDB-#0+! +M!0!(C1V;7@4`2(D9D0/[]UF10]AXF9!#VG"9D4/;]%F10_;W&9!#W+R"&9! +M#V_49D0/;V709@_?U69!#V_N9D4/Z]=F00_;W&8/[^QF00_KTV8/V^AF#]_$ +M9@]OXV9!#^_A9D0/;]YF#^O%9D$/EF#^O39D$/;]YF#^O%9D0/;[5@ +M____9@]R\Q!F#^O$9@_KTP\I@O`+```/*9+@"P``9@]O1O!F#V_09@]OR&8/ +M8-9F#VC.9D0/;]IF#VG79@]OV0\I59!F#^_29@]ISV8/8=]F#V30#RE=@&9$ +M#V'?9@]O?8!$#RE=P&9$#V]%P&9!#V_>9@]O=9`/*8UP____9@_OR68/9@_;V&8/W\9F#V_R9@]A]V8/Z\-F#VG79@]OWF9!#V_V9D$/ +M;_YF#^_U9@_;\V8/W]UF#V_I9D0/;^MF#W+U`69!#V_>9@_OW&9$#^ON9@]O +M\&8/V]IF#]_49D$/V^I$#RFM4/___V9$#V_:9@]R]@%F#^_]9D0/Z]MF#V_> +M9D$/;_=F#]OQ9D$/V]IF00]OU40/*9U`____9D$/=O%F#W+R`69!#V_C9D$/ +MV])F#W+T`69!#]OB9@_;[F8/W_=F00]O^68/Z_5F00]O[V8/V^AF1`]OQF9! +M#V_V9D$/=NEF#^_S9@_;W68/W^YF#^OK9D$/;]UF1`]O[V9!#]O?9D0/;\UF +M00]O[F8/=M]F#^_J9@_;TV8/W]UF00]O[F8/Z]IF00]OTV8/[^QF00_;UV8/ +M;_-F10]OWF8/=M=F#W+V`69!#V_Y9@]R]P%F00_;\F9!#]OZ9@_;XF8/W]5F +M00]OZF8/Z]1F00]OX&8/9@_KYV9!#V__9D0/[]YF#]O[9D0/V_IF +M10_O\F9!#W;]9@_;]V9!#]_[9D0/;UW`9@_K_F9!#V_W9D4/;_QF00]V]69$ +M#]O]9@_OWV9%#^_[9D0/;YU0____9D0/V]9F00_?]F9$#V]U@&9$#^_?9D$/ +MZ_)F10]OU&9$#]O49D0/[U609@_OUD0/*56P9D4/;]1F1`_;UV9%#^_R9D4/ +M;]1$#REUH&9%#V_T9D0/;^%F10_;VF9$#^_E9D0/[UV`9D0/V_9F10]O[&9$ +M#V_@9D$/[^AF1`_OY&9%#]OJ9D0/[VW`9D4/V^)F1`_O99!F00_OX69$#^^U +M$````"2(T%%"0` +M``^%[P(``$B-/2=2!0!(B07(L@4`3(TU^;(%`.AD[?__3(GB2(TUNK(%`$B- +M/;-S`0!(QP6HL@4`(````$C'!:6R!0``````2,<%HK(%``````#HC:#__S'V +M3(GWZ).B__],B>),B?9,B>_H=:#__TB-/?Y1!0#H">W__TB-/3)2!0#H_>S_ +M_TB-/692!0#H\>S__TB-/9I2!0#HY>S__TB-/S__TB-!8)3!0`Q +M]HL5&K(%`$B-B,@```!(C3T,L`4`@_H_=PZ)UH/"`4B)!/>^`0```$B#P"A( +M.O__X/X!@^'`@$``$B-!1$_ +M``"[!````$B-%05_!0!F#V\%_6($`$B)!1YM!0!F#V[3NP$```!(B==(B=!F +M#V[K2(VR``0``&8/<-(`9@]P[0!FD&8/;\BY"````&8/_L(/'P!F#V_Q9@]R +MT0%F#]OU9@]OWF8/9@]R\P5F#^_+@^D!=:,/*0A( +M@\`02#GP=8=(C350J@4`9F8N#Q^$```````/'T0``(L"2(/"!`^VR,'H"#,$ +MCXF"_`,``$@Y\G7F2('$T````%M!7$%=05Y=PS'VN`<```")\0^BB=^!YP`` +M`"`/A.7^__^X`0```(GQ#Z*`Y0(/A-/^__](C04D(P0`Z<[^__^)\$2)\0^B +MBU)B=%>2(GB2(/D\%!413'`,^H`] +MA6L%``!U*U5(@SUJ:@4``$B)Y70,2(L]MFH%`.A9H/__Z&3____&!5UK!0`! +M7<,/'P###Q^``````/,/'OKI=____P\?@`````#S#Q[Z5;@(````2(GE055! +M5$&\`0```%-(@^P(BT\82(M7($G3Y$DYQ$P/0N!,.>)S7DB)TX/C!TB-!#-, +M`>!(.?!R3$B+5Q!)B?U(B<9(B=?_$DB)P4B%P'0U28MU($@I\TJ-'"-)]]Q( +MC0083"'@2(T$,$B)PDB#XOA(B4KX2(/$"%M!7$%=7<-F#Q]$``!(@\0(,^DB%]G072(M_$$B#YOA(BW;X_V<(#Q^$``````##9F8N +M#Q^$```````/'T``\P\>^DB#YOQ(B?E(`?Z->OPIST@Y\74RZ:0```!F9BX/ +M'X0```````\?A```````C10/P>H"*=`E____`PT```"4B4'\2#G.='>+`4B# +MP02-D````&R!^O___P-VTHV0````<('B````GW79!0``$'"I``#@`'7-08G` +MB<*#X!_!ZAI!@^#@00G0C10/P>H)@^+X02G01(G"0<'@&H'B__\?`('J```0 +M`('BX/__``G01`G`#0```)")0?Q(.`?K2(U("'022(G( +M2#GQ`/K2(U(!'7?BT'\C3P*P>\"*?@E____``T```#KB4'\2(G(2#GQ +M'_!P`` +MP>`+"D+9D&)`&:!X?\'9H')`/!F08E(_DPYSP^" +M````!! +M@>(````>1`G0=2N)\('*``#`_X'F``#@_B7__Q\!*=`E__\__P4``.``)?__ +M'P$)\-/@B4?\@\$!@^$#=:CI?/___P\?`/,/'OI(B?A(@_X$=P/#9I"#P@1( +MC70W_$F)R(LY08G308G"02G#2#GP#X.>`0``54B)Y5.+"('QZ.CHZ/;!_G1? +M2(/`!/;%_@^$\@```,'O`DF)P??!``#^`'1,@?G___\!#X?%````2#G&#X)? +M`0``BQB_!````(V+`````8'Y____`0^&W@```$@Y\`^#H0```(L(@?'HZ.CH +M]L'^=:%(@\`#3(U(_TF-0?^%_W2X2#G&#X(9`0``B?G1Z8/_!'CHZ.CVP?YT//;%_G0[]\$``/X`=#>! +M^?___P$/ACO___](.?!RSC'_08DX2(M=^,G##Q\`T>_I7?___V8/'X0````` +M`$B-1P-(@^@!2(/H`>D'____#Q^``````$2)URG7`?DIP4B#P`2!X?___P&! +MZ0````&)2/SKIV8N#Q^$``````!!C1P#P>$#*=^)^-/H@\`!J/YU$+@``0`` +MT^"-2/\Q^8G/*=^!Y____P%)C4$#@>\````!08EY_^E@____B3G#,?](@^@! +MZ5G___\/'T0``(,_!4B)^@^'+`$``(L'2(T-2T4$`$AC!(%(`<@^_^"00`^V +M]@MW"+@%````@\8!B7<(]D<$0`^%P````+@&````PV8/'T0``$"`_N`/A^8` +M``"X.0```$#VYHG'9L'O"4&)^(GW0XT$P"G'N,W___]!]N!FP>@*C0R`B$(2 +M0`^VQT$IR$$/ML@!R(/X!`^'I0```$"(>A!$B$(1ZY\/'P#&1P8`N`@```!` +MB'<$0(3V=$IX;$"`_@%T5D"`_@)U>(!_!>!T^E5(B=%(B>5!5T&)]T%6055!5%-(B?M(@^Q8 +M1(L*QT(<`````$6%R0^$G0```$N-!'](P>`'2(T4!X"Z""4````/A)X&``!+ +MC01_0;C@````9@_OP$C!X`=(C10#QX)X)````````&9$B80#?20``,>"A"0` +M``````!(QX*P)````````,>"["0```````!(QX0#R"0```````#'@N0D```4 +M`0``2,>$`R`E````````2(V$`R`E```/$4`(#Q%`&,>"2"4```````!(BW-0 +MB[N$````0;T!````2(EUH(7_=!=(BX.(````2"N#8`$``$@YQ@^#DP4``$B+ +M01!,BTV@,?9(QT$0`````$B)19A+C01_28G#2(E%L$G!XP=*C80;>"0``$D! +MVTB)1;A!B[MX)```2(M!"$TKB[`D``!(B460@_\)#X2S`0``,?9(BT603(ME +MF$R)?#^`$/A-T!``!-AP)```2(EUJ(/X`P^%FP4` +M`#'2Z1\!``"0387)#X1W`@``3(GA3"G108"[?"0````/B%L!``!(A8'2`'>QH9^)````4B% +MR0^%C0$``(N6@"0``(72#X5'`P``2(M-P$B-%$E(P>('2`':BXJ$)```3#G) +M2(G/20]'R4@!BK`D```ISTDIR8FZA"0``(7_#X4V`@``QX)X)````````.DQ +M_?__3(GY28G?2(M=R$F+D[`D``!,`=-(B5D02(72#X3V````2('Z_S\```^& +MX0```$B+1;!(B=Y,B?M,BWW`2,'@!T@!V$B+D"@E``#'@"0E```%````2(N` +ML"0``$@!\DB)1:A+C01_2(/J`4B#[@''01P"````2,'@!TB)<1!(B90#*"4` +M`+H"````Z9O^__\/'X0``````$R)^4B+=`' +M3(E1$$B+M`,H)0``183M#X3U`@``2(-]J``/A'T"``!F#Q]$``!+C01_2(MU +MJ$C!X`=(`=A(B;"P)```2(MUB$B+D"@E``#'@"0E```%````2`'RZ5C___\/ +M'T0``$B)5:A(B5V(3(MEF$B+19!,BTV@22G<2`'822G1Z>K[__]F#Q]$``"# +M_P8/A!"0``.D3_?__#Q^``````$B+1;!,B?E)B=]( +MBUW(28MW4$C!X`=,`=-,`?A(B5D02(N0L"0``$2+B(0D``!(*=9,.)E`,@)0``2(/$6%M!7$%= +M05Y!7UW##Q^$``````"+NG@D``#I8?S__P\?1```B[.`````13'M2(E%H(7V +M00^5Q>E5^O__#Q^$``````#'AG@D```'````@#@`#X36_O__28GP2(MUR$R) +M^4R+?"D"0```````!F#VS!@>:` +M#P``#Q&$`U`E``#'@F@E```,````B?!(B8)P)0``2(M#&$B)@F`E``#I]OC_ +M_P\?0`!,B?E(BW7(3(M]P+@#````Z8CZ__\/'P!(`;`H)0``N@,```#'@"0E +M````````2(N`L"0``,=!'`,```!(B46HZ>;[__^Z`P```.G<^___3`'6OP(` +M``#I@O[__TR)^4B+=P)```2(EUJ(/X`P^%4?O__S'2Z8O[___'01P# +M````N@,```#I;_O__[@"````Z>[Y__]FD%6X_____TF)T4V+`4B)Y4%7059! +M54%44P^V3P)$BV=`BU]8T^!,BU<01(MO.(G!BU<\]]%$(>'!X02-!`M%#[>\ +M0@#^__],C30`08']____`'<<13';3#G&#X/\````#[8&P>((0<'E"$B#Q@$) +MPD2)Z,'H"T$/K\`P``10^V)`ZY +M"````$0IZ4'3[$4!XT.-#%O!X0A-C11*@_L&#X<7`@``OP$```#K#X/'`2G( +M*((P>`(2(/& +M`0G*B<$!_\'I"T$/K\LYRG.\B4(2(/&`0GZ1(GOP>\+ +M#Z_[.?H/@]P!``!)C9H`^O__0;L"````13'M1`^W(X'_____`'<83#G&#X,5 +M`0``#[8&P>((P><(2(/&`0G"B?C!Z`M!#Z_$.<(/@]<```!(C1Q+13'V0;P( +M````OP$```#K#P\?`(/'`2G(*=S/(GY1`^W/$L]____`'<83#G&#X.[ +M````#[8.P>((P>`(2(/&`0G*B<$!_\'I"T$/K\\YRG._B=RQ$&#_0,/ +MA^+^__]%*>:Y`P```$&-'#Z_`0```#G+#T?9P>,&@\-`ZQ`IR"G*@\/KJ`\?`$$I_4$/MUP" +M&"GZ08']____`'<<13';3#G&#X.K_?__#[8^P>((0<'E"$B#Q@$)^D2)[\'O +M"P^O^SGZ#X.O````0P^WG#(`]/__@?____\`=QM%,=M,.<8/@VW]__\/M@;! +MX@C!YPA(@\8!"<*)^,'H"P^OPSG"#X-#`0``0;L#````Z2S]__\/'X0````` +M`$B+3R!(@^D!Z97\__\/'P!(`U\@Z>'^__\/'X``````#[8&P>((P><(2(/& +M`0G"B?C!Z`M!#Z_$.<(/@]````!(C5Q+$$&^"````$&\"````.F0_?__9BX/ +M'X0``````$$I_4$/MUP","GZ08']____`'<<13';3#G&#X.[_/__#[8^P>(( +M0<'E"$B#Q@$)^D2)[\'O"P^O^SGZ_![PL/K_@Y^G(602G]*?I$ +MB>]F9BX/'X0```````\?`$F-F@#V__]!NP,```!!O0P```#IG/S__P\?A``` +M````*<.)^(/I`0^$GOO__T6)[(G?10^W+'H]____ +M`'<83#G&#X,N_?__#[8^P>((P>`(2(/&`0GZB?L/'T``/?___P!W&$PYQ@^#[OS__P^V#L'B",'@"$B#Q@$) +MRM'HB=$IP<'I'X/I`2'!*$"2`'QB=8/MK0WKP```$0/MHPWB``` +M`$$YT70MC7;_@^H!1`^VC#>(````1"G*0XT\24B#PDS!YP)$BPR02`'/1(D/ +M3"G'B3R02(/&3(L4L(D13"G!B0RPPP\?1```54F)^D&)\TB)Y4%505132(/L +M&&1(BQ0E*````$B)5=B+5SB%T@^$L````$&-0P'K+V9F+@\?A```````9F8N +M#Q^$``````!F#Q^$``````!(@\`!08N4@BP!``"%TG57B<:#^"9UZ4,/MH0: +MB````$F+4F`QVT&#:C@!C01`2(G122M*6,'@`CG($BC`!````````A0(!^&:#.0!U!SW__P``=ME(C4X$A=(/A7?_ +M__]$BTW49@\?A```````187)#X3L````1(G*3`'"#[=:`D2+2@2%VW3E@?N` +M````=G:-BW____]!B[+$`0``2(G0P>D'08G-2XU\;0--B>Q(P><)2`'79F8N +M#Q^$``````!F9BX/'X0``````&:02(G!B3!(!0`&``!,*<&)SD@Y^'7K08F* +MQ`$``$2)X4N-1&T`P>$'2,'@"??92(V4`@`&``"-7`N`B=A!#[:,`J\```!! +M#[:T"H@````YWG0JC4G_C4/_00^VO`J(````*?A(C31_2(/`3$B--+)!BSR" +MB3Y,*<9!B32"2(U!3$&+#(*)"DPIPD&)%()%A"+,$&)M3`!``#K +MIF8/'T0``$B)^+H!````Z8W^__^-!)(YQ@^2PH/"`>E=____#Q\`,?9,B>], +MB86@_?__3(F-J/W__TB)C;#]__^(E;_]___HX_K__P^VE;_]__](BXVP_?__ +M2(7`3(N-J/W__TR+A:#]__\/A3;___]F9BX/'X0```````\?`$B+505]=PP^V4P/IV/[__P^W,XG1Z7'^___H +M%X+__P\?@`````!52(GE05=!5D%5051)B?Q32(/L*$R++TR+=T!(BT\008M= +M!$0/MD$!28G93`'S2#G+#X2`````3(U1^@^W001$BQE(B]$B4VX3`^O^$2)7;Q,B57`20^Z]S]*C02]```` +M`$N-5'\#22G'2`'230'_2"G62HT\.>A9@___3(M5P$2+7;P/MT7(1`^V1;=+ +MC0P71(M-N$2)&6:)001!BT0D&$4/MUT",?],B77(00^W=0!%*<.%P$`/E<>- +M1OY!`?A(C41``T'1Z$6-4`),C01!1(A1`>L49F8N#Q^$```````/'T``3#G! +M='`/ME$'#[9!`4B#P09!*=,!^M'JB%$!00'2.=!SWD0/MCEF#VY!`DB)R.L: +M9F8N#Q^$```````/'T0``$0/MG#[03G6HYU@^$D0```$$/MK0TKP```(G000^VA`2O````.<9T>8G!2(/!3$&+ +M/(R%_P^$Y````(GX@^H!3`'P2(U44@-$BP!%B02,08E]!$B-/)!(B=IF9BX/ +M'X0```````\?A```````BPI(@\`,2(/"#(E(](M*^(E(^(M*_(E(_$@Y^'7B +MB?!(@\!,08L4A(D308M=!$6)#(1,`?-%`=I!T>M%*=IF18E5`DF)7"002(/$ +M*%M!7$%=05Y!7UW##[9#`0\?1```@\`!0='KT>A!@_L!=_*+$TF#Q0*)]D&) +M50`/MU,$08A%`69!B54$38EL)!!!#[:$-*\```!(@\!,08L4A(D318D,A$B# +MQ"A;05Q!74%>05]=PXGRB<%(B=Y,B>?H#_?__T&+701,`?/I:/___P\?`/,/ +M'OI5B=!!B=-)B?C!Z`.#P`-(B>5!5T%6055!5%.)TTB-5Q#!ZP*)!T&)V87; +M=#!*C3R-`````#'`9F8N#Q^$``````!F+@\?A```````BPP&08E,`!!(@\`$ +M2#GX=>]+C0Q)08/[&T*+1(K\OP$```!,C52*<$$/E\4QR4&\&P```$B--04Q +M!`#K7@\?`(G!1`^V^,'I$$8/MCP^#[;)1`^V-`Z)P0^VQ$'!YQC!Z1@/M@0& +M#[8,#D'!Y@@Q^`'_P>$01`GY"5%A.UTX(G!1`^V^,'I$$8/MCP^#[;)1`^V-`Z) +MP0^VQ,'I&`^V!`8/M@P.0<'F$,'@",'A&$0)^0G!1(GP"<@S`KD#````0HD$ +MBDB#P@1).=)UJ$&#^^QT;T&-0Q-)C4@@2(T]-#`$`$V-1(`D2(TU*$T%``\? +MA```````BP%(@\$$B<)$#[;(#[;

@0P>H81@^V#`\/ML`/MA07#[8$!XN4 +ME@`,``!",Q2.1`^V#!]",Y2.``0``#.4A@`(``")4?Q,.<%UM%M!7$%=05Y! +M7UW#9@\?A```````\P\>^E5(B>5!5T%6055!5%-(B7V82(EUH$B)58!(A=(/ +MA,,#``"+!TR-/9%,!0")1;!F9BX/'X0```````\?`$B+=9B+1;!(BWV@BU80 +MB464BP]$BT<$C035!````$B-=(802(GXB4VPBW\(1(M(#/,/;P"-0O](]]`S +M#D0S1@1(P>`%B+1;0S +M?@@%``,``$$S/(>+1;@%``$``$$S/(=!C84``@``03,\AXM%R$6+#(>-@0`# +M``!$,TX,13,,AXM%Q`4``0``13,,AXM%S`4``@``13,,AP^VPTB#[B")^46) +MRD&+%(=$B<`S5A#!Z1C!Z!B!P0`#``!!P>H8!0`#``!!@<(``P``03,4AT2) +MR`^VQ$$SE(<`!```B?C!Z!`/ML!!,Y2'``@``$$/ML!!BP2',T8403,$CP^V +MST$SA(\`!```1(G)10^VR<'I$$>+#(]$,TX<#[;)03.$CP`(``!`#[;/08G& +M1(G`08L,CS-.&`^VQ$,S#)=!B=K!ZQA!,XR'``0``(GX@<,``P``0<'J$`^V +M_$2)\$4S#)]%#[;2P>@81(G+0<'H$$2)=@0B46XB=@/MO]%#[;808G8#[;;0<'H$$'![!B)7<@/MMW!Z!C! +MZAB)7<1%#[;`B46TBT7,0<'M$$4/MNW!Z!`/MLB)3`81(MMO$2)38@)PD(/M@0;1(M-N,'A&,'@"`G00@^V%`-$BT8$P>(0"=!" +M#[84*T&)PT(/M@031(M5J,'@&$8/MA03"<)"#[8$"T2+38C!X`A&#[8,"PG0 +M#[84.XM]R$'!X1@/MCP[10G*1(M-D,'B$`G0BU8("<^+3<1&#[8,"P^V#`M! +MP>$(10G1P>$("?F+?

<0"?F+?@Q$BU6,1@^V%!.+790S'DB+=:!! +MP>(010G*03':2(M=F$2)%D0S0P1%,=A$B48$,U,(,<)(B?")5@@S>PPQSTB# +MP!!(@VV``8E^#$B)1:`/$0,/A5?\__];05Q!74%>05]=PV9F+@\?A``````` +MD/,/'OI(QP(`````,^HM' +M"(/``8E'",-FD/,/'OI(QP(`````,M(B?A(B0(QP(-'(`'#9@\?1```,M(C4<(2(D",<"#1R`!PP\?1```,M( +MC4?XZ5O___\QP$B--=DG!`!F9BX/'X0``````&9F+@\?A```````#Q\`1`^V +M'`9$.!P!=1)(@\`!2(/X$'7K2(GXZ1S___^X`D``@,-F9BX/'X0``````&:0 +M\P\>^DC'`@````!(B?$QP$B-->DG!`!F9BX/'X0``````&9F+@\?A``````` +M#Q\`1`^V!`9$.`0!=1U(@\`!2(/X$'7K2(U'\$B)`C'`@T<0`<,/'T0``#'` +M2(TU7R<$`$0/M@P&1#@,`749#Q]``$B#P`%(@_@0=,M$#[8,!D0X#`%TZS'` +M2(TU(B<$`&:01`^V%`9$.!0!=1U(@\`!2(/X$'7K2(U'^$B)`C'`@T<0`<,/ +M'T0``#'`2(TUWR8$`&9F+@\?A```````#Q]``$0/MAP&1#@<`7422(/``4B# +M^!!UZTB)^.E<____,M(C4<(Z1O___^X`D``@,-F9BX/'X0` +M`````)#S#Q[Z2,<"`````$B)\3'`2(TUJ28$`&9F+@\?A```````9F8N#Q^$ +M```````/'P!$#[8$!D0X!`%U'4B#P`%(@_@0=>M(C4?X2(D",<"#1Q@!PP\? +M1```,M(B?A(B0(QP(-' +M&`'#9@\?1```, +M^HM'$(/``8E'$,-FD/,/'OJ+1QB#P`&)1QC#9I#S#Q[ZB?8QP(E4MV3##Q\` +M\P\>^HGV,<")5+=,PY!FD/,/'OJ)5W0QP,-F#Q]$``#S#Q[ZB5=<,<##9@\? +M1```\P\>^H7V#Y6'(`,``#'`P_,/'OJ%]@^5AQ@#```QP,/S#Q[ZB?9)B=!( +MC0SWBY2WB````$B+@9@```!(*=!(BY'8````2"N1N````$@IT$F)`#'`PV9F +M+@\?A```````\P\>^HGV28G02(T,]XM4MWA(BX&(````2"G02(N1R````$@K +MD:@```!(*=!)B0`QP,-F9BX/'X0```````\?`/,/'OI(QP(`````,^E5(C4\02(GE051)B?2)UE-( +MB?N+5PQ,B>?_4QA,*>`!0PQ;05Q=PY`/'T``\P\>^DC'`@`````QP$B-#6PC +M!`!F9BX/'X0``````&9F+@\?A```````9@\?1```1`^V!`%$.`0&=15(@\`! +M2(/X$'7K2(DZ,<"#1P@!PY`QP$B-#:^HM'"(/` +M`8E'",-FD/,/'OI(QP(`````,^L='#``````QP,-FD/,/'OI52(GE051) +MB?2)UE-(B?N+5PQ,B>?_4Q!,*>`!0PQ;05Q=PY`/'X0``````/,/'OJ+1QB) +M1Q0QP,.09I#S#Q[Z54B)Y4%428GTB=932(G[BU<43(GG_U,@3"G@`4,46T%< +M7<.0#Q^$``````#S#Q[ZA=)T#H/Z!'43BQ:)T"-'''4*B5<8,<###Q]``+@! +M0`"`PV8N#Q^$``````#S#Q[ZA=)T#H/Z!'43BQ:)T"-'%'4*B5<0,<###Q]` +M`+@!0`"`PV8N#Q^$``````#S#Q[Z2,<"`````$B)\3'`2(G62(T51B`$`&9F +M+@\?A```````9F8N#Q^$``````!$#[8$`40X!`)U'4B#P`%(@_@0=>M(B?A( +MB08QP(-'*`'#9@\?1```,M(C4<(2(D&,<"#1R@!PP\?1```,M(C4<@Z=K^__^X`D``@,-F9BX/'X0``````)#S#Q[Z +M2(/O(.ES_O__#Q\`\P\>^DB#[QCI8_[__P\?`/,/'OI(@^\0Z5/^__\/'P#S +M#Q[Z2(/O".E#_O__D&:0\P\>^HM'*(/``8E'*,-FD/,/'OJ+1PB#P`&)1PC# +M9I#S#Q[ZBT<0@\`!B4<0PV:0\P\>^HM'&(/``8E'&,-FD/,/'OJ+1R"#P`&) +M1R##9I#S#Q[Z,<##9@\?A```````\P\>^C'`PY`/'X0``````/,/'OI52(GE +M051)B?Q32(GS2(7V=`E(BP9(B??_4`A)BWPD.$B%_W0&2(L'_U`028E<)#@Q +MP$G'1"1``````%M!7%W#9F8N#Q^$``````"0\P\>^E5(B>5!5$F)_%-(B?-( +MA?9T"4B+!DB)]_]0"$F+?"0P2(7_=`9(BP?_4!!)B5PD,#'`2<=$)#@````` +M6T%<7<-F9BX/'X0``````)#S#Q[Z54B)Y5-(B?M(@^P(2(M_.$B%_W0.2(L' +M_U`02,=#.`````!(BUWX,<#)PY#S#Q[Z54B)Y5-(B?M(@^P(2(M_,$B%_W0. +M2(L'_U`02,=#,`````!(BUWX,<#)PY#S#Q[Z54B)Y4%44TB)^TB#[!!(BW\X +M9$R+)"4H````3(EEZ$F)S$B-3>3'1>0`````2(L'_U`8BTWD2`%+0$V%Y'0$ +M08D,)$B+5>AD2"L4)2@```!U"4B#Q!!;05Q=P^AL:O__9F8N#Q^$``````"0 +M\P\>^E5(B>5!5%-(B?M(@^P02(M_*&1,BR0E*````$R)9>A)B1T!$&)#"1(BU7H9$@K%"4H````=0E(@\00 +M6T%<7^DC'`@`````QP$B-#1PM(B?A(B0(QP(-'$`'#9@\?1```,M(C4<(2(D",<"#1Q`!PP\?1```N`)` +M`(##9I#S#Q[Z2,<"`````#'`2(T-;!L$`&9F+@\?A```````9F8N#Q^$```` +M``!F#Q]$``!$#[8$`40X!`9U'4B#P`%(@_@0=>M(C4?X2(D",<"#1P@!PP\? +M1```,M(B?A(B0(QP(-' +M"`'#9@\?1```N`)``(##9I#S#Q[ZBT<0@\`!B4<0PV:0\P\>^HM'"(/``8E' +M",-FD/,/'OI(QT<8`````$B)^$B-?R!(QX?P`````````$B#Y_@I^(V(&`$` +M`#'`P>D#\TBKPY!F9BX/'X0``````)#S#Q[Z08G138G(387)#X0M`0``1(M7 +M%$B)\4B-5QA*C30.38G333G*#X*R````53'`2(GE05139F8N#Q^$``````!F +M9BX/'X0```````\?`$&)PD8/MA021``4`4F)PDB#P`%).<%UZ$6-2@%,B-)!-.C10/9F8N#Q^$``````!!#[9,`AB(3`<82(G! +M2(/``4PYX77J02G;2HU4&@%(B?`PV:0\P\>^DC'`@````!(B?$QP$B)UDB-%;88!`!F +M#Q]$``!$#[8$`40X!`)U'4B#P`%(@_@0=>M(B?A(B08QP(-'.`'#9@\?1``` +M,M(C4<(2(D&,<"#1S@! +MPP\?1```,M( +MC4<@Z=K^__\QP$B-%9D6!`!F9BX/'X0``````&9F+@\?A```````#Q\`1`^V +M'`)$.!P!=1-(@\`!2(/X$'7K2(U'*.F:_O__,^DB#[RCI$_[__P\?`/,/'OI(@^\@Z0/^__\/'P#S#Q[Z2(/O&.GS +M_?__#Q\`\P\>^DB#[Q#IX_W__P\?`/,/'OI(@^\(Z=/]__^09I#S#Q[ZBT^HM'"(/``8E'",-FD/,/'OJ+1Q"#P`&)1Q##9I#S#Q[Z +MBT<8@\`!B4<8PV:0\P\>^HM'((/``8E'(,-FD/,/'OJ+1RB#P`&)1RC#9I#S +M#Q[ZBT^DB)]TB%]G0,Z>]D__\/'X``````,<###Q]$ +M``#S#Q[Z2(GWZ11D__\/'T``\P\>^DB)]^D$9/__#Q]``/,/'OI52(GE2(/L +M$&1(BQ0E*````$B)5?A(B?)(C7WPOH````#H]F'__X7`=1I(BT7P2(M5^&1( +M*Q0E*````'4+R<,/'T0``#'`Z^;H/V/__V9F+@\?A```````#Q]``/,/'OJ) +M^$B#YOQ(B?E(`?XIT(UX!$@Y\70X9@\?1```BP%(@\$$C9"X___^@>+\```# +M=1D/R(G"B?@IR`'0)?___P,-````2`_(B4'\2#G.=)R$B-%#$I^(UP!$@YT7159F8N#Q^$``````!F9BX/ +M'X0``````&9F+@\?A```````9I"+`4B#P00/R,'``@7___\`J0,``/YU%@'P +M*<@E____`2W___\`P<@"#\B)0?Q(.^DB# +MYOY(B?E(@_X&#X;+````2(U\-_HIRD@Y^7(NZ;H```!F+@\?A```````C;!_ +M____]\:`#0``#X2V````2(/!`D@Y^0^#D0````^W`8/P$`^WP(/``:AW=!H/ +MMT$"@_`0#[?`@\`!J'=U>$B#P0)(.?ES9Z@(=+.+,:F`#@``#X7>````08GP +M+0@Q``!!P>@;P>`218G!08/A'40YR'-#BT$$1(T,"D'!X`=(@\$(#\A$*`"7_#P``00_(0<'H +M#T0)QD2-!`I(@\$$1"G&08GP08'@`/`/`$0)P$&)\$'!X`M!@>````"`1`G` +M08GPP>8)0<'@%('F```0`$&!X```X']$"<`)QHEQ_.GA_O__#Q\`1(M!!,'@ +M"$6-2/U$,`,1`G`$``$B)O8#^__](B95X_O__9$B+!"4H````2(E%R#'` +M2(72#X0V`P``BT<$BQ>)A:S^__^+1PB)E9#^__^)A:C^__^+1PR)A:3^__^+ +M1Q")A:#^__^+1Q2)A9S^__^+1QB)A9C^__^+1QR)A93^__](C87`_O__2(F% +M-%B<9!B?Q!B?!$B>%$ +MB>9(C17A$@0`0HL\&,'."\')!C'Q1(GF#\_!Q@9$,(?XQW@'R00-5`(G. +M`<+!S@)!`=&)RL'*#44!SC'RB<[!Q@HQ\HG.1`G&1"'F12''28/%!$F#P@1$ +M"?Y$B[VP_O__`?)(C35#$@0`1`'*08G923GU#X4<____`960_O__2(N5@/[_ +M_T6)X8NUD/[__P&-K/[__TB)T40!A:C^__]$BZ6X_O__B3*+M:S^__]$`8VD +M_O__2(N%B/[__XER!(N5J/[__P&]G/[__XN]G/[__TB#P$")40B+E:3^__]$ +M`;6@_O__1`&EF/[__XE1#(N5H/[__XEY%(N]F/[__XE1$(EY&`&=E/[__XN= +ME/[__TB#K7C^__\!B5D<#X4\_?__2(M%R&1(*P0E*````'422('$>`$``%M! +M7$%=05Y!7UW#Z/9<__]F#Q]$``#S#Q[Z54B)Y4%6055!B?5!5%-+C5QM`$C! +MXP=(`?M(@[LH)0````^$)`$``$B+LQ`E``!)B?Q(A?9T+TB+BS`E``!(.8L8 +M)0``(' +M20'40<:$)(HD````0<:$)(LD````08F<)(PD``!;05Q!74%>7<,/'P#'@T@E +M```!````N`$```!;05Q!74%>7<,/'X0``````%NX`@```$%<05U!7EW#9I!5 +M2(GE4TB)^TB#[`B+3T2%R74:2(M'*(M/!"M/0$B)]T@IQT@!R$@Y^4@/0O!( +MB=_H:^X#`(M31(72=0N+4P0Y4T!R`XE31$B+7?C)PP\?`%5F2`]NQF9(#V[* +M9@]LP4B)Y4%53(UO($%44TB)^TR)[TB#[!@/*470Z')<___S#V]3$&8/;T70 +M1(MC"&8/U,(/$4,0187D=2M(BP-(A5!5T%628G^B==!54P! +M\$%44TB#[!A(BU482(M-$$B+F$`E``!,BZ`0)0``QP$`````QP(!````A?\/ +MA/8```"+B"`E``!(B[`X)0``20&V$`(``(E-S(N(2"4``(7)=2Z+N"0E``"# +MY_N#_P%U($@YF#`E```/A8L```!(.[`H)0``#X5^````9@\?1```28M&<,<" +M`````$B%P'1I38VN,`(``.LD#Q^$``````!-`?Q,*?MT:#'2,?9,B>_HC/[_ +M_X7`=45)BT9PN@````%,B>9(B<=(.=-(#T;328G7_Q!)`8:0````23G'=,%( +M@\08N`D```!;05Q!74%>05]=PP\?1```N`L```!(@\086T%<05U!7D%?7<,/ +M'T``1(M]S#'`2(M-$$&#Y_U!@_\!#Y7`B0%(@\08,05]=PP\? +MA```````569(#V[*9D@/;L9F#VS!2(GE059,C;?@````055)B#R`````H```#K +MI`\?0`#S#Q[Z54B)Y4%6055,C6]`051,C6<84TB)^V8/'T0``$R)Y^B86?__ +MA9,B>_HI5G__XM3$(72=.Z+0PR%P'4'QT,0`````$R)Y^@( +M5___@+OH`````'4_2(L#3(VS@````$B)W_]0$$R)]^A'6?__A`$` +M``!(C;NH````Z*!5__],B??HR%;__^N&9@\?1```6S'`05Q!74%>7<.0#Q]` +M`/,/'OI52(GE05=)B<]!5D%528GU0513B=-(@^P83(MG$$B%R70&QP$````` +MA=MT'$&`O"31`````'4=08N$)-0````YPP]'V(7;=7PQP.G[````#Q]$``!- +MC70D$$R)]^BK6/__A<`/A=,```!!BTPD"(7)=1])C40D.$B)128NT)-@```!,B>],B?+H\E7__TT! +MM"38````30&T).````!-A?]T`T&)'T$IG"34````#X5(____0<:$)-$````! +M28U<)'A(B=_H]E?__X7`#X4J____08M$)&R#P`%!.40D<',O2(G?Z'=5__\Q +MP.L1#Q\`#[?0@$R)]^@65___AEW____#Q\` +M387M=`1%B64`2(/$"#'`6T%<05U!7D%?7<-F#Q]$``#'0P@!````2(U[..@( +M4___3(GWZ#!4___I:?___Y!F+@\?A```````\P\>^E5(B>5!5D%50513BT<( +M1(U@_T2)9PA%A>1T$5M$B>!!7$%=05Y=PP\?1```3(MO$$B-!7WM!`!(B?M( +MB0=-C75X3(GWZ#-6__^%P'4508M%;(/``D$Y17!S(DR)]^BZ4___2(G?OA@` +M``#H;53__UM$B>!!7$%=05Y=PY!!B45L28V]H````.A@4O__Z\QF9BX/'X0` +M``````\?`/,/'OI52(GE059!54%44XM'"$2-8/]$B6<(187D=!%;1(G@05Q! +M74%>7<,/'T0``$R+;Q!(C06M[`0`2(G[2(D'2<>%V`````````!-C7400<>% +MU`````````!,B??H?57__X7`=1E!QT4(`0```$F-?3CHV%'__TR)]^@`4___ +M2(G?OA@```#HLU/__UM$B>!!7$%=05Y=PY!F#Q]$``#S#Q[Z54B)Y4%6055! +M5%.+1R!$C6C_1(EO($6%[7016T2)Z$%<05U!7EW##Q]$``!)B?Q(C5\H3(UW +M4$B+.TB#PPCHZ5/__TPY\W7O3(GGOB@#``#H1U/__UM$B>A!7$%=05Y=PV9F +M+@\?A```````\P\>^E5(B>5!5D%50513BT<(1(UH_T2);PA%A>UT$5M$B>A! +M7$%=05Y=PP\?1```28G\2(U?$$R-=SA(BSM(@\,(Z'E3__]).=YU[TF-?"3H +MOB@#``#HU5+__UM$B>A!7$%=05Y=PV8/'X0``````/,/'OI52(GE059!54%4 +M4XM'$$2-:/]$B6\0187M=!%;1(GH05Q!74%>7<,/'T0``$F)_$B-7QA,C7=` +M2(L[2(/#".@)4___23G>=>])C7PD\+XH`P``Z&52__];1(GH05Q!74%>7<-F +M#Q^$``````#S#Q[Z54B)Y4%6055!5%.+1QA$C6C_1(EO&$6%[7016T2)Z$%< +M05U!7EW##Q]$``!)B?Q(C5\@3(UW2$B+.TB#PPCHF5+__TDYWG7O28U\)/B^ +M*`,``.CU4?__6T2)Z$%<05U!7EW#D`\?A```````\P\>^E5(B>532(/L"(M? +M"(/K`70+B5\(B=A(BUWXR<.^(````.BV4?__B=A(BUWXR<-F9BX/'X0````` +M``\?`/,/'OI52(GE4TB#[`B+7PB#ZP%T"XE?"(G82(M=^,G#OA@```#H=E'_ +M_XG82(M=^,G#9F8N#Q^$```````/'P#S#Q[Z54B)Y5-(@^P(BU\0@^L!=`N) +M7Q")V$B+7?C)P[XH````Z#91__^)V$B+7?C)PV9F+@\?A```````#Q\`\P\> +M^E5(B>532(/L"(M?"(/K`70+B5\(B=A(BUWXR<-(@^\(OB@```#H\E#__XG8 +M2(M=^,G#9BX/'X0``````/,/'OI52(GE0513BT1T#42) +MX%M!7%W##Q]$``#S#WX%L.D$`$B-!<'F!`!(B?MF2`]NR$B#P&AF#VS!9D@/ +M;M!(@\`P#Q$'\P]^!8WI!`!(B4<@9@]LP@\11Q!(BW\PZ`!1__](BWLX2(7_ +M=`9(BP?_4!!(B=^^2````.A44/__1(G@6T%<7<-F9BX/'X0``````)#S#Q[Z +M54B)Y4%505132(/L"(M'"$2-8/]$B6<(187D=`](@\0(1(G@6T%<05U=PY#S +M#WX%".D$`$B-!1GF!`!(B?M,C6_@9D@/;LA(@\!H9@]LP69(#V[02(/`,`\1 +M1^#S#WX%X.@$`$B)!V8/;,(/$4?P2(M_$.A44/__2(M[&$B%_W0&2(L'_U`0 +M3(GOOD@```#HJ$___TB#Q`A$B>!;05Q!75W#9BX/'X0``````/,/'OI52(GE +M055!5%-(@^P(BT<01(U@_T2)9Q!%A>1T#TB#Q`A$B>!;05Q!75W#D/,/?@58 +MZ`0`2(T%:>4$`$B)^TR-;^AF2`]NR$B#P&AF#VS!9D@/;M!(@\`P#Q%'Z/,/ +M?@4PZ`0`2(E'"&8/;,(/$4?X2(M_&.BC3___2(M[($B%_W0&2(L'_U`03(GO +MOD@```#H]T[__TB#Q`A$B>!;05Q!75W#9@\?A```````\P\>^E5(B>5!54%4 +M4TB#[`B+1QA$C6#_1(EG&$6%Y'0/2(/$"$2)X%M!7$%=7<.0\P]^!:CG!`!( +MC06YY`0`2(G[3(UO\&9(#V[(2(/`:&8/;,%F2`]NT$B#P#`/$4?P\P]^!8#G +M!`!(B4<09@]LP@\1!TB+?R#H]$[__TB+>RA(A?]T!DB+!_]0$$R)[[Y(```` +MZ$A.__](@\0(1(G@6T%<05U=PV8N#Q^$``````#S#Q[Z54B)Y4%505132(/L +M"(M'($2-8/]$B6<@187D=`](@\0(1(G@6T%<05U=PY#S#WX%^.8$`$B-!0GD +M!`!(B?M,C6_X9D@/;LA(@\!H9@]LP69(#V[02(/`,`\11_CS#WX%T.8$`$B) +M1QAF#VS"#Q%'"$B+?RCH0T[__TB+>S!(A?]T!DB+!_]0$$R)[[Y(````Z)=- +M__](@\0(1(G@6T%<05U=PY`/'X0``````/,/'OI52(GE4TB#[`B+7Q"#ZP%T +M"XE?$(G82(M=^,G#OA@!``#H5DW__XG82(M=^,G#9F8N#Q^$```````/'P#S +M#Q[Z54B)Y5-(@^P(BU\(@^L!=`N)7PB)V$B+7?C)PTB#[PB^&`$``.@23?__ +MB=A(BUWXR<-F+@\?A```````\P\>^E6_*`,``$B)Y>C>3/__9@_OP+D```0` +M2(T5[N0$``\10$AF2`]NRDB#PF`/$4`H9D@/;M(/$4`X#Q%`5&8/;L%F#W#` +M``\10&3S#WX%N^4$`,=`(`````!F#VS!QT!T```$``\1`/,/?@6FY00`QH`@ +M`P```&8/;,(/$4`07<-F9BX/'X0``````&:0\P\>^E6_(````$B)Y>A.3/__ +M2(T5W^,$`$B-#>"R__](B1!(QT`(`````,=`$`````!(B4@87<,/'X0````` +M`/,/'OI5OQ@```!(B>7H#DS__TB-%6?C!`!(C0T`Z?__2(D02,=`"`````!( +MB4@07<-F9BX/'X0```````\?0`#S#Q[Z5;\8````2(GEZ,Y+__](C14GXP0` +M2(T-H+'__TB)$$C'0`@`````2(E($%W#9F8N#Q^$```````/'T``\P\>^E6_ +M&````$B)Y>B.2___2(T5Y^($`$B-#4"P__](B1!(QT`(`````$B)2!!=PV9F +M+@\?A```````#Q]``/,/'OI5OQ@```!(B>7H3DO__TB-%:?B!`!(C0UPL/__ +M2(D02,=`"`````!(B4@07<-F9BX/'X0```````\?0`#S#Q[Z5;\8````2(GE +MZ`Y+__](C15GX@0`2(T-8.C__TB)$$C'0`@`````2(E($%W#9F8N#Q^$```` +M```/'T``\P\>^E6_*````$B)Y>C.2O__2(T5]^$$`/,/?@7OXP0`2(T-J*[_ +M_V9(#V[*2(E((&8/;,$/$0!F#V\%$`X$``\10!!=PV8N#Q^$``````#S#Q[Z +M5;\H````2(GEZ'Y*__](C16GX00`\P]^!9_C!`!(C0U(Z/__9D@/;LI(B4@@ +M9@]LP0\1`&8/;P70#00`#Q%`$%W#9BX/'X0``````/,/'OI5OT@```!(B>7H +M+DK__TB-%4_@!`#S#WX%+^,$`&9(#V[*2(/":,=`*`````!F#VS!9D@/;M)( +MC4HP2,=`0``````/$0#S#WX%!^,$`$B)2"!F#VS"#Q%`$&8/[\`/$4`P7<-F +M#Q^$``````#S#Q[Z5;\8`0``2(GEZ+Y)__^Y(P```/,/?@7IX@0`2(G",5!5T2-?@%!5D%5051!B?132(G[3(G_2(/L".@M1___3(LSBU,(3(GY2(G' +M28G%3(GV2(/"`>B22___3(GWZ&I*__],B2M$B6,,2(/$"%M!7$%=05Y!7UW# +M#Q]``%5(B>5!5D%508GU051$C68!4TG!Y`)(B?M,B>?HST;__TB+,TR)X4F) +MQHM#"$C!Z0),B?>-4`'H1$C__TB+.TB%_W0%Z`=*__],B3-$B6L,6T%<05U! +M7EW##Q^``````%5(B>5!54%428G\4TB)\TB#[`B+!T2++H7`=#R#^"IT/X/X +M/W0:1#GH=!HQP$B#Q`A;05Q!75W##Q^$``````!%A>UTYDF#Q`1!BP0D2(/# +M!$2+*X7`=<1%A>T/E,#KS4F-?"0$2(G>Z)/___^$P'6\187M==/KM0\?A``` +M````\P\>^E5(B>5!5T%6055!5%-(@>R(````2(FU:/___TR)A5C___],B4V` +M9$R+#"4H````3(E-R$R+31B#^00/A1T,``"#?1`!#X43#```3(E-F$B)^TF) +MU44Q]DR-9;#K*`\?@`````!(BT6P2(7`=&E*B41S*$:)?#-028/&!$F#_A0/ +MA(````!&BWPS9+@$````2HM\?H*D;__X7`=(['18P. +M``>`2(M%R&1(*P0E*`````^%>0L``(M%C$B!Q(@```!;05Q!74%>05]=P_,/ +M;T,H2(V+'`$``$R+39C'@Q@!````````BQ6[]`,`2(G(2(VS(`,```\1@[@` +M```/$8/8````\P]O0S@/$8/(````#Q&#Z````&8/[\`/$4-X#Q&#B`````\1 +M@Y@````/$8.H````9@]O!5<*!``/$8,(`0``B1!(@\`,B5#XB5#\2#GP=>_S +M#WY#2$B-?<`Q]C'`2,=%N`````!F#VS`QT6,`````$C'19``````2(E]F$R) +MK5#___\/$8/X````@_X%#X>?`@``9F8N#Q^$``````"0QX,(`0``"0```(N3 +M&`$``'4YZ6$(``!F#Q^$``````!,C4((@\8!3(F#T`````^V/XFS%`$` +M``GZB9,8`0``@_X%#X0M"```@_X!=0B%T@^%:`@``$B+N]````!(.[OP```` +M=;C'@P@!```#````N@,```"X`P```$R-+,-(B[UH____3(TT@TF+=2A-BY6X +M````3(L\QS'`28FUN````$F)M=@```!%BYZ(````38G<187;=!D/'X`````` +M00^V/`)`B#P&2(/``4PYV'7N08MV>(7V#X7T````C4+_2(F=D&#_P$/A]0'``"+4U!)BP9$B>9,B?=(BTV820-U*$0IXHE5P/]0&(M5 +MP(E#>(72=;E)B=Z+58A(BXUX____2(N=1T8X/J`8/Z +M`7=41(GB@^(#08F6B````$&#_`-W/H7`=41!QT9X`0```.LZBU6(28G>2(N- +M>/___TB+G7#___],BXU@____@^H!@_H!=Q!$B>*#X@-!B9:(````02G430&E +MV````(N#"`$``$2+9(-X2(M\PRA(.;S#V`````^$90@``$6%Y'0-BT6,A@(2#FS``$` +M``^$@`4``(/"`4B#Q@&(1O^#^@AUX4B)L_@```"+DQ0!```/'T``@?K___\` +M=SQ(B[/0````2#NS\`````^$HP8``,'B"(N[&`$``(F3%`$``$B-5@%(B9/0 +M````#[86P><("?J)DQ@!``!(B[/8````2(N3N````$B+N_@```!,BX,``0`` +M28GR22GX22G233G030]'PDF#X/Q)`=!,.<(/A:\"``!).?!U3>GV!```9@\? +M1```00^V$,'@&$B#QP$)T(A7_X/"&('B_@````^$`00``(V0@/__\(/Z#P^& +M\@,``$B+L]@```!)@\`!3#GN!```2#F[``$``'6U,=)).?`/E<+!X@-, +MB<9(B;OX````2"NSN````(F3"`$```&S#`$``$R)@[@```")@Q`!``"#^@,/ +MAC`%``!(BW-(2(N3^````$@I\@^%UP,``(M38$B+?8!(B=!(A?]T'$B+/TB% +M_W042(L_3(M]D$PI_T@YUP]"QT@/0M=(B;/X````2`'62(FS``$``(7`#X5A +M_?__3(NM4/___XM5C(72#X5.^O__@+L@`P````^$0?K__XN#&`$``(7`#X4- +M!```]X,(`0``]____P^%_0,``$B+18!(A+^````#X2K````1(V0@/__\$&#^@\/AIH```!$#[92`L'@&$B-=P-$"=!$ +MB%<"08/"&$&!XOX```!T>D2-D(#___!!@_H/=FT/MG(#P>`82(/'!`GP0(AW +M_X/&&('F_@````^$C0$``(VP@/__\(/^#P^&?@$``$B#P@1).=`/A)$"``!$ +M#[82P>`82(UW`40)T$2(%T&#PAA!@>+^````#X4O____9F8N#Q^$```````/ +M'T``23G0#X1.`@``C5`708G`1(N;%`$``$B)]\'J!D'!Z!A$BZ,8`0``2"N[ +M^````(/B`4&#P`%(`;NX`````[L,`0``]]I(B;/X````1"'"08G`B;L,`0`` +M0<'H!4&#X`%$`<),C2Q11(G:10^W50#!Z@M!#Z_218G003G4#X*7````02G3 +M02G4C5!70<'J!<'J!D4IT$2)FQ0!``"#X@%$B:,8`0``C4(!9D6)10!,C13# +M2(G"38N"N````$T[@M@````/A,X%1`'69D&)=0#I:OO__V8N +M#Q^$``````!(B?[IN/[__P\?A```````2(G^Z;'^__\/'X0``````(UR_(/^ +M`P^'*OO__TB+L_@```!(.;,``0``#X4`^___B9,(`0``B8,0`0``#Q]``$B+ +M/__ +M_^A[&P$`A<`/A4+]__](BW-(3(N-#%`$``/_____IFOK__P\?0`!(B;/X````B9,(`0``B8,0`0``Z7C___\/ +M'X0``````#'2Z5_[__]F#Q^$``````!(BW-(3(NS^````$R+K5#___])*?8/ +MA2D!``#'18P!````Z1KV__](B?=F#Q]$``!(B[/8````Z;3Z__](BXUX____ +M2(N=0/A;'X___IL_C__XF#"`$``$&!^____P`/ATKW +M__](B[/0````2#NS\`````^$-O?__XN[&`$``$B-1@%!P>,(1(F;%`$``$B) +M@]`````/M@;!YP@)^(F#&`$``(/Z`P^'T/K__XG0Z?SV__](A=)T+D&)P(@& +M0<'H"$B#^@%T%42(1@%!B@02(/Z`P^$Q0```$2+FQ0!``!$B<"#P@2) +M@Q`!``!(B;OX````B9,(`0``08'[____``^'<_K__TB+L]````!(.;/P```` +M#X5<____Z5KZ___'@P@!```#````B8,0`0``Z6[V__]!O`$```!(BX58____ +M3(GR2(LXZ+09`0"%P`^%>_O__TP!=9!%A>0/A'?Z__]$B66,Z#L`````````!;05Q=PV8/'X0``````$R- +M9PA(B[?8````3(GG_U,02(NSZ````$R)YTC'@]@`````````_U,0QH.X```` +M`$C'@^@`````````ZXH/'P#S#Q[Z54B)Y4%728GW2(G.059!54%428G44TB) +M^TB#[$A$B46T9$R++"4H````3(EMR$R+*4C'`0````!!QP$`````BU=<@?H2 +M`0``#X;&````@?H4`0``#X6=(@P8!28/M`70%@_@$=MF`>V@`#X7Q`0``@_@$#X93!```BT-I2(-[ +M0``/R(E#/'4+/?_[_[\/A\X!``#'0SC_____QT-D`````('Z%`$```^$-@0` +M`,=#7``````QTDB)=;A,B4VHZQ4/'X``````#X0C`@``2(E-N$R)3:A(BT,H +MA=(/A,8```!,B?F)UD@IP4@Y\0^#'0(``(7)#X2M````B=:)RBG.BWM$BTM` +MA?]U$T2+0P1%B<)!*9(B=]$B%6@2(E%P.C`JO__1`^V5:"%P`^$P@,``$R+=9! +M@_X4#X>L````@_@"=`E%A-(/A3(#``!,B6,P3(GB3(G^2(G?36/VZ%_=__]( +MBTLP2(G*3"GB23G6=7I(BWVX2`$7A)).=5S +MAL=#7/\!``#K>0\?1```22G528G,BU-<@?H2`0``#X7I_?__3(M-J$2+0SRX +M`0```$6%P`^$SP$``.E:____#Q^$```````Q]NGJ_?__9@\?A```````BT6T +M3(M-J(7`#X26`@``0<!/C10L18G&,ZZ`@```+@!````08D1ZZZ`P```#'`ZXE(BW6X1(GP3(M-J$0IP$@!!D2)Y!N`$` +M``!,*=9)*=&+4PQ,B4W`2#G6_O__QP,````` +M0<<&`````(L#Z4/___\/'X``````2(E%P.E<____#Q^``````,=#;!,!``#' +M0W0`````0(#^WW9T2,=#4`````#'0VP4`0``BT,(QP,'````3#G(#X,@____ +MZ[F0QT-L$P$``,=#=`````!`@/X!#X5<_O__2,=#4`````#'0VP4`0``Z4C^ +M__\/'T``0<<&`0```#'`Z<_]__]FD$''!@(````QP.F__?__9I!`@/Z?=I7K +MC`\?A```````0<<&`P```#'`Z9_]__\YQ@^$A?W__S'`Z9#]___H;C'__V9F +M+@\?A```````#Q\`\P\>^E5(B>5!5TF)ST%638G.055)B?U!5$&)]%-+C0QD +M2,'A!TB-!`](@^Q(2(NP."4``$R+51!D3(L<)2@```!,B5W(3(M=&$F),4G' +M`@````!!QP,!````@+@))0````^%"0$``$N-!&1%,"0` +M`$$/E,#H_OO__TB+DS@E``!(BTW`B8-()0``3(M5H$@!RDB)DS@E``!)B19( +MBY.P)```2(F30"4``$F)$H7`=11,.?E,BUV8="Z#?:P!=5BX"P```$B+5` +MA"0```````!(QX"P)````````,>`["0```````!(QX0/R"0```````#'@.0D +M```4`0``QH`))0```.F?_O__Z),O__\/'P#S#Q[Z54B)Y4%7059!O@0```!! +M54%44TB#["B#^@0/AAP!```/MA:`^N`/AQ`!``"X.0```$2+?@%(B4W`28G] +M]N)!B<1F0<'L"42)XXT$VRG"N,W____VXT0/MN)$B>:)PF;!Z@J-!)*)VBG" +MB%7(Z#L1`P!!B<:%P`^%$`$``$&!_____S\/ME7(2(M-P`^'PP```$&!____ +M/P`/A_X```!(Q\8`\/__0;C_#P``N``0``!!.<=!#T/'08G!B`(1`G@08E%`$B#Q"A$B?!;05Q!74%> +M05]=PV8/'T0``$C'Q@``P/]!N/__/P#I1?___V8/'T0``$F+=0A(B<__40A) +MQT4(`````&9F+@\?A```````#Q\`0;X"````ZZ@/'X0``````$C'Q@``\/]! +MN/__#P#I_?[__V9F+@\?A```````#Q\`\P\>^E5(B>5!5%-(@^P0BW#H`````````!(C;NP````Z(HM__](BT7H9$@K!"4H````#X6W````2(/$ +M$$B-N]@```!;05Q=Z?,O__\/'P!,C:.P````3(GGZ)$N__^%P'1=3(UC2$R) +MY^B!+O__A#H=2S__\=#,`````!(QT,H +M`````.DK____D,=#0`$```!(C7MPZ+`J__],B>?HV"O__^NY9@\?1```QX.H +M`````0```$B-N]@```#HBBK__TR)YTR-8TCHKBO__TR)Y^@&+O__ANP +MZ'LL__^09BX/'X0``````/,/'OI52(GE05=!5D%505132(/L&(M'.$2-#P/W__P````!,.?MUTDF-G"00)0``38V\)!!5``!F +M#Q]$``!(BS-(A?9T&4F+!"1(BA(BT7(28'' +M$`$``$DYQW6X28NT).@!``!(A?9T&DF+A"20`0``2(G'_U`(2<>$).@!```` +M````28V\)%`"``#HE"K__T''A"1H`0```````.F0_O__#Q\`\P\>^E5(B>5! +M5T%6055!5%-(@^P8BT<(1(UH_T2);PA%A>UT&TB#Q!A$B>A;05Q!74%>05]= +MPV8/'X0``````$B-1]!,BV<0\P]^!0##!`!(B47(2(T%[;T$`&9(#V[(2(/` +M8&8/;,%F2`]NT$B#P&@/$4?09D@/;MA(@\`P\P]^!=+"!`!(B0=F#VS"#Q%' +MX/,/?@7'P@0`9@]LPP\11_!-A>0/A-$```!,B>?HGNW__T&+A"1H`0``A<`/ +MA#P/W__P````!,.?-UTDF-G"00)0``38VT)!!5``!F#Q]$``!(BS-( +MA?9T&4F+!"1(B`(``$V-M"1X)``` +M0<>$)+`!```!````9@\?1```3(G_Z+CZ__])BU\02(7;="=)QT<0``````\? +M@`````!)BP=(B=Y(BQM(BT`@2(G'_U`(2(7;=>A)@<<0`0``33GW=;Q)B[0D +MZ`$``$B%]G0:28N$))`!``!(B$)&@!````````Z8G^__\/'X``````\P\>^E5(B>5!5T%6055!5%-( +M@^P8BT<01(UH_T2);Q!%A>UT&TB#Q!A$B>A;05Q!74%>05]=PV8/'X0````` +M`$B-1]A,BV<8\P]^!<#`!`!(B47(2(T%K;L$`&9(#V[(2(/`8&8/;,%F2`]N +MT$B#P&@/$4?89D@/;MA(@\`P\P]^!9+`!`!(B4<(9@]LP@\11^CS#WX%AL`$ +M`&8/;,,/$4?X387D#X30````3(GGZ%WK__]!BX0D:`$``(7`#X7+````28V< +M)%`E``!-C;0D4%4``.LG9F8N#Q^$``````!F9BX/'X0```````\?1```2('# +M@`$``$PY\W0N@'NX`'3N2(NS0/___TB)W_]3",9#N`!(@<.``0``2,>#P/W_ +M_P````!,.?-UTDF-G"00)0``38VT)!!5``!F#Q]$``!(BS-(A?9T&4F+!"1( +MB`(``$V-M"1X)```0<>$)+`!```! +M````9@\?1```3(G_Z'CX__])BU\02(7;="=)QT<0``````\?@`````!)BP=( +MB=Y(BQM(BT`@2(G'_U`(2(7;=>A)@<<0`0``33GW=;Q)B[0DZ`$``$B%]G0: +M28N$))`!``!(B$)&@! +M````````Z8K^__\/'X``````\P\>^E5)B?I(C;\X`0``NJNJJJI$B=!(B>5( +M@^QX2,='^`````!(QX>(`````````$B#Y_@I^&8/;Q7QZ`,`C8C(`0``,<#! +MZ0/S2*M!QT(X`````$''0B``````18M*-$F+>D!!BT(\18M:)$D/K]%(C0P' +M18G818E:&$F)2EA,`HF2(G.:])42"G608/[#$&[\____T4/0\-, +M```8``$@IT$F)QF#V', +M9@_;PV8/8`/MDWBB$BL +M#RE%T`^V3=.(2+(/*47`#[9-Q(A(N`\I1;`/MDVUB$B^#RE%H`^V3::(2,0/ +M*460#[9-EXA(R@\I18`/MDV(B$C0#RF%O@,$``!FB7CB +MOP,$``!F1(E`YD&X`P0``&9$B4CJ9D2)6.YFB4CR9HEP]F:)>/IF1(E`_F:! +M^C@$#X41____0<>"V`,`````!T#)PV9F+@\?A```````9I!52(GE05=!5DF) +M_D%505132(/L2$B+7Q"`>P$>=PY(BP>+4`B%T@^%!`(``$&+1AB%P`^$Z`,` +M`$F+1E@/MA-,C6`!B!!-B69833MF8`^#F`0``$F+3A!-BWY`3(GBBT$"3"GZ +MB57,A<`/A8$!``!)BP9)BUX(B5$"2(G'1"GX3`'X9D@/;L!F#VS`00\1!D@Y +M^P^$K0,```^V40&X`0```$0/MP=)B(".=`/D\"#Q@,/ML!!C40" +M`6:)I$B=!!#[:T`:\```!!.K0!L`````^%"0(``(M[!(TTE0`````/MT," +M03GVC335`````$$/D\(YQD`/D\8!TD`/MO9$(=9$.?*#T`"--'!!#[?$00^V +M50%$BUW,08/$`4B-!$!%#[95`$B-/$>-1@8/K\),`?^-%`Y$B!=$C1129D2) +M(P'`1(E?`D>-'!)$.=@/@AW___]$C1S213'D1#G808G300^3Q$'!X@)$.=!! +M#Y/"0<'C!$$ITT4/MM)$.=A!@]K_0XU$%`0!QNG__O__#Q\`.<(/@PD#``!! +MBUX828L^C5/_28M>"$&)5AB%T@^%;?[__S'22#G[B47,#Y7"22G438EF6.E6 +M_O__#Q^``````$B+1T!(`<)F@SH!#X3=`@``BTH$2`'(#[8+.`@/A.,"``!F +M9BX/'X0```````\?`$B)QDB#P`8X"'7U#[9X`4`Z?@%R(D2+2/I$BT`"1(D( +M1`^W2/YF1(E(!$B)\(@.0(A^`42)1@)`@/]R#X>+_?__@\<"0(AX`6:#0@(" +MZ7K]__]F#Q]$``!!BX$P`0``A<`/A9$!``!!#[:!B````$F+<5"-%$!)BT%( +MP>("2"G&.=8/@H@!``!(`<))B5%(2(7`#X3P`0``#[9[`@^VP2)\HEX`D2)UT2)4P1`@/X=#X?F````1(T4-@'2B%`!BW7`00-Q'$0! +MUNDQ_O__9@\?1```0`^VQD2-6`&)1;A)C7-,3(G?08L$L87`#X4Z`0``0P^V +MA!F(````38M94(TT0$F+04C!Y@))*<-!.?,/@B\!``!(`<9)B7%(2(7`#X17 +M`0``BW,$2(E%J$F-/#=)B?-!C7+_2(E]L$B-='8#3(T4L$B)QF9F+@\?A``` +M````9I"+!TB#Q@Q(@\<,B4;TBT?XB4;XBT?\B4;\3#G6=>*+=;A(BT6H3(M5 +ML$B#QDQ,*?A!BSRQ08DZB<=%B1RQB4,$Z37]__\/'P"Z>````$&Z>````.D0 +M____#Q^$``````!,B??H6)C__V9(#V[`9@]LP$$/$09(A<`/A*T```!)*T9` +MB4,"2(/$2%M!7$%=05Y!7UW##Q]``$P!^(L008F1,`$``.F/_O__#Q^````` +M`$R)SS'V3(E%J(E-L$R)3;CHRY3__TR+1:B+3;!,BTVXZ5K^__\/'P!,`?B+ +M.$&)/+'IZ_[__V8N#Q^$``````")_DR)STR)19B)3:1$B57(B56H3(E-L.B$ +ME/__3(M%F(M-I$2+505]=Z2_V__],B?=(B4W`Z'.7__](AE9_?__9I#S#Q[Z54B)Y4%7059!54%4 +M4TB!["@!``!,BS],BV]`9$B+'"4H````2(E=R$B)^XM':$2+=VQ!#[$R)E;C^__]!P>8(2(G'_Q!,BY6X_O__ +M#[;`00G&BT-H1(ES;,'@"#W___\`B4-H#X8R!@``3(L[10^W3P),B6,000^V +M5"0!08/!!$4/MBPD9D6)3P*)T$$/MDPD^X/"!(/`!$&(1"0!.=%S.4&+="3Z +M08M,)`)%B&PD^D&(1"3[08DT)$$/MW0D_D&)3"3\9D&)="0$38G43(E3$(/Z +M?`^'*08``(M3&(72#X4&!0``08M$)`)(`T-`2#E#6`^#\P0``&9(#V[`9@]L +MP`\1`T$/ML7I<@$``&8/'T0``$&+5PB+>RQ!#[9W`T$/MU05`$&)^4'!^1I( +M@^X!1`^VA!/'`0``2(M3$$!(P>8&1`-+(`^V"D$/ME<"P>H$P>D%@\(, +M@\$&@^(0@^$(1`'*B4LH`H*#[:4$\@#``!$B7-L2(U- +MP&8/=L")0VB)4QQ(C97`_O__#RD"2(/"0`\I0M`/*4+@#RE"\$@YT77H00^V +M5P+'0R``````QH05P/[__P`]____`'='2(M#>$2+:VQ(B<=!P>4(_Q!$#[;@ +MBT-H10GLP>`(1(EC;(E#:#W___\`=QM(BT-X0<'D"$B)Q_\0P6-H"`^VP$$) +MQ$2)8VQ(BP.+>QA$#[<0C5I%(>Z#Z@%%#[;V2(U44@-%(?%,C1R19F8N#Q^$``````!F9BX/'X0` +M`````&9F+@\?A```````9F8N#Q^$```````/'T0```^V$0^V<09(@\$,#[:4 +M%<#^__\/MK0UP/[__R)1]4`B$"1"GX2(T,<8MS*$@!\3G"#Y+`#[;`2,'@`DB-#(@/MH03 +MQP(``$C!X`9,C;P!W`,``$D!WT$/MP=!#[9/`HG"T^@IPHG!@_@!9D&)%X/1 +M`(M#:$&--`DQTD2+4VSW]C'208G#B4-H1(G00??S1#G(#X(+`P``.?`/@_D" +M``!%#Z_+1(G8#[?_#Z_!2(T4?TF-#%1%*KI?/W__P\?1```1#G`#X.A`@`` +M*?AF#W;`C10(B?!(C4W`#Z_"02G&1(G`*=!(BU,01(ES;`^OQHE#:`^V$L'J +M!8/"!H/B"(E3*$B-E<#^__\/*0)(@\)`#RE"T`\I0N`/*4+P2#G1=>A!#[84 +M),:$%<#^__\`9F8N#Q^$``````!F#Q^$``````!!#[9-`$$/ME4&28/%#,:$ +M#<#^__\`QH05P/[__P!-.>5RW>G/_/__#Q^$```````/K_>)8(2(G'_Q`/ML!!"<:+0VA$B7-LP>`(B4-H/?___P`/AG\!``!, +MBSM!#[9]`44/MT<"08GZ18G!C00_3(EK$$4/MF4`03G`#Y+`08/!!$&#P@2# +MQP0/ML`!0RR)0R!F18E/`D6(50&#_WP/AR,!``"+2QB%R0^%O````$&+10)( +M`T-`2#E#6`^#J@```&9(#V[`9@]LP`\1`T$/ML3IGOS__V8N#Q^$``````!( +MB=_H*/3__^D,^___#Q\`9H/J@&9"B51##(E+:('Y____`'$'!Y@A( +MBRS!8V@(#[;`00G&1(ES;$$/ME<#28U'`D&+3P2#QP%%#[9G +M`DB)0Q")T,=#(`$```#WT(E[+,#H!P'008A'`XM#&(7`=0U)` +M````2(G?Z)WS___I5?___P\?A```````3(V[V`,``+D!````Z6+]__](BT-X +M3(F5N/[__T'!Y@A(B8(2(G'_Q#!8V@(#[;`00G& +M1(ES;.EA_O__2(G?Z/"1__],BV,0Z<;Y__]F20]NQ68/;,`/$0/IL_[__[C^ +M____Z5#[__^)QP^VM;C^__])C50D!D0I]P^(6@$``&9F+@\?A```````9F8N +M#Q^$``````!F9BX/'X0``````&9F+@\?A```````9@\?A```````#[8*1`^V +M:@%)B=1(@\(&1`^VM`W`_O__2(G.B?E%(>Y%#[;V1"GW>==$`?!!#[;518G6 +M*<@IT$$/K\-!*<9$B=@/K\)$B7-LB4-H/?___P!W5DB+0WA!P>8(2(G'_Q!% +MB?(/ML!!"<*+0VA$B5-L18G5P>`(B4-H/?___P!W&TB+0WA!P>4(2(G'_Q#! +M8V@(#[;`00G%1(EK;$$/ME0D`4$/MC0D08G500^V3P*`^09W'4&`;P,!=1:- +M00%F0=$G08A'`K@#````T^!!B$<#BT,P08/%!(/"!$R)8Q")0RQ(BP-F@T`" +M!$6(;"0!@_I\=QM(B=]`B+6X_O__Z)_Q__\/MH6X_O__Z??Y__](B=]`B+6X +M_O__Z&20__\/MK6X_O__Z\V)P>G]_O__Z%\2__]F9BX/'X0```````\?0`#S +M#Q[Z2(T-M?$$`.D@F@,`\P\>^E5(B>5!5%.+!TB)^X7`=40Q]DB-?Q#HL1/_ +M_X7`=`U;05Q=PP\?A```````,?9(C7LXZ)42__^%P'7DQT,(`````$C'`P$` +M``!;05Q=PV8/'T0``$R-9Q!,B>?H7!/__X7`=;O'0P@`````3(GG6T%<7>GE +M$/__#Q]$``#S#Q[Z54B)Y4%7059!54%44TB![#@!``!D3(LT)2@```!,B77( +M28G^28U&2$V++DB)A0#___])C49P2(F%L/[__TV)[TB+O0#____H\!+__X7` +M#X4H!```18M.0$6%R74B2(N=`/___TR+I;#^__^03(GG2(G>Z.42__]!BWY` +MA?]T[46+1CQ%A%(/___P`````QV\>%Z/[__P````!(QX78_O__```` +M`$C'A0C___\`````2,>%P/[__P````!(QX70_O__`````,>%./___P$```!( +MQX40____`````$C'A3#___\`````38VFL````(F5&/___TR)Y^B)$?__A<`/ +MA<$"``!!BX:H````BY48____38VNV````(7`=26)E1C___\/'P!,B>9,B>_H +M=1'__T&+AJ@```"%P'3JBY48____08N&I````(7`=0M!QX:H`````````$R) +MYXF5&/___^C`#O__A<`/A5@"``#'A53___\!````18MO0$6%[0^%QPD``$&+ +M1VB+E1C___^%P`^$MP,``$2+I2#___^+C2C____'A4S___\!````187D=$%( +MQX58____`````#'2,?9(QX5@____`````$B+A3#___](*=I)C;_`````B8T8 +M____2"G&Z/JS__^+C1C___^)PHNU./___XN]*/___X7V#Y3`00^4Q`^VP(F% +M4/___X7_#X2,````28M'*$B+0!B%TG44@^$!=`^+E4S___]%,>V%TD$/E,5, +MC8U4____2(V54/___T&+=@A)BW\P3(N%P/[__TB+C=#^__]!442+C?#^__]2 +M1(GJ_]!!78G"6(72#X64`P``BX4X____"X50____B84H____#X0T"```QX4H +M____`````&8N#Q^$``````!$BYU4____187;#X0(`@``1(N5(/___T&+CZP` +M``!%A=)T)(72=2"+G>C^__]!BT=H"X5,____"=@)R`N%*/___P^$T0$``(7) +M=0M!BT8(08F'J````$B#O1#___\`#X64`0``183D#X6+`0``1(N%4/___T6% +MP'5G08M^"(7_#X0A"```0<='0`$```!)C9]0`0``2(G?Z$0/__^%P`^%?``` +M`$''AT@!```!````28V_>`$``.B5"___2(G?08G$Z+H,__^%P'56187D#X01 +M_/__1(GBZTH/'X0``````$F-G[@!``!(B=_H\0[__X7`=2U!QX>P`0```0`` +M`$F-O^`!``#H1@O__TB)WT&)Q.AK#/__A<`/A`\'```/'P")PDF+'HM#1(7` +M=0.)4T3'0T`!````3(VC4`$``$R)YXF5./___^B5#O__BY4X____A<`/A!4' +M``!,C:.X`0``B94X____3(GGZ'(.__^+E3C___^%P`^$Q`8``(72#XX3!P`` +M1`^WZDR-H^````!!@%8/___P````#'A;C^__\`````QX7P_O__`````,>%*/___P`` +M``#'A/___TB-A6#___]( +MB84@____2(G"28M'*/\0BT6`1(N%?/___XF%V/[__T&#^`$/A$<$``!(BY5P +M____387M#X5Y`0``BX4X____1`G`#X77"0``2#G:#X5[!@``2(N%&/___TR+ +M&,>%*/___P$```!%,>U-A=L/A+$!``!-BR])C4,@28M_$$B)A3#___]-A>T/ +MA$$+``!,BZ4P____3(F]./___S';38GO3(FUT/[__TR+K2#___]-B>9,B9WH +M_O__28G\ZQ1F#Q]$``!(AI,B>=! +M_Q0D2(N-8/___T@!RTD!SDDISX7`=,I,B[TX____2(NU"/___XG"2`&=$/__ +M_TB#O1C___\`2`]$\TF+!TD!GY````!,BYWH_O__3(NUT/[__TB)M0C___]( +M.<-T"T''AY@````!````A=(/A(0!``!!B5=@2(NUR/[__T''AY@````!```` +MQX4X____`0```$@YM1#___\/A7H!``!(BX4P____3(NE&/___T4Q[4R)G1C_ +M__](B87H_O__2(N%$/___TB)A`````Z4#^__\/ +M'X``````QX4X____`````$F+1R!)BQ](B<=(C7,@_Q!)B<-(A<`/A#H*``!( +MQP``````2(N%&/___TB%P`^$XP```$R)&$F-0R!(B87H_O__387M#X0R"0`` +M3(NE&/___TR)G1C____I"?W__V8/'X0``````$R+O3C___](`9T0____2(.] +M&/___P!,BYWH_O__3(NUT/[__TF+!P^$10$``$D!GY````!(.=AT"T''AY@` +M```!````2#G8#Y7`#[;`B84X____2(NUR/[__T@YM1#___\/A(;^__],BX7@ +M_O__,=(Q]DR)_TB+C?C^__],B9T@____Z'BM__^)PH7`#X7+"@``B[5,____ +M3(N=(/___X7V#X1&_O__Z5,)```/'T``28U#($V)7A!(B87H_O__387M#X01 +M#0``3(F=&/___T4QY.DI_/__9@\?A```````38VOX````.E+^___187D#X18 +M^/__Z9GX__]F#Q]$``#'@[`!```!````2(V[X`$``.CZ`___3(GGZ"(%__^+ +ME3C___^%T@^/&/G__^LIQX-(`0```0```$B-NW@!``#HS`/__TR)Y^CT!/__ +MBY4X____Z<+X__],C:/@````08G5Z?#X__])BP9(8T!$Z1[Y__])`9^0```` +M2#G8=`M!QX>8`````0```$@YV$B)G0C___\/E<`/ML")A3C____IK_[__\>% +MV/[__P````#'A2C___\`````2,>%"/___P````!(QX7(_O__`````$C'A1#_ +M__\`````Z;S]__]-A>T/A4D#``#'A?#^__\`````9@_OP#';QX4@____```` +M`,>%N/[__P````!(QX7`_O__`````$C'A=#^__\`````QX4H____`0```,>% +M./___P$```#'AX````#X,9`@`` +M2(N]J/[__XF5./___\>%3/___P$```#HG0/__XN5./___X72#X76`0``A-L/ +MA-,*``!(QX58____`````$C'A6#___\`````2,>%V/[__P````#'A3C___\! +M````38MN$$B-A6#___\QVTR-I5C___],C8U4____2(F%(/___TB+C0C___], +MB>Y,B:7H_O__38G]2(N%6/___TC'A3#___\`````3(NE$/___TF)]TR)C1C_ +M___K%9!)BU4`3(GA38L_2"G!2#G12`]'RD@!R$4QP$&+=@A)BWTP2(F%6/__ +M_TPYX$F+12A)C5<@QX54____`0```$R+C>C^__]!#Y3`_[48_____[4@____ +M_U`07D&)P5^%P`^%/@,``(N55/___X72#X45`P``2(N%6/___TPYX`^$!0,` +M`$B+O3#___](BY5@____2(G&2"G^2"G:2(GW2`G7#X1:____3(N%X/[__TB+ +MC?C^__],B>]$B8V\_O__Z/VI__]$BXV\_O__A<`/A4$%``"+A4S___^%P`^% +MJ`(``$B+A5C___](BYU@____2(F%,/___^D&____QX6X_O__`````+H+```` +MQX7P_O__`````,>%R/[__P````#'A2#___\`````2,>%P/[__P````!(QX70 +M_O__`````,>%*/___P$````QP$B)A5C___](B85@____Z1`)```/'T``2(N] +MJ/[__XF5,/___\>%3/___P````#HA`'__XN5,/___X72=<&$VP^$1P@``$F+ +M1RA!BW8(28M_,/]0"(F%Z/[__X7`=&E(QX58____`````#'2,=M(QX5@____ +M`````,>%(/___P````!(QX78_O__`````,>%./___P$```!(QX4P____```` +M`.G2\?__2(NU,/___TB+O>C^__](B=KH&@'__^F<_/__#Q]$``!$BZ4X____ +MQX4@____`0```$6%Y`^%-0$``$&+1W!!.T=L"$2-:P%!.<4/@^\```!$B>A(B<)(P>($2`'02,'@!$F)Q$B-@`@!``!( +MB84P____28V<)%`!``!,`?M(B=_HU@+__X7`#X4.]/__3(GH2XV\)W@!``!( +MP>`$3`'H2,'@!$''A`=(`0```0```.@7__[_2(G?B84X____08G%Z#8`__^% +MP`^%SO/__T6%[0^%[P8``$B+A3#___]$BX4@____2,>%6/___P````!(QX5@ +M____`````$P!^$B)A=C^__]%A<`/A9+\___'A?3^__\`````,=(QV\>%(/__ +M_P````#'A>C^__\`````2,>%,/___P````#I?O#__[M0`0``13'D13'M2,>% +M,/___P@!``#I(/___TC'A5C___\`````2,>%8/___P````!(QX78_O__```` +M`.D?_/__#Q\`1(F-Z/[__TV)[S'2QX4@____`0```.D?\/__2(N]J/[__XF% +MZ/[__TV)[^BH`?__08N-L````(7)="!(BX7X_O__23N%N````'(02(N]J/[_ +M_^@A__[_,=+KL4B+A?C^__]!QX>P`````0```$F)A[@```#KU4B)PDC!X@1( +M`=!(P>`$28V\!Z@!``!(B$B)A=#^__](A<`/A)0$``!(B=A(BXT0____2(N]T/[__TG'AX`````` +M````2"G02(NU,/___TF)AX@```!(*=E(@\<@2(T<$4@!UDB)PDB)G1#____H +M8O[^_TV%Y`^$>`(``,>%\/[__P````#'A3C___\`````QX7(_O__`````+L! +M````QX6X_O__`````$C'A<#^__\`````2,>%T/[__P````#'A2C___\!```` +MQX4@____`0```.GD^?__2#G:#X2%````2(N%,/___T@!T$B)A=#^__](B=A( +M*=!(B87`_O__,T/E<")A?#^__](BX40____2`'02"G82(F%$/___TV% +MY`^$+0,``,>%R/[__P````"[`0```,>%N/[__P````#'A2C___\!````QX4@ +M____`0```,>%./___P$```#I5OG__\>%./___P$```#'A?#^__\`````9@_O +MP$$/$8>`````Z07___]-BR])BW\02(F%,/___TB-A6#___](B84@____387M +M#X6_]/__,<`QVT@YV`^5P`^VP(F%./___^D`]___1(F-Z/[__TV)[XG"Z7#] +M__]-BR])BW\0QX4H____`````,>%V/[__P````!-A>T/A$H#``!(BX7H_O__ +M3(N=&/___TC'A0C___\`````2,>%$/___P````!(B84P____2(V%8/___TC' +MA1C___\`````2(F%(/___^DI]/__08/X`P^$B/[__T@YV@^$%____TB)E1#_ +M___I#O[__\>%./___P$```"Z`0```,>%\/[__P`````QV\>%(/___P````#' +MA%P/[__P````!(QX70_O__`````.D'^/__28V\ +M'T`!``#HD^K__T&)Q87`#X4/_?__28T$'T2+B#@!``!(B84X____187)='I! +MBT=P@\`!08E'<.D%^___2(N%%./___P````#'A%(/___P$```#I7O?__TR-99!,B>?HV_S^_T&) +MQ87`#X5G_/__,?9,B>?H-OW^_T&)Q87`#X6P`0``28V,'P@!``!)C;P?,`$` +M`$R)YDB-%3'J___HG/[^_T&)Q87`#X6&`0``2(N%./___TR)Y\>`.`$```$` +M``#HR/W^_^D2____2,>%6/___P`````QVTC'A6#___\`````QX6X_O__```` +M`,>%\/[__P````#'A%Z/[__P````!(QX78 +M_O__`````$C'A<#^__\`````2,>%T/[__P````#'A3C___\!````2,>%,/__ +M_P````#I(.O__TB)E0C____IQ_S__TC'A5C___\`````,=(QVTC'A6#___\` +M````QX4@____`````,>%Z/[__P````!$B:WT_O__2,>%V/[__P````#'A3C_ +M__\!````2,>%,/___P````#INNK__TF+1R!)BS=(B<=(@\8@_Q!(B870_O__ +M2(7`=!!)B4=X2(N5%P/[__P`` +M``#'A%(/___P$```#'A3C___\!````QX6X +M_O__`0```.F"]?__3(GGZ%/\_O_IE?K__TB)A3#___],BYT8____2,>%$/__ +M_P````!(QX48____`````#'`,=M(QX4(____`````.DZ\___BY4X____Z% +M8/___P````!%A=L/A63Y___'A?3^__\`````,=O'A2#___\`````QX7H_O__ +M`````$C'A=C^__\`````2,>%,/___P````#I=NG__X72#X7S]O__,TQV\>%./___P$```!(B878_O__,_H$/K^_TB%P'0[1(DP2(UX!$V% +MY'0228U-_$2)\DR)YNC@^O[_2(G'QP2?`````$B)^%M!7$%=05Y=PV8N#Q^$ +M```````Q_UM!7$B)^$%=05Y=PV:0\P\>^E5(B>5!54F)_4%44TB#[`B+1PA( +MBS^%P'1$C5C_2,'C`V9F+@\?A```````3(LD'TV%Y'0?28L\)$B%_W0%Z$GY +M_O],B>>^$````.@<^/[_28M]`$B#ZPA(@_OX=AT8I!!BT7X28/M&(7`#X27````C5C_28M]"$C!XP,/ +M'T0``$R+)!]-A>1T'TF+/"1(A?]T!>BI^/[_3(GGOA````#H?/?^_TF+?0A( +M@^L(2(/[^'7.2(7_=`7HA/C^_TTY+G6?28M%^$F-??A(C01`2(TTQ0@```#H +M9OK^_TF+?C!(A?]T!>A8^/[_28M^($B%_W0%Z$KX_O];28U^"$%<05U!7EWI +MJ?[__TF+?0CKI9!FD/,/'OI52(GE055)B?U!5%-(@^P(BT<(A^E6)^DR-3@%(B>5(@^P@9$R+%"4H````3(E5^$F)\H/_"7\E,BU)`?GI^DF)^C')#[8\#D&+%(J)^#G7=#6#^G]_ +M442-2K]$C4>_08/Y&78V08#X&7<]@\`@#[;`.<)U,TB#P0$/MCP.08L4BHGX +M.==URTB#P0&%_W6UN`$```##9@\?1```@\(@08#X&7;'.==TS3'`P_,/'OJ+ +M5PB^_O__/XG0T>B-1!`0@^#P@^@!.?`/1O`YT+C^__\_#T+P.?(/@\_X_O_I +MFJO__V8N#Q^$``````#S#Q[Z54B)Y4%718G'059)B?Y!54F)]4%428G,4XG3 +M0HT\`V8/;L](@\9(B<=(`=];05Q!74%> +M05]=Z?_S_O^09F8N#Q^$```````/'P#S#Q[Z54B)Y5-(B?M(@^P(2,<'```` +M`+\$````Z"_R_O](BQ70MP,`2(D#2(E3",8``$B#Q`A;7<.09@\?1```\P\> +M^E5(B>5!5DF)_D%5051)B?13,=N`/@!T%P\?0`"->P%!@#P\`$B)^W7S03E^ +M#'(M38LN08E>"#'2#Q]``$$/M@P408A,%0!(@\(!A,EU[EM,B?!!7$%=05Y= +MPV:02(/'`>BG\?[_28L^28G%2(7_=`7H]_3^_TV)+D&)7@SKM&9F+@\?A``` +M````#Q\`\P\>^E5(B>5!5D%5051)B?Q32#G^=#A$BW8(28GU1#EW#'(\2(L? +M18ET)`A)BT4`,=)F9BX/'X0```````\?``^V#!"(#!-(@\(!A,EU\5M,B>!! +M7$%=05Y=PP\?1```1(GW2(/'`>@4\?[_28L\)$B)PTB%_W0%Z&/T_O])B1PD +M18ET)`SKGP\?A```````\P\>^HM7"+[^__\_B=#1Z(U$$!"#X/"#Z`$Y\`]& +M\#G0N/[__S\/0O`Y\@^#Q?;^_^G*J?__9BX/'X0``````/,/'OJ+3PB+1PPI +MR#GPM$C6(!2(/'!$G'10``````9@]NR&8/<,'@9@_61=CH&._^__,/?D783(GB +M2(G>28E%`$B)QV9!#]9%"$B#Q!A;05Q!75WI0?3^_Y"_!````$&\`0```#'` +MZZZ0\P\>^E5(B>5!5TF)_T%6055!5%-(@^P8@#X`#X2/````28GU,=MF+@\? +MA```````1(UC`4.`?"4``$R)XW7Q2<<'`````&9!#V[,3HTTI00```!F#W#! +MX$R)]V8/UD7(Z'ON_O_S#WY%R$F)!V9!#]9'"$6%Y'0J,=)F9BX/'X0````` +M`&9F+@\?A```````00^V3!4`B0R02(/"`4DYU'7N2HU$,/SK(P\?@`````!( +MQP<`````OP0```#H'^[^_TG'1P@`````28D'QP``````2(/$&%M!7$%=05Y! +M7UW#D&9F+@\?A```````#Q\`\P\>^E5(B>5!5$F)_%-(B?-(@^P0BT8(2,<' +M`````&9(#V[(2(T\A00```!F#W#!X&8/UD7HZ+7M_O_S#WY%Z$B+,TF)!"1( +MB<>+0PAF00_61"0(2(/$$%N-4`%!7%WIW/+^_V9F+@\?A```````D/,/'OI5 +M2(GE05=!5D%528GU05132(G[2(/L&(M'##E'"'50/?[__W\/AZ3S_O]!B<2Z +M____?T'![`(IPD&#Q`%!.=1$#T?B18T\!$V)_$G!YP-,B?_H)NW^_XM3"$B+ +M,TF)QH72=49(A?9U6$R),T2)8PR_$````.@S[_[_3(GN2(G'28G$Z`7___^+ +M2PB-40%(B\P\>^DB)P^G]\O[_9@\?1```54B-1RA( +M@\_H +M/.S^_TB+=05]=PP\?0`")V$C!X`-( +MB<=(B47(Z*[K_O])B00D13'M08E<)`QFD$F+![\0````3HLT*.B_[?[_3(GV +M2(G'2(G#Z)']__]!BT0D"$F#Q0B-4`%!B50D"$F+%"1(B1S"3#EMR'7"Z6W_ +M__\/'T0``$B-%,4`````3(GI3(GV3(GGZ,+O_O],B??HFN[^_^D7____\P\> +M^DF)Q>FG\?[_\P\>^DF)Q>F.\?[_D&9F+@\?A```````D/,/'OI52(GE05=! +M5D%528G]051)B?13,=M(@^P(BQ:%T@^$D0```&9F+@\?A```````9F8N#Q^$ +M```````/'P"-0P&)VDB-/(4`````2(G#08L$A(7`=>A$C7H"03E=#'(N38MU +M`$&)70A,B?I,B>9,B??HZ._^_TB#Q`A,B>A;05Q!74%>05]=PV8/'T0``$B# +MQP3H=^K^_TF+?0!)B<9(A?]T!>C&[?[_38EU`$&)70SKL@\?0`!,BS=!OP$` +M``#KHY!F9BX/'X0``````)#S#Q[Z54B)Y4%6055!5%-(B?M(.?YT)$2+;@A) +MB?1$.6\,_^_TB)V%M!7$%=05Y=PV8/ +M'X0``````$2)Z$B-/(4$````Z.#I_O](BSM)B<9(A?]T!>@P[?[_3(DS1(EK +M#.NND&8/'T0``/,/'OI52(GE05=!5D%528GU051!B=132(G[2(/L"#E7#'-E +M@?K^__\_#XG^_TB+.TF)QTB%_W0%Z-'L_O], +MB3M$B6,,3(GR3(GN3(G_Z*SN_O](BP-"QP2P`````$2)8PA(@\0(6T%<05U! +M7D%?7<-F#Q]$``"%TG4%13'VZ]-,BS]!B=;KO9!F#Q]$``#S#Q[Z54B)Y4%7 +M059!54%428GT4TB)^TB#[`A(A?9T8$2+;OQ!P>T"18UU`40Y;PQR)DR+/T2) +M:PA(@\0(3(GR3(GF6TR)_T%<05U!7D%?7>D;[O[_#Q\`2HT\M0````#HN^C^ +M_TB+.TF)QTB%_W0%Z`OL_O],B3M$B6L,Z[=FD$R+/T&^`0```$4Q[>NG9I#S +M#Q[ZBPJ%R0^$H@```%6)\$B)Y4%728G_059!54F)U4%44S';2(/L&`\?@``` +M``!$C6,!0XM4I0!,B>.%TG7P187D=%)$B>9,B?^)1("2(T\@>A.[/[_28L_3(GB +M3(GN3`'WZ$WM_O]%`6<(2(/$&%M!7$%=05Y!7UW#9BX/'X0``````,.09F8N +M#Q^$```````/'P#S#Q[Z58GP2(GE0513B=.+5PB--!B)T2G!.?(/0MF%VW4. +M6T%<7<-F#Q^$``````!(BS>-#`.#P@%)B?PIRDB-#(Y(C3R&2,'B`DB)SNB^ +MZ_[_02E<)`A;05Q=PP\?0`!(BS>+!H7`#X1O`0``54B)Y4%528G]051%,>13 +M2(/L".LH9F8N#Q^$``````!F9BX/'X0```````\?A```````08G4BP0>A,"1(GF3(GOZ/O^ +M__])BW4`BP0>A____Y"#Z`%(F(/X_W02 +M@SR&+TB-4/]T'$B)T(/X_W7NA3K$P\?0`!!B<0IQXG` +M2(T3KX[@!````PV9F +M+@\?A```````#Q\`\P\>^E5(B>5!5%-,C6702(/L,&1(BQPE*````$B)7>A( +MB?M,B>?H-?;__[\$````2,<#`````.BDY?[_2(L51:L#`$B)`TR)YDB)W\8` +M`$B-3<](B5,(,=+HTA,#`$B+?=!(A?]T!>C4Z/[_2(M%Z&1(*P0E*````'4, +M2(/$,$B)V%M!7%W#Z+3G_O_S#Q[Z28G$Z0OL_O_S#Q[Z28G$Z0SL_O]F9BX/ +M'X0``````)#S#Q[Z54F)^$B)Y4%7059)B?Y!54%44TB#[%B+1@AD3(LD)2@` +M``!,B67(28GTC5C_2,'C`X7`=#P/'X``````28L$)$R++!A-A>UT&TF+?0!( +MA?]T!>@UZ/[_OA````!,B>_H".?^_TB#ZPA(@_OX=AOY/[_08G93(M%J#';QP``````28G&2(U%L$G! +MX0)(B4680;H#````ZRQF#Q^$``````!$.=,/A&\!``"-4P%)@\4$18D\GD'' +M!)8`````B=--.05]=Z1;G_O]F#Q]$``!!BT0D#$$Y1"0(=70] +M_O__?P^'D^K^_XG"N?___W],B46(P>H"*<%$B560@\(!3(E-H#G*#T?11(T\ +M`D2)?:A)P><#3(G_Z&7C_O])B<-!BT0D"$F+-"1,BTV@1(M5D(7`3(M%B`^% +ML````$B%]@^%W0```(M%J$V)'"1!B40D#+\0````3(E%D$2)5:A,B4V@Z$KE +M_O]$BU6H2(UUL$B)QTR)=;")7;A)B<=$B56\Z`SU__]!BT0D"$2+5:@QVTR+ +M3:!,BT60C5`!08E4)`A)BQ0D3(D\PD''!@````#IS?[__P\?1```2(M]F$R) +M1:!,B4VH3(EUL(E=N(E=O.B]\?__3(MUL(M=N$2+5;Q,BT6@3(M-J.E>_O__ +M3(G?2(T4Q0````!,B?E,B46`1(E5B$R)39!(B76@Z/+F_O](BW6@3(M-D$2+ +M58A,BT6`28G#2(GW3(E%@$R)78A$B5603(E-H.BGY?[_3(M%@$R+78A$BU60 +M3(M-H.GV_O__9I!!BT0D#$$Y1"0(=5P]_O__?P^'5NG^_XG"N?___W]$B56H +MP>H"*<&#P@$YR@]'T0'0B^D2+1PB+1PQ$*<`Y\'-.08T$,(GROO[__S^)P='IC4P!$+C^__\_@^'P +M@^D!.<$/1L%$.<$/0_!!.?`/@U[H_O^)\$0IP#G0#X)1Z/[_Z5J9__]F+@\? +MA```````PV9F+@\?A```````#Q]``/,/'OI52(GE4TB)^TB#[`A(BS>_"@`` +M`.BCX_[_2(/$"$B)V%M=PY`/'X0``````/,/'OJ`?PH`BU8(28GX=`:`?PD` +M=!)(BS9!#[9X".E-P`(`#Q]$``!,BPZ%TG3G,#^B]T14B)^.L,BU`$2(/`!(/Z+W0,A=)U\(M6".NQ#Q\`2"GX2,'X +M`HG"A@@9$B+#"4H````2(E-Z$B) +M\0^$HP```$FYSH#2(TTDD@!]D@I\(/`,$&(!#A(B;H +MD.K__^O*Z#GA_O]F#Q^$``````#S#Q[Z54B)Y4%6055!5%-(@^P@2(L?9$R+ +M+"4H````3(EMV$F)]<='"`````#'`P````"+=@B%]@^$,0$``(`]:ZX$``!) +MB?P/A4(!``!,C70V`D0Y=PP/@F,!``!)BW4`3(GR2(G?Z'3>_O](@_C_#X3* +M````38LL)$&)1"0(BXQV^L6#Q\` +MBT8$2(/&!$B#PP&%P`^$O````"T```$`/?__#P!WX4B-?<#HB.[__TB+?O,#Q^``````$F+=0`QT@^V!H3`=!7<.02(M%V&1(*P0E*`````^%G````$F+?0!(@\0@3(GB +M6T%<05U!7EWI50H#``\?1```08'^_O__/P^'KN3^_T2)\$B-/(4$````Z//< +M_O])BSPDQP``````2(G#2(7_=`7H/.#^_TF)'"1%B70D#$''1"0(`````.E2 +M_O__#Q]$``!!B5PD"(G;0<<$F`````!(BT789$@K!"4H````=1%(@\0@6T%< +M05U!7EWI\=_^_^CLWO[_9F8N#Q^$``````"0\P\>^E5(B>5!5$F)]%-(B?M( +MQP<`````OQ````#H7MS^_TB+%?^A`P!,B>9(B=](B0-(B5,(,=+'``````#H +M;?W__TB)V%M!7%W#\P\>^DF)Q.GMX_[_9@\?A```````\P\>^E5(B>532(G[ +M2(/L"(`_``^$1`$``#'`#Q]$``"->`&`/#L`2(GX=?1(@\NQ9BX/'X0``````(3`=!`/M@'I7/___P\?0`"$P'7=Z&?>_O^[ +M`0```(G82(M=^,G#9BX/'X0``````$&`^1D/AE[___^#QB!`./!TPNE1____ +M9@\?A```````@\`@0#C&=*SI.____[\!````Z@2#^']V[3W_!P`` +M=YY(@\,!2#G^=>)!B=Y!.5PD#`^"3P(``$V+/"1!B=U%B$``0`` +M08'B``(```\?0`"+`4R-002)QX/X?P^&#P$``#W_!P``#X84`0``1872=!1! +MB<-!@^.`08'[@.\```^$ZP```$&)PT&!XP#X__]!@?L`V```#X0$`0``/?__ +M```/AED!```]__\?``^'?@$``,'H$KD2````@^@0B`)(@\(!9F8N#Q^$```` +M``!F9BX/'X0```````\?@`````"#Z0:)^$B#P@'3Z(/@/X/`@(A"_X7)=>A, +MB<$/'T0``$@Y\0^%1____TF+!"1,*?I%B70D"$+&!"@`2#G3#X6=`@``2(/$ +M&%M!7$%=05Y!7UW#9@\?1```/?_;``!W(4@Y_G0@@/'T0``$B#PP+IE_[__P\?@`````"(`DR)P4B#P@'KA0\?1``` +MB<&#X#](@\("P>D&@\"`@^E`B$+_B$K^3(G!Z6#___\]_]L``'01!B?M!@>,`_/__08'[`-P```^$:@$``$6%R0^%(0$``(G!@^`_O^W____! +MZ0:#P("#X3^#P8"(2@%(@\(#3(G!0(AZ_8A"_^D%____#Q]$``")P8G'@^`_ +MP>D&P>\,@\"`@^$_@^\@@\&`Z\H/'T0``#W___\#=RE(@\,$Z=#]__\]____ +M`W@8N1@```"#Z`CI=O[__V8/'X0``````$B-4P5(@\,#A@>N1X```"#Z`3I/?[__X'[_O__/P^'7=_^_T&) +MW42)3<1)C7T!3(E%R.APU_[_28L\)$R+1`(08/`$,'O$D0)V$&#X#]`#[;_P>`(1`G`P>`("?AF#V[(9@_\R&8/?DK\ +MZ5_]__]!QT0D"`````!)BP0DQ@``2(/$&%M!7$%=05Y!7UW#Z3/>_O^09BX/ +M'X0``````/,/'OI52(GE055!5$R-;;!32(G[OP0```!(@^Q(9$R+)"4H```` +M3(EEV$F)]$C'1<``````Z`;6_O](BQ6GFP,`3(GOQ@``2(E%P$B)5;H +M:>;__XM3#(/Z_W1A@?KI_0``=&E(C4VO2(U]P$R)[N@9!`,`2(M]P$B+,^@] +MV/[_2(M]L$B%_W0%Z`_9_O](BWW`2(7_=`7H`=G^_TB+1=AD2"L$)2@```!U +M-4B#Q$A(B=A;05Q!75W##Q]``+H!````ZZ!F#Q^$``````!(C77`N@`"``!, +MB>_HK_K__^N4Z+C7_O_S#Q[Z2(G#Z5;=_O_S#Q[Z2(G#Z5C=_O_S#Q[Z54B) +MY4%505132(G[OQ````!(@^Q(9$R+)"4H````3(EEV$F)]$C'1<``````Z`K5 +M_O],BRVKF@,`OP0```!(QT6P`````,<``````$B)19,B6VX3(UMP$R)[TB)1;#HB>K__TR)[DB)W^A>]/__BU,,@_K_=%Z!^NG] +M``!T7DB-3:](C7VP3(GNZ.X"`P!(BWVP2(LSZ!+7_O](BWVP2(7_=`7HY-?^ +M_TB+?C6U_[_2(M%V&1(*P0E*````'4J2(/$2%M!7$%=7<,/'T`` +MN@$```#KHY!(C76PN@`"``!,B>_HC_G__^N?Z)C6_O_S#Q[Z2(G#Z6[<_O_S +M#Q[Z2(G#Z7#<_O_S#Q[Z54B)Y4%44TR-9=!(@^Q`9$B+'"4H````2(E=Z$B) +M^TR)Y^AUY/__3(GF2(G?Z(KS__^_!````$C'1<``````Z-C3_O](BQ5YF0,` +M2(E%P,8``$B)5;H]@$#`$B+ +M?CLUO[_2(M]T$B%_W0%Z-[6_O](BT7H9$@K +M!"4H````=3)(@\1`6T%<7<-F#Q]$``"Z`0```.NC9@\?A```````2(UUP+H` +M`@``3(GGZ(_X___KE^B8U?[_\P\>^DB)P^FFV_[_\P\>^DB)P^FHV_[_\P\> +M^E5(B>5!5%-,C6702(/L0&1(BQPE*````$B)7>A(B?M,B>?H!>7__XM5V$B+ +M==`/MGL(Z/6R`@"_!````$C'1<``````Z-/2_O](BQ5TF`,`2(E%P,8``$B) +M5;H\0`#`$B+?CGU?[_2(M]T$B%_W0%Z-G5_O](BT7H9$@K!"4H````=2U( +M@\1`6T%<7<.0N@$```#KJ&8/'X0``````$B-=<"Z``(``$R)Y^B/]___ZYSH +MF-3^__,/'OI(B,```"Z#````$R)YDR)[^@#T_[_2(/X_P^$N0```(G"B +MU/[_2(M%R&1(*P0E*`````^%G0```$B#Q%B)V%M!7$%=05Y!7UW#9BX/'X0` +M`````$R)[DR)]^AEU/[_A@"C5P8`8'[_\\```^&]/[__TR)[[L!````Z.?3_O_I=/___V:00<9%```Q +MTNE%____#Q]``+\-````Z&;0_O_&``!,B>](B468Z+?3_O],BVV8Z?O^___H +MJ=+^__,/'OI(B5!5TF)UTB-5RA!5D%505132(/L*$"$]D@/ +M1<*+4`B%T@^$30$``$R+"$&)RXG+38T4T4R)^DV+*46$VW1IBTH(18MU"$&) +MST4I]P^(9@$``$&`?1(`#X5S`0``00^V11"$P`^%'`$``$6%_P^%)0$``$$/ +MMD41A,`/A!@!``!%,@A%*?0QP.NR9I!!@\4!Z7#___]!#[9%$83`#X7E_O__ +M187_=+9!@^\!13'`08!]$``/A=O^__]%,5$B>)(BWV@2(TTCDR);;`IRNA_ +MXO__3(MML$&+1PQ!.4<(=5D]_O__?P^'I]7^_XG"N?___W_!Z@(IP8/"`3G* +M#T?1`=")19A(P>`#2(G'2(E%D.C]R_[_28G"08M'"$F+-X7`#X4S`0``2(7V +M#X5)`0``BT6838D708E'#+\0````Z/[-_O](BW6@2(G'2(E%F.C.W?__08M' +M"$B+39A)@\0!C5`!08E7"$F+%TB)#,)(BT6H08U.`4B+,(G(.=@/@BO___^) +MVDB+?:!(C32.3(EML"G*Z+KA__],BVVP08M'#$$Y1PAU5#W^__]_#X?)U/[_ +MB<.Z____?\'K`BG"@\,!.=,/1]I$C20#3(GC2<'D`TR)Y^@ZR_[_28G&08M' +M"$F+-X7`#X6D````2(7V#X6V````38DW08E?#+\0````Z#[-_O](BW6@2(G' +M2(G#Z`_=__]!BT<(C5`!08E7"$F+%TB)',)-A>T/A`C^__](BT7(9$@K!"4H +M````=7E(@\1(3(GO6T%<05U!7D%?7>D?SO[_#Q^``````$B+39!,B==(C13% +M`````$B)=9#H(,_^_TB+=9!)B<)(B?=,B560Z.W-_O],BU60Z:+^__](C13% +M`````$R)X4R)]TB)=:CH[<[^_TB+=:A(B??HP\P\>^E5(B>5!5T%6055!5$F)_%-(B=-(@^P8BT((B77, +M@_@!#X;&````3(L:@'H3`$&)S4V+,W0(AOIY_[__V8/ +M'T0``$&+1"0DBW7`.<9U7X'^_O__?P^'\-'^_XG"N?___W_!Z@(IP8/"`3G* +M#T?1`=")P$F)QTC!X`-(B<=(B47`Z!W(_O])BW0D&$F)P$&+1"0@A<`/A>X` +M``!(A?8/A00!``!-B40D&$6)?"0DOT@```#H&\K^_V8/[\"_$`````\1`$F) +MQ^C7Q_[_28E'"$R)]DF-?PA(BQ5MC0,`QP``````08M$)"!)B5<0C5`!2<=' +M&`````!!B50D($F+5"082<='(`````!)QT3^___IC/[___,/'OI( +MB^E5(B>5!5T%6055)B?U!5%-(B?-(@^Q(2(E- +MH&1(BP0E*````$B)1<@QP`^VPDB)\C'VB<&)19SH\/;__X3`#X78`0``1(MC +M"$&#_`$/AHH!``!(BP-%BT4@2(L`187`#X1W`0``3(L(38M5&$4Q_^L0#Q\` +M28/'`4TY^`^$6P$``$N+!/I,B`#2,=%N`````!(B<=(B460Z/O%_O](B46P13'V1(EEO$B+ +M`[\0````2HLT,$B)=:CH"\C^_TB+=:A(B<=)B<3HW-?__XM%N$B+3;!)@\8( +MC5`!B56X2(T4Q0````!,B23!3#EUD'6Y2(M]L$R+)TV%Y'0M28L\)$B%_W0% +MZ._(_O^^$````$R)Y^C"Q_[_BT6X2(M]L(UP_TB-%/4`````2(U'"$R-9;!( +MB<;HH,G^_TF+11A(BTV@3(GFBU6<@VVX`4J+//CHA?[__XG"2(M]L(M%N(32 +M#X6D````A0##Q^$``````!.BS0G387V=!Y)BSY(A?]T!>AJ +MR/[_3(GWOA````#H/_H/?7__TB+7:"(`TB+505]=PV8/'X0``````$B+1:#&``"X`0```.O+9I"%P'0^C5C_2,'C +M`P\?1```3(LD'TV%Y'0?28L\)$B%_W0%Z,G'_O],B>>^$````.B3(EMH(E5J.@AXO__BW6H +M3(MMH#'`2(GW3`'N9I!!#[84!H@4!DB#P`&$TG7P`?M(BW68,=),B>=,B6V@ +MB5VHZ!GD__]-A>UT"$R)[^@\QO[_08M$)`B%P`^$'P(``(/X`70:28L4)(U( +M_X,\B@H/A.\"``!F#Q^$``````!(BT7(9$@K!"4H````#X7S`@``2(/$2$R) +MX%M!7$%=05Y!7UW##Q\`08'_#@`'@`^$6P(``$&!_U<`!X!T2DB-1:!,C36E +M>0,`,=)(B46808'_$0$$@`^$#/___T2)^&8QP#T```"(=2M!#[??B=_K+P\? +M@`````!,C36)>0,`Z=K^__\/'T``3(TU28(#`.G*_O__187_#XA-`0``1(G[ +MZ$O"_O\Q]DB-%>AX`P!)B<9F9BX/'X0```````\?0`"-1@&`/`(`2(G&=?1( +MC7V@3(EMH,=%J`````!(B7V8B464Z,G@__^+1:B+=91(C16B>`,`28G`2`-% +MH`\?1```#[8Z2(/"`4B#P`%`B'C_0(3_=>Q(BWV800'PO@H```!$B46HZ(?@ +M__],BVV@BW6HB=],`>[H)LW__TPIZ(G#387V#X1J_O__,=M(C35,>`,`9F8N +M#Q^$```````/'T``C5,!@#P6`$B)TW7T2(M]F(G6B46HZ#;@__^+1:A,BVV@ +M2(T5%7@#`$B)QTP!Z&9F+@\?A```````#Q^```````^V,DB#P@%(@\`!0(AP +M_T"$]G7L08`^`(T4.P^%I_W__S';Z;7]__\/'X0``````$B-1:!,C37B=P,` +MN@````!(B468#X1^_?__3(GOZ![$_O]F9BX/'X0```````\?`$B-7;!(C46W +MZSEF9BX/'X0``````&9F+@\?A```````9F8N#Q^$``````!F9BX/'X0````` +M`&8N#Q^$``````!(B=!$B?E!P>\$@^$/C7$PC5$W@_D)#T;6B!!(C5#_2#G# +M==Q(C36P>P,`3(GGQD6X`.C)H`(`2(G>3(GGZ+Z@`@#I>?W__V8/'X0````` +M`$B-1:!,C35U@`,`,=)(B468Z<+\__]F+@\?A```````2(U%H$R--1UW`P`Q +MTDB)19CIHOS__V8N#Q^$``````!(C46@3(TUQG8#`#'22(E%F.F"_/__C4C^ +M2(T4BH,Z#0^%"OW__T&)3"0(QP(`````Z?K\___H!<+^__,/'OI(BLG^_Y!F9BX/'X0``````)#S#Q[Z5;D2````2(GE051) +MB?132(VU4/___TB)^TB)]TB![*````!D2(L$)2@```!(B47H,<#S2*M,B>>$ +MTG4PZ+O"_O^%P'0P,MF9F8N#Q^$``````!F9BX/'X0```````\? +M0`"`>/\O2(U0_W1&2(G023G$=>Y(C7MH3(GFZ`+,__^+0W"%P'0-2(M3:(G! +M@'P*_R]T#K@!````Z>_^__\/'T``@^@!B4-PQ@0"`.OF2(G0D$F)Q.N]Z#;` +M_O]F#Q]$``#S#Q[Z54B)Y>CCO?[_BP"%P'00#[?078'*````B(7`#T_"P[@% +M0`"`7<-F#Q]$``#S#Q[Z5;@``$``BS](.<)(#T?02(GEZ$7!_O]=PP\?`/,/ +M'OJ+1PB%P'0,2(L7B<&`?`K_+W4)PP\?A```````.T<,=!N#P`'&!`HOB<'& +M!`H`B4<(PV8N#Q^$``````!52(GE2(/L$$B)??CH#\K__TB+??B+3PA(BQ=( +MB3(GWZ!R9`@!(BWV(3(GVZ`"=`@!(BWVP +M2(7_=`7H$K_^_TB+?8CH.=3__XG#A,`/A)0````/MD6`1#GX?H\\G__TB+?;!(A?]T!>C%OO[_2(MU +MH$R)]^AYU?__BW6X3(GGZ$[:__](BW6P08M,)`@QP$D##"1F9BX/'X0````` +M``\?0``/MA0&B!0!2(/``832=?%(BWVPBT6X00%$)`A(A?]T!>AKOO[_2(M] +MH$B%_W0%Z%V^_O],B>_H5;[^_^L^#Q\`#[93`4B->P&$TG0J,?H%-G__TB+=;!!BTPD"#'`20,,)`\?1```#[84!H@4 +M`4B#P`&$TG7Q2(M]L(M%N$$!1"0(2(7_=`7H.[W^_TB+?:!(A?\/A!3____H +M*;W^_^D*____#Q]``+\$````Z+:Y_O])B<9(BP54?P,`,?8Q_T'&!@!(B85X +M____2(E%J.B4NO[_28G'2(7`=0],B?/___TR)]TB)1;!(B4VXZ$W:__](BX5X +M____3(GV3(EMD$B)19A(C4602(G'2(E%B.B[SO__2(M]L$R+;9!$BWV8BU6< +M2(7_=!&)E73____H/+S^_XN5=/___TB+?8!(A?\/A5W\___I8_S__TB+?8A, +MB6V01(E]F$2)?9SHO\?__XM-F$R+;9!)B<](P>$"Z5S\___H][K^__,/'OI( +MB^@^W!V:#^`=V"8U0]F:# +M^C9W"L-F#Q^$``````!F@_@(=?!(BW\(2(7_=.=(@^\$Z8BZ_O\/'X0````` +M`/,/'OI52(GE4TB)^TB#[`@/MP=F@_@'=@F-4/9F@_HV=QY(QP,`````,* +M````08G%A<`/A$4!``!,B76P,=M-B<1(B4VHZQH!TX7`=7J%T@^$"@$``('[ +M__\!``^')@$``$F+!"1%B>['1<0`````B=Y!*=Y(BTVX20-W,$R)YT2)\O]0 +M&(M5Q$$YUG.ZN`5``(!(BU7(9$@K%"4H````#X5Q`0``2(/$2%M!7$%=05Y! +M7UW##Q\`0;T```(`Z7;___\/'T0``$R+=;!(BTVHB<)-B>"%VW0)387V=0I) +M`5]`B=#KK6:03(GP13'M38G^B56P3(E%J$6)[$F)QTB)39CK)@\?0`")T4$! +MU$D!3D"%P`^%>O___X72#X1M____03G<#X/.````28L'08G=QT7$`````$2) +MYD4IY4B+3;A)`W8P3(G_1(GJ_U`8BU7$03G5<[+I,____P\?1```3(MUL$B+ +M3:B)PDV)X(7;=`U-A?8/A6[___])`5]`,<#I#O___P\?`$R+=;!(BTVHB<)- +MB>!-A?8/A4K___^)V$D!1T"!^P```@!UTDB+?:!(A?\/A%G^__]!]T=`__\_ +M``^%2_[__TB+!TF-=T!(B4VH3(E%L$B)\O]0&$R+1;!(BTVHA<`/A";^___I +MHO[__P\?@`````"+5;!,B?A,BT6H38GW2(M-F$F)QH72=)2)T.E\_O__Z&RW +M_O]F9BX/'X0``````)#S#Q[Z54R)P4B)Y4%528G5051)B?132(G[2(/L*$B# +M?S``9$R+!"4H````3(E%V$V)R'0T2,=#0`````!(BT789$@K!"4H````=7]( +M@\0H3(GJ3(GF2(G?6T%<05U=Z4W]__\/'T0``$B-?="Z```"`+Z`````3(E% +MP$B)3 +M^HE76#'`PV8/'T0``/,/'OJ)5S@QP,-F#Q]$``#S#Q[ZB5=<,<##9@\?1``` +M\P\>^HE7/#'`PV8/'T0``/,/'OJ#^@%U%P^V!CPH=Q"(1U`QP,-F+@\?A``` +M````N`%``(##9BX/'X0``````/,/'OJ#^@%U%P^V!CPH=Q"(1T@QP,-F+@\? +MA```````N`%``(##9BX/'X0``````/,/'OHQP(7V#Y7`B4=4,<##9F8N#Q^$ +M```````/'T``\P\>^C'`A?8/E<")1T0QP,.09F8N#Q^$```````/'P#S#Q[Z +M2(M'2$B)!C'`PV:0\P\>^DB+1S!(B08QP,-FD/,/'OJ)=V0QP,-F#Q]$``#S +M#Q[ZB7<\,<##9@\?1```\P\>^DB)=V@QP,,/'T0``/,/'OI(B7M(C4<0Z5K___\Q +MP$B-%0EF`P!F9BX/'X0``````&9F+@\?A```````#Q\`1`^V'`)$.!P!=1-( +M@\`!2(/X$'7K2(U'&.D:____, +M^DB#[Q#I8_[__P\?`/,/'OI(@^\(Z5/^__^09I#S#Q[ZBT^HM'"(/``8E'",-FD/,/'OJ+1Q"#P`&)1Q##9I#S#Q[ZBT<8@\`!B4<8 +MPV:0\P\>^HM'((/``8E'(,-FD/,/'OJ)5S@QP,-F#Q]$``#S#Q[ZB5<8,<## +M9@\?1```\P\>^HE7,#'`PV8/'T0``/,/'OJ)5Q`QP,-F#Q]$``#S#Q[ZA?8/ +ME4^H7V#Y5''#'`PY!FD/,/'OI(BT=82(D&,<##9I#S#Q[Z +M2(M'0$B)!C'`PV:0\P\>^DC'`@````!(B?$QP$B--1EE`P!F#Q^$``````!$ +M#[8$!D0X!`%U'4B#P`%(@_@0=>M(B?A(B0(QP(-'(`'#9@\?1```,M(C4<(2(D",<"#1R`!PP\?1``` +M,)B`P!FD$0/MA0&1#@4`74=2(/``4B#^!!UZTB-1_!(B0(QP(-'"`'# +M#Q]$```QP$B-->]B`P!F9BX/'X0```````\?0`!$#[8M(C4?XZ5O___\QP$B--4EB`P!F9BX/'X0``````&9F+@\?A``````` +M#Q\`1`^V'`9$.!P!=1)(@\`!2(/X$'7K2(GXZ1S___^X`D``@,-F9BX/'X0` +M`````&:0\P\>^DC'`@````!(B?$QP$B--:EB`P!F9BX/'X0``````&9F+@\? +MA```````#Q\`1`^V!`9$.`0!=1U(@\`!2(/X$'7K2(U'\$B)`C'`@T<0`<,/ +M'T0``#'`2(TUOV$#`$0/M@P&1#@,`749#Q]``$B#P`%(@_@0=,M$#[8,!D0X +M#`%TZS'`2(TUHF$#`&:01`^V%`9$.!0!=1U(@\`!2(/X$'7K2(U'^$B)`C'` +M@T<0`<,/'T0``#'`2(TUKV$#`&9F+@\?A```````#Q]``$0/MAP&1#@<`742 +M2(/``4B#^!!UZTB)^.E<____,M(C4<(Z1O___^X`D``@,-F +M9BX/'X0``````)#S#Q[Z2,<"`````$B)\3'`2(TU:6$#`&9F+@\?A``````` +M9F8N#Q^$```````/'P!$#[8$!D0X!`%U'4B#P`%(@_@0=>M(C4?X2(D",<"# +M1Q@!PP\?1```,M(B?A( +MB0(QP(-'&`'#9@\?1```,^HM'$(/``8E'$,-FD/,/'OJ+1QB#P`&)1QC#9I#S#Q[ZA?8/E8>1 +M2@``,<##\P\>^H7V#Y6'@4H``#'`P_,/'OI(BT^DB+1R!(*TM(B?A(B0(QP(-'$`'#9@\?1```,M(C4<(2(D",<"#1Q`!PP\?1``` +M,^DC'`@`````QP$B-#8Q> +M`P!F9BX/'X0``````&9F+@\?A```````9@\?1```1`^V!`%$.`0&=25(@\`! +M2(/X$'7K2(V':/___TB)`C'`@X=X____`<,/'X``````,M( +MC8=P____2(D",<"#AWC___\!PP\?@``````QP$B-#2==`P`/'X``````1`^V +M'`%$.!P&=1I(@\`!2(/X$'7K2(GX2(D",<"#AWC___\!P[@"0`"`PP\?1``` +M\P\>^DC'`@`````QP$B-#6Q=`P!F9BX/'X0``````&9F+@\?A```````9@\? +M1```1`^V!`%$.`0&=1U(@\`!2(/X$'7K2(U'^$B)`C'`@T<(`<,/'T0``#'` +M2(T-GUP#`$0/M@P!1#@,!G49#Q]``$B#P`%(@_@0=,M$#[8,`40X#`9TZS'` +M2(T-HG0#`&:01`^V%`%$.!0&=1U(@\`!2(/X$'7K2(GX2(D",<"#1P@!PV8/ +M'T0``#'`2(T-+UP#`&9F+@\?A```````#Q]``$0/MAP!1#@M(B?A(B0(QP(-'$`'#9@\? +M1```,M(C4<(2(D",<"# +M1Q`!PP\?1```N`)``(##9I#S#Q[Z2,<"`````#'`2(T-;%L#`&9F+@\?A``` +M````9F8N#Q^$``````!F#Q]$``!$#[8$`40X!`9U'4B#P`%(@_@0=>M(C4?X +M2(D",<"#1P@!PP\?1```,M(B?A(B0(QP(-'"`'#9@\?1```N`)``(##9I#S#Q[ZBT<0@\`!B4<0PV:0 +M\P\>^HM'"(/``8E'",-FD/,/'OI52(GE4TB#[`B+1Q"-6/^)7Q"%VW4&2(L' +M_U!`B=A(BUWXR<,/'X0``````/,/'OI52(GE4TB#[`B+1PB-6/^)7PB%VW4. +M2(M'^$B-5_A(B=?_4$")V$B+7?C)P_,/'OI(B?EF#^_`B==(QT$P`````,>! +MB``````````/$4$X#Q%!>(72#X3D````#[8&B<)!B<"#XC]!@^`_B5$P/#\/ +MAM<```"#_P$/A-,```!$#[9.`0^VT$&)T\'J!D2)R$'!ZP>#X@&#X`]!P>D$ +M10'+`<)!C403`CGX#X6B````1(E9-$R-3@)%A=MT/$6)VC'`9F8N#Q^$```` +M``!F9BX/'X0```````\?1```#[9\!@)`B'P!.$B#P`%).<)U[4&-0_]-C4P! +M`872=#,QP&9F+@\?A```````9F8N#Q^$```````/'X0``````$$/MC0!0(AT +M`7A(@\`!2#G"=>U(N/___P$```"`3`^CP',8,<##9BX/'X0``````(/_`73N +MN%<`!X##N`%``(##9F8N#Q^$```````/'T``\P\>^DB![Y@```#IL/[___,/ +M'OI(B[^0````2(L'_V`@D&9F+@\?A```````#Q\`\P\>^HM7.$B+1S#'1QP` +M````@'\4`(D0BU<\B5`$BU=`B5`(BU=$B5`,=`,QP,.X`4``@,.09BX/'X0` +M`````/,/'OHQP(!_%`!T1%5(B>53B=-(@^P(@_H/=AQ(B?G!Z@1(BW\P_U$@ +MB=A(BUWXR8/@\,,/'T``,<"%TDB+7?C)#Y7`P>`$PP\?A```````PY!F9BX/ +M'X0```````\?`/,/'OKVP@=U1XU"\(/X$'<_54B)Y5-(B?M(@^P(BT<8.=!T +M!(7`=1=(BT,P2(UX$/]3*,9#%`$QP$B+7?C)P[A7``>`Z_-F+@\?A``````` +MN%<`!X##9BX/'X0``````/,/'OKVP@=U1XU"\(/X$'<_54B)Y5-(B?M(@^P( +MBT<0.<)T!(7`=1=(BT,H2(UX$/]3(,9##`$QP$B+7?C)P[A7``>`Z_-F+@\? +MA```````N%<`!X##9BX/'X0``````/,/'OJ+1V"#P`&)1V##9I#S#Q[ZBT<( +M@\`!B4<(PV:0\P\>^HM'$(/``8E'$,-FD/,/'OJ+1QB#P`&)1QC#9I#S#Q[Z +MBT<@@\`!B4<@PV:0\P\>^HM'*(/``8E'*,-FD/,/'OJ+1S"#P`&)1S##9I#S +M#Q[ZBT^HM'0(/``8E'0,-FD/,/'OJ+1TB#P`&)1TC# +M9I#S#Q[ZBT=0@\`!B4=0PV:0\P\>^HM'6(/``8E'6,-FD/,/'OI52(GE0513 +M2(G[2(U-Y$B#[!!(BP)(BW\(9$R+)"4H````3(EEZ$F)U+H```"`2#G02`]' +MPHG"B47D2(L'_U`8BU7DB4,028D4)$@!4QB%P'4:2(M5Z&1(*Q0E*````'5U +M2(/$$%M!7%W#9I`]#@`'@'19/0\`!X!](CT!0`"`=#,]!$``@`^4P`^VP(U$ +M``CKP&8N#Q^$```````]5P`'@'09@_@!N@@````/1<+KH@\?0`"X!````.N7 +MD+@%````ZX]F#Q^$``````"X`@```.E\____Z'&C_O^0\P\>^E5(B=!(B>53 +M2(G[2(/L&$B+?PA(B57@2(/X_[@`````2(EUZ$B-=>A(BQ=(BTH82(U5X$@/ +M1-!(@WWH_W4",?;_T8E#$#U7``>`=%`]6``'@'P9AA(B?M(.T<0="E(C5`!2(E3"`^V`$B+5>AD2"L4)2@` +M``!U>DB+7?C)PV8/'X0``````(![.`!U6HM#/(7`=5-(BWLHBU,@2(U-Y$B+ +M1F2`]NP$B)T4@!PF9(#V[* +M9@]LP0\10PB%R76$9F8N#Q^$``````!FD,9#.`$QP.EW____Z`"B_O_S#Q[Z +M2,<"`````$B)\3'`2(G62(T51E0#`&9F+@\?A```````9F8N#Q^$``````!$ +M#[8$`40X!`)U'4B#P`%(@_@0=>M(B?A(B08QP(-'*`'#9@\?1```,M(C4<8Z=K^ +M__\QP$B-%3EJ`P!F9BX/'X0``````&9F+@\?A```````#Q\`1`^V'`)$.!P! +M=1-(@\`!2(/X$'7K2(U'(.F:_O__N`)``(##9F8N#Q^$``````"0\P\>^DB# +M[R#I,_[__P\?`/,/'OI(@^\8Z2/^__\/'P#S#Q[Z2(/O$.D3_O__#Q\`\P\> +M^DB#[PCI`_[__Y!FD/,/'OJ+1RB#P`&)1RC#9I#S#Q[ZBT<(@\`!B4<(PV:0 +M\P\>^HM'$(/``8E'$,-FD/,/'OJ+1QB#P`&)1QC#9I#S#Q[ZBT<@@\`!B4<@ +MPV:0\P\>^DC'`@`````QP$B-#?Q1`P!F9BX/'X0``````)!$#[8$`40X!`9U +M%4B#P`%(@_@0=>M(B3HQP(-'"`'#D+@"0`"`PV8N#Q^$``````#S#Q[ZBT<( +M@\`!B4<(PV:0\P\>^DC'`@`````QP$B-#9Q1`P!F9BX/'X0``````)!$#[8$ +M`40X!`9U%4B#P`%(@_@0=>M(B3HQP(-'"`'#D#'`2(T-IV@#`$0/M@P!1#@, +M!G4A9F8N#Q^$``````"02(/``4B#^!!TRT0/M@P!1#@,!G3KN`)``(##D`\? +M0`#S#Q[ZBT<(@\`!B4<(PV:0\P\>^DC'`@`````QP$B-#0Q1`P!F9BX/'X0` +M`````&9F+@\?A```````9@\?1```1`^V!`%$.`0&=15(@\`!2(/X$'7K2(DZ +M,<"#1P@!PY"X`D``@,-F+@\?A```````\P\>^HM'"(/``8E'",-FD/,/'OI5 +M2(GQ,5!5$F)U%-(B?M(QP(`````2(T5C%`#`&9F+@\?A```````9F8N +M#Q^$``````!F#Q]$```/MC0"0#@T`74F2(/``4B#^!!U[$B)V$F)!"0QP(-# +M8`%;05Q=PV8N#Q^$```````QP$B-%9=/`P`/MCP!0#@\`G4Q9F8N#Q^$```` +M``!F9BX/'X0```````\?@`````!(@\`!2(/X$'2J#[8\`4`X/`)T[#'`2(T5 +M(V<#``\?``^V/`%`.#P"=19(@\`!2(/X$'7L2(U#".EZ____#Q\`,Q(C4,8Z?K^__\QP$B-%3I/`P!F9BX/'X0` +M`````&9F+@\?A```````#Q]```^V/`)`.#P!=1-(@\`!2(/X$'7L2(U#(.FZ +M_O__,O[__S'`2(T5JDX#``^V/`)`.#P!=1-(@\`! +M2(/X$'7L2(U#,.E4_O__,Q( +MC4,XZ2[^__\QP$B-%0Y.`P`/MCP"0#@\`7432(/``4B#^!!U[$B-0T#I"/[_ +M_S'`2(TU"&8#``^V/`9`.#P!=1U(@\`!2(/X$'7L2(.[L`````!T.4B-0TCI +MV/W__S'`2(TUR&4#``^V/`9`.#P!=3E(@\`!2(/X$'7L2(.[N`````!T54B- +M0U#IJ/W__TB+N\@```!(C9.P````2(L'_Q"%P'2PZ9;]__\QP$B--4Q-`P`/ +MMCP&0#@\`74Y2(/``4B#^!!U[$B#N\``````="](C4-8Z5S]__](B[O(```` +M2(V3N````$B+!_\0A^DB#[U#IH_S_ +M_P\?`/,/'OI(@^](Z9/\__\/'P#S#Q[Z2(/O0.F#_/__#Q\`\P\>^DB#[SCI +M<_S__P\?`/,/'OI(@^\PZ6/\__\/'P#S#Q[Z2(/O*.E3_/__#Q\`\P\>^DB# +M[R#I0_S__P\?`/,/'OI(@^\8Z3/\__\/'P#S#Q[Z2(/O$.DC_/__#Q\`\P\> +M^DB#[PCI$_S__Y!FD/,/'OJ)5W0QP,-F#Q]$``#S#Q[ZB5^HE7>#'`PV8/'T0``/,/'OJ)5S@QP,-F#Q]$``!52(GE059!54%44TB) +M^TB+O\@```!(BP?_4!A!B<6%P'0.6T2)Z$%<05U!7EW#9I"+0W1$BV-X2(MS +M:$$YQ$0/1^"X`!```$&!Y`#P__]!.<1$#T+@2(7V=`9$.V-P=,),C369.P0` +M3(GWZ!$V__]$B>9,B??H%C;__TB)0VA(AA;05Q!74%>7<-! +MO0X`!X#KAY`/'T``\P\>^E5(B>5!5$F)_%-(B?-(A?9T"4B+!DB)]_]0"$F+ +MO"28````2(7_=`9(BP?_4!!)B9PDF````#'`6T%<7<-F9BX/'X0```````\? +M0`#S#Q[Z54B)Y4%428G\4TB)\TB%]G0)2(L&2(GW_U`(28M\)'!(A?]T!DB+ +M!_]0$$F)7"1P,^E5(B>532(G[2(/L"$B+OY@```!( +MA?]T$4B+!_]0$$C'@Y@`````````2(M=^#'`R<-F9BX/'X0``````/,/'OI5 +M2(GE4TB)^TB#[`A(BW]P2(7_=`Y(BP?_4!!(QT-P`````$B+7?@QP,G#D%5( +MB>5!5%-(@^P09$B+'"4H````2(E=Z$B)^XN_J````(7_#X2O````3(UEY.LP +MD(N+I````(N[J````$@!DX@````!T2G7B8ND````B;NH````A%P`^$O````$B+@Y@` +M``")^HNSI````$R)X<=%Y`````!(`W-H3(L`2(G'0?]0&(M5Y(72#X5Z____ +MA<"Z!4``@`]$PDB+5>AD2"L4)2@```!U>TB#Q!!;05Q=PXN+I````&:0A@`````````&8/[\#'AZ@````` +M````QD=]``\1AX````#IX_S__P\?`/,/'OK&1VT`9@_OP$B#[Q!(QX>@```` +M`````,>'J``````````/$8>`````Z:_\__^09F8N#Q^$```````/'P#S#Q[Z +M9@_OP,9'?0!(QX>@`````````,>'J``````````/$8>`````2(7V=`Y(BP;& +M1WT!2(F'@````.E@_/__\P\>^F8/[\#&1W4`2(U'^$C'AY@`````````QX>@ +M``````````\11WA(A?9T"TB+%L9'=0%(B5=X2(G'Z1_\__^09F8N#Q^$```` +M```/'P#S#Q[Z54B)Y4%428G\4TB)\TB%]G0)2(L&2(GW_U`(28N\))````!( +MA?]T!DB+!_]0$$F)G"20````,$B%_W0&2(L'_U`028E< +M)'@QP%M!7%W#D`\?0`#S#Q[Z54B)Y5-(B?M(@^P(2(N_D````$B%_W012(L' +M_U`02,>#D`````````!(BUWX,<#)PV9F+@\?A```````\P\>^E5(B>532(G[ +M2(/L"$B+?WA(A?]T#DB+!_]0$$C'0W@`````2(M=^#'`R<.0\P\>^DB+O[`` +M``!(BP?_8!AF9BX/'X0```````\?0`#S#Q[Z2(M_:$B+!_]@&&:0\P\>^DB+ +MO[@```!(BP?_8!AF9BX/'X0```````\?0`#S#Q[Z2(M_:$B+!_]@&&:0\P\> +M^DB+O[@```!(BP?_8"!F9BX/'X0```````\?0`#S#Q[Z2(M_:$B+!_]@(&:0 +M\P\>^DB+O\````!(BP?_8!AF9BX/'X0```````\?0`#S#Q[Z2(M_:$B+!_]@ +M&&:0\P\>^DC'`@`````QP$B-#;Q&`P!F9BX/'X0``````)!$#[8$`40X!`9U +M%4B#P`%(@_@0=>M(B3HQP(-'"`'#D#'`2(T-=T8#`$0/M@P!1#@,!G4A9F8N +M#Q^$``````"02(/``4B#^!!TRT0/M@P!1#@,!G3KN`)``(##D`\?0`#S#Q[Z +MBT<(@\`!B4<(PV:0\P\>^E5(B>5!5%-(@^P02(M'&$@K1R!D3(LD)2@```!, +MB67H28G,B=''1>0`````2#G(#T+0,<"%TG0<2(G[2(M_$$B-3>1(BP?_4!B+ +M3>1(`4L@AAD2"L4)2@```!U$TB#Q!!;05Q= +MPP\?0`#&0R@!Z]+H59/^_Y`/'T``\P\>^DC'`@`````QP$B-#9Q%`P!F9BX/ +M'X0``````)!$#[8$`40X!`9U%4B#P`%(@_@0=>M(B3HQP(-'"`'#D#'`2(T- +M5UP#`$0/M@P!1#@,!G4A9F8N#Q^$``````"02(/``4B#^!!TRT0/M@P!1#@, +M!G3KN`)``(##D`\?0`#S#Q[ZBT<(@\`!B4<(PV:0\P\>^E5(B>532(/L*$B+ +M3RA(BT!(B4782(7V=`=(`PY(B4W@2(72 +M=`=(`P)(B478@'L,`'0;2(M[&$B%_W022(L'2(U5V$B-=>#_4!B%P'4(,<"` +M>PT`=1I(BU7H9$@K%"4H````=31(BUWXR<,/'T0``$B+>Q!(BT,@2(UUV$@! +M1>!(`4782(L'@'L.`$B+0"!T!$B-=>#_T.N]Z`J2_O]F+@\?A```````\P\> +M^DC'`@`````QP$B-#4Q$`P!F9BX/'X0``````&9F+@\?A```````9@\?1``` +M1`^V!`%$.`0&=15(@\`!2(/X$'7K2(DZ,<"#1P@!PY`QP$B-#>=#`P!$#[8, +M`40X#`9U(69F+@\?A```````D$B#P`%(@_@0=,M$#[8,`40X#`9TZ[@"0`"` +MPY`/'T``\P\>^HM'"(/``8E'",-FD/,/'OI(QP(`````,^DC'`@`````QP$B-#^DC'`@`````Q +MP$B-#0Q"`P!F9BX/'X0``````&9F+@\?A```````9@\?1```1`^V!`%$.`0& +M=1U(@\`!2(/X$'7K2(U'^$B)`C'`@T<(`<,/'T0``#'`2(T-GU@#`$0/M@P! +M1#@,!G49#Q]``$B#P`%(@_@0=,M$#[8,`40X#`9TZS'`2(T-8E@#`&:01`^V +M%`%$.!0&=1U(@\`!2(/X$'7K2(GX2(D",<"#1P@!PV8/'T0``+@"0`"`PV:0 +M\P\>^HM'$(/``8E'$,-FD/,/'OJ+1PB#P`&)1PC#9I#S#Q[Z54B)Y4%44XM' +M8$2-8/]$B6=@187D=`U$B>!;05Q=PP\?1```2(T%F2H$`$B)^_,/?@6F,`0` +M9D@/;LA(@\!@9@]LP69(#V[02(/`:`\1!V9(#V[82(/`:/,/?@6$,`0`9D@/ +M;N!(@\!H9@]LPF9(#V[H2(/`:`\11Q!F2`]N\/,/?@5E,`0`9@]LPP\11R#S +M#WX%73`$`&8/;,0/$4^E5(B>5!54%44TB#[`B+1PA$ +MC6#_1(EG"$6%Y'0/2(/$"$2)X%M!7$%=7<.02(T%,2D$`$B)^TR-;ZCS#WX% +M.B\$`&9(#V[(2(/`8&8/;,%F2`]NT$B#P&@/$4>H9D@/;MA(@\!H\P]^!1`N!`!F +M#VS&#Q%'^$B+?W!(A?]T!DB+!_]0$$B+>VA(A?]T!DB+!_]0$$B+>V!(A?]T +M!DB+!_]0$$B+>UA(A?]T!DB+!_]0$$B+>T!(A?]T!DB+!_]0$$B+>SA(A?]T +M!DB+!_]0$$B+^^T````.@9C/[_2(/$"$2)X%M! +M7$%=7<-F9BX/'X0``````/,/'OI52(GE055!5%-(@^P(BT<01(U@_T2)9Q!% +MA>1T#TB#Q`A$B>!;05Q!75W#D$B-!=$G!`!(B?M,C6^P\P]^!=HM!`!F2`]N +MR$B#P&!F#VS!9D@/;M!(@\!H#Q%'L&9(#V[82(/`:/,/?@6W+00`9D@/;N!( +M@\!H9@]LPF9(#V[H2(/`:`\11\!F2`]N\/,/?@68+00`9@]LPP\11]#S#WX% +MD"T$`&8/;,0/$4?@\P]^!8@M!`!F#VS%#Q%'\/,/?@6`+00`9@]LQ@\1!TB+ +M?WA(A?]T!DB+!_]0$$B+>W!(A?]T!DB+!_]0$$B+>VA(A?]T!DB+!_]0$$B+ +M>V!(A?]T!DB+!_]0$$B+>TA(A?]T!DB+!_]0$$B+>T!(A?]T!DB+!_]0$$B+ +M^^T````.BZBO[_2(/$"$2)X%M!7$%=7<-F9BX/ +M'X0``````)#S#Q[Z54B)Y4%505132(/L"(M'&$2-8/]$B6<8187D=`](@\0( +M1(G@6T%<05U=PY!(C05Q)@0`2(G[3(UON/,/?@5Z+`0`9D@/;LA(@\!@9@]L +MP69(#V[02(/`:`\11[AF2`]NV$B#P&CS#WX%5RP$`&9(#V[@2(/`:&8/;,)F +M2`]NZ$B#P&@/$4?(9D@/;O#S#WX%."P$`&8/;,,/$4?8\P]^!3`L!`!F#VS$ +M#Q%'Z/,/?@4H+`0`9@]LQ0\11_CS#WX%("P$`&8/;,8/$4<(2(N_@````$B% +M_W0&2(L'_U`02(M[>$B%_W0&2(L'_U`02(M[<$B%_W0&2(L'_U`02(M[:$B% +M_W0&2(L'_U`02(M[4$B%_W0&2(L'_U`02(M[2$B%_W0&2(L'_U`02(MS($B- +M/6@K!`#HXR7__TR)[[[0````Z%:)_O](@\0(1(G@6T%<05U=PP\?A``````` +M\P\>^E5(B>5!54%44TB#[`B+1R!$C6#_1(EG($6%Y'0/2(/$"$2)X%M!7$%= +M7<.02(T%$24$`$B)^TR-;\#S#WX%&BL$`&9(#V[(2(/`8&8/;,%F2`]NT$B# +MP&@/$4?`9D@/;MA(@\!H\P]^!?$B%_W0&2(L'_U`02(M[<$B%_W0&2(L' +M_U`02(M[6$B%_W0&2(L'_U`02(M[4$B%_W0&2(L'_U`02(MS*$B-/08J!`#H +M@23__TR)[[[0````Z/2'_O](@\0(1(G@6T%<05U=PV8/'T0``/,/'OI52(GE +M055!5%-(@^P(BT1T#TB#Q`A$B>!;05Q!75W#D$B-!;$C +M!`!(B?M,C6_(\P]^!;HI!`!F2`]NR$B#P&!F#VS!9D@/;M!(@\!H#Q%'R&9( +M#V[82(/`:/,/?@67*00`9D@/;N!(@\!H9@]LPF9(#V[H2(/`:`\11]AF2`]N +M\/,/?@5X*00`9@]LPP\11^CS#WX%<"D$`&8/;,0/$4?X\P]^!6@I!`!F#VS% +M#Q%'"/,/?@5@*00`9@]LQ@\11QA(B[^0````2(7_=`9(BP?_4!!(B[N(```` +M2(7_=`9(BP?_4!!(B[N`````2(7_=`9(BP?_4!!(BWMX2(7_=`9(BP?_4!!( +MBWM@2(7_=`9(BP?_4!!(BWM82(7_=`9(BP?_4!!(BW,P2(T]HB@$`.@=(___ +M3(GOOM````#HD(;^_TB#Q`A$B>!;05Q!75W#9I#S#Q[Z54B)Y4%505132(/L +M"(M',$2-8/]$B6!;05Q!75W#\P\>^E5(B>5!54%44TB#[`B+1SA$C6#_ +M1(EG.$6%Y'0/2(/$"$2)X%M!7$%=7<.02(T%\2`$`$B)^TR-;]CS#WX%^B8$ +M`&9(#V[(2(/`8&8/;,%F2`]NT$B#P&@/$4?89D@/;MA(@\!H\P]^!=W!(A?]T!DB+!_]0 +M$$B+>VA(A?]T!DB+!_]0$$B+^^T````.C-@_[_ +M2(/$"$2)X%M!7$%=7<-F9BX/'X0```````\?0`#S#Q[Z54B)Y4%505132(/L +M"(M'0$2-8/]$B6=`187D=`](@\0(1(G@6T%<05U=PY!(C06!'P0`2(G[3(UO +MX/,/?@6*)00`9D@/;LA(@\!@9@]LP69(#V[02(/`:`\11^!F2`]NV$B#P&CS +M#WX%9R4$`&9(#V[@2(/`:&8/;,)F2`]NZ$B#P&@/$4?P9D@/;O#S#WX%2"4$ +M`&8/;,,/$0?S#WX%024$`&8/;,0/$4<0\P]^!3DE!`!F#VS%#Q%'(/,/?@4Q +M)00`9@]LQ@\11S!(B[^H````2(7_=`9(BP?_4!!(B[N@````2(7_=`9(BP?_ +M4!!(B[N8````2(7_=`9(BP?_4!!(B[N0````2(7_=`9(BP?_4!!(BWMX2(7_ +M=`9(BP?_4!!(BWMP2(7_=`9(BP?_4!!(BW-(2(T]<"0$`.CK'O__3(GOOM`` +M``#H7H+^_TB#Q`A$B>!;05Q!75W#\P\>^E5(B>5!54%44TB#[`B+1TA$C6#_ +M1(EG2$6%Y'0/2(/$"$2)X%M!7$%=7<.02(T%(1X$`$B)^TR-;^CS#WX%*B0$ +M`&9(#V[(2(/`8&8/;,%F2`]NT$B#P&@/$4?H9D@/;MA(@\!H\P]^!0@C!`!F#VS##Q%' +M"/,/?@7@(P0`9@]LQ`\11QCS#WX%V",$`&8/;,4/$4WA(A?]T!DB+!_]0$$B+^^T````.CZ +M@/[_2(/$"$2)X%M!7$%=7<-F9BX/'X0``````)#S#Q[Z54B)Y4%505132(/L +M"(M'4$2-8/]$B6=0187D=`](@\0(1(G@6T%<05U=PY!(C06Q'`0`2(G[3(UO +M\/,/?@6Z(@0`9D@/;LA(@\!@9@]LP69(#V[02(/`:`\11_!F2`]NV$B#P&CS +M#WX%ER($`&9(#V[@2(/`:&8/;,)F2`]NZ$B#P&@/$0=F2`]N\/,/?@5Y(@0` +M9@]LPP\11Q#S#WX%<2($`&8/;,0/$4<@\P]^!6DB!`!F#VS%#Q%',/,/?@5A +M(@0`9@]LQ@\11T!(B[^X````2(7_=`9(BP?_4!!(B[NP````2(7_=`9(BP?_ +M4!!(B[NH````2(7_=`9(BP?_4!!(B[N@````2(7_=`9(BP?_4!!(B[N(```` +M2(7_=`9(BP?_4!!(B[N`````2(7_=`9(BP?_4!!(BW-82(T]FB$$`.@5'/__ +M3(GOOM````#HB'_^_TB#Q`A$B>!;05Q!75W#9BX/'X0``````/,/'OI52(GE +M055!5%-(@^P(BT=81(U@_T2)9UA%A>1T#TB#Q`A$B>!;05Q!75W#D$B-!4$; +M!`!(B?M,C6_X\P]^!4HA!`!F2`]NR$B#P&!F#VS!9D@/;M!(@\!H#Q%'^&9( +M#V[82(/`:/,/?@4G(00`9D@/;N!(@\!H9@]LPF9(#V[H2(/`:`\11PAF2`]N +M\/,/?@4((00`9@]LPP\11QCS#WX%`"$$`&8/;,0/$4!;05Q!75W#D`\?A``````` +M\P\>^E5(B>532(/L"(M?"(/K`70+B5\(B=A(BUWXR<.^$````.C6??[_B=A( +MBUWXR<-F9BX/'X0```````\?`/,/'OI52(GE4TB#[`B+7PB#ZP%T"XE?"(G8 +M2(M=^,G#OA@```#HEGW^_XG82(M=^,G#9F8N#Q^$```````/'P#S#Q[Z54B) +MY4%505132(/L&&1(BQPE*````$B)7=A(B?MF9BX/'X0```````\?0`!(B=_H +MZ.3__T&)Q(7`=4>+DZ````"%T@^$TP```$B+N\@```!(BW-H2(L'_U`@B[N@ +M````B8.H````08G$AAQ>_[_2(N[R````$B+ +M)$B:.@````2(L'_U`@B8.H````.X.@````#X0D____0;P%0`"`Z6__ +M__]F#Q^$``````!(B[N8````2,=%T`````!(C5702(TUQD4#`$B+!_\02(M] +MT$B%_P^$.O___TB+!TB-%:H!``!(BT`82#G0#X5F`0``2(/O..B4_O__08G$ +M2(M=T$B%VP^$"O___TB+`TB-%1KT__](BT`02#G0#X4L`0``@VLH`0^%Z?[_ +M_TB-!>07!`!(B[N0````3(UKR/,/?@7I'00`9D@/;LA(@\!@9@]LP69(#V[0 +M2(/`:`\10\AF2`]NV$B#P&CS#WX%QAT$`&9(#V[@2(/`:&8/;,)F2`]NZ$B# +MP&@/$4/89D@/;O#S#WX%IQT$`&8/;,,/$4/H\P]^!9\=!`!F#VS$#Q%#^/,/ +M?@67'00`9@]LQ0\10PCS#WX%CQT$`&8/;,8/$4,82(7_=`9(BP?_4!!(B[N( +M````2(7_=`9(BP?_4!!(B[N`````2(7_=`9(BP?_4!!(BWMX2(7_=`9(BP?_ +M4!!(BWM@2(7_=`9(BP?_4!!(BWM82(7_=`9(BP?_4!!(BW,P2(T]V!P$`.A3 +M%___OM````!,B>_HQGK^_^G'_?__2(G?_]#IO?W____008G$Z9S^___'@Z@` +M````````Z2K^___'@Z@`````````0;P!````Z8_]___HI'K^_P\?0`#S#Q[Z +M2(/O..GS_/__D&:0\P\>^E5(B>5!5%.+1PA$C6#_1(EG"$6%Y'0-1(G@6T%< +M7<,/'T0``$B-!0D4!`!(B?M(B0=(BW\02(7_=`9(BP?_4!!(B=^^,````.@? +M>O[_1(G@6T%<7<.09@\?1```\P\>^E5(B>5!5%.+1PA$C6#_1(EG"$6%Y'0- +M1(G@6T%<7<,/'T0``$B-!7D3!`!(B?M(B0=(BW\82(7_=`9(BP?_4!!(BWL0 +M2(7_=`9(BP?_4!!(B=^^.````.BP>?[_1(G@6T%<7<,/'X0``````/,/'OI5 +M2(GE4TB#[`B+7PB#ZP%T"XE?"(G82(M=^,G#OB@```#H=GG^_XG82(M=^,G# +M9F8N#Q^$```````/'P#S#Q[Z54B)Y4%7059!54%44TB#[!B+1QA$C6C_1(EO +M&$6%[70;2(/$&$2)Z%M!7$%=05Y!7UW#9@\?A```````2(U'X$R+9R#S#WX% +M8!L$`$B)1//__08N$)&@!``"%P`^%S````$F-G"10)0``38VT)%!5``#K +M*&9F+@\?A```````9F8N#Q^$``````!F#Q]$``!(@<.``0``3#GS="Z`>[@` +M=.Y(B[-`____2(G?_U,(QD.X`$B!PX`!``!(QX/`_?__`````$PY\W7228V< +M)!`E``!-C;0D$%4``&8/'T0``$B+,TB%]G0928L$)$B)Q_]0"$C'`P````!( +MQT,(`````$B!PX`!``!,.?-UTTF+1"083(GF2(G'_U`(2(M]R+YP````Z-=W +M_O_IE_[__TV-O"1X`@``38VT)'@D``!!QX0DL`$```$```!F#Q]$``!,B?_H +M^$G__TF+7Q!(A=MT)TG'1Q``````#Q^``````$F+!TB)WDB+&TB+0"!(B0/A-````!,B>?H +MG3K__T&+A"1H`0``A<`/A./__08N$)&@! +M``"%P`^%S````$F-G"10)0``38VT)%!5``#K*&9F+@\?A```````9F8N#Q^$ +M``````!F#Q]$``!(@<.``0``3#GS="Z`>[@`=.Y(B[-`____2(G?_U,(QD.X +M`$B!PX`!``!(QX/`_?__`````$PY\W7228V<)!`E``!-C;0D$%4``&8/'T0` +M`$B+,TB%]G0928L$)$B)Q_]0"$C'`P````!(QT,(`````$B!PX`!``!,.?-U +MTTF+1"083(GF2(G'_U`(2(M]R+YP````Z%=S_O_IE_[__TV-O"1X`@``38VT +M)'@D``!!QX0DL`$```$```!F#Q]$``!,B?_H>$7__TF+7Q!(A=MT)TG'1Q`` +M````#Q^``````$F+!TB)WDB+&TB+0"!(B0/A-````!,B>?H'3;__T&+A"1H`0``A<`/AP8`0``2(F]X/[__TR+9T!( +MB8W(_O__3(F%T/[__V1,BSPE*````$R)?#^__]F#^_)\P]^0%B+2&"+>&0/MG!09@]BP87)=`B%_P^%&0@``,>% +MV/[__P$```!!N````!&Y````$$B-!7G+__]-A?],B6V(2(E%@$B-!:=-``!( +MB85@____2(T%.%% +M4/___P````!`@/XH#X<_"0``BY78_O__2(.]T/[__P"+0%1!B'0D8$&)5"1` +M2<=$)$@```0`28E,)%!-B40D6$V)?"1X2<>$)(@`````````00\11"0P00\1 +M5"1H#X3="```2(N-T/[__T''A"2$`````0```$B+$4F)E"2(````9@_OP(.] +MV/[__P%!B80D@````$G'A"2@`````````$$/$80DD`````^$4@,``$R)YTV- +MK"1P`0``Z*TR__]!BY0D:`$``&8/[\!)QX0D8`$```````"%T@^$PP\``$F- +M1"0(28M,)$A(C35\$?__\P]^!;00!`!F2`]N_DF)A"20`0``3(U-H$B--]!QX0D.`(```````!) +MQX0DL`$```````!!B8PDX`$``$$/$80D0`(``.C^6?__08G#A<`/A/H+``!% +MA=M^"T4/M]M!@#^__]F#]9#2(7`=5R+A7#_ +M__^%P'52BT60A#^__^+0%2%P'0N2(N= +MR/[__TB%VP^$%`<``+@!````9D@/?L%(.0L/A`$'``!F9BX/'X0``````$B+ +M5$)+``````````2(G'_Q!)B80D +MJ````$B%P`^$'`X``$F+1"0P28F$)+````!(C8TT____3(U-H#';13'_\T$/ +M;[PDD````$F-A"3`````2(F-$/___T&^X````$F-C"1P`0``2(F%&/___S'` +M0<>$),``````````9D6)M"3%````0<>$),P`````````2<>$)/@````````` +M0<>$)#0!````````2<>$)!`!````````0<>$)"P!```4`0``2,>%./___P`` +M``!(QX4@____`````$B)C<#^__],B8T(____#RF]\/[__^FC`0``9I!(BXT@ +M____2"G82(T\&4F+M"3P````28M4)#A-B[0D^````$6+E"2$````28GP28T, +M%TTI^$PYPD@/0O%%,@$20'(38V<"```!0`QTDGW +M\XGZ2#G0#T+XN`$```"%_P]%QXF%V/[__^E8]___3(TU$0D$`+YX5```#RF5 +M(/___TR)]TB)E1C____H-@/__V8/;Y4@____3(N5&/___TB%P$F)Q`^$B`(` +M`$B-!<0(!`!-B70D&/,/?@4?"00`28V4)`A5``!)B00D2(T%5,K^_T''1"0@ +M!P```&9(#V[P28V$)`@E``!)QT0D*`````!F#VS&2<>$)*@`````````2<>$ +M)+``````````0<:$)+@`````0<>$)&@!````````00\11"0(9F8N#Q^$```` +M``!F9BX/'X0```````\?A```````Q@``2`6``0``2,>`B/[__P````!(QX"0 +M_O__`````$@YPG7<2(N%X/[__TR)8$#I#?;__T''A"2$`````````.DP]___ +M2,=`2`````!!NP0```!(C15&*@,`1(G82&,$@D@!T#[_X$&#^Q%VYD6%V[@% +M0`"`00](P^E2^O__0<:$)+@````!28U$)`A)QX0DZ`````````!)QX0DV``` +M``````#'A=S^__\`````2(F%(/___TR+A2#___]`@/XH#X57^O__N/____^Z +M_____[G_____OO_____I6_K__TF+G"1P`0``3(MR$$@YV4@/1ME(*=E(B9TX +M____2(E*($B%VP^%EP<```\?@`````!%BYPD'`(``$6%VP^$KP(``$&+E"08 +M`@``2(G02,'@!$@!T$C!X`1)B<5(A=MT,4V--`1)BX0DD`$``$F+MH@"``!( +MB<=(BQ[_4`A)@[Z8`@```$F)GH@"```/A"0"``!(BX7`_O__2HV4*`@!``!( +MBT(82(M*($B%P`^$3____TR+#^__](QT!``````+@.``>`ZC^__^)C>S^__], +M`?Y(B94`____2(G'_Q!(BY4`____38N\)/@```!)B[0D\````(N-[/[__T@Y +MPD2+A>C^__]T)?-!#WZ$))@```!).?N% +MR0^%Y@8``(N%-/___T&+E"2`````@_@!#X1)!@``A=)U"D&#X`$/A6<&``"# +M^`,/A,L&``"+A5#____IA0````\?1```28N$)+````!)B[0DJ````$B-E3C_ +M__](B84X____28M$)&A(B;4@____2(G'_Q!!B80DI````(G"2(N%./___TB% +MP'0$A=)T#$''A"2@`````0```$B+O2#___\QV^D[^?__#Q]$``"+A5#___]! +MNPD```!)QX0D^`````````"#O=C^__\!#X37]O__,=+IQO;__TB%VW0G2<>& +MB`(```````!)BX9X`@``2(G>2(L;2(M`($B)Q_]0"$B%VW7D08.L)!P"```! +M#X4,!0``D$F+E"3P`0``28N$)/@!``!)B[0DZ`$``$@IT`^$?`0``$B-7!8@ +M9@_OP$B)A3C___](B9T@____00\1A"3P`0``2(7;#X6'!0``2,>%./___P`` +M```QVTC'A2#___\`````Z1/Z__]%,>WIU_W__T6+G"0X`@``\T$/?H0D$`(` +M`$6%VP^%]?7__TV-K"00)0``28V<)!!5``!F00]NC"0(`@``9D$/;KPDT`$` +M`&9!#]:$))@```!F#V+/9D$/UHPDH````&8N#Q^$``````!)BW4`2(7V=!I) +MBP0D2(G'_U`(2<=%``````!)QT4(`````$F!Q8`!``!).=UUT4F+M"3H`0`` +M2(7V="Q)BX0D^`$``$DYA"3P`0``=1I)BX0DD`$``$B)Q_]0"$G'A"3H`0`` +M`````$V-M"2(`@``,=MF9BX/'X0```````\?`$&+A"3@`0``.=AR'T&+E"08 +M`@``B=DIT"G1`=@YTP]#P4$[A"0<`@``UT)TG'!@````!F#Q]$ +M``!)BT;P3(GN38MM`$B+0"!(BUUYH/#`4F!QA`!``"#^R!UET6+ +MO"0<`@``QX7<_O__`0```$6%_W4<28N$)/@!``!).80D\`$```^5P`^VP(F% +MW/[__T&`O"2X`````$$/MG0D8`^$Y`(``$"`_B@/AMKZ__^+A5#___\QTD&[ +M!````/-!#WZ$))@```#I8O3__[^H`0``,=NY`0```$4Q]DC'A1C___\(`0`` +MZ;[S__])C;P=0`$``.CL3?__08G#A<`/A>[S__]-C;P=N`$``$R)_^B18?[_ +M08G#A<`/A=/S__]$B?))C;P=X`$``$B)T$C!X`1(`=!(P>`$38TT!$''AB`# +M```!````Z,E=_O],B?^)A1#____HZU[^_T&)PX7`#X6-\___BX40____1(N= +M$/___X7`#X5X\___38V\'5`!``!,B?_H&V'^_T&)PX7`#X5=\___0<>&N`(` +M``$```!)C;P=>`$``.AH7?[_3(G_B])@<40`0``Z$DQ__],.>MU[$6)\T6%]@^/VO+__P^%W_+_ +M_T&+A"3``0``A<`/A!("``!!BX0DS`$``(7`#X71_/__18N<)#@"``#S00]^ +MA"00`@``187;#X7&\O__18N<)-`!``#IN?+__T''A"1H`0```0```#')28V$ +M)'@"``!)QX0D<`$`````!`!!QX0D>`$```````!)QX0DZ`$```````!!QX0D +M'`(```````!)QX0DH`$```````!)QX0DJ`$```````!!#Q&$)/`!``!!#Q&$ +M)(`!``!!#Q&$))`!``"0B4@(@\$!2`40`0``3(FH\/[__TC'@`#___\````` +MQX`H____`````,=`D`````!(QX`8____`````,>`(/___P````"#^2!UMTF- +MO"10`@``,?;H>%_^_^EF[___2,>%./___P````!(A?8/A)G[__])BX0DD`$` +M`$B)Q_]0"$G'A"3H`0```````.EZ^___28U&($B)A2#___](B=@QV^G;\___ +M2<>$).@`````````2<>$)-@`````````0<:$)+@````!Z?;\__]!BX0D&`(` +M`(/``4$[A"3@`0``#X0#`0``B<%(B($2`'*2,'B!$B!P@@!``!!B80D +M&`(``$B+A<#^__](`<+I7?C__X72="A!BY0DA````(72=!R+A5#___])BYPD +MD````$DYG"2(````#X4R^O__18N<)*0```#IE?G__[A7``>`Z6OQ__^X!$`` +M@.EA\?__D$&+A"3(`0``A<`/A=[]__]!BX0DQ`$``(7`#X7._?__0<>$),P! +M````````Z?___P\? +MA```````\P\>^E6_<````$B)Y>B^6_[_2(T5[^\#`+\```"`\P]^!0K^`P!F +M2`]NRDB#PF!(O@$````!````QT`X`````&8/;,%F2`]NTDB#PFA(QT!````` +M``\1`&9(#V[:2(U*,/,/?@7/_0,`2(L5F!\#`$B)2#!F#VS"2,=`2``````/ +M$4`0\P]^!;3]`P#&0%#_9@]LP\=`5`````!(B5!82(EP8$B)>&@/$4`@7<,/ +M'P#S#Q[Z5;_H````2(GEZ`Y;_O](C157_`,`\P]^!8_]`P!F2`]NRDB#PF#' +M0"@`````9@]LP69(#V[22(U*,#'2#Q$`\P]^!6W]`P!(B4@@9@]LPF:)4"P/ +M$4`09@]O!6T>`P#&0"X`2,=`2`````!(QT!8`````$C'0$``````2,>`@``` +M``````!(QT!P``````\10#!=PP\?A```````\P\>^E5(B>5!54%44TB#[`B+ +M1RA$C6#_1(EG*$6%Y'4[2(MW<$R-+63\`P!(B?M,B>_HV?;^_TB+LX````!, +MB>_HRO;^_TB+>TCHT5K^_[[H````2(G?Z#1:_O](@\0(1(G@6T%<05U=PV8/ +M'T0``/,/'OI52(GE055!5%-(@^P(BT<(1(U@_T2)9PA%A>1U.4B+=U!,C2WT +M^P,`2(G[3(GOZ&GV_O](BW-@3(GOZ%WV_O](BWLHZ&1:_O](C7O@ON@```#H +MQEG^_TB#Q`A$B>!;05Q!75W##Q^$``````#S#Q[Z54B)Y4%505132(/L"(M' +M$$2-8/]$B6<0187D=3E(BW=83(TMA/L#`$B)^TR)[^CY]?[_2(MS:$R)[^CM +M]?[_2(M[,.CT6?[_2(U[Z+[H````Z%99_O](@\0(1(G@6T%<05U=PP\?A``` +M````\P\>^E5(B>5!54%44TB#[`B+1QA$C6#_1(EG&$6%Y'4Y2(MW8$R-+13[ +M`P!(B?M,B>_HB?7^_TB+_H??7^_TB+>SCHA%G^_TB->_"^Z````.CF +M6/[_2(/$"$2)X%M!7$%=7<,/'X0``````/,/'OI52(GE055!5%-(@^P(BT<@ +M1(U@_T2)9R!%A>1U.4B+=VA,C2VD^@,`2(G[3(GOZ!GU_O](BW-X3(GOZ`WU +M_O](BWM`Z!19_O](C7OXON@```#H=EC^_TB#Q`A$B>!;05Q!75W##Q^$```` +M``#S#Q[Z54B)Y4%44XM'($2-8/]$B6<@187D=35(B?M(BW\HZ,E8_O](B[.P +M````2(T]*_H#`.BF]/[_2(M[2.BM6/[_OK!*``!(B=_H$%C^_T2)X%M!7%W# +M#Q^$``````#S#Q[Z54B)Y4%44XM'"$2-8/]$B6<(187D=39(B?M(BW\0Z&E8 +M_O](B[.8````2(T]R_D#`.A&]/[_2(M[,.A-6/[_2(U[Z+ZP2@``Z*]7_O]$ +MB>!;05Q=PP\?@`````#S#Q[Z54B)Y4%44XM'$$2-8/]$B6<0187D=39(B?M( +MBW\8Z`E8_O](B[.@````2(T]:_D#`.CF\_[_2(M[..CM5_[_2(U[\+ZP2@`` +MZ$]7_O]$B>!;05Q=PP\?@`````#S#Q[Z54B)Y4%44XM'&$2-8/]$B6<8187D +M=39(B?M(BW\@Z*E7_O](B[.H````2(T]"_D#`.B&\_[_2(M[0.B-5_[_2(U[ +M^+ZP2@``Z.]6_O]$B>!;05Q=PY!F#Q]$``#S#Q[Z2(M_,.EC5_[_D&:0\P\> +M^E5(B>532(G[2(/L"$B+?S#H1U?^_TB)WTB+7?B^2````,GII5;^_Y`/'T`` +M\P\>^DB+?S#I(U?^_Y!FD/,/'OI52(GE4TB)^TB#[`A(BW\PZ`=7_O](B=]( +MBUWXOD@```#)Z656_O^0#Q]``/,/'OI52(T-5/@#`$B)Y4%505132(G[2(/' +M:$B#[`CHS";__X/X!0^'DP```(G`2(T5:B`#`$2+)()%A>1T$4B#Q`A$B>!; +M05Q!75W##Q\`2(M[2,9#+0%(A?]T"(M#-#E#.'3:Z(96_O^+>SC'0S0````` +M28G]2(7_="3H+U?^_TB)0TA(A^E5(B>5!54%44TB#[!AD2(L$)2@```!( +MB478,<"#^@0/AC`Z\5F+@\?A```````N`%``(#K +MM&8/'X0``````+A7``>`ZZ3H-%3^_P\?0`#S#Q[Z2(/O".F#_O__D&:0\P\> +M^H/Z$'4Q2(M&"$B+%L=''`````!(B4=`2(M',$B)5SB)$(M7/(E0!(M70(E0 +M"(M71(E0##'`P[A7``>`P_,/'OI(@^\(Z[9F#Q]$``#S#Q[Z54B)Y4%7059) +MB0/A*\```!( +MB=_H#[O__X7`#X6)````B[N@````BU-P.==T1BGZ3(GN1#GB00]'U$@#>VA! +MB=>)TDB)5^DB#[S#I\_[__Y!FD/,/'OI52(GE055) +MBUT +M"$''10``````A=)U,S'`2(/$"%M!7$%=7<-F#Q]$``!)`WPD$$B)VNB;4?[_ +M20%<)"!-A>UTUD&)70#KT`\?`+@%0`"`Z\B0\P\>^E6_L$H``$B)Y>C^4?[_ +M,C`@``#Q&'LP(```\1A\,"```/$8?3`@``#Q&'XP(```\1A_," +M```/$8<#`P``#Q&'$P,``&9F+@\?A```````9F8N#Q^$```````/'P"("(/J +M`74&C5'_@\$!2(/``4@YQG7J9@]O!>(3`P!(C4^E5(C06T[P,`2(GE055)B?U!5%-(@^P( +M2(F'F````/,/?@56\@,`2(T%!P\$`&9(#V[09@]LP@\1!TB+OY````!(A?]T +M!DB+!_]0$$F+55!(A=(/AU#^_T&+12A)BWT@A0#ZT4/'T0``$B+ +M>QAF#^_)2,<#``````\12P@/$4LH#Q%+.$B%_W0%Z#M0_O](B=^^2````.@. +M3_[_28M]($F#[`A)@_SX="!*BQPG2(7;=.U(BU,@2(72=*Y(BWL8,?;HLTW^ +M_^NAD$B%_W032(/$"%M!7$%=7>GL3_[_#Q]``$B#Q`A;05Q!75W##Q]$``!) +MBWU(,?;H?4W^_^DD____#Q^$``````#S#Q[Z54B-!73N`P!(B>5!54F)_4%4 +M4TB#[`A(B8>8````\P]^!1;Q`P!(C07'#00`9D@/;M!F#VS"#Q$'2(N_D``` +M`$B%_W0&2(L'_U`028M54$B%T@^%S````$F+?4AF#^_`2<=%,`````!!#Q%% +M.$$/$45800\116A(A?]T!>@[3_[_08M%*$F+?2"%P'1O1(U@_TG!Y`/K10\? +M1```2(M[&&8/[\E(QP,`````#Q%+"`\12R@/$4LX2(7_=`7H^T[^_TB)W[Y( +M````Z,Y-_O])BWT@28/L"$F#_/AT($J+'"=(A=MT[4B+4R!(A=)TKDB+>Q@Q +M]NAS3/[_ZZ&02(7_=`7HMD[^_TB#Q`A,B>^^H````%M!7$%=7>E_3?[_#Q^` +M`````$F+?4@Q]N@]3/[_Z23___\/'X0``````/,/'OI52(GE059!54%44XM' +M$$2-7<,/'T0``$B-!0GM`P!)B?WS#WX% +MON\#`$B)AY@```!(C05H#`0`9D@/;M!F#VS"#Q$'2(N_D````$B%_W0&2(L' +M_U`028M54$B%T@^%S0```$F+?4AF#^_`2<=%,`````!!#Q%%.$$/$45800\1 +M16A(A?]T!>C<3?[_08M%*$F+?2"%P'1P1(U@_TG!Y`/K1F8/'T0``$B+>QAF +M#^_)2,<#``````\12P@/$4LH#Q%+.$B%_W0%Z)M-_O](B=^^2````.AN3/[_ +M28M]($F#[`A)@_SX="!*BQPG2(7;=.U(BU,@2(72=*Y(BWL8,?;H$TO^_^NA +MD$B%_W0%Z%9-_O],B>^^H````.@I3/[_6T2)\$%<05U!7EW##Q]$``!)BWU( +M,?;HW4K^_^DC____#Q^$``````#S#Q[Z54B)Y4%7059!54%44TB#[`B+AWC_ +M__]$C6C_1(FO>/___T6%[7052(/$"$2)Z%M!7$%=05Y!7UW##Q\`2(T%F>L# +M`$F)__,/?@5.[@,`3(VW:/___TB)!TB-!?4*!`!F2`]NT&8/;,(/$8=H____ +M2(M_^$B%_W0&2(L'_U`028M7N$B%T@^%P0```$F+?[!F#^_`2<='F`````!! +M#Q%'H$$/$4?`00\11]!(A?]T!>AH3/[_08M'D$F+?XB%P'1L1(U@_TG!Y`/K +M0F:02(M[&&8/[\E(QP,`````#Q%+"`\12R@/$4LX2(7_=`7H*TS^_TB)W[Y( +M````Z/Y*_O])BW^(28/L"$F#_/AT($J+'"=(A=MT[4B+4R!(A=)TKDB+>Q@Q +M]NBC2?[_ZZ&02(7_=`7HYDO^_[Z@````3(GWZ+E*_O_IW_[__P\?0`!)BW^P +M,?;H=4G^_^DO____\P\>^E5(B>5!5T%6055!5%-(@^P(BT<(1(UH_T2);PA% +MA>UT&TB#Q`A$B>A;05Q!74%>05]=PV8/'X0``````$B-!3GJ`P!)B?],C7?X +M\P]^!>KL`P!(B8>0````2(T%E`D$`&9(#V[09@]LP@\11_A(B[^(````2(7_ +M=`9(BP?_4!!)BU=(2(72#X7`````28M_0&8/[\!)QTQAF +M#^_)2,<#``````\12P@/$4LH#Q%+.$B%_W0%Z,M*_O](B=^^2````.B>2?[_ +M28M_&$F#[`A)@_SX="!*BQPG2(7;=.U(BU,@2(72=*Y(BWL8,?;H0TC^_^NA +MD$B%_W0%Z(9*_O^^H````$R)]^A92?[_Z=G^__\/'T``28M_0#'VZ!5(_O_I +M,/____,/'OI52(GE059!54%44XM'"$2- +M7<,/'T0``$B-!6GB`P!)B?U(B0>+1S!(BW\HA7<.09BX/'X0``````%5(B>5!5T%6055!5%-(@^P81(MW$$6%]G122(M/ +M"$R+/DF)^$F)]$4Q[68/'T0``$J+'.E,.SMU*D&+5"0$A=)T/DB#P@BX"``` +M`.L,#Q\`2(/``4@YT'0G#[8\`T$X/`1T[4F#Q0%-.>YUQ$B#Q!@QP%M!7$%= +M05Y!7UW##Q\`28M4)"!(.U,@==A(B4W(2(72=!Y(BW,828M\)!A,B47`Z#I& +M_O],BT7`2(M-R(7`=;%(C7,H28U\)"BZ(````$R)1^DB)P^DV3_[_D&8N#Q^$``````#S#Q[Z54B)Y4%5 +M28GU051!B=132(G[2(/L"$B+5U!(A=)U74V%Y'40,A*1O[_2,=#2`````!(QT-0`````$R)Y^C20O[_2(E#2$B) +MQTR)8U!,B>),B>[H7$3^_^NR9BX/'X0``````$B+?T@Q]NBU0_[_3#MC4'4/ +M387D=))(BWM(Z\T/'T``2(M[2$B%_W0-Z.)%_O](QT-(`````$C'0U`````` +M387D#X1A____ZXWS#Q[Z2(G'Z6M._O]F9BX/'X0``````/,/'OI(@^\(Z1/_ +M__^09I#S#Q[Z54B)Y4%7059!54%44TB#['AD2(L<)2@```!(B5W(2(G[2(T] +M)%8$`.CO1?[_3(US,$B->QA,B?9(B7V83(EUJ.BW^___A,`/A<\```!,B?9( +MC3W%500`Z*#[__^$P`^%5@(``$2+6S!$BU,T3(M[4$&#^S\/A5("``!%B=1% +MA=)T&$B-9!B<1-B>*#^"!T%+H@````2HU\(U@Q]D0ITNA'0O[_ +M2(MUJ$B+?9CH^OO__V8N#Q^$``````!$BST)500`187_=&=(BPWU5`0`3(M# +M,$4Q]DF)S4R)^4V)QV9F+@\?A```````9I!/BV3U`$T[/"1U+XM3-(72#X3Z +M````,<#K$V8/'T0``$B#P`%(.<(/A.,```!!#[9T!`A`.'0#.'3F28/&`4PY +M\76]2(MUJ$B-/8)4!`#H;?O__TB-/:94!`#H$4+^_TB+NY````!(C56X2,=% +MN`````!(C377#`,`2(L'_Q!!B<2%P'5-2(M]N$B%_P^$DP0``$B+!TB-+H0````2(L'_U`@08G$A$2)X%M!7$%=05Y!7UW#9BX/'X0``````$B+4U!).U0D(`^%&____TB) +M3:!(A=)T&DF+="082(M[2.A:0/[_2(M-H(7`#X7X_O__187V#X0(____2HT4 +M]0````!)C7T(3(GNZ-%#_O](BP5R4P0`3(D@Z>7^__](BW6H2(M]F.A%^O__ +MZ=/^__^X!@```$6-0@A(C7W`OH````!!.<-/C2PX1(E=@$$/1L-$B56(B<&X +M`0```-/@08G!B46430^OS4N-E&F`````3(E-H.@70/[_A<`/A4-+_O],BV7` +M387D#X0V2_[_1(M5B$R+3:!-C;0D@````$B-E,B>I,B?:#PP%(B<_HW#_^_TB) +MP4$YWW7D1(M=H$R+38!(BYUX____28MT)`BX`0```$2)V44Q_]/@B46`28U$ +M)$!(B85H____#Q]``(M-E$B+58A$B?A!`<\/'P")`H/``4P!ZD0Y^'+S387) +M#X2_````B?"Z0````$P!SH/@/TF)="0(*<*)UDDY\0^"R`$``$R)=:!-B/___TB+O6#___](P>H&0?\4)$R+ +ME7C___],BXUP____3(G2@^(_=%)(BT6@28/BP$B+O6C___],`=!(B<:#^@@/ +M@Y0!```QP/;"!'0)BP:)![@$````]L("=`Y$#[<4!F9$B10'2(/``H/B`70, +M#[84!H@4!P\?1```28MT)`B+18!!.<:)T#'V@_H(#X.2`0``]L($#X5I +M`@``A=(/A2T"``!)BT0D"$B+O6#___],B?Y(P>`#2(G"#\A!B40D?$C!ZB`/ +MRD&)5"1XN@$```!!_Q0D,AY/?[_28MT)`A,BTV@Z;#^__]!O`5``(#I +ML?O__T&)TC'V08/B^(GQ3(N%:/___X/&"$B+/`A)B3P(1#G6#P@A( +MB30Y.<)R\^D]_O__@_A`=""Z/P```(U&08G13`'@*?%T#S'2B=:#P@'&!#`` +M.$;^_P\?@`````#S +M#Q[Z54B)Y4%505132(/L&&1(BSPE*````$B)?=B_H````.@X//[_9@_OP+]( +M````#Q%`*&8/[\!(B<,/$4`X#Q%`>/,/?@7,W@,`QT`0`````,=`&!````!( +MQT`@`````$C'0$@`````2,=`4`````#'@(@`````````2,>`D`````````!( +MC062VP,`9D@/;LA(@\`P2(F#F````&8/;,$/$0/HMCO^_\=`$`````!)B<1( +MC7W0NC`!``#S#WX%6]X#`$B-!<3:`P!!QD0D%`"^@````$''1"08(````&9( +M#V[09@]LPD$/$00DZ"TZ_O^%P`^%IT7^_TB+1=!)B40D,$B%P`^$G$7^_TB- +M!>S9`P!F#^_`3(GG9D@/;MA(C05)O/[_00\11"0X\P]^!?/=`P!)B40D*$B+ +M!<=,!`!F#VS#28E$)"!!#Q$$).C^E5( +MB>5!5%.+1RA$C6#_1(EG*$6%Y'0-1(G@6T%<7<,/'T0``$B-!4G5`P!(B?OS +M#WX%9MT#`&9(#V[(2(/`8&8/;,%F2`]NT$B#P#`/$0?S#WX%3=T#`$B)1R!F +M#VS"#Q%'$$B+O_@```!(A?]T$$B+!TB+DP`!``!(B=[_4`A(B[O@````2(7_ +M=`7H;#O^_TB+N]````!(A?]T!>A;._[_BWLL@___=`7H7CW^_TB)W[X(`0`` +MZ"$Z_O]$B>!;05Q=PV8/'X0``````/,/'OI52(GE055!5%-(@^P(BT<(1(U@ +M_T2)9PA%A>1T#TB#Q`A$B>!;05Q!75W#D$B-!7'4`P!(B?M,C6_@\P]^!8K< +M`P!F2`]NR$B#P&!F#VS!9D@/;M!(@\`P#Q%'X/,/?@5PW`,`2(D'9@]LP@\1 +M1_!(B[_8````2(7_=!!(BP=(BY/@````3(GN_U`(2(N[P````$B%_W0%Z)`Z +M_O](B[NP````2(7_=`7H?SK^_XM[#(/__W0%Z((\_O],B>^^"`$``.A%.?[_ +M2(/$"$2)X%M!7$%=7<,/'X``````\P\>^E5(B>5!54%44TB#[`B+1Q!$C6#_ +M1(EG$$6%Y'0/2(/$"$2)X%M!7$%=7<.02(T%D=,#`$B)^TR-;^CS#WX%JML# +M`&9(#V[(2(/`8&8/;,%F2`]NT$B#P#`/$4?H\P]^!9#;`P!(B4<(9@]LP@\1 +M1_A(B[_@````2(7_=!!(BP=(BY/H````3(GN_U`(2(N[R````$B%_W0%Z*\Y +M_O](B[NX````2(7_=`7HGCG^_XM[%(/__W0%Z*$[_O],B>^^"`$``.AD./[_ +M2(/$"$2)X%M!7$%=7<-F#Q]$``#S#Q[Z54B)Y4%505132(/L"(M'&$2-8/]$ +MB6<8187D=`](@\0(1(G@6T%<05U=PY!(C06QT@,`2(G[3(UO\/,/?@7*V@,` +M9D@/;LA(@\!@9@]LP69(#V[02(/`,`\11_#S#WX%L-H#`$B)1Q!F#VS"#Q$' +M2(N_Z````$B%_W002(L'2(N3\````$R)[O]0"$B+N]````!(A?]T!>C0./[_ +M2(N[P````$B%_W0%Z+\X_O^+>QR#__]T!>C".O[_3(GOO@@!``#HA3?^_TB# +MQ`A$B>!;05Q!75W##Q^``````/,/'OI52(GE055!5%-(@^P(BT<@1(U@_T2) +M9R!%A>1T#TB#Q`A$B>!;05Q!75W#D$B-!='1`P!(B?M,C6_X\P]^!>K9`P!F +M2`]NR$B#P&!F#VS!9D@/;M!(@\`P#Q%'^/,/?@70V0,`2(E'&&8/;,(/$4<( +M2(N_\````$B%_W002(L'2(N3^````$R)[O]0"$B+N]@```!(A?]T!>CO-_[_ +M2(N[R````$B%_W0%Z-XW_O^+>R2#__]T!>CA.?[_3(GOO@@!``#HI#;^_TB# +MQ`A$B>!;05Q!75W#9@\?1```\P\>^E5(B>5!5%.+1PA$C6#_1(EG"$6%Y'0- +M1(G@6T%<7<,/'T0``$B-!5G0`P!(B?M(B0=(BW](2(7_=`7H;3?^_XM[$(/_ +M_W0%Z'`Y_O](B=^^:````.@S-O[_1(G@6T%<7<.09BX/'X0``````/,/'OI5 +MB=)(B>5!5$F)_%-(A#HK#/^_TF+O"3X````BP!( +MA?]T'4B+#TF+M"0``0``B<+_$5M!7%W#9@\?A```````A.%P'07#[?06T%<@#T_"7<.X!4``@.O+#Q^$``````#S#Q[Z54B)Y4%505132(/L +M"(/Z`G=J28G\BW\L2(G+Z#PT_O](@_C_=!Y(A=MT`TB)`T4Q[4B#Q`A$B>A; +M05Q!75W##Q]$``#H@S+^_T2+*$6%[70S00^WQ0T```"(187M1`]/Z$B%VW3+ +M08M\)"RZ`0```#'VZ.4S_O](B0/KM4&]`0`#@.NM0;T%0`"`Z]7S#Q[Z5;H! +M````2(GE059!54%428GT4TB)^XM_+$C'!@`````Q]NBE,_[_2(/X_W0_BWLL +MN@(````Q]DF)Q>B-,_[_BWLL,=),B>Y)B<;H?3/^_TV)-"0QP$F#_O]T$5M! +M7$%=05Y=PP\?A```````Z,LQ_O^+`(7`=!^DB#[PCI4____Y!FD/,/'OJ#^@)W5U5( +MB>532(G+2(/L"(M_$.@#,_[_2(/X_W052(7;=`-(B0,QP$B+7?C)PP\?1``` +MZ%,Q_O^+`(7`=",/M]!(BUWXR8'*````B(7`#T_"PV8/'X0``````+@!``.` +MP[@%0`"`Z\"09I#S#Q[Z54B-=SA(B>532(G[2(/L"(M_+.CD-?[_A<`/E(/R +M````=0E(BUWXR<,/'P#HZS#^_XL`AH"2/?B +M2,'J`D@!T4F)"DV%_W0Z2(N3B````$BXP_4H7(_"]2A(N0"1$+8"````2`.+ +M@````$AIR8"6F`!(P>H"2/?B2,'J`D@!T4F)#TV%]G0Z2(N3F````$BXP_4H +M7(_"]2A(N0"1$+8"````2`.+D````$AIR8"6F`!(P>H"2/?B2,'J`D@!T4F) +M#DV%[70TBT-0N1````")PH'B`/```('Z`$```+H@````#T31B=&#R0&HD@]$ +MT<'@$`G0@,R`08E%`#'`2(/$&%M!7$%=05Y!7UW##Q^$``````!(C7^E5(B>5!5$F)]%.`O_(`````2(G[=1M(C7H"3&G`@):8`$D!T4B+DX@```!(:?:`EI@`3(G)9D$/ +M;ME(P>H"2,'I(&8/8L-(B=!F2`]NR4CWYTC!Z@))C0002(N3F````&8/;M!( +MP>@@2,'J`D&)1"0T9@]BRDB)T&8/;,%(]^=!#Q%$)"0QP$C!Z@)(`=9)B70D +M.%M!7%W#D.B;+?[_BP"%P'03#[?06T%<@532(G[2(/L +M"(M_#.@D,O[_A<`/E(/2````=0E(BUWXR<,/'P#H*RW^_XL`A=9-`6Y@387D=`1%B2PD +M,=)(@_C_=!E(@\0(B=!;05Q!74%>05]=PTR)Z.O5#Q\`Z',L_O^+$(72=`\/ +MM\(-````B(72#T_0Z\VZ!4``@.O&D&8/'T0``/,/'OI52(GE05=)B?]!5DF) +MSD%528GU05132(/L"$B%R70&QP$`````08G4ZPYFD.@;+/[_BP"#^`1U/$R) +MXDR)[K\!````Z$0L_O](B<-(A05]=P[@%0`"`Z[QF+@\?A```````\P\>^E6+?Q!(B>7H,"S^_X7`=0Q= +MPV8N#Q^$``````#H>RO^_XL`A^E5(B>5!54F)_4%4 +M4TB#[`B+1Q!(BW\(A0#ZTQ@Q]NBC*_[_ZZ&02(7_=!-( +M@\0(6T%<05U=Z=PM_O\/'T``2(/$"%M!7$%=7<-F9BX/'X0``````&:0\P\> +M^E5(B>5!5T%6055!5%-(@>SX````BT\(2(F]Z/[__V8/;LED2(L4)2@```!( +MB57(2(L79@]PP>!F2`]^PX7)#X1!!```2(UY_TB-!#H/MC!)B<1`@/XN=2/I +M(`0``&9F+@\?A```````#Q]``$F#[`%!@#PD+@^$QP,``$PYXG7L0;S_____ +M0(#^+W4=Z:8#``!F9BX/'X0``````$B#Z`&`."\/A(X#``!(.<)U[D&]____ +M_TC'A2#___\`````2(UY`>B4*?[_2(F=*/___S'22(N=Z/[__TB)A2#___]( +MBS-F+@\?A```````#[8,%H@,$$B#P@&$R77QOP0```#H5RG^_\8``$B)PT&- +M10''A1S___\#````1#G@#XTH`P``1(GF1#NE*/___W,22(N%(/___T2)I2C_ +M___&!#``2(N%Z/[__TB-O1#___](B9T0____QX48____`````$@#,.CE-O__ +MBX48____2(N=$/___XF%_/[__XN%*/___SF%+/___P^$V@(``$B+C2#___^- +M4`&_!````,8$`5^)T,8$`0")E2C___](QX4`____`````.BA*/[_2(L5"N\" +M`$B-M0#___](B84`____0;\```!`2(FU\/[__T&^`0```$B)E0C____&``"X +M`P```&8N#Q^$``````"+E2C___]'C20^0='L.=`/@N,!``!,BZT`____2(N% +M(/___XF5"/___S'2#Q]$```/M@P008A,%0!(@\(!A,EU[TR+K?#^__^^"@`` +M`$R)[^@+1___B[4(____1(GG2`.U`/___^BF,___B[7\_O__3(GO2"N%`/__ +M_XF%"/___^C;1O__BXT(____,=,B[WH_O__2(VU(/___TR)_^C"-?__O@H```!,B?_H-4;__T&+ +M=PA$B?=)`S?HUC+__TDK!XNU_/[__TR)_T&)1PCH$4;__T&+3P@QP$D##P\? +MA```````#[84`X@4`4B#P`&$TG7Q2(N%Z/[__XNU_/[__[D2````3(GO`7`( +M2(L0,[S2*M(B=?H=BK^_TB+O0#___^%P$$/E<1(A?]T!>@/*O[_2(G? +MZ`%_/[__P````"+A2C___\YA2S___\/A2;] +M__](C;T@____Z,HR__^+A2C____I#_W__T&)_.DD_/__0;S_____0;W_____ +MZ1[\___H(2C^__,/'OI)B<3IGC+^__,/'OI)B<3IIC+^__,/'OI)B<3IC3+^ +M__,/'OI)B<3INS+^_Y#S#Q[Z54B-!5S"`P#S#WX%?,H#`&9(#V[(2(/`8&8/ +M;,%F2`]NT$B#P#!(B>5!5%-(B?L/$0?S#WX%6LH#`,='*`````!(B4<@9@]L +MPL='+/_____&1S``2,>'R`````````!(QX?0``````````\11Q"_$````.@4 +M)?[_3(LE?>L"`+\0````2(F#T````,<``````$R)H]@```!(QX/@```````` +M`.CD)/[_2(F#X````$R)H^@```#'``````#'@_``````````2,>#^``````` +M``!(QX,``0```````%M!7%W#\P\>^DF)Q.GN,?[_\P\>^DF)Q.G1,?[_D&:0 +M\P\>^E5(B>5!54&)U4%428GT4TB)^TB#[`A(BW\82(7_=`Y(BP?_4!!(QT,8 +M`````$V%Y'0*28L$)$R)Y_]0"$B+>Q!(A?]T!DB+!_]0$$F+!"1,B6,02(U3 +M&$R)YTB--=OO`@#_$$2(:PY(@\0(6T%<05U=PV8N#Q^$``````#S#Q[Z2(L_ +M2(7_=`Q52(L'2(GE_U`07Y,B>%(.=-, +MB?](#T;3_U`8BU7$20$620'52"G3A05]=PV8/'T0``#'`Z]CH;R7^_Y!F9BX/'X0```````\?`/,/'OI5 +M2(GE05=)B?=!5D%508G505132(G[2(/L&&1,BR0E*````$R)9YT&4B+@X````!(*X.( +M````3#GP1`]"Z$P/0O"+LZ0```!,B?)(`W-H3(G_Z&HC_O]F00]NW?,/?H.D +M````3`&SB````&8/<,O@9@]OT68/_M!F#_K!\P\0PF8/UH.D````387D#X1: +M____18DL).E1____#Q^``````(F3J````(G0Z6O___\/'P`Y0W`/@M````"` +M>WP`#X30````2(MS:&8/'X0``````(G1@\(!Q@0.`#G0=?-(B[O(````B<)( +MBW-HB8.@````2(L/_U$@B8.H````B<*+@Z`````YP@^%?0```(7`#X4$____ +MBXND````2(M3:(7)=0Y%,<#I:/[__V8/'T0``(G/]]E!BQ(BU-HB8N@```` +MQX.D`````````.D5_O__#Q\`*?E!BO?N`5``(#I6?[__[@!````Z4_^ +M___HWB+^_V9F+@\?A```````#Q\`\P\>^DB#[R#I8_W__P\?`/,/'OI52(GE +M059!54%44TB#[!!D2(L$)2@```!(B478,Z````@$F+!DR)[DR)X4@YTTR)]T@/1M/_ +M4!B+5=1)`=5(*=.%P'3/2(M5V&1(*Q0E*````'4?2(/$$%M!7$%=05Y=PP\? +M`#'`Z]T/'T``N`5``(#KTN@<(O[_9F8N#Q^$``````"0\P\>^E5(B>5!5$F) +MU%-(B?M(BW\(2(7_=";H,?___S'2B4,0A);2(G005Q=PV8/ +M'X0``````,=#$`````#KWY!F#Q]$``#S#Q[Z54B)Y4%7059!54%44TB#['A( +MB;5X____2(E5@&1,BRPE*````$R);L!``!-A>UT(DB+0UA(C5-@2(UUP$R)[TB) +M1RP!=09!@_D$=36%_W6C387D=)Z`>RP`=)@Q_TB+0UA).00D0`^5 +MQ^N(@'LL`'3;@'LN`'352(M#8$@Y0U!TR[\!````Z6C___^_5P`'@.E>____ +MZ,<=_O^09@\?1```\P\>^E5(B>5!5TF)_T%628GV055!5%-,B<-(@^Q(2(E5 +MF$R+9RA(B4V09$R++"4H````3(EMR$V)S4V%Y`^$'00``$B%VTV)=UA!#Y6' +MDDH``'0*2(L#28F'H$H``$G'AZA*````````2<>'E$H```````!(QT6@```` +M``\?0`!!BX>82@``@_@"#X08`P``@_@##X3G`@``A<`/A1\!``!)BT=(2<=' +M8`````!!QD=H`$F)1SA)B4=`2(L%%^$"`$''1VP`````28F'V````$F+A^@` +M``!(B05]=PV8/ +M'X0``````$$/MH>02@``38UW<$''AYA*```!````3(GW08F'E````.A*]O[_ +M9BX/'X0``````$&`OY)*````NP```0!T&K@```$`28N?H$H``$DKGZA*``!( +M.<-(#T?828T$'$B)1:A).<0/A+4!``!,B>--C7=PZQ4/'T0``(3)=1V(`TB# +MPP%(.5VH=%A,B??H\/_^_T$/MD]HAH2@`` +MA,D/A8L!``"%P'E*@_C_#X12`@``28MW*$B+!6/?`@!)B8>42@``2(M%H$@I +MPND5`0``2(M=J$F+EZA*``!,*>-(`=I!@']H`$F)EZA*```/A3T!``!(BTV@ +M28MW*$B)T$@IR$&`OY%*````28GT=")!@+^22@```'0823F7H$H```^$RP$` +M`&9F+@\?A```````2(M]F$B)PDR)YN@A^/__B<.%P`^%>O[__T&#OYA*```" +M#X0Q`0``387M="U)BT])`T=@28V7J$H``$B)1H2@``08"_DDH```!(B46@=`U).X>@2@``#X/=```` +M08N?E$H``$V+9RB%VP^$(OW__TB+?9@QTDR)YNB4]___A<`/1=CI[?W__V8N +M#Q^$```````QTDR)YDB+?9CH82@```P```(7;#T382(M%H$&)GY1*``!(*<+I5?W_ +M_TB+!;G=`@!)BY>H2@``28MW*$F)AY1*``!(BT6@2"G"Z6#___\/'P!!@+^1 +M2@````^$+?W__TB#?9``#X0B_?__2(MUD#';28M'.$DK1TA)`T=@2#L&#Y7# +MZ07]__]FD$B-?;BZ```!`+Z`````Z-T7_O^%P'5A3(MEN$V)9RA-A>0/A;O[ +M___K5F8/'T0``$&+C]P```"%R0^%M_W__^DL_O__08N'W````(7`#X6?_?__ +M2(MUH$B)T$V+9RA!QX>82@```@```$@I\.G__?__B?S__^C1&/[_D/,/'OI52(GE05=!5DF)_D%505132(/L:$B)M7#_ +M__](B56`3(E%F$R)38AD2(L$)2@```!(B47(,<#H<7[__T&)Q(7`#X4#`P`` +M13'_,=M%,28M_:$2)\DJ--`?HKQC^_TB#?8@`=#I(BT6X +M2(N->/___TB)PD@IRDB!^O__/P!V($B+?8A(B85X____2(UUN$B)\DB+!_]0 +M&(7`#X5R`0``2(-]F`!$B>@/A3#^__^$P'1*187V#X1<`0``13GF#X5%_O__ +M1(GRQT6D`````$&)Q42)\TF+=VA)B=#I$/___V8/'T0``$B+19A(A8/A``!``"(1:A% +MB?7IV/W__P\?0`"-0_]$.>!S1T$IW$$IW@^%Y?[__TB#?8@`#X1Q____2(M% +MN$B+C7C___](B<)(*!;05Q!74%>05]=PP^V +M1:A%B>Z#?:0`#X29````28MW:$&)Q42)X^GC_?__1(GC13'M@^/`A,!T8D4/ +MMF]\183M=5A!B<5$B>/IP?W__T&)Q.N41(MEH.N.1(MEI.N(QT6D`````$6) +M\$&)Q42)\TF+=VCIJ?W__T&\`0```.ED____BU6DA=)U'83`=1E$B?-)BW=H +M13'M@^/`QT6D`````.EH_?__28MW:$&)Q42)\^E9_?__1(GC@^/`A,!UYTF+ +M=VA%,>WKTNB<%/[_#[9%J$6)[D6)[.DV____D&9F+@\?A```````D/,/'OI5 +M2(GE055!5$F)_%.)\TB#["B`O_(`````9$R++"4H````3(EMV$F)U0^$W0`` +M`(US^4C'1<``````2,=%R`````"#_E]W=4B-%<;8`@!(8P2R2`'0/O_@28NT +M))@```!(N0"1$+8"````20.,))````!(B?)(:H"2(T$DD@!T4B-!(!(B4W(2,'@`D@I +MQF:)=<1FD&9!@WT```^%A````&8/;T7`QT7``````$$/$44`2(U]P.A*6?__ +M,/___TF+1"1HNQ4` +M``!FB5W`2(E%R.E$____08M$)%`E`+```#T`(```#X4O____28M$)&"_$P`` +M`&:)?<`/MM!(P>@,,,`)T(E%R.D.____08M$)%`E`+```#T`(```#X7Y_O__ +M28M$)&!!N!,```!F1(E%P$B)PDC!Z"!(P>H()0#P__^!XO\/```)T(E%R.G) +M_O__08"\)/``````#X2Z_O__08M$)%BY$P```&:)3<")1/W__TF+O"3@````N`@```!FB47`Z!(8 +M__](B47(2(7`#X55_?__Z2H<_O])B[PDT````+H(````9HE5P.CJ%___2(E% +MR$B%P`^%+?W__^D"'/[_#Q^$``````"X!4``@.D^_?__Z-$0_O^0\P\>^DB# +M[R#I0_S__V8N#Q^$``````!F+@\?A```````9BX/'X0``````&8N#Q^$```` +M``!F+@\?A```````D/,/'OK'!@(````QP,.09I#S#Q[Z@_X!=R^)]DB-!>?@ +M`@`/M@0PB0%(C0UQX`(`#[8$`69!B0`QP$C'`@````###Q^``````+A7``>` +MPV:0\P\>^H/^`7`"``^V!`%F08D`,^DC'`@`````QP$B-#2S"`@!F9BX/'X0``````&9F+@\? +MA```````9@\?1```1`^V!`%$.`0&=1U(@\`!2(/X$'7K2(DZ,<"#AY`````! +MPV8/'T0``+@"0`"`PV:0\P\>^HN'D````(/``8F'D````,-F9BX/'X0````` +M`)#S#Q[Z54B)Y5-(@^P(BX>0````C5C_B9^0````A=MU!DB+!_]08(G82(M= +M^,G#9I#S#Q[Z2(N'J````(GV2(L$\$@%\````,,/'X0``````/,/'OI(BX>@ +M````B?9(BP3P2`7P````PP\?A```````\P\>^DB+AY@```")]DB+!/!(BX#@ +M````PP\?@`````#S#Q[Z2(N'D````(GV2(L$\$B+@.````##D&8/'T0``/,/ +M'OI528GP2(GE05=)B<]!5DF)_D%505132(/L&(E5S$B%R70&QP$`````BWW, +M,<"%_P^$Q````$V+;A!-.VX8#X.V````08M&#$&+3C`Q]DV+3BCK'68/'X0` +M`````$B+4PA,`>)).=5R)(UP`8T$#M'HB<))BQS13(MC$$TYY7/=B<'KZ&8/ +M'X0``````$R)[D&)1@Q,*>9(.7,8="5(BSLQTDR)1^H/Z`70W@_H"=!*%TG02N`$``X###Q^$``````!(`W<82(7V>!U(B7<0 +M2(7)=`-(B3$QP,,/'X0``````$@#=Q#KWKB#``>`PP\?0`#S#Q[Z2,<"```` +M`#'`2(T-G+\"`&9F+@\?A```````D$0/M@0!1#@$!G452(/``4B#^!!UZTB) +M.C'`@T<(`<.0,M(B?A( +MB0(QP(-'$`'#9@\?1```,M(C4<(2(D",<"#1Q`!PP\?1```N`)``(##9I#S#Q[Z2,<"`````#'`2(T- +M++T"`&9F+@\?A```````9F8N#Q^$``````!F#Q]$``!$#[8$`40X!`9U'4B# +MP`%(@_@0=>M(C4?X2(D",<"#1P@!PP\?1```,M(B?A(B0(QP(-'"`'#9@\?1```N`)``(##9I#S#Q[Z +MBT<0@\`!B4<0PV:0\P\>^HM'"(/``8E'",-FD/,/'OI(QP(`````,T"#P`%$B>:)0S1;2(L'05Q=2(M`./_@ +M9@\?1```2(/"!$B)4RB#:S`!Z])F+@\?A```````\P\>^HN'V````(D&,<## +MD/,/'OK'!@`````QP,.09I#S#Q[ZN`%``(##9@\?1```\P\>^L<&`````#'` +MPY!FD/,/'OI(QP(`````,<#'`3X```##9F8N#Q^$``````"0\P\>^DC'`@`` +M```QP, +M^DC'`0````!(B8`0``2(72=.U(BX^(`0``2(7)=.&)]X/&`4B+ +M//I(BQ3R2"GZ2`'22('Z____?W?%2(T,>4B)"$&)$$''`5$```#KLI!(B?!( +M.?=R+<,/'X``````@/IZ=%N`^KQT9H#ZKW1Q@/HG='R`^AP/A(,```!(B<]( +M.<=S.@^V5P5(C4\&@/HW=*`?P*O==R`?P0<==:`?P,G +M=="`/WIURX!__S=UQ4B-1__##[97!DB#QP7KSV8/'T0``$B#QP2`?P*O=:;K +MR`\?0``/ME<$2(/'`^NO9@\?1```#[97`TB#QP+KGV8/'T0```^V5P)(@\1T'$F+/"1( +MA?]T!DB+!_]0$+X(````3(GGZ`<&_O](@^L(2(/[^'7-0<=%(``````QP$'' +M13``````2(/$"%M!7$%=7!;05Q=PP\?1```2(T%N:P#`$B)^TB)!TB+?Q!(A?]T!DB+!_]0$$B)W[X8 +M````Z(\%_O]$B>!;05Q=PY!F#Q]$``#S#Q[Z54B)Y4%44XM'"$2-8/]$B6<( +M187D=`U$B>!;05Q=PP\?1```2(T%`:P#`$B)^TB)!TB+?R!(A?]T!DB+!_]0 +M$$B)W[XH````Z"\%_O]$B>!;05Q=PY!F#Q]$``#S#Q[Z54B)Y4%6055!5%.+ +M1Q!$C7#_1(EW$$6%]G016T2)\$%<05U!7EW##Q]$``#S#WX%^*X#`$B-!=&N +M`P!)B?UF2`]NR&8/;,$/$0=(BW\X2(7_=`7HY`7^_TF+?2A(A?]T!>C6!?[_ +M08M%($F+?1B%P'0]C5C_2,'C`P\?`$R+)!]-A>1T($F+/"1(A?]T!DB+!_]0 +M$$R)Y[X(````Z'L$_O])BWT82(/K"$B#^_AUS4B%_W0%Z(,%_O],B>^^4``` +M`.A6!/[_6T2)\$%<05U!7EW#9BX/'X0``````/,/'OI52(GE05=!5D%50513 +M2(/L"(M'"$2-:/]$B6\(187M=!M(@\0(1(GH6T%<05U!7D%?7<-F#Q^$```` +M``#S#WX%"*X#`$B-!>&M`P!)B?],C7?X9D@/;LAF#VS!#Q%'^$B+?S!(A?]T +M!>CO!/[_28M_($B%_W0%Z.$$_O]!BT<828M_$(7`=$B-6/](P>,#9F8N#Q^$ +M```````/'P!,BR0?387D="!)BSPD2(7_=`9(BP?_4!!,B>>^"````.A[`_[_ +M28M_$$B#ZPA(@_OX=B#!/[_OE````!,B??H5@/^_^DV____D%4Q +MP$B)Y5-(B?M(@^P(QH>^`0```,>'N`$```````!FB8>\`0``QP<`````2(M_ +M"$B%_W0%Z#8$_O](BWLP2,=#"`````#'0P0`````QT,8`````,=#*`````!( +MA?]T!>@+!/[_2(M[.$C'0S``````2(7_=`7H]0/^_TB+>T!(QT,X`````$B% +M_W0%Z-\#_O](BWM(2,=#0`````!(A?]T!>C)`_[_2(M[4$C'0T@`````2(7_ +M=`7HLP/^_TB+>UA(QT-0`````$B%_W0%Z)T#_O](BWM@2,=#6`````!(A?]T +M#>B'`_[_2,=#8`````!(B[M(`0``2,=#:`````!(A?]T$.AF`_[_2,>#2`$` +M``````!(B[M8`0``2,>#4`$```````!(A?]T!>@_`_[_2(N[F`$``&8/[\!( +MQX-8`0```````,>#D`````````#'@Z``````````QX.P`````````,>#P``` +M``````#'@]``````````QX/@`````````,>#\`````````#'@P`!```````` +MQX,0`0```````,>#(`$```````#'@S`!````````QX-``0```````,>#D`$` +M```````/$8-H`0``#Q&#>`$``$B%_W0%Z(\"_O](B[N@`0``2,>#F`$````` +M``!(A?]T!>AS`O[_2,>#H`$```````!F#^_`#Q&#J`$``$B+7?C)PY!F#Q]$ +M``#S#Q[Z54B)Y4%44TB)TTB#[!!(QT7H`````(/^+'1Y=R^#_@%T"X/^)W5E +MBT<@B47H9H,[`$&\$P```'0L2(G?Z/M&__^%P'D@ZS$/'T0``(/^3W4[2(M' +M2$B)1>A!O!4```!F@SL`==0QP&9$B67@9HE%XF8/;T7@#Q$#2(/$$#'`6T%< +M7<-F#Q^$``````!%,>3KS@\?`(M7,$4QY(72=,%(BT@`````@_Y(#X3-````@_Y==&B#_DATFTB)W^BS1?__A3I>O___X"_!`(````/MI<%`@``=1B$TG3DN``!``")1>CI4___ +M_P\?@`````"`^@$9P##`!0(!``#KXV8N#Q^$``````#S#Q[Z5;]0````2(GE +M0593Z"O__?]F#^_`OQ`````/$4`02(G##Q%`0$B-!1"I`P#S#WX%**D#`&9( +M#V[(2,=#(`````!(QT,H`````&8/;,%(QT,P`````$C'0S@`````#Q$#Z*?\ +M_?](BQ40PP(`2(E#.,<``````$B)V$B)4T!;05Y=P_,/'OI)B<;I$@K^_V9F +M+@\?A```````#Q\`\P\>^E5(C4<(2(GE059!54%428GT4TB)^T@YQG1=1(MN +M"$0Y;Q0/@Z0"``!(BW\(2(7_=`7HEO_]_TC'0Q``````18GN2,=#"`````!) +MP>8"3(GWZ!?\_?]F00]NS4B)0PAF#W#!X&8/UD,028LT)$R)\DB)Q^B5_?W_ +M28U4)!!(C4,82#G"=%]%BVPD&$0Y:R0/@Q@"``!(BWL82(7_=`7H*O_]_TC' +M0R``````18GN2,=#&`````!)P>8#3(GWZ*O[_?]F00]NU4B)0QAF#W#"X&8/ +MUD,@28MT)!!,B?)(B!F#]9#6$F+="1(3(GR2(G'Z-W[_?_'0V@`````,<#' +M@X0`````````6T%<05U!7EW#D$2):UA%A>UTVDB+0U!.C32M`````.N\9@\? +MA```````1(EK2$6%[0^$3?___TB+0T!.C32M`````.DL____9I!$B6LP187M +M#X2X_O__2(M#*$Z--*T`````Z9?^__]FD$2):R!%A>T/A"O^__](BT,83HTT +M[0````#I"O[__V:01(EO$$6%[0^$GOW__TB+1PA.C32M`````.E^_?__9I#S +M#Q[Z54B)Y4%505132(G+2(/L"(/Z`W1G@^H'@_H!=W],BV=(0;T5````9H,[ +M`'4?,1T#42)X%M!7%W##Q]$``!(C07!H0,`2(G[ +M2(U_($B)1^#H,?O]_TB+>Q!(A?]T!DB+!_]0$$B)W[Y(````Z+7Z_?]$B>!; +M05Q=PY!F9BX/'X0``````)#S#Q[Z54B)Y4%708G7059!54%44TB)^TB#["A( +MBT<02(EUN$R-8"!D3(LL)2@```!,B6W(28G-3(GGZ`'\_?](BT,02(MS&$@[ +M!`QR3'22(L'_U`@08G&A!!(BW6X +M2(U-Q$2)^L=%Q`````!(BP?_4!A(BW,008G&BT7$2(G!2`-#&$B)0QA(B488 +M387M=`1!B4T`3(GGZ"SY_?](BT7(9$@K!"4H````=1)(@\0H1(GP6T%<05U! +M7D%?70##Q^$``````!.BRPG387M +M="-)BWT`2(7_=`9(BP?_4!!,B>^^"````.@K^?W_2(N[<`$``$F#[`A)@_SX +M=@P^OW_BX-H`0``2(N[8`$``(7`=$5$C6#_2<'D`P\?@`````!. +MBRPG387M="-)BWT`2(7_=`9(BP?_4!!,B>^^"````.C+^/W_2(N[8`$``$F# +M[`A)@_SX=C0^?W_2(N[2`$``$B%_W0%Z+_Y_?](B[LX`0``2(7_ +M=`7HKOG]_XMS"$B-!82]`P#&@^@````!2(D#A?8/A2(!``"+B^````"%R0^% +M_````(M#<(7`=!_'0W``````2(V[@````.BJ^/W_2(V[J````.@N^_W_BU,( +MA=)T&<=#"`````!(C7L8Z(?X_?](C7M`Z`[[_?](B[LH`0``2(7_=`7H+?G] +M_TB+NQ@!``!(A?]T!>@<^?W_3(NK^````$V%[70?28M%`$B-%46D_O](BT`0 +M2#G0#X4H`0``08-M(`%T.4B+N_````!(A?]T!DB+!_]0$$B+1=AD2"L$)2@` +M```/A08!``!(@\006T%<05U!7EW##Q^``````$V-92A-C75028L\)$F#Q`CH +M$_C]_TTYYG7NOB@#``!,B>_H#Q^``````$B+N]@```!(C770Z`CW +M_?_I[_[__P\?`$R-8QA,B>?HY/C]_X7`#X7*_O__QT,0`0```$B->T#H//7] +M_TR)Y^AD]OW_Z:W^__\/'X``````2(N[V````$B-==#HN/;]_\>#X``````` +M``!(QX/8`````````.E]_?__9@\?1```3(UC&$R)Y^A\^/W_A<`/A57]___' +M0Q`!````2(U[0.C4]/W_3(GGZ/SU_?_I./W__P\?@`````!,B>__T.G5_O__ +MZ,'V_?^0\P\>^E5(B>532(G[2(/L".C+_/__2(G?2(M=^+Z``0``R>EY]OW_ +MD`\?A```````\P\>^E5(C044G@,`\P]^!72@`P!F2`]NR&8/;,%(B>5!5D%5 +M28G]0513BX>P````#Q$'2(N_J````(7`=&*-6/],C36(____2,'C`^LE9I#H +M6_S__TR)Y[Z``0``Z`[V_?])B[VH````2(/K"$B#^_AT+4R+)!]-A>1T[4F+ +M!"1,B>=(BT`(3#GP=,3_T$B#ZPA)B[VH````2(/[^'74D$B%_W0%Z.;V_?]! +MBX6@````28N]F````(7`='Q$C6#_2<'D`V9F+@\?A```````D$J+'"=(A=MT +M58M3:(72=!S'0V@`````2(U[>.C@]?W_2(V[H````.AD^/W_BP.%P'08QP,` +M````2(U[$.B_]?W_2(U[..A&^/W_2(G?ON@```#H2?7]_TF+O9@```!)@^P( +M28/\^'682(7_=`7H3O;]_TF+?7A(C07#N0,`28E%"$B%_W0%Z#7V_?])BWUH +M2(7_=`7H)_;]_TF+?5A(A?]T!>@9]OW_28M]2$B%_W0%Z`OV_?])BWTP2(7_ +M=`7H_?7]_TF+?2!(A?]T!>CO]?W_28M]$$B%_W066T%<05U!7EWIV?7]_V8/ +M'X0``````%M!7$%=05Y=PP\?@`````#S#Q[Z2(/O".DC_O__D&:0\P\>^E5( +MB>532(G[2(/L".@+_O__2(G?2(M=^+ZX````R>EI]/W_9@\?A```````\P\> +M^E5(B>532(U?^$B)WTB#[`CHU_W__TB)WTB+7?B^N````,GI-?3]_Y`/'T`` +M\P\>^D2+1T!`A/8/A94```!,BX^H````1(G`28L4P8.Z``$```%U?DR+5V@/ +M'T``08`\`@!T;TB+5TB+3SB+%(*%R70=2(MW,#'`ZPP/'P!(@\`!2#G!=`D[ +M%(9U\H7`>42+3RB%R71%2(MW(#'`ZQAF9BX/'X0```````\?0`!(@\`!2#G! +M="4[%,9U\H7`>!R+1,8$28L4P4F)P(.Z``$```%TBD2)AXP```##5;\$```` +M2(GEZ!3R_?](BS6=P`,`,=+'`,5W,P%(B^HN/H````(7)#X1A`0``54B)Y4%713'_059! +M54%428G\4TB#[`A$#[#V`````````!(QX/@`````````$4[O"2@````#X(=____,<#I5____V8/ +M'T0``#'V2(U[>.BU\_W_A^DB# +M[PCI<_[__Y!FD/,/'OI52(GE4TB)^TB#[`A(BW]`2(7_=`Y(BP?_4!!(QT-` +M`````$B->TCH,.[__TB+NQ`"```QP&:)@P@"``!(A?]T'HN#'`(``#'VC5`! +M2,'B`N@G\/W_QX,8`@```````#'`2(M=^,G#\P\>^DB)Q^FI_/W_D`\?A``` +M````\P\>^E5(B>5!5T%6055!5%-(@^Q(9$R+)"4H````3(EER$&)S#')A=(/ +MA($"``!(B?N#^O]T&+E7``>`@_H!#X5K`@``BQ:%T@^%80(``$F+`$B+U%A>1(C56X00^5Q4C'1;@````` +M,?9)BP!$B>E(B56@3(G'_U`HB<&%P`^%^`$``$6%Y$R+1:AU"TB#?;@`#X3\ +M`0``28L`3(E%J$2)[DR)Q_]0,(G!A<`/A]F#VS`00\112CHD5S__X7`#X41`0``1#MS(`^$#P$``$B+4QA$B?`Q +MR3'V2(L$PC'23(LX28L'3(G__U`@A<`/A>(```!)BP0D2(T]KS?__TR+7;A( +MBT`82#GX#X16____38GI13'`,?_T.EF____9@\?1```2<=$ +M)#``````N0X`!X!)BT4`B4VH3(GO_U`028L$)$R)Y_]0$(M-J$B+?;A(A?]T +M#TB+!XE-J/]0$(M-J`\?`$B+105]=PP\?0`!(C7W`N@```@"^@````$R)79CH\>S]_TR+79B%P`^%=?__ +M_TB+1^DB)P^EB^?W_\P\>^DB)P^E"^?W_\P\>^DB)P^E`^?W_9I!5 +M2(GE05=!5D%505132(G[2(/L&$B+5SB+?S1D2(L$)2@```!(B47(B?!(BTLH +M28G^2(G^2<'F!$P#LH@```!(AT!, +MC7W`2,=%P`````!$B>E,B?I(BP?_4"A!B<2%P'0W2(M]P$B%_W0&2(L'_U`0 +M2(M%R&1(*P0E*`````^%'0$``$B#Q!A$B>!;05Q!74%>05]=PP\?`$R+91T"DF+!"1,B>?_4`A(BWL02(7_=`9(BP?_4!`/MD,93(EC$,=#'/____^$ +MP'0)00^V1@Z$P'5ZB$,;28L&QD,:`4B)0R!%A>UU!TB#?<``='!(BWM`1(GN +M2(L'_U`P08G$Z5S___\/'P"`>Q@`0;T!````#X4F____A,!T?#NR0`$``',4 +M2(N".`$``$4Q[8`\.``/A0;___]%#[9N#4&#]0%%#[;MZ?3^__]F#Q]$``!! +M#[9/P`>EY____#Q\`2(M3.(M#-#N"0`$``',12(N2.`$``(`\`@`/A7#_ +M__]%#[9N#4&#]0%%#[;M10'MZ5O___\/'P!%,>WIGO[__^@3[/W_\P\>^DB) +MP^F?]_W_D&8/'T0``%5(B>532(G[2(/L".M?9I!(BU,XBT,T,?9(P>`$2`." +MB````$B#.`!U3$B)W^C^_?__B<:%P'4^@'L;`'0A2(M3.(M#-$C!X`1(`X*( +M````BU,<]](Y4`AT!;X#````2(G?Z#GB__^)QH7`=0F+0S"%P'6<,?9(BUWX +MB?#)PV:0\P\>^E5(B>5!5T%6055!B=5!5%-(B?M(@^PH2(EUN&1,BS0E*``` +M`$R)=T/A((```"`>QH`#X2B````3(MC($2) +MZ$B+>Q!,.>`/MD,;10]"Y42)9<1!@?P``!``=@B$P`^%/P$``$4Q_TB%_W0< +M2(L'1(GB2(MUN$B-3<3_4!A$BV7$08G'#[9#&X3`#X7S````387V=`-%`29$ +MB>)(*5,@=')%A?]U#HM-Q(7)#X6Z````13'_2(M%R&1(*P0E*`````^%"P$` +M`$B#Q"A$B?A;05Q!74%>05]=PV:02(G?Z(C^__]!B<>%P'7*BT,PA<`/A,X` +M```Q]DB)W^B<_/__08G'A<`/A"7____KJ`\?@``````Q]H![&P!T(4B+>SB+ +M0S1(P>`$2`.'B````(M['/?7.7@(=`6^`P```$B)WTB)5;#HP^#__X7`=11( +MB=_H%_[__TB+5;"%P`^$0?___T&)Q^E,____#Q\`2`%5N$4IY0^%M_[__^DT +M____9@\?1```1(GBBWL<2(MUN.B)U_[_1(MEQ(E#'.GR_O__#Q]$``#'1<0` +M`!``0;P``!``N@``$`!%,?](A?\/A:O^___KP\9#2`%!OQ```"#IXO[__^B4 +MZ?W_#Q]``/,/'OH[=P@/@X,```!(BP>)]D@!\(`X`'5V54B)Y4%7059!54%4 +M4TB#[!A,BV\028M5`,8``4F+13A$BS2RBQRP187V=#1%BV4H00'>38GG187_ +M=$-)BU4@,<#K#`\?`$B#P`%).<1T+SD<@G7RA#X5M____ZY4/'P!(@\08,05]=PY!F#Q]$``#S#Q[Z58GP +M2(GE055!5$F)_%-(@^P(2(M70(L<@DB+5PB+!()$C2P#A?H(/___X3`#X5Z____ +M,<#KVK\$````Z!KF_?](BS6CM`,`,=+'`,5W,P%(BA.Z/W_ +M2(N[B`$``$B%_W0%Z#WH_?](B[M8`0``2(7_=`7H+.C]_TB+NT@!``!(A?]T +M!>@;Z/W_2(N[.`$``$B%_W0%Z`KH_?](B[LH`0``2(7_=`7H^>?]_TB+NQ@! +M``!(A?]T!>CHY_W_2(N["`$``$B%_W0%Z-?G_?](B[OX````2(7_=`7HQN?] +M_TB+N^@```!(A?]T!>BUY_W_2(N[V````$B%_W0%Z*3G_?](B[O(````2(7_ +M=`7HD^?]_TB+N[@```!(A?]T!>B"Y_W_2(N[J````$B%_W0%Z''G_?](B[N8 +M````2(7_=`7H8.?]_TB+NX@```!(A?]T!>A/Y_W_2(M[>$B%_W0%Z$'G_?]( +MBWM@2(7_=`7H,^?]_TB+>UA(A?]T!>@EY_W_2(M[4$B%_W0%Z!?G_?](BWM( +M2(7_=`7H">?]_TB+>T!(A?]T!>C[YOW_2(M[.$B%_W0%Z.WF_?](BWLP2(7_ +M=`7HW^;]_TB+>R!(A?]T!>C1YOW_2(M[$$B%_W0%Z,/F_?](BWL(2(7_=`I( +MBUWXR>FPYOW_2(M=^,G#9BX/'X0``````/,/'OI52(GE0513BT<01(U@_T2) +M9Q!%A>1T#42)X%M!7%W##Q]$``#S#WX%@(\#`$B-!;&+`P!(B?MF2`]NR&8/ +M;,$/$0?HA?/__TB+NQ`"``!(A?]T!>A$YOW_2(U[2.B[_?__2(M[0$B%_W0& +M2(L'_U`02(G?OB@"``#H_^3]_T2)X%M!7%W##Q^``````/,/'OI52(GE055! +M5%-(@^P(BT<(1(U@_T2)9PA%A>1T#TB#Q`A$B>!;05Q!75W#D/,/?@7HC@,` +M2(T%&8L#`$R-;_A(B?MF2`]NR&8/;,$/$4?X3(GOZ.7R__](B[L(`@``2(7_ +M=`7HI.7]_TB->T#H&_W__TB+>SA(A?]T!DB+!_]0$$R)[[XH`@``Z%_D_?]( +M@\0(1(G@6T%<05U=PY#S#Q[Z54B)Y4%505132(/L"$B+'TB%VW0=2(L#2(T5 +M;7\``$B+0!!(.=`/A7@!``"#:R@!=!)(@\0(6T%<05U=PP\?@`````!(C06A +MC`,`2(N["`$``/,/?@4JC@,`9D@/;LA(@\!H9@]LP69(#V[02(/`,`\1`_,/ +M?@41C@,`2(E#((N#$`$``&8/;,(/$4,0A0##Q\`3HLL)TV% +M[70Q28M]$$B%_W0%Z+GD_?])BWT`2(7_=`9(BP?_4!!,B>^^,````.A]X_W_ +M2(N["`$``$F#[`A)@_SX=;Q(A?]T!>B"Y/W_2(N[^````$B%_W0%Z''D_?]( +MB[N`````2(7_=`7H8.3]_TB+>W!(A?]T!>A2Y/W_2(M[4$B%_W0%Z$3D_?]( +MBWM`2(7_=`7H-N3]_XM#.$B+>S"%P'0]1(U@_TG!Y`,/'P!.BRPG387M=!]) +MBWT`2(7_=`7H">3]_TR)[[X0````Z-SB_?](BWLP28/L"$F#_/AUSDB%_W0% +MZ.3C_?](@\0(2(G?OB@!``!;05Q!75WIK>+]_P\?1```2(G?_]!(@\0(6T%< +M05U=PP\?A```````\P\>^H!_"`!T44B+!TB+4'!(BW(02#ER"'0$QD!X`8M( +M"`^V=PF-4?^)4`B%TG0G@^D"2(T,24C!X0-,C40($$R)0'!`A/9T#DB-%%)( +MBU30($@!5`@@QD<(`,,/'T``\P\>^E5(B>5!5%-(BT\(2(MW$$F)R$DI\`^$ +MY>[]_TR+%TB)^DF-!#(/MCA`A/]Y;TF#^`$/A,GN_?]$#[9(`4`/MM](@\`" +M@^=`#X2@````20'*OP$```!!O(````!).<(/A)SN_?]$#[8`1(T<_0````!( +M@\`!1(G92=/@C4\!30G!@_\'=#=%B>!!T^A$A<-T1(G/23G"=8````08GW2<=% +M``````!,B?A)QT4(`````$C!X`1)`X0DT````$B)PHU#_8/X&G=#2(T-'*L" +M`$AC!(%(`<@^_^!FD$F+A"3H`0``0HL$N(/X_P^%>P,``#'`9@\?A``````` +MO@L```!F08E%"&9!B74`D#'`2(M5R&1(*Q0E*`````^%IP0``$B#Q#A;05Q! +M74%>05]=PP\?0`!F@_@(#X5>____28M%"$B%P`^$4?___TB->/R)=:CHM>#] +M_XMUJ.D]____#Q]$``!,B>^)=:CH'2;__TF+A"2@`0``2(7`=)!)BY0DD`$` +M`$B%TG2#BW6H3HL\^(U.`4B+',A,*?M(@?O_/P``#X=E____1(UC_T&!_/S_ +M_S\/A_,#``!&C32E`````$B)5:A!C7X(Z/_@_?](A<`/A-4#``!(C4@$N@@` +M``!$B3!F08E5`$B+5:A"QP2A`````$F)30A*C31Z,=)F9BX/'X0```````\? +M0``/MPQ6B4R0!$B#P@%(.=-U[^GJ_O__9BX/'X0```````^V0@U!O`L```!F +M18EE`/?89D&)10CIQ?[__P\?1```2(L"NQ4```!F08E=`$F)10CIJO[__V8N +M#Q^$``````!)BX0DZ`$``$*+!+B#^/\/A!`#``!)BY0DX`$``$B-#(4````` +M.S2"#X5R_O__28NT))````!)BU0D4$&[%0```(M\#@2+#(9(BP3Z2"L$RF9% +MB5T`28E%".E"_O__9I!!.[0D:`$```^#,O[__TF+A"1@`0``0H`\.``/A!_^ +M__])BX0D<`$``$&X$P```$*+!+AF18E%`$&)10CI__W__P\?@`````!!.[0D +MZ`````^#ZOW__TF+A"3@````0H`\.``/A-?]__])BX0D\````$J+!/A!QT4` +M0``7`$F)10CINOW__V8N#Q^$``````!!.[0D"`$```^#HOW__TF+A"0``0`` +M0H`\.``/A(_]__])BX0D$`$``$J+!/A!QT4`0``7`$F)10CI%P`^$(OS__V9F+@\?A``````` +M9I!,.>$/@W'I_?]!#[8\#DR-40&)^$&)^8/@#T�\/A(P```"#Z`%)C70. +M`DN-%!9(`<8QP&9F+@\?A```````9F8N#Q^$```````/'T0```^V"DC!X`A( +M@\(!2`G(2#G6=>U%#[;)2XT,$4@]`0?Q!G12@^<@=1!!@^\!=8(QP.F;^___ +M#Q\`2(M]J$B)3<#HV_G__TB+3N^0;H5````9D6)50#I:_O__[C_____Z5'[__^X#@`'@+D*````28E%"+@. +M``>`9D&)30#I1OO__^C/V_W_D&9F+@\?A```````#Q\`\P\>^E5(B>5!54%4 +M28GT4TB)^TB#[`CK-P\?@`````!(A<`/A(/H_?],BVMP3(GOZ#OY__])BTT0 +M28M5"$@IRD@YP@^"8^C]_T@!R$F)11!(BWMPZ!?Y__]).<1UPDB#Q`A;05Q! +M75W#D&8/'T0``/,/'OI5B?9(B>5!5D%5051)BC3V_W_ +M2,>#&`$```````!$B??'@R0!````````2,'G`^A2V/W_1(FS)`$``$2+JP`! +M``!(B8,8`0``1(FS(`$``,>#,`$```````!$.:LT`0``#X._````187M#XAH +MY_W_2(N[*`$``$B%_W0%Z&7;_?](QX,H`0```````$2)[\>#-`$```````!( +MP><#Z.37_?]$B:LT`0``1(N#``$``$B)@R@!``!$B:LP`0``187`=%E,BXLH +M`0``2<'@`S'`ZR0/'T``28L4!#'V2(72=`9(BS)(B#(`$```````!$.;,D`0``#X,U`0``187V#XA%YOW_2(N[&`$` +M`$B%_W0%Z#/:_?](QX,8`0```````$2)]\>#)`$```````!(P><#Z++6_?]$ +MB;,D`0``1(NK``$``$B)@Q@!``!$B;,@`0``QX,P`0```````$0YJS0!```/ +M@[\```!%A>T/B-+E_?](B[LH`0``2(7_=`7HQ=G]_TC'@R@!````````1(GO +MQX,T`0```````$C!YP/H1-;]_T2)JS0!``!$BX,``0``2(F#*`$``$2)JS`! +M``!%A`#,<#K)`\?0`!)BQ0$,?9(A=)T!DB+,DB)RDB# +MP`A(B3%(B1=,.#1`$```````#H+=7]_T2)JT0!``!(B8,X`0``QX-0 +M`0```````$0YLU0!```/@Y@```!%A?8/B&7D_?]%B?=)P><#2(N[2`$``$B% +M_W0%Z$?8_?](QX-(`0```````$R)_\>#5`$```````#HRM3]_T2)LU0!``!$ +M#[:+6`$``$B)@T@!``!(B[LX`0``28G"187M=4OIH@```$0Y\`^#QP$``$6% +M]@^(^>/]_T6)]T6)]4&^`0```$G!YP/I'O___V8/'X0``````$0/MHM8`0`` +M3(N32`$``$B+NS@!``"+@T`!```QTD6-1`4`9F8N#Q^$``````!F9BX/'X0` +M``````\?@`````!(BXM@`0``2(L,$4B#P@A(BS&)P8/``4B-#,](B3%!.#4`$```````"% +MR70V#Q^``````$B+@V`!``!.BRS@28M]`$B%_W0.2(L'_U`02<=%``````!) +M@\0!1#NC:`$``'+1BY-X`0``13'DA=)T,P\?0`!(BX-P`0``3HLLX$F+?0!( +MA?]T#DB+!_]0$$G'10``````28/$`40[HW@!``!RT4B-9=A;05Q!74%>05]= +MPV:0QX=0`0```````(N'5`$``(7`='1,BY=(`0``2(N_.`$``$6%]G1U18GU +M0;X!````Z4'^__\/'P!,BYOX````28L#2(M`&$6$R74M3(V+$`$``$B)UD%4 +M2(GR38G02(G^059,B=]$B>G_T%Y?Z>'^__\/'X``````2(VS$`$``$F)T>O1 +M#Q]``$6)]4&_"````$&^`0```.D\_?__13'M0;X!````Z2C^__]F#Q]$``#S +M#Q[Z53'V2(GE4TB)^TB#[`CH6?S__TB+7?C)P_,/'OI(B@EU?W_ +M2<<$)`````")WT''1"0,`````.BMT?W_08E<)`PQR4F)!"1(B<=!B5PD"(/[ +M"')5B=A(QP<`````2,=$!_@`````2(U'"$B#X/A(*<)UD#`[@=`B#!(C7`!2#GQ="^)UDB#P`)`P.X&@^8!0(AP +M_T@YP709OB````")]T#0[T"$\@^5`$B#P`%(.7<-F#Q]$``!%A?8/ +MB!#?_?](BWX02(7_=`7HR=+]_TC'0Q``````18GTQT,<`````$J-/*4````` +MZ$K/_?]$B7,<2(L[2(E#$$2)%0/[__P````!(BP!(C15:5P``2#G0#X5I!0``,__4"`QR3'22(MU@$&)QDF+10!,B>__4"!%A?8/A"`"``!( +MB[T`____2(7_=`9(BP?_4!!(B[U`_O__2(7_=`9(BP?_4!!,BZTX_O__387M +M#X3``0``28M%`$B-%2EK``!(BT`02#G0#X4T!```08M%*(F%,/[__X/H`4&) +M12@/A9$!``!(C05>>`,`28N]"`$``/,/?@7G>0,`9D@/;M!(@\!H9@]LPF9( +M#V[82(/`,$$/$44`\P]^!Q!(A?]T!>AIT/W_2(L[ +M2(7_=`9(BP?_4!!(B=^^,````.@NS_W_28N]"`$``$F#[`A)@_SX=;U(A?]T +M!>@ST/W_2(N%./[__TB+N/@```!(A?]T!>@;T/W_2(N%./[__TB+N(````!( +MA?]T!>@#T/W_2(N%./[__TB+>'!(A?]T!>CNS_W_2(N%./[__TB+>%!(A?]T +M!>C9S_W_2(N%./[__TB+>$!(A?]T!>C$S_W_3(NM./[__T&+13A)BWTPA0#9@\?A```````2HL<)TB%VW0>2(L[2(7_=`7HBL_]_TB)W[X0 +M````Z%W._?])BWTP28/L"$F#_/AUSTB%_W0%Z&7/_?](B[TX_O__OB@!``#H +M-,[]_TB+1<0``!(C6781(GP6T%<05U!7D%?7<,/'X`` +M````A<`/A6(%``!(C87@_O__2(UUF$R)[TC'A>#^__\@````2(G"2(F%*/[_ +M_^CHI___08G&A<`/A:7]__](@[W@_O__(`^%B`0``(!]FKQU28!]FZ]U0X!] +MG1QU/8!]G"=U-X!]F7IU,8!]F#=U*TB-=:2Z%````+______Z%B[_O_WT#E% +MH`^$W`(``&9F+@\?A```````9I!(@[TP_O__`'012(N%,/[__TB#.``/A!X$ +M``!(C;U(_O__NB"```"^@````.COR_W_A<`/A83>_?],BZ5(_O__387D#X1T +MWOW_\P]O19A)C40D($C'A2#^__\`````2(F%&/[__T$/*00D\P]O1:A$B;4( +M_O__3(F]`/[__T$/*40D$$B+C2#^__](BX4P_O__2(/Y`1G2@^+@@<(`@``` +M2(7`=!Y(BP!(B840_O__2"G(B=%(.%X/[__P````!(B[48_O___U`8A<`/A4X*``"+M>#^__^%]@^$#0H` +M`#';08GPZS5F#Q]$``!)B<=(C7`,NA0```"______^@BNO[_32GG1(G[]]!! +M.48(#X1``0``1(N%X/[__TF-?!P!2XUT!`'H^L3__TF)QD@Y\'*Z2XTT!+H@ +M````3(GG3`&%(/[__^@*SOW_Z1C___\/'T0``$C'A4#^__\`````Z4G[__\Q +MP$B-#?>;`@!F9BX/'X0``````&9F+@\?A```````D`^V-`%`.#0"=6Y(@\`! +M2(/X$'7L2(N%./[__TR-8`CI\_K__P\?0`!(B[TX_O___]#I9OW__V8N#Q^$ +M``````!(BYTX_O__2(G?_])(BP/I??K__P\?0`!(B[TX_O__2(V50/[__TB- +M-4.;`@#_T.FU^O__#Q]``#'`2(T-/YL"`&9F+@\?A```````9F8N#Q^$```` +M``!F#Q^$```````/MAP!.!P"#X63`@``2(/``4B#^!!UZ4B+A3C^__],C6`0 +MZ5#Z__]F#Q^$``````!,B?%-B?A(BX4@_O__,=+S#V\!2`-%@$6)P$R)[TJ- +M-`!)BT4`1(NU"/[__P\119CS#V]!$$R+O0#^__\QR4B)=8!(@\8@#Q%%J/]0 +M($R)YXG#Z#G+_?^%VP^%\@<``$F+10!,B>__4`A(B[T`____2(7_=`9(BP?_ +M4!!(BX5`_O__0<:'``(```%,B:T`____2(F%,/[__TF-1TA(B<=(B84@_O__ +MZ`7'__](BU6`#[=%GDF)E[`!``!F08F'J`$``(3`#X7V````2(MUI$R+9:Q( +M@\(@2+@`````````0$F)E[@!``"+7;1(B?%!QH<``@```$G'A_@!```@```` +M2,'I/TPYX`^2P`C(#X6N````2,=%N"````!-A>0/AO?9@\?1```00^VAP0"``!*C0PF2(EUD(/P`4&(AP`"``!)C40D +M($B)1;A(C4$@28F'^`$``$B+18A(*=!(.<@/@E@$``!(B[T`____,#^__\/A>0%``!( +MB[40_O__3(GBO______H^[7^__?0.<,/A8;9_?]!@+\$`@```'4(0<:'`0(` +M``%(C84`____,`#B94(____2(U\`1!(BXT0_O__ +M3(FD!1C___],C:50_O__2,>$!2#___\`````2(F,!1#___](C85@_O__2(F] +M%:/[__P````!(B84(_O__Z#3E__])C8\0`@`` +M2(F-`/[__TF-CPD"``!(B8WX_?__28V/"`(``$B)C?#]__](@_@!#X06`0`` +M2(/X%P^%!]C]_TB-A6#^__])B[>X`0``3(N-\/W__TF-E\@!``!(B84(_O__ +M3(N%,/[__TB)P4R-I5#^____M0#^__](B[T8_O___[7X_?__Z'J"``")PUA: +MA=L/A6\#``"+A6C^__^%P`^$Y@0``(/X`0^%*];]_TR-I5#^__],B>?H&.3_ +M_TB+A6#^__](BP!,BQ!,BT@(Z`+D__](BX48_O__2(F%4/[__XN%"/___X/X +M!`^$(=;]_XU0`4B+C1C^__](C01`2,'@`XF5"/___TB-?`$03(F4!1#___], +MB8P%&/___TC'A`4@____`````+@!````2(F]%>/[_ +M_P````!)@_P##X1`!@``2,>%@/[__P````!(QX6(_O__`````$C'A>#^__\` +M````2,>%Z/[__P````!(QX7P_O__`````$C'A?C^__\`````28/\!`^$D@4` +M`$F#_`4/A)4#``!)B[_@`0``08M?3$B%_W0%Z&[&_?])QX?@`0```````$B- +M/)T`````Z/;"_?])B[_H`0``28F'X`$``$&+G]@```!(A?]T!>@WQOW_2<>' +MZ`$```````!(C3R=`````.B_POW_28F'Z`$``$B)QD&+A]@```"%P`^$I0<` +M`$F+A]````!%,<`QR4B->`PQP.LBA-(/A*X"``#'!O____^#P0%(@\<02(/& +M!$$[C]@```!S4`^V%X/R`46%P'33B0:$TG7;38M/>(G"08/``44[!)%RRX/` +M`44QP.O#0<:'`@(```'IT/K__X"]>/___P!!QH<#`@```0^%1?O__^DI^___ +M187`=`M!QH<"`@```8/``4$[1TQS,HG"28N_X`$``$F+=WA(P>("B0P71(L$ +M%D6%P'0(0<:'`@(```&#P`%(@\($03M'3'+?387D=1%(BX5P____2(M($$@Y +M2`AT"$'&AP4"```!2(N]\/[__TB%_W0%Z`G%_?](B[W@_O__2(7_=`7H^,3] +M_TB+O8#^__](A?]T!>CGQ/W_,=N+A7C^__](B[UP_O__A@,Q/W_2(V]4/[__^A0X/__2(N]$/[__^CTP_W_@+UX____`'0( +M0<:'`@(```&!^P%``(`/A&74_?^%VP^$!?G__T&)WNE_\O__2(N]$/[__XF% +M,/[__^BUP_W_@+UX____`(N%,/[__W0(0<:'`@(```$]`4``@`^%U?G__^D< +MU/W_9@\?1```3(GGZ/#"_?_I)/G__TB+O1#^___H;\/]_X"]>/___P`/A`OY +M__]!QH<"`@```>G^^/__3(GGB84P_O__Z+?"_?^+A3#^___I?OG__T$[1TP/ +M@W,-``")PDV+E^`!``!-BT]X2,'B`NL1@\`!2(/"!$$[1TP/@U0-``!!B0P2 +M18L<$46%VW3BB0;I/_W__TB+O6#^___IV/[__TB+O7#____HDM___TB)A3#^ +M__](/?___W\/AW?2_?^+A3#^__]!BY_<`0``B84(_O__03F?V`$```^$?0,` +M`$&+A]@!``!-BZ?0`0``C5`!08F7V`$``$G'!,0)````.=H/A.("``!!BX?8 +M`0``1(N5,/[__XU0`4&)E]@!``!)QP3$!@```$6%TG0-@[WH_O__``^%LP@` +M`,>%G/[__P````#'A:S^__\`````QX6\_O__`````,>%\/W__P````!(QX4@ +M_O__`````,>%Z/W__P````!(QX7X_?__`````,>%X/W__P````!(QX4`_O__ +M`````,>%Y/W__P````!(B[UP____Z)+>__](B870_?__2(N]!!(BU`(2"GZ2#G*#X)/TOW_2(LP2(N% +M&/[__T4QR69$B8W(_O__2(F%P/[__XN%"/___X/X!`^$V]']_XU0`4B+G1C^ +M__](`?Y!N`$!``")E0C___](C11`2,'B`V9$B87(_O__2(U\$Q!(B;05$/__ +M_TB)C!48____2,>$%2#___\`````2(N5T/W__TB)O7#___](@?H```!`#X?# +M`@``@^H.@_H+#X>W`@``2(T]P8H"`$AC%)=(`?H^_^),BXTH_O__2(N-(/[_ +M_TF-E\`!``!(C;5P_O__2(N]&/[__TR-A8#^___H?*(!`/-!#V^'N`$``$B+ +MO7#___]F#V_(9@]SV0AF#]3!9D$/UH?``0``Z%'=__])B<3I#/K__TF+M[@! +M``#_M0#^__](C8UP_O__28V7R`$``$R+C?#]____M?C]__],BX4P_O__2(N] +M&/[__^C>>@``05N)PT%X`0``20&'R`$``$B+O7#____H +MYMS__TF)Q.E5^?__2(V%8/[__TB)P^LU2(F="/[__TB)O>C]___HO]S__TB+ +MO>C]__](BT\02(M7"$@IRD@YP@^"<\_]_T@!R$B)1Q!(B[UP____2(F="/[_ +M_TR-I5#^___H@]S__TB+O7#___](A@"*=J#P`$YT`]' +MP@'82(T$#2(G/2(F-(/[_ +M_^B9N_W_28G$08N'V`$``$F+M]`!``!(BXT@_O__A=(B;4@_O__Z)F__?]( +MB[4@_O__2(GWZ&J^_?]!BX?8`0``ZXDQR>GJ^/__Z%6]_?](:\`80<:'!0(` +M``%(B8P%(/___TB-O<#^___HA=K__^E"_/__Z-O:__^+C>3]__])B<2+A3#^ +M__\IR#N%B/[__P^%M\S]_XNU\/W__TB+O2#^___H_)D!`(F%&/[__X7`=&4Q +MP$&)AX@!``"+A3#^__]!.8>,`0``<$Z-NY +M_?])B8?0````08F?W````$&)G]@```"+G3#^__],BY6`_O__,=),B:4P_O__ +M1(N-Z/[__TR+A>#^__\QR4B+O?#^__])BX?0````3(NET/W__^F&````2(NU +M`/[__T*`/"8`#X2*````1(N=Z/W__\9`#``Q]D0YVG,.3(N=^/W__XG600^V +M-#-$BYWP_?__@_8!0(AP#3'V1#G:#] +M___'0`@`````03GT#X)D____#[)<`CKXTR+I3#^__](@[T@_O__ +M`'0,2(N](/[__^CSN_W_2(N%^/W__TB%P'0(2(G'Z-^[_?](BX4`_O__2(7` +M#X1,]?__2(G'Z,>[_?_I/_7__TB+A3#^__]!B8?8````A<`/A8;^___KH4B+ +MA0#^__^+M0C^__](C960_O__2(N]&/[__TB)A9#^__^+A>#]__^)A9C^___H +M!^?__XN%F/[__TB+O9#^__^)QDB)O0#^__^)A>#]___H5ICK'$R-1P%,B8!0____@#P^`'0'QH5X____`4B#P@%(.=$/A&#_ +M__](B[A0____2#G/C]___IX_W__X'Z_O__?P^'],;]_XG0N?___W_!Z`(IT8/``3G(#T?! +MC0P0B$#2(G/2(F-V/W__^B-M?W_28G$08N'V`$``$F+M]`!``!(BXW8 +M_?__A<`/A6\"``!(A?8/A80"``!-B:?0`0``08F?W`$``.F*_?__BXT(_O__ +M2(N]&/[__TF-E^````!(C;5P_O__Z.%M``#I2OW__XN-"/[__TB+O1C^__]) +MC9<``0``2(VU@" +M*=&#P`$YR`]'P0'02(TH!``!(A?8/A0("``"+C2#^__]-B:?0`0``08F/W`$``.EF +M_O__2(V%T/[__TB+M1C^__](C95P_O__9L>%V/[__P``2(G'2(F%V/W__^B7 +MC`$`3(NE38N'D`$``$@IQDC1[@^$*@$``#'2 +M20'`ZPU(@\(!2#G6#X06`0``9D&#/%``=>M(.?(/A`4!``!(B<9(C410`DC1 +M[DB)-/E(@\I(B13Y2#G#=`?&A7C___\!2(N]V/W__^@,T___ +MZ77[__](B=_H3[/]_TR+I7#___])B8>0`0``2(G'28F?F`$``$F+1"0028M4 +M)`A(*<)(.=H/@A/$_?])`P0D2(G:2(G&Z+*T_?])`5PD$.GQ_O__2(7)=>+I +MY_[__TB-%,4`````3(GG2(FUV/W__^AGM_W_2(NUV/W__TB)]^@XMOW_08N' +MV`$``.EH_?__2(T4Q0````!(B=E,B>=(B;4`_O__Z#*W_?](B[4`_O__2(GW +MZ`.V_?]!BX?8`0``Z>K]___S#Q[ZZ4C"_?](BT7(9$@K!"4H````#X2!P_W_ +MZ8'#_?_S#Q[ZZ07$_?_I5L;]__,/'OKIT,/]_^E[Q/W_Z7;$_?_S#Q[Z28G$ +M28G5Z9C$_?_S#Q[Z28G$28G5Z9S$_?_S#Q[Z28G$28G5Z:#$_?_S#Q[Z28G$ +M28G5Z:3$_?_S#Q[ZZ<3$_?_S#Q[Z28G$28G5Z3C"_?_S#Q[ZZ4;%_?_S#Q[Z +MZ0/#_?_S#Q[ZZ6C%_?]F#Q]$``#S#Q[Z54B)Y4%7059!54%44TB#[%A(B56` +M9$B+!"4H````2(E%R+A7``>`A?9T*4B+51(BT6`2(E+&$C'0Q``````2(D8,<#' +M0PP`````Z<+]__\/'P`QR>O8Z,>Q_?_S#Q[ZZ;K#_?_S#Q[Z2(G'Z<;#_?]F +MD/,/'OI(@^\(Z6/]__^09I#S#Q[Z54B-1Q!(B>5!5T%6055!5$F)]%-(B?M( +M@^P82#G&=%U$BVX(1#EO'`^#+@0``$B+?Q!(A?]T!>A@LOW_2,=#&`````!% +MB>Y(QT,0`````$G!Y@),B??HX:[]_V9!#V[-2(E#$&8/<,'@9@_60QA)BS0D +M3(GR2(G'Z%^P_?])C50D$$B-0R!(.<)T7T6+;"081#EK+`^#H@,``$B+>R!( +MA?]T!>CTL?W_2,=#*`````!%B>Y(QT,@`````$G!Y@-,B??H=:[]_V9!#V[5 +M2(E#(&8/<,+@9@_60RA)BW0D$$R)\DB)Q^CRK_W_28U4)"!(C4,P2#G"=%]% +MBVPD*$0Y:SP/@Q4#``!(BWLP2(7_=`7HA[']_TC'0S@`````18GN2,=#,``` +M``!)P>8"3(GWZ`BN_?]F00]NW4B)0S!F#W##X&8/UD,X28MT)"!,B?)(B8"3(GWZ).M_?]F00]N +MY4B)0TAF#W#$X&8/UD-028MT)#A,B?)(B!F#]9#8$F+="1(3(GR2(G' +MZ*.N_?^+@Z````#'0W``````QX.,`````````$2-:/])P>4#A.A4K_W_28V\)*`` +M``#HU[']_T&+!"2%P'0<0<<$)`````!)C7PD$.@MK_W_28U\)#CHL[']_[[H +M````3(GGZ+:N_?])@^T(28/]^'6,BTLH,=)%,>W'@Z``````````A,#]_XG0N?___W_!Z`(IT8/``3G(#T?!1(T\$$V)_$G! +MYP-,B?_HPZO]_XN3H````$B+LY@```!)B<:%T@^$6____TC!X@-,B?E(B<=( +MB77(Z!BP_?](BW7(2(GWZ.RN_?_I0/___P\?@`````!(@\08, +M05]=PP\?@`````!$B6M@187M#X18_O__2(M#6$Z--*T`````Z3?^__]F+@\? +MA```````1(EK4$6%[0^$P_W__TB+0TA.C32M`````.FB_?__9I!$B6LX187M +M#X0N_?__2(M#,$Z--*T`````Z0W]__]FD$2):RA%A>T/A*'\__](BT,@3HTT +M[0````#I@/S__V:01(EO&$6%[0^$%/S__TB+1Q!.C32M`````.GT^___9I#S +M#Q[Z2(/O".ES^___D&:0\P\>^E5(B>5!5T%6055)B?5!5$F)_%-(@^P81`^V +M=A&+5W`[5W0/A-0"``!,BW]HC4(!08E$)'!%B#0708N4)(````!%#[9U$$$[ +ME"2$````#X0Y`@``38M\)'B-0@%!B80D@````$&+A"2T````18@T%T$YA"2P +M````=68]_O__?P^'P;[]_XG#NO___W_!ZP(IPH/#`3G3#T?:1(T\`TR)^TG! +MYP-,B?_H`:K]_T&+E"2P````28NT)*@```!)B<:%T@^%S@(``$B%]@^%W`(` +M`$V)M"2H````08F<)+0```"_@`$``.CSJ_W_9@_OP,:`!`$```!(B<-(QX`8 +M`0```````$C'@"`!````````2,>`*`$```````!(QX`P`0```````,=`"``` +M``#'0'``````2,>`V`````````#'@.``````````#Q&`\````$B-!:A3`P!( +MB0-!BX0DL````$C'@S@!````````C5`!2,>#0`$```````!!B90DL````$F+ +ME"2H````2,>#2`$```````!(QX-0`0```````,:#6`$```!(QX-@`0`````` +M`$C'@V@!````````2,>#<`$```````!(QX-X`0```````$B)',)!BT4438MU +M`(F#``$``$V%]G0)28L&3(GW_U`(2(N[\````$B%_W0&2(L'_U`03(FS\``` +M`$V+=0A-A?9T'$F+!DB-%<\W_O](BT`(2#G0#X7R`0``08-&(`%,B[OX```` +M387_="))BQ=(C0T'5_[_2(M2$$@YR@^%N@$``$&#;R`!#X3_````00^VA"2( +M````3(FS^````(B#6`$``$B#Q!A;05Q!74%>05]=PV8N#Q^$``````"!^O[_ +M_W\/AZB\_?^)T[C___]_P>L"*="#PP$YPP]'V(T,$TB)STB)3$&) +MG"2$````Z6/]__\/'X``````@?K^__]_#X(#3(GY2(G' +M2(EUR.B%J_W_2(MUR$B)]^A9JOW_Z1?]__\/'T``2(G'2(EUR.ADJ_W_2(MU +MR$B)]^@XJOW_08M4)'#I;O___V8/'T0``$B)QTB)=P````2(F50/___TB)C3C___],B84P____ +M9$B+!"4H````2(E%R#'`0<8``$6%T@^$,P,``)!)BX6H````08"]B`````!, +MBS3828M%$(L$F(F%/__ +M_T2-8/],B>A-B?5)P>0#28G&D$F+A6`!``!*BQP@2(7;=!M(BSM(A?]T!DB+ +M!_]0$+X(````2(G?Z-6G_?])@^P(28/\^'7+3(GP38GN2(N=>/___T''AF@! +M````````28G%187_#X0%`0``, +M;`$``+\(````08/$`>@]I_W_08N6:`$``$F+CF`!``!(QP``````C5H!08F> +M:`$``$B)!-%%.>QT=4$YGFP!``!UP8'[_O__?P^';KG]_XG8NO___W_!Z`(I +MVH/``3G0#T?"1(T\`TR)^TG!YP-,B?_HJ:3]_T&+EF@!``!)B<&%T@^$3___ +M_TF+MF`!``!(P>(#3(GY2(G'Z`&I_?])B<'I,?___V8/'X0``````$B+G6C_ +M__],BZU@____08N&>`$``(7`=$Q$C6#_2<'D`V9F+@\?A```````#Q]``$F+ +MAG`!``!.BSP@387_=!M)BS](A?]T!DB+!_]0$+X(````3(G_Z%6F_?])@^P( +M28/\^'7+B[5P____0<>&>`$```````"%]@^$``$``#'`2(F=:/___T4QY$R) +MK6#___^)PTV)]42+M7#____K9)!)B[UP`0``2(7_=!-,B8UX____Z!BG_?], +MBXUX____38F-<`$``$&)G7P!``"_"````$&#Q`'HQ:7]_T&+E7@!``!)BXUP +M`0``2,<``````(U:`4&)G7@!``!(B03113GT=&U!.9U\`0``=<&!^_[__W\/ +MA_:W_?^)V+K___]_P>@"*=J#P`$YT`]'PD2-/`-,B?M)P><#3(G_Z#&C_?]! +MBY5X`0``28G!A=(/A$____])B[5P`0``2,'B`TR)^4B)Q^B)I_W_28G!Z3'_ +M__^02(N=:/___TR+K6#___](@\,!03N=L`````^"T?S__TV)Z46+02A%A<`/ +MA!$#``!(QX5X____`````$B-18!(B850____Z3\"``!F#Q]$``#'A5S___\` +M````B=9%,])B44`38EE$/\5NCP#`$B+ +MA7#___],BXU@____2(LX2(7_=`U(BP?_4!!,BXU@____2(N%/___P%(BX5X____03M!*`^#MP```$B+A7C___])BW%82(T,Q0````!)BT$@ +M2`'(BSA(B?J+/+Y)BW%(*Q2^08G7BU`$1(GX2,'@`T&`N8@`````#X6#_?__ +M1(F]7/___TF)P$B)_C'`13'_Z7[]__\/'T``A<`/A%T(``!$B[UP____QX5P +M____`0```.DA^O__9BX/'X0``````$B%P`^%(____^E2____9I!(B[CX```` +MZ:7^__\/'T``2(NX^````.E9_O__#Q]``$&+44!)BX&H````08"YB`````!( +MBP30#X3!!P``2(NU2/___TB+@&`!``!(BQY,BR!(A=MT%TB+`TR)C7C___]( +MB=__4`A,BXUX____28L\)$B%_W042(L'3(F->/____]0$$R+C7C___])B1PD +M08M).#';A +M3(LLPDV%_W0)28L'3(G__U`(28M]`$B%_W0&2(L'_U`038E]`$B#PP%!.UPD +M.'-528M$)#!)BU0D6(L,F(L4BDB)R$F+C"2H````2(LTT4F+3"1(*P2108"\ +M)(@`````=9-(BXU(____2(N68`$``$R+/-E,BRS"387_=8SKDV8/'T0``$V) +MX4&+D;````!!BX&,````13'D38G-A=(/A#("``"01#G@#X1W`0``28N%J``` +M`$Z+-.!%BWX(187_=&-)C5X82(G?Z#>B_?]!B<>%P`^$_`4``&9F+@\?A``` +M````D$$/M\<-````B$6%_T0/3_A(BT7(9$@K!"4H````#X7H!P``2('$J``` +M`$2)^%M!7$%=05Y!7UW##Q^$``````!)C7X8,?;HY:']_T&)QX7`=:Y)C7Y` +M,?;HTZ#]_T&)QX7`=9Q!BUYP0<=&$`````!)QT8(`0```(7;#X27!0``28V> +M@````$B)W^B1H?W_08G'A<`/A6;___]!QT9X`````$B)W^@6G_W_08G'A<`/ +MA4O___]%BY[@````0<:&Z`````!%A=MU9TB-79!(B=_H>Z#]_T&)QX7`#X4@ +M____,?9(B=_HUJ#]_T&)QX7`#X6+!0``28V^V````$R)\4B-%5I'_O](B=[H +M0J+]_T&)QX7`#X5G!0``0<>&X`````$```!(B=_H=*']_P\?0`!!BX6,```` +M9@\?A```````08N5L````$F#Q`%!.=0/@FS^__]-B>F%T@^$D@```$4Q[4V) +MS&9F+@\?A```````1#GH=&M)BX0DJ````$J+'.C&@^@`````3(US&$R)]^B, +MH/W_08G'A<`/A6'^___'0Q`!````2(U[0.CAG/W_3(GWB/___T6+ +MD;````!%A=(/A+H%``!%,?]%,>1$B;UX____38G/9BX/'X0``````$4YIXP` +M``!T<$F+AZ@```!*BQS@3(VK@````$R)[^B]G_W_AY,B??HM9_]_XMS>(7V=.Z+>W2%_W4'QT-X```` +M`$R)[^@8G?W_B[5X____A?8/1<:)A7C___]!BX>P````28/$`4$YQ`^"<___ +M_TV)^42+O7C___]%A?\/A2#]__^%P`^$^`0``$F+L:@```!(C13&2(GW2(GP +M9F8N#Q^$``````!F9BX/'X0``````)!(BPA$B[E<`0``08'_!$``@`^$Z?S_ +M_TB#P`A(.<)UX$B)\&9F+@\?A```````9F8N#Q^$```````/'X``````2(L( +M1(NY7`$``$&!_PX`!X`/A*G\__](@\`(2#G"=>!(B?!F9BX/'X0``````&:0 +M2(L(1(NY7`$``$6%_W0<08'_$```('0308/_`70-08'_!4``@`^%9?S__TB# +MP`A(.<)US$B)\$B+"$2+N5P!``!!@_\!#X1%_/__2(/`"$@YPG7C2(L'1(NX +M7`$``$6%_W0-08'_$```(`^%(/S__TB#QPA(.?IUVTR)C7C___\QVTR--74F+A2@!``!(@S@`=&Q(BP=(QT6` +M`````$B-58!(C37]30(`_Q!(BWV`2(7_=$M(BP=(C76(_U`8A<`/A9`#``!( +MBT6(2(/X_W0@28N5&`$``$@[`G,408"]!`$```!T"DB+A3#____&``%(BWV` +M2(7_=`9(BP?_4!!(BX5X____2(/#`3N8L`````^#,`,``$B+L*@```!,BRS> +M28N]\````$B%_P^%2O___TF+M?@```!(A?9TPDB+%DC'18``````2(GP3(L" +M33GP#X7*`@``,=)(C3W&30(`#[8,%T$X#!0/A80"``!(@\(!2(/Z$'7H2(E% +M@(-&(`%!BY4P`0``A=(/A*L!``!%,?_K8D2)^DB-/-"+=)!X2(N7B````$@I +M\DB+M\@```!(*[>H````2"GR2(E5B$B#^O]T(4F+M1@!``!*.Q0&<(7;#X5I^O__28V^@````#'VZ`N< +M_?]!B<>%P`^%T/G__TF-OJ@````Q]NCRFOW_08G'A<`/A;?Y__]!QT9X```` +M`$G'1G`!````Z5?Z__](B[5`____2(N`<`$``$B+'DR+($B%VP^%._C__^E- +M^/__2(G?Z!B<_?_I<_G__XN]`$``,>%$!)BWT`28/% +M"$B)A7#____H_YG]_TTY[TB+A7#___]UX$B->/"^*`,``.A5F?W_Z6G]__]! +MB==(A<`/A-3X__](BQ!(C0UZ1O[_2(M2$$@YR@^%QP```(-H$`$/A;/X__]( +MC5@83(U@0$F)Q4B+.TB#PPCHG)G]_TPYXW7O28U]\+XH`P``Z/F8_?_IA/C_ +M_S'`2(T5&TL"``^V#`)!.`P$=1-(@\`!2(/X$'7L2(U&".E@_?__2(U&$.E7 +M_?__2(U5@$B--=I*`@!(B<=!_]!(BT6`2(7`#X3`_/__Z3S]__]FD$4Q_^DH +M^/__08G?Z1#X__](BWV`08G'2(7_#X00^/__2(L'_U`0Z07X___HD)C]_TB) +MQ__2Z7_\__](B^DB)P^G'JOW_\P\>^DB#[PCID^___Y!F +MD/,/'OI52(GE05=!5DF)]D%528G]05132('L^````&1(BQPE*````$B)7``!(B=Y(QX4H____`````$B+`$@Y +MT`^%P`(``#'`2(T-YV<"`$B-%=!G`@`/MCP"0#@\`0^%T@(``$B#P`%(@_@0 +M=>B#0R@!2(FU*/___TC'A4#___\`````OQ````#H6)7]_TB+O2C____'```` +M``!(C15$2```3(U]H$C'1:``````2(L-H5L"`$B)A4#___](BP=(QT6H```` +M`$B+0!A(B8U(____2#G0#X6#`@``2(/O"$R)^KX$````Z.I$``!!B<1%A>1U +M$6:#?:`(0;P!````#X1Q`@``3(G_Z.G<_O](B[U`____2(7_#X0I`@``Z"28 +M_?](BYTH____2(7;#X2D`0``2(L#2(T5ZC@``$B+0!!(.=`/A=T#``"#:R`! +M#X5S`0``2(T%;#\#`$B+NP`!``!,C7OX\P]^!?%``P!F2`]NR$B#P&AF#VS! +M9D@/;M!(@\`P#Q%#^/,/?@770`,`2(E#&(N#"`$``&8/;,(/$4,(AAXE_W_28L\)$B% +M_W0&2(L'_U`03(GGOC````#H/);]_TB+NP`!``!)@^X(28/^^'6[1(NE&/__ +M_TB%_W0%Z#J7_?](B[OP````2(7_=`7H*9?]_TB+>WA(A?]T!>@;E_W_2(M[ +M:$B%_W0%Z`V7_?](BWM(2(7_=`7H_Y;]_TB+>SA(A?]T!>CQEOW_BT,P2(M[ +M*(7`=$]$B:48____1(UP_TG!Y@,/'X``````3HLD-TV%Y'0?28L\)$B%_W0% +MZ+F6_?],B>>^$````.B,E?W_2(M[*$F#[@A)@_[X=1T$V9F+@\?A```````3(GOZ-B.__](BT7( +M9$@K!"4H````#X6["@``2('$^````$2)X%M!7$%=05Y!7UW#2(V5*/___TB- +M-2)E`@!(B=__T$B#O2C___\`#X52_?__0;P!````ZZ____P\?`$R)^KX$````_]!! +MB<3I?_W__V8/'T0``$R-I4#___](BW6H3(GGZ$VG_O],B?_H9=K^_XN%2/__ +M_TB+E4#___^%P'0P2(T$@NL79F8N#Q^$```````/'P!(.<(/A'Y(*=!(P?@"@\`!2(V]4/___TR)XHG&B848____Z*VA_O^+A1C___]( +MBY5`____3(VE8/___TR)YTR)I1C___](C32"Z%:B_O](C;UP____3(GFZ->C +M_O](BY5P____BP*%P'0C9BX/'X0``````(UPOXU(((/^&@]"P4B#P@2)0OR+ +M`H7`=>>_$````$C'1:``````Z(61_?](BPWN5P(`QP``````OQ````!(B46@ +M2(E-J$C'1;``````Z%Z1_?])B-````0;P!````3(G'Z(B4_?](BWV@2(7_=`7H>I3]_TB+O7#_ +M__](A?]T!>AIE/W_2(N]8/___TB%_W0%Z%B4_?](B[U0____2(7_=`7H1Y3] +M_TB+O4#___](A?]T!>@VE/W_2(N=*/___TB%VP^%$OS__^FA_?__D$B)W__0 +MZ9;]__]F#Q]$```QP.F5_O__3(N5:-5_]!O`(```"#_P)U(>LK9F8N#Q^$``````!F9BX/'X0` +M`````$&#Q`%$.>=T#(G01"G@08,\@F%TZ\:%]/[__P'IA````(/Z,`^%T/[_ +M_TB)P4B-%*-5_]!O`(```"#_P)U'>LP9F8N#Q^$```````/'X``````08/$ +M`40YYW05B=!$*>!!@SR",'3K1#GG#X5<_O__QH7T_O__`(G^2(U%@$B+E1C_ +M__]$*>9(B<=(B87X_O__Z!R?_O](C4601(M%B$B+38"+E5C___](B[50____ +M2(G'2(F%&/___^@D<@$`2(NU&/___TR)_^CUI/[_2(M]D$B%_W0%Z(>2_?]( +MBWV`2(7_=`7H>9+]_XN%:/___TB+E6#___]%B>%,*#^___HWZ/^_P^VA?3^__^(1<"+A5C___^%P`^%1@4``$F-?3A(C37,2`(` +MZ-=P`0!(C84P____3(GW2(G&2(F%$/___^B^:O__08G$A<`/A7@!``!,BZ4P +M____08M%,$T!94A!.T4T#X0I!0``38M%*(U0`4&)53!-B23`3(EUD$V%]G0) +M28L&3(GW_U`(08M%)$$Y12!U5CW^__]_#X@\?1```OQ````#HEHW]_TF)QDB+ +M!?Q3`@!(BTVP@'W``$''!@````!(B46(BT6XC5#_2(G02(T4D8LR=&2#_GH/ +MA&D"``"#_EH/A0X%``#'`D$```"%P`^%8`(``$R)]^B@D/W_13'DBX7T_O__ +M08-](`%!#Y3$02'$3(M%L$V%P`^$]OO__^GI^___9@\?A```````C5#_2(G0 +M2(T4D8LR@_XY#X6S!```QP(P````A01( +MB("Z!*1_?](BTVPQP$Q````BT6X1(U``42)1;A,B[T8____BU6H2(MU +MH$R)_^B';P$`2(N]^/[__TR)_DR)=8#H5*+^_TB+?9!,BW6`2(7_=`7HXH_] +M_TB+O2C___](C0UD@0``2,>%./___P````!(BP=(BT`@2#G(#X5H`@``2(V5 +M./___TB#[PA,B?9(B94(____Z']X``!!B<1(B[TX____08/\`0^$Q`,``$6% +MY`^%*0,``$B%_P^$O0,``$B+M1#____H'6C__T&)Q(7`#X4"`P``3(N],/__ +M_T&+13!-`7U(03M%-`^$&0$``$V+12B-4`%!B54P38D\P$&+121!.44@=5H] +M_O__?P^'D:']_XG"N?___W_!Z@(IP8/"`3G*#T?1`=")P$R-/,4`````28G$ +M3(G_Z)J+_?])BH"*<&#P@$YR@]'T42-)`)$B:4`____2<'D`TR)Y^B:BOW_28G`08M% +M,$F+=2B%P'572(7V=7:+C0#___]-B44H08E--.F._O__3(G'2(T4Q0````!, +MB?E(B;4`____Z-F._?](B[4`____28G`2(GW3(F%`/___^B@C?W_3(N%`/__ +M_^FV_O__3(G'2(T4Q0````!,B>%(B;7H_O__Z)J._?](B[7H_O__28G`2(GW +M3(F%Z/[__^AAC?W_08M%,$R+A>C^___I:____TB-C3C___],B?9(B8T(____ +M2(G*_]!!B<3IE_W__[HP````2(T-3$$"`.LK9F8N#Q^$``````!F+@\?A``` +M````#[9Q`4B#P`1(@\$!B?([,`^%9/C__X32=>;IO_G__TB+M5#___^-4/]) +MC7TXZ+Z?_O_ILOK__TB+O>#^___H?9C^_TB+3;"+1;CI?/S__SW^__]_#X<$ +MH?W_B<*Y____?\'J`BG!@\(!.9W]__,/'OI(B0#9F8N#Q^$```` +M```/'T``3HLL)TV%[70B28M].$B%_W0%Z/F)_?],B>^^2````.C,B/W_2(N[ +MJ`$``$F#[`A)@_SX=C1B?W_BX.0`0``2(N[B`$``(7`=$5$C6#_ +M2<'D`P\?A```````3HLL)TV%[70B28M]`$B%_W0%Z)F)_?],B>^^$````.AL +MB/W_2(N[B`$``$F#[`A)@_SX=AQB?W_2(N[@`$``$B%_W0&2(L' +M_U`02(N[:`$``$B%_W0%Z$Z)_?](B[M@`0``2(7_=`9(BP?_4!!(B[LH`0`` +M2(7_=`7H*XG]_TB+NQ`!``!(A?]T!>@:B?W_2(N[R````$B%_W0%Z`F)_?^+ +M@[@```!(B[NP````A0#3HLL)TV%[70B28M]`$B%_W0%Z-F( +M_?],B>^^$````.BLA_W_2(N[L````$F#[`A)@_SX=BQB/W_2(N[ +MH````$B%_W0%Z*"(_?](B[N0````2(7_=`7HCXC]_TB+NX````!(A?]T!>A^ +MB/W_2(M[>$B%_W0&2(L'_U`02(T%$"L#`$R+8W#S#WX-E#$#`/,/?A64,0,` +M9D@/;NA(@\!H9D@/;O!F#VS-9@]LU@\I3<`/*570387D#X3`````28L$)$B- +M%;+D``!(BT`02#G0#X7U`0``08.L)"`!```!#X69````28N\)%@!``!-C6PD +M\$$/$10D2(T%+2L#`$F)1"0000\13"3P2(7_=`7HV(?]_TF+O"1(`0``2(7_ +M=`7HQH?]_TF+O"0X`0``2(7_=`7HM(?]_TF+O"0H`0``2(7_=`7HHH?]_TF+ +MO"00`0``2(T%4RD#`$F)1"002(7_=`7HA(?]_TF-?"08Z*K=``"^R`$``$R) +M[^A-AOW_3(MC8$V%Y`^$Q0```$F+!"1(C17UX0``2(M`$$@YT`^%.`$``$&# +MK"0P`0```0^%G@```&8/;WW`28N\)&@!``!(C05E*@,`28E$)"!!#Q$\)&8/ +M;WW000\1?"002(7_=`7H!H?]_TF+O"18`0``2(7_=`7H](;]_TF+O"1(`0`` +M2(7_=`7HXH;]_TF+O"0X`0``2(7_=`7HT(;]_TF+O"0@`0``2(T%@2@#`$F) +M1"0@2(7_=`7HLH;]_TF-?"0HZ-C<``"^R`$``$R)Y^A[A?W_2(/$*$B)W[X( +M`@``6T%<05U=Z62%_?\/'T``28M\)!A(C07L'@,`28D$)$B%_W0&2(L'_U`0 +M28M\)!!(A?]T!DB+!_]0$+XX````3(GGZ"B%_?_I"_S__P\?`$B)W__02(/$ +M*%M!7$%=7<-,B>?_T.GN^___9@\?1```3(GG_]#IJ?[__V8/'T0``$R)Y__0 +MZ6O___]F#Q]$``#S#Q[Z54B)Y4%44XM'"$2-8/]$B6<(187D=`U$B>!;05Q= +MPP\?1```2(T%42H#`$B)^TB-?T!(B4?`Z-'Z__](BWL02(7_=`9(BP?_4!!( +MB=^^4````.B%A/W_1(G@6T%<7<.09F8N#Q^$``````"0\P\>^E5(B>5!5T%6 +M055)B?U!5$&)U%-(@>PH`0``2(FUR/[__XF-\/[__V1,BS0E*````$R)=#^__^+A>#^__^%P`^$M0@``$V+G>@!``!! +MB<)%,<`QP$B+G`!``!$B%#^__\Y\`^#DP(``$V+A>@!``!(C3R%`````$C'A1C_ +M__\`````08/\_P^$6@4``$B+A%N/[__P````!( +M`?B+$$&+#)!(B=:)C<3^__^#^?\/A2,$``!(B4,HBX70_O__2(G?B7,TB4,P +MQD,:`,9#2`#H\Y3__T&)QX7`#X4-`@``1(M#,$6%P`^$L`,``(.]Q/[___\/ +MA%0&``!)BP9(C364#0``2,>%*/___P````!(BP!(.?`/A80%```QP&9F+@\? +MA```````9F8N#Q^$```````/'T0``$B-#2E0`@!(C35"4`(`#[8,`3@,!@^% +M+04``$B#P`%(@_@0==M)C48(08-&(`%(B84H____OQ````#&A0?___\`QH4& +M____`$C'A3#___\`````Z-A]_?](B84P____2(LU.D0"`$B-O4#___],C8T8 +M____QP``````08M%&$B)M3C___])BY7``0``QH4%____`$F+=4!!_W4P1(N% +MQ/[__U!(C84P____:@%02(V%!O___U!(C84'____4$B-A07_____M2C___]0 +M_[78_O__4TB+C;#^___H(GT!`$&)QTB#Q%"#^`$/A.H#```]`4``@`^$WP,` +M`("]!?___P`/A.H!``"+>S"%_P^%0`0``,>%\/[__P8```!(B[T0____2(7_ +M#X3M`0``2(L'2(T5VZ(``$B+0!A(.=`/A6,$``"+C?#^__^+E<3^__](@^\( +MO@(```#HY)X``$&)QT6%_P^$L`$``$B+O3#___](A?]T+XN%//___S'VC5`! +M2,'B`NBX??W_2(N],/___\>%./___P````!(A?]T!>CM?_W_2(N]*/___TB% +M_W0&2(L'_U`02(N]"/___TB%_W0&2(L'_U`02(N]$/___TB%_W0F2(L'2(T5 +MXU```$B+0!!(.=`/A=8#``"#;Q@!=0E(@^\(Z+=7``!(BWW`2(7_=`9(BP?_ +M4!!(BWV@2(7_=`7H>G_]_TB+?9!(A?]T!>AL?_W_2(M]@$B%_W0%Z%Y__?]( +MB[UH____2(7_=`7H37_]_TB+O5C___](A?]T!>@\?_W_2(N]2/___TB%_W0% +MZ"M__?](BYW8_O__2(T5[0/__TB+`TB+0!!(.=`/A?P"``"+0PB)A?#^__^# +MZ`&)0P@/A7CZ__](BWL82(T%91<#`$B)`TB%_W0&2(L'_U`02(N%V/[__TB+ +M>!!(A?]T!DB+!_]0$$B+O=C^__^^.````.B8??W_Z3/Z__\/'P"^`@```$B) +MW^A#=/__08G'187_#X5O_O__BU,PA=)T&(![&@!UVKX!````2(G?Z*V/___K +MV`\?`$B+O3#___](A?]T+XN%//___S'VC5`!2,'B`N@(?/W_2(N],/___\>% +M./___P````!(A?]T!>@]?OW_2(N]*/___TB%_W0&2(L'_U`02(N%V/[__XNU +MT/[___,/?H6X_O__`;74_O__\P]O2"@/%H48____9@_4P0\IC?#^__\/$4`H +MZ5/[__]$BYW$_O__28N-D````$F+55!$B[W@_O__08U#`42+#(&+3('\3HL, +MRDPK#,I)BY7@`0``3(F-N/[__T2-3@&+=(+\BX74_O__C5`!1#GZ#X,2`@`` +M2(N-R/[__XG02(T,@>L9#Q]``$0YR'(C@\(!1(U(`4B#P01$.?IS$XG008/\ +M_W0"BP%!B<)'.1R0=-B+A=3^__\IPHF5T/[__T0YSG-`1(G(08GP28N5T``` +M`"GP3(G!@^@!2,'A!$P!P$@!T4C!X`1(C50"$#'`#Q\`2`,!2(/!$$@YRG7T +M2(F%&/___TB+A'Z__\/'T``08L$@(NUU/[_ +M_XF%Q/[__X/X_P^%Y_[__\>%T/[__P$````QP$C'A;C^__\`````Z:CZ__\/ +M'P`QP$&#_P&+%P`^%3_S__XM+,(7)#X3T_?__@'L:`'76O@$```!( +MB=_HB8W__^O5#Q^``````$4Q_^G(]___28U&$.G8^O__QX7P_O__`@```.O' +M3(GW_]#I_/;__TB-E2C___](C37;2@(`3(GW_]#IMOK__TB+O=C^____T.F# +M]___2(V5$/___TB--95*`@!,B??_T.FY^/__BXWP_O__BY7$_O__O@(```#_ +MT$&)Q^F?^____]#I,OS__TR)]__02(M[0$B%_P^$\/C__TB+!TB-%8U8``!( +MBT`02#G0=12#;R`!#X73^/__Z+53``#IR?C____0Z<+X___'A=#^__\!```` +MZ2C^__]!OP5``(#IE/O__^AJ>OW_\P\>^DB)Q^D-D/W_\P\>^DF)Q.EADOW_ +M\P\>^DF)Q.EBDOW_\P\>^DF)Q.G6C_W_\P\>^DF)Q.F]DOW_\P\>^DF)Q.FE +MDOW_9BX/'X0```````\?A```````\P\>^DC'`@`````QP$B-#5PL`@!F9BX/ +M'X0``````)!$#[8$`40X!`9U%4B#P`%(@_@0=>M(B3HQP(-'"`'#D+@"0`"` +MPV8N#Q^$``````#S#Q[ZBT<(@\`!B4<(PV:0\P\>^DC'`@````!(B?$QP$B- +M-?DK`@!F#Q^$``````!$#[8$!D0X!`%U'4B#P`%(@_@0=>M(B?A(B0(QP(-' +M*`'#9@\?1```,M(C4<( +M2(D",<"#1R@!PP\?1```,)'`@!FD$0/MA0&1#@4`74=2(/``4B#^!!U +MZTB-1^A(B0(QP(-'"`'##Q]$```QP$B--8]'`@!F9BX/'X0```````\?0`!$ +M#[8M(C4?PZ5O___\QP$B--4E'`@!F9BX/'X0` +M`````&9F+@\?A```````#Q\`1`^V'`9$.!P!=1-(@\`!2(/X$'7K2(U'^.D; +M____N`)``(##9F8N#Q^$``````"0\P\>^DC'`@````!(B?$QP$B--8DI`@!F +M9BX/'X0``````&9F+@\?A```````#Q\`1`^V!`9$.`0!=1U(@\`!2(/X$'7K +M2(U'Z$B)`C'`@T<0`<,/'T0``#'`2(TUOT8"`$0/M@P&1#@,`749#Q]``$B# +MP`%(@_@0=,M$#[8,!D0X#`%TZS'`2(TUHD8"`&:01`^V%`9$.!0!=1U(@\`! +M2(/X$'7K2(U'\$B)`C'`@T<0`<,/'T0``#'`2(TU3T8"`&9F+@\?A``````` +M#Q]``$0/MAP&1#@<`7432(/``4B#^!!UZTB-1_CI6____S'`2(TU"48"`&9F +M+@\?A```````9F8N#Q^$```````/'P!$#[8M( +MB?CI'/___[@"0`"`PV9F+@\?A```````9I#S#Q[Z2,<"`````$B)\3'`2(TU +M22@"`&9F+@\?A```````9F8N#Q^$```````/'P!$#[8$!D0X!`%U'4B#P`%( +M@_@0=>M(C4?P2(D",<"#1Q@!PP\?1```,M(C4?X2(D",<"#1Q@!PP\?1```,M(C4<(Z5O___\Q +MP$B--8E#`@!F9BX/'X0``````&9F+@\?A```````#Q\`1`^V'`9$.!P!=1-( +M@\`!2(/X$'7K2(U'$.D;____N`)``(##9F8N#Q^$``````"0\P\>^HM'*(/` +M`8E'*,-FD/,/'OJ+1PB#P`&)1PC#9I#S#Q[ZBT<0@\`!B4<0PV:0\P\>^HM' +M&(/``8E'&,-FD/,/'OJ+1R"#P`&)1R##9I#S#Q[Z2,<"`````#'`2(T-?"4" +M`&9F+@\?A```````D$0/M@0!1#@$!G4=2(/``4B#^!!UZTB-1PA(B0(QP(-' +M(`'##Q]$```QP$B-#7]"`@!$#[8,`40X#`9U&0\?0`!(@\`!2(/X$'3+1`^V +M#`%$.`P&=.LQP$B-#7)"`@!FD$0/MA0!1#@4!G4=2(/``4B#^!!UZTB-1Q!( +MB0(QP(-'(`'##Q]$```QP$B-#<\[`@!F9BX/'X0```````\?0`!$#[8<`40X +M'`9U&$B#P`%(@_@0=>M(C4<82(D",<"#1R`!P[@"0`"`PP\?@`````#S#Q[Z +M2,<"`````#'`2(T-C"0"`&9F+@\?A```````9F8N#Q^$``````!F#Q]$``!$ +M#[8$`40X!`9U'4B#P`%(@_@0=>M(C4?P2(D",<"#1P@!PP\?1```,M(C4?X2(D",<"#1P@!PP\?1``` +M,^DC'`@`````QP$B-#8PC +M`@!F9BX/'X0``````&9F+@\?A```````9@\?1```1`^V!`%$.`0&=1U(@\`! +M2(/X$'7K2(U'^$B)`C'`@T<0`<,/'T0``#'`2(T-?T`"`$0/M@P!1#@,!G49 +M#Q]``$B#P`%(@_@0=,M$#[8,`40X#`9TZS'`2(T-M(C4<02(D",<"#1Q@!P[@"0`"`PY!F#Q]$``#S +M#Q[ZBT<@@\`!B4<@PV:0\P\>^HM'"(/``8E'",-FD/,/'OJ+1Q"#P`&)1Q## +M9I#S#Q[ZBT<8@\`!B4<8PV:0\P\>^E5(B>5(@^P09$R+!"4H````3(E%^$R+ +M1V!-A<`/A*(```"`?U,`='](BX>X`0``3(M(*$R)3?!(A?9T9TB+AY@!``!( +MBPZ^````@$B+EZ`!``!(.<9S$`\?1```2-'H2-'J2#G&E(T>I(.\` +M````=07##Q]``$B+N>0```!(N+U">N75E+_62/?G2+@`;^])_?___TC!ZA=( +M`=!(:=*`EI@`2(E&$`^W@>P```!(*=>#Z!AK_V1(B7X89H/X`0^&2@$``,9& +M,0'##Q]$``!(N+U">N75E+_628MX8$CWYTBX`&_O2?W___](P>H72`'02&G2 +M@):8`$B)1B!!#[=`:$@IUX/H&&O_9$B)?BAF@_@!#X87`0``QD8R`8"YXP`` +M```/A$#___](B[G8````2+B]0GKEU92_UDCWYTBX`&_O2?W___](P>H72`'0 +M2&G2@):8`$B)!@^W@>````!(*=>#Z!AK_V1(B7X(9H/X`79]QD8P`>GN_O__ +M#Q]``$B+O_````!(N+U">N75E+_62/?G2+@`;^])_?___TC!ZA=(`=!(:=*` +MEI@`2(E&(`^W@?@```!(*=>#Z!AK_V1(B7XH9H/X`0^'2____P^V@?H```"$ +MP`^$//___T@!^,9&,@%(B48HZ3#___\/'P`/MH'B````A,`/A'3___](`?A( +MB48(Z6C___\/'T0```^V@>X```"$P`^$I_[__T@!^$B)1ACIF_[__P\?1``` +M00^V0&J$P`^$W/[__^N>D`\?A```````\P\>^L9'30")\87V=0N`?R4`=#RY +M`0```$B+1V!%,<"`?TD`2(L03(M*,'0'3(V'.`$```^VE\````!(B[>@```` +M2(G'0?_A#Q^$``````#&1TT!Z\-F+@\?A```````\P\>^E5(B>5!5$F)]%-( +MB?M(BW]X2(7_=!9(BP=;3(GF05Q=2(M`&/_@9@\?1```2(M[8$B-%160``!( +MBP=(B?Y(BP!(.=!U=S'`2(T5WCH"`$B-#5<]`@`/'X``````1`^V!`%$.`0" +M=25(@\`!2(/X$'7K2(E[>$B+!X.&,`$```%,B>9;2(M`&$%<7?_@,$B--64Z`@#_T(7`=!5;05Q=PV8N#Q^$``````!(@\<8ZX](BWMXZ2O___^0 +M\P\>^E5(B>5!5$F)]%-(B?M(BW]H2(7_=!9(BP=;3(GF05Q=2(M`&/_@9@\? +M1```2(M[4$B-%26/``!(BP=(B?Y(BP!(.=!U5S'`2(T5[CD"`$B-#6<\`@!F +M9BX/'X0``````&9F+@\?A```````D$0/M@0!1#@$`G5%2(/``4B#^!!UZTB) +M>VA(BP>#AC`!```!3(GF6TB+0!A!7%W_X$B-4VA(C365.0(`_]"%P'0_6T%< +M7<-F+@\?A```````,M(C4<(2(D",<"# +M1Q`!P[@"0`"`PP\?@`````#S#Q[Z2,<"`````#'`2(T-S!H"`&9F+@\?A``` +M````9F8N#Q^$``````!F#Q]$``!$#[8$`40X!`9U'4B#P`%(@_@0=>M(C4?X +M2(D",<"#1P@!PP\?1```,^HM'$(/``8E'$,-FD/,/'OJ+1PB#P`&)1PC#9I"+5BB+1BR#^O]T +M+4R+!XG128L,R(E!+(/X_W0D2(L/2(L$P8E0*$C'1BC_____@V\8`<,/'T0` +M`(E'%(/X_W7Q(BUWXR<.0P[@%0`"`Z]4/'X0``````/,/'OHQP,-F +M#Q^$``````#S#Q[Z,<##D`\?A```````\P\>^C'`PV8/'X0``````/,/'OHQ +MP,.0#Q^$``````#S#Q[Z54B)Y4%7059!54%44TB#[!B+1PB#Z`&)105]=PP\?`$B-!+1QA(BW\0A<`/ +MA+0```!$C6C_2<'E`P\?0`!.BR0O387D#X2-````08M$)#!)BWPD*(7`=%6- +M6/](P>,#9F8N#Q^$```````/'P!,BSP?387_="U)BW\02(7_=`7H:6;]_TF+ +M/TB%_W0%Z%QF_?],B?^^(````.@O9?W_28M\)"A(@^L(2(/[^'7`2(7_=`7H +M-F;]_TF+?"082(7_=`7H)V;]_TR)Y[XX````Z/ID_?])BWX028/M"$F#_?@/ +MA5C___](A?]T!>C^9?W_OB@```!,B??HT63]_^G__O__9F8N#Q^$``````"0 +M\P\>^E5(B>5!5D%50513BTUT$5M$B>A!7$%=05Y=PP\? +M1```2(T%*0T#`$F)_/,/?@7>#P,`9D@/;LA(@\!H9@]LP69(#V[02(/`,`\1 +M!_,/?@7%#P,`2(E'((N'$`$``&8/;,(/$4<02(N_"`$``(7`=%2-6/](P>,# +M9@\?A```````3(LT'TV%]G0Q28M^$$B%_W0%Z#EE_?])BSY(A?]T!DB+!_]0 +M$$R)][XP````Z/YC_?])B[PD"`$``$B#ZPA(@_OX=;Q(A?]T!>@"9?W_28N\ +M)/@```!(A?]T!>CP9/W_28N\)(````!(A?]T!>C>9/W_28M\)'!(A?]T!>C/ +M9/W_28M\)%!(A?]T!>C`9/W_28M\)$!(A?]T!>BQ9/W_08M$)#A)BWPD,(7` +M=$6-6/](P>,#9F8N#Q^$``````"03(LT'TV%]G0?28L^2(7_=`7H>F3]_TR) +M][X0````Z$UC_?])BWPD,$B#ZPA(@_OX=A49/W_3(GGOB@!``#H +M)V/]_UM$B>A!7$%=05Y=PV9F+@\?A```````\P\>^E5(B>5!5T%6055!5%-( +M@^P(BT<(1(UH_T2);PA%A>UT&TB#Q`A$B>A;05Q!74%>05]=PV8/'X0````` +M`$B-!6D+`P!)B?Q,C7?@\P]^!1H.`P!F2`]NR$B#P&AF#VS!9D@/;M!(@\`P +M#Q%'X/,/?@4`#@,`2(D'BX?P````9@]LP@\11_!(B[_H````AAY8_W_28L_2(7_=`9(BP?_4!!, +MB?^^,````.@^8OW_28N\).@```!(@^L(2(/[^'6\2(7_=`7H0F/]_TF+O"38 +M````2(7_=`7H,&/]_TF+?"1@2(7_=`7H(6/]_TF+?"102(7_=`7H$F/]_TF+ +M?"0P2(7_=`7H`V/]_TF+?"0@2(7_=`7H]&+]_T&+1"0828M\)!"%P'1(C5C_ +M2,'C`V9F+@\?A```````#Q]``$R+/!]-A?]T'TF+/TB%_W0%Z+IB_?],B?^^ +M$````.B-8?W_28M\)!!(@^L(2(/[^'7.2(7_=`7HE&+]_[XH`0``3(GWZ&=A +M_?_I=_[__V:0\P\>^E5(B>5!5T%6055!5%-(@^P(BT<01(UH_T2);Q!%A>UT +M&TB#Q`A$B>A;05Q!74%>05]=PV8/'X0``````$B-!;D)`P!)B?Q,C7?H\P]^ +M!6H,`P!F2`]NR$B#P&AF#VS!9D@/;M!(@\`P#Q%'Z/,/?@50#`,`2(E'"(N' +M^````&8/;,(/$4?X2(N_\````(7`=$^-6/](P>,##Q]``$R+/!]-A?]T,4F+ +M?Q!(A?]T!>C)8?W_28L_2(7_=`9(BP?_4!!,B?^^,````.B.8/W_28N\)/`` +M``!(@^L(2(/[^'6\2(7_=`7HDF']_TF+O"3@````2(7_=`7H@&']_TF+?"1H +M2(7_=`7H<6']_TF+?"182(7_=`7H8F']_TF+?"0X2(7_=`7H4V']_TF+?"0H +M2(7_=`7H1&']_T&+1"0@28M\)!B%P'1(C5C_2,'C`V9F+@\?A```````#Q]` +M`$R+/!]-A?]T'TF+/TB%_W0%Z`IA_?],B?^^$````.C=7_W_28M\)!A(@^L( +M2(/[^'7.2(7_=`7HY&#]_[XH`0``3(GWZ+=?_?_I=_[__V:0\P\>^E5(B>5! +M5T%6055!5%-(@^P(BT<81(UH_T2);QA%A>UT&TB#Q`A$B>A;05Q!74%>05]= +MPV8/'X0``````$B-!0D(`P!)B?Q,C7?P\P]^!;H*`P!F2`]NR$B#P&AF#VS! +M9D@/;M!(@\`P#Q%'\/,/?@6@"@,`2(E'$(N'``$``&8/;,(/$0=(B[_X```` +MA@98/W_28L_2(7_ +M=`9(BP?_4!!,B?^^,````.C>7OW_28N\)/@```!(@^L(2(/[^'6\2(7_=`7H +MXE_]_TF+O"3H````2(7_=`7HT%_]_TF+?"1P2(7_=`7HP5_]_TF+?"1@2(7_ +M=`7HLE_]_TF+?"1`2(7_=`7HHU_]_TF+?"0P2(7_=`7HE%_]_T&+1"0H28M\ +M)""%P'1(C5C_2,'C`V9F+@\?A```````#Q]``$R+/!]-A?]T'TF+/TB%_W0% +MZ%I?_?],B?^^$````.@M7OW_28M\)"!(@^L(2(/[^'7.2(7_=`7H-%_]_[XH +M`0``3(GWZ`=>_?_I=_[__V:0\P\>^E5(B>5!5T%6055!5%-(@^P(BT<@1(UH +M_T2);R!%A>UT&TB#Q`A$B>A;05Q!74%>05]=PV8/'X0``````$B-!5D&`P!) +MB?Q,C7?X\P]^!0H)`P!F2`]NR$B#P&AF#VS!9D@/;M!(@\`P#Q%'^/,/?@7P +M"`,`2(E'&(N'"`$``&8/;,(/$4<(2(N_``$``(7`=$^-6/](P>,##Q]``$R+ +M/!]-A?]T,4F+?Q!(A?]T!>AI7OW_28L_2(7_=`9(BP?_4!!,B?^^,````.@N +M7?W_28N\)``!``!(@^L(2(/[^'6\2(7_=`7H,E[]_TF+O"3P````2(7_=`7H +M(%[]_TF+?"1X2(7_=`7H$5[]_TF+?"1H2(7_=`7H`E[]_TF+?"1(2(7_=`7H +M\UW]_TF+?"0X2(7_=`7HY%W]_T&+1"0P28M\)"B%P'1(C5C_2,'C`V9F+@\? +MA```````#Q]``$R+/!]-A?]T'TF+/TB%_W0%Z*I=_?],B?^^$````.A]7/W_ +M28M\)"A(@^L(2(/[^'7.2(7_=`7HA%W]_[XH`0``3(GWZ%=<_?_I=_[__V:0 +M\P\>^E5(B>5!5T%6055!5%-(@^P(BT<01(U@_T2)9Q!%A>1T&TB#Q`A$B>!; +M05Q!74%>05]=PV8/'X0``````$B-!<$&`P!(@W\@`$B)^_,/?@5I!P,`9D@/ +M;LAF#VS!#Q$'=$9(BW\8BT,42(M70$B)QDB!QP@!``#&!`(`Z-WT__],BVL@ +M387M=!])BT4`2(T5^?;__TB+0!!(.=`/A8P!``!!@VTH`705OB@```!(B=_H +MF%O]_^EH____#Q\`2(T%*00#`$F+O0@!``#S#WX%V@8#`&9(#V[02(/`:&8/ +M;,)F2`]NV$B#P#!!#Q%%`/,/?@6_!@,`28E%($&+A1`!``!F#VS#00\111"% +MP'121(UP_TG!Y@,/'X``````3HL\-TV%_W0P28M_$$B%_W0%Z#E<_?])BS]( +MA?]T!DB+!_]0$$R)_[XP````Z/Y:_?])B[T(`0``28/N"$F#_OAUO4B%_W0% +MZ`-<_?])B[WX````2(7_=`7H\EO]_TF+O8````!(A?]T!>CA6_W_28M]<$B% +M_W0%Z--;_?])BWU02(7_=`7HQ5O]_TF+?4!(A?]T!>BW6_W_08M%.$F+?3"% +MP'0\1(UP_TG!Y@,/'P!.BSPW387_=!Y)BS](A?]T!>B*6_W_3(G_OA````#H +M75K]_TF+?3!)@^X(28/^^'7/2(7_=`7H95O]_TR)[[XH`0``Z#A:_?^^*``` +M`$B)W^@K6OW_Z?O]__]F#Q]$``!,B>__T.EQ_O__9@\?1```\P\>^E5(B>5! +M5T%6055!5%-(@^P(BT<(1(U@_T2)9PA%A>1T&TB#Q`A$B>!;05Q!74%>05]= +MPV8/'X0``````/,/?@4X!0,`2(-_&`!(B?M,C7?X2(T%;00#`&9(#V[(9@]L +MP0\11_@/A)H!``!(BW\0BT,,2(M70$B)QDB!QP@!``#&!`(`Z)3R__](BUL8 +M2(7;#X1O`0``2(L#2(T5K?3__TB+0!!(.=`/A7`!``"#:R@!#X5.`0``2(T% +M[P$#`$B+NP@!``#S#WX%H`0#`&9(#V[02(/`:&8/;,)F2`]NV$B#P#`/$0/S +M#WX%AP0#`$B)0R"+@Q`!``!F#VS##Q%#$(7`=$Q$C6C_2<'E`Y!.BSPO387_ +M=#!)BW\02(7_=`7H"5K]_TF+/TB%_W0&2(L'_U`03(G_OC````#HSEC]_TB+ +MNP@!``!)@^T(28/]^'6]2(7_=`7HTUG]_TB+N_@```!(A?]T!>C"6?W_2(N[ +M@````$B%_W0%Z+%9_?](BWMP2(7_=`7HHUG]_TB+>U!(A?]T!>B56?W_2(M[ +M0$B%_W0%Z(=9_?^+0SA(BWLPA4##Q]``$Z+/"]-A?]T'DF+ +M/TB%_W0%Z%I9_?],B?^^$````.@M6/W_2(M[,$F#[0A)@_WX=<](A?]T!>@U +M6?W_OB@!``!(B=_H"%C]_[XH````3(GWZ/M7_?_I"_[__V8/'T0``$B)W__0 +MOB@```!,B??HWE?]_^GN_?__D`\?A```````\P\>^E5(B>5!54%44TB#[`B` +M?U,`2(FWH`$``'5R3(MG8$V%Y'1I28L$)$B-%5[$``!(B?-(BT`82#G0=6), +MC2V[:0,`3(GOZ"-9_?])@WPD8`!T%T&`?"1H`'4/28E<)#!)C7PD*.@4M@`` +MBP5R:0,`A=;05Q!75W_X+L$0`"`Z\)F+@\?A```````\P\>^DB+ +M1V!(A7_4!!=PP\?`#'`P_,/ +M'OI(BW+]_Y`/'X0``````%5(B>5!5$F)U%-(@^PP2(L_9$B+'"4H```` +M2(E=Z$B)RTC'1=``````2(L'Q@$`2(U-T$C'`@````"Z!P```$C'1=@````` +M_U`P#[=5T(7`=2-F@_H5=QA(C36Q)@(`#[?*2&,,CD@!\3[_X0\?0`"X!4`` +M@&:#^@=V%8U*]F:#^39W+&9F+@\?A```````D$B+5>AD2"L4)2@```!U5TB# +MQ#!;05Q=PP\?A```````9H/Z"'7:2(M]V$B%_W312(/O!(E%S.@U5OW_BT7, +MZ\!(BU7828D4),8#`>NS#Q\`BU78Z^\/'P`/MU78Z^9FD`^V5=CKWNB55?W_ +MD`\?0`#S#Q[Z54B#[X#&1ZP!2(GEZ`MH_O\QP%W##Q^``````/,/'OI52(/' +M<,9'K`%(B>7HZV?^_S'`7<.09@\?1```\P\>^DB+!TB+4'!(BW(02#ER"'0$ +MQD!X`8M("`^V=PF-4?^)4`B%TG0G@^D"2(T,24C!X0-,C40($$R)0'!`A/9T +M#DB-%%)(BU30($@!5`@@QD<(`,-F+@\?A```````\P\>^E5(B>5!54%44TB) +M^TB#[!A(BW]@9$R+)"4H````3(EEV$F)]$B%_P^$J````$B+!TC'1=`````` +M2(T5_=K__TF)^$B+`$@YT'5R,;_4!A(BWW0B<-(A?]T +M!DB+!_]0$$B+1=AD2"L$)2@````/A>,```!(@\08B=A;05Q!75W##Q\`3(UM +MT$B-->4C`@!,B>K_T$R+1=!-AVA(A?\/A*,```!(BP?&0RT!3(GF +M_U`@BU,C4<0 +MZ?S^__\/'T``3(U'&.GO_O__NP%``(#I"O___^A84_W_\P\>^DB)P^D6^DB)Q^D5^DB#[QCI0_[__P\?`/,/'OI52(GE055!5$R-;AD2"L4)2@````/A9$" +M``!(@\0P6T%<7<-F#Q]$``"#[@2#_C%WQDB-#H"2(T$DD@!T4B-!(!(B4W( +M2,'@`D@IQC'`9HEUQ&:)1<;IN_[__P\?1```2+D`D1"V`@```$B+M[````!( +M`X^H````ZY9F#Q]$``!(N0"1$+8"````2(NWH````$@#CY@```#I<____P\? +M`(N'V````+D0````B<*!X@#P``"!^@!```"Z(`````]$T8G1@\D!J)(/1-'! +MX!"Y$P```&:)3<`)T(#,@(E%R.DR_O__#Q]``$B+AY````"^%0```&:)=5_O^%P'FVB47(Z['H>4_]__,/'OI(B^E5(B>5!5TR-/5!5$F)_%.-6O](P>,#D$B+/!A(A?]T#KX@````Z.U-_?])BP0D2(/K +M"$B#^_AUWTB%P'026TB)QT%<7>GN3OW_9@\?1```6T%<7<,/'P!(A^E5(B>5!5T%6055!5%-(@^PH1(MO,$6%[0^$/@$``$B+ +M1RA%,>1(B47`2(L&2(E%R$2)Z$B)1;@/'T0``$B+1^E5(B>53 +M2(/L.$B+!V1(BQPE*````$B)7>A(B-2O9F@_DV=KYF +M@_H(=;A(BWW82(7_=*](@^\$B47,Z.9+_?^+1^E5(B>532(/L.$B+!V1(BQPE*````$B)7>A(B=/&`@!(C5702,=% +MT`````!(QT78`````/]00`^W5="%P'4^9H/Z"W0@9H72=25(BU7H9$@K%"4H +M````=5-(BUWXR<-F#Q]$``!F@WW8``^5`^O;N`5``(!F#Q^$``````!F@_H' +M=L>-2O9F@_DV=KYF@_H(=;A(BWW82(7_=*](@^\$B47,Z"9+_?^+1^E5(B>5!54%44TB)TTB#[`A(BT=P2(M0$$@[ +M4`@/@P5I_?](BPA!B?1(C7(!2(EP$(`\$0`/A((```#'0P@`````1#EC#'-% +M187D#XC2:/W_2(L[2(7_=`7H/TO]_TC'`P````!%B>7'0PP`````3(GOZ,9' +M_?]$B6,,2(D#2(G'1(EC".L59@\?1```1(EC"$B+.T6)Y46%Y'0Y2(/$"$R) +MZKX!````6T%<05U=Z9I(_?]F+@\?A```````2(/$"$B)VD2)YEM!7$%=7>E; +M=O__#Q\`2(/$"%M!7$%=7<.09F8N#Q^$``````"0\P\>^E5(B>5!5T%628GV +M055)B=5!5$R-9;!32(G[2(/L*&1,BSPE*````$R)?3(GG9HE%N.@R'P$`0<=%&`````!%.7T<#X*0````18E]&$F+11!% +MA?]T5DF+?0!%B?XQTNL5#Q^$``````!(B0S02(/"`4DYUG0V,^NDB9_W_ +M9@\?1```\P\>^DB#?R@`#X3$`P``54B)Y4%7059!54F)_4%44TB#["B+G[`! +M``"%VP^$-P(```^(%V?]_XG83(TTQ0````!,B??HMT7]_T6+A;`!```Q_TF) +MQ$F+A:@!``!%AE!B33\2(/' +M`4DY^'6\@_L!#X0!`0``08G83(EUN$F-3"3X28G&0='H3(EML$2)PD>-'`!% +MB<%)C7S4^$2)7,#2HT4&8LZ1(M"!#G8-%BSM!.?\/ +M@AD!``!%BVL$1#G_00^2QT4YQ4$/DL-%"/MU"44YZ`^"^0```$&)Q4B-!/%! +M.?H/@F/___]$.==-`>;K$68N#Q^$``````!)BX6H`0``08M7!$B+!-`QTH!X,@!T!$B- +M4"`Q]H!X,0!T!$B-%L`$```````!,B>?H^$;]_TB#Q"@QP%M! +M7$%=05Y!7UW##Q^``````(/``4B-%,%)B<6+.D2+0@3I]?[__P\?`$B)T.E: +M_O__3(GP3(MUN$F+-"1$C4/_3(MML$J-%#'S#WX"2(DR9D$/U@0D@_L"#X3Q +M_O__1(G"38GJ28G!28U\U/A(B7W`ZT(/'X``````.5W(#X*I````38G^2(M= +MP&8/U@!)BP0D08/H`?,/?@-(B0-(@^L(2(E=P&9!#]8$)$&#^`$/A)7^__]F +M#W#0Y69!#W[#N`(```"^`0```&8/?E7(38GWD$&)Q4&)QDG!Y0-*C10IBSJ+ +M6@1$.5!5T%6055)BS(`0``2(M%$$B) +MM5#^__\Q]DR)A4#^__],C86`_O__2(F%,/[__TB+11A,B8TX_O__3(V-D/[_ +M_TB)O6C^__](B95(_O__2(F%*/[__V1(BP0E*````$B)1<@QP$B-A4#___\/ +M$85(____2(G!#RE%@$C'A4#___\`````2,>%6/___P````!(QX5@____```` +M`$C'A6C___\`````#RF%%@/[__P````!(QX6(_O__`````$C'A9#^ +M__\`````2,>%F/[__P````!(QX6@_O__`````$C'A:C^__\`````3(F-$/[_ +M_TB)A2#^___H\"4!`(N%1/___\:%L/[__P!(QX6X_O__`````$C'A<#^__\` +M````2,>%R/[__P````!(QX70_O__`````$C'A=C^__\`````2,>%X/[__P`` +M``!(QX7P_O__`````$C'A?C^__\`````2,>%`/___P````!(QX4(____```` +M`$C'A1#___\`````2,>%&/___P````!(QX4P____`````(7`#X2C!```2(V% +ML/[__T4QY$B)A1C^___K'68/'X0``````(E#"$F#Q`%$.Z5$____#X,2`@`` +M1(FE8/[__T&+10Q!.44(=58]_O__?P^'`%,.7,@#X7`8/W_1#NE6/___W,22(N% +M4/___T*`/"``#X4K`@``2(L#2(T-T<;^_TB+0!!(.<@/A00"``"+0PB#Z`$/ +MA?C]__^^*````$B)WTF#Q`'H1T#]_T0[I43___\/@N[]__](BX5(____2(N] +M,/___TB%P'08BY5`____2(N-:/[__TB+!-!(`8&X````2(7_=`9(BP?_4!!( +MB[T0____2(7_=`7H$T']_TB+O0#___](A?]T!>@"0?W_2(N]\/[__TB%_W0% +MZ/%`_?](B[W8_O__2(7_=`7HX$#]_TB+OC/0/W_2(N]N/[_ +M_TB%_W0%Z+Y`_?](B[V@_O__2(7_=`7HK4#]_TB+O9#^__](A?]T!>B<0/W_ +M2(N]@/[__TB%_W0%Z(M`_?](BWVX2(7_=`7H?4#]_TB+?:!(A?]T!>AO0/W_ +M2(M]F$B%_W0%Z&%`_?](BWV02(7_=`7H4T#]_TB+?8A(A?]T!>A%0/W_2(M] +M@$B%_W0%Z#=`_?](B[UX____2(7_=`7H)D#]_TB+O7#___](A?]T!>@50/W_ +M2(N]8/___TB%_W0%Z`1`_?](B[U0____2(7_=`7H\S_]_TB+O4C___](A?]T +M!>CB/_W_2(M%R&1(*P0E*`````^%&`$``(N%7/[__TB-9=A;05Q!74%>05]= +MPV8N#Q^$``````!(P>(#3(GQ2(G'2(FU8/[__^BZ0/W_2(NU8/[__TB)]^B+ +M/_W_Z7G\__]F#Q]$``!(B=__T.GY^___9@\?1```28LW3(GRO______H$"S^ +M_TB+E6#___](BXU@_O__]]`Y!`H/A*S]___I.%[]_V:02(L#2(T5=L3^_TB+ +M0!!(.=!U+8M#"(/H`705B4,(2(N],/___^GG_?__9@\?1```OB@```!(B=_H +MXSW]_^O?D$B)W__0Z]=(BX5(____2(7`=">+E4#___](BXUH_O__QX5<_O__ +M`````$B+!-!(`8&X````Z:+]___'A5S^__\`````Z:3]___HLCW]__,/'OKI +MHES]__,/'OI(B$I(B<)(B4,X2,'J!4B)T4C!X01(`=%( +MNC,S,S,S,S,#2#G"#X*:`@``2(T4@$BXP_4H7(_"]2A(P>($2,'J`DCWXDC! +MZ@+K)0\?`$BX`````````(!(N0````````!$2+I@9F9F9F9F9DB)0SA(B5,H +M2(E+,/,/?@7&YP(`2(T%I^("`$C'0T``````OQ````!F2`]NV$C'0T@````` +M9@]LPTC'0V``````#Q$#9@_OP$C'0V@`````2,=#<`````!(QX.H```````` +M`$C'@[``````````2,>#N`````````!(QX/``````````$C'@\@````````` +M2,>#T`````````!(QX/8`````````$C'@^``````````2,>#Z`````````!( +MQX/P`````````$C'@_@`````````2,>#``$```````!(QX,(`0```````$C' +M@Q`!````````2,>#&`$```````!(QX,@`0```````$C'@R@!````````2,># +M,`$```````!(QX,X`0```````$C'@T`!````````2,>#2`$````````/$4-0 +M#Q%#>`\1@X@````/$8.8````2,>#4`$```````!(QX-8`0```````$C'@V`! +M````````2,>#:`$```````!(QX-P`0```````$C'@W@!````````2,>#@`$` +M``````!(QX.(`0```````$C'@Y`!````````2,>#F`$```````!(QX.@`0`` +M`````$C'@]`!````````2,>#V`$```````!(QX,0`@````````\1@^`!``#H +M'SC]_TB+%8C^`0#'``````!(B8,0`@``,#(`(` +M``0```!(BT7H9$@K!"4H````=4I(@^R`2(G86T%>7<-F#Q]$``#&0R$`Z;G] +M__\/'X``````2+K#]2A^DF)QNE`6OW_D&8/'T0``/,/'OI52(GE055!5%-(B?M( +M@^P(2(N_^````$B%_W0%Z+LZ_?](B[OH````2(7_=`7HJCK]_TB+N\````!( +MA?]T!>B9.OW_2(N[L````$B%_W0%Z(@Z_?](BWM(2(7_=`7H>CK]_TB+>SA( +MA?]T!>AL.OW_2(M[*$B%_W0%Z%XZ_?](BWL82(7_=`9(BP?_4!!,BV,0387D +M="!)BP0D2(T5*U3__TB+0!!(.=`/A:8```!!@VPD"`%T+DB+>PA(A?]T!DB+ +M!_]0$$B+.TB%_W0&2(L'_U`02(/$"%M!7$%=7<-F#Q]$``#S#WX%4.0"`$B- +M!3'?`@!-C6PD^&9(#V[(3(GO9@]LP4$/$40D^.C]1O__28N\)`@"``!(A?]T +M!>B[.?W_28U\)$#H,5'__TF+?"0X2(7_=`9(BP?_4!"^*`(``$R)[^AT./W_ +MZ6G___\/'X``````3(GG_]#I6/___V9F+@\?A```````#Q\`\P\>^E5(B>5! +M54%428G\4TB#[`CH9[H``$F+?"1H2(7_=`7H2#G]_TF+?"182(7_=`7H.3G] +M_TF+?"0P2(7_=`7H*CG]_T&+1"0828M\)!"%P'0_C5C_2,'C`P\?1```3(LL +M'TV%[70@28M]`$B%_W0%Z/DX_?],B>^^$````.C,-_W_28M\)!!(@^L(2(/[ +M^'7-2(7_=`7HTSC]_T&+1"0(28L\)(7`=$*-6/](P>,#9F8N#Q^$```````/ +M'T``3(LL'TV%[7093(GOZ+_]__],B>^^$`$``.AR-_W_28L\)$B#ZPA(@_OX +M==1(A?]T#TB#Q`A;05Q!75WI<#C]_TB#Q`A;05Q!75W##Q]$``#S#Q[Z54B) +MY4%7059!54%44TB#["B+1PA$C6C_1(EO"$6%[70;2(/$*$2)Z%M!7$%=05Y! +M7UW#9@\?A```````2(T%"=P"`$B)^TR-=^CS#WX%AI-_W_3(G_OD@```#H/#;]_TB+NY`!``!)@^P(28/\^'7+ +M2(7_=`7H03?]_XN#>`$``$B+NW`!``"%P'1$1(U@_TG!Y`,/'X0``````$Z+ +M/"=-A?]T(4F+/TB%_W0%Z`HW_?],B?^^$````.C=-?W_2(N[<`$``$F#[`A) +M@_SX=CB-OW_2(N[:`$``$B%_W0&2(L'_U`02(N[4`$``$B%_W0% +MZ+\V_?](B[M(`0``2(7_=`9(BP?_4!!(B[L0`0``2(7_=`7HG#;]_TB+N_@` +M``!(A?]T!>B+-OW_2(N[L````$B%_W0%Z'HV_?^+@Z````!(B[N8````A0#D$Z+/"=-A?]T(4F+/TB%_W0%Z$HV_?],B?^^$````.@=-?W_ +M2(N[F````$F#[`A)@_SX=@B-OW_2(N[B````$B%_W0%Z!$V_?]( +MBWMX2(7_=`7H`S;]_TB+>VA(A?]T!>CU-?W_2(M[8$B%_W0&2(L'_U`02(T% +MA]@"`$R+8UCS#WX-2^`"`/,/?A5+X`(`9D@/;NA(@\!H9D@/;O!F#VS-9@]L +MU@\I3;`/*57`387D#X3$````28L$)$B-%2F2``!(BT`02#G0#X6L`0``08.L +M)"`!```!#X6=````28N\)%@!``!-C7PD\$$/$10D2(T%I-@"`$F)1"0000\1 +M3"3P2(7_=`7H3S7]_TF+O"1(`0``2(7_=`7H/37]_TF+O"0X`0``2(7_=`7H +M*S7]_TF+O"0H`0``2(7_=`7H&37]_TF+O"00`0``2(T%RM8"`$F)1"002(7_ +M=`7H^S3]_TF-?"08Z"&+``"^R`$``$R)_^C$,_W_#Q]``$B+6TA(A=L/A+8` +M``!(BP-(C15ICP``2(M`$$@YT`^%Q````(.K,`$```$/A9(```!F#V]]L$B+ +MNV@!``!(C07A@-/W_2(N[.`$``$B%_W0%Z$\T_?]( +MB[L@`0``2(T%`=8"`$B)0R!(A?]T!>@S-/W_2(U[*.A:B@``OL@!``!(B=_H +M_3+]_[X(`@``3(GWZ/`R_?_IT/O__P\?`$R)Y__0Z5;\__]F#Q]$``!(B=__ +MT+X(`@``3(GWZ,8R_?_IIOO__Y!,B>?_T.GV_O__9@\?1```28M\)!A(C04\ +MS`(`28D$)$B%_W0&2(L'_U`028M\)!!(A?]T!DB+!_]0$+XX````3(GGZ'@R +M_?_IZ_O__P\?`/,/'OI52(GE05=!5D%505132(/L*(M'$$2-:/]$B6\0187M +M=!M(@\0H1(GH6T%<05U!7D%?7<-F#Q^$``````!(C04YUP(`2(G[3(UW\/,/ +M?@6BW0(`9D@/;MA(@\!@9@]LPV9(#V[@#Q%'\/,/?@6,W0(`9@]LQ`\1!TB+ +MO]@!``!(A?]T!>@$,_W_3(NCJ`$``$B-%<:W_O])BP0D2(M`$$@YT`^%G0,` +M`$&#;"0(`0^$R0,``(N#H`$``$B+NY@!``"%P'0]1(U@_TG!Y`-.BSPG387_ +M="))BW\X2(7_=`7HJ3+]_TR)_[Y(````Z'PQ_?](B[N8`0``28/L"$F#_/AU +MRTB%_W0%Z($R_?^+@X`!``!(B[MX`0``A0##Q^$``````!. +MBSPG387_="%)BS](A?]T!>A*,OW_3(G_OA````#H'3']_TB+NW@!``!)@^P( +M28/\^'7,2(7_=`7H(C+]_TB+NW`!``!(A?]T!DB+!_]0$$B+NU@!``!(A?]T +M!>C_,?W_2(N[4`$``$B%_W0&2(L'_U`02(N[&`$``$B%_W0%Z-PQ_?](B[L` +M`0``2(7_=`7HRS']_TB+N[@```!(A?]T!>BZ,?W_BX.H````2(N[H````(7` +M=#U$C6#_2<'D`Y!.BSPG387_="%)BS](A?]T!>B*,?W_3(G_OA````#H73#] +M_TB+NZ````!)@^P(28/\^'7,2(7_=`7H8C']_TB+NY````!(A?]T!>A1,?W_ +M2(N[@````$B%_W0%Z$`Q_?](BWMP2(7_=`7H,C']_TB+>VA(A?]T!DB+!_]0 +M$$B-!<33`@!,BV-@\P]^#8C;`@#S#WX5B-L"`&9(#V[H2(/`:&9(#V[P9@]L +MS68/;-8/*4VP#RE5P$V%Y`^$P0```$F+!"1(C15FC0``2(M`$$@YT`^%J0$` +M`$&#K"0@`0```0^%F@```$F+O"18`0``38U\)/!!#Q$4)$B-!>'3`@!)B40D +M$$$/$4PD\$B%_W0%Z(PP_?])B[PD2`$``$B%_W0%Z'HP_?])B[PD.`$``$B% +M_W0%Z&@P_?])B[PD*`$``$B%_W0%Z%8P_?])B[PD$`$``$B-!0?2`@!)B40D +M$$B%_W0%Z#@P_?])C7PD&.A>A@``OL@!``!,B?_H`2_]_Y!(BUM02(7;#X2V +M````2(L#2(T5J8H``$B+0!!(.=`/A<0```"#JS`!```!#X62````9@]O?;!( +MB[MH`0``2(T%'-,"`$B)0R`/$3MF#V]]P`\1>Q!(A?]T!>C"+_W_2(N[6`$` +M`$B%_W0%Z+$O_?](B[M(`0``2(7_=`7HH"_]_TB+NS@!``!(A?]T!>B/+_W_ +M2(N[(`$``$B-!4'1`@!(B4,@2(7_=`7HRCHFH4``+[(`0``2(G? +MZ#TN_?^^"`(``$R)]^@P+OW_Z>#[__\/'P!,B>?_T.EE_/__9@\?1```2(G? +M_]"^"`(``$R)]^@&+OW_Z;;[__^03(GG_]#I]O[__V8/'T0``$F+?"082(T% +M?,<"`$F)!"1(A?]T!DB+!_]0$$F+?"002(7_=`9(BP?_4!"^.````$R)Y^BX +M+?W_Z?K[__\/'P#S#Q[Z54B)Y4%7059!54%44TB#["B+1QA$C6C_1(EO&$6% +M[70;2(/$*$2)Z%M!7$%=05Y!7UW#9@\?A```````2(T%>=("`$B)^TR-=_CS +M#WX%XM@"`&9(#V[82(/`8&8/;,-F2`]NX`\11_CS#WX%S-@"`&8/;,0/$4<( +M2(N_X`$``$B%_W0%Z$,N_?],BZ.P`0``2(T5!;/^_TF+!"1(BT`02#G0#X6L +M`P``08-L)`@!#X38`P``BX.H`0``2(N[H`$``(7`=$Q$C6#_2<'D`V9F+@\? +MA```````#Q]``$Z+/"=-A?]T(DF+?SA(A?]T!>C9+?W_3(G_OD@```#HK"S] +M_TB+NZ`!``!)@^P(28/\^'7+2(7_=`7HL2W]_XN#B`$``$B+NX`!``"%P'1$ +M1(U@_TG!Y`,/'X0``````$Z+/"=-A?]T(4F+/TB%_W0%Z'HM_?],B?^^$``` +M`.A-+/W_2(N[@`$``$F#[`A)@_SX=A2+?W_2(N[>`$``$B%_W0& +M2(L'_U`02(N[8`$``$B%_W0%Z"\M_?](B[M8`0``2(7_=`9(BP?_4!!(B[L@ +M`0``2(7_=`7H#"W]_TB+NP@!``!(A?]T!>C[+/W_2(N[P````$B%_W0%Z.HL +M_?^+@[````!(B[NH````A0#D$Z+/"=-A?]T(4F+/TB%_W0% +MZ+HL_?],B?^^$````.B-*_W_2(N[J````$F#[`A)@_SX=B2+/W_ +M2(N[F````$B%_W0%Z($L_?](B[N(````2(7_=`7H<"S]_TB+>WA(A?]T!>AB +M+/W_2(M[<$B%_W0&2(L'_U`02(T%],X"`$R+8VCS#WX-N-8"`/,/?A6XU@(` +M9D@/;NA(@\!H9D@/;O!F#VS-9@]LU@\I3;`/*57`387D#X3!````28L$)$B- +M%9:(``!(BT`02#G0#X6I`0``08.L)"`!```!#X6:````28N\)%@!``!-C7PD +M\$$/$10D2(T%$<\"`$F)1"0000\13"3P2(7_=`7HO"O]_TF+O"1(`0``2(7_ +M=`7HJBO]_TF+O"0X`0``2(7_=`7HF"O]_TF+O"0H`0``2(7_=`7HABO]_TF+ +MO"00`0``2(T%-\T"`$F)1"002(7_=`7H:"O]_TF-?"08Z(Z!``"^R`$``$R) +M_^@Q*OW_D$B+6UA(A=L/A+8```!(BP-(C179A0``2(M`$$@YT`^%Q````(.K +M,`$```$/A9(```!F#V]]L$B+NV@!``!(C05,S@(`2(E#(`\1.V8/;WW`#Q%[ +M$$B%_W0%Z/(J_?](B[M8`0``2(7_=`7HX2K]_TB+NT@!``!(A?]T!>C0*OW_ +M2(N[.`$``$B%_W0%Z+\J_?](B[L@`0``2(T%<BC*OW_ +M2(U[*.C*@```OL@!``!(B=_H;2G]_[X(`@``3(GWZ&`I_?_IT/O__P\?`$R) +MY__0Z5;\__]F#Q]$``!(B=__T+X(`@``3(GWZ#8I_?_IIOO__Y!,B>?_T.GV +M_O__9@\?1```28M\)!A(C06LP@(`28D$)$B%_W0&2(L'_U`028M\)!!(A?]T +M!DB+!_]0$+XX````3(GGZ.@H_?_IZ_O__Y!FD/,/'OI52(T%Y,T"`&9(#V[( +M2(/`8&9(#V[02(GE05=!5D%505132(G[2(V_@````$B#[`C'1Z``````\P]^ +M!274`@#&1Z<`9@]LP4C'1Z@`````#Q%'@/,/?@41U`(`2,='P/____]F#VS" +MQD?3``\11Y!F#V\%1>P!`$C'1^``````#Q%'L&8/[\`/$4?PZ+PS_O](C;N0 +M````Z+`S_O],C:.@````3(GGZ#$V_O](QX.P`````````$B-N\@```!(QX.X +M`````````.A_,_[_2,>#V`````````!(C;L0`0``2,>#X`````````!(QX/H +M`````````$C'@_``````````QX/X`````````.@],_[_2(V[*`$``.@Q,_[_ +M2,>#<`$```````!F#^_`OS@```!(QX.0`0```````$C'@Z@!````````2,># +ML`$````````/$8-@`0``#Q&#@`$``.AI)_W_2(T-"L$"`+H!`0``2,=`,``` +M``!F#^_`2(D(2(V[Z`$``&:)4`Q(B8.X`0``QT`(`0````\10!`/$4`@Z*@R +M_O](@\0(6T%<05U!7D%?75!569(#V[H2(/`8$%49D@/;O!32(G[ +M2(/L*/,/?@4"T@(`\P]^#0K2`@#S#WX5"M("`&8/;,5F#VS+#Q$'9@]LU/,/ +M?@7CT0(`#RE-P&8/;,8/*570#Q%'$$B+O^@!``!(A?]T!>A2)_W_3(NCN`$` +M`$B-%12L_O])BP0D2(M`$$@YT`^%XP,``$&#;"0(`0^$/P(``(N#L`$``$B+ +MNZ@!``"%P'1+1(U@_TG!Y`-F9BX/'X0```````\?`$Z++"=-A>UT(DF+?3A( +MA?]T!>CI)OW_3(GOOD@```#HO"7]_TB+NZ@!``!)@^P(28/\^'7+2(7_=`7H +MP2;]_XN#D`$``$B+NX@!``"%P'1%1(U@_TG!Y`,/'X0``````$Z++"=-A>UT +M(DF+?0!(A?]T!>B))OW_3(GOOA````#H7"7]_TB+NX@!``!)@^P(28/\^'7+ +M2(7_=`7H82;]_TB+NX`!``!(A?]T!DB+!_]0$$B+NV@!``!(A?]T!>@^)OW_ +M2(N[8`$``$B%_W0&2(L'_U`02(N[*`$``$B%_W0%Z!LF_?](B[L0`0``2(7_ +M=`7H"B;]_TB+N\@```!(A?]T!>CY)?W_BX.X````2(N[L````(7`=#U$C6#_ +M2<'D`TZ++"=-A>UT(DF+?0!(A?]T!>C))?W_3(GOOA````#HG"3]_TB+N[`` +M``!)@^P(28/\^'7+2(7_=`7HH27]_TB+NZ````!(A?]T!>B0)?W_2(N[D``` +M`$B%_W0%Z'\E_?](B[N`````2(7_=`7H;B7]_TB+>WA(A?]T!DB+!_]0$$R+ +M8W!-A>1T)TF+!"1(C17;@0``2(M`$$@YT`^%#@(``$&#K"0@`0```0^$+P$` +M`$R+8V!-A>1T(TF+!"1(C16[?P``2(M`$$@YT`^%S@$``$&#K"0P`0```71; +M2(/$*$B)W[X(`@``6T%<05U=ZC((_W_ +M28N\)$@!``!(A?]T!>BV(_W_28N\)#@!``!(A?]T!>BD(_W_28N\)"@!``!( +MA?]T!>B2(_W_28N\)!`!``!(C05#Q0(`28E$)!!(A?]T!>AT(_W_28U\)!CH +MFGD``+[(`0``3(GOZ#TB_?_I*?[__P\?A```````3(GG_]#I'_S__V8/'T0` +M`$R)Y__0Z3/^__]F#Q]$``!,B>?_T.GW_?__9@\?1```\P\>^E5(B>532(/L +M"(M'((U8_XE?((7;=07H(?O__XG82(M=^,G#D`\?A```````54B)Y4%7059! +M54R-;:!!5$F)_$R)[U.)\TB)UDB#[#AD3(LT)2@```!,B77(28G.Z'LP_O^% +MVW0V2(TU/=8!`$R)[^C8_P``3(U]L(G>3(G_Z"I;_O],B?Y,B>_H;P`!`$B+ +M?;!(A?]T!>B!(OW_3(GV3(GOZ$;.__])BWPD8$B+=:!(BP?_4#A(BWV@B<-( +MA?]T!>A7(OW_2(M%R&1(*P0E*````'412(/$.(G86T%<05U!7D%?7_?^+,(7V="\/M\8-````B(7V#T_P2(/$"$R)Z4R) +MXDB)WUM!7$%=7>G:_O__9BX/'X0``````+X%0`"`Z]>0#Q^$``````#S#Q[Z +M54B)Y4%6055!5%-(@^Q`9$B+!"4H````2(E%V#'`2(._8`$````/A,`"``!( +MBX=8`0``@']+`$B)^TR+8&`/A<@```!%,>U,C76@3(FC0`$``$R)]DB)W\9# +M2@'H:[+__P^V5=`/MD71#[9-TDR+HU@!``")UD`(Q@^%M0$``(3)#X4E`0`` +M08M\)!"#__]T%N@F(_W_A<`/A4X!``!!QT0D$/____]!@'PD%0!!#[9$)!9! +M#[94)!#8`$```````#I`0$``$P[ +MIT@!```/@RO___^+>!!,B>;HZ!W]_X7`#Y1#2P^$%/___TB+LZ````!,C76@ +M3(GWZ"DW_O_H)!W]_XLPA?8/A!,"```/M\8-````B(7V#T_P3(GQ2(T5H]T! +M`$B)W^A+_?__2(M]H$&)Q4B%_P^$RO[__^@F(/W_Z<#^__^0A,`/A/@```"$ +MT@^$8`$``$F-5"0X28UT)"CI,?___Y"$P`^$&`$``(32#X5X`0``N@`!``!F +M#V]%L&9!B50D%4$/$40D*&8/;T7`0<9$)!T/A%T!``!!#[?%#0```(A%A>U$#T_H2(M%V&1(*P0E*`````^% +M3P$``$B#Q$!$B>A;05Q!74%>7<,/'T``A,D/A7#___^$P'1DA-(/A,0```!F +M#V]%H$'&1"05`4$/$40D&&8/;T6P00\11"0HZT]F#Q]$``"$P$F-="0HN``` +M``!(#T3P28U4)#CI5O[__V8/'T0``(32#X12_O__28U4)#@Q]ND\_O__#Q]` +M`&8/;T6@0<9$)!4!00\11"0808A$)!9!QD0D%P#IPOW__P\?@`````"$TG14 +M9@]O1:!F0<=$)!4!`$$/$40D&.GJ_O__#Q]``$4Q[>D9____#Q^$``````!) +MC70D*#'2Z=3]__\/'T``9@]O1;!!QD0D%0!!#Q%$)"CKE@\?1```,RH````9$B+!"4H````2(E%V#'`@']0`'5+ +M@']1`$B)^W5"BX?0````AP01(G@1(FE6/___R4`\``` +M/0!````/A!L!```]`(```'6%BS4?+@,`3(GO1"'FZ-0;_?^%P`^$;/___V9F +M+@\?A```````D.C+&?W_3(VCR````(LPA?8/A/@````/M\8-````B(7V#T_P +M2(M%V&1(*P0E*`````^%S````$B!Q*@```!,B>%(B=](C17_T`$`6T%<05U= +MZ%(C167T`$`2(G?Z'?Y___I +MG/[__V:0BY58____B=`E`/```#T`H```#X28_O__/0!````/A(W^__]!@^0! +M#X2#_O__@.)M08G41(FE6/___^GL_O__08',P`$``$2)I5C____IV?[__^@) +M&_W_O@5``(#KB;X%0`"`Z0O___\/'X0``````/,/'OI52(GE051!B?132(G[ +MZ"KZ__^%P`^%D@```(![2@!T1$B+@T`!``!(`8/8`0``@+O``````'162(.# +MP`$```&`>T\`=59(BWM@#[932$2)YEM!7$B+!UU(BT!`_^`/'X``````B[-0 +M`0``2(M[*$B-2TI(C9-``0``Z-[#__^`>TH`=9R`N\``````=:I(@X/(`0`` +M`8![3P!TJDB)W^@I_?__ZZ`/'X``````6T%<7 +M^DB)P^DN._W_\P\>^DB)P^E&._W_9BX/'X0``````/,/'OI52(GE059)B?9! +M54&)U4%428G\4TB)RTB%R70&QP$`````,UU$UM!7$%=05Y=PV8N#Q^$ +M``````!)BT0D&$&+="042(VX"`$``.AZ_?__A^E5(B>5!5$F) +M]%-(BT<82(G[BW<42(VX"`$``.B<_/__A`CI#N+^_V9F+@\?A```````#Q\`\P\>^E5( +MB>5!5$F)]%-(BT<02(G[BW<,2(VX"`$``.@\_/__A`CIKN'^_V9F+@\?A```````#Q\` +M\P\>^E5(B>5!5T%6055!5%-(@>R8````9$B+!"4H````2(E%R#'`@'\L`$C' +M`@`````/A0`%``!(B?M(BW]H28GV28G42(7_="1(BP=(C15,/@``2(L`2#G0 +M#X7@!```BP6N)P,`A<`/A3L%``!,C6V`3(GV3(GOZ,,C_O](QX5P____```` +M`+\$````Z"X3_?_&``!,BS64V0$`3(U]D$B+=8!,B?](B85P____3(FU>/__ +M_^@F+?[_2(M[<$B+=9!(C95P____Z.)5_O](BWV02(7_=!*(A5C____H/A;] +M_P^VA5C___^$P`^$]P,``$B+M7#___](C;N0````N@$```#H9U/^_X3`#X37 +M`P``BX/8````)0#P```]`$````^$P0,``&8/[\"_!````$C'1:``````#RE% +MD.A_$OW_Q@``OP@!``!(B46@3(EUJ$C'1;``````2,=%N/_____HBA3]_TB) +MQTF)QNB_[/[_08M^+$B@!3(FU:/___TR+O7#___]!QH;R`````(/__W01 +MZ)87_?^%P'4(0<=&+/____^ZM@$``#'V3(G_,<#HN1;]_T&)1BR#^/\/A(P# +M``!(C;L(`0``Z)"M__]!B<>%P`^%E@,``$F+!DR)=9A,B??_4`A(BWV02(7_ +M=`9(BP?_4!!,B760BY5X____.56L#X*-!```3(MUH$B+A7#___^)5:@QTF8/ +M'T0```^V#!!!B`P62(/"`83)=?!(B[UH____2(7_=`9(BP?_4!"+@Q0!```Y +M@Q`!``!U:#W^__]_#X<6./W_B<*Y____?\'J`BG!@\(!.Y( +MB<=)B<;HCB'^_XM#.(U0`8E3.$B+4S!,B33"BT-(.T-,#X31`0``3(M+0(U0 +M`;\H````B5-(0<8$`0'H>!']_TF)Q4B-!3:\`@#S#WX%YKP"`$B-%0^>__]F +M2`]NR(N%6/___TG'12``````9@]LP4R)K6C___]!B4442(L#28E=&$$/$44` +M2(M`"$''11`!````2#G0#X4A`P``@T,H`4F)72!-B2PDZ9X````/'P!!OP$` +M``!(B[UP____2(7_=`7H(1+]_TB+?8!(A?]T!>@3$OW_2(M%R&1(*P0E*``` +M``^%_0(``$B!Q)@```!$B?A;05Q!74%>05]=PP\?`$&_`0```.O-_]!!B<>% +MP'7$Z2#[__]FD.B+#OW_1(LX187_#X2Q`@``00^WQPT```"(187_1`]/^$B+ +MO6C___](A?]T!DB+!_]0$$B+?:!(A?]T!>B/$?W_2(M]D$B%_P^$4/___TB+ +M!_]0$.E%____0;\$0`"`Z5G___\/'T``/?[__W\/AYHT_?^)PKG___]_3(F5 +M4/___\'J`BG!@\(!.H"*<&#P@$YR@]'T42--`), +MB?=-B?7H8@W]_TF)P8M#2$B+@8#?W_2(M]H(N5 +M6/___TF)QDB%_W0+Z&$0_?^+E5C___],B76@B56LZ3W[__](BXU0____3(G/ +M2(T4Q0````!(B;50____Z%$1_?](B[50____28G!2(GW3(F-4/___^@8$/W_ +M3(N-4/___^D._?__3(G/B<),B?%(B;50____Z!@1_?](B[50____28G!2(GW +M3(F-4/___^C?#_W_BT-(3(N-4/___^DI____2(N-6/___TR)STB-%,4````` +M2(FU6/___^C2$/W_2(NU6/___TF)P4B)]TR)C5C____HF0_]_TR+C5C____I +M%_O__TB+C4C___],B<](C13%`````$R)E4#___](B;50____Z(@0_?](B[50 +M____3(N50/___TF)P4B)]TR)C4C___],B950____Z$$/_?^+0UA,BXU(____ +M3(N54/___^DE_O__2(G?_]!)BWT@2(7_#X31_/__2(L'_U`0Z<;\__]!OP5` +M`(#I5/W__^C^#?W_\P\>^DB)P^E^,?W_\P\>^DB)P^F#,?W_\P\>^NFI,?W_ +M\P\>^DB)P^E\,?W_\P\>^DB)P^FS,?W_\P\>^DB)P^DW,?W_\P\>^DB)P^FY +M,?W_\P\>^DB)P^G!,?W_\P\>^DB)P^G#,?W_\P\>^DB)P^GS,?W_\P\>^DB) +MP^F=,?W_9F8N#Q^$``````!FD/,/'OI(@^\(Z4/W__\/'P#S#Q[Z54B)Y4%7 +M28GW059!54%44TB)^TB#[%AD2(L$)2@```!(B47(2(G008M7"(MP"(U^`3G7 +M#X/C````B==-BR8/ +MA,<```!(@^X$@SXN=>Y,*>9(P?X"A?8/CJ\```!(C7VP3(GZ2(E-J.@?&O[_ +M2(M-J(M5N$B)WTB+=;!(BP%$BT$(2(G!Z#+M``!(BWVP2(7_=`7HI`W]_XM[ +M"$R+`X7_=#2)^$F-%(")^&:0BTK\C7'W@_X!=@F#^2`/A<0```!(@^H$@^@! +M=>.)PD''!)``````B4,(2(M%R&1(*P0E*`````^%QP(``$B#Q%A(B=A;05Q! +M74%>05]=PY!-BR>%T@^%*O___P\?1```1(M!"$6%P'57@\(!2,<#`````&8/ +M;LI(C3R5!````&8/<,'@9DD/?L7HH@G]_TR):PA%BV\(2(D#28LW28G$2(G' +M3(GJZ-8._?]+QP2L?@```.DU____9@\?A```````2(L)3(GF2(G?Z$+L``#I +M&?___P\?1```.<@^./0$``$&#_7\/CIL!``!$B>]( +MB4V(3(E-D$B)=9A$B46DB56HZ!`,_?]!@_Y@BU6H1(M%I$B+=9A,BTV008G% +M2(M-B`^.YP```$&#_GH/CMD```!!@_Y_#X[3````1(GW2(E-B$R)39!(B768 +M1(E%I(E5J.C!"_W_03G%BU6H1(M%I$B+=9A,BTV02(M-B`^$1?___^G5_?__ +M08/^8`^.R_W__T&#_GH/CBD!``!!@_Y_#XZW_?__1(GW2(E-B$R)39!(B768 +M1(E%I(E5J.AG"_W_2(M-B$R+39!(BW681(M%I(M5J$$YQ0^%@/W__T6%[0^% +MXO[__T2)QDB-?;!,B?I(B4VHZ+\7_O](BTVHBU6X2(G?2(MUL$B+`42+00A( +MB<'HTNH``.F;_?__08/N($4Y]0^$H/[__^DP_?__#Q\`18U5X$&#_F`/CI`` +M``!!@_YZ?MM!@_Y_#XX/_?__1(GW2(E-@$R)38A(B7601(E5F$2)1:2)5:CH +MNPK]_T2+59B+5:A$BT6D2(MUD$0YT$R+38A(BTV`#X0[_O__Z^DB)P^D$+OW_\P\> +M^DB)P^D=+OW_D&9F+@\?A```````#Q\`\P\>^E5(B>5!5T%608GV055!5$F) +M_%-(@^Q(2(M_$&1,BRPE*````$R);$!``!(@^\(3(U-J$R-1:Q,B?FZ +M`P```.BX`/__A(-]J%%U_HJ!O^_^D/____#Q\`3(U-J$R-1:Q,B?FZ`P```/_0Z2'^__]F#Q^$```` +M``!!@?C^__\_#X?1*_W_1(G`B5682(T\A00```!$B467]__]!BT4(03E%#'0_28M-`(U0`4R)[\<$@2X```")T,<$@0````!(BW6X +M08E5".BBY0``Z0O____'`P````!!QT4(`````.GN_?__3(GOZ`(3_O]!BT4( +MZ[/H1P;]__,/'OI(B]!B$RA(C9.@````1(GV3(L_Z,+]__]!B<2%P'5C2(V% +ML/[__[H=````1(GV3(G_2,>%L/[__P````!(B<%(B87X_?__28L'2,>%N/[_ +M_P````#_4#!!B<2%P'48#[>%L/[__V:%P'1B9H/X%71*0;P%0`"`2(N]^/W_ +M_^@H2?[_2(M%R&1(*P0E*`````^%M1$``$B-9=A$B>!;05Q!74%>05]=PP\? +M`,9#30'I3____P\?@`````!(BX6X_O__QD-)`4B)@S@!``!(B[WX_?__Z-)( +M_O](C4M(1(GV3(G_N@\```#H[K;__T&)Q(7`=8](C8-``0``B[-0`0``2(M[ +M*$B-2TI(B<)(B87H_?__Z%.L__]!B<2%P`^%8/___TB+>VA(A?]T-0^VD\$` +M``!(BXWX_?__2(VSL````(/R`0^VTNB/.?[_A,`/A"____^`O;#^__\`#X0B +M____BX.X````A<`/A9P```"`N\``````#X4'____@WM8`0^&U`0``$C'A1#^ +M__\`````187M#X7I_O__@'LE``^%W_[__P^V0R2(A>#]__^$P`^$NP$``+\8 +M````Z`L"_?_'0`@`````2(G#2(T%\JP"`$B)`TB)WTC'0Q``````Z+=C_O]( +MB[T0_O__2(7_=`M(BP?_4!`/'T0``$B+A?#]__](B1CI>?[__Y"+4UB#^@(/ +MA%0!```/AQX!``!$B[.0`0``187V#X19____1#GP#X(R!```#X37"P``2(N3 +ML````$2)\$R+NX@!``!$B;70_?__2(F%V/W__TB)E#]__]%,?_K +M"P\?0`!(BY.P````3HLD^DV%Y'0;28L\)$B%_W0%Z!("_?^^$````$R)Y^CE +M`/W_28/'`44Y]W+,BY.X````2(N[L````$B+A=C]__]$BZ7@_?__1"GR2,'B +M`TB--,?HL0+]_T0IL[@```#I4/[__P\?1```1(UP_X/Z!`^%/O[__T6%]@^$ +M-?[__T2)\$B+D[````!(B878_?__Z53___\/'T``1(UP_^O72(M#*$2+LU`! +M``"Z-0```$B+C?C]__],BRA(BX,0`0``QH,``0```$2)]L:#"`$```#'@PP! +M````````3(GOQX,8`0```````,8``$B+@R@!``#&@R`!````QX,D`0`````` +M`,>#,`$```````#&``!(QX6P_O__`````$F+10!(QX6X_O__`````/]0,$&) +MQX7`#X6"`@``#[>%L/[__V:#^!,/A!@)``!FA<`/A6("``!,B[WX_?__3(G_ +MZ'A%_O],B?FZ"0```$2)]DC'A;#^__\`````28M%`$R)[TC'A;C^__\````` +M_U`P08G'A<`/A2,"```/MX6P_O__9H/X$P^$#PH``&:%P`^%`P(``$B+O?C] +M___H'$7^_TB+>RBZ"@```$2)]DB-B]@```#H5-L``(7`#X4D`@``2(M[*$B- +MB^0```"Z"P```$2)]N@TVP``A<`/A00"``!(C8/P````2(M[*+H,````1(GV +M2(G!2(F%R/W__^@*VP``A<`/A=H!``"`>SP`#X5#$0``2(M#*(NS4`$``+H5 +M````2(V-#_[__TB+..BZLO__A<`/A:H!```/MH/!````@WM8`XB%V/W__P^% +M[P@``$B+@[````!(BP"#>`@`#X7;"```13'M0;X!````BX.X````3(L]N<(! +M`$$YQG(NZ9\!```/'X``````2(L"@S@N#X11`0``13'MBX.X````08/&`4$Y +MQ@^#=@$``$B+D[````!$B?!,C03%`````$B+%,*+0@B%P'7!183M#X7S```` +M@+W8_?__`'42BX.X````@^@!1#GP#X38````2(LZ2(7_="%(B97`_?__3(F% +MT/W__^@"__S_2(N5P/W__TR+A=#]__](B=>^$````$R)A=#]___HP/W\_XN3 +MN````$B+@[````!!C78!3(N%T/W__RGR2(TT\$C!X@-*C3P`Z)7__/^+@[@` +M``"#Z`&)@[@```#I.O___XN#D`$``(7`#X0>^___187M#X42^O__@'LE``^% +M"/K__T&\!4``@.G]^?__0;\%0`"`2(N]^/W__T6)_.@00_[_2(N]$/[__TB% +M_P^$V/G__TB+!_]0$.G-^?__BT(,A<`/A/8&``!(BP+'0@@!````3(DXZ;?^ +M__]!B<3KPXMP!(7V=!.#_BX/A9_^__^#>`@`#X65_O__QT((`````,<````` +M`(M""(7`#X2P_O__Z7C^__\/'T``@+W8_?__`'4?A<`/A%$+``!(BY.P```` +M3(MLPOA!@WT(``^$`0X``$C'A2#^__\`````OQ````#H2_K\_\<``````$B+ +M-:[``0!%,?9,C:T@_O__2(F%(/[__XN#N````$B)M2C^__^%P`^$-@T```\? +MA```````187V=#*+A2C^__\YA2S^__\/A`(&``!(BXT@_O__C5`!QP2!+P`` +M`(G0QP2!`````(F5*/[__TB+@[````!,B>]*BS3PZ`;;``"+D[@```!)@\8! +M03G6`O0_^__\`#X6P!@``13'V3(FU4/[__TR)M5C^__^%T@^%A0L``(![ +M4@`/A"T(``"`>R<`#X0C"```13'MOP0```!,B:U@_O__Z&GY_/](BS72OP$` +M@[U8_O__`$B)A6#^___&``!(B;5H_O__#X3V!P``2(N%4/[__TB+`(-X"``/ +MA>('``"#>U@##X78!P``13'V3(V]8/[__T6)]46%]@^%Z`0``$B+A5#^__]( +MB[WX_?__2HL$\$B+,.@6$_[_B[6X_O__3(G_Z.@7_O](B[6P_O__BXUH_O__ +M,+^__]$B>@*A>#^__\/A1$2``!%A/\/A0@2``!,B??H-?O\_TB+O6#^__]( +MA?]T!>@D^_S_BX58_O__A<`/A%P&``!$C6C_2(N]4/[__TG!Y0-.BS0O387V +M="%)BSY(A?]T!>CQ^OS_3(GWOA````#HQ/G\_TB+O5#^__])@^T(28/]^'7, +M2(7_=`7HR?K\_TB-A3#^__](B[4@_O__2(G'2(F%V/W__^AL$?[_@WM8`P^$ +M.04``(N[B````$C'A;#^__\`````B;W0_?__2(/'`>@B]_S_9@]NA=#]__]( +MB[.`````2(F%L/[__TB)P3'`9@]PP.!F#]:%N/[__V8N#Q^$```````/MA0& +MB!0!2(/``832=?&+M3C^__](B[WX_?__Z,\5_O](B[4P_O__BXVX_O__,#]__^$P`^$B````(M#7(/X +M`@^$10P``(7`#X2+"@``@_@##X1.#@``@_@$#X2/#0``BX7X_O__2(N5,/[_ +M_R4`\```/0!````/A"T-``!(C;4P____,<"Y)````$B)]_.K2(G7Z-OX_/^% +MP'4FBX5(____)0#P```]`$```'042(N],/[__^CY^?S_A<`/A8L,``!(B[T8 +M____2(7_#X22`0``QH7@_?__`$4Q]NA"^/S_187V#X2V!P``2(N],/[__TB% +M_P^$?@4``.@D^/S_2(N](/[__TB%_W0?#[:%X/W__XB%T/W__^@&^/S_#[:% +MT/W__XB%X/W__T6%]@^%8@4``("]X/W__P`/A7("``!(BYT0_O__2(7;#X73 +M]/__Z5;S__]F#Q]$``"+A;C^___&@P`!```!P>`0@,R`B8/\````Z=/V__]$ +M#[:KP````(7`#X5,`0``183M#X3&^___QD-1`>F]^___BX5H_O__.85L_O__ +M#X3OY__^_"````$B)E=#]___HT_/\_TB+E=#]__](BSI(A?]T(4B) +ME<#]__](B870_?__Z!'W_/](BY7`_?__2(N%T/W__TB)`L="#`$```#IO?C_ +M_TB+G>#]___I5?C__X![)@`/A4OX__^`N\$`````#X0^^/__Z0WT__]$#[9K +M5$4Q]NDA]___2(NUV/W__TB-N\@```#HS`'^_X"]#_[__P`/A#`"``!(B[TP +M_O__2(7_#X2V!@``Z(KV_/](B[T@_O__13'V2(7_#X5L_O__Z8_^__^+A;C^ +M___&@P`!```!B8/\````Z>+U___&A>#]__\!Z87[__](B[U@_O__OO\!``#H +MC?/\_T&)P(7`#X6?!```183M#X18^O__2(VU,/___S'`N20```!(BY5@_O__ +M2(GW1(F%V/W___.K2(G7Z%#V_/]$BX78_?__ACH\?S_2(N],/[__TF)QDB%_W0%Z#3U_/], +MB;4P_O__1(FM//[__^E"^___2(N]8/[__TB%_W0%Z!#U_/^+A5C^__](B[U0 +M_O__A<`/A"CZ__]$C6C_2<'E`TZ+-"]-A?9T(4F+/DB%_W0%Z-WT_/],B?>^ +M$````.BP\_S_2(N]4/[__TF#[0A)@_WX=C]___HL/7\_X7` +MBY7H_?__=0A!QT<0_____TB+O?C]__]$B?8QP.C-]/S_08E'$(/``0^$\`8` +M`(![2@#&0T\!#X1!!```3(NS0`$``$F-1O](/?X/```/A@H)```/MD,]B(7@ +M_?__A,`/A!@$``"`>TD`#X48!```28'^`!````^'A@,``$F+10!,B>__4`A( +MB[T0_O__2(7_=`9(BP?_4!!-B>Y)BT4`3(FU$/[__TR)[_]0"$B+NV`!``!( +MA?]T!DB+!_]0$$R)JV`!``!%,?;&A>#]__\`28M%`$R)[_]0$$B+O3#^__]( +MA?\/A8SZ___IC/K__^BK\?S_#[:%X/W__TB+O2#^__^(A=#]__](A?\/A8/Z +M__]%B?3I)O3__S'`OP@```!(B86P_O__Z!/O_/](BQ6@"*=&#P`$YR`]'P0'0BAW`/[_BX.X````C5`!B9.X````2(N3L````$R) +M+,)(B[VP_O__2(7_#X3=\___Z)CQ_/_IT_/__^A.[OS_1(L`187`#X1""``` +M#XY*^___10^WP$&!R````(CI.OO__XG0B978_?__3(T\Q0````!,B?_H].W\ +M_XN5V/W__TB)A5#^__]%,?:)E5S^__](BX.P````OQ````!*BS0P2(FUV/W_ +M_^CR[_S_2(NUV/W__TB)QTF)Q>C`__W_BX58_O__2(N-4/[__TF#Q@B-4`&) +ME5C^__],B2S!33GW=:^%T@^$]//__X"[P``````/A?OS__](B[U0_O__3(ML +MU_A-A>UT&TF+?0!(A?]T!>BY\/S_OA````!,B>_HC._\_X.M6/[__P$/A*[S +M___IO?/__TB-O6#^___H#OK]_XN%:/[__^D-^?__@+W@_?__``^$M_G__TB+ +MO3#^__](A?\/A-W[___H8?#\_TB+O2#^__](A?\/A.#Z___&A=#]__\!13'V +MZ3?X__^`O0_^__\`#X7;^?__13'_3(F]4/[__TR)O5C^___I+O/__TB+N\@` +M``#H,^W\_TB+O3#^__](A?\/A'K[___H_N_\_TB+O2#^__](A?\/A'WZ__\/ +MMH7@_?__13'VB(70_?__Z<[W__](B[T@_O__2(7_#X3F]___Z,3O_/_IW/?_ +M_T&#?0P`#X1]`P``28M%`$''10@!````2,<`7P```.G<\?__2(N#6`$``$R) +MLT@!``!,B?:+>!#HX^S\_X7`#Y1#2W0A2(N5V/W__TB--!#HE^W\_TB%P'0A2(N5V/W__TB- +M-0:D`0!(B=_H',W__T&)QH7`#X52_/__@'M)``^$]?O__TF+10!(C14\NO[_ +M2(NS.`$``$B+0"!(.=`/A?@"``!!BWT0,=+H/>W\_TB#P`$/A<'[___HGNO\ +M_\:%X/W__P%$BS!%A?8/A,`"```/CO;[__]%#[?V08'.````B.GF^___N6,` +M``"Z&0```$2)]DR)[TR-@P@!``#HZ7`!`+ED````NAH```!$B?9,B>],C8,@ +M`0``Z,UP`0#I@.[__TB-%,4`````3(GY3(GO2(FUV/W__^A^[_S_2(NUV/W_ +M_TB)]^A/[OS_Z5G\__^+E3C^__](BXTP_O__A=(/A+D*``")T$B-1`'_ZPU( +M.<$/A*<*``!(@^@!@#@O=>XIR(/``3G0#T;008G528U]`4V)[^BAZOS_2(NU +M,/[__TF)QDR)ZDB)Q^@L[/S_0\8$+@!$B?I,B?9,C:U0_O__1(N%(/___TB+ +MC1C___],B>_HA/?]_TR)]^B\[?S_,=*^9````$R+$(2`.-V/[__TCW]DAIR8"6F`!(`<%)BP:`>TH`2(F-0/[__TR+>"AU"3'_ +M2(F]Z/W__X"[^P````!U"3'V2(FUR/W__TB+@Z`````QR;\0````2(F-8/[_ +M_TB)A<#]___HW>G\_S'22(LU1+`!`$B-O6#^__](B85@_O__B1`QTDB)M6C^ +M__],B>[HXPK^_TB-A1C^__],B?=,BXW(_?__3(N%P/W__U!(BXWX_?__2(V5 +M0/[___^UZ/W__TB+M6#^__]!_]=(B[U@_O__08G&05]82(7_=`7HQ>S\_T6% +M]@^%80(``(.]&/[__P4/A^\0_?^+A1C^__](C15"O0$`2&,$@D@!T#[_X$B+ +MO1C___]%,?9(A?\/A3[T___I"OS__^@[Z?S_BS"%]@^$D0```'X)#[?V@?\_V8/;H7X_?__2(NU,/[__TB)A4#^ +M__](B<(QP&8/<,#@9@_6A4C^__\/M@P&B`P"2(/``83)=?%(C85`_O__2(G' +M2(F%H/W__^@(O?[_A,`/A0<#``!(B[78_?__2(G?Z)$U`0!!B<:%P'4&0;X% +M0`"`2(N]0/[__TB%_W0%Z)/J_/](B[T8____2(7_#X4\\O__Z47R__](B[W8 +M_?__Z+*\_O^$P`^$]@8``,9#3`'I`/+__T&^!$``@$B+O5#^__](A?\/A*W^ +M___H1NK\_^FC_O__#[:#``$``(3`#X3G]O__BY/\````B=&!X0```/"!^0`` +M`*!T"X#F!`^$R/;__S'`B$-.3#NS<`$``'0Z2(N[:`$``$B%_W0/Z/3I_/]% +M,@"*=&#P`$Y +MR`]'P8T,$$&)STC!X0-(B<](B8W0_?__Z`[E_/])B<6+@[`!``!(B[.H`0`` +M2(N-T/W__X7`#X5`!0``2(7V#X55!0``3(FKJ`$``$2)N[0!``"_2````.C^ +MYOS_2(NU^/W__TB)QT4QVTF)Q;D.````\Z6+O=C]__],B5@X28G_2(/'`>BA +MY/S_9D$/;L])B44X2(G",_H]L0``$B+O6#^__](A?]T!>@%Y_S_2(NUH/W__TR)[^C&DO__ +M2(NUV/W__TR)[^BWDO__2(M[8$B+M5#^__](BP?_4#A(B[U0_O__08G&2(7_ +M=`7HPN;\_T6%]@^%%?S__^D*_/__0;X%0`"`Z5C___^X_____T4Q[;\$```` +M2(F%8/[__TR)K9C^___H*>/\_TB+-9*I`0#&``!(C;V8_O__2(F%F/[__TB) +MM:#^__](B[7H_?__QX6H_O__M@$``.CD\/W_B[U@_O__1(NMJ/[__X/__W03 +MZ$WH_/^%P'4*QX5@_O_______TB+O>C]__]$B>J^P0```#'`Z&GG_/^)A6#^ +M__],B[68_O__08G'@_C_#X0Y`@``2(N]R/W__[JV`0``,?8QP,>%4/[_____ +M___&A53^__\`Z"KG_/^)A;S]__]%,>V)A5#^__^#P`$/A!0!``!(C;T8_O__ +MN@```0"^@````.@\X_S_A<`/A1T,_?](BXT8_O__3(VM4/[__TB%R0^$!@S] +M_TB)G?C]__](B +M13')3(FUL/W__T2)_T2)I;C]__])B=])B<9(B<-,B:VH_?__28GT38G-ZQ4/ +MA.X```!)`<1)`<5(*<,/A-\```"X``!``$R)YHF]G/W__T@YPT@/1L-(B<+H +M`^+\_XN]G/W__TB%P'G#3(GY3(NUL/W__T2+I;C]__]!B?](BYWX_?__3(NM +MJ/W__^G$````2(G92(N=^/W__T&]`0```$B)S^@IY/S_B[V\_?__Z+[F_/]- +MA?9T"$R)]^BAY/S_1(G_Z*GF_/]%A>T/A!C]__],B[W(_?__2(VU,/___TR- +MK5#^__],B?_HL^7\_X7`#X7Z_/__3(G_Z-/A_/^%P`^%ZOS__TB+O4#^__]( +MA?\/A.KK___H1N3\_^G@Z___3(GR38GI3(G[3(NUL/W__T2+I;C]__],BZVH +M_?__08G_3#G*#X24_O__2(G92(N=^/W__TB)S^AUX_S_B[V\_?__Z`KF_/]- +MA?9T"$R)]^CMX_S_1(G_Z/7E_/],B[W`_?__2(N]Z/W__T6+-^A?Y?S_18DW +MZ5;\__]-A?8/A$;\__],B??HMN/\_^DY_/__QT-<`P```$B+O5#^__](A?]T +M!>B9X_S_BT-](B;70_?__Z!CD_/](B[70_?__2(GWZ.GB +M_/_IGOK__XG'2(/'`>AYW_S_3(GW2(F%T/W__^C*XOS_2(N%T/W__XNUV/W_ +M_TB)A>C^__])B<:)M?3^___IB/G___,/'OKI`@?]__,/'OI(B`;]__,/'OI(B^E5(B>5!5T%6055!5%-(@^QX9$R+-"4H````3(EUR$4Q]DB# +M?W``#X0>`0``28G\OQ````!!B?>)T\:%;____P!!BQP``````3(EU +MB$B)18!(QT60`````$C'19@`````Z&C9__]!B<:%P`^$[0$``(M%F$B+?9"% +MP'1$C5C_2,'C`V9F+@\?A```````3(LD'TV%Y'0?28L\)$B%_W0%Z$G@_/], +MB>>^$````.@@DX/S_2(M]@$B%_W0% +MZ!;@_/],BXUP____387)=`A,B<_H`N#\_TB+1@CC32` +M`?8I\8/!,$&(3#@!B=F)PX/Y8W?5@\,P28T$$$R)TD&)&P\?A```````#[8( +M2(/H`4B#P@2)2OQ).\"`(7` +M#X47`0``13'VZ9;^__\/'T0``(/#,$&)&^N@#Q^$``````!(C;UP____3(G^ +MZ.'P_?])BT0D*$B-C6____^)WKH/````2(LXZ$:1__]!B<:%P`^%WOW__XM% +MF$B+?9"%P'1!C5C_2,'C`V8/'X0``````$R+-!]-A?9T'DF+/DB%_W0%Z"K> +M_/],B?>^$````.C]W/S_2(M]D$B#ZPA(@_OX=<](A?]T!>@%WOS_2(M]@$B% +M_W0%Z/?=_/],BXUP____1`^VM6_____I`____P\?`$R)SDB-7_!(@<=8`0`` +MZ%WO_?]$B?)$B>Y(B=_H/QX``$&)QNFA_?__#Q^``````$R)R42)\D2)[O_0 +M3(N-H,2(UW`8/B#P^V%!&(%[H&````C4H"18G!18G"18G# +M0=/A1(G)(<&#^0$9R8/ANX/!@(2(TU_;$!`&:)5Q%(C5M(B?A(B0(QP(.',`$```'##Q\`,M(C4<02(D",<"#AS`!```!PV8N#Q^$```````QP$B- +M#1>J`0`/'X``````1`^V'`%$.!P&=1M(@\`!2(/X$'7K2(U'&$B)`C'`@X

^DC'`@`````QP$B-#6R,`0!F9BX/'X0````` +M`&9F+@\?A```````9@\?1```1`^V!`%$.`0&=25(@\`!2(/X$'7K2(U'Z$B) +M`C'`@X<8`0```<-F+@\?A```````,M(C4?X2(D",<"#AQ@! +M```!PV8N#Q^$```````QP$B-#?>H`0`/'X``````1`^V'`%$.!P&=1I(@\`! +M2(/X$'7K2(GX2(D",<"#AQ@!```!P[@"0`"`PP\?1```\P\>^DC'`@`````Q +MP$B-#4R+`0!F9BX/'X0``````&9F+@\?A```````9@\?1```1`^V!`%$.`0& +M=25(@\`!2(/X$'7K2(U'\$B)`C'`@X<@`0```<-F+@\?A```````,M(B?A(B0(QP(.'(`$```'##Q\`,^HN',`$``(/``8F',`$``,-F9BX/'X0``````)#S#Q[ZBX<8 +M`0``@\`!B8<8`0``PV9F+@\?A```````D/,/'OJ+AR`!``"#P`&)AR`!``## +M9F8N#Q^$``````"0\P\>^HL%:ND"`(7`=0HQP,,/'X``````N`1``(##9I#S +M#Q[Z@+_Y`````'4S2(-_0`!T+(!_2`!U)DB%]G0Q2(L&QH?X`````4B)1Q!( +MA=)T#DB+`DB)A_`````/'T``BP4.Z0(`AS!(A?]T"%I; +M7>FEU_S_6%M=PY#S#Q[Z54B!QR`!``#&1_H!2(GEZ.CI_?\QP%W##Q]``/,/ +M'OI52(''&`$``,9'^@%(B>7HR.G]_S'`7<,/'T``54B)Y4%7059!54%44TB# +M[$B+1T!(B7V@2(M_.(7`='Y$C6#_2<'D`TZ++"=-A>UT8T&+10A)BWT`A@&U_S_3(GWOA````#HV=7\_TF+ +M?0!(@^L(2(/[^'7/2(7_=`7HX=;\_TR)[[X8````Z+35_/](BT6@2(MX.$F# +M[`A)@_SX=8I(A?]T!>BXUOS_2(M-H(M!,$B+>2B%P'1^1(U@_TG!Y`-.BRPG +M387M=&-!BT4(28M]`(7`=#B-6/](P>,#3(LT'TV%]G0>28L^2(7_=`7H;];\ +M_TR)][X0````Z$+5_/])BWT`2(/K"$B#^_AUSTB%_W0%Z$K6_/],B>^^&``` +M`.@=U?S_2(M%H$B+>"A)@^P(28/\^'6*2(7_=`7H(=;\_TB+3:"+02!(BWD8 +MA<`/A%D'``"#Z`%(P>`#2(E%F$B+19A(BPP'2(E-L$B%R0^$)@<``(M!0$B+ +M>3B%P'1\1(U@_TG!Y`-*BQPG2(7;=&&+0PA(BSN%P'0X1(UH_TG!Y0-.BS0O +M387V=!U)BSY(A?]T!>BJU?S_3(GWOA````#H?=3\_TB+.TF#[0A)@_WX==!( +MA?]T!>B&U?S_2(G?OA@```#H6=3\_TB+1;!(BW@X28/L"$F#_/AUC$B%_W0% +MZ%W5_/](BTVPBT$P2(MY*(7`#X2#````1(U@_TG!Y`-*BQPG2(7;=&B+0PA( +MBSN%P'0_1(UH_TG!Y0,/'X``````3HLT+TV%]G0=28L^2(7_=`7H"M7\_TR) +M][X0````Z-W3_/](BSM)@^T(28/]^'702(7_=`7HYM3\_TB)W[X8````Z+G3 +M_/](BT6P2(MX*$F#[`A)@_SX=85(A?]T!>B]U/S_2(M-L(M!($B+>1B%P`^$ +ML`4``(/H`4C!X`-(B47`2(M%P$R++`=-A>T/A($%``!!BT5`28M].(7`#X2* +M````@^@!2,'@`TF)QP\?0`!*BQP_2(7;=&.+0PA(BSN%P'0^@^@!3(TTQ0`` +M``!FD$Z+)#=-A>1T'DF+/"1(A?]T!>@YU/S_3(GGOA````#H#-/\_TB+.TF# +M[@A)@_[X=<](A?]T!>@5U/S_2(G?OA@```#HZ-+\_TF+?3A,B?A(@^@(28G' +M2(/X^'6$2(7_=`7HZM/\_T&+13!)BWTHA<`/A(8```"#Z`%(P>`#28G'2HL< +M/TB%VW1CBT,(2(L[AAHTOS_08M$ +M)#!)BWPD*(7`#X24````@^@!2(TC>T?S_ +M3(G_OA@```#HL=#\_TF+?"0H2(/K"$B#^_AU@DB%_W0%Z+C1_/]!BT0D($F+ +M?"08A<`/A"\"``"#Z`%(P>`#2(E%N&9F+@\?A```````2(M%N$B+'`=(A=L/ +MA/4!``"+0T!(BWLXA<`/A*8```"#Z`%(P>`#2(E%J`\?1```2(M%J$R+-`=- +MA?9T=D&+1@A)BSZ%P'10@^@!3(T\Q0````!F9BX/'X0``````&:02HL4/TB% +MTG0E2(LZ2(7_=`U(B57(Z!;1_/](BU7(2(G7OA````#HY<_\_TF+/DF#[PA) +M@__X=CNT/S_3(GWOA@```#HP<_\_TB+>SA(@VVH"$B+1:A(@_CX +M#X5J____2(7_=`7HP-#\_XM#,$B+>RB%P`^$IP```(/H`4C!X`-(B46H9@\? +M1```2(M%J$R+-`=-A?9T=D&+1@A)BSZ%P'10@^@!3(T\Q0````!F9BX/'X0` +M`````&:02HL4/TB%TG0E2(LZ2(7_=`U(B57(Z%;0_/](BU7(2(G7OA````#H +M)<_\_TF+/DF#[PA)@__X=@NT/S_3(GWOA@```#H`<_\_TB+>RA( +M@VVH"$B+1:A(@_CX#X5J____2(7_=`7H`-#\_XM3($B+>QB%TG1!@^H!3(T\ +MU0````!F+@\?A```````3HLT/TV%]G093(GWZ&_X__],B?>^2````.BBSOS_ +M2(M[&$F#[PA)@__X==1(A?]T!>BJS_S_2(M["$B%_W0%Z)S/_/](B=^^2``` +M`.AOSOS_28M\)!A(@VVX"$B+1;A(@_CX#X7G_?__2(7_=`7H;<_\_TF+?"0( +M2(7_=`7H7L_\_TR)Y[Y(````Z#'._/])BWT82(-MD`A(BT602(/X^`^%&OS_ +M_TB%_W0%Z##/_/])BWT(2(7_=`7H(L_\_TR)[[Y(````Z/7-_/](BT6P2(MX +M&$B#;<`(2(M%P$B#^/@/A5OZ__](A?]T!>CPSOS_2(M%L$B+>`A(A?]T!>C> +MSOS_2(M]L+Y(````Z+#-_/](BT6@2(MX&$B#;9@(2(M%F$B#^/@/A;+X__]( +MA?]T!>BKSOS_2(M%H$B+>`A(A?]T$TB#Q$A;05Q!74%>05]=Z8O._/](@\1( +M6T%<05U!7D%?7<-F9BX/'X0``````)!52(GE05=!5D%505132(/L&(M'"$B) +M?T/A,4!``!!BT5028M]2(7`#X2$````1(U@_TG!Y`,/'X`````` +M2HL<)TB%VW1BBT,(2(L[AC*S?S_3(G_OA````#HGBFS?S_ +M2(G?OA@```#H>,#9F8N#Q^$```` +M```/'P!,BR0?387D=!E,B>?H3_7__TR)Y[Y(````Z(++_/])BWTH2(/K"$B# +M^_AUU$B%_W0%Z(K,_/])BWT82(7_=`7H?,S\_TF+?0!(A?]T!>ANS/S_3(GO +MOE@```#H0DOS/S_2(/$&%M!7$%=05Y!7UW#54B)Y4%528G]05132(/L +M"(M'"$B+/X7`=$B-6/](P>,#9F8N#Q^$```````/'T``3(LD'TV%Y'0?28L\ +M)$B%_W0%Z-G+_/],B>>^&````.BLROS_28M]`$B#ZPA(@_OX=\$#[84$8@0=>J+1:A(C7V@A +M^DB)P^EM\/S_#Q]$``!52(GE05=)B?>^`0```$%6055,C2U2?@$`051)B=2Z +M`@```%-(B?M(@>RX````9$R+-"4H````3(EUR$F)SDB+#TR)[^CWROS_2(L+ +MN@H```"^`0```$B-/?M]`0#HWLK\_TR)_DB)W^AS\?W_2(LSOPH```#HMLC\ +M_TV%]G0&28,^_W5+387D=!Y,C;5P____,% +M,/___P````"_!````.@;Q?S_38LV2(L5@8L!`$B)A3#____&``!,B?!(P>@@ +M2(F5./___P^$DP4``$R)\3'_2(UUL$FXS>P$`9@\?A```````08U``8`\`@!) +MBH#3(T,DDT!R4PI +MR(/`,(@$/DB)R$B)T4B#^&-WTX/!,$B-!#Y(C95Q____B(UP____9F8N#Q^$ +M``````!F9BX/'X0``````&8/'X0```````^V"$B#Z`%(@\(!B$K_2#G&=>W& +MA#UQ____`$4Q]H"]^)QDR) +M_^B5W_W_BX4X____2(V53/___T@#A3#___]F9BX/'X0``````&8/'T0```^V +M"DB#P@%(@\`!B$C_A,EU[D0#M3C___]$B;4X____1#NU//___P^$6P$``$B+ +ME3#___]!C4X!0L8$,BG&!`H`B8TX____2(L+N@(```"^`0```$R)[^A4Q?S_ +M2(L+N@H```"^`0```$B-/6-X`0#H.\7\_TB+,TB+O3#____H;,+\_TB+,[\* +M````Z`_#_/](B[TP____2(7_#X14^O__Z"K#_/_I2OK__P\?1```2(L+3(GO +MN@(```"^`0```.CKQ/S_2(L+N@H```"^`0```$B-/05X`0#HTL3\_TB+,TR) +M]^@'POS_2(LSOPH```#HJL+\_^D=^O__#Q]$``"X1P```+D>````Z8C\__^0 +M2(VU4/___T2)]^@!R_W_Z1?[__\/'T``2(VU?O__P\?1```N$T```"Y%````.DP_/__9@\? +MA```````3(G_Z-C+_?]$B[4X____Z0G^__\/'T``3(G_Z,#+_?]$B[4X____ +MZ9'^___H+\'\__,/'OI(BG\_P\?`%5(B>5!54&)U;H%````051)B?2^ +M`0```%-(B?M(@^P(2(L/2(T]('IV`0!(BPA(B```/'T0``$B) +M=>CHI\S]_XM#"$B+=>CKEV9F+@\?A```````#Q\`568/;P6W@P$`2(GE0593 +M2(G[2(U_&$C'1_@`````#Q%'Z.@)R_W_2(U[*.B0S?W_6T%>7_H_+W\_TF- +M3!T`2(G:OB````!(B<_HY[W\_TB)VKX(````2(G!2`'92(G/Z-&]_/](`M)BT0D.$&)7"1X28M\)'!(BS#H(;_\_T6$]G4D0<=$)&@`````28M$ +M)&#&``!(@\0(6T%<05U!7D%?7<,/'T``28M$)#A(BSCH&[_\_^O-9@\?A``` +M````08'__O__/P^'D^?\_T2)_TB#QP'H1[S\_TF+?"1PQ@``28G%2(7_=`7H +MDK_\_TV);"1P18E\)'SI)____Y!FD/,/'OI52(GE05=!5D%53(TM>]`"`$%4 +M08GT4TB)^TR)[TB#[#AD3(LT)2@```!,B77(08G6Z,:__/]%A>1U44B#>V`` +M=`J`>V@`#X3@````BP4>T`(`A<`/A7`#```QVTR)[^@XO?S_2(M%R&1(*P0E +M*`````^%70,``$B#Q#B)V%M!7$%=05Y!7UW##Q]``+@!````\P]OB[`!``!( +M@[L(`0```&9(#V[`9@]LP&8/U,$/$8.P`0``=)5(@WM@`'04@'MH`'4.2(U[ +M*+X!````Z!K^__](BX,``0``2(7`=`A(BSCHYKW\_[\$````2,=%L`````#H +M)+O\_TB+%8V!`0!(B46P2(E5N,8``$&#_`D/A\4"``!(C15AD`$`1(G@2&,$ +M@D@!T#[_X`\?0`!(BT-`QT-(`````,8``$B+0U#'0U@`````QP``````2(-# +M.`'I]_[__P\?@`````!,C35O1!@#X`=!+S\_TB+?;!(A?\/ +MA.O]___H%KW\_^GA_?__D$6%]DR-!6]R`0!(C06/>P$`20]$P$F)QNGC_O__ +M#Q\`3(TUD'(!`.G4_O__#Q]``$R--8]R`0#IQ/[__P\?0`!,C36-<@$`Z;3^ +M__\/'T``187V3(T%*G(!`$B-!6][`0!)#T3`28G&Z9/^__\/'P!,C34I<@$` +MZ83^__\/'T``3(TU>7L!`.ET_O__#Q]``$R--?AQ`0#I9/[__P\?0`!(BX,( +M`0``N@,```"^`0```$B-/>5O`0!(BPCH,+[\_TB+NP@!``!(C;-H`0``Z)WC +M_?_I[?[__P\?A```````13'_2(T5,70!`&8/'T0``$&-1P&`/`(`28G'=?.) +MQDB)?:CHJ-?]_TB+?:B+1;A(C14%=`$`2`-%L&8/'T0```^V"DB#P@%(@\`! +MB$C_A,EU[KX*````1`%]N.APU_W_BW6X1(GG2`-UL.@1Q/W_2(M]L$@I^(E% +MN.E*_O__NP1``(#IB/S__^BCNOS_13'VZ8O]__^09BX/'X0``````/,/'OI5 +M2(GE0513B?-(@^P0A?9U&XL%:SHV\S]_XM5[$B#Q!")WDR)YUM!7%WIMOO__V8/'T0` +M`+L$0`"`Z[AF#Q^$``````#S#Q[Z54B)Y4%44XGS2(/L$(7V=1N+!?G+`@"% +MP'5!2(/$$(G86T%<7<-F#Q]$``!,C6?P2(G.2(''6`$``(E5[.AJS/W_BU7L +M2(/$$(G>3(GG6T%<7>E%^___#Q]$``"[!$``@.NXD`\?A```````\P\>^E5( +MB>5!5T%628G.055)B=5!5$F)]%-(B?M(@^Q82(M%&$R+?1!,B46H3(E-F$B) +M1:!D2(L\)2@```!(B7W(2(T]=\L"`.CBNOS_BP50RP(`B464A<`/A=D#``!( +M@WM@`'0*@'MH``^$-`,``$B+@P`!``!(A<`/A$(#``!(BSCH>+G\_TB+DP`! +M``!(A=(/A"H#``!(BS*_"@```$B)58CHU[G\_TB+58B^`0```$B-/1]Y`0!( +MBPJZ+0```.C*N_S_3(GJ3(GQ3(GF2(N[``$``.AU\/__NAP```!(BX,``0`` +MO@$```!(C3V8;P$`2(L(Z)6[_/](BU682(MUJ$R)^4B+NP`!``#H/O#__TR+ +MJP`!``!-A>UT&DF+30"Z`@```+X!````2(T]=6\!`.A8N_S_3(L]@7P!`$R- +M)3K-`@!,C76P387M="-)BTT`ND,```"^`0```$B-/:1X`0#H)[O\_TF+?0#H +MCKC\_[\$````2,=%L`````#HS+7\_TR)?;A(B46PQ@``ZQH/'X``````2(MU +ML(U*`8@$%HG(Q@0&`(E-N$F+/"3HO+G\_X/X_W0GA,`/A`\!```\"G0;BU6X +M.56\=)1:CH6,+]_XM5N(M%J.NX28L\).B'NOS_2(M]L(7`#X6)`@`` +MBT6X2(G"2(U$!_^)T872#X0X`0``9@\?1```#[8P1(U&]T&`^`%V"D"`_B`/ +MA5D!``!(@^@!@^D!=>")R,8$!P!(BWVPB4VX#[8'C5#W@/H!=@0\('562(GX +M9F8N#Q^$``````!F#Q]$```/ME`!2(/``8UR]T"`_@%V[X#Z('3J28G`22GX +M.?AT(HU1`42)QDR)1:A$*<)(`?[H^[C\_XM-N$R+1:A$*<&)3;A(BWVPA05]=PP\?1```#[8'C5"_@/H9#X:C````@^AA/!AWCDB- +M%:.)`0`/ML!(8P2"2`'0/O_@#[8'C5#W@/H!#X85`0``/"`/A`T!```/'X`` +M````28L\).CWM_S_A<`/A;D```"+3;A(BWVPZ3'___\/'P`YT0^%J/[__P^V +M!XU0]X#Z`0^&M?[__SP@#X2M_O__Z0K___](C7LHO@$```#H;O;__TB+@P`! +M``!(A<`/A;[\__]%,>WI;OW__X#Z&`^'Z?[__TB-#6*)`0`/MM)(8P212`'( +M/O_@Z,2V_/^X!````$B+3:")`4B+@P`!``!(AAXMOS_NP1``(#I +MH?[__^AIMOS_N`,```#KH^A=MOS_N`(```#KE^A1MOS_N`$```#KBS')Z=_] +M__](BX,``0``2(LXZ(2U_/_KF\=%E`<```!(A?\/A%#^___H';;\_XM%E(/X +M!@^'/_[__TB-%?J(`0!(8P2"2`'0/O_@Z/NT_/\QP.DU____\P\>^DB)P^G. +MW?S_#Q^$``````#S#Q[Z54B)Y4%63(TUW\8"`$%5051)B?132(G[3(GWZ#RV +M_/^+%:K&`@"%T@^%S@```+@!````\P]OB[`!``!(@WM@`&9(#V[`9@]LP&8/ +MU,$/$8.P`0``=`J`>V@`#X2$````2(N#``$``$B%P'0(2(LXZ+BT_/],BZL( +M`0``387M=$%)BTT`N@<```"^`0```$B-/1IK`0#H(K?\_TR)YDR)[^B7V_W_ +MOPH```!(BS#H^K3\_TB+@P@!``!(BSCH:[3\_XL%"<8"`(7`=3$QVTR)]^@G +ML_S_B=A;05Q!74%>7<,/'T``2(U[*+X!````Z%KT___I:?___P\?1```NP1` +M`(#KRI`/'X0``````/,/'OI52(GE059!54&)U4%428GT4TB)^TB!QU@!``#H +M/,;]_XL5FL4"`,:#-`$```&%T@^%]P```#'`2(.#>`$```%,B[,``0``9HF# +M-0$``$B+0V!(QX.X`0```````$B%P`^$EP```(![:``/A8T```!,.?`/A)0` +M``!-A?9T6DF+-K\*````Z!*T_/]%A.U(C04S:@$`28LV2(T].VH!`$@/1?CH +M1;/\_TB+NP`!``!,B>;HEMS]_TB+@P`!``"_"@```$B+,.C2L_S_2(-[8`!T +M%H![:`!U$$B->T!(C34,:@$`Z'6^_?\QP%M!7$%=05Y=PV8N#Q^$``````!- +MA?8/A7C____KX`\?1```2(U[*#'VZ"7S__],B[,``0``387V#X56____ZZ$/ +M'P"X!$``@.NV9@\?A```````\P\>^DB#[PCIL_[__Y!FD/,/'OI52(GE0513 +M2(M'8$B)^TR+IP`!``!(AV``=`J`>V@`#X1J`0``2(N# +M``$``$B%P'0(2(LXZ*:Q_/]%A>0/A94```!(@[NX`0````^$=P$``$B+@P`! +M``!(@X.0`0```4B%P'0T2(LPOPH```#H[K'\_TB#N[@!````#X7``0``2(N# +M``$``$B%P'0-@+LW`0````^%EP$``(L%Y<("`(7`#X79`@``13'D3(GOZ/ZO +M_/](BT789$@K!"4H````#X7&`@``2(/$4$2)X%M!7$%=05Y=PP\?`$&!_`1` +M`(!TR4&!_!P``(ATP$R+LP@!``!(@X.0`0```4V%]G2;28LVOPH```#H5;'\ +M_TF+#KH'````O@$```!(C3U$9P$`Z$RS_/],B[,(`0``08'\#@`'@`^$&`(` +M`$B-?9!$B>;HW.G]_TB+=9!,B??HH-?]_TB+?9!(A?]T!>@RL?S_2(N#"`$` +M`+\*````2(LPZ.ZP_/](BX,(`0``2(LXZ%^P_/_I$____V8N#Q^$``````!( +MC7LHO@$```#H8O#__TB+0T#'0T@`````Q@``2(M#4,=#6`````#'``````#I +M9/[__V8/'T0``("[-0$````/A7S^__^`NS8!````#X1>`0``2(.#F`$```%, +MBZ,``0``387D#X2?_O__28L,)+H0````O@$```!(C3V\9@$`Z%RR_/])BS0D +MOPH```#H/K#\_^E9_O__9@\?A```````2(LXZ*BO_/_I7/[__P\?`$R+HP`! +M``"^`0```+H2````2(T]A&8!`$F+#"3H#[+\_TB+B[@!```Q]DB-?W&1#6A`$R-=:!)BS0D3(GWZ(BN +M_/])BS0DOPH```#H*J_\_^E%_?__#Q]$``!(@X.``0```>F=_O__#Q\`28L. +MNA\```"^`0```$B-/^DB#[PCI(_S__Y!FD/,/'OI(@W]``'0E@'](`'4?54B#QPB^`0`` +M`$B)Y>@=[O__,@*K/S_@+TN____``^%A0```$V%_W0528LWOPH```#HNZO\_TF+/^@S +MJ_S_@+TO____``^$(`$``$B+/9^_`@#HBJW\_X7`#X46`0``2(L]B[\"`.AF +MK/S_AE=_?__#Q^$``````!(C7\( +MO@$```#H\NK__^G&_?__#Q]$``!(BY4(____B[T4____O@(```#H4:O\_^E? +M____#Q]``(N]%/___TB-58"^`@```&8/;X5`____#RE%@&8/;X50____@V6, +M]P\I19!F#V^%8/___P\I1:#S#V^%;/___P\11:SH`*O\_\:%+O___P'I\?W_ +M_P\?0`"Z`0```.G(_O__9@\?1```2(N5&/___XNU./___TB+O3#____HM]0` +M`.FW_O__2<=%``````"X#@`'@.G,_/__N`1``(#IPOS__[A7``>`Z;C\__^X +M!4``@.FN_/__Z)VI_/_S#Q[Z2(G#Z;_2_/^0\P\>^E5(B>5!54F)]4%43(TE +MBKL"`%-(B?M,B>=(@^P(Z.JJ_/](C7L@3(GNZ,[[__],B>>)P^ATJ/S_2(/$ +M"(G86T%<05U=P_,/'OI(B^E5(B>5!54F) +M]4%43(TE*KL"`%-(B?M,B>=(@^P(Z(JJ_/](C7L(3(GNZ&[[__],B>>)P^@4 +MJ/S_2(/$"(G86T%<05U=P_,/'OI(B^E4Q +M]DB)Y5-(B?M(@^P(Z"GI__](B[O(````2(7_=`7HJ*G\_TB+N[@```!(A?]T +M!>B7J?S_2(N[J````$B%_W0%Z(:I_/](B[N`````2(7_=`7H=:G\_TB+>W!( +MA?]T!>AGJ?S_2(M[8$B%_W0%Z%FI_/](BWM02(7_=`7H2ZG\_TB+>RA(A?]T +M!>@]J?S_2(M[&$B%_W042(M=^,GI*JG\_V8N#Q^$``````!(BUWXR<-F+@\? +MA```````\P\>^E5(C07$2@(`2(GE4TB)^TB#[`A(B0=(B[\``0``2(7_=`7H +MY:C\_TB->PA(BUWXR>D'____D&8/'T0``/,/'OI52(T%A$H"`$B)Y5-(B?M( +M@^P(2(D'2(N_``$``$B%_W0%Z*6H_/](C7L(Z,S^__](B=](BUWXOA`!``#) +MZ6JG_/]F+@\?A```````\P\>^E5(C04<2P(`9D@/;LA(@\!H9D@/;M!(@\`P +M2(GE4TB)^TB#[`A(B4<@\P]^!2-7`@!F#VS!#Q$'\P]^!1Q7`@!F#VS"#Q%' +M$$B+OV@!``!(A?]T!>@CJ/S_2(N[6`$``$B%_W0%Z!*H_/](B[M(`0``2(7_ +M=`7H`:C\_TB+NS@!``!(A?]T!>CPI_S_2(N[(`$``$B-!:))`@!(B4,@2(7_ +M=`7HU*?\_TB->RA(BUWXR>GV_?__9@\?1```\P\>^E5(C05<2@(`9D@/;LA( +M@\!H9D@/;M!(@\`P2(GE4TB)^TB#[`A(B4<@\P]^!6-6`@!F#VS!#Q$'\P]^ +M!5Q6`@!F#VS"#Q%'$$B+OV@!``!(A?]T!>ACI_S_2(N[6`$``$B%_W0%Z%*G +M_/](B[M(`0``2(7_=`7H0:?\_TB+NS@!``!(A?]T!>@PI_S_2(N[(`$``$B- +M!>)(`@!(B4,@2(7_=`7H%*?\_TB->RCH._W__TB)WTB+7?B^R`$``,GIV:7\ +M_V8/'X0``````/,/'OI52(T%C$D"`&9(#V[(2(/`:&9(#V[02(/`,$B)Y5-( +MB?M(@^P(2(D'\P]^!915`@!F#VS!#Q%'X/,/?@6,50(`9@]LP@\11_!(B[]( +M`0``2(7_=`7HDZ;\_TB+NS@!``!(A?]T!>B"IOS_2(N[*`$``$B%_W0%Z'&F +M_/](B[L8`0``2(7_=`7H8*;\_TB+NP`!``!(C0422`(`2(D#2(7_=`7H1:;\ +M_TB->PA(BUWXR>EG_/__#Q^``````/,/'OI52(T%S$@"`/,/?@7T5`(`9D@/ +M;LA(@\!H9@]LP69(#V[02(/`,$B)Y4%43(UGX%-(B?L/$4?@\P]^!C1I?S_2(N[.`$``$B%_W0%Z,"E_/]( +MB[LH`0``2(7_=`7HKZ7\_TB+NQ@!``!(A?]T!>B>I?S_2(N[``$``$B-!5!' +M`@!(B0-(A?]T!>B#I?S_2(U[".BJ^___6TR)Y[[(`0``05Q=Z4FD_/^0#Q^$ +M``````#S#Q[Z54B)Y4%44XN',`$``$2-8/]$B:!;05Q= +MPP\?@`````!(C0711P(`2(G[\P]^!?93`@!F2`]NR$B#P&AF#VS!9D@/;M!( +M@\`P#Q$'\P]^!=U3`@!(B4<@9@]LP@\11Q!(B[]H`0``2(7_=`7HX*3\_TB+ +MNU@!``!(A?]T!>C/I/S_2(N[2`$``$B%_W0%Z+ZD_/](B[LX`0``2(7_=`7H +MK:3\_TB+NR`!``!(C05?1@(`2(E#($B%_W0%Z)&D_/](C7LHZ+CZ__](B=^^ +MR`$``.A;H_S_1(G@6T%<7<,/'P#S#Q[Z54B)Y4%505132(/L"(N'&`$``$2- +M8/]$B:<8`0``187D=!%(@\0(1(G@6T%<05U=PP\?`$B-!=E&`@!(B?M,C6_H +M\P]^!?I2`@!F2`]NR$B#P&AF#VS!9D@/;M!(@\`P#Q%'Z/,/?@7@4@(`2(E' +M"&8/;,(/$4?X2(N_4`$``$B%_W0%Z..C_/](B[M``0``2(7_=`7HTJ/\_TB+ +MNS`!``!(A?]T!>C!H_S_2(N[(`$``$B%_W0%Z+"C_/](B[L(`0``2(T%8D4" +M`$B)0PA(A?]T!>B4H_S_2(U[$.B[^?__3(GOOL@!``#H7J+\_TB#Q`A$B>!; +M05Q!75W#\P\>^E5(B>5!54%44TB#[`B+AR`!``!$C6#_1(FG(`$``$6%Y'01 +M2(/$"$2)X%M!7$%=7<,/'P!(C07910(`2(G[3(UO\/,/?@7Z40(`9D@/;LA( +M@\!H9@]LP69(#V[02(/`,`\11_#S#WX%X%$"`$B)1Q!F#VS"#Q$'2(N_6`$` +M`$B%_W0%Z.2B_/](B[M(`0``2(7_=`7HTZ+\_TB+NS@!``!(A?]T!>C"HOS_ +M2(N[*`$``$B%_W0%Z+&B_/](B[L0`0``2(T%8T0"`$B)0Q!(A?]T!>B5HOS_ +M2(U[&.B\^/__3(GOOL@!``#H7Z'\_TB#Q`A$B>!;05Q!75W#D/,/'OI52(GE +M05=!5D%505132(/L>(M'2&1,BR0E*````$R)9@@#X1$!P`` +M9F8N#Q^$``````!F9BX/'X0``````&9F+@\?A```````#Q\`2(G(2(/'`4GW +MX4B)R$C!Z@-,C12230'23"G0@\`PB`0^2(G(2(G12(/X8W?3@\$P2(T$/DB- +M59&(39`/'T0```^V"$B#Z`%(@\(!B$K_2#G&=>W&1#V1`$R-;9!,B>_H7)[\ +M_T2->`&)P(A?HQ]___TF+1"0X28M\)%!( +MBS#H99_\_T&`?"1!``^%L04``$F-?"1@2(G>Z$RK_?])BT0D$/-!#V\$)$F- +M="0828V\)*@```!)B80DH````$$/$80DD````.@>J_W_28V\)+@```!,B?;H +M3K+]_T&+5"1(A=)T"XN%?/___T&)1"1,2(M%R&1(*P0E*`````^%LP4``$B# +MQ'A;05Q!74%>05]=PP\?A```````13'VZ9']__\/'X0``````$B%R74;,?^[ +M)0```$R-;9!,B>[HV*?]_^E/_O__#Q\`2,'I%+M-````Z:']__]FD$B)W^CH +MJ/W_08M$)%CI9?[__V8/'T0``#'V2(U]@.@=H/S_A<`/A74"``!(BU6(:76` +MZ`,``$BXS_=3XZ6;Q"!(P>H#2/?B2,'J!(T$%HF%?/___T&+?"1HA?\/A%__ +M__]!BT0D2(7`#X35_/__BY5\____02M4)$PYP@^#POS__^D0____9BX/'X0` +M`````$F+="1028M\)&#H$9_\_X7`#X2=_O__Z6/^__\/'T``03E$)%P/A$P$ +M``!)BTPD4(U0`4B)W\8$`2")T,8$`0!!BW0D($&)5"18Z#&Z_?])BW0D&$&+ +M3"18,Y,B?_HAKC]_T&+5PQ) +MC40D<$B)A6C___^#^O\/A.@!``"!^NG]```/A/@!``!(B[UH____2(U-@$R) +M[NC^Q@``08MT)'A!BT0D6`'P03E$)$0/@PH!``!!BTPD,.LY@?KI_0``#X0\ +M`0``2(N]:/___TB-38!,B>[HP<8``$&+="1X08M$)%@!\$$Y1"1$#X.R```` +M1(GYA^)C7C___]$#T;( +M12G/1(F-K?W_BXUX____1(G^3(GO08N4)(@```!$BXUP____T>Z) +MM7#___\IRD0!RN@AL/W_B[5P____2(T5)'$!`$R)[^A,K_W_28M$)#A,B>Y( +MB<=(B85P____Z&6W_?](BX5P____BU`,@_K_#X4B____N@$```#I)/___T6% +M_W460<=$)'@`````28M$)'#&``!!BW0D>$B)W^B%MOW_28MT)'!!BTPD6#'` +M20-,)%`/'T``#[84!H@4`4B#P`&$TG7Q08M$)'A!`T0D6$&)1"18Z4'Z__\/ +M'T0``$B+M6C___^Z``(``$R)[^B$O/W_Z;[^__\/'X``````28M$)#A(BSCH +MRYG\_^D]^O__9@\?1```B<_IU?K__TB)W^CAH_W_08M$)%CIHOO__TB)W^C/ +MH_W_08M$)%CIG?S__[H!````Z1K^__](B=_HLZ/]_T&+1"18Z:3]__^Z``(` +M`$B)QDR)[^@)O/W_Z0;^___H#YG\_Y!F9BX/'X0```````\?`/,/'OI52(GE +M05=!5D%508G-051)B?Q32(GS2(/L>(F5UT'K@"````3(T]W4\!`$&#_0%U#+@!```` +M3(T]&U8!`#'203F$),0!```/@],```!)@WPD8`!T>T&`?"1H`'5S08N,),`! +M``"%R71=0<=$)%@`````28M$)%#'``````!)BT0D0$''1"1(`````,8``$&# +MO"3``0```7<$A-)U'TF-?"1`3(G^Z(VC_?](A=MT#4F-?"102(G>Z'NJ_?]! +M#[9$)&B$P'4*28U\)"CH9_;__XL%Q:D"`(7`#X49!```,=M,B??HWY;\_TB+ +M105]=PP\?`$R-/?9.`0!! +M@_T##X47`P``28N$)``!```QTDB%P`^$&O___TF+5"1@2(72=!%!@'PD:`%T +M"4@YT`^$>0,``$F-A"0X`0``3(G^2(G'28G%Z-.B_?](A=L/A#(!``!!BX0D +M0`$``$$YA"1$`0``#X1<`P``28N,)#@!``"-4`'&!`$@B=#&!`$`28N$)``! +M``!!B90D0`$``$F+O"0X`0``2(LPZ`^7_/])BX0D2`$``$V-A"1(`0``2(G> +M0<>$)%`!````````3(G'QP``````3(F%:/___^A+J?W_3(N%:/___TF+A"0` +M`0``3(G&2(G'3(F%8/___TB)A6C____HT[/]_XNUH#3(T4DDT!TDPIT(/`,(@$-TB) +MR$B)T4B#^&-WTX/!,$B-!#=(C561B$V0#Q]$```/M@A(@^@!2(/"`8A*_T@Y +MQW7MQD0UD0!(C56028MU`$B)U^C(E/S_28MU`+\^````Z&J5_/])BX0D``$` +M`+\*````2(LPZ%65_/]!@+PD-P$```!U(KH!````Z1;\__^X`@```$R-/<5+ +M`0#I]?O__P\?@`````!)BX0D``$``$B+..B8E/S_Z\QF#Q]$``"Z`0```.F( +M_O__9@\?1```2(U5D(G/2(G62(F5>/___^AKG?W_2(N5>/___^E;____#Q^` +M`````+H``@``3(GN3(G'2(F%_H0)[]_T&+A"1``0``Z8_\__\/ +M'P"[!$``@.G?^___3(G'3(F%^E5(B>5!54R-+=^D +M`@!!5$F)]%-(B?M,B>](@^P(Z#J4_/](@WM@`'0<@'MH`'46387D=`A)BP0D +M2(E#*$B->RCH)_'__XL%A:0"`(7`=1TQVTR)[^BCD?S_2(/$"(G86T%<05U= +MPV8/'T0``+L$0`"`Z]Z0#Q^$``````#S#Q[Z@+_Y`````'532(-_0`!T3(!_ +M2`!U1E5(B>5(A?9T34B+!H"_^`````!(B4<8=0A(A=)T!TB+`DB)1PA(@\<( +MZ*CP__^+%0:D`@"%TG4T,ZC`@"%P'46,<###Q\` +M2(72=,J`O_@`````=<'KN+@$0`"`P[@$0`"`7<.09I#S#Q[Z54B-!0PX`@!F +M2`]NR$B)Y4%7059!54%44TB)^TB![-@```!(BS_S#WX%AD$"`&1,BR0E*``` +M`$R)9UT +M*TF+10!(C15-K/[_2(M`$$@YT`^%J0T``$&#;0@!#X0Q`@``2,=#$`````!( +MBWL82(7_=`Y(BP?_4!!(QT,8`````$B+@[````!(C7,HQX.8`````````$C' +M@YP`````````2,>#J`````````#'@[@`````````QP``````2(N#P````,># +MR`````````#'``````!(C460QX.D````_____TB)Q\9#(`!(QX,(`0`````` +M`$B)M1C___](B840____Z#'$_?^_$````.@WCOS_2(F%6/___TB+#9E4`0#' +M``````"+19A(B4VH2(M5D(7`=%5(C02"ZQ-F9BX/'X0```````\?`$@YPG0\ +M2(/H!(,X+G7R2"G02,'X`H7`>"B#P`%(BXU8____2(U]H$B82(TT@DB)3:#H +MNJ+]_TB+1:!(B858____28L$)(MX&$B%_P^%3P$``$&`?"0>``^$DP```$F+ +M1"0@2(F%0/___T&+1"0(B84X____A<`/B)(```!(QX50____`````+\$```` +MZ&^-_/^+M3C___](BXU0____2(F%8/___TV+="0X2,=%@`````"),$ACQL8$ +M`0%-A?8/A0@)``!!@'PD&0!(QX.(``````````^$HP@``,>%:/___P$```!! +MO0$```#I*P,``$&+1"0(B84X____A<`/B:X(``!(QX5`____``"``$V+="0X +M387V#X0Q#@``2,>%4/___P````!(QT6``````$4Q[4C'A6#___\`````QX5H +M____`````.F0"```9@]OE2#___]-C77X3(GW00\15?CH*YW^_TF+O0@"``!( +MA?]T!>CJC_S_28U]0.AAI_[_28M].$B%_W0&2(L'_U`0OB@"``!,B??HI8[\ +M_^E[_?__Z%N,_/]-BS0D2(F%4/___T&+5AB%T@^$/P\``$B+O5#___\Q]NA& +MC?S_08!\)!X`2,>%0/___P``@`!T#$F+1"0@2(F%0/___T&+1"0(B84X____ +MA<`/B8O^___'A4S___\`````13'_13'M2,>%8/___P````#'A6C___\````` +M9F8N#Q^$```````/'T``28M&$(![)P!.BS3X=0A!@'PD&0!U&$F+?AA(C35Y +M10$`Z!J8_?^$P`^%(@$``$F+1"0P,`"2(G'2(F%,/__ +M_^CXBOS_28G!187M#X5F"```2(.]8/___P`/A7@(``!,B8U@____BX5H____ +M2(N]8/___T2)ZD&#Q0%(C0R'*<)$B?!(B("2(T\ATB)C6C____HXX[\ +M_TB+C6C___](BX50____1(FU:/___T2).4+&!#@!9@\?1```38LT)$F#QP%% +M.WX8#X*>_O__38MT)#A-A?8/A-T(``"+A6C___](QT6``````$R)]X7`00]$ +MQ3'),=(Q]HF%:/___TF+!O]0($&)QX7`#X7,!0``2(UU@$R)]^@P9O[_08G' +MA<`/A;4%``!(BT6`08!\)!D`2(F#B`````^$.08``(NU./___X7V1`])K6C_ +M__]%A>T/A"`&``!$B>B#O6C___\!2(F%./___P^4A3#___]%,?9(BX5@____ +M28M\)$A"BP2PB4-82(7_=!=(BP=(C56`,?;_4!A!B<>%P`^%E0,``$F+?"0X +M2(7_=!=(BP%P`^%=`,``$F+!"2+4UA(BT`02(L$T/]0 +M"$F)Q4B%P`^$A@4``$B+`$R)[_]0"$F+="0X28M%`$B%]@^$Z04``$B+C4#_ +M__](C7VP2(F]:/___TB)^DR)[TB)3;!)BTPD2/]0&(F%3/___\:#@`````"^ +M1P```$R)[TB+@X@```!(QT-X`````$B+E6C___](B8.0````2(N#L````$C' +M0W``````QX.8`````````$C'@YP`````````2,>#J`````````#'@[@````` +M````QP``````2(N#P````,>#R`````````#'``````!(QT6P`````$F+10!( +MQT6X`````/]00$&)QX7`#X7#!```#[=%L,:#FP````!F@_@3#X3&!```9H/X +M%0^$O`0``&:%P`^%S0L``#'`3(N]:/___XF#G````$R)_^A$T/W_3(GZOD@` +M``!,B>](QT6P`````$F+10!(QT6X`````/]00$&)QX7`#X57!```#[=%L&:# +M^!,/A/D$``!F@_@5#X3O!```9H7`#X58"P``,%P`^%D`,```^W1;!FAS_W_BXU,____AX`0```$&# +M]P%-A?8/A=L"``"`O3#___\`#X3.`@``#[:+F@```,'@"(M36$B-L[````!( +MC;OH````"<@/MHN9````B9.D````P>`(B9/<````"<@/MHN8````P>`("@>B?S_187_#X4+ +M`0``2(,[``^$`0$``$R+BB_O](BT`02#G0#X6?!@`` +M08-N"`%U3V8/;YT@____38UN^$R)[T$/$5[XZ/N5_O])B[X(`@``2(7_=`7H +MNHC\_TF-?D#H,:#^_TF+?CA(A?]T!DB+!_]0$+XH`@``3(GOZ'6'_/](QT,0 +M`````$B+>QA(A?]T#DB+!_]0$$C'0Q@`````2(L[2(U3$$B--1A7`0!(BP?_ +M$$B+.TB-4QA(C34E7@$`2(L'_Q!(BSM(C5,AOD(```#HWSO__X7`=2Y(BSM( +MC5,COD$```#HRCO__X7`=1E(BSM(C5,DOC\```#HM3O__X7`#X3N`P``08G' +M2(M%R&1(*P0E*`````^%C0<``$B!Q-@```!$B?A;05Q!74%>05]=PT4Q_TB# +M.P!!#Y3'2(.]4/___P`/A'O^__]F#Q^$``````!(B[U0____Z+2'_/_I5_[_ +M_TC'A5#___\`````2,>%0/___P``@`#IN_;__\>%:/___P$```!!O0$```!) +MBP8QR3'2,?9,B??_4"!!B<>%P`^%!/[__TB-=8!,B??H#F#^_T&)QX7`#X3> +M^?__Z>C]__]F#Q]$``"-2`'I:?C__TF+10!,B>__4!!)@\8!3#FU./___P^% +M^_G__T4Q_TB#.P!!#Y3'Z:_]__\/'T0``$B+O6C____HM,O]_^F/_?__#Q^` +M`````,:#FP````&+1;CI0/O__V8/'X0``````$0YK4S___]T?T2)Z$B-%(4` +M````2(N%8/___T&#Q0%$B3P0Z=CX__](C4VP3(GO2,=%L`````!(C35B7`$` +M2(F-:/___TB)RO\02(M]L$B%_P^$JP0``$B+!TF+="1`_U`82(M]L(F%3/__ +M_TB%_P^$]/G__TB+!_]0$.GI^?__BT6XZ13[__^!O4S____^__]_#X<_K_S_ +MBXU,____NO___W^)R"G*P>@"@\`!.=`/1\)$C30!1(FU3/___TG!Y@),B??H +MMX+\_TF)P42)Z$B-%(4`````187M#X5C`0``2(.]8/___P`/A7@!``!,B8U@ +M____Z1K___](BXTP____2(NU8/___T2)ZDB)QTC!X@+HZ8;\_TF)P4B+O6#_ +M__],B8TP____Z+.%_/],BXTP____Z6GW__](QT6P`````$F+10"^+````$R) +M[\:#@`````!(BY5H____2,=%N`````#_4$!!B<>%P`^%7_[__V:#?;`5#X%P`^%\_W__V:#?;`5#X?"````#[=%L$B-%5%8`0!(8P2"2`'0/O_@@[UH +M____`0^%[00``$&`?"09`$C'18``````2,>#B``````````/A3ST__]%,?]( +M@SL`00^4Q^GG_/__3(GO_]#I6/+__TB+M6#___],B<],B?%(B94P____Z*2% +M_/](BY4P____28G!2(N]8/___TB)E0C___],B8TP____Z&"$_/](BY4(____ +M3(N-,/___^E;_O__@[U,____`0^%"`(``#'`13'_Z1+Z__](B[UH____0;\% +M0`"`Z-3(_?_IK_K__TB+.TB-4R6^0````.BN-___A<`/A?G[__](BSM(C5,F +MOEL```#HE3?__X7`#X7@^___2(L[2(U3(KY=````Z'PW__^%P`^%Q_O__TB+ +MM1C___],C76`3(GWZ%&V_?^_$````.A7@/S_28G%2(L%O48!`$B+58!!QT4` +M`````$B)A7C___^+18B%P`^$WP$``$B-!(+K"4@YP@^$T`$``$B#Z`2#."YU +M[D@IT$C!^`*%P`^(N`$``(/``4B-O7#___],B:UP____2)A(C32"Z-R4_?]( +MBT-(QT-0`````$R+K7#____'``````!(8T-8A<`/B94!``#I/@(```\?`(M% +MN.G-_?__2&-%N.G$_?__2(M%N$B+O6C___](B4-PZ*O'_?](BY.(````2(M# +M<$B)T4@IP8"[@`````!(B8N0````="A(BTMX2`'(2#G0#X.B````2"G"2(F+ +MD````,:#F`````%(B9.H````@[U,____`75G@+N;``````^$7/[__XN#G``` +M`(/@`>E>^/__BT6X2(N]:/___TB)0W#H*\?]_^E[____2&-%N$B+O6C___]( +MB4-PZ!+'_?_I8O___TB+O6C____H`EA____2(N] +M6/___TB%_W0>Z`*"_/](BWV02(7_=`7H]('\_T&_`4``@.G?^?__2(M]D$B% +M_W7GZ^I!OP%``(#I8_C__TF+10!,B>__4`A(BSM(A?]T!DB+!_]0$$R)*T4Q +M_^E`^/__2(M#2,=#4`````#'``````!(8T-8A<`/B,H```!)BQ0D2(M2$$R+ +M),)!BT0D,(7`#X6[````OQ````!(QT6@`````.@(?OS_2(LU<40!`,<````` +M`+\0````2(E%H$B)=:CHZ7W\_TF)Q$R)]DB)1;!(C4V@3(NU$/___T''!"0` +M````2(U5L$B+!3%$`0!,B?=(B46XZ+5R__](C7M(3(GVZ&F3_?](BWV02(7_ +M=`7H^X#\_TR)Y^CS@/S_2(M]H$B%_W0%Z.6`_/]-A>UU%TB+?8!(A?\/A,GX +M___HSH#\_^F_^/__3(GOZ,&`_/_KWTB-M7#___],B>=,B:UP____Z-DQ__\Q +MTDR)]H7`#TC"28M4)"A(F$B+%,)(C46P2(G'28G&2(U*$.@A``^$@````$F+1"0@2(F%0/__ +M_T&+1"0(B84X____A<`/B6'O__]-BW0D.$V%]@^%\^___TB+O5#____H((#\ +M_TB#O5C___\`#X0I_O__2(N]6/___T&_`4``@.@`@/S_2(M]D$B%_P^%T/;_ +M_^GZ_?__Z0NJ_/]!OP%``(#I'OC__^G1J?S_2,>%0/___P``@`!!BT0D"(F% +M./___X7`>(7IX>[___,/'OI(BJC\__,/'OI(B^E5(B>5!5$F)]%-(B?M(BSY(B3M(A?]T!DB+ +M!_]0"$F+?"0(2(E["$B%_W0&2(L'_U`(28M\)!!(B7L02(7_=!M(BP=(C17R +MQA(A?]T!DB+!_]0"$F+1"0@ +M28UT)"A(C7LH2(E#(.AVC/W_28UT)#A(C7LXZ&B,_?])C70D2$B->TCH6HS] +M_TF+1"1828VT)+````#S00]OA"2(````2(V[L````$B)0UA)BT0D8`\1@X@` +M``!(B4-@08M$)&B)0VA)BT0D<$B)0W!)BT0D>$B)0WA!#[:$)(````"(@X`` +M``!)BY0DF````$F+A"2H````2(F3F````$F+E"2@````2(F#J````$B)DZ`` +M``#HS8O]_TF-M"3`````2(V[P````.BYB_W_28N4)-````!)BX0DX````$F- +MM"3H````2(V[Z````$B)D]````!)BY0DV````$B)@^````!(B9/8````Z'B+ +M_?])C;0D^````$B-N_@```#H9(O]_TF+A"0(`0``2(F#"`$``%M!7%W#_]#I +MJ/[___,/'OI)B<3I,*?\__,/'OI)B<3IW:;\__,/'OI)B<3IXJ;\__,/'OI) +MB<3I-Z?\__,/'OI)B<3IUJ;\__,/'OI)B<3IV*;\__,/'OI)B<3IVJ;\_P\? +M1```54B)Y4%5051,C66P4TB#[#AD2(L<)2@```!(B5W82(G[3(GGZ#>)_?]( +MBTVPBQ&#^@IT:TB)R.L3#Q^``````(M0!$B#P`2#^@IT2(72=?!,B>9(B=_H +M9:7]_TB+,[\*````Z*A[_/](BWVP2(7_=`7HRGO\_TB+1=AD2"L$)2@````/ +MA9D!``!(@\0X6T%<05U=PT@IR$C!^`*%P'BQ2(LSOPH```#H9'O\_TB+,[][ +M````Z%=[_/](BS._"@```.A*>_S_2(M]L(L'2(UW!(7`#X1#`0``2(GZ2(GY +MZR-F9BX/'X0```````\?1```2(GQB0*+`4B#P@1(C7$$AOS_187M>`N+?;A!C4T!*<]UF$B+,[]]````Z"MZ_/](BWW`2(7_ +M#X1I_O__Z$EZ_/_I7_[__P\?0`!(*?!(P?@"B<*%P'B3`=$/2?I!B*D_/^054B)Y4%7 +M059)B=9!54F)_;\0````051!B?132('LJ````&1(BQPE*````$B)7%7/___P,```#'``````!)B<%6/___P````#H<5<``.F] +M````#Q]``$&#_#4/A`X"``!!@_Q;#X4T____9H/_%0^%*O___TB-58`/MWL. +M2(G62(F52/___^C3@/W_2(N]2/___^BG=?S_2(N52/___TB_________``!( +MN0````#__P``2`'0Q@`M2(UP`4B+0PA((<=(A<@/A"D$``!(B95(____Z+98 +M``!(BY5(____Z4G___]F+@\?A```````2(MS"$B-O5#___](B850____QX58 +M____`````.A_B_W_BX58____2(N=4/___X7`=5Y(A=MT,4B+1F]=_S_#Q]$``!(BT7(9$@K +M!"4H````#X5N!0``2('$J````%M!7$%=05Y!7UW##Q\`2,>%`(``$V%]@^$UP$``$B-O6#_ +M__],B?9(B85@____Z*F(_?],B[U@____BY5X____A=(/A#0"``!)BW4`2(N] +M_HC_K_ +M_TV%_W0(3(G_Z,)V_/](B[UP____2(7_#X3$_O__Z*UV_/_INO[__P\?A``` +M````9H/_$P^%)OW__TB-58"+S\__](BU,(N3!X``!(C46"9HE-@$B) +MT0\?A```````2(/``4C!Z01U]L8``$R-#GI#_W__P\?0`!F +M@_\3#X5V_/__BW,(13'`B?.!XP"```!T%T&)\(GP)?\_``!!P>@0@?[___\/ +M#T?P2(U5@#')0;D!````2(G73(T5*4L!`&8/'X0``````$2)R-/@A?!T%D4/ +MMAP*08#[+G0+]]!$B!](@\=(`[5P____Z&Y]_?](*X5P____B85X____B<+I +M_OW__V8N#Q^$``````"_!P```#'V2(/#"$B-58")^4B)WTB)E4C____H@$H` +M`$B+E4C____I\_O__P\?0`!,B?Y,B>_H)9O]_^G,_?__18GD2(T%1B`"`$B- +MO7#___]*BS3@Z#9__?_IC_W__Y"X/SH``$B-=8)FB46`Z-Y\_?_II/O__TB- +M58!(C7L(,PA(C56`2(F5 +M2/___TB)UDB)^$C!Z"!T,>C%5```2(N52/___^E8^___2`^_>PA(C56`2(G6 +M2(7_#XB7````#Q]``$B)E4C____H9'S]_TB+E4C____I)_O__TB-58`/MWL( +M2(G62(F52/___^A!?/W_2(N52/___^D$^___2(U5@`^V>PA(B=9(B95(____ +MZ!Y\_?](BY5(____Z>'Z__]F@WL(`+@M````=`6X*P```(A%@$B-58#&18$` +MZ<#Z__](8WL(2(U5@$B)UDB%_P^);?___\9%@"U(]]](C76!Z5W___](BWL( +M2(U5@$B)UDB%_WD+QD6`+4CWWTB-=8&X_____TB)E4C___](.<PA(B=;I&?___V8/'X0``````(M3".G0_/__#Q^$``````#& +M18@`2(U5@(M+"$B-O7C___](B=!,C0VD2`$`B^DF)Q.EDG?S_\P\>^DF)Q.DZG?S_\P\>^DF)Q.DS +MG?S_\P\>^DF)Q.D;G?S_\P\>^DF)Q.E=G?S_\P\>^DF)Q.D7G?S_\P\>^DF) +MQ.E%G?S_9F8N#Q^$```````/'P!52(GE05=!B==!5DR-=;!!54R)\D%428G\ +M2(GW4TB#["A(BP9$B?YD3(LL)2@```!,B6W(28G-2,=%L`````!(QT6X```` +M`/]00(G#A05]=PP\?1```3(GQ3(GJ1(G^3(GGZ#?W___KM0\?1``` +M9H/X"'6]2(M]N$B%_W2T2(/O!.B(ADY(B=];05Q!74%>7>G*\___Z`5O_/_S#Q[Z2(G#Z8V;_/]F#Q^$ +M``````!52(GE051)B?Q3@'X!`$B)\XM6!'0Z@\H@2(TU1"8!`$R)Y^B(I/__ +MBU,@A=)U+(![`@"+4PAU!8`[`'5#A=)U2(M#,(7`=5=;05Q=PP\?`(72=<6+ +M4R"%TG342(M3&$4QP+D!````3(GG2(TUHR0!`.AZ_O__Z[?H&*3__XM#,(7`=*E(BU,H3(GG6T4QP$%DR_O__9I#S#Q[Z54B)Y4%7059)B=9!54%44TB)^TB!QU@! +M``!(@>RX````2(FU4/___TB)SDB)C4#___]$B85(____9$B+!"4H````2(E% +MR#'`Z&^`_?](@WM@`,:#-`$```%T"H![:``/A$\)``!(BX,``0``2(7`=`A( +MBSCH`V[\_T&+1@A%,>2%P`^%``(``.F?`P``#Q^``````$&`OY@`````#X2G +M`@``0?:'G````$`/A9D"``!!@\U`2(N#``$``$B%P`^$R`8``$B+,+\*```` +MZ"MN_/]%A>0/A=8-``!(B[L``0``2(7_#X2B!@``1(GJ2(TUM"0!`.CSHO__ +M18N7R````$B#@Z@!```!QH,V`0```4R+JP`!``!%A=(/A8`"``!-A>T/A.0" +M``!)BW4`OPH```#HQFW\_X"[-P$````/A9$&``!%BX^D````187)#X@G`0`` +M3(NK``$``$V%[0^$$`$``$F+30"Z"0```+X!````2(T].B0!`.B/;_S_28UW +M*$R)[^@#E?W_OQ````!(QT6``````.@Q:OS_2(L-FC`!`,<``````$B)38A) +M8Y>D````2(E%@$$Y5U@/A,L'``!(C0540P$`A=)X$TB+A5#___](BT`02(L$ +MT$B+0!A(C7V`2(G"2(TUSR,!`$B)O5C____HPZO__TEC1UA(B[U8____2(T5 +M$4,!`(7`>!-(BY50____2(M2$$B+!,)(BU`82(TUJ",!`.B.J___2(MU@$R) +M[^A2D_W_2(LP28G%OPH```#HLFS\_TF+=0"_"@```.BD;/S_2(M]@$B%_W0% +MZ,9L_/^`NSI(C36X(@$` +MZ/^@__]!BX>X````2(.#H`$```'&@S4!```!3(NK"`$``(7`#X7&`P``387M +M=!U)BW4`OPH```#HUVO\_TB+@P@!``!(BSCH2&O\_T&`OYH`````18NOH``` +M``^$2_W__T6%[0^%8OW__T6+K\@```!%A>T/A.']__](BX,``0``2(7`#X0Y +M!```2(LPOPH```#H?6O\_T6%Y`^%I`8``$6+E\@```!,BZL``0``1872#X2` +M_?__387M#X0#!```28M-`+H)````O@$```!(C3WK(0$`Z$IM_/])BW4`OPH` +M``#H+&O\_TF+M\````!,B>_HK9']_[\*````2(LPZ!!K_/],BZL``0``2(.# +MJ`$```'&@S8!```!387M#X4=_?__D$&+AZ0```"%P`^)6/[__TF#Q`%%.V8( +M#X)?_O__#Q\`BX5(____3(N[``$``(7`#X6K`P``387_#X3Q!```18M&"$6% +MP`^$ZP8``$B-A73___](QX4X____`````$B)A3#___](C46`2(F%0/___TB+ +ME3C___])BP:^`0```$B-/6DA`0!)BP],BR30N@,```#H:FS\_T&X`0```#') +M3(G_28M4)"A(C34I(0$`38VL))@```#H9OG__TECA"2D````A@*:OS_26-$)%A(C17N/P$`A__ +M4%B%P`^%B0,``$B-A7#___^+O73___]%,>1(B85(____2(V%>/___TB)A5C_ +M__^%_W5!Z>P$```/'T``BY5X____3(GN3(G_Z%?W__](BTV`A__4&!(BTV`A?R) +MA5C____H)FC\_XN%6/___^G*`@``#Q\`187M#X6W````08N'N````(7`#X28 +M_/__2(N#"`$``$B%P`^$Q@```$B+,+\*````Z$-H_/]%A>0/A9H#``!,BZL( +M`0``08N'N````(7`#X0Z_/__387M#X21````28M-`+H'````O@$```!(C3VJ +M'@$`Z!%J_/])BW4`OPH```#H\V?\_TF+M[````!,B>_H=([]_[\*````2(LP +MZ-=G_/](@X.@`0```4R+JP@!``#&@S4!```!Z=+[__\/'T``2(N#"`$``$B% +MP`^%9/O__T&+A[@```!(@X.@`0```<:#-0$```&%P`^$POO__TB#@Z`!```! +MQH,U`0```>FN^___9@\?1```18N?R````$B#@Z@!```!QH,V`0```46%VP^$ +M8?S__T&+AZ0```!(@X.H`0```<:#-@$```&%P`^)JOK__^E-_/__9@\?1``` +M2(N#``$``$B+..B99OS_Z5OY__\/'T``2(.#B`$```%-A?]T"$F+/^A[9OS_ +M2(N#"`$``$B%P`^$*@$``$B+"+H'````O@$```!(C3W:'`$`Z.)H_/](B[L( +M`0``2(NU0/___^AOC_W_2(N#"`$``+\*````2(LPZ*MF_/]!@'XI`$R+HP@! +M```/A2D"``!!BTY,A?H@HS]_TB+?8!( +MA?]T!>@49OS_2(N#"`$``+\*````2(LPZ-!E_/](BX,(`0``2(LXZ$%E_/^+ +M%=]V`@"%T@^%.P4``#'`2(M5R&1(*Q0E*`````^%304``$B!Q+@```!;05Q! +M74%>05]=PP\?0`!(BX,``0``2(LXZ/ED_/_IZ_C__P\?0`!(QP`*````2(U] +M@$B--78E`0#'18@!````Z+)"``#I?_C__P\?1```3(UC*+X!````3(GGZ->D +M__](@WM@``^$E?;__X![:``/A8OV__](BT-`2,=#.`````#'0T@`````Q@`` +M2(M#4$B#>V``QT-8`````,<```````^$6?;__X![:``/A4_V__^^`0```$R) +MY^AYI/__Z3WV__\/'T``2(N[``$``$F-=RCH4(S]_TB+@P`!``"_"@```$B+ +M,.BL9/S_Z3/Y__\/'X``````2(N["`$``$F-=RCH((S]_TB+@P@!``"_"@`` +M`$B+,.A\9/S_3(NK"`$``.D]_/__28L,)+HN````O@$```!(C3W#)`$`Z&9F +M_/_I__W__TF+#[HH````O@$```!(C3UU)`$`Z$AF_/])BS>_"@```.@K9/S_ +MZ4SZ__]F#Q]$``!!BT8(C5#_.94X____=#E)BP^^`0```+H%````2(T]^1H! +M`.@(9OS_2(V%_"@```.BM8_S_Z>?]__\/'X0` +M`````$F+#[H&````O@$```!(C3UW&@$`Z)=E_/])BP^Z`P```+X!````2(T] +M$QH!`.A^9?S_2(U5D$B)UDV%[7D+QD60+4GWW4B-=9&X_____TB)E5C___]) +M.<4/CI0"``!,B>_HZD,``$B+E5C___])BS=(B=?H>&+\_TF+-[\*````Z!MC +M_/_IE/G__V8/'T0``$F+#[H)````O@$```!(C3WN&0$`Z`=E_/])BP^^`0`` +M`$B-/8@9`0"Z`P```.CN9/S_3(G@,!(@\$!2/?G +M3(G@2,'J`TR-!))-`!)B=1(@_AC=]-!@\0P2(T$#DB- +M59%$B&60#Q\`#[8X2(/H`4B#P@%`B'K_2#G&=>S&1`V1`$B-59!)BS=(B=?H +MB&'\_TF+-[\*````Z"MB_/_IT_C__TF+#"2Z'P```+X!````2(T]J2(!`.@< +M9/S_Z;7[__])BPPDNAX```"^`0```$B-/3(?`0#H_6/\_^D$_/__2(N%./__ +M_TF+%HNU1( +MB858____2(V%;O___TB)A2#___](C46`2(F%2/___^F$````D$B+C4C___^+ +ME73___],B>](QT6``````$F+10!(QT6(`````(NU+/____]0,(7`#X7M```` +M2(N-2/___TB+E7C___],B?^+M73____H;^?__TB+O4C____H$Z;]_TB+A7C_ +M__](A/SHOF#\_T&#Q`%$.Z5P____#X,Q_?__28M%`$2)YDR)[TC' +MA7C___\`````3(N%(/___TB+C3#___](BY58_____U!0A<`/A$C___](BY5X +M____2(72#X07^___2(UZ_(F%6/___^A98/S_BX58____Z?WZ__]$B>_H)FG] +M_TB+E5C____I9_W__TB-59!$B>=(B=9(B958____Z`1I_?](BY58____Z37^ +M__^X!$``@.F]^O__2(N]2/___XF%6/___^@\I?W_BX58____Z7G____H?%_\ +M_TB+NP`!``!)C7%`$`059,8_=!54%44TB![.@"``!(B;5H_?__9$R++"4H````3(EMR$4Q +M[4&#_0%(C35B%@$`OP8```!)#T7WZ")>_/\Q]C'_Z!E>_/])B<1(A<`/A$T, +M```Q_X`X`'03,<`/'T``C7@!08`\/`!(B?AU\TB#QP'HZEO\_TB)PS'`#Q]$ +M``!!#[84!(@4`TB#P`&$TG7P#[8#2(G:A,!T,69F+@\?A```````9F8N#Q^$ +M``````"-<+^-2"!`@/X:#T+!2(/"`8A"_P^V`H3`=>7H<(G]_X3`#X7=)0`` +M3(GGZ&!__?](B=^$P`^$WB4``.C07OS_08/%`4&#_0,/A2?____H/8G]_X3` +M#X2F"P``Q@4N*P(``4B+#5=R`@"Z2@```+X!````2(T]'A\!`.AQ8/S_2(V% +ML/W__TC'A;#]__\`````2(G'2(F%$/W__TC'A;C]__\`````Z#5F_?]%A?8/ +MCAP!``!,BZ5H_?__2(V%T/[__TB)A6C]__]/C33TZVN02(7V#X7J````3(F] +ML/W__XF=O/W__[\0````Z/!<_/](B[5H_?__2(G'2(G#Z+YL_?^+A;C]__^- +M4`&)E;C]__](BY6P_?__2(DCC7?S_28/$"$TY]`^$ +ME@```$F+-"1(B[UH_?__Z+8W``"+A;S]__\YA;C]__]UCCW^__]_#X<E,B?](B;5@_?__Z'1>_/]( +MB[5@_?__2(GWZ$5=_/_I"?___XN%N/W__X7`#X0""P``2(N%L/W__TB-O:#] +M__](B;T(_?__2(L`2(LPZ-)S_?^#O;C]__\`#X4D"@``QX6H_O_______S'` +M9@_OP$B)A:#^__](C86P_O__2(G'2(F%8/W__P\IA9#^___H(6?]_TB-A<#^ +M__](B<=(B858_?__Z)MI_?](BX6P_O__13'M13'V13'_1(FMN/[__TB-O9C^ +M___'A:C^________Q@``2(N%P/[__T2)M>^$````.CL6OS_28M]"$B#ZPA(@_OX=CT6_S_3#FMD/[__W6; +M26MU^!A)C7WX2(/&".C97?S_13'DOY@```!,C3UZ;P(`3(FED/[__^A>6/S_ +M2(U("$C'``8```!(!9@```!(B1%,>2#O;C]__\`2(F-D/[_ +M_P^%R````.E``0``#Q^$``````"+A:3^__\YA:#^__]U9SW^__]_#X=&B/S_ +MB<.Z____?TR-/=EN`@#!ZP(IPH/#`3G3#T?:1(TT`TR)\TG!Y@-,B??HJ5?\ +M_TF)QXN%H/[__TB+M9C^__^%P`^%H0<``$B%]@^%N0<``$R)O9C^__^)G:3^ +M__^_$````$R-/7]N`@#HFEG\_TR)[DB)QTB)P^AL:?W_BX6@_O__C5`!B96@ +M_O__2(N5F/[__TB)',))@\0!1#NEN/W__W-]2(N%L/W__XN=J/[__TZ++."% +MVP^)+/___TF+50"#.BT/A1____](B=%(C04_$0$`9F8N#Q^$``````!F+@\? +MA```````#[9X`4B#P01(@\`!B?X[.0^%*@8``$"$]G7EBX6@_O__28/$`8F% +MJ/[__T0[I;C]__\/@H/___](BX60_O__@#@`#X5Y!P``@'@8``^%;P<``$2+ +MO:#^__]%A?\/A1H(``#'A0#]__\!````0;P!````13';2(T%/"\!`$R)G2#^ +M__]&BR2@3(F=*/[__TR)G3#^__],B9TX_O__3(F=0/[__T0[O:#^__\/A%`@ +M``!%B?Y,C:T@_O__2<'F`T0[O:#^__]S0&8/'X0``````$B+A9C^__]*BS0P +M1(M6"$6%T@^$6(K\_T2)XDR)[TR)Z^B*@0``08/'`4F#Q@A$.[V@_O__=(QX40_O__```` +M`$B)QDB)A3#]__](QX48_O__`````.@%A_W_00^V1"01BY48_O__B(4X_?__ +M00^V1"02B(5`_?__2(N%$/[__TB+7-#XBT,(A<`/A,@:``!!#[94)!.`^@$/ +MA/8:``#&A4C]__\!QH50_?__`8#Z`@^$5AP``$C'A5#^__\`````OQ````#H +M]5/\_TB+#5X:`0"+M1C^__](B850_O__QP``````2(F-6/[__X/^`@^&@P<` +M`$B+A1#^__](BQ!$BT((187`#X7T&0``QX5@_?__`0```$2-=O^+E6#]__^_ +M_____TB)A1C]__]!B?5,B:5H_?__B?M,C3S01(FU(/W__T&)U$V)_@\?@``` +M``!)BP9(C36^+`$`3(LX3(G_Z)M6_/^%P'032(TUK"P!`$R)_^B(5OS_A^$````.B_5/S_2(N]$/[__XN%&/[__TB-=PB#PP&-4/](P>(# +MZ)]6_/^#K1C^__\!1#GS=%1(BX40_O__08!\)!(`2(LP#X1-____BX5@_?__ +M.<,/@C____^+5@A(BP:%T@^$,?___TB-#)#K%0\?`(/Z/W042(/`!$@YP0^$ +M%O___XL0@_HJ=>=$B[TH_O__187_#X2^&@``2(N=4/[__TR+M2#^__]%B?Q% +M,>WK%F8/'X0``````$F#Q0%-.>4/A-48``!+BP3N2(G>2(LXZ*2!_?^%P'7@ +M1(FM8/W__T6%[0^(LA@``$2+K1C^__]%A>T/A*<%``!!@_T!#X1N&```,0#2(F% +M:/W__TR)Y^A*4?S_2(G#BX78_O__3(NUT/[__X7`#X6$%P``387V#X61%P`` +M2(F=T/[__S';1(FMW/[__TR-K=#^__]FD$B+A1#^__^_$````$R)K6C]__], +MBSP8Z"13_/],B?Y(B<=)B<;H]F+]_XN%V/[__TB#PPB-4`&)E=C^__](BY70 +M_O__3(DTPDDYW'6S2(V%T/[__TB)A6C]___IY04``$6+30A%A`D`#X6M`@``08`^``^$ +MHP(``$B+O6#]__](C35!%`$`3(T]$F<"`.CM7?W_Z?`"```/'X0``````$B- +M%,4`````3(GQ3(G_2(FU:/W__^A65/S_2(NU:/W__TB)]^@G4_S_Z3KX__]F +MD$R-);P/`0"_`0```.F\\___,?\Q]NBF4?S_2(G'2(7`#X1=&```Z'5S_?^$ +MP`^%./3__\8%9A\"``#I,_3__TB+A;#]__](BQA(A=MT&DB+.TB%_W0%Z,52 +M_/^^$````$B)W^B84?S_BX6X_?__2(N]L/W__XU0_TB-=PA(P>(#Z'M3_/^# +MK;C]__\!Z8KU___H&H?__T4QY$B-O9#^___H:UG]_TB+O:#]__](A?]T!>AJ +M4OS_2(N]$/W__^C.6/W_2(M%R&1(*P0E*`````^%Y1H``$B-9=A$B>!;05Q! +M74%>05]=PTF+?0CI,O;__T&\`@```.N^1(F]:/W__S'_B850_?__9@\?A``` +M````BT2Z!$0/MM%!B#^']_1$B--3T(`0!( +MB?+K"(3)=#1(@\(!#[8*.,AU\4@I\DQCXH72>!^)E0#]__]!OP$```#H,5'\ +M_^E.]___@[W8_O__`72\Z!Y1_/^^`0```+H7````2(L-O60"`$R-);9D`@!( +MC3U!"`$`Z-I2_/],B>?H`FW]_TB+,TR)Y^A'=_W_2(G'0;P'````Z.EL_?_I +M3?[__T'&!@%$BY,C3T'9`(`Z+)B_?]( +MBPW[8P(`NA,```"^`0```$B-/6@'`0#H%5+\_TR)_^@];/W_2(LUUF,"`$B+ +MO;#^___H.D_\_TR)_^@B;/W_2(NUP/[__TR)_^AC=OW_Z1?___]F#Q]$``!, +MB>_HH%O]_XN%6/[__^FO^?__@\`@08#Z&0^&1!,``$4/ML!!.<`/A>O]__]( +M@\?H@DO\_TF)Q8N%&/[__TR+M1#^__^%P`^%DQ,``$V%]@^%H!,``$R)K1#^ +M__^)G1S^__^_$````.AZ3?S_2(NU:/W__TB)QTB)P^A(7?W_BX48_O__C5`! +MB948_O__2(N5$/[__TB)',)(B[W0_O__2(7_=`7H;4[\_T2+K1C^___&A4#] +M__\!2,>%T/[__P````!(QX78_O__`````,:%./W__P#&A5#]__\!QH5(_?__ +M`46%[0^%6_G__P^VA4#]__\/MI5(_?__N?____]$B[U@_?__#[:U*/W__\'@ +M"`G0#[:54/W__\'@"`G0#[:5./W__\'@"`G02(N5:/W__XF%X/[__TB+A2#^ +M__]*BSSX2(/'$.BL@/W_BX78_O__2(N]T/[__X7`=$"-6/](P>,##Q]``$R+ +M)!]-A>1T(DF+/"1(A?]T!>B93?S_3(GGOA````#H;$S\_TB+O=#^__](@^L( +M2(/[^'7+2(7_=`7H<4W\_TB+O5#^__](A?]T!>A@3?S_BX48_O__2(N]$/[_ +M_X7`=$2-6/](P>,##Q^$``````!,BR0?387D="))BSPD2(7_=`7H*4W\_TR) +MY[X0````Z/Q+_/](B[T0_O__2(/K"$B#^_AURTB%_W0%Z`%-_/](@X58_?__ +M`8N%0/[__TB+C5C]__\YP0^"Q/3__X7`=$6-6/](P>,#9@\?A```````2(N% +M./[__TR+)!A-A>1T&TF+/"1(A?]T!>BR3/S_OA@```!,B>?HA4O\_TB#ZPA( +M@_OX=5<`@``2(F% +M0/W__TB)"$R)6!!,B5@89L=`(```2(F%>/W__\=`"`$```!(B9U0_?__#X38 +M!0``3(L]:PX!`&9F+@\?A```````2(N-4/W__TB-!;)<`@!F#^_)OQ````!( +MQX70_O__`````$C'A>C^__\`````2(LC]___H+$?\_TB+#]___H#"D``$B+A>#] +M__](B85(_?__2(MS($B%]G0H2(N%8/W__TB-O?#]__](B87P_?__Z-LH``!( +MBX7P_?__2(F%8/W__TB+A4C]__](C;4`_O__2(V]X/W__TC'A0#^__\````` +M2,>%"/[__P````!(B87@_?__2(V%$/[__TC'A1#^__\`````2,>%&/[__P`` +M``!(B;4H_?__2(F%,/W__^@K8?W_2(N%8/W__TB-O?#]__](B87P_?__2(V% +M$/[__TB)QDB)A3#]___H`&']_T2+E0C^__\QVT6%T@^%F@```.GQ`0``9@\? +MA```````2(7V#X6_`0``3(F%^/[__T2)I03___^_(````.@?2/S_3(GN2(G' +M28G$Z/%7_?](C;5@_O__28U\)!#HX%?]_XN%`/___XU0`8F5`/___TB+E?C^ +M__],B23"2(N]8/[__TB%_W0%Z`5)_/](B[U0_O__2(7_=`7H]$C\_TB#PP$[ +MG0C^__\/@UP!``!(QX50_O__`````+\0````Z&]%_/_'``````"_$````$B) +MA5#^__],B;U8_O__2,>%8/[__P````#H1D7\_TB)A6#^__],C:U0_O__QP`` +M````2(N%`/[__TR)[TR)O6C^__](BS38Z-A:_?\[G1C^__]S0TB+A1#^__]( +MC;U@_O__2(LTV.BY6OW_3(NE8/[__TB--4\>`0!,B>?H(TC\_X7`=1+'A6C^ +M__\`````0<<$)`````"+A03___\YA0#___\/A<+^__\]_O__?P^':7S\_T&) +MQ+K___]_0<'L`BG"08/$`4$YU$0/1^)%C30$38GT2<'F`TR)]^B$1/S_28G` +MBX4`____2(NU^/[__X7`#X1<_O__3(G'2(T4Q0````!,B?%(B;58_?__Z-)( +M_/](B[58_?__28G`2(GW3(F%6/W__^B91_S_3(N%6/W__^DF_O__#Q]$``"+ +MA1C^__](B[T0_O__C5C_2,'C`X7`=#5,BR0?387D="))BSPD2(7_=`7H64?\ +M_TR)Y[X0````Z"Q&_/](B[T0_O__2(/K"$B#^_AURTB%_W0%Z#%'_/^+A0C^ +M__](B[T`_O__A?H!D/\_TB+C4#]__])B<6+01A,BW$0A<`/A6()``!- +MA?8/A6\)``!(BX5`_?__3(EH$(E8'+\X````Z/Q$_/])B<5(BX70_O__\P]O +MA=C^__](B[4X_?__28U]&$F)10!!#Q%%".BQ5/W_BYT`____2<=%*`````!) +MQT4P`````(7;#X6[!P``2(N-0/W__XM!&(U0`8E1&$B+41!,B2S"2(N]^/[_ +M_P\?0`!(A?]T!>BV1?S_2(N]Z/[__TB%_W0%Z*5%_/](@X50_?__`4B+A5#] +M__\[!>!6`@`/@CKZ__](BX5`_?__BU`8@_H!#X8U`@``2(N%0/W__T&)UXF5 +M8/W__T'1[TB+2!!$B?A(B8U(_?__3(UA^$B-=,'X1(GY9BX/'X0``````$B+ +M%DB)]XT$"3F%8/W__P^"M@```(F-./W__XG+2(F56/W__TB)M3#]___K&0\? +M`$R)/T.-!#8YA6#]__\/@HT&``!$B?.)QT&)QHN%8/W__TV-+/Q-BWT`28MW +M&$$YQG,Y2(N%2/W__TB)M5#]__](BP3X2(MX&.BC1/S_2(NU4/W__X7`?A-! +MC48!38TLQ$F)QDV+?0!)BW<82(N%6/W__TB+>!CH=43\_TF-/-R%P`^(>?__ +M_XN-./W__TB+E5C]__](B[4P_?__2(D72(/N"(/I`0^%)?___XN%8/W__TB+ +MC4C]__](B<))C03$2(LQ3(L(1(U"_TB),$R)"8/Z`@^$]@```$2)P$R-?,'X +M3(F]./W__[@"````0;T!````1(F%8/W__TR)C5C]__](B8U(_?__ZQP/'X`` +M````3(D^C00;.85@_?__#X*>!0``08G=B<>)PXN%8/W__TV--/Q-BSY)BW<8 +M.<-S-TB+A4C]__](B;50_?__2(L$^$B+>!CHET/\_TB+M5#]__^%P'X1C4,! +M38TTQ$B)PTV+/DF+=QA(BX58_?__2(MX&.AK0_S_2XTT[(7`>(-,B[TX_?__ +M1(N%8/W__TB)\$R+C5C]__](BXU(_?__3(D(38L/08/H`4F#[PA(BP%)B4<( +M3(D)08/X`0^%$O___X.]`/W__P(/A`\.``"_R`$``.C[0?S_\P]^!1/R`0!( +MB<-(C04Q"0(`9D@/;M!(C07%"`(`3(US*&8/;,)F2`]NV$R-:R!,B??HHH'__TB-N_````#HQDS]_T4QP,:#&@$` +M``!,C:,@`0``3(F#$`$``$R)YV;'@Q@!`````.@M3_W_2(T%[N0!`#'_\P]^ +M!13Q`0#&@S0!```!9D@/;N!(@\!HB;LP`0``2(V[.`$``&8/;,1F2`]NZ$B# +MP##&@S#P`0!(B4,@9@]LQ0\10Q#H/TS]_TB-NT@!``#H +MPT[]_TB-NU@!``#HMT[]_TB-NV@!``#HJT[]_TB+!:Q5`@`Q]L9#:`!,B>=( +MC0UT50(`9@_OP(.#,`$```%(B8,``0``2(E#8`^VA0?]__](B;.X`0``2(NU +M\/S__TC'@\`!```!````2(F+"`$``&;'@S4!`````(B#&@$```\1@W@!```/ +M$8.(`0``#Q&#F`$```\1@Z@!``#HIU/]_V8/;P7_`P$`,% +M^/[_______],B>=(B8W0_O__2(F-V/[__TB)C>#^__\/$87H_O__Z%=+_?]( +MC;T0____Z-M-_?\/MH4&_?__@[T`_?__`$R)YV;'A2#___\``$B+M?C\__\/ +ME(4C____,=*(A2+___^)E=C^__^)A=S^___HVDO]_TR-I?#]__],B>?HBTW] +M_S'`3(V]$/[__TR+C0C]__],BX4@_?__2(F%`/[__TB+C1C]__],B?Y(C94` +M_O__2(F%"/[__TB+O4#]__](B840_O__2(F%&/[__TB-A5#^__],B;TP_?__ +M4$B-0PA!5%-0057_M6C]___HK(L``$R)_TB#Q#!!B<3H[?#^_TB+O0#^__]( +MA?]T!>@<0/S_2(-[8`!T$X![:`!U#;X!````3(GWZ')___^#O?C]__\`#X7* +M!0``2(.[B`$````/A8$```!(@[N0`0````^%#@8``$B#N[`!````#X5;!0`` +M2(.[H`$````/A:0```!%A>0/A5]L_/](B[WP_?__2(7_=`7HHS_\_TB+O6C] +M___HQV?__TB)W^AOB0``2(V]>/W__^@3&/[_2(N](/W__^CG1?W_2(N]&/W_ +M_^C;1?W_Z:H```!,BR5'4P(`3(GGZ&=;_?])BPPDNA4```"^`0```$B-/=;V +M``#H'4'\_TR)Y^A%6_W_2(.[D`$````/A5P%``!(@[NP`0````^%J00``$B# +MNZ`!````#X5V!0``2(N]\/W__TB%_W0%Z/H^_/](B[UH_?__0;P"````Z!AG +M__](B=_HP(@``$B-O7C]___H9!?^_TB+O2#]___H.$7]_TB+O1C]___H+$7] +M_TB+O8#]__](A?]T!>BK/OS_2(N]D/W__TB%_W0%Z)H^_/](C;TX_O__2(V= +M(/[__^AGQ#H?TS]_T&+13!)@\8(C5`!08E5,$F+52A(B1S"3#FU8/W__W6O +M2(NU0/W__XN5`/___XM&&(U(`8E.&$B+3A!,B2S!2(N]^/[__X72#X3"]___ +MC5K_2,'C`V9F+@\?A```````3(LD'TV%Y'0Q28M\)!!(A?]T!>A8/?S_28L\ +M)$B%_W0%Z$H]_/],B>>^(````.@=//S_2(N]^/[__TB#ZPA(@_OX=;SI9_?_ +M_P\?@`````#'A6#]__\`````13'VZ0CF__](C13%`````$R)X4R)]DB)W^@8 +M/OS_3(GWZ/`\_/_I8NC__TB-%,4`````3(GA3(GV3(GOZ/4]_/],B??HS3S\ +M_^F$]O__2(L[2(7_=`7HNSS\_[X0````2(G?Z(X[_/^#K1C^__\!QH50_?__ +M`,:%2/W__P'I*N7__T2-02#IL^S__\:%2/W__P#&A5#]__\!Z0[E__](BX40 +M_O__2(L8@WL(``^$_.S__T4Q_TR)O=#^__],B;W8_O__Z8?G__]$B;U@_?__ +M1#N]+/[__W5D08'__O__?P^'[6O\_T2)^+G___]_P>@"1"GY@\`!.<@/1\%& +MC20X3(GC2<'D`TR)Y^BH./S_28G%BX4H_O__3(NU(/[__X7`#X4P`0``387V +M#X4]`0``3(FM(/[__XF=+/[__[]8````Z*`Z_/\Q_TB)PTB).+\0````Z%XX +M_/](BPW'_@``,?9(B0-F#^_`B3"_$````$B)2P@/$4,0Z#HX_/\QTDB)0QA( +MBPV=_@``2(G?B1"+A2C^__](C;50_O__2(E+(#')C5`!2(E+*(F5*/[__TB+ +ME2#^__](B4LP2(E+.$B)2T!(B4M(2(E+4$B)',+HI$W]_^D_YO__18GNZ=+D +M__](C13%`````$R)X4R)]DR)[^A!//S_3(GWZ!D[_/_I4^S__TB+$TB--()F +M9BX/'X0``````&9F+@\?A```````#Q^``````(L*@_DJ#Y3`@_D_#Y3!",AU +M"4B#P@1(.=9UY8/P`<:%4/W__P&(A4C]___I5N/__TB-%,4`````3(GA3(GV +M3(GOZ,H[_/],B??HHCK\_^FV_O__2(T].?<``.F7Y___@[TL_O__`,>%8/W_ +M_P`````/A:#^___I1/[__^E";/S_3(LE44X"`$R)Y^AQ5OW_28L,)+H2```` +MO@$```!(C3V8\```Z"<\_/](B[.P`0``3(GGZ!A7_?](B0/A?7Y__]!O`5``(#IZOG__T6%]@^)%^;__T&)WT4Q +M]ND,YO__3(LEK$T"`$R)Y^C,5?W_28L,)+H.````O@$```!(C3TL\0``Z(([ +M_/],B>?HJE7]_^EN^O__3(LE=DT"`$R)Y^B65?W_28L,)+H-````O@$```!( +MC3T;\0``Z$P[_/](B[.@`0``3(GGZ#U6_?](B),B?9(B=_H56$``$B+O=#^__]( +MA?\/A'7?___H$#G\_^EKW___2(G?Q@6!!0(``>C\./S_Z4G:___H\CC\_^DK +MVO__2(V%T/[__TB--(I(B<=(B85H_?__3(T]@4P"`.CL1?W_08M6%$$Y5A!U +M6('Z_O__?P^'DF7\_XG0N?___W_!Z`(IT8/``3G(#T?!1(T\$$V)_4G!YP-, +MB?_H+S7\_TB)PT&+1A"%P`^%'P$``$F+?@A(A?]T!>AR./S_28E>"$6);A2_ +M$````.@P-_S_2(NU:/W__TB)QTB)P^C^1OW_08M&$(U0`4&)5A!)BU8(2(D< +MPDB+O=#^__](A?\/A(G=___H)CC\_^E_W?__2(V%T/[__TB)A6C]___I<^O_ +M_TB+O6#]__](C37Q[@``3(T]J4L"`.B$0OW_Z8?G__^#[@$/A5OG__^+%(J# +M^G]_*4B+2!!(BAA-OS_28MV"$B- +M%,4`````3(GY2(G?Z&HX_/_IQ?[___,/'OKI,&3\__,/'OI)B<3I7F3\__,/ +M'OI(B^DF)Q.D:9?S_\P\> +M^DB)P^ET:/S_\P\>^DB)P^EQ:/S_\P\>^NFJ:?S_\P\>^DB)P^E::?S_\P\> +M^DB)P^EA:?S_\P\>^DF)Q.FM:/S_\P\>^ND8:?S_\P\>^DB)P^E3:?S_\P\> +M^DB)P^E-:/S_9BX/'X0``````&8N#Q^$``````!F+@\?A```````D$B)\$@Y +MT0^$AP,``%5$B<9)B5!5T6)QT%608/G!$&^_?\``$%5051! +MO(````!32(G[2(G73(UO`42)?=`/OA>$T@^)+0(``&9F+@\?A```````#Q]` +M`(UZ/HG10(#_,G9(2(7;#X10`0``#[;2@<(`[P``A?9!#T360HD4DTF#P@%- +M.>D/A,D```!!#[Y5`$F-30&$T@^)RP```(UZ/DF)S8G10(#_,G>X#[;1B574 +M@/G?#X?.`0``@>K`````N0$```!-B>]%,=OK$`\?`$F#QP&#Z0$/A$L!``!- +M.<]T1D$/MC^#QX"#_S]W.L'B!D&#PP$)^D&#^P%UTT2)Y]/O.?IR(H/Y`@^$ +M^0```(/Y`W6\@?H/`0``=K1F9BX/'X0``````)!!]L`"#X36`0``2(7;#X3? +M`0``BU74@<(`[P``0HD4DTF#P@%-.>D/A3?___],B1!;05Q!74%>05]=PP\? +M1```0HD4DTF#P@%).%,B1!;05Q!74%>05]=PV8/'T0``$2-43Y)B=5!@/HR28GZ#X;O_O__28UZ +M`4TYZ0^$R0$``$$/MDT`28U5`83)>-))@\("23G1#X1R____#[8228U-`H32 +M#XBK_O__28G-28/"`4R)[^M@9BX/'X0``````$2)P8/A`0^%E````$F#QP&Y +M`0```.F[_O__9@\?1```BTW0A5!5D%528GU051)B=1(B?)(B?Y32(G[,?_H/W#]_X3` +M=&M!BUT(28MU`(7;=&Q(C40>_X`X+W4.ZQL/'P!(@^@!@#@O=`](.<9U\D4Q +M]C';ZQ`/'P!(*?!$C7`!3(GS3`'V3(GGZ/,Z_?]!.UT(5!5T%6055!5%-(@^P(2(L'2(M` +M$$@YT`^%=P$``(-O"`%T&4B#Q`A;05Q!74%>05]=PV8N#Q^$``````!(C071 +MP@$`3(MG$$R-;]#S#WX%`>,!`&9(#V[(2(/`8&8/;,%F2`]NT$B#P&@/$4?0 +M9D@/;MA(@\`P\P]^!=[B`0!(B0=F#VS"#Q%'X/,/?@73X@$`9@]LPP\11_!- +MA>0/A,4```!,B>?HL```!)C9PD4"4``$V-M"10 +M50``ZQQF9BX/'X0```````\?1```2('#@`$``$PY\W0N@'NX`'3N2(NS0/__ +M_TB)W_]3",9#N`!(@<.``0``2,>#P/W__P````!,.?-UTDF-G"00)0``38VT +M)!!5``!F#Q]$``!(BS-(A?9T&4F+!"1(B^^<````%M!7$%=05Y! +M7UWI:BW\_V8N#Q^$``````###Q^``````/_02(/$"%M!7$%=05Y!7UW#38V\ +M)'@"``!-C;0D>"0``$''A"2P`0```0```&9F+@\?A```````3(G_Z&C__/]) +MBU\02(7;="=)QT<0``````\?@`````!)BP=(B=Y(BQM(BT`@2(G'_U`(2(7; +M=>A)@<<0`0``33GW=;Q)B[0DZ`$``$B%]G0:28N$))`!``!(B$)&@!````````Z67^__^09@\?1``` +M2(7_#X2G`0``54B-%9\$_?](B>5!5T%6055!5%-(@^P(2(L'2(M`$$@YT`^% +MAP$``(-O$`%T&4B#Q`A;05Q!74%>05]=PV8N#Q^$``````!(C05AP`$`3(MG +M&$R-;]CS#WX%D>`!`&9(#V[(2(/`8&8/;,%F2`]NT$B#P&@/$4?89D@/;MA( +M@\`P\P]^!6[@`0!(B4<(9@]LP@\11^CS#WX%8N`!`&8/;,,/$4?X387D#X34 +M````3(GGZ`'P_/]!BX0D:`$``(7`#X7Z````28V<)%`E``!-C;0D4%4``.LK +M9F8N#Q^$``````!F9BX/'X0``````&8/'X0``````$B!PX`!``!,.?-T+H![ +MN`!T[DB+LT#___](B=__4PC&0[@`2('#@`$``$C'@\#]__\`````3#GS==)) +MC9PD$"4``$V-M"0050``9@\?1```2(LS2(7V=!E)BP0D2(G'_U`(2,<#```` +M`$C'0P@`````2('#@`$``$PY\W7328M$)!A,B>9(B05]=Z>HJ_/]F+@\?A```````PP\?@`````#_T$B#Q`A;05Q! +M74%>05]=PTV-O"1X`@``38VT)'@D``!!QX0DL`$```$```!F9BX/'X0````` +M`$R)_^CH_/S_28M?$$B%VW0G2<='$``````/'X``````28L'2(G>2(L;2(M` +M($B)Q_]0"$B%VW7H28''$`$``$TY]W6\28NT).@!``!(A?9T&DF+A"20`0`` +M2(G'_U`(2<>$).@!````````28V\)%`"``#HB"K\_T''A"1H`0```````.E6 +M_O__D&8/'T0``/,/'OI52(GE059!54%428G\2(M^<%-(BT<02#M'"`^#RE_\ +M_TF)U4B+%TB-2`%(B4\0@#P"``^$@P```$V%[0^$J5_\_TB)\^B31_[_2#W_ +M__]_#X>:7_S_03M%"`^#BU_\_TF+50!,B>=(BP3"3(LP3(MH".@&1_[_BT,( +M28D<)(/X!`^$9%_\_XU0`4B-!$!(P>`#B5,(2(U4`Q!(B5-P2`'#N`$```!, +MB7,03(EK&$C'0R``````9D&)1"0(6T%<05U!7EW##Q^$``````#S#Q[Z54B) +MY4%7059,C77`055!5%-(B=-(@^PXB76L9$R++"4H````3(EMR$&)S<8"`$R+ +M)S'_Z.0H_/],B?=(B47`Z"@H_/],B?=$BW@@Z'PH_/]$B7@@2(G'Z``H_/\K +M1N75E+_62+^)B(B(B(B(B$B82&G`@&EG_TP!X$B)1;!(]^)(P>H7 +M2(G028G32/?G2,'J!4B)T$F)U$CWYTB)U[JKJJJJ2,'O!4&)_TB)?;A)#Z_7 +M2,'J)(T$E`&B<)(:=)S8Z$+2,'J("G0 +MT>@!T,'H"FG0IP<``$2-0/_!Z@8IUD&#^`P/ARL!``"!P?0%``"!^0\G``!V +M(8G(NED7M]%(@\,!2`^OPDC!Z"V-4#!IP!`G``"(4_\IP4&^S@C08G!B<=-#Z_.2<'I +M(T.-%(E%#[;)`=(IUXT4@$2)T`'2*=!#C122`=(/ML`IT0^VR<'A"`G!0`^V +MQ\'A"`G!00^WP&G`S05]=PV8/'T0``$2-0/.!P?4%``#IS/[__Y!,B>"+?;C&0PH@2+F) +MB(B(B(B(B$CWX<9##3I(P>H%2(G02,'@!$@IT$C!X`))*<2XJZJJJDP/K_A) +MP>\D0XT$?\'@`RG'#[?':<#-S```P>@3C5`PC02``<"(4PLIQT$/M\1IP,W, +M``"#QS!`B'L,P>@3C5`PC02``<"(4PY!*<1!@\0P1(AC#T6%[0^(S@```$R) +MV,9#$#I(]^%(P>H%2(G02,'@!$@IT$C!X`))*<-!#[?#:<#-S```P>@3C5`P +MC02``<"(4Q%!*<-!@\,P1(A;$D6%[0^$DP```$B+1;#&0Q,N2(U+&DB->Q-( +MNKU">N75E+_62/?BBT6P2,'J%TAITH"6F``IT&9F+@\?A```````9F8N#Q^$ +M``````")PDB#Z0%)#Z_62,'J(XTTD@'V*?"#P#"(00&)T$@YSW7>08/]!GEG_O__9@\?A```````3(UK$.E5_O__#Q^``````$R-:Q/I +M1?[__P\?@`````!!@_T'=#J+1:Q)#Z_&2,'H(XU0,(A3&T&#_0AT,XT4@(M% +MK$R-:QT!TBG0@\`PB$,`%!@#P\`$B)^'7S2(/'`68/;LA(QT70 +M`````&8/<,'@9@_61A/)?S_2(M%Z&1(*P0E*````'4< +M2(/$,$B)V%M!7%W##Q]``+\!````,<#I5?___^@?)/S_\P\>^DF)Q.G;6?S_ +M\P\>^DF)Q.G<6?S_D&8/'T0``/,/'OI52(GE4TB#[#AD2(L<)2@```!(B5WH +M2(G+QT$(`````$B+/TC'1=``````2(L'2,S##Q\`A=)T^(G22(T,ENL-#Q]``$B#Q@1(.?%T'HL&C5#Y@_H& +M=@6#^!MUZ,<&7P```$B#Q@1(.?%UXL/#D&9F+@\?A```````#Q\`\P\>^E5( +MB>5!5DF)_D%50513@#X`=&E)B?4QVP\?0`!$C6,!0X!\)0``3(GC=?%$B>9, +MB??HAB[]_T&+5@A)BP9(B=9(C0R0187D="4QP&9F+@\?A```````9@\?1``` +M00^V5`4`B12!2(/``4DYQ'7N2HT$H0'SZQMF#Q]$```Q]N@Y+OW_08M6"$F+ +M!DB)TTB-!)#'``````!!B5X(6T%<05U!7EW##Q^$``````#S#Q[Z54B)Y4%4 +M28GT4XMV"$B)^^CW+?W_08M$)`B+2PA)BS0DC5`!2(L#2(T\B.C<(_S_08M$ +M)`@!0PA;05Q=PY!F9BX/'X0```````\?`/,/'OI52(GE059!54F)_4%428GT +M4XL6A=)T33';#Q\`C4,!B=I(B<-!BP2$A9(C3R03(GRZ&LC_/]!`5T(6T%<05U!7EW#9@\?1```0;X!```` +M,=OKPF9F+@\?A```````#Q\`\P\>^E5(B>5!5TF)_T%6055!5%-(@^P(@#X` +M#X2?````28GU,=MF+@\?A```````1(UC`4.`?"4``$R)XW7Q13EG#')+38LW +M2XT$ID6%Y'0B,=)F9BX/'X0``````&:000^V3!4`08D,EDB#P@%).=1U[<<` +M`````$&)7PA(@\0(6T%<05U!7D%?7<,/'T``2HT\I00```#H4QW\_TF+/TF) +MQDB%_W0%Z*,@_/]-B3=+C02F08E?#.N79@\?1```2(L',=OKK&8/'X0````` +M`/,/'OI52(GE05=)B?]!5DF)]D%528G-0513B=-!C0089@]NR$B#[!A(QP<` +M````9@]PP>!(C3R%!````$2)1<1F#]9%R.C6'/S_\P]^1CS(?S_2(/$&$R)^%M! +M7$%=05Y!7UW#D/,/'OI52(GE055)B?U!5$F)]%,QVTB#[`B`/@!T#V:0C4,! +M08`\!`!(B<-U\XG>3(GOZ%D[_?]!BTT(,^E5(B>5!54F)S8T,,D%40;P``P``4T'3Y$B)^T&! +MQ,`'``!(@^P(2(MW"$B%]G0&1#MG8'0S3(GO0?]5"$2)YDC'0P@`````3(GO +M2`'V0?]5`$B)0PA(A^E5(B>5!5T%6055!5%-(B=-(@>SX +M````2(F]/___TR)A1C___],B8T@____9$B+ +M!"4H````2(E%R#'`Z*HZ_O],BY5X____2(/X!@^$R@@``$F)Q$F#_`@@`#X18"@``28MZ,(G#28/\"`^$LP$``$B%_W033(F5 +M>/___^BH'?S_3(N5>/___TG'0C``````2(T\G0````!,B95X____Z"4:_/], +MBY5X____08M2!$F)0C"%T@^$.@$``$R)I6#___],BZT8____13'V38G40;__ +M__]_ZR5FD$V+30"-4`%)@\8!08E5"$V)',%%.W0D!`^#]P```$F+1"0P0L<$ +ML`$```!)BU0D0$F+1"100@^V!#!"`P2R28M4)#A,BQS"08M%"$$[10QUKTR) +MG7C___\]_O__?P^'FE+\_XG#1(GZP>L"*<*#PP$YTP]'V@'82(G#2,'@`TB) +MQTB)A7#____H8QG\_TF+=0!,BYUX____28G!08M%"(7`=1)(A?9U0TV)30!! +MB5T,Z4____](BXUP____3(G/2(T4Q0````!,B9UH____2(FU>/___^B6'?S_ +M2(NU>/___TR+G6C___])B<%(B?=,B8UP____3(F=>/___^A/'/S_08M%"$R+ +MC7#___],BYUX____ZY-,BZ5@____387D#X5^&```2(M%R&1(*P0E*`````^% +M,!@``$B!Q/@```!;05Q!74%>05]=PTB%_W033(F5>/___^CU&_S_3(N5>/__ +M_TG'0C``````2(T\G0````!,B95X____Z'(8_/],BY5X____08M*!$F)0C"% +MR71%2(T4B(/A`70FQP`!````2(/`!$@YT'0M9F8N#Q^$``````!F9BX/'X0` +M`````)#'``$```!(@\`(QT#\`0```$@YT'7J2(N=W#HDS?^_TPY +MZ'+>Z=!1_/]F#Q^$``````!,B[UP____O@L```!,B95X____3(G_Z/4]_O]) +MBW]PZ%PW_O](B<-(/?___W\/AY11_/]%,=)(C7V`3(G^B87T_O__2(N5:/__ +M_V9$B56(2(F]Z/[__^A%[___3(N5>/___TF+1W!$C6,!28MZ2$B+4!!(`Q!! +MB5H$2(F5$/___TB%_W0,Z$8:_/],BY5X____2<="2`````!.C2RE`````$R) +M[TR)E7C____HP!;\_TR+E7C___])BWI028E"2$B%_W0,Z`<:_/],BY5X____ +M2<="4`````!(B=],B95X____Z(D6_/],BY5X____28MZ6$F)0E!(A?]T#.C0 +M&?S_3(N5>/___TG'0E@`````2HT\Y0````!,B95X____Z$T6_/],BY5X____ +M28MZ0$F)0EA(A?]T#.B4&?S_3(N5>/___TG'0D``````3(GO3(F5>/___^@6 +M%OS_3(N5>/___TB+C7#___](QT68`````$C'1:@`````28E"0$R+:7"%VP^$ +MW!0``$C'A4C___\`````B=A,B>I(B84(____2,>%./___P````!(QX58____ +M`````,>%*/___P````#'A2S___\`````#Q^``````$B+0A!(`P),B>],B95X +M____2(N5$/___TF+2EA(B[5(____2"G02(D$\>B!-?[_N@```(!(B850____ +M2#G0#X.Q4/S_2(N%4/___TR+E7C___^)A6C___^#Z`&)A4#___^#^#\/AW=0 +M_/_'A7C___\`````13'_9@\?A```````28MU$$F+10A(.<8/@X)0_/])BWT` +M2(U.`4F)31!$#[8T-T&`_C\/AY]._/]%B?%%B?!!@^$/08/@#T&`^0@/A\)0 +M_/]!#[;12"G(2#G0#X*>4/S_,=M%A,ET*$B-=#<"2(T$#S';08UX_T@!_@\? +M``^V.$C!XPA(@\`!2`G[2#G&=>U(`8#2`'(2(M:$$@#&DB+E1#___](*=.+E2S___^)$$F+0DB+ +ME2C___^)%`A)BT)82(D<,$D[6F@/A/81``!)BWI@2(7_=!M,B95X____Z*<6 +M_/],BY5X____2<="8`````!)QT)H`````$B%VP^%>1(``$B+O3C___](A?]T +M$TR)E7C____H;Q;\_TR+E7C___](B[U8____2(7_=!-,B95X____Z%`6_/], +MBY5X____2(N]Z/[__TR)E7C____HAC+^_TB+O7#___^^#````.AE.?[_3(N5 +M>/___XN=+/___TF+>CA(A?]T#.@*%OS_3(N5>/___TG'0C@`````2,'C`T4Q +MY$B)WTR)E7C____HA1+\_TR+E7C___]$BX4L____28E".$6%P'0K3(NM/___TB+>'#HWC'^_TR+E7C___])B<3I0_?__TR+O7#___])BW]P +MZ+\Q_O](B0-).8>0````#X+`2OS_2(N%/___T@]____?P^'Q4O\_TB+O7#___^^"0```$R+M7C____H +M]C?^_TR+E6#___]%B?=%C6X!28MZ"$B%_W0,Z)H4_/],BY5@____2<=""``` +M``!*C3SM`````$R)E6#____H%Q'\_TR+E6#___](BXUX____28E""$&)"H7) +M#X0D$```2(F=6/___T&)S44Q]DV)U$B+G7#___]$B;U@____2<'E`TV)]P\? +M1```3HDT.$B+>W#HTS#^_TP!\$F)Q@^"V$G\_TF#QPA)BT0D"$TY[W791(N] +M8/___TB+G5C___]-B>)-B?1(BXUX____3(UMH$R)),AF#Q]$``!(BX5P____ +M3(F5>/___TB+>'#H>3#^_TR+E7C___](A<`/A)8+``!(@_@*#X3!"@``2(N% +MB) +MQTB+#/E(.=D/A#'[__](.),B94P____28TTR$C!X@-)C3S`2(F-8/___^BK$_S_ +M3(N5,/___TB+C6#___]!O`$```!)BT)X2(D],B95@____Z#$O_O^Z````@$@YT`^#$DO\_TR+ +ME6#___]!B<2#^$`/ASI)_/],B>],B95@____Z`$O_O^Z````@$@YT`^#"4G\ +M_TR+E6#___^#^`$/A%WZ___I@TK\_V8/'T0``$R)[TR)E6#____HR2[^_[H` +M``"`2#G0#X,(2/S_28M-$$F+50A,BY5@____2"G*2#G"#X*C2OS_2(/[(74Z +M@_@!=35(BY5P____2(M2<$B+,DB+4A`/MA0603A2<',$08A2<$@!R$F)11#I +M`_K__V8/'X0``````$B!^P$!`P!UXH/X!77=2(NUEM_O__B=!,B94P____P>@"C40"`8F%8/__ +M_TC!X`-(B<=(B84`____Z.\-_/],BY4P____28G`08N2@````$F+/___TR+E6#___\YT`^#L$?\_TB+E5C___](`="` +M.``/A9U'_/_&``%(BX5P____3(F58/___TB+>'#HB2S^_[H```"`2#G0#X-T +M1OS_BY5H____3(N58/___SG0#X-+1OS_2(N5./___T@!T(`X``^%.$;\_\8` +M`8/#`3F=0/___P^%4?___XN=>/___XN%0/___T4QY"G#@_L!=EQF9BX/'X0` +M`````$R)[TR)E6#____H$2S^_[H```"`2#G0#X.!1?S_BY5X____3(N58/__ +M_SG0#X-81?S_2(N56/___T@!T(`X``^%147\_T&#Q`'&``%$.>-UKTB+E3C_ +M__^+C6C___\QP(`Z`'0K@\`!2(/"`3G(=?!(BT7(9$@K!"4H````#X2(1OS_ +MZ8A&_/\/'X0``````(N-4/___SG(#X50]___Z]!-B>))B<1(B9UP____08M" +M!(G#28/\"0^$10<``$4Q[87`#X2O````3(FE:/___TR+O1C___]-B=;K$`\? +M1```28/%`8G#03G%1U:NGT`@``#Q\`2(N%?HA2K^_TF+3"0028M4)`A(*/___TB+>'#H22K^_TR+E7C___](A2,=%H`````!(QT6H`````.BXP?[_ +M2(N%&/___TR+E7C___]$BW`(2(N%(/___T0Y<`S'0`@`````#X/!!```187V +M#XBC1/S_2(N%(/___TB+.$B%_W033(F5>/___^@*#?S_3(N5>/___TR+O2#_ +M__]%B?1,B95X____3(GG2<<'`````$''1PP`````Z'L)_/]F00]NSD4Y=QQ) +MB0=F#W#!X$''1Q@`````3(N5>/___V9!#]9'"'-=2(N%(/___TB+>!!(A?]T +M$TR)E7C____HEPS\_TR+E7C___],B[T@____2HT\I0````!,B95X____2<=' +M$`````!!QT<<`````.@%"?S_28E'$$R+E7C___]%B7<<2(N%(/___T&+<@1, +MBUV@1(EP&(7V#X0@`0``28MR,(F=6/___S'_,AAS2TF+4A"`/#H`=$%,BP.)PH/``4'&!!`!38M" +M($6+#+A,BT,018D,D$B#QP%!.WH$#X.T````2(N58/___T2+#+I!@_D!=+1% +MA/___^@#"_S_3(N5>/___^E'_?__2(N%&/___XM8"$B+A2#___\Y6`@/ +MA"\!``!(BX4@____QT`(`````#E8#`^#,`$``(7;#XCJ/_S_2(N%(/___TB+ +M.$B%_W033(F5>/___^BC"OS_3(N5>/___TR+O2#___]!B=Q,B95X____3(GG +M2<<'`````$''1PP`````Z!0'_/]F#V[303E?'$''1Q@`````9@]PPN!)B0=, +MBY5X____9D$/UD<(#X+8````2(N%(/___T&+2@2)6!B%R0^$A0```$V+6C!% +M,Q`QP&8/'X0` +M`````(T4!H/``4'&!!``QP27`````#G(!!(A?]T$TR)E7C____H50G\_TR+E7C___], +MB[T@____2HT\I0````!,B95X____2<='$`````!!QT<<`````.C#!?S_08E? +M'$R+E7C___])B4<0Z<;^__^+M?3^__],B>=(B=KH7KW^_TB)WDR)Y^B#-?[_ +MZ5GS__],B[5P____3(GJ1(G^2,=%H`````!(QT6H`````$R)]TC'1;`````` +M2,=%N`````#H&;W^_TR)[DR)]^@^-?[_2(M]L$R+E7C___](A?]T#.B9"/S_ +M3(N5>/___TB+?:!(A?\/A*7T__],B95X____Z'D(_/],BY5X____Z8WT__]( +MBX4@____1(EP",=`&`````!$.7`<#X/[^___187V#XB,/?S_18GTZ8W[__]! +M.T(8#X,R^O__28MZ$(`\!P`/A2;Z___I'_K__T&+"DB+M7#___],B95X____ +M28M2"$B+AI````!(*P-(.P3*#X*[/?S_2(M^<.BA)/[_3(N5>/___TF)Q.G\ +MZ?__@?K^__]_#X>#/?S_B="Y____?\'H`BG1@\`!.<@/1\&-#!")C7C___]( +MP>$#2(G/2(F-8/___^A&!/S_08M7"$F+-TB+C6#___])B<2%T@^%]@(``$B% +M]@^%!P,``(N%>/___TV))T&)1PQ!BT8$Z23Y__\QVX7`#X3E`0``28G=38G7 +M2(N=&/___^L.28/%`44[;P0/@\4!``!)BT/___TB+G7#___])B<5(B;50 +M____3(F]0/___^LU#Q^$``````!-BQ0DC7@!08E\)`A-B03"30'H38G%#X*5 +M//S_08/&`40YM7C___\/A.(```!(BWMPZ&HC_O])BH"*<&#P@$YR@]'T42-/`)$B;UH +M____2<'G`TR)_^@.`_S_28LT)$R+A6#___])B<)!BT0D"(7`=1E(A?9U1HNU +M:/___TV)%"1!B70D#.E2____3(G72(T4Q0````!,B?E,B858____2(FU8/__ +M_^@]!_S_2(NU8/___TR+A5C___])B<)(B?=,B958____3(F%8/___^CV!?S_ +M08M$)`A,BY58____3(N%8/___^N/3(N]0/___TB+M5#___],B>-,BZU(____ +M28M/0$F+5U!"#[84*@,4,4F+3SA(BQ313#G"#X)I._S_3"G"28G4.7L,=$A, +MBS.-1P%)@\4!B4,(38DD_D4[;P0/@CO^__]-B?I(BX5P____3(F5>/___TB+ +M>'#H&"+^_TR+E7C___])B<1!BUH$Z2OW__^!__[__W\/A_8Z_/^)^+K___]_ +MP>@"*?J#P`$YT`]'PHT,.(F->/___TC!X0-(B<](B8UH____Z+D!_/^+>PA( +MBS-(BXUH____28G&A?]U%DB%]G4MBX5X____3(DSB4,,Z57___^)^DB)QTB) +MM6C___](P>(#Z/H%_/](B[5H____2(GWZ,L$_/^+>PCKQDB%VP^$-N[__TF+ +M>F!(B[40____2(G:3(F5>/___^CC`OS_3(N5>/___^D0[O__2,'B`TB)QTB) +MM6#____HI`7\_TB+M6#___](B??H=03\_T&+5PCIZ/S__\>%*/___P````!, +MB>HQ]C')QX4L____`````$C'A3C___\`````2,>%6/___P````#I0NW__T4Q +MY.DY\/__28M70$F+1U"+>PA"#[8$*`,$,DF+5SA,BR3"Z6S^__](B=],B95X +M____Z)\`_/],BY5X____2(G'28E"8$F)6FCI+____^CC`OS_\P\>^DB)P^DT +M.?S_\P\>^NE..?S_\P\>^DB)P^GI._S_\P\>^NG(.OS_\P\>^DB)P^GK.OS_ +MZ6DY_/_S#Q[Z2(G#Z7P\_/]F9BX/'X0``````)#S#Q[Z54B)Y4%7059!54%4 +M4TB![+@!``!(BT402(M=($B)O>C^__](B;6(_O__1(G&2(F%>/[__TB+11A( +MB95`_O__2(F%6/[__TB+12A(B8VX_O__2(F%T/A;D(``!F9BX/'X0``````)!(BX4(____ +M10-W&$F#QR!%B?5).<#^__], +MBXW(_O__3(N5T/[__TR+A0#___])C03'2(F%"/___TB)WTR)A2#___],B8TH +M____3(F5,/___^A#'/[_O@```(!(.?`/@X,G``!!B09(B=_H*AS^_[X```"` +M3(N%(/___TR+C2C___],BY4P____2#GP#X-%/?S_08E&!$B+A0C___])@\8( +M23G&=9.+A>#^__]!.<4/@C@Z_/^+C>#^__]$B>A,B84(____*%:/___P````!(QX5P____`````$C'A7C___\````` +M2,=%@`````!(QT6(`````$C'19@`````2,=%H`````!(QT6H`````$C'1;`` +M````2,=%N`````!(QT7``````(7V#X5M!@``QX5H____`````$R+M?#^__]( +MC85@____2,>%8/___P````#'A6S___\`````2HT\M0````!(B84`____Z/?Y +M^_](B85@____1(FU;/___TB+A?#^__](BWVXQT7``````(F%:/___SE%Q'-& +M2(7_=`7H(OW[_TR+M?#^__](C85@____2,=%N`````#'1<0`````2HT\]0`` +M``!(B84`____Z)'Y^_](B46X2(G'1(EUQ(N%\/[__XNUV/[__S'2B47`2(N% +M8/___V9F+@\?A```````9F8N#Q^$```````/'X0``````$&+3"0828/$((D, +MD$F+3"3@2(D,UTB#P@$Y\G+CB5V0BX7(_O__QT6(`````#E%C`^#.04``(7` +M#XA@.?S_2(M]@$B%_W0%Z&3\^_^+E-)P>0"2(F%`/___TR)Y^B#]_O_ +M28G`BT6P2(MUJ(7`=15(A?9U-$R)1:B)7;3I>/___P\?0`!,B<=(C12%```` +M`$R)X4B)M0#____HQOO[_TB+M0#___])B/]__\/'P!-A>T/A&?Y__],B@/@HHW_/]+C3003(GJ3(F-R/[_ +M_TR)E=#^__],B84`____Z*?W^_],BY70_O__3(N%`/___TR+CKI +M&OG__V8N#Q^$```````]_O__?P^'T3;\_XG#NO___W_!ZP(IPH/#`3G3#T?: +M1(TD`TB-A6#___],B>-)P>0"2(F%`/___TR)Y^B@]?O_28G%BT6@3(MUF(7` +M#X5%`0``387V#X52`0``3(EMF(E=I.DR_?__BT6(`X5X____.870_O__#X3D +M`@``#Q]``+L!0`"`2(M]N$B%_W0%Z*WX^_](BWVH2(7_=`7HG_C[_TB+?9A( +MA?]T!>B1^/O_2(M]@$B%_W0%Z(/X^_](B[UP____2(7_=`7HAA^/O_2(.]P/[__P!T#$B+O<#^___H2_C[_TV%_W0(3(G_Z#[X +M^_](BX6P_O__3(NUJ/[__TB+`$F)Q4B)A0C___](BX6H_O__2<'E!4Z-)"A, +M.>!T)V9F+@\?A```````#Q]``$F+?"3H28/L($B%_W0%Z.WW^_]-.>9UZ$B+ +MO;#^__])C74(Z-CY^_](BT7(9$@K!"4H````#X4<'0``2('$N`$``(G86T%< +M05U!7D%?7<.0,<#IK/;__TB-%(4`````3(GA3(GV3(GOZ+/X^_],B??HB_?[ +M_XM%H.F>_O__3(GO3(F-R/[__TR)E=#^__],B84`____Z`;T^_])B4<(3(N% +M`/___TB)QTV);Q!,BY70_O__3(N-R/[__^FJ_?__BY7(_O__B56(A=(/A1?[ +M___I)OO__TB+O4C^__](C85@____2(F%`/___TC!YP/HK?/[_XNUX/[__TB) +MA7#___\QTF9(#V[^9@]PQ^!F#]:%>/___V9F+@\?A```````9F8N#Q^$```` +M``!F#Q]$``!)BPS72(D,T$B#P@%(.=9U[\>%:/___P````"+A?#^__\YA6S_ +M__\/@UKY__](B[U@____2(7_#X0%^?__Z([V^__I^_C__TTYT0^%GS3\_TB+ +MA;C^__](BXV@_O__@[WP_O__($B+0%`/MAP(#X>/&P``2,>%P/[__P````#I +M._C__T4Q_^D1]___BX78_O__C4C_9F8N#Q^$``````"0,<#K&69F+@\?A``` +M````D$B#P`%(.<$/A,/W__]!.13'=>V%P`^(M??__X/"`4$YU77-2(M%R&1( +M*P0E*`````^$Q3/\_^G.,_S_#Q]$``!(C85@____2,>%0/___P````!(QX5( +M____`````$B)A0#___](B850____187D#X66%```2(V%0/___XMUD,>%2/__ +M_P````!(B<=(B84(____Z/D*_O^$P`^$P?S__TB+M9C^__](A?8/A&X3``!( +MBXVX_O__2(N=H/[__TB+44!(BT%0#[8$&`,$FDB+43A(BP3"2(L62#G0#X)) +M$P``2#G"#Y2%2/[__TB+C>C^__^`.0!T3XN%:/___SM!$'5$A<`/A&43``!( +MBW$(2(T4A0`````QP$B+C6#____K'69F+@\?A```````#Q]$``!(@\`$2#G" +M#X0Q$P``BQP&.1P!=.M(BYWH_O__2(N[@````,8#`$B%_W012(L'_U`02,># +M@`````````"_N````.AZ\_O_2(N-Z/[__TB)PTC'0!``````2,=`&`````#S +M#WX%Z*`@`````````#&@(@`````2(T%H)H!`&9(#V[X2(E9 +M<$B+!7"V``!(QX.8`````````&8/;,=(QX.@`````````$C'@Z@````````` +M2,>#L`````````!(B8.,````#Q$#2(7_#X3\$0``2(L'_U`02(N%Z/[__TB+ +M>'!(B9B`````2(7_#X3O+_S_2(N%Z/[__TB-5PA(C0UJ1?[_2(NU`/___TB) +M4'A(BT<(2(M`$$@YR`^%3A(``.C)0/[_B<.%P`^%I/K__TB+A;#^__]%,>WS +M#WX]M:8!`$R-8"!(C04JC@$`9D@/;LAF#VSY#RF]\/[__V:01(L-F0,"`&8/ +M[\!)BTPDZ`\IA4#___]%A-U[DB+ +MC3#^__^^*`,``$B+G=#^__],BZ4H_O__2(G/Z-GP^_]!BT8@2(F=2/___XF% +M5/___P\?A```````08L$)(/X`0^$`PX``$R+M4C___]-A?8/A"\.```[A53_ +M__\/A0$.``!(BX7H_O__2(T5R4?^_TB+>'A(BP=(BT`82#G0#X4E#@``2(NU +M"/___TB#[PCH=4/^_TB+A4C___](AC^__^+G6C___\Y6!0/@CL0``!(BX7H +M_O__B5@0A=L/A0P6``!(BX7H_O__BYUX____.5@D#X/^$@``2(MX&$B%_W0% +MZ*SP^_],B[7H_O__08G<2<'D`TG'1B``````3(GG2<=&&`````#H)NW[_V8/ +M;OM)B4882(G'9@]PQ^!F00_61B!(B[5P____3(GBZ*'N^_](BX7H_O__BUV( +M.5@T#X-O$@``2(MX*$B%_W0%Z$#P^_],B[7H_O__08G<2<'D`DG'1C`````` +M3(GG2<=&*`````#HNNS[_V8/;OM)B48H2(G'9@]PQ^!F00_61C!(BW6`3(GB +MZ#CN^_^+19!(B[7H_O__BUV@B48X.5Y,#X-I$@``2(M^0$B%_W0%Z-'O^_], +MB[7H_O__08G<2<'D`DG'1D@`````3(GG2<=&0`````#H2^S[_V8/;OM)B49` +M2(G'9@]PQ^!F00_61DA(BW683(GBZ,GM^_](BX7H_O__BUVP.5A<#X/=$0`` +M2(MX4$B%_W0%Z&CO^_],B[7H_O__08G<2<'D`DG'1E@`````3(GG2<=&4``` +M``#HXNO[_V8/;OM)B4902(G'9@]PQ^!F00_61EA(BW6H3(GBZ&#M^_](BX7H +M_O__BUW`.5AL#X.Z$0``2(MX8$B%_W0%Z/_N^_],B[7H_O__08G<2<'D`TG' +M1F@`````3(GG2<=&8`````#H>>O[_V8/;OM)B49@2(G'9@]PQ^!F00_61FA( +MBW6X3(GBZ/?L^_](BX7H_O__Q@`!2(N%Z/[__TB-%;_[_?](BWAX2(L'2(M` +M,$@YT`^%;!```$B#[PCH(OK]_XG#A=L/A;WU__^+A5#^__]%,>U(B[6`_O__ +M2,>%T/[__P````!(BXV@_O__QH50_O__`,>%H/[__P````!(C03&2(F%@/[_ +M_TB+A;C^__](BT!`1(LTB$B+A>C^__](C34-WOW_2(MX>$B+!TB+0"!(.?`/ +MA5T/``!(BX>@````2(NUT/[__TB+!#!(!?````!,BR!-A>0/A*4.``"`O5#^ +M__\`#X6Z````#[:=5_[__X3;=%9)BP0D2(N5"/___TB--4N>``!,B>=(QX5` +M____`````/\02(N]0/___TB%_W0C2(L'2(T5%3?]_TB+0!A(.=`/A9`0``"+ +M15"(G5#^__^)1SSHQ[___TF+!"1(BY4(____3(GG2,>%0/___P````!(C377 +MG0``_Q!(B[U`____2(7_="9(BP=(C0W?-OW_2(M`&$@YR`^%'`\``$B+15C& +MA5#^__\!2(E'..C^O/__28L$)$B+E0C___],B>=(QX5`____`````$B--`T``$B+!TB+=(X0_U`82(N]0/___XG#/5<`!X`/A'H/``"%P`^% +M=P\``$B%_W0&2(L'_U`028L$)$B-E1C___],B>=(QX48____`````$B--8>U +M``#_$$B+O1C___](A?\/A'`!``!(BX5H_O__Q@`!2(N%("Z*SI^__'0P@`````2(NU +M0/___TB%]@^$UPP``$B+G9#^__](B=_H9OW\_XM;"$B)V$@!P$B)A?#^__\/ +MA8D,``!%,<`QR4B+M4#___\QP$B%VW0P9F8N#Q^$``````!F9BX/'X0````` +M``\?@`````"+%(:(%$&(=$$!2(/``4@YPW7M2(N]&/___TB)C3#^__](B/SH=^K[_TB+O1C___](A?]T!DB+!_]0$$F+!"1(BY4(____3(GG2,>% +M0/___P````!(C37EFP``_Q!(B[U`____2(7_#X1;#```2(L'#[:U2/[___]0 +M&$B+O4#___^)PX7`#X4/#@``2(7_=`9(BP?_4!`/MH5(_O__B(4P_O__2(N% +ML/[__TB+M=#^__^+1+`@28G$2(7`#X0,"P``2(T#^__](B<-#C30L,@```` +M2(N-T/[__TB+#`@/MH4P_O__B($$`0``,!&`$```````!$B>?'@20!````````2,'G`XF5*/[__TB)C3#^ +M___H8>7[_TB+C3#^__^+E2C^__](B8$8`0``1(FA)`$``$2+H0`!``")D2`! +M``!$B>+'@3`!````````1#FA-`$```^#A0```$6%Y`^(=B'\_TB+N2@!``!( +MA?]T($B)C3#^__]$B:4H_O__Z%?H^_^+E2C^__](BXTP_O__2,>!*`$````` +M``!$B>?'@30!````````2,'G`XF5*/[__TB)C3#^___HO.3[_TB+C3#^__^+ +ME2C^__](B8$H`0``1(FA-`$``$2+H0`!``")D3`!``!%A>1T7T2)YDR+F2@! +M```QP$C!Y@/K)@\?1```2(L4`T4QP$B%TG0&3(L"2(GZ2(/`"$R)!TF)$4@Y +MQG0G2(NY&`$``$V-#`-(`<=(A=MUS#'213'`2(/`"$R)!TF)$4@YQG792(7; +M=`A(B=_H@^?[_TB+A?#^__](A(/V`4`/MO9(BP=(BT`H2#G0#X4$#@``2(/O".BY\?W_OT@` +M``#HS^7[_TF)Q<=`"``````Q]DB-!:R,`0!)B44`28U%($G'11``````2(G' +M2(F%N/[__^A=Y_O_08-%"`&#OQ!(A?]T%$B+!TB)E=#^____4!!( +MBY70_O__2(NU@/[__TB+O4#___](B5,02HM$Y@A**P3FQD,H`$B)0QA(QT,@ +M`````$B%_W0&2(L'_U`02(N%H/[__TF#Q`%).<0/A`@+``!*C03E`````$B+ +MM4#^__]$B:7P_O__2(F%V/[__TB+A8#^__](QX5`____`````$H#-."#O__4`A(BWL@2(7_=`9(BP?_4!!(BX70_O__3(EK($R):Q!(B4,8Z=W] +M__]F+@\?A```````2(.]0/___P`/A0OR__],B[5(____387V="))BP9(C17L +MCOS_2(M`$$@YT`^%SP8``$&#;B`!#X1+`P``2(N]0/___TB%_P^$Q.K__TB+ +M!_]0$.FYZO__9@\?A```````2(NU"/_____0Z=WQ__](B'O__]( +MB9F`````2(G?Z1;N__](BXWH_O__BX5X____.T$@#X7![/__A-( +MB=_HI=W[_V9!#V[\,?9(B<=(B=IF#W#'X$B)A4#___])B<5F#]:%2/___^B, +MWOO_2(N%4/___XMP,$B-A4#___](B<=(B84(____Z"SV_?^$P`^%EP```$R) +M[^BLX/O_Z>?G__](BW@(2(7_=`7HF>#[_TR+M>C^__]!B=Q)P>0"2<=&$``` +M``!,B>=)QT8(`````.@3W?O_9@]N^TF)1@A(B<=F#W#'X&9!#]9&$$B+M6#_ +M__],B>+HCM[[_^EY[___38UF*$F-7E!)BSPD28/$".BDW_O_23G<=>Z^*`,` +M`$R)]^@"W_O_Z8G\__],B>A,`>OK"4B#P`%(.<-T"40/MB!%A.1U[DR)[^C[ +MW_O_183D#X5QZO__Z2WG__\/'T0``(N%R/[__X7`#X2B`0``3(N-@/[__XG" +M2(N]P/[__S'`ZQ-F#Q]$``!(@\`!2#G0#X1[`0``1#LLAW7MA<`/B&T!``!( +MB[WP_O__1(U``4&#Q0%/BP3!32L$P4B-!`],B00/2(D$"TB#P0A!.?4/A)OU +M__]$BY7@_O__1872#X4U]?__ZY)(QX7P_O__`````#';Z7KU__^%P`^$LO+_ +M_^F$YO__#Q]``$R+8`CI4O'__TB)Q^C/V_O_1(N%\/[__TB)P>EE\___2(G/ +M,?;HQMS[_TB)P>G1\___2(N]&/___S'22(L'_U`8B<.%P`^$P//__TB+O4#_ +M__](A?]T(HM7_#'V@^+\Z(S<^_](BX5`____2(7`=`E(C7C\Z#?>^_](B[T8 +M____2(7_#X3\Y?__2(L'_U`0Z?'E__^+M:#^____T.FN\/__2(T5Z`/^_T@Y +MT'4W2(N'H````$B+C=#^__](BY68_O__2(L,"`^VA3#^__^(@00!``#I"_7_ +M_\:%,/[__P#IS_/__TB+E9C^__]$#[:%,/[__XNUH/[__TB)V?_0Z:WV__\/ +M'T0``$B)W^@PWOO_2(N]\/[__^@DWOO_Z5_E____T(G#Z9;O__](BW58_]!( +MB[U`____B<.%P`^%3`,``,:%4/[__P'IT/#__TB)W__0Z7#K__](B<__T.GF +MZ___2(N%Z/[__XE8,(7;#X35[?__2(MX*$R-))T`````Z;CM__](BX7H_O__ +MB5@@A=L/A$GM__](BW@83(TDW0````#I*>W__TB+A>C^__^)6%B%VP^$9^[_ +M_TB+>%!,C22=`````.E*[O__2(N%Z/[__XE82(7;#X3;[?__2(MX0$R-))T` +M````Z;[M__](BX7H_O__B5AHA=L/A(KN__](BWA@3(TDW0````#I;>[__[L! +M0`"`2(7_#X1GY/__2(L'_U`0Z5SD__](BY78_O__3(GV2(G'Z"7>^_],B??H +M_=S[_^F-]___BW50_]!(B[U`____B<.%P`^%C0(```^VA5?^__^(A5#^___I +M5.___TR)]__0Z3+Y__^[`4``@.EEY/__2(N5\/[__TB%T@^%C`,``$B%R0^$ +MKOW__TB)S^B;W/O_Z:']__](A?\/A-+C__](BP?_4!#IQ^/__[L!0`"`Z<'] +M___'A?#^__\`````13'V28M%`$B-%3#@_?](BT`02#G0#X7T`0``08-M"`%U +M,TB-!06"`0!(B[VX_O__28E%`.AUV_O_28M]$$B%_W0&2(L'_U`0OD@```!, +MB>_H^=K[_XN-\/[__X7)=$&+A?#^__^#Z`%-C23&ZP-)B<1-BRPD387M=!Q) +MBWT`2(7_=`9(BP?_4!"^"````$R)[^BXVOO_28U$)/A-.?1USDV%]@^$"N/_ +M_TR)]^B]V_O_Z?WB__]$BX7(_O__187`#X5!]?__2(.]>/[__P`/A%D"``#' +MA?#^__\`````13'V2,>%X/[__P````!(BX7H_O__2(.]6/[__P!(BWAX#X2Z +M`0``B[>$````Z,[Q_?^$P`^$+@$``$B+A7C^__]%,>1(B85`____2(N%Z/[_ +M_TB+>'A(BP=(BT!`2(T5O$'^_T@YT`^%V````$R+A3C^__](BXU8_O__2(/O +M"$B+E0C___](B[7@_O__Z"XQ_O^)PTV%Y'0*28L$)$R)Y_]0$$B#O>#^__\` +M#X1T_O__2(N]X/[__^C3VOO_Z6/^__^[`4``@.EYXO__2(MX"$R-))T````` +MZ5;Z___HCJK__^GNX?__Z*39^_](BXWH_O__BT6(.T$P#X6VY?__A<`/A-SK +M__](BW6`2(M)*$C!X`(QTNL-2(/"!$@YP@^$O^O__XL<$3D<%G3KZ83E__], +MB>__T.D\_O__Z*"L___ID.'__TR+A3C^__](BXU8_O__2(N5"/___TB+M>#^ +M____T.DJ____OQ@```#H[MC[_TB+O5C^__\Q]DF)Q(EP"$B-!?!_`0!)B00D +M2(L'28E\)!#_4`A)BP0D2(T5'LS]_TB+0`A(.=`/A;4```!!@T0D"`%(BX5X +M_O__3(FE6/[__TB)A4#___](BX7H_O__2(MX>$B+!TB+0$#I?/[__TB+A7C^ +M__]%,>1(B85`____2(L'2(M`0.E?_O__2(N]V/[__TB#QPCH(M;[_TB)A>#^ +M__\QP$F+%,9(BXW@_O__2(L22(D4P8N-\/[__TB#P`$YR'+@2(.]>/[__P`/ +MAEK_/___]#I_O'___,/'OI(B!+\__,/'OKI +M]Q/\__,/'OI(B^E5(B>5!5T%6055)B?U!5%-( +MB?-(@^P8BTX(2(L&A?'``````!(BP75F0``0<=$)!`!``$`28E$)`A!BT4@C5`!08E5 +M($F+51A,B23"Z/_H_/^X`0```$'&1"00`46(="019D&)1"022(/$&%M!7$%= +M05Y!7UW#9BX/'X0``````$R)QTB-%,4`````3(GY2(EUR.AYU_O_2(MUR$F) +MP$B)]TR)1^E6)]D&X!P```$B)Y4%7059,C7W`055)B?U!5$R-)#=,B?Y3 +M3(GA2(/L*$R+,F1(BQPE*````$B)7A__](BU7`.5,,%,B>I,B?Y,B??H%Z'__TB+1<")0PB) +MP$''!(8`````2(M%R&1(*P0E*````'5F2(/$*%M!7$%=05Y!7UW##Q^$```` +M``"!^O[__S\/AU\4_/^)T$B)5;A(C3R%!````.CQT?O_2(L[2(M5N,<````` +M`$F)QDB%_W0)Z#?5^_](BU6X3(DSB5,,QT,(`````.EC____Z!S4^_]F9BX/ +M'X0``````)#S#Q[Z54B)Y4%728GW059!54%428G\4TB#[#A(B4VH9$B+!"4H +M````2(E%R#'`@#U;H0$``'0YQ@$`2(M%R&1(*P0E*`````^%P0(``$B#Q#A( +MB?ZZ``(``$R)_UM!7$%=05Y!7UWIE?;\_P\?1```3(UML$R)[^A$X_S_2(MU +ML,=%N`````#'!@````!!BT<(A<`/A)\```"+5;@QV^M;.<%T=(G(BP2'C;@` +M)/__@?__`P``=V%!P>8*)?\#``"#PP)!@>8`_`\`18VT!@```0")T#E%O'1( +M#Q^``````(U0`42)-(:)T,<$A@````!!BT<(B56X.<-S/4F+/T&)V8U+`4:+ +M-(]%C8X`*/__08'Y_P,``':(B_H+M'[ +M_T@YPP^"*?___TB#^/\/A!____])BQ0D08E$)`C&!`(`9F8N#Q^$```````/ +M'P!(BWVP2(7_=8#K@P\?1```08'^_O__/P^'JQ'\_T2)]TB#QP'H%\_[_TF+ +M/"3&``!(B<-(A?]T!>ACTOO_28D<)$6)="0,0<=$)`@`````Z^NDT$?S_#Q]``%5( +MB>5!5T%628GV055)B?U!5%-,B<-(@>R8`0``2(M%$$B)C;C^__](BTTH2(F5 +M/[__TB) +MC6C^__]D2(L4)2@```!(B57(BU8(2(M$T/A(QP$`````2(F%R/[__TB+`$C' +MA0#___\`````08MX.$B)A9#^__^)O>#^__](@\%"/___P````!(QX40 +M____`````.C.S?O_9@]NA>#^__](BW,P2(F%$/___S'29@]PP.!F#]:%&/__ +M_V9F+@\?A```````D`^V#!:(#!!(@\(!A,EU\4B+A#^__]$B[48____00''13GW#X/:````3(NM$/___TB)WDN-?#T`Z';,^_]( +MA<`/A+T```!)B<=-*>]$.>@/B*X```!!C7K\_XN-&/___TB+A1#___]% +MB?A#C3P^3(F%V/[__XU1`4J--`!(`<=$*?KH#-#[_TB+M5#___](B[W8_O__ +M1(GR2`.]$/___^A/S?O_BX7@_O__1`.U&/___T2)M1C___]!`<=%.?C'SOO_2(N] +M0/___TB%_W0%Z+;.^_](QX4P____`````+\0````Z$'+^_^+O1C____'```` +M``!(BPV>D0``2(F%,/___TF)_4B#QP%(B8TX____Z!3+^_](BXT0____2(F% +MF/[__TB)QC'`D`^V%`&(%`9(@\`!A-)U\4B+A>C^__\/M@"(A>#^__^$P`^$ +M*0D``$B+A>C^__^#>`@#=4Q(BXVX_O__#[9`4(MQ$(B%X/[__XFUU/[__X7V +M#X6[#@``BU$@A=(/A5,,``!$BWE`187_#X4E%0``QH7@_O__`.DK`0``9@\? +M1```OQ````#H=LK[_TB)P[\0````2(L%UY```$C'A5#___\`````QP,````` +M2(F%2/___^A*ROO_QP``````2(L-K9```$B-M1#___\QTDB+O<#^__](B850 +M____2(F-6/___^A*Z_S_2(NU4/___XN%6/___S'23(T\ADPY_G0B08-__"\/ +MA70'``!)@^\$3#G^#X5G!P``9BX/'X0``````$B+O8#^__](B9U`____Z`W@ +M_/](C;TP____3(G^2(N=0/___^BGWOS_2(N]4/___TB%_W0%Z`;-^_^+A3C_ +M__^%P`^%T0H``,:%X/[__P!(A=MT"$B)W^CDS/O_2(N%N/[__\:%H/[__P!$ +MBU@0187;=2I$BU`@1872=2%$BTA`187)=1A(BX6X_O__QH6@_O__`(-X,`$/ +MA/\2``!(BX7H_O__@'A0``^$T@<``,>%U/[__P````!(QX78_O__`````("] +MX/[__P`/A*@```"+A0S___\YA0C___]U9#W^__]_#X=B#?S_B<*Y____?\'J +M`BG!@\(!._HS,C[_TF)QHN%"/___TR+ +MO0#___^%P`^%5!,``$V%_P^%81,``$R)M0#___^)G0S___^_$````.C$ROO_ +M2(VU,/___TB)QTB)P^B2VOS_BX4(____C5`!B94(____2(N5`/___TB)',*+ +MM1C___^%]@^%30H``$B-O1#___](C37DAP``Z#?6_/_S#WX--W\!`$B-!4!N +M`0#S#WX5,'\!`/,/?IUP_O__9D@/;N!(@\!H9D@/;NA(BX7H_O__9@]LS&8/ +M;-5F#VS;#RF-@/[__X!X4``/MEA3#RF54/[__T0/MFA1#RF=H/[__W4+2,>% +MN/[__P````!!BX0DL`$``$2-8#A@!R_O_OD@```!,B?_HU,G[_TF#[@A)@_[X=$)&`!````````28N\)(`! +M``!(A?]T$DB+!_]0$$G'A"2``0```````$B+A>C^__](BXVP_O__2(T5J_'^ +M_V8/;[6@_O__\P]O0!A!#Q%$)#!(BT`H18AL)"1)B40D0$B+A;C^__]!B%PD +M)4F)1"1H2(L!00\1M"28`0``2(M`"$@YT`^%91$``(.!,`$```%)BUPD8$B% +MVP^$O````$B+`TB-%<$D__](BT`02#G0#X4O$0``@ZLP`0```0^%F````&8/ +M;[V`_O__2(N[:`$``$B-!3%M`0!(B4,@#Q$[9@]OO5#^__\/$7L02(7_=`7H +MU,G[_TB+NU@!``!(A?]T!>C#R?O_2(N[2`$``$B%_W0%Z++)^_](B[LX`0`` +M2(7_=`7HHT/A/D.``!)BT4` +M2(T5VB7__TB+0!!(.=`/A4D0``!!@ZT@`0```0^%I````&8/;[V`_O__28N] +M6`$``$B-!5EL`0!)C5WP28E%$$$/$7WP9@]OO5#^__]!#Q%]`$B%_W0%Z/7( +M^_])B[U(`0``2(7_=`7HY,C[_TF+O3@!``!(A?]T!>C3R/O_28N]*`$``$B% +M_W0%Z,+(^_])B[T0`0``2(T%=&H!`$F)11!(A?]T!>BFR/O_28U]&.C-'O__ +M2(G?OL@!``#H<,?[_TF+?"1@2<=$)'``````2(L'2(T56.S^_TB)_DB+`$@Y +MT`^%L@X``#'`2(T-D)D``$B-%9F9``!F#Q^$```````/MAP".!P!#X5C#0`` +M2(/``4B#^!!UZ4F)="1P@XUT&TF+?0!(A?]T!>C1Q_O_OA````!,B>_HI,;[_TB#ZPA(@_OX +M= +M3HT\]0````!,B?_H'\3[_TF)Q4&+A"20`0``28NT)(@!``"%P`^%-`X``$B% +M]@^%3`X``$V)K"2(`0``08F<))0!``!)P>8#13'M#Q]``$B+A0#___^_$``` +M`$Z+/"CH^\7[_TR)_DB)QTB)P^C-U?S_08N$))`!``!)@\4(C5`!08F4))`! +M``!)BY0DB`$``$B)',)-.>YUM4B+A])B40D*.CIT?S_28V<))````!,B?9(B=_HUM'\_TR)[^C.!?W_ +M2(NU$/___TB)VC'_Z"T&_?](B=_HM07]_P^VA>#^__]!B$0D)TB+A>C^__^` +M>%``1`^V:%,/A",+``!,B[60_O__,?9-B>!$B>FZ_____TF+!DR)]_]0.$B+ +ME<#^__],B?>^+````$C'A5#___\`````B<-)BP9(QX58____`````/]00(7` +M#X41!P``9H.]4/___Q4/A\T%_/\/MX50____2(T5%9P``$AC!()(`=`^_^!F +M9BX/'X0``````$F#[P1,.?X/A"4,``!!@W_\+W7L3(GZ2"GR2,'Z`NF-^/__ +M#Q]$``!)BU402(TU>7\``$B+!,)(BW@8Z,#._/^$P`^$ZO3__TF-=DA(B=_H +M_-?\_^G9]/__#Q^``````$B+M5#___](B=_HP<7[_X7`#X50]?__Z93V__\/ +M'T``BT8$A<`/A9X#``#'A4C___\`````QP8`````1(N-2/___T6%R0^%OO3_ +M_P\?1```1(N=3/___TB+M4#___]%A=L/A"D+``#'A4C___\!````2,<&7P`` +M`.F,]/__#Q\`2(N%N/[__TB+M>C^__^+2!`/MG90B8W4_O__0(BUH/[__X7) +M#X6B"@``BW@@A?\/A4@#``"+2$"%R0^$%?C__T"$]@^%00,```\?@`````!( +MB[V0_O__2(NU@/[__TB+!_]0*$C'A=C^__\`````B<.%P`^%Z04``$C'A5#_ +M__\`````OQ````#H(L'[_TB+#8N'``!$BX5`____2(F%4/___\<``````$B) +MC5C___](QX5@____`````$C'A6C___\`````187`#X2Z#```#[:%H/[__T4Q +M[44Q_\>%U/[__P````!(QX78_O__`````(/P`8B%@/[__^M2#Q]``$B+A>C^ +M__\/MD`#B(7@_O__A,!U6XN%U/[__T0YZ`^$'`8``$&)QDG!Y@)(BX78_O__ +M@X74_O__`4:)/#!!@\C^__^`>`(`=)!(BY7`_O__2(N]R/[__T2)_NAJO/[_B<.%P`^% +MX0```$B+A>C^__^`O7#___\`#[90`@^V0`,/1<*$P`^%!P8``$6$]@^%#@8` +M`("]H/[__P`/A98&```/MI5Q____2(N]N/[__TB-C?_^__](C;5@____@_(! +M#[;2Z`+Y_/^$P`^%6@8``$&#QP%$.[U`____#X)I____1(BUX/[__XN]U/[_ +M_X7_#X7)"@``2(N->/[__TB-%280__](BP%(BT`02#G0#X4O"P``2(UY^.A- +M#___2(N->/[__TB-%=\3__](BP%(BT`82#G0#X46"P``2(/I"#'V2(G/Z/$/ +M__^)PXN%:/___TB+O6#___^%P'1#1(U@_TG!Y`-F#Q]$``!.BRPG387M=")) +MBWT`2(7_=`7H:<+[_TR)[[X0````Z#S!^_](B[U@____28/L"$F#_/AURTB% +M_W0%Z$'"^_](B[U0____2(7_#X2#`P``Z"S"^__I>0,``$B+E3#___^)P8-\ +MBOPO#X3K!P``2(N]P/[__TB)WNC$V/S_BX58____03G%#X)8"0``2(N]4/__ +M_TB+C9C^__\QP`\?1```#[84!X@4`4B#P`&$TG7QZ,S!^__IUO3__X/X+@^% +M-_'__T2+5@A%A=(/A2KQ___I1_S__X"]X/[__P`/A6<"``#&A:#^__\`Z=/\ +M__^`O:#^__\`#X3&_/__B[48____2,>%V/[__P````"%]@^$L_7__V8/[\"_ +M!````$C'A5#___\`````3(NM$/___\=%F`````!(QT6@`````$C'1:@````` +M2,=%L`````!(QT6X``````\1A5C___\/$85H____#Q&%>/___P\118CHK;W[ +M_\8``$B+#1.$```QTDR)[DB+O<#^__](B46X2(E-P.@Z_OS_A,!T$XM%F"4` +M\```/0!````/A&`&``!!@'T```^$$0D``$4Q_P\?1```18UW`4.`?#4``$V) +M]W7Q28U^`>A(O?O_2(G#,]%A?\/A/\(``!*C40S_X`X+W49Z9`%```/'X``````2(/H`8`X +M+P^$?`4``$@YPW7N1(F]H/[__T2)^$B->`'HV[S[_TB)A8#^__](B<$QP&9F +M+@\?A```````#Q]```^V%`.(%`%(@\`!A-)U\42+M:#^__]%B?4/'X`````` +MOO\!``!(B=_H0[W[_X7`#X3:`P``Z*:\^_^#.!%T,T6%[70N1(GH2(U$`_^` +M."]U'.D"!```9BX/'X0``````$B#Z`&`."\/A.L#``!(.<-U[DB+O8#^___H +MHK_[_TB)W^B:O_O_2(M]N$B%_W0%Z(R_^__H1[S[_XL8A=L/A!<(```/M\,- +M````B(7;#T_82(N-4/[__TB-M1#___^)VDB-/4F!``#H!&_^_^FA````@+W@ +M_O__``^$H_W__\>%U/[__P````!(QX78_O__`````,:%X/[__P#I6?/__TB+ +MA5C___](BXUH_O__2(D!2(N]P/[__^BT`_W_3(GGZ$R=_O],B>=!B<7HD77^ +M_TB+C7C^__]%A>U$B>Y)QT0D*``````/1/!(C17Q#___A=M(BP$/1?-(BT`8 +M2#G0#X6Z!0``2(/I"$B)S^@`#/__B<-(B[V8_O__Z**^^_](B[TP____2(7_ +M=`7HD;[[_TB+O2#___](A?]T!>B`OOO_2(N]$/___TB%_W0%Z&^^^_^+A0C_ +M__](B[T`____A0#9@\?1```3HLL)TV%[70B28M]`$B%_W0% +MZ#F^^_],B>^^$````.@,O?O_2(N]`/___TF#[`A)@_SX=@1OOO_ +M2(N%V/[__TB%P'0(2(G'Z/V]^_](BT7(9$@K!"4H````#X6.!@``2('$F`$` +M`(G86T%<05U!7D%?7<-F#Q]$``"!O=3^___^__]_#X==_?O_1(NUU/[__[C_ +M__]_18GU1"GP0<'M`D&#Q0%!.<5$#T?H0XU<-0!)B=U(P>,"2(G?Z"NZ^_]% +MB?9)B<%,B?!)P>8"A<`/A7X```!(@[W8_O__``^%B````$R)C=C^___I=_G_ +M_P\?0`!$B+7@_O__Z7GY__\/'T``2(N-,/___TB+M5#___\QP.L49@\?1``` +M2(/`!#M4!OP/A<(!``"+%`&%TG7KBX4X____BP2&A<`/A;H"``!$#[:U@/@['[__](8]!!B<7&!!,`Z:+[__]FD$2+M:#^ +M__]%B?5%.>\/@@S___\QTD6%[0^$6/___TB)G6#^___I)?___V8/'T0``$0/ +MMK7@_O__Z=( +MQX50____`````/]0((G#A!$B>E(B[78_O__ +M2(L'_U`XB[__TB+O;#^___ISO'__X/X+T$/E,;I[O;__X"]H/[__P`/A'?U___'A=3^ +M__\`````Z:+X__^#Z`&)A3C____'!((`````1(NU./___T6%]@^$$.W__^GP +M]___#Q\`OP@```#HEK;[_TB+O4#___](B<9(A?]T$TB)A>#^___HV[G[_TB+ +MM>#^__](B;5`____QX5,____`0```.F5]/__,=+I=^S__TF-5"1P2(TUVXH` +M`/_0Z7?Q__](BT`H2(L`#[9($8B-H/[__X3)#X3H[/__#[9($HB-H/[__X3) +M#X36[/__#[9($XB-H/[__X3)#X3$[/__@W@(`<:%H/[__P`/A;/L__](BP!( +MC350CP``2(L`2(LXZ"&Y^_^%P`^4A:#^___ID.S__P\?`$B-%,4`````3(GY +M3(GO2(FUN/[__^@VNOO_2(NUN/[__TB)]^@'N?O_Z:?Q__](B[UX_O___]#I +M1/K__TR)[__028M\)&#I6O#__TB)W__0Z6SO__](B[VP_O___]#IE.[__X3` +M#X6-^?__Z2'W__](C13%`````$R)Z4R)_DR)]^C*N?O_3(G_Z**X^__IDNS_ +M_TB->`'H-+7[_TB+O9C^__])B<7HA;C[_TR)K9C^___IA/;__TB)W^AQN/O_ +MZ?G]__](BX5H_O__BXU8____2(D(Z4?Y__\/MX58____2(N-:/[__TB)`>DQ +M^?__#[:%6/___TB+C6C^__](B0'I&_G__XN%:/___TB+O6#___^%P'0_C5C_ +M2,'C`P\?`$R++!]-A>UT(DF+?0!(A?]T!>CYM_O_3(GOOA````#HS+;[_TB+ +MO6#___](@^L(2(/[^'7+2(7_=`7HT;?[_TB+O5#___](A?\/A$3K___HO+?[ +M_^DZZ___OP$```!%,?9%,?_I^O;__TB+O7C^____T.G,]/__2(N]>/[__S'V +M_]")P^GH]/__2,>%V/[__P````#I@_3__\>%H/[__P`````QP.DB]___NP5` +M`(#I[/?__^A7MOO_\P\>^DF)Q.EJ^/O_\P\>^DF)Q.E#^/O_\P\>^DB)P^DV +M]_O_\P\>^ND`]_O_\P\>^DB)P^G%]_O_\P\>^DB)P^GH]_O_\P\>^DF)Q.G1 +M]_O_\P\>^DB)P^G>]_O_\P\>^DF)Q.GA]_O_\P\>^NDB^/O_\P\>^DB)P^EP +M]_O_\P\>^NDH^/O_\P\>^DB)P^FY]OO_\P\>^DB)P^F.]_O_\P\>^DF)Q.D= +M^/O_\P\>^DF)Q.F*]OO_\P\>^DB)P^DK]_O_\P\>^NEE____\P\>^NE<____ +M\P\>^DB)P^DZ^/O_\P\>^DB)P^GP]_O_\P\>^DB)P^D&^/O_\P\>^DB)P^G8 +M]OO_\P\>^DF)Q.D`]_O_\P\>^DF)Q.E@]_O_\P\>^DF)Q.F?]_O_\P\>^DF) +MQ.F=]OO_9I#S#Q[Z2(7_#X3E````54B-%:L0__](B>532(G[2(/L"$B+!TB+ +M0!!(.=`/A<,```"#KS`!```!=`186UW#\P]^!7-I`0!(C05\6`$`9D@/;LA( +M@\!H9@]LP69(#V[02(/`,`\1!_,/?@53:0$`2(E'(&8/;,(/$4<02(N_:`$` +M`$B%_W0%Z):U^_](B[M8`0``2(7_=`7HA;7[_TB+NT@!``!(A?]T!>ATM?O_ +M2(N[.`$``$B%_W0%Z&.U^_](B[L@`0``2(T%%5A'M?O_ +M2(U[*.AN"___6DB)W[[(`0``6UWI#K3[_\/_T.D_____9@\?1```\P\>^E5( +MB>5!54%43(UMP%-(B?M,B>](@^PH9$R+)"4H````3(EEV$F)]$B--?YV``#H +MJ<+\_TR)[TR)YNBN8/[_2(M[8$B+=C`M/O_ +M2(M%V&1(*P0E*````'4-2(/$*(G86T%<05U=P^B?L_O_\P\>^DB)P^F%]OO_ +M#Q\`\P\>^E5F#^_`2(GE05=!5D%505132('L6`4``$B+11A(B94`^___2(M5 +M$$B)M7C[__](B84H^___2(M%($B)O5#[__](B85`^___2(M%*$B)C5C[__]( +MB86X^O__2(M%,$R)A9CZ__](B87X^O__2(M%.$R)C;#Z__](B<9(B96(^___ +M2(F%D/K__V1(BP0E*````$B)1<@QP(!Z4`!(QT8P``````\1!@\11A`/$48@ +M#X56`@``BT$(B85P^___A<`/A/(P``!(QX60^___`````$2+K7#[__\QVT4Q +MY$C'A6C[__\`````Z;H```"02(N%6/O__TB-O:#]__](B;V`^___2(L`2(L$ +MV$B+,.@\ROS_3(V](/[__TB+M:#]__^Z`0```$R)_^BQ\/S_A,`/A/DH``"+ +MA6C^__\E`/```#T`0```#X0M*0``2(N]H/W__TB%_W0%Z#*S^_],B[4@_O__ +M03G<#X3F````2(T4W0````!,B?!(BXV0^___2(N]B/[__T@!A6C[__],B301 +M2(7_=`7H]++[_TB#PP%,.>L/A',!``!F#^_`OP0```!(QX4@_O__`````,>% +M:/[__P````!(QX5P_O__`````$C'A7C^__\`````2,>%@/[__P````!(QX6( +M_O__``````\1A2C^__\/$84X_O__#Q&%2/[__P\1A5C^___H'*_[_TB)A8C^ +M__](BS5^=0``Q@``2(N%B/O__TB)M9#^__](QX4@_O__`````(!X4``/A*C^ +M__]%,?9!.=P/A1K___]!@?S^__]_#X>^]_O_1(G@NO___W_!Z`)$*>*#P`$Y +MT`]'PD6-/`1-B?Q)P><#3(G_Z*:N^_])B<%(C13=`````$B%VW4F2(.]D/O_ +M_P!U/TR)C9#[__](BX4@_O__Z<+^__]F#Q^$``````!(B[60^___3(GY2(G' +M2(F5F/O__^C7LOO_2(N5F/O__TF)P4B+O9#[__](B96`^___3(F-F/O__^B3 +ML?O_2(N5@/O__TR+C9C[___KE\>%L/O_2(G'2(F%\/K__TB)P^@\A_[_ +MBY5P^___2(N%B/O__V8/[\!(B9W`^___@T,@`8/Z`4B+0`C&0U0`#Y>%I_K_ +M_P^VM:?Z__](B4-80(AS4TC'@^`!````````#Q&#P`$```\1@]`!```/AO$F +M``!(B[VX^O__2(NU:/O__TB+!_]0&$&)Q(7`#X7B%0``,%(/W__P````!( +MB85@^___QX5H_?__`````$C'A7#]__\`````2,>%>/W__P````!(QX6`_?__ +M`````$C'A8C]__\`````#Q&%./W__P\1A4C]__\/$858_?__Z'BL^_](B86( +M_?__3(LUVG(``,8``$B+A8C[__],B;60_?__@'A0``^$3Q<``&8/[\"^`0`` +M`$B-O4C]___'A6C]__\`````#Q&%*/W__P\1A3C]__\/$85(_?__#Q&%6/W_ +M_TC'A7#]__\`````2,>%>/W__P````!(QX6`_?__`````$C'A2#]________ +MZ+BP^__S#V^%2/W__S'_2(VU,/___\>%:/W___\1```/$84X_?__#Q&%*/W_ +M_^BZL/O_A<`/A*T@``!(BYU`^___2(NUB/O__TB-%6W[_O](BP,/MDY32(NU +M8/O__TB+`$B+-D@YT`^%IQ\``$B->_B)RN@%^O[_08G$A<`/A1T7``!%,>V_ +M$````$C'A:#]__\`````2,>%J/W__P````!(QX6P_?__`````$C'A;C]__\` +M````2,>%P/W__P````!F1(FMR/W__TC'A=#]__\`````Z!.K^__'``````"_ +M$````$B)A=#]__](N`````#_____3(FUV/W__TC'A>#]__\`````2(F%Z/W_ +M_TC'A?#]__\`````2,>%^/W__P````#HPZK[_\<``````+\0````2(F%^/W_ +M_TR)M0#^__](QX4(_O__`````.B:JOO_2(F%"/[__\<``````$B+A7C[__], +MB;40_O__2,>%\/O__P````!$BV`(2,>%^/O__P````!%A>0/A0P;``!(N/__ +M__\!`0$!9@_OP+\0````2,>%0/S__P````!(B85(_/__2+@```````$!`4B) +MA5#\__](QX58_/__`0$``$C'A6#\__\`````2,>%F/S__P````!(QX6@_/__ +M``````\1A6C\__\/$85X_/__#Q&%B/S__^C@J?O_2(F%H/S__TB+M6#[__]( +MC;V@_/__QP``````2(N%4/O__TR)M:C\__](B85`_/__2(V%\/O__TB)A1C[ +M__](B85H_/__2(N%`/O__TC'A7C\__\`````2(F%__/](C86@_?__OR@!``!( +MQX7`_?__`````$B)A8#[___H9*O[_TB)PT4QY&8/[\"_!````$B)A9C[__]( +MC05?5`$`\P]^'2=@`0!F2`]NZ$B#P#!F1(EC+&8/;[7@^O__QT,H`````&8/ +M;-U(B4,@2,=#,`````!(QT,X`````$C'0T``````2,=#2`````!(QT-0```` +M`$C'0U@`````2,=#<``````/$3,/$5L0#Q%#8`\IG=#Z___HFZC[_TB)0W"_ +M$````$R)#V`````````!(QX/@`````````$C' +M@^@`````````2,>#\`````````!(QX/X``````````\1@Y@````/$8.H```` +M#Q&#N`````\1@\@```#H_*?[_TR+)9UN``!(B8/X````OP0```!,B;,``0`` +MQ@``2,>#"`$```````!(QX,0`0```````$R)HQ@!``#'@R`!````````Z`.I +M^_^Z`P```$B#^`H/C[P3``!(BX68^___OP0```!(BXTH^___2,>%`/S__P`` +M``"#0"@!B9`D`0``2(E(:$B)A=#[___H;*?[_\8``+\$````2(F%`/S__TR) +MM0C\___H4:?[_TB#O7C\__\`2(NUH/S__\8``$B)A1#[___'A1S\__\#```` +M#X2`$P``2(N%F/O__\9`+`%(C;B`````Z`&\_/_S#WZ%F/O__TB-A:#]__]( +MB<=(B86`^___9@]LP`\1A8C\___H6"O__TB+C6C\__^+40B#^A\/A[$H``!% +M,%2/S_______]F1(F%7/S__XN%J/W__\:%7OS__P!(QX5@ +M_/__``````\1I4S\__^%T@^$,0\``$B+"3G0#X,^$0``B=8IQH/N`4B+#/%$ +MBP'S#V]!!`^W>10/MG$62(M)&$2)A4C\__]FB;U<_/__0(BU7OS__TB)C6#\ +M__\/$85,_/__A<`/A&P)``!(BXV@_?__B<9,BVSQ^#G0#X/C#@``0;P!0`"` +M2,>%(/[__P````!)BWT`O@$```!,C;T@_O__2,>%*/[__P````!,B?I(BP?_ +M4$"%P`^%B24``&:#O2#^__\3#X7!%P``28M]`$B-A;#\__^+G2C^__](B84@ +M^___2(G&2(L'_U`HA<`/A5(E```[G;#\__\/@XP7``!,B?_HKNW\_TF+?0!( +MQX78^___`````$B-E=C[__](C341<0``2(L'_Q!(B[W8^___A<`/A>D;``!( +MA?\/A%(7``!(BP=(C0T*]OW_2,>%X/O__P````!(BT`82#G(#X6O%@``2(V5 +MX/O__TB#[PB)WDB)E#[__^%P`^%BQL``$B%_P^$C1L` +M`$B-A>C[__](C353<0``2,>%Z/O__P````!(B87`^O__2(G"2(L'_Q!(B[WH +M^___A<`/A3D;``!(A?\/A#L;``!F#^_`OQ````!(QX5`_O__`````$C'A4C^ +M__\`````#RF%(/[__P\IA3#^___HGZ3[_\<``````+\0````2(F%2/[__TR) +MM5#^__](QX58_O__`````.AVI/O_QP``````OQ````!(B858_O__3(FU8/[_ +M_TC'A6C^__\`````Z$VD^__'``````"_$````$F\`````/____](B85H_O__ +M3(FU%T/[__P````#HZ*/[_\<``````+\0````2(F%T/[_ +M_TR)M=C^__](QX7@_O__`````.B_H_O_QP``````OQ````!(B87@_O__3(FU +MZ/[__TC'A?#^__\`````3(FE^/[__TC'A0#___\`````2,>%"/___P````#H +M>:/[_\<``````+\0````2(F%"/___TR)M1#___](QX48____`````.A0H_O_ +MQP``````B=Y,B>](B848____2(V%2/[__TB)PDR)M2#___](B85(^___Z"&< +M_O]!B<2%P`^%X!$``$F+?0!(C8V_^___NE8```")WN@_6?[_08G$A<`/A;X1 +M``!(B[V(_/__2(7_#X1/`@``2(L'2(T5BBO^_TB)^4C'A;#\__\`````2(L` +M2#G0#X66%P``,=(B8VP_/__@T#Z__])C40D\$&+E"0``0``2(F% +MJ/K__TB-!8)-`0!)B[PD^````$$/$50D\&8/;Y70^O__28E$)!!!#Q$4)(72 +M='B#Z@%,B:V(^O__2,'B`XF=H/K__TB)TV9F+@\?A```````#Q]``$R++!]- +MA>UT,DF+?1!(A?]T!>@)I?O_28M]`$B%_W0&2(L'_U`03(GOOC````#HS:/[ +M_TF+O"3X````2(/K"$B#^_AUNTR+K8CZ__^+G:#Z__](A?]T!>C$I/O_28N\ +M).@```!(A?]T!>BRI/O_28M\)'!(A?]T!>BCI/O_28M\)&!(A?]T!>B4I/O_ +M28M\)$!(A?]T!>B%I/O_28M\)#!(A?]T!>AVI/O_08M4)"A)BWPD((72=%B# +MZ@%,B:V(^O__2,'B`XF=H/K__TB)TY!,BRP?387M="!)BWT`2(7_=`7H.:3[ +M_TR)[[X0````Z`RC^_])BWPD($B#ZPA(@_OX=%(/S__P````!(QX4H_/__`````$C' +MA;#\__\`````2(F%P/S__TC'A%T/S__P````!(QX4(_?__ +M`````$C'A1#]__\`````#Q&%V/S__P\1A>C\__\/$87X_/__Z/V?^__S#V^% +M2/S__TB)A1#]__](C;T0_?__QP``````2(N%0/S__P\1A;C\___S#V^%6/S_ +M_TB+M4C[__](B86P_/__#[:%O_O__P\1AC[__],B;48_?__QH4(_?__`$B)A>C\___H.K7\__,/;X6(_/__ +M2(NU(/O__TR)_P\1A?C\___H[`___T&)Q(/X`0^$!14``(7`#X7P#0``2(V- +M,/S__[H,````B=['A8C^__\`````2,>%,/S__P````!)BWT`2(F-2/O__TC' +MA8#^__\`````2(L'2,>%./S__P````#_4#!(BXU(^___AP"*<)!@\0!03G41`]'XD6-+`1-B>Q)P>4#3(GOZ&6>^_]( +MB<.+A:C]__](B[6@_?__A<`/A8P/``!(A?8/A:0/``!(B9V@_?__1(FEK/W_ +M_[\0`0``Z%R@^_],B?Y(B<=)B<3H+B/__XN%J/W__XU0`8F5J/W__TB+E:#] +M__],B23"2(N]$/W__TB%_W0%Z%.A^_](B[T@_/__2(7_=`7H0J'[_TR)_^A: +M9O[_2(N]Z/O__TB%_W0&2(L'_U`02(N]X/O__TB%_W0&2(L'_U`03(N]V/O_ +M_TV%_P^$OP```$F+!TB-%9R;_?](BT`02#G0#X4Z$P``08-O"`$/A9T```!( +MC06M20$`28M_,$V-9_CS#WX%C50!`&9(#V[(9@]LP4$/$4?X2(7_=`7HM:#[ +M_TF+?R!(A?]T!>BGH/O_08M'&$F+?Q"%P'0]1(UH_TG!Y0,/'P!*BQPO2(7; +M=!](BSM(A?]T!DB+!_]0$$B)W[X(````Z$R?^_])BW\028/M"$F#_?AUSDB% +M_W0%Z%2@^_^^4````$R)Y^@GG_O_2(N-:/S__XM1".D#]O__#Q^$``````!F +M#^_`OQ````!(QX5`_O__`````$C'A4C^__\`````#RF%(/[__P\IA3#^___H +MGIS[_\<``````+\0````2(F%2/[__TR)M5#^__](QX58_O__`````.AUG/O_ +MQP``````OQ````!(B858_O__3(FU8/[__TC'A6C^__\`````Z$R<^__'```` +M``"_$````$B[`````/____](B85H_O__3(FU%T/[__P`` +M``#HYYO[_\<``````+\0````2(F%T/[__TR)M=C^__](QX7@_O__`````.B^ +MF_O_QP``````OQ````!(B87@_O__3(FUZ/[__TC'A?#^__\`````2(F=^/[_ +M_TC'A0#___\`````2,>%"/___P````#H>)O[_\<``````+\0````2(F%"/__ +M_TR)M1#___](QX48____`````.A/F_O_QP``````2(V=6/[__TB+M3C[__], +MC;T@_O__2(G?2(F%&/___TR)M2#____HWK#\_TB-A4C^__](B[4X^___3(V] +M(/[__TB)QTB)A4C[___HNK#\_X"]F/S__P#'A7S^________2,>%X/O__P`` +M``!(QX7H^___``````^%5`P``$B#O7C\__\`#X38%P``13'M2(V%0/S__TR- +MO2#^__](B<9,B?](B86H^O__Z"P+___&A4?^__\`08G$@_@!#X5:#```387M +M#X11#```2(.]D/S__P!T(H"]\_[__P!T"?:%]/[__P%T$$2+I6#^__]%A>0/ +MA=P3``!(B[WH^___2(7_#X2:#@``0;P!````2(L'_U`02(N]X/O__TB%_W0& +M2(L'_U`0187D#X1)$@``3(V](/[__T&#_`$/A'0.``!,B?_HA&+^_TB+A9C[ +M__\/MD`MB(7)_?__2(N%$/O__TB%P'0(2(G'Z#^=^_](B[T`_/__2(7_#X0/ +M!@``Z"J=^_](C;W0^___Z*ZW_?](B[4H^___2(T50.[^_TB+!DB+0!A(.=`/ +MA0D%``!(@WY``'0;2(N%*/O__X!X2`!U#DB->`B^`0```.A.W/[_187D#X7R +M!```1(NE[/W__T'WU$'![!](B[5`^___2(N-8/O__TB-%=(\__](BP9(BPE( +MBT`(2#G0#X5V#0``2(U^^$B+E8#[__](B[50^___18G@Z%4M__^%P`^%-QH` +M`$6%Y`^%E````(N%J/W__X7`#X1&`@``2(N5H/W__TB+1,+X2&-`6(7`#X@N +M`@``2(N50/S__TB+4A!(BP3"BP#VQ"`/A!0"``!(BX6(^___@'A3``^%B`$` +M`$B+O4#[__](B[5@^___0;@!0`"`2(N5@/O__TB+!TB+#DB+M5#[____4`A! +MB<2%P`^%%P0``&9F+@\?A```````9I!(BX6(^___@'A0`'4.2(N%(/W__T@! +MAB+F_O_QH6F^O__`0\?0`!(@X5P^___`4B+A7#[__]( +M.84(^___#X7TZO__@+VG^O__``^%G1@``("]IOK__P`/A9`8``!(BXWP^O__ +M2(NUD/K__T4QY$B+@<`!``!(BY'@`0``9D@/;L!(BX'0`0``9D@/;LI(B968 +M^___#Q:!R`$``$B)1C!(BX&X`0``#Q9(*$B+A5C[__]F#VY0"`\13A`/$48@ +M#Q:1V`$```\1%DB-O<#[___HXP_^_TB#O3#[__\`#X1!`P``Z3`#``"#^!\/ +MATT8``"%P`^$?_K__TB+E:#]__],BVS"^$4QY.D;\?__2(N%B/O__TB-C3#\ +M__](B<](B8V8^___2(MP0.@ZL?S_@[TX_/__`$B+C9C[__\/A"@8``!(B<]( +MB8V8^___Z'?9_/](BXV8^___2(N%\/K__TB)SDB-N.@!``#H6J7\_TB+O3#\ +M__](A?]T#N@IFOO_9@\?A```````2(N%B/O__X!X4``/A=,'``"+A;C]__^% +MP`^%FQ0``(N5J/W__TB+A:#]__](BW30^,9&:P%(BX50_?__OV0````QTKF1 +M$+8"2,'A"$@#C4C]__]FQT9H&0!(]_=(:%``=15(BX7`_?__2`.%(/W__TB)A2#^__](BXWP^O__2(N% +M(/[__T@!AO_/]( +MB[4@_O__2(V](/W__[H!````Z'_5_/](B[T@_O__A,`/A.`$``"+A6C]__\E +M`/```#T`0```#X3*!```2(7_#X3OZ/__Z/R7^__IY>C__TB+O2C[____T(7` +M#X0(^___08G$08'\!$``@`^%#_O__TB+O:#\__](A?]T!>C%E_O_2(N]&/O_ +M_^AY2/[_2(N]@/O__^@]7O[_2(N]B/W__TB%_W0%Z)R7^_](C;W`^___Z*`, +M_O](B[TP^___Z(27^_](BX60^___2(7`=`A(BUT&TF+?0!(A?]T!>BUE?O_OA````!,B>_HB)3[_TF#[`A) +M@_SX=BGE/O_2(N](/S__TB%_W0%Z):4^_], +MB?_HKEG^_TB+O>C[__](A?]T!DB+!_]0$$B+O>#[__](A?]T!DB+!_]0$$R+ +MK=C[__]-A>T/A/;V__])BU4`2(T-[X[]_TB+4A!(.@(E/O_28M]($B%_W0%Z/J3^_]!BTT828M]$$&)ST6%_P^$ZA```$&-1_]( +MBQ3'28G'2(72=.=(BSI(A?]T%$B+!TB)E4C[____4!!(BY5(^___2(G7O@@` +M``#HC9+[_TF+?1#KN$B+A3C\__](B86`_O__#[>%,OS__XG"@^@!@_@8#X@VD_O_Z`'2_/],B?]! +MB<1(BX5@^___2(LPZ-RI_/](BXWX^O__1(GB3(G^2(T]0T\``.BS0O[_2(N] +M(/[__TB%_P^$1OO__^CNDOO_Z3S[__]F#Q^$```````QP$B-%<=A```/'X`` +M````#[8,`C@,!@^%!04``$B#P`%(@_@0=>E(C4\(Z;GL__]$B>-(P>,#2(G? +MZ$&/^_](B87P^___13'M1(FE_/O__TB+A7C[__^_(````$B+`$Z+)"CH2)'[ +M_XN5^/O___-!#V\$)$F#Q0B-2@$/$0#S00]O1"00B8WX^___2(N-\/O__P\1 +M0!!(B03123G==;'I@.3__XN5J/W__TB+A:#]__](BT30^,9`:P#I;OC__TB- +M%,4`````3(GI2(G?2(FU2/O__^@GD_O_2(NU2/O__TB)]^CXD?O_Z4_P__]( +MC;7@^___2(FUR/K__TB)\HG>_]#I4.G__[\0````Z)^0^_\Q_TF)Q(EX"$B- +M!>A$`0!,B>=)B00DZ%3Q_/](B[WH^___2(7_=`9(BP?_4!!,B:7H^___3(FE +M@/S__^EP\___2(N]Z/O__TB%_P^%X?/__^GB\___3(G_Z"+6_/](BX68^___ +M@[VH_?__``^5A%L/S__P````#H5HW[ +M_\<``````$B+M4C[__\QTDB)A;#\__](C86P_/__2(G'3(FUN/S__^A:KOS_ +M3(V](/[__TF+30!%BT4(BY6X_/__2(NUL/S__TR)_^CF;___BX6\_?__.86X +M_?__=6D]_O__?P^'I]3[_T&)Q;K___]_0<'M`BG"08/%`4$YU40/1^I$`>A( +MC1S%`````$F)Q4B)W^B^C/O_28G`BX6X_?__2(NUL/W__X7`#X6.````2(7V +M#X6I````3(F%L/W__T2)K;S]__^_$````.BUCOO_3(G^2(G'28G%Z(>>_/^+ +MA;C]__^-4`&)E;C]__](BY6P_?__3(DLPDB+O2#^__](A?]T!>BLC_O_2(N] +ML/S__TB%_W0%Z)N/^_](BX68^___2HT,Y0````!(BT!02(L$"$@!A<#]___I +M:/[__TR)QTB-%,4`````2(G92(FU./O__^A^D/O_2(NU./O__TF)P$B)]TR) +MA3C[___H18_[_TR+A3C[___I//___TB+O4#[__^)RO_0Z53@__](BY6`^___ +M2(NU4/O__T6)X$B+O4#[____T.F%\O__2(N]X/O__TB%_W0&2(L'_U`02(N% +M\/[__TB-M0C___](C;WX_?__2(F%X/W__TB+A?C^__](B87H_?__2(N%`/__ +M_TB)A?#]___H&Z'\_TB-M1C___](C;T(_O__Z`BA_/](B[5(^___2(V]T/W_ +M_^CUH/S_0;P!````Z1[Q__](BY4@^___2(TU3%T``/_02(N-L/S__TB%R0^$ +M=>K__^EYZ/__BY5(____B=`E`/```#T`0```#X1X"@``2(N-8/____,/;T68 +MB95H_?__2(N50/___TB)C2#]__\/$84H_?__\P]O18A(B95P_?__2(N53/__ +M_P\1A4C]___S#V^%>/___TB)E7C]__](BY58____#Q&%./W__V8/;X4P____ +M2(F5@/W__P\1A5C]__\]`(````^$Y@D``$C'A2#]________Z:S>__](C4\0 +MZ;[G__],B?__T.ED[?__2(N%:/S__TB-M=#^__](C;WX_?__1(M@"$B+A;C^ +M__](B87@_?__2(N%P/[__TB)A>C]__](BX7(_O__2(F%\/W__^C#G_S_2(VU +MX/[__TB-O0C^___HL)_\_TB+M4C[__](C;W0_?__Z)V?_/](B[T0_?__2(7_ +M=`7H+(W[_TB+O2#\__](A?]T!>@;C?O_187D3(G_00^5Q.@L4O[_2(N]Z/O_ +M_T4/MN1(A?]T!DB+!_]0$$B+O>#[__](A?]T!DB+!_]0$$R+K=C[__]-A>T/ +MA&+[__])BT4`2(T-:8?]_TB+0!!(.<@/A=P)``!!@VT(`0^%/_O__TB-!7HU +M`0!)BWTP28U=^/,/?@5:0`$`9D@/;OAF#VS'00\11?A(A?]T!>B"C/O_28M] +M($B%_W0%Z'2,^_]!BT48A<`/A!,+``"#Z`%(B9U(^___28M]$$B-%,4````` +M28G79F8N#Q^$```````/'T``2HL?K__TB+A>#[__\Q]C'_13'`,A6B_O_2(N]Z/O__TB%_P^%J.W__TB+ +MO>#[__](A?]T!DB+!_]0$(N%K/W__SF%J/W__W5L/?[__W\/A]?3^_^)PKG_ +M__]_3(V](/[__\'J`BG!@\(!._HB8?[ +M_TB)PXN%J/W__TR+O:#]__^%P`^%/`<``$V%_P^%20<``$B)G:#]__]$B:6L +M_?__OQ`!``!,C;T@_O__Z'F)^_],B?Y(B<=)B<3H2PS__XN%J/W__TR)_XU0 +M`8F5J/W__TB+E:#]__],B23"Z)E/_O_I+>K__TR)Y__2Z77F__](B<__T.F? +MY/__Z"O)_/](BXWX^O__2(NU@/O__TB-/8%&``")PD&)Q.CL.?[_2(N]H/W_ +M_TB%_W0%Z"N*^_](B[V(_O__2(7_#X62\O__Z9+R__](BXWX^O__2(NU@/O_ +M_[H%0`"`2(T]4$8``.BG.?[_0;P%0`"`Z[-%,?],B;W(^___A=(/A279___I +MCN[__TB+E5C^__]$B>!(C37B/@``2(T\@NC.DOS_A,`/A`+L__](C84@_/__ +M2(G:1(GF2(G'2(F%B/K__^CJE?S_2(N50/S__S';@WH8``^$:08``$B-A3#\ +M__](B87`^O__2(V%L/S__TB)AP$``$4QV[\0````3(F=L/S__^CR +MA?O_13'22(F%L/S__TR)M;C\__]$B1!(B[7(^O__2(N]P/K__^@+9___2(N] +ML/S__TB%_W0%Z!J)^_],BZ5(^___2(NUP/K__TR)Y^ADF_S_2(TU:44``$R) +MY^@E9O__2(NU2/[__TB+O@:B/O_ +M08/$`0^%)?S__TB+O3#\__](A?]T!>C_A_O_2(N50/S__TB#PP$[6A@/@\T$ +M``!(BT(02(TU2CX``$B)E2#[__],BR3828M\)!CHVY#\_TB+E2#[__^$P'7( +M2(NUB/K__TB+O<#Z___H79;\_XN%./S__SF%//S__P^$]0,``(N%./S__TB+ +MC3#\__\Q]HU0`<<$@2X```")T(DT@4&#?"0P`(F5./S__P^$!?[__TF+1"0H +M2(N]R/K__TB+,.@'EOS_Z13^__](B<](B8U(^___QX6(_O__`````>@IS/S_ +M28M]`+HH````B=Y(BXU(^___2(L'_U`P2(N-2/O__X7`08G$#X5/\O__9H.] +M,/S__Q,/A;'S__^+A3C\__^%P'4%N!<```!(B<]FB86(_O__Z)/+_/_IU.3_ +M_TB%_P^%//[__TB+M<#Z__](B[U(^___Z"*9_/](B[5(_O__2(N]R/K__TR+ +MI9#\___H:)W\_TB+M;#\__])C;PDD````+H!````Z-_#_/](B[VP_/__A,`/ +MA+("``!!BX0DV````"4`\```/0!````/E@[7?W_ +M28M%`$R)[_]0"$B+O>#[__](A?]T!DB+!_]0$$B+O4C[__](B=Y,B:W@^___ +M3(V](/[__^A2F/S_2(V%L/S__TB+M4C^__](BC/A_O_A9T,4B+A9C[ +M__]%B?=)BWT`20''2(L#2='O2HL$^$B+,.ABL?S_AK__TB+A6C[__](B[VX^O__2`'P2(G&N`````!( +M#TG&2(F%:/O__TB)QDB+!_]0&$&)Q(7`#X5([/__2(N%H/W__XN5J/W__TB+ +M=-#X2(N%B/O__P^V0%"(A9C[__^#\`&(1FN$P`^%`NK__^DUZO__2(.]8/__ +M_P`/A#^__IJOC__^@M@/O_2(N]Z/O__T2+($6%Y`^$1P(` +M``^.W````$4/M^1!@7__TB+O2#\__](A?\/A%KE___H"8/[_^E0Y?__13'D +MZ:GE__](A?]T!>CR@OO_OE````!(B=_HQ8'[_^E\Y?__3(GO_]#I9/'__S'` +M2(F%:/O__TB)A3#[__](B860^___Z6+1__](BYVX^O__2(NU:/O__TB+`TB) +MW_]0&$&)Q(7`#X7\ZO__2(L#2(VUR/O__TB)W_]0($&)Q(7`#X0SY___Z=SJ +M__](A?\/A='D___I*O___TB+A9C[__^#O:C]__\`#Y6%R/W__P^V0"V(A3__TB)ST&\!4``@.@*QOS_Z9WL__])BWT0Z47U__](C86@_?__0;P%0`"` +M2(F%@/O__^G@X___Z"Z`^_\QTKD#````2/?QN@,```!(.=!(#T/0Z0_6__]( +MA?]T"T&\!4``@.EEX___2(N]X/O__TB%_W082(L'0;P%0`"`3(V](/[___]0 +M$.ESX___0;P%0`"`3(V](/[__^EAX___\P\>^DB)P^EVP_O_\P\>^DB)P^E7 +MQ/O_\P\>^DB)P^FJQ/O_\P\>^DB)P^F[Q/O_\P\>^ND)R/O_\P\>^DB)P^G[ +MQ/O_\P\>^DB)P^GOQ?O_\P\>^DB)P^G*R?O_\P\>^DB)P^D,QOO_\P\>^DB) +MP^DDQOO_\P\>^DB)P^D'QOO_\P\>^DB)P^GAQ/O_\P\>^DB)P^G%Q/O_\P\> +M^DB)P^EYQOO_\P\>^DB)P^E^NG0QOO_\P\>^DB)P^G=QOO_\P\> +M^DB)P^G`QOO_\P\>^DB)P^E"P_O_\P\>^DB)P^DFP_O_\P\>^DB)P^G@QOO_ +M\P\>^DB)P^G#QOO_\P\>^DB)P^FHPOO_\P\>^DB)P^GNQ_O_\P\>^DB)P^G" +MPOO_\P\>^DB)P^D?QOO_\P\>^DB)P^D$P_O_\P\>^DB)P^EJQOO_\P\>^DB) +MPTB-A:#]__](B86`^___2(V%\/O__TB)A1C[___IAL+[__,/'OI(B^DB) +MPTB-A:#]__](B86`^___Z0["^__S#Q[Z2(G#Z>S$^__S#Q[Z2(G#Z<_$^__S +M#Q[Z28G$Z:;&^__S#Q[Z28G$Z8+&^__S#Q[Z28G$Z:/&^__S#Q[Z2(G#Z2;" +M^__S#Q[Z2(G#Z1K'^__S#Q[Z2(G#Z23'^__S#Q[Z2(G#Z=#&^__S#Q[Z2(G# +MZ<;"^__S#Q[Z2(G#ZC!^__S#Q[Z +M2(G#Z=S!^__S#Q[Z2(G#Z3G$^__S#Q[Z2(G#Z1S$^__S#Q[Z2(G#Z?[&^__S +M#Q[Z2(F%F/O__^D`Q_O_\P\>^DB)P^G#P/O_\P\>^DB)P^EWQ?O_\P\>^DB) +MP^EKQ?O_\P\>^NFYQOO_\P\>^DB)P^DDQ?O_\P\>^DB)P^D8Q?O_\P\>^DB) +MP^EVPOO_#Q]$``#S#Q[Z54B)Y4%728G_059,C76P055!B=6)RDR)\4%44XGS +M2(/L2$B+!V1,BR0E*````$R)9J)WDB)19A(B<%) +MBP=,B?](QT6@`````$C'1:@`````_U`PAQF#V]`0&8/_L0/.,O39@]P +MP`X/.,S\#SC+VF8/;\5F#SH/Q`1F#_[P#SC-]68/;T!09@_^Q0\XR]-F#W#` +M#@\XS.4/.,O:9@]OQF8/.@_%!&8/_O@/.,W^9@]O0&!F#_[&#SC+TV8/<,`. +M#SC,[@\XR]IF#V_'9@\Z#\8$9@_^X`\XS>=F#V]`<&8/_L@8,XRU`"0``#.,A0`H +M``"+1!<8#[=<%Q1$#[=,%Q8/MO/!ZP@SA+4`#```00^V\4'!Z0@SA)T`"``` +M,X2U``0``$(S1(T`#[=<%Q!$#[=,%Q(/MO/!ZP@SA+4`'```00^V\4'!Z0@S +MA)T`&```,X2U`!0``$(SA(T`$```#[;QB]G!ZQ@SA+4`+```,X2=`"```,') +M$`^V\<'I&#.$M0`D```SA(T`*```2(/"&`^#PO[__TB#QQA(@^H8#[;8#[;, +MP>@0#[;PP>@(BT2%`#.$G0`,```SA(T`"```,X2U``0``$B#P@1R!3,$%^O- +M2`/72(/'`T@K^DB%_W07#[8R#[;82/_"P>@(,_,S1+4`2/_/=>E=6\-F+@\? +MA```````#Q]``$B+PDB+UDB+SXMQ$,'F!69$#V\A2(/!(&9$#V\L,69$#V\Q +M@^X0Z9P!```/'T0``&8/;PIF#V]2$&8/;UH@9@]O8C!F#V]J0&8/;W)09@]O +M>F!F1`]O0G!F1`]OBH````!F1`]ODI````!F1`]OFJ````"+_F9!#^_-9D$/ +M[]5F00_OW69!#^_E9D$/[^UF00_O]69!#^_]9D4/[\5F10_OS69%#^_59D4/ +M[]UF#V\$.68/.-[(9@\XWM!F#SC>V&8/.-[@9@\XWNAF#SC>\&8/.-[X9D0/ +M.-[`9D0/.-[(9D0/.-[09D0/.-[82(/O$'6Z9D$/.-_.9D$/.-_69D$/.-_> +M9D$/.-_F9D$/.-_N9D$/.-_V9D$/.-_^9D4/.-_&9D4/.-_.9D4/.-_69D4/ +M.-_>9D$/[\QF#^\29@_O6A!F#^]B(&8/[VHP9@_OF!F1`]_0G!F1`]_BH````!F1`]_DI````!F +M1`]_FJ````!(@<*P````2(/H"P^#7_[__TB#P`N#[A#K/&8/;P*+_F9!#^_% +M9@\XWD0Y$&8/.-X$.4B#[R!U[68/.-Y!$&9!#SC?QF9!#^_$9D0/;R)F#W\" +M2(/"$$B#Z`%SOF9$#W]AX,,/'X``````9@\?1```2(O"2(O62(O/BW$0P>8% +M2(/X%@^"QOW__\5Y;R%(@\$@Q&)]6BPQQ&)]6C&#[A"+_@/V4TB![,`!``!( +MB]Q(@^/@Q.)]6@0YQ?U_!'M(@^\0=>](@^@6#Q^``````&:0B_[%E>\*Q97O +M4B#%E>]:0,65[V)@Q97OJH````#%E>^RH````,65[[K`````Q17O@N````#% +M%>^*``$``,45[Y(@`0``Q17OFD`!``#%_6\$.\3B==[(Q.)MWM#$XF7>V,3B +M7=[@Q.)5WNC$XDW>\,3B1=[XQ&(]WL#$8C7>R,1B+=[0Q&(EWMA(@^\@=;[$ +MPG7?SL3";=_6Q,)EW][$PEW?YL3"5=_NQ,)-W_;$PD7?_L1"/=_&Q$(UW\[$ +M0BW?UL1")=_>Q&,=."(!Q,%U[\S%[>]2$,7E[UHPQ=WO8E#%U>]J<,7-[[*0 +M````Q<7ONK````#%/>^"T````,4U[XKP````Q2WODA`!``#%)>^:,`$``,5Y +M;Z)0`0``Q?Y_"L7^?U(@Q?Y_6D#%_G]B8,7^?ZJ`````Q?Y_LJ````#%_G^Z +MP````,5^?X+@````Q7Y_B@`!``#%?G^2(`$``,5^?YI``0``2('"8`$``$B# +MZ!8/@X?^__](@\`6T>Y(@<3``0``6\7X=^FH_?__PTB+PDB+UDB+SXMQ$,'F +M!68/;P%(@\$@9@]O$68/;UD09@]O82!F#V]I,&8/;W%`9@]O>5!(`\Y(]]Y( +M@\9@ZTAF#V\*2(O^9@_ORF8/[\%F#SC9@]O!#EF#SCF!F1`_O0G!F1`_OBH````!F1`_ODI````!F1`_OFJ````!F#W\*9@]_ +M4A!F#W]:(&8/?V(P9@]_:D!F#W]R4&8/?WI@9D0/?T)P9D0/?XJ`````9D0/ +M?Y*0````9D0/?YJ@````2('"L````$B#Z`L/@SS^__](@\`+2(/I$$B#QA#K +M/&9%#]3E9D$/;\9(B_YF00_OQ&8/.-P$.68/.-Q$.1!(@\<@=>UF#SC<`68/ +M.-U!$&8/[P)F#W\"2(/"$$B#Z`%SOF9$#W]D,=###Q]``$B+PDB+UDB+SXMQ +M$,'F!4B#^!8/@I;]___$8GU:(4B#P2#$8GU:,;\!````Q7EN[\1!G?OEQ$&1 +MU.W$0Q4X[0%(`\Z#[A!(]]Y(B_Y(`_932(U<).!(@>S@`0``2(/CX,3B?5H! +MQ?U_`\3B?5H$.<7]?P1[2(/'$'7O2(/H%F:02(O^Q$&=U.7$P1WOSL1!G=3E +MQ,$=[];$09W4Y<3!'>_>Q$&=U.7$P1WOYL1!G=3EQ,$=[^[$09W4Y<3!'>_V +MQ$&=U.7$P1WO_L1!G=3EQ$$=[\;$09W4Y<1!'>_.Q$&=U.7$01WOUL1!G=3E +MQ$$=[][%_6\$.\3B==S(Q.)MW-#$XF7#$XE7=Z,3B3=WPQ.)%W?C$8CW=P,1B-=W(Q&(MW=#$8B7=V,7U[PK% +M[>]2(,7E[UI`Q=WO8F#%U>^J@````,7-[[*@````Q<7ONL````#%/>^"X``` +M`,4U[XH``0``Q2WODB`!``#%)>^:0`$``,7^?PK%_G]2(,7^?UI`Q?Y_8F#% +M_G^J@````,7^?[*@````Q?Y_NL````#%?G^"X````,5^?XH``0``Q7Y_DB`! +M``#%?G^:0`$``$B!PF`!``!(@^@6#X-K_O__2(/`%L1#?3GD`4C1_DB!Q.`! +M``!;Q?AWZ97[___#`````````````````%-5051!54%605=(C40D@$B#X(!( +MB^Q(B^!(B2A(B7@(QT!D`````$B)4$A(B]],BV,820/T2(EP0(M[2(EX<(M[ +M3(EX=(M[4(EX>(M[5(EX?$R+"B+2T2)2%Q$BVM`1(M#6$'1X$R+>S"+0SB+:SQ!N@`(```SVT$+S70.20/\ +M33OT20]%_@^V7_^+3"1802/-P>$%2XTT`T&#^`@/@OX"``!!@_@.#X+%#0`` +MZ0\*``!F#Q]$``!%,\!!B_W!YP@#WT$CV4@#\8M,)%"-'%M)@<.``@``T^-, +M`]M!B_HK^L'O!0/79HF6`/[__T'_Q4$/MTL"00^W4P0]`````7,,P>4(08HO +MP>`(2?_'B_C!Z`L/K\$K^(OU*^@/0\=!#[=[!@]#U[\?````#T+N00]"^KL" +M````@]O_*_G!_P4#^69!B7L"00^W#)L#VST````!+ +M^,'H"P^OPBOXB_4KZ`]#QT$/MWQ;`@]#S[\?````#T+NB_-!#T+Z@]O_*_K! +M_P4#^F9!B3PS00^W%)L#VST````!+^,'H"P^OP2OX +MB_4KZ`]#QT$/MWQ;`@]#U[\?````#T+NB_-!#T+Z@]O_*_G!_P4#^69!B3PS +M00^W#)L#VST````!+^,'H"P^OPBOXB_4KZ`]#QT$/ +MMWQ;`@]#S[\?````#T+NB_-!#T+Z@]O_*_K!_P4#^F9!B3PS00^W%)L#VST` +M```!+^,'H"P^OP2OXB_4KZ`]#QT$/MWQ;`@]#U[\? +M````#T+NB_-!#T+Z@]O_*_G!_P4#^69!B3PS00^W#)L#VST````!+^,'H"P^OPBOXB_4KZ`]#QT$/MWQ;`@]#S[\?````#T+NB_-! +M#T+Z@]O_*_K!_P4#^F9!B3PS00^W%)L#VST````!+ +M^,'H"P^OP2OXB_4KZ`]#QT$/MWQ;`@]#U[\?````#T+NB_-!#T+Z@]O_*_G! +M_P4#^69!B3PS`]L]`````7,,P>4(08HOP>`(2?_'B_C!Z`L/K\(K^(OU*^@/ +M0\>_'P````]"[HOS00]"^H';_P```"OZP?\%`_IF08D\,TR+7"0PBTPD6$$C +MS<'A!4N--`-!B!Y)_\9,.WPD2`^#)0X``$P[="1`#X,:#@``#[>4#@#^__\] +M`````7,,P>4(08HOP>`(2?_'B_C!Z`L/K\([Z`^"[/S__ROX*^B+QXOZP>H% +M*_IFB;P.`/[__P^W5B`]`````7,,P>4(08HOP>`(2?_'B_C!Z`L/K\([Z`^# +M$`L``$&+^BOZP>\%`]=FB58@28'#`/K__T&#P!A!O`4```!!#[<3/0````%S +M#,'E"$&*+\'@"$G_QXOXP>@+#Z_".^@/@LH````K^"OHB\>+^L'J!2OZ9D&) +M.TF#PQ!!O/W___]!#[<3/0````%S#,'E"$&*+\'@"$G_QXOXP>@+#Z_".^@/ +M@H@````K^"OHB\>+^L'J!2OZ9D&).TF!P_`!``"[`0```$$/MTL"9@\?1``` +M00^W%)L#VST````!+^,'H"P^OP2OXB_4KZ`]#QT$/ +MMWQ;`@]#U[\?````#T+NB_-!#T+Z@]O_*_G!_P4#^69!B3PSB\J#^T!RJ$&\ +M[0```.MG08OZ*_K![P4#UV9!B1-,`]E!#[=3`D$/MTL$/0````%S#,'E"$&* +M+\'@"$G_QXOXP>@+#Z_"*_B+]2OH#T/'00^W>P8/0\^_'P````]"[D$/0OJ[ +M`@```(/;_ROZP?\%`_IF08E[`D$/MQ2;`]L]`````7,,P>4(08HOP>`(2?_' +MB_C!Z`L/K\$K^(OU*^@/0\=!#[=\6P(/0]>_'P````]"[HOS00]"^H/;_ROY +MP?\%`_EF08D\,P/;/0````%S#,'E"$&*+\'@"$G_QXOXP>@+#Z_"*_B+]2OH +M#T/'OQ\````/0NZ+\T$/0OI!&]PK^L'_!0/Z9D&)/#-,BUPD,$&#^!@/@OX# +M``"_!0```(/[!0]"^TF#PX#!YP=,`]]$B^-!#[=+`D$/MU,$/0````%S#,'E +M"$&*+\'@"$G_QXOXP>@+#Z_!*_B+]2OH#T/'00^W>P8/0]>_'P````]"[D$/ +M0OJ[`@```(/;_ROYP?\%`_EF08E[`D$/MPR;`]L]`````7,,P>4(08HOP>`( +M2?_'B_C!Z`L/K\(K^(OU*^@/0\=!#[=\6P(/0\^_'P````]"[HOS00]"^H/; +M_ROZP?\%`_IF08D\,T$/MQ2;`]L]`````7,,P>4(08HOP>`(2?_'B_C!Z`L/ +MK\$K^(OU*^@/0\=!#[=\6P(/0]>_'P````]"[HOS00]"^H/;_ROYP?\%`_EF +M08D\,T$/MPR;`]L]`````7,,P>4(08HOP>`(2?_'B_C!Z`L/K\(K^(OU*^@/ +M0\=!#[=\6P(/0\^_'P````]"[HOS00]"^H/;_ROZP?\%`_IF08D\,T$/MQ2; +M`]L]`````7,,P>4(08HOP>`(2?_'B_C!Z`L/K\$K^(OU*^@/0\=!#[=\6P(/ +M0]>_'P````]"[HOS00]"^H/;_ROYP?\%`_EF08D\,XO+`]L]`````7,,P>4( +M08HOP>`(2?_'B_C!Z`L/K\(K^(OU*^@/0\>_'P````]"[HOS00]"^H/;/ROZ +MP?\%`_IF08D\,X/C`TR+7"0P@_DG#X*."```@^DE@\L"00^W4P+!XP5-C4L$ +MZRP/'X``````#Q^```````\?@``````/'T0``-'HB_TKZ`]([P])WO_)=#`# +MVXUS$#T````!#X/@____P>4(08HOP>`(2?_'Z](/'X``````#Q^```````\? +M0`!!#[<)/0````%S#,'E"$&*+\'@"$G_QXOXP>@+#Z_"*_B+]2OH#T/'00^W +M>P8/0\\/0NZ_'P```$$/0OI)C7,&3`]#SBOZP?\%`_IF08E[`DF#P01!#[<1 +M/0````%S#,'E"$&*+\'@"$G_QXOXP>@+#Z_!*_B+]2OH#T/'00^W>00/0]4(08HOP>`(2?_'B_C!Z`L/K\(K^(OU*^@/0\=!#[=Y"`]#SP]"[K\?```` +M00]"^DF-<0A,#T/.*_K!_P4#^F:)?O!-*\M!T>E!"]D]`````7,,P>4(08HO +MP>`(2?_'B_C!Z`L/K\$K^(OU*^@/0\=GC7OX#T+?#T+NOQ\```!!#T+Z*_G! +M_P4#^69#B3Q+BW0D<(M,)'2+5"1XBWPD7(7_00]$_3O?#X.S!P``_\.)7"1P +M08O/1!@^@&08/X#D0/ +M0\=-*_1,*_%S!4P#="0H1P^V##1!O``"``!!P>$"18OT12/Q0P^WC#,"`@`` +M2XV4,P("``!%,^9%`\D]`````7,,P>4(08HOP>`(2?_'B_C!Z`L/K\$K^(OU +M*^A%#T/F18OQ#T/'OQ\````/0NY!#T+ZNP````"#V_TK^<'_!0/Y9HDZ12/T +M2XT4(TD#U@^W#%I%,^8#VT4#R3T````!+^,'H"P^O +MP2OXB_4KZ$4/0^9%B_$/0\>_'P````]"[HOS00]"^H/;_ROYP?\%`_EFB3PR +M12/T2XT4(TD#U@^W#%I%,^8#VT4#R3T````!+^,'H +M"P^OP2OXB_4KZ$4/0^9%B_$/0\>_'P````]"[HOS00]"^H/;_ROYP?\%`_EF +MB3PR12/T2XT4(TD#U@^W#%I%,^8#VT4#R3T````!+ +M^,'H"P^OP2OXB_4KZ$4/0^9%B_$/0\>_'P````]"[HOS00]"^H/;_ROYP?\% +M`_EFB3PR12/T2XT4(TD#U@^W#%I%,^8#VT4#R3T````!+^,'H"P^OP2OXB_4KZ$4/0^9%B_$/0\>_'P````]"[HOS00]"^H/;_ROY +MP?\%`_EFB3PR12/T2XT4(TD#U@^W#%I%,^8#VT4#R3T````!+^,'H"P^OP2OXB_4KZ$4/0^9%B_$/0\>_'P````]"[HOS00]"^H/; +M_ROYP?\%`_EFB3PR12/T2XT4(TD#U@^W#%I%,^8#VT4#R3T````!+^,'H"P^OP2OXB_4KZ$4/0^9%B_$/0\>_'P````]"[HOS00]" +M^H/;_ROYP?\%`_EFB3PR12/T2XT4(TD#U@^W#%H#VST````!+^,'H"P^OP2OXB_4KZ`]#Q[\?````#T+NB_-!#T+Z@=O_````*_G! +M_P4#^6:)/#),BUPD,(M,)%A!(\W!X05+C30#3(MT)&A!B!Y)_\9,.WPD2`^# +M5`,``$P[="1`#X-)`P``#[>4#@#^__\]`````7,,P>4(08HOP>`(2?_'B_C! +MZ`L/K\([Z`^#+_7__T2+3"1408/H!ND0\O__#Q^``````&8/'T0``$&+^BOZ +MP>\%`]=FB90.`/3__TR+9"0X28O^BU0D<$DK_$F!ZP#V__]!@\@"0?_%BTPD +M6$$CS<'A!4N--`-(*_IS!4@#?"0H00^V'#SIG/O__P\?@``````/'X`````` +MD"OX*^B+QXOZP>H%*_IFB7X@08/X#D&X$````+H6````1`]#PDF!PP#V__\/ +MMU8X/0````%S#,'E"$&*+\'@"$G_QXOXP>@+#Z_".^AS\%`]=F +MB58X#[>4#@#T__\]`````7,,P>4(08HOP>`(2?_'B_C!Z`L/K\([Z`^"&?__ +M_ROX*^B+QXOZP>H%*_IFB;P.`/3__^EH]/__#Q^```````\?@``````/'X`` +M````#Q^```````\?`"OX*^B+QXOZP>H%*_IFB7XX1(M,)'"+7"1T1(E,)'0/ +MMU90/0````%S#,'E"$&*+\'@"$G_QXOXP>@+#Z_".^AS%T&+^BOZP>\%`]=F +MB590B5PD<.GP\___*_@KZ(O'B_K!Z@4K^F:)?E!$BTPD>(E<)'@/MU9H/0`` +M``%S#,'E"$&*+\'@"$G_QXOXP>@+#Z_".^AS&$&+^BOZP>\%`]=FB59H1(E, +M)'#IF_/__ROX*^B+QXOZP>H%*_IFB7YHBUPD?$2)3"1\B5PD<.EX\___#Q^` +M``````\?@`````"0@^DA#X89^?__@\L"T^-)C9Q;`O/__T&Y`@````\?0``/ +MMQ-,B]M)`]D]`````7,,P>4(08HOP>`(2?_'B_C!Z`L/K\(K^(OU*^@/0\=* +MC3P+2`]#W[\?````#T+N00]"^D4#R2OZP?\%`_IF08D[_\EUK4R+7"0P02O9 +M@>L`\___22O;T>OIE_C__TB+]TF+_$B+3"0H2/?:#[8<-TC_QD&('!9(_\)( +M._%U[0^V'T@K^ND%^?__B5PD9.M&08'$``(``$2)9"1DB5PD<(ET)'2)3"1X +MB50D?$&#^"9!N`X```"_%````$0/0\>[`0```.L2_\-UQL=$)&02`0``08/H +M&#/;/0````%S#,'E"$&*+\'@"$G_QTB+3"0(3"MT)#A,B7$H3(EY,(E!.(EI +M/$'1Z$2)05A$B6E`BWPD9(EY7(M\)'")>4B+?"1TB7E,BWPD>(EY4(M\)'R) +M>52+PTB+)"1!7T%>05U!7%U;PP#S#Q[Z2(/L"$B#Q`C#```````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````````$``@`` +M!``$\("`@#`P,#`````````````````````````````````````````````` +M``````````````````!`N_O_<+O[_X"[^_^@N_O_P+K[_^BZ^_\````````` +M`#(P24-O;7!R97-S4V5T365M3&EM:70`````````````,3E)0V]M<')EF4````````````````````` +M```````````````S-$E#;VUPR=0F#+!H;;EJ@4CO6 +MLRGC+X13T0#M(/RQ6VK+OCE*3%C/T.^J^T--,X5%^0)_4#R?J%&C0(^2G3CU +MO+;:(1#_\]+-#!/L7Y=$%\2G?CUD71ES8(%/W"(JD(A&[K@4WEX+V^`R.@I) +M!B1JX(NG@E+ARFM,;HW70?2[V+BG`^ +MM69(`_8.8357N8;!'9[A^)@1:=F.E)L>A^G.52C?C*&)#;_F0FA!F2T/L%2[ +M%I@OBD*11#=QS_O`M:7;M>E;PE8Y\1'Q6:2"/Y+57ARKF*H'V`%;@Q*^A3$D +MPWT,571=OG+^L=Z`IP;^[\:=P0_,H0PD;RSI+:J$=$K< +MJ;!B2 +MT20&F=:%-0[T<*!J$!;!I!D(;#<>3'=()[6\L#2S#!PY2JK83D_*G%OS;RYH +M[H*/=&]CI7@4>,B$"`+'C/K_OI#K;%"D]Z/YOO)X<<;=/#\?OUGS2*%DO%HR +M9E%@4$]325@`97)R;F\]`"`Z(`!%7T%"3U)4(#H@3W!E'!E8W1E +M9"!E;F0@;V8@9&%T80!)'1R86-T:6YG(&%R8VAI=F4Z +M(`!/<&5N`$YO(&9I;&5S('1O('!R;V-EF4`071T7!T960`4W!L:70@0F5F;W)E`%-P;&ET +M($%F=&5R`$1I8W1I;VYA`!3=6)4>7!E`%-H;W)T($-O;6UE;G0`0V]D92!086=E`$ES(&YO +M="!A0!/=70@3F%M90!#;W!Y($QI;FL`07)C1FEL94YA;64`27-(87-H`$UE=&%D +M871A($-H86YG960`57-EE-&6"!;/&-O;6UA;F0^72!;/'-W:71C:&5S/BXN +M+ET@6SQF:6QE7VYA;64^+BXN70H*/$-O;6UA;F1S/@H@('0Z(%1ET1I7TZ('-E="!/=71P=70@9&ER96-T;W)Y"B`@+7![4&%S3H@87-S=6UE(%EE7!T960@9FEL92X@5W)O;F<@<&%S7!T960@9FEL92X@5W)O;F<@<&%S&ES=&EN9R!F:6QE.@H````H62EE#8T*2`Z($-O<'ER:6=H="`H +M8RD@,3DY.2TR,#(T($EG;W(@4&%V;&]V(#H@,C`R-"TQ,2TR.0H```````!- +M=6QT:7!L92!I;G-T86YC97,@9F]R('-W:71C:#H``%-E=$-O;G-O;&5#=')L +M2&%N9&QE2$``$AE861E7-I8V%L(%-I>F4@8V%N)W0@8F4@ +M9&5T96-T960`0V%N;F]T(&-R96%T92!O=71P=70@9&ER96-T;W)Y``!#86YN +M;W0@8W)E871E(&9I;&4@=VET:"!A=71O(&YA;64````````````````````` +M```````````````#`````````````````````0````,````````````````` +M`````````0````(````#```````0`````````!```````!D."0<%!00$!`,# +M`P("`@)GY@EJA:YGNW+S;CPZ]4^E?U(.48QH!9NKV8,?&F4``````````#E)26Y3=')E86T````````````` +M`````#$S0TEN1FEL95-T7!T;S-.-WHU0T)A7!T;S-.-WHX0T1E +M8V]D97)%````````````3CE.0V]M<')E_W_I7O]_P````!..$Y!C$Y0TEN07)C:&EV945X8V5P=&EO;D4````````````````````````````` +M````````3CA.07)C:&EV93-.-WHR.$-5;G-U<'!O&-E +M<'1I;VY%````,35)3W!E;D-A;&QB86-K54D````````````````````````` +M````````````````,S!)1F]L9&5R07)C:&EV945X=')A8W1#86QL8F%C:S(` +M````````````````````,3A)17AT&5R351%`````````$XQ,DY#;V1E&5R,C9#0V]D +M97)%`#$Q0U9I&5R,CA# +M0V]D97)-5$4`````````.4E07!T;T=E=%1E +M>'1087-S=V]R9````````````````````````````````#(Y24%R8VAI=F5/ +M<&5N4V5T4W5B07)C:&EV94YA;64`,C9)07)C:&EV94]P96Y6;VQU;65#86QL +M8F%C:P`````R,$E!_?_(WOW_]MS]_X#>_?]@WOW_0-[] +M_]C=_?_VW/W_]MS]__;<_?_VW/W_]MS]__;<_?_VW/W_]MS]__;<_?_VW/W_ +M]MS]__;<_?_VW/W_]MS]__;<_?_VW/W_]MS]__;<_?_VW/W_]MS]__;<_?_V +MW/W_]MS]__;<_?_VW/W_]MS]__;<_?_VW/W_]MS]__;<_?_VW/W_]MS]__;< +M_?_VW/W_]MS]__;<_?_VW/W_]MS]__;<_?_VW/W_N-W]_[9+_O_;2_[_!47^ +M_\]+_O^O2_[__T3^_P``````````,39#26Y&:6QE4W1R96%M5F]L```````` +M```````````Q-T-3=&1/=71&:6QE4W1R96%M```````W0T-O9&5CX_O_?M_[_I+?^_Z2W_O^DM_[_I+?^_Z2W_O^DM_[_I+?^ +M_Z2W_O^DM_[_I+?^_Z2W_O^DM_[_I+?^_Z2W_O^DM_[_I+?^_Z2W_O^DM_[_ +MI+?^_Z2W_O^DM_[_I+?^_Z2W_O^DM_[_I+?^_Z2W_O^DM_[_I+?^_Z2W_O^D +MM_[_I+?^_Z2W_O^DM_[_I+?^_Z2W_O^DM_[_I+?^_Z2W_O^DM_[_I+?^_Z2W +M_O^DM_[_N[?^_YAY^_\=>OO_SGC[_S9Y^___>/O_='K[_Y%X^__[=_O_N7G[ +M_P`````W05-T7-T96U%>&-E +M<'1I;VX``````````````````#(Q0TUEE;PE8Y\1'Q6:2"/Y+57ARKF*H'V`%;@Q*^A3$DPWT,571= +MOG+^L=Z`IP;^[\:=P0_,H0PD;RSI+:J$=$KB2T20&F=:% +M-0[T<*!J$!;!I!D(;#<>3'=()[6\L#2S#!PY2JK83D_*G%OS;RYH[H*/=&]C +MI7@4>,B$"`+'C/K_OI#K;%"D]Z/YOO)X<<8!&P,[3!L``&@#``#P)/O_@!L` +M`(`J^_^H&P``D"K[_]`O``"Y*OO_##```.`J^_](,```!BO[_R`Q```L*_O_ +M4#$``%(K^_^(,@``;"O[_^`R``"B*_O_D#,``,,K^_^<-```^BO[__@T``!X +M+/O_'#4``*(L^_],-0``JRS[_P@V``#$+/O_5#8``-DL^__8-@``"BW[_R@W +M``!"+?O_=#<``'HM^__`-P``LBW[_PPX``#J+?O_8#@``".?O_0&H``/(Y^_^L:@``_#S[_WQK```N0_O_&'$``$)#^_]@<0``5D/[ +M_^QQ``"X0_O_,'(``"I$^_^(<@``243[_^QR``">1/O_.',```Y%^_]L```2DK[_[!X``!T2OO_.'D``(A* +M^_^4>0``RDK[_[AZ``#I2_O_)'L``#Y,^_]\>P``H$S[_P1\```\3_O_)'T` +M`&A/^__`?@``DD_[_QA_``"_3_O_/'\``-I/^_]@?P``*E#[_Q"```!`4/O_ +M9(```$90^_]0@0``7%#[_UB"``".4/O_X((``+Q0^_\T@P``VU#[_X2#``#Z +M4/O_5(8``+Q2^__,A@``05/[_QR'``!Y4_O_>(<``-!3^__0AP``]%/[_RR( +M```>5/O_L(@```M5^_\DB0``'EW[_]B*```H7?O_5(L``&!=^_]TBP``=EW[ +M_YB+``",7?O_W(T``&!A^_\TC@``06?[_XR.``!;9_O_X(X``'1G^_\\CP`` +MS6?[_Y2/``!2:OO_()```'QJ^_]`D```%6O[_[20```A<_O_#)$``&!S^_]< +M+```@'/[_RA8``"P<_O_2(D``'!X^_]XC0``8(G[_V@;``!0BOO_P!L``/"* +M^__P&P``((O[_P0<``#PB_O_&!P``&",^_\L'```$(W[_T`<``#0C?O_5!P` +M`+"/^_^('```\)#[_YP<```0F?O_S!P``$"?^_\$'0``P)_[_Q@=``#PHOO_ +M0!T``%"E^_]P'0``0*C[_Z@=```0JOO_U!T``!"N^_\`'@``D*[[_Q0>``"@ +MKOO_*!X``#"O^_\\'@``0*_[_U`>``"`L/O_9!X``,"Q^_]X'@```+/[_XP> +M``!`M/O_H!X``%"T^_^T'@``8+3[_\@>``!PM/O_W!X``("T^__P'@``D+3[ +M_P0?``"@M/O_&!\``+"T^_\L'P``P+3[_T`?``#0M/O_5!\``."T^_]H'P`` +M(+7[_WP?``!@M?O_D!\``/"U^_^D'P```+;[_[@?```0MOO_[!\``$"V^_\4 +M(```T+;[_R@@``#@MOO_/"```*"W^_]0(```8+C[_V0@``!PN/O_>"```("X +M^_^,(```D+C[_Z`@``#`N/O_R"```-"X^__<(````+G[_P0A```PN?O_&"$` +M`&"Y^_\L(0``X+K[_T`A``#PNOO_5"$```"[^_]H(0``$+O[_WPA```@N_O_ +MD"$``#"[^_^D(0``0+O[_[@A``!0N_O_S"$``&"[^__@(0``<+O[__0A``"` +MN_O_""(``)"[^_\<(@``X+O[_T0B```PO/O_;"(``&"\^_^0(@``D+S[_[0B +M````O?O_W"(``'"]^_\$(P``@+W[_Q@C``"0O?O_+",``$"^^_]`(P```+_[ +M_U0C```0O_O_:",``""_^_]\(P``8+_[_Y`C``"PP/O_N",``-#`^__,(P`` +M\,#[_^`C``#`POO_]",``-#"^_\()```X,+[_QPD``#PPOO_,"0```##^_]$ +M)```$,/[_U@D```@P_O_;"0``###^_^`)```0,/[_Y0D``!0P_O_J"0``&## +M^_^\)```<,/[_]`D``"`P_O_Y"0``)##^__X)```L,/[_PPE``#`P_O_("4` +M`-##^_\T)0``,,3[_U0E``"0Q/O_:"4``!#%^_]\)0``T,;[_Y`E``!PROO_ +MP"4``/#+^__X)0``0,S[_QPF``#@S/O_2"8``$#.^_^`)@``(,_[_[`F``#0 +MS_O_W"8``%#1^_\0)P``8-+[_TPG````T_O_@"<``*#3^_^P)P``$-3[_^`G +M``"`U/O_$"@``/#4^_]`*```8-7[_W`H``"@U?O_F"@``.#5^__`*```(-;[ +M_^@H``!@UOO_$"D```#7^_]`*0``L-?[_W`I``!@V/O_H"D``!#9^__0*0`` +MP-G[_P`J````VOO_*"H``$#:^_]0*@``T-K[_W`J```0V_O_D"H``%#;^_^P +M*@``D-O[_]`J``#0V_O_\"H``!#<^_\0*P``4-S[_S`K``"@W/O_4"L``/#< +M^_]P*P``8-W[_Y`K``"PW?O_L"L``!#>^__<*P``<-[[_P@L``#PWOO_,"P` +M`'#K^_]\+````.S[_Z0L``"P\OO_U"P```#V^_\`+0``T/?[_S`M``"0^?O_ +M8"T``/#Z^_^0+0``(/W[_\`M``!@__O_\"T``*`!_/\@+@``<`;\_T`N``"P +M"_S_>"X``!`5_/^H+@``(!7\_[PN``"@%?S_["X``%`N_/\<+P``T"[\_TPO +M``!0+_S_?"\``#`P_/^H+P``L##\_^PO``!P,?S_(#```.`Q_/\T,```(#+\ +M_V0P``"P,OS_E#```/`R_/^T,```@#/\_^`P```0-/S_##$``%`T_/\\,0`` +ML#3\_VPQ``!`-?S_F#$``(`U_/^X,0``(#;\_^0Q```0-_S_$#(``(`W_/]4 +M,@``8#C\_ZPR``#P.?S_!#,``,`Z_/\T,P``0#O\_V`S``#@._S_L#,``'`\ +M_/_<,P``,#W\_Q`T``"0/?S_/#0``"`__/]P-```T#_\_[PT````1/S_.#4` +M`'!$_/]H-0``H$3\_XPU``!`1?S_H#4``#!&_/_,-0``@$C\_R@V``#@2/S_ +M=#8``%!*_/^@-@``P$[\__@V``#`3_S_2#<``.!0_/^4-P``X%'\_^`W``#@ +M4OS_+#@``/!4_/^$.```<%7\_Y@X``"@5_S_T#@``/!:_/\P.0``0%O\_U0Y +M``!`7OS_L#D``/!@_/\(.@``L&7\_WPZ```P9_S_I#H``&!G_/_H.@``@&?\ +M_PP[``#P9_S_+#L``!!M_/^$.P``4&W\_Y@[``"P;?S__#L```!P_/\L/``` +MT'#\_V`\``#@?S_1#\``*!Y_/]8/P``L'G\ +M_VP_``#`>?S_@#\``-!Y_/^4/P``X'G\_Z@_````>OS_O#\``"!Z_/_0/P`` +M('O\_^0_``!`?/S_^#\``$!]_/\,0```4'W\_R!```!P??S_-$```(!]_/]( +M0```0'[\_UQ`````?_S_<$```!!__/^$0```('_\_YA```!0?_S_N$```(!_ +M_/_80```P(#\_^Q```#0@/S_`$$``/"`_/\400``,('\_RA!``"0@?S_6$$` +M`/"!_/^(00``4(+\_[A!``!@@OS_S$$``'""_/_@00``@(+\__1!``"0@OS_ +M"$(``*""_/\<0@``L(+\_S!"``#`@OS_1$(``-""_/]80@``X(+\_VQ"``#P +M@OS_@$(```"#_/^40@``$(/\_ZA"``#P@_S_T$(``*"$_/\(0P``8(7\_RQ# +M```@A_S_0$,``#"'_/]40P``0(?\_VA#``!0A_S_?$,``&"'_/^00P``<(?\ +M_Z1#``"`A_S_N$,``)"'_/_,0P``H(?\_^!#``"PA_S_]$,```"(_/\(1``` +M$(C\_QQ$``"0B/S_,$0``*"(_/]$1````(G\_UA$```0B?S_;$0``%",_/^8 +M1```8(S\_ZQ$``!PC/S_P$0``(",_/_41```D(S\_^A$``"@C/S__$0``+", +M_/\010``P(S\_R1%``#0C/S_.$4``.",_/],10``\(S\_V!%````C?S_=$4` +M`!"-_/^(10``((W\_YQ%```PC?S_L$4``$"-_/_$10``X(W\__A%```PCOS_ +M($8``'"._/](1@``L([\_VQ&``#@COS_D$8``#"0_/^X1@``8)#\_\Q&``"@ +MD/S_X$8``."0_/_T1@``,)'\_PA'``"`D?S_,$<``,"1_/]81P```)+\_WQ' +M```PDOS_H$<``%"2_/^T1P``8)+\_\A'``"`DOS_W$<``)"2_/_P1P``L)+\ +M_P1(``#`DOS_&$@``."2_/\L2```\)+\_T!(``!PD_S_5$@``("3_/]H2``` +M$)3\_Y!(``"0E/S_I$@``*"4_/^X2```8)7\_]Q(``#PE?S_\$@```"6_/\$ +M20``T);\_QA)``#@EOS_+$D``*"7_/]`20``8)C\_U1)``!PF/S_:$D``("8 +M_/]\20``X)G\_ZQ)``!`F_S_X$D``*"<_/\42@```)[\_TA*``!@G_S_?$H` +M`,"@_/^P2@``(*+\_^1*``"0H_S_&$L``/"D_/],2P``8*;\_X!+``#0I_S_ +MM$L``$"I_/_H2P``@*G\_Q!,``#`J?S_.$P``,"L_/]D3```T*S\_WA,```P +MK?S_J$P``*"M_/_83```X*W\_P!-```@L/S_,$T``&"R_/]@30``H+3\_Y!- +M``#@MOS_P$T``&#+_/_T30``$,S\_Q1.``"PS/S_-$X``"#-_/]<3@``D,W\ +M_X1.````SOS_K$X``'#._/_43@``X,[\__Q.``!`S_S_($\``*#/_/]$3P`` +M`-#\_VA/``!@T/S_C$\``'#0_/^@3P``H-#\_\!/``"PT/S_U$\``.#0_/_T +M3P``L-'\_RQ0``#`T?S_0%```##3_/]L4```0-/\_X!0``"`T_S_E%```)#3 +M_/^H4```D-3\_]Q0``"@U/S_\%```"#5_/\<40``8-?\_T!1``"@V/S_=%$` +M`.#9_/^D40``0-O\_]Q1``"@W/S_#%(```#>_/\\4@``P-[\_W!2``#0W_S_ +MI%(``-#A_/_\4@``L.+\_TQ3``#`XOS_8%,``-#J_/^X4P``8.S\_PA4```P +M[?S_.%0``!#N_/]H5```\.[\_YA4``#0[_S_R%0``+#P_/_X5```(/'\_RA5 +M``#`\?S_7%4``%#R_/^450``X/+\_[Q5``"`\_S_\%4``)#S_/\$5@```/3\ +M_SA6``!@]/S_9%8``!#V_/^@5@``(/;\_[16``"P]_S_Y%8``,#W_/_X5@`` +M(/C\_R17``#0^/S_6%<``(#Y_/^45P``T/G\_\!7``#@^?S_U%<``*#Z_/\\ +M6```%D````" +M_?^D60``D`3]_]19``"@!/W_Z%D``%`%_?\46@``H`7]_SQ:``"@"?W_;%H` +M`)`._?^@6@``X!+]_]!:``"0%OW_(%L``-`6_?\X6P``X!;]_TQ;```@%_W_ +M8%L``&`7_?]T6P``@!?]_XA;``#@%_W_G%L````8_?^P6P``,!C]_]!;``!0 +M&/W_Y%L``'`8_?_X6P``D!C]_PQ<``"P&/W_(%P``,`9_?],7```$!K]_V!< +M``"0&OW_=%P``*`:_?^(7```P!K]_YQ<```@&_W_L%P``#`;_?_$7```L!O] +M_]A<``#`&_W_[%P``(`<_?\`70``0!W]_Q1=``!0'?W_*%T``&`=_?\\70`` +M\!W]_U!=````'OW_9%T``'`>_?^,70``@![]_Z!=``"0'OW_M%T``*`>_?_( +M70``L![]_]Q=``#0'OW_\%T``/`>_?\$7@``$!_]_QA>```P'_W_+%X``*`? +M_?]`7@``$"#]_U1>``#0(/W_:%X``&`A_?^47@``P"']_\1>```@(OW_]%X` +M```C_?\H7P``\"/]_UA?```0)OW_?%\``,`F_?^D7P``\"?]_\Q?``"0*/W_ +M&&```(`K_?]$8```,"S]_Y!@``"@+/W_P&```(`M_?_P8```H##]_R!A``#0 +M,/W_0&$``*`R_?]P80``L#+]_X1A``#@,OW_I&$``!`S_?_$80``\#/]_^!A +M````-/W_]&$``(`U_?\T8@``D#7]_TAB```0-OW_C&(``)`Y_?_D8@``8#O] +M_SAC``#@._W_7&,``-`]_?^08P``T#[]_]AC``#@/_W_7&0``,!!_?^(9``` +M4$+]_[AD``#P0OW_#&4``+!$_?]$90``$$7]_Y!E```@1OW_W&4``*!+_?\T +M9@``$$S]_WAF``"P3?W_Q&8``%!/_?\09P``X%+]_VAG```04_W_L&<``/!3 +M_?_89P``\%3]_RAH``#05?W_=&@``"!S_?_<:```L'7]_S!I``#`=?W_1&D` +M`$!Z_?^4:0``4'K]_ZAI``"`?OW_^&D``)!^_?\,:@``\([]_V1J````C_W_ +M>&H``'"=_?_0:@``8*+]_PQK``#0HOW_/&L``%"M_?^@:P``H*W]_[1K``"P +MK?W_R&L``."N_?_<:P``(+#]__!K``!@L?W_!&P``*"R_?\8;```X+/]_RQL +M``#PL_W_0&P```"T_?]4;```$+3]_VAL```@M/W_?&P``#"T_?^0;```(+7] +M_Z1L```@MOW_N&P``""W_?_,;```(+C]_^!L```PN/W_]&P``$"X_?\(;0`` +M4+C]_QQM``!@N/W_,&T``$"Y_?]4;0``8+G]_VAM``"`N?W_?&T``)"[_?^0 +M;0``\+O]_Z1M``#@O/W_X&T``/"]_?\<;@``X+[]_S!N``#@O_W_1&X``/"_ +M_?]8;@```,#]_VQN``!0P/W_@&X``*#`_?^L;@``$,']_^!N```@P?W_]&X` +M`##!_?\(;P``0,']_QQO``!0P?W_,&\``(#"_?]<;P``,,3]_Y!O``#@Q?W_ +MP&\``)#'_?_P;P``0,G]_R!P``#PROW_4'```##-_?^`<```<,_]_[!P```P +MT/W_['```(#0_?\T<0``T-#]_WQQ``#0T?W_I'$``/#1_?_(<0``$-+]_QQR +M``!PTOW_7'(``"#4_?^H<@``,-3]_[QR``#PU/W_#',```#8_?]8```0`K^_]1X``!P#/[_!'D` +M`$`-_O]8>0``<`_^_[AY````$/[_\'D``(`0_O\D>@``X!#^_U1Z``!`$?[_ +MA'H``/`9_O_<>@```!K^__!Z````'O[_2'L``$`A_O^@>P``H"+^_]![```0 +M1_[_*'P``.!*_O]?[_D((``-!Y_O^P@@``T'W^_P2#```P?O[_ +M5(,``)!^_O^D@P``4'_^_]"#``"0?_[_\(,``.!__O\0A```H(#^_S2$``!P +M@?[_6(0``#""_O]\A````(/^_Z"$``#P@_[_S(0``/"$_O_XA```\(7^_R2% +M``!@CO[_6(4```"4_O^,A0``@)3^_[R%````E?[_[(4``)"5_O\@A@``<*G^ +M_WB&```0JO[_H(8``""L_O_LA@``8*[^_SR'``"0MO[_G(<``&"W_O_TAP`` +M<+C^_U"(```PN?[_?(@``(#(_O_4B```D,C^_^B(``#0\_[_@(D``)#W_O_4 +MB0``0/C^_P"*``"P^O[_6(H``##]_O^PB@```/[^__B*``!0`O__*(L``&`# +M__^\BP``8`3__^"+``"`!/__](L``!`%__\8C```D`7__RR,``!`!O__5(P` +M`)`&__]XC```$`?__Z2,``#@!___U(P``'`(__\`C0``X`C__RB-``"`"?__ +M3(T``!`*__^HC0``T"3__P".``"04/__6(X``$!2__^PC@``4%/__P"/``!P +M5O__8(\``$!R__^XCP``0'/___"/``#0<___>)```+"J___8D````````!0` +M`````````7I2``%X$`$;#`<(D`$``!0````<````\&W[_R8`````1`<0```` +M`"0````T````:`G[_Y`%````#A!&#AA*#PMW"(``/QH[*C,D(@`````4```` +M7````-`.^_\(```````````````L````=````(AN^_^=`````$4.$(8"2`T& +M1(T#C`1+@P4";0H,!PA'"TP,!P@````0````I````/AN^_\A`````````!`` +M``"X````%&_[_\4`````````$````,P```#0;_O_;``````````0````X``` +M`"QP^_^I`````````!````#T````R'#[_[T`````````,`````@!``!T)7[_Q``````````$`````@$``!T +ME?O_$``````````0````'`0``'"5^_\U`````````!`````P!```G)7[_S(` +M````````$````$0$``#(E?O_BP`````````0````6`0``$26^_\.```````` +M`!````!L!```0);[_P\`````````'``````````!>E!,4@`!>!`'FQ'5```; +M&PP'")`!```D````)````!R6^_\K````!#=Q``!%#A"&`D<-!D*,`T:#!%8, +M!P@`$````,@$```DEOO_BP`````````0````W`0``*"6^_\.`````````!`` +M``#P!```G);[_[X`````````$`````0%``!(E_O_O@`````````0````&`4` +M`/27^_\.`````````!`````L!0``\)?[_PX`````````$````$`%``#LE_O_ +M#@`````````D````V````.B7^_\G````!(=P``!%#A"&`D,-!D*,`T:#!%8, +M!P@`$````'P%``#PE_O_#0`````````D````%`$``.R7^_\G````!$]P``!% +M#A"&`D,-!D*,`T:#!%8,!P@`$````+@%``#TE_O_)@`````````0````S`4` +M`!"8^_\F`````````!````#@!0``+)C[_W0!````````$````/0%``"8F?O_ +M#0`````````0````"`8``)29^_\-`````````!`````)G[_PX`````````$````*@&``!TF?O_ +M!P`````````0````O`8``'"9^_\'`````````"0```!4`@``;)G[_T0````$ +M$V\``$4.$(8"0PT&0HP#1(,$=0P'"``D````?`(``)29^_]$````!.]N``!% +M#A"&`D,-!D*,`T2#!'4,!P@`(````*0"``"\F?O_+P````3+;@``10X0A@)# +M#09!@P-E#`<((````,@"``#(F?O_+P````2K;@``10X0A@)##09!@P-E#`<( +M)````&@'``#4F?O_9`````!%#A"&`D,-!D.,`X,$`E,*#`<(00L``"0```"0 +M!P``')K[_V0`````10X0A@)##09#C`.#!`)3"@P'"$$+```0````N`<``&2: +M^_\.`````````!````#,!P``8)K[_PX`````````$````.`'``!`````````!````"`"```_)S[_QX`````````$````)0(```(G?O_RP$` +M```````0````J`@``,2>^_\-`````````!````"\"```P)[[_PT````````` +M$````-`(``"\GOO_#0`````````0````Y`@``+B>^_\-`````````!````#X +M"```M)[[_PT`````````$`````P)``"PGOO_#0`````````0````(`D``*R> +M^_\.`````````!`````T"0``J)[[_PX`````````$````$@)``"DGOO_#@`` +M```````0````7`D``*">^_\.`````````!````!P"0``G)[[_PX````````` +M$````(0)``"8GOO_#@`````````0````F`D``)2>^_\.`````````!````"L +M"0``D)[[_QL`````````$````,`)``" +M^_\,`````````!P```#H"0``E)[[_U$`````10X0A@)##09Z"@P'"$8+$``` +M``@*``#4GOO_5@`````````0````'`H``""?^_]V`````````!`````P"@`` +MC)_[_[.!(T%1HP&@P<#10$*#`<(1`L`.````$@'```X +MJOO_!0$```0S:@``10X0A@)##09&CP..!(T%18P&2(,'=`H,!PA!"P*1"@P' +M"$<+````,``````,```,J_O_D@````!%#A"&`D,-!D>.`XT$C`6#!EL*#`<( +M1@L"3@H,!PA""P```"P````T#```>*O[_YD`````10X0A@)##09'C@.-!(P% +M@P9;"@P'"$8+`F@,!P@``"P```!D#```Z*O[_V4`````10X0A@)##09'C@.- +M!(P%@P9;"@P'"$8+=`P'"````"P```"4#```**S[_V<`````10X0A@)##09' +MC@.-!(P%@P9;"@P'"$8+=@P'"````"P```#$#```:*S[_V<`````10X0A@)# +M#09'C@.-!(P%@P9;"@P'"$8+=@P'"````"P```#T#```J*S[_V<`````10X0 +MA@)##09'C@.-!(P%@P9;"@P'"$8+=@P'"````"0````D#0``Z*S[_S(````` +M10X0A@)##09%@P-2"@P'"$$+40P'"``D````3`T```"M^_\R`````$4.$(8" +M0PT&18,#4@H,!PA!"U$,!P@`)````'0-```8K?O_,@````!%#A"&`D,-!D6# +M`U(*#`<(00M1#`<(`"0```"<#0``,*W[_S8`````10X0A@)##09%@P-2"@P' +M"$$+50P'"``L````2`D``$BM^_^4````!#=H``!%#A"&`D,-!D.,`X,$5PH, +M!PA&"P)K#`<(```L````>`D``+BM^_^F````!`MH``!%#A"&`D,-!DF-`XP$ +M@P5="@P'"$(+`G4,!P@L````J`D``#BN^_^G````!-]G``!%#A"&`D,-!DF- +M`XP$@P5="@P'"$(+`G8,!P@L````V`D``+BN^_^F````!+-G``!%#A"&`D,- +M!DF-`XP$@P5="@P'"$(+`G4,!P@L````"`H``#BO^_^G````!(=G``!%#A"& +M`D,-!DF-`XP$@P5="@P'"$(+`G8,!P@D````M`X``+BO^_\R`````$4.$(8" +M0PT&18,#4@H,!PA!"U$,!P@`)````-P.``#0K_O_-@````!%#A"&`D,-!D6# +M`U(*#`<(00M5#`<(`!P````$#P``Z*_[_X,`````10X0A@)(#08"=0P'"``` +M'````"0/``!8L/O_.`````!%#A"&`D@-!FH,!P@````<````1`\``'BP^_\Q +M`````$4.$(8"2`T&8PP'"````!P```!D#P``F+#[_S$`````10X0A@)(#09C +M#`<(````'````(0/``"XL/O_,0````!%#A"&`D@-!F,,!P@````<````I`\` +M`-BP^_\Q`````$4.$(8"2`T&8PP'"````!P```#$#P``^+#[_S$`````10X0 +MA@)(#09C#`<(````'````.0/```8L?O_1@````!%#A"&`D@-!G@,!P@````< +M````!!```$BQ^_]&`````$4.$(8"2`T&>`P'"````!P````D$```>+'[_V<` +M````10X0A@)(#08"60P'"```'````$00``#(L?O_30````!%#A"&`D@-!G\, +M!P@````H````9!```/BQ^_]<`````$$.$(8"0PT&0H\#2HX$C06,!D2#!P)' +M#`<(`"@```"0$```+++[_UD`````00X0A@)##09$C@.-!$6,!46#!@)&#`<( +M````)````+P0``!@LOO_>`````!!#A"&`D,-!D2-`XP$1(,%:PH,!PA)"R@` +M``#D$```N++[_W(,````10X0A@)##090CP..!(T%C`:#!P+P"@P'"$$+'``` +M`!`1``#\1OO_$@````!%#A"&`D<-!D&#`T0,!P@D````,!$``.R^^_^-```` +M`$4.$(8"0PT&0XP#@P1["@P'"$H+````+````%@1``!4O_O_IP8```!%#A"& +M`D,-!D*/`TR.!(T%C`9$@P<#O@(*#`<(2`L`*````(@1``#4Q?O_0@,```!% +M#A"&`D,-!DF/`XX$C06,!H,'`MT*#`<(0@LL````M!$``/C(^__-`0```$4. +M$(8"0PT&0H\#18X$18T%18P&5(,'`O$*#`<(0@LL````Y!$``)C*^_^R`0`` +M`$4.$(8"0PT&1(\#C@1/C06,!H,'`S8!"@P'"$<+```L````%!(``"C,^_]5 +M`0```$4.$(8"0PT&1XP#@P0"8`H,!PA!"W@*#`<(2`L````L````R`T``%C- +M^_\M`@``!,MC``!%#A"&`D,-!DV/`XX$C06,!H,'80H,!PA*"P`L````^`T` +M`%C/^_\Y`@``!*EC``!%#A"&`D,-!DV/`XX$C06,!H,'80H,!PA*"P`L```` +M*`X``&C1^_\Y`@``!(=C``!%#A"&`D,-!DV/`XX$C06,!H,'80H,!PA*"P`< +M````U!(``'C3^__#!````$4.$(8"50T&`Z@$#`<(`#0```#T$@``*-C[_SX% +M````00X0A@)##09$CP..!$R-!8P&@P<#/P0*#`<(10L"I`H,!PA%"P``+``` +M`"P3```PW?O_40D```!%#A"&`D,-!E"/`XX$C06,!H,'`S`#"@P'"$@+```` +M$````%P3``!@YOO_$``````````L````;H<(``!L;#`<(D`$``#`````D +M````)`7\_]H````$,5\``$4.$(8"0PT&1H\#C@2-!4:,!H,'`I@*#`<(00L` +M```@````6````,+X^O\:````!`M?```,!A"#!X8"C`:-!8X$CP,P````?``` +M`*P%_/^#`0``!.]>``!!#A"&`DL-!D*/`TZ.!(T%C`:#!P*_"@P'"$4+```` +M(````+````"$^/K_-0````3/7@``#`80@P>&`HP&C06.!(\#+````+@7``#D +M!OS_PP````!%#A"&`D,-!D:/`XX$C05%C`9$@P<"<@H,!PA'"P``*````.@7 +M``"$!_S_>0````!%#A"&`D,-!D>.`XT$C`6#!G<*#`<(2@L````L````%!@` +M`-@'_/^9`````$4.$(8"0PT&1H\#C@2-!46,!D2#!P)J"@P'"$<+```<```` +M1!@```KX^O\A``````P&$(,'A@*,!HT%C@2/`R@```!D&```*`C\_XX````` +M10X0A@)##09(CP..!(T%C`9$@P=\"@P'"$@+,````)`8``","/S_L0````!/ +M#A"&`D4-!D*/`T>.!(T%1HP&@P<"@@P'"$O#QLS-SL\``"@```#$&```&`G\ +M_UP`````10X0A@)%#09#C`.#!%D*#`<(2@MK#`<(````,````/`8``!,"?S_ +M@@$```!.#A"&`D,-!D*-`T6,!$B#!0*?"@P'"$$+`KP,!PC#QLS-`"@```!` +M`@``J`K\_Z0````$1UT``$4.$(8"0PT&0XP#@P0">PH,!PA!"P``'````&P" +M```?]_K_-P````0M70``#`80@P2&`HP#```X````C`(```P+_/\C!```!!5= +M``!%#A"&`D8-!D2/`XX$3(T%C`:#!P*,"@P'"$D+`L4*#`<(2PL````@```` +MR`(``/KV^O]^````!`!=```,!A"#!X8"C`:-!8X$CP,8````T!D``%3W^O\I +M`````$4.$(8"2`T&````$````.P9``#`#OS_80`````````8`````!H``$[W +M^O\)`````$$.$(8"0PT&````(````*`5````#_S_)P````2<7```10X0A@)# +M#09!@P-=#`<($````$`:```,#_S_E``````````H````V!4``)@/_/_G```` +M!&A<``!%#A"&`D8-!D.,`X,$`L,*#`<(00L``#@```"`&@``7!#\_T0"```` +M10X0A@)##09+C@.-!(P%@P8#>P$*#`<(0@MF"@P'"$H+`GH*#`<(10L``!P` +M``"\&@``F_;Z_QD`````#`80@P:&`HP%C02.`P``*````/@#``!0$OS_5P`` +M``3D6P``10X0A@)##09"C`-$@P1\"@P'"$$+```<````)`0``&CV^O\5```` +M!,1;```,!A"#!(8"C`,``"@````H&P``9!+\_V +M_/]"`P``!/99``!%#A"&`D,-!DV/`XX$C06,!H,'`I`*#`<(2PL#[`$*#`<( +M3`L````@````W`8``!/U^O^`````!.=9```,!A"#!X8"C`:-!8X$CP,@```` +MY!T``+@A_/]0`````$4.$(8"0PT&08,#=0H,!PA""P`T````)`<``.0A_/_X +M`@``!*M9``!%#A"&`D,-!DB/`XX$C06,!D2#!P+5"@P'"$<+9@H,!PA*"R`` +M``!&`HP&C06.!(\#&````!0?``#P]/K_*0`` +M``!%#A"&`D@-!@```"0````P'P``+"O\_WH!````10X0A@)(#09"C`-+@P0" +M3PH,!PA'"P`@````6!\``(0L_/\J`````$4.$(8"0PT&3PH,!PA,"T8,!P@< +M````?!\``++T^O\M`````$4.$(8"0PT&08,#8PP'""`````@&P``<"S\_QT` +M```$BU@``$4.$(8"40T&1@P'"````!P```#`'P``;"S\_W```````D$.$(8" +M0PT&:PP'"```,````/P(``"\+/S_%04```1+6```10X0A@)##09"CP--C@2- +M!8P&@P<#9P(*#`<(0@L``"`````P"0``1_3Z__\````$B5@```P&$(,'A@*, +M!HT%C@2/`Q`````X(```A#'\_S@`````````(````$P@``"P,?S_6@````!% +M#A"&`D,-!D&#`V\*#`<(2`L`&````'`@``#J]/K_+0````!%#A"&`D@-!@`` +M`"`````0'```_/3Z_QD````$&5@``$T.$(8"1@T&1`P'"$'&`"P```"P(``` +MK#'\_T0"````10X0A@)##09"CP-)C@1,C06,!H,'`KT*#`<(1`L``#````#@ +M(```S#/\_\\`````10X0A@) "C0-%C`1$@P4"2`H,!PA*"P)2"@P'"$8+ +M```0````%"$``&@T_/\*`````````!`````H(0``9#3\_PH`````````$``` +M`#PA``!@-/S_"@`````````0````4"$``%PT_/\*`````````!````!D(0`` +M6#3\_R8`````````$````'@A``!T-/S_)@`````````0````C"$``)`T_/\1 +M`````````!````"@(0``G#3\_Q$`````````$````+0A``"H-/S_#@`````` +M```0````R"$``*0T_/\.`````````!````#<(0``H#3\_PH`````````$``` +M`/`A``"<-/S_"@`````````0````!"(``)@T_/\+`````````!`````8(@`` +ME#3\_PL`````````$````"PB``"0-/S_9`$````````0````0"(``.PU_/\- +M`````````!````!4(@``Z#7\_PT`````````$````&@B``#D-?S_#0`````` +M```0````?"(``.`U_/\-`````````!````"0(@``W#7\_PX`````````$``` +M`*0B``#8-?S_#@`````````0````N"(``-0U_/\.`````````!````#,(@`` +MT#7\_PX`````````$````.`B``#,-?S_#@`````````0````]"(``,@U_/\* +M`````````!`````((P``Q#7\_PH`````````$````!PC``#`-?S_"@`````` +M```0````,",``+PU_/\*`````````!````!$(P``N#7\_PT`````````$``` +M`%@C``"T-?S_#0`````````0````;",``+`U_/\.`````````!````"`(P`` +MK#7\_PX`````````$````)0C``"H-?S_)`$````````0````J",``,0V_/\S +M`0```````!````"\(P``\#?\_S0!````````$````-`C```<.?S_-`$````` +M```0````Y",``$@Z_/\.`````````!````#X(P``1#K\_PX`````````$``` +M``PD``!`.OS_#@`````````0````("0``#PZ_/\.`````````!`````T)``` +M.#K\_Q``````````$````$@D```T.OS_$``````````0````7"0``#`Z_/\6 +M`````````!````!P)```/#K\_Q8`````````$````(0D``!(.OS__``````` +M```0````F"0``#0[_/\;`0```````!````"L)```0#S\__P`````````$``` +M`,`D```L/?S_#@`````````0````U"0``"@]_/\4`````````!````#H)``` +M-#W\_PX`````````$````/PD```P/?S_O@`````````0````$"4``-P]_/^^ +M`````````!`````D)0``B#[\_PX`````````$````#@E``"$/OS_#@`````` +M```<````3"4``(`^_/\H`````$4.$(8"0PT&18,#6@P'"!P```!L)0``D#[\ +M_S``````10X0A@)##09%@P-B#`<($````(PE``"@/OS_,0$````````0```` +MH"4``,P__/\0`````````!````"T)0``R#_\_Q$`````````$````,@E``#4 +M/_S_-0`````````L````8"$```!`_/]1````!,]2``!-#A"&`D,-!D&#`U\* +M#`<(2`M)#`<(3\/&```L````D"$``#!`_/]6````!*-2``!2#A"&`D,-!D&# +M`V@*#`<(00M1#`<(P\8````L````P"$``&!`_/]6````!'=2``!2#A"&`D,- +M!D&#`V@*#`<(00M1#`<(P\8````0````;"8``)!`_/\.`````````!````"` +M)@``C$#\_PX`````````$````)0F``"(0/S_#@`````````0````J"8``(1` +M_/\.`````````!````"\)@``@$#\_PX`````````$````-`F``!\0/S_#@`` +M```````0````Y"8``'A`_/\.`````````!````#X)@``=$#\_PX````````` +M$`````PG``!P0/S_#@`````````0````("<``&Q`_/\.`````````!`````T +M)P``:$#\_PX`````````$````$@G``!D0/S_#@`````````D````7"<``&!` +M_/_?`````$4.$(8"0PT&0XP#@P0"8@H,!PA#"P``-````(0G```80?S_JP`` +M``!%#A"&`D8-!D&#`P)A"@P'"$,+40H,!PA/"TH*#`<(1@M*#`<(```@```` +MO"<``)!!_/_``````$4.$(8"0PT&18,#>0H,!PA*"P`0````X"<``"Q"_/^T +M`0```````!````#T)P``V$/\_PT`````````$`````@H``#40_S_#0`````` +M```0````'"@``-!#_/\-`````````!`````P*```S$/\_PT`````````$``` +M`$0H``#(0_S_#@`````````0````6"@``,1#_/\.`````````!````!L*``` +MP$/\_PX`````````$````(`H``"\0_S_#@`````````0````E"@``+A#_/\. +M`````````!````"H*```M$/\_T8`````````$````+PH``#P0_S_#@`````` +M```0````T"@``.Q#_/][`````````!````#D*```6$3\_PX`````````$``` +M`/@H``!41/S_5@`````````0````#"D``*!$_/\.`````````"@```"D)``` +MG$3\_ST#```$ET\``$4.$(8"2`T&0HP#1(,$`E(*#`<(2PL`$````$PI``"P +M1_S_#0`````````0````8"D``*Q'_/\-`````````!````!T*0``J$?\_PT` +M````````$````(@I``"D1_S_#0`````````0````G"D``*!'_/\-```````` +M`!````"P*0``G$?\_PT`````````$````,0I``"81_S_#0`````````0```` +MV"D``)1'_/\-`````````!````#L*0``D$?\_PT`````````$``````J``", +M1_S_#0`````````0````%"H``(A'_/\-`````````!`````H*@``A$?\_PH` +M````````$````#PJ``"`1_S_"@`````````0````4"H``'Q'_/\*```````` +M`!````!D*@``>$?\_PH`````````,````'@J``!T1_S_FP````!!#A"&`D,- +M!D>.`XT$C`6#!F(*#`<(0PL"8@H,!PA!"P```"0````P)@``X$?\_T$````$ +M#TX``$4.$(8"0PT&0HP#1(,$<@P'"``D````6"8```A(_/\[````!.M-``!% +M#A"&`D,-!D*,`T2#!&P,!P@`(````(`F```@2/S_-0````3'30``10X0A@)# +M#09!@P-K#`<((````*0F```\2/S_+P````2G30``10X0A@)##09!@P-E#`<( +M)````$0K``!(2/S_3P$```!!#A"&`D,-!D>,`X,$`LP*#`<(00L``!````!L +M*P``<$G\_RT`````````$````(`K``",2?S_,0`````````0````E"L``+A) +M_/]``````````!````"H*P``Y$G\_T$`````````)````$`G```@2OS_00`` +M``0/30``10X0A@)##09"C`-$@P1R#`<(`"0```!H)P``2$K\_SL````$ZTP` +M`$4.$(8"0PT&0HP#1(,$;`P'"``@````D"<``&!*_/\U````!,=,``!%#A"& +M`D,-!D&#`VL,!P@@````M"<``'Q*_/\O````!*=,``!%#A"&`D,-!D&#`V4, +M!P@0````5"P``(A*_/\1`````````!````!H+```E$K\_PX`````````$``` +M`'PL``"02OS_$0`````````0````D"P``)Q*_/\.`````````!````"D+``` +MF$K\_Q$`````````$````+@L``"D2OS_#@`````````0````S"P``*!*_/\1 +M`````````!````#@+```K$K\_PX`````````$````/0L``"H2OS_>P`````` +M```0````""T``!1+_/\.`````````"0````<+0``$$O\_XL`````10X0A@)# +M#09'C`.#!`)L"@P'"$4+```0````1"T``'A+_/][`````````!````!8+0`` +MY$O\_PX`````````(````&PM``#@2_S_M@````!%#A"&`D,-!D6#`P)U"@P' +M"$8+$````)`M``!\3/S_BP`````````0````I"T``/A,_/\.`````````!`` +M``"X+0``]$S\_\L`````````$````,PM``"P3?S_#@`````````0````X"T` +M`*Q-_/^^`````````!````#T+0``6$[\_[X`````````$`````@N```$3_S_ +M#@`````````0````'"X```!/_/\.`````````"P```"T*0``_$[\_U0!```$ +MJTH``$4.$(8"0PT&0XP#@P17"@P'"$8+`RL!#`<(`#````#D*0``+%#\_U4! +M```$?TH``$4.$(8"0PT&28T#C`2#!5T*#`<(0@L#)`$,!P@````P````&"H` +M`%A1_/]4`0``!$]*``!%#A"&`D,-!DF-`XP$@P5="@P'"$(+`R,!#`<(```` +M,````$PJ``"$4OS_6`$```0?2@``10X0A@)##09)C0.,!(,%70H,!PA""P,G +M`0P'"````#````"`*@``L%/\_UH!```$[TD``$4.$(8"0PT&28T#C`2#!5T* +M#`<(0@L#*0$,!P@````P````M"H``-Q4_/]>`0``!+])``!%#A"&`D,-!DF- +M`XP$@P5="@P'"$(+`RT!#`<(````,````.@J```(5OS_8`$```2/20``10X0 +MA@)##09)C0.,!(,%70H,!PA""P,O`0P'"````#`````<*P``-%?\_V$!```$ +M7TD``$4.$(8"0PT&28T#C`2#!5T*#`<(0@L#,`$,!P@````P````4"L``'!8 +M_/]@`0``!"])``!%#A"&`D,-!DF-`XP$@P5="@P'"$(+`R\!#`<(````,``` +M`(0K``"<6?S_9`$```3_2```10X0A@)##09)C0.,!(,%70H,!PA""P,S`0P' +M"````#````"X*P``V%K\_V8!```$ST@``$4.$(8"0PT&28T#C`2#!5T*#`<( +M0@L#-0$,!P@````P````["L``!1<_/]G`0``!)](``!%#A"&`D,-!DF-`XP$ +M@P5="@P'"$(+`S8!#`<(````)````)PP``!07?S_,@````!%#A"&`D,-!D6# +M`U(*#`<(00M1#`<(`"0```#$,```:%W\_S(`````10X0A@)##09%@P-2"@P' +M"$$+40P'"``H````<"P``(!=_/_\`@``!!](``!%#A"&`D,-!DF-`XP$@P4" +ME0H,!PA*"Q`````8,0``5&#\_PT`````````+````+`L``!08/S_60````3C +M1P``10X0A@)##09#C`.#!%<*#`<(1@MP#`<(````+````.`L``"`8/S_:``` +M``2W1P``10X0A@)##09#C`.#!%<*#`<(1@M_#`<(````)````(PQ``#`8/S_ +M,@````!%#A"&`D,-!D6#`U(*#`<(00M1#`<(`"P````X+0``V&#\_SD"```$ +M8T<``$4.$(8"0PT&38\#C@2-!8P&@P=A"@P'"$H+`"P```!H+0``Z&+\_SD" +M```$04<``$4.$(8"0PT&38\#C@2-!8P&@P=A"@P'"$H+`"P```"8+0``^&3\ +M_SD"```$'T<``$4.$(8"0PT&38\#C@2-!8P&@P=A"@P'"$H+`"P```#(+0`` +M"&?\_SD"```$_48``$4.$(8"0PT&38\#C@2-!8P&@P=A"@P'"$H+`#````#X +M+0``&&G\_W@4```$VT8``$4.$(8"1@T&4H\#C@2-!4:,!H,'`P$%"@P'"$$+ +M```<````J#(``&1]_/^M`````$4.$(8"2`T&`I\,!P@``!P```#(,@``]'W\ +M_Y@`````10X0A@)(#08"B@P'"```)````.@R``!T?OS_:@````!%#A"&`D,- +M!DF-`XP$@P4"6`P'"````"0````0,P``O'[\_V@`````10X0A@)##09)C0., +M!(,%`E8,!P@````D````.#,```1__/]H`````$4.$(8"0PT&28T#C`2#!0)6 +M#`<(````)````&`S``!,?_S_:`````!%#A"&`D,-!DF-`XP$@P4"5@P'"``` +M`"0```"(,P``E'_\_V@`````10X0A@)##09)C0.,!(,%`E8,!P@````@```` +ML#,``-Q__/]8`````$4.$(8"0PT&0XP#@P0"3`P'"``@````U#,``!B`_/]9 +M`````$4.$(8"0PT&0XP#@P0"30P'"``@````^#,``%2`_/]9`````$4.$(8" +M0PT&0XP#@P0"30P'"``@````'#0``)"`_/]9`````$4.$(8"0PT&0XP#@P0" +M30P'"``0````0#0``,R`_/\-`````````!P```!4-```R(#\_RL`````10X0 +MA@)##09!@P-=#`<($````'0T``#8@/S_#0`````````<````B#0``-2`_/\K +M`````$4.$(8"0PT&08,#70P'"#0```"H-```Y(#\_\L`````10X0A@)*#09% +MC0.,!(,%>`H,!PA$"P)+"@P'"$4+6PH,!PA%"P``$````.`T``!\@?S_#0`` +M```````H````]#0``'B!_/]L`0```$4.$(8"0PT&28T#C`2#!0,3`0H,!PA$ +M"P```!`````@-0``O(+\_PT`````````$````#0U``"X@OS_0``````````0 +M````2#4``.2"_/\*`````````#````!<-0``X(+\__D`````10X0A@)##09$ +MCP..!$6-!46,!D2#!P+&"@P'"$@+4`P'"``0````D#4``*R#_/\-```````` +M`"@```"D-0``J(/\_W\`````10X0A@)##09"C0-'C`1$@P5\"@P'"$<+```` +M(````-`U``#\@_S_/P(```!%#A"&`D@-!@/W`0H,!PA$"P``,````'@Q```8 +MAOS_.`$```1E0P``10X0A@)*#09"C0-*C`2#!0+T"@P'"$D+2@H,!PA&"RP` +M``"L,0``)(?\_S@!```$-4,``$4.$(8"2@T&0HT#2HP$@P4#`0$*#`<(3`L` +M`#0```#<,0``-(C\_U@!```$"4,``$4.$(8"0PT&1XX#C02,!8,&6PH,!PA& +M"P,2`0H,!PA&"P``+````!0R``!&`HP&C06.!(\#+````#0S``#,COS_U0`` +M``3700``10X0A@)##09"C0-%C`1$@P5A"@P'"$0+````'````&0S``#-!8P&2(,'`F$*#`<(00L`.````)`W``!PH?S_I@````09/@``10X0 +MA@)##09"CP-%C@1%C05*C`:#!P)2"@P'"$@+9@H,!PA!"P``*````$@\``#D +MH?S_0@````!%#A"&`D8-!DH*#`<(2PM/"@P'"$P+1@P'"``0````=#P```BB +M_/\)`````````"P```"(/```!*+\_[,`````10X0A@)##09"C0-*C`2#!0*+ +M"@P'"$D+2@P'"````"`````\.```Q-GZ_QD````$<3T``$T.$(8"1@T&1`P' +M"$'&`!````#.!(T%1HP&@P<"U@H,!PA#"P``$````(@^``"TJOS_#0`````` +M```H````G#X``+"J_/^D`````$4.$(8"0PT&2XX#C02,!8,&`GD*#`<(1`L` +M`"0```#(/@``-*O\_TD`````10X0A@)##09"C`-$@P1H"@P'"$H+```L```` +M\#X``%RK_/_Y`P```$4.$(8"0PT&38\#C@2-!8P&@P<#8`,*#`<(2PL````P +M````I#H``"RO_/_O!```!&0[``!%#A"&`D,-!D*/`T6.!$B-!8P&@P<#;P$* +M#`<(2@L`+````%0_``#HL_S_0P0```!%#A"&`D,-!D2/`XX$3(T%C`:#!P-9 +M`PH,!PA!"P``+`````@[```(N/S_KP,```0$.P``10X0A@)##09$C0.,!$2# +M!0+U"@P'"$L+````'````#@[``!RU_K_&0````38.@``#`80@P6&`HP$C0,4 +M````U#\``&B[_/\-```````````````0````[#\``)"[_/\-`````````!`` +M````0```C+O\_SX`````````$````!1```"XN_S_/@`````````0````*$`` +M`.2[_/\3`````````!`````\0```\+O\_UX`````````$````%!````\O/S_ +M%``````````<````9$```$B\_/\N`````$4.$(8"0PT&18,#8`P'"!````"$ +M0```6+S\_Q@`````````$````)A```!DO/S_&``````````0````K$```'"\ +M_/\9`````````!````#`0```?+S\_QD`````````*````-1```"(O/S_#`$` +M``!%#A"&`D8-!D*/`T6.!$R-!8P&@P<"[0P'"``0`````$$``&R]_/],```` +M`````!`````400``J+W\_WL`````````$````"A!```4OOS_#@`````````0 +M````/$$``!"^_/\3`````````!````!000``'+[\_U8`````````$````&1! +M``!HOOS_#@`````````0````>$$``&2^_/][`````````!````",00``T+[\ +M_PX`````````$````*!!``#,OOS_O@`````````0````M$$``'B__/^^```` +M`````!````#(00``),#\_PX`````````$````-Q!```@P/S_#@`````````0 +M````\$$``!S`_/^+`````````!`````$0@``F,#\_PX`````````)````!A" +M``"4P/S_9@````!!#A"&`D,-!D*,`T2#!`)""@P'"$P+`!````!`0@``W,#\ +M_P\`````````$````%1"``#8P/S_#0`````````0````:$(``-3`_/\*```` +M`````!````!\0@``T,#\_PT`````````$````)!"``#,P/S_%``````````0 +M````I$(``-C`_/\4`````````!````"X0@``Y,#\_Q,`````````$````,Q" +M``#PP/S_$P`````````0````X$(``/S`_/]O`````````!````#T0@``6,'\ +M_V\`````````$`````A#``"TP?S_N@`````````H````H#X``&#"_/^0```` +M!'PH,!PA*"P``)````%A$```4Q_S_)@$` +M``!%#A"&`D,-!D.,`X,$`H(*#`<(0PL``"@```"<+0``',C\_Y(````$)S8` +M`$4.$(8"2`T&0XX#@P0"=0H,!PA!"P``'````,@M``"4TOK_%0````0(-@`` +M#`80@P2&`HX#```H````S$0``'#(_/_N`@```$4.$(8"1PT&1HX#C02,!42# +M!@,X`@H,!PA""R@```!\0```-,O\_Z@````$Q#4``$4.$(8"0PT&18T#C`2# +M!7X*#`<(10L`'````*A````RTOK_!0````2<-0``#`80@P6&`HP$C0,L```` +MR$```)C+_/]C````!(`U``!%#A"&`D,-!D.,`X,$5PH,!PA&"WH,!P@````L +M````=$4``-C+_/_:`````$4.$(8"0PT&0H\#2HX$C06,!H,'`L`*#`<(00L` +M```L````*$$``(C,_/\?`P``!"0U``!%#A"&`DH-!DN.`XT$C`6#!@,&`@H, +M!PA("P`<````U$4``'C/_/\G`````$4.$(8"0PT&08,#60P'""P```#T10`` +MB,_\_\D!````10X0A@);#09$C@.-!$:,!8,&`X@!"@P'"$X+2`P'"!`````D +M1@``*-'\_PT`````````'````#A&```DT?S_)P````!%#A"&`D,-!D&#`UD, +M!P@<````6$8``#31_/\K`````$4.$(8"0PT&08,#70P'"!@```!X1@``1-'\ +M_],``````J\.$(8"2`T&```0````E$8```C2_/\-`````````#P```"H1@`` +M!-+\_W8!````4PX0A@)##09"CP-)C@2-!8P&2(,'`F8*#`<(00M0"@P'"$@+ +M`LL,!PC#QLS-SL\0````Z$8``$33_/\-`````````"0```"`0@``0-/\_W<` +M```$TS,``$4.$(8"0PT&08,#`F$*#`<(00L8````J$(``#C0^O\4````!+LS +M```,!A"#`X8",````,1"``!\T_S_?@,```2K,P``10X0A@)##09-CP..!(T% +MC`:#!P.^`@H,!PA%"P```"````#X0@``_,_Z_S0````$GS,```P&$(,'A@*, +M!HT%C@2/`RP````<0P``I-;\_\D!```$BS,``$$.$(8"0PT&28\#C@2-!8P& +M@P<"GPH,!PA$"R````!,0P``W,_Z_R0````$93,```P&$(,'A@*,!HT%C@2/ +M`R````#L1P``(-C\_WX`````00X0A@)##09!@P,">`P'"````#````"40P`` +M?-C\_^P!```$)3,``$4.$(8"0PT&1H\#C@2-!4:,!H,'`MD*#`<(0PL```!$ +M````1$@``#C:_/_Y`````%L.$(8"0PT&38\#C@2-!8P&@P<"8@P'"$/#QLS- +MSL](#`80@P>&`HP&C06.!(\#`F`,!P@````P````C$@``/#:_/\-`0```$4. +M$(8"10T&1(T#C`1(@P4"8PH,!PA'"P)0"@P'"$@+````)````,!(```(S_K_ +M9P````!%#A"&`D,-!D&#`P)5"@P'"$4+0PP'""0```#H2```2,_Z_R\````` +M10X0A@)##09!@P-="@P'"$4+0PP'"``H````$$D``'S;_/_6`0```$4.$(8" +M0PT&08,#`\(!"@P'"$4+10P'"````"P```#`1```,-W\_XD````$_3$``$4. +M$(8"0PT&0XP#@P17"@P'"$8+`F`,!P@``"P```#P1```D-W\_Y\````$T3$` +M`$4.$(8"0PT&28T#C`2#!5T*#`<(0@L";@P'""`````@10``Q,[Z_QD````$ +MI3$``$T.$(8"1@T&1`P'"$'&`#0```!$10``W-W\_[@!```$A3$``$4.$(8" +M0PT&28T#C`2#!6\*#`<(2`L#5@$*#`<(2@M/#`<($````/A)``!DW_S_7``` +M```````8````#$H``&W.^O\C`````$4.$(8"2`T&````&````"A*``!TSOK_ +M(P````!%#A"&`D@-!@```"P```!$2@``>-_\_P,!````10X0A@)##09#C`.# +M!`*L"@P'"$D+4PH,!PA%"P```!@```!T2@``3,[Z_P4`````#`80@P2&`HP# +M```P````%$8``#S@_/]Q!0``!+DP``!%#A"&`D,-!DB/`XX$C06,!D2#!P*_ +M"@P'"$4+````(````$A&```"SOK_,@````2),```#`80@P>&`HP&C06.!(\# +M)````.A*``!DY?S_:0````!%#A"&`D,-!D2-`XP$1(,%`E@,!P@``!@````0 +M2P``Z,WZ_P4`````#`80@P6&`HP$C0,H````+$L``)#E_/^@`0```$4.$(8" +M10T&1HX#C02,!42#!@-Z`0H,!PA""QP```!82P``ILWZ_PH`````#`80@P:& +M`HP%C02.`P``*````'A+``#DYOS_H`$```!%#A"&`D4-!D:.`XT$C`5$@P8# +M>@$*#`<(0@L<````I$L``&3-^O\*``````P&$(,&A@*,!8T$C@,``#````!( +M1P``..C\_XH#```$C2\``$$.$(8"0PT&2(\#C@2-!8P&1(,'`\T""@P'"$,+ +M```@````?$<``!K-^O\*````!&$O```,!A"#!X8"C`:-!8X$CP,D````H$<` +M`'#K_/\I````!$PH,!PA("P`@````1$D``##0^O])````!/LN```,!A"#!X8"C`:-!8X$CP,0 +M````Y$T``'@,_?\-`````````"P```#X30``=`S]_WX$````10X0A@)'#09( +MCP..!(T%C`9$@P<#N`,*#`<(2`L``!P````H3@``$M#Z_P4`````#`80@P>& +M`HP&C06.!(\#$````$A.``"D$/W_#0`````````L````7$X``*`0_?\J!``` +M`$4.$(8"0PT&1H\#C@2-!46,!DB#!P-J`@H,!PA+"P`<````C$X``+3/^O\* +M``````P&$(,'A@*,!HT%C@2/`Q````"L3@``@!3]_PT`````````,````$1* +M``!\%/W_8!````0/+@``10X0A@) &CP..!(T%1HP&@P<#4`@*#`<(20L` +M`"````!X2@``5L_Z_U,````$]BT```P&$(,'A@*,!HT%C@2/`Q`````83P`` +MA"3]_PT`````````,````+!*``"`)/W_:@X```3++0``10X0A@)##09$CP.. +M!$6-!4V,!H,'`P$#"@P'"$$+`"````#D2@``/L_Z_PD#```$(RX```P&$(,' +MA@*,!HT%C@2/`S@````(2P``F#+]_^H$```$'RX``$4.$(8"0PT&28T#C`2# +M!6\*#`<(2`L#'P0*#`<(20L"3PH,!PA!"RP```!$2P``3#?]_V,````$YRT` +M`$4.$(8"0PT&0XP#@P17"@P'"$8+>@P'"````#P```!T2P``C#?]_VX*```$ +MNRT``$4.$(8"0PT&1H\#C@2-!46,!DN#!P,B`0H,!PA("P.1`RY0`P\"+@`` +M```@````M$L``'C1^O\R!@``!+\M```,!A"#!X8"C`:-!8X$CP,0````5%`` +M`*A!_?]&`````````!````!H4```Y$']_PX`````````$````'Q0``#@0?W_ +M)`$````````0````D%```/Q"_?\T`0```````!````"D4```*$3]_S,!```` +M````$````+A0``!41?W_-`$````````0````S%```(!&_?\T`0```````!`` +M``#@4```K$?]_PX`````````$````/10``"H1_W_#@`````````0````"%$` +M`*1'_?\.`````````!`````<40``H$?]_PX`````````$````#!1``"<1_W_ +M#@`````````0````1%$``)A'_?_I`````````!````!840``=$C]__@````` +M````$````&Q1``!@2?W_^0`````````0````@%$``$Q*_?_Y`````````!`` +M``"440``.$O]_PX`````````$````*A1```T2_W_#@`````````0````O%$` +M`#!+_?\.`````````!````#040``+$O]_PX`````````(````.11```H2_W_ +MT0````!%#A"&`D,-!@*\"@P'"$0+````$`````A2``#D2_W_$0`````````0 +M````'%(``/!+_?\1`````````!`````P4@``_$O]_P<"````````$````$12 +M``#X3?W_5@`````````X````W$T``$1._?_O````!+_?^V```` +M!,\H``!%#A"&`D,-!DF-`XP$@P4">PH,!PA$"TX*#`<(0@M-"@P'"$(+```H +M````)%$``#Q?_?]'````!)R@```P&$(8"```H````;%$``$1?_?]'````!&LH +M``!J#A"&`D8-!D0,!PA$QD,,!A"&`@```!@```"840``VM'Z_Q0````$3R@` +M``P&$(8"```D````,%8``$Q?_?_[`````$$.$(8"0PT&0HP#2(,$`ID*#`<( +M20L`(````-Q1```D8/W_&0````07*```10X0A@)+#09(#`<(````(`````!2 +M```@8/W_&0````3W)P``10X0A@)+#09(#`<(````+````*!6``!BT?K_80`` +M``!%#A"&`D,-!D2-`XP$18,%`D,*#`<(10M'#`<(````$````-!6``#L7_W_ +M5@`````````H````Y%8``(#1^O]R`````$4.$(8"0PT&18T#C`2#!0)8"@P' +M"$4+1PP'""@```"44@``#&#]_[`!```$9R<``$4.$(8"0PT&18T#C`2#!0*O +M"@P'"$0+'````,!2``":T?K_'P````17)P``#`80@P6&`HP$C0,0````7%<` +M`'!A_?\-`````````"P```",0```;&']_[@````$,R<``$4.$(8"0PT&1(T# +MC`1%@P4"B0H,!PA!"P```!P```"\0```5='Z_U0````$%2<```P&$(,%A@*, +M!(T#*````$13``#<8?W_#`,```3_)@``10X0A@)##09'C`.#!`):"@P'"$<+ +M```<````<%,``%[1^O]P````!.\F```,!A"#!(8"C`,``!`````,6```H&3] +M_PT`````````)````"!8``":T?K_,`````!%#A"&`D,-!D&#`UX*#`<(10M# +M#`<(`#````!D00``=&3]_P\!```$JR8``$4.$(8"0PT&0H\#28X$18T%2(P& +M28,'`KP*#`<(00L@````F$$``&[1^O]^````!)0F```,!A"#!X8"C`:-!8X$ +MCP,P````H%@``"QE_?]N`````$\.$(8"0PT&0HP#1(,$;PK#1R,``$4.$(8" +M6`T&28\#C@2-!8P&@P<#D`$*#`<(00L````@````P%<``&30^O\>`@``!'LC +M```,!A"#!X8"C`:-!8X$CP,L````Y%<``,R(_?^Z!```!&`C``!%#A"&`E\- +M!E.-`XP$@P4#N`(*#`<(20L````<````D%P``%R-_?\G`````$4.$(8"0PT& +M18,#60P'"#````#,10``;(W]_]8````$%",``$$.$(8"0PT&1H\#C@2-!4:, +M!D>#!P*A"@P'"$$+```@`````$8``-K1^O\X````!/&`HP&C06.!(\#+````%1@ +M``"8I?W_5@$```!%#A"&`D,-!D2/`XX$18T%2HP&@P<"O0H,!PA("P``,``` +M``A<``#(IOW_:R0```2?(```10X0A@)##09$CP..!$B-!8P&@P<#6`$*#`<( +M1`L``"`````\7```E-#Z_YL"```$PR$```P&$(,'A@*,!HT%C@2/`S````!@ +M7```X,K]_\H#```$OR$``$4.$(8"0PT&38\#C@2-!8P&@P<#70$*#`<(1@L` +M```0````$&$``'S._?\-`````````!`````D80``F,[]_RL!````````$``` +M`#AA``"TS_W__``````````0````3&$``*#0_?\;`0```````!````!@80`` +MK-']_QP!````````$````'1A``"XTOW_%``````````0````B&$``,32_?\4 +M`````````!````"<80``T-+]_Q0`````````$````+!A``#"@P'"$4+0PP'"``D`````&(``#S3_?\O`````$$.$(8"0PT&08,# +M80H,!PA%"T,,!P@`'````"AB``!$T_W_'`````!%#A"&`DX-!D@,!P@````< +M````2&(``$33_?\<`````$4.$(8"3@T&2`P'"````#````!H8@``1-/]_^0( +M````00X0A@)##09-CP..!(T%C`:#!P._"`H,!PA%"TX,!P@````P````G&(` +M``#<_?]0`@```$$.$(8"0PT&38\#C@2-!8P&@P<#*P(*#`<(10M.#`<(```` +M+````-!B```P````!!#A"&`D,-!D*-`TJ,!(,%`EX*#`<(10M'#`<( +M````&`````!C``!LWOW_)P````!:#A"&`D@-!@```"````"@7@``@-[]_R,` +M```$@Q\``$$.$(8"6PT&1@P'"````#````#$7@``C-[]_]L!```$8Q\``$$. +M$(8"0PT&1(\#C@1%C05(C`9,@P<"Z0H,!PA&"P`@````^%X``*#0^O\J```` +M!$0?```,!A"#!X8"C`:-!8X$CP,P````'%\``!3@_?\]!P``!"@?``!!#A"& +M`D,-!D*/`TR.!(T%28P&28,'`J@*#`<(1`L`(````%!?``!RT/K_+0````0. +M'P``#`80@P>&`HP&C06.!(\#(````'1?``![T/K_&P````3R'@``30X0A@)& +M#09&#`<(0<8`+````)A?``!RT/K_4`````32'@``00X0A@)##09"C`-$@P1\ +M"@P'"$4+1`P'"```*````,A?``"HYOW_I0````2F'@``00X0A@)##09"C0-* +MC`1)@P4"BPP'"``D````<&0``"SG_?^"`````$$.$(8"0PT&0HP#1(,$`EP* +M#`<(2@L`*````+1-``"4Y_W_00````1:'@``00X0A@)+#09#C@.#!&4*#`<( +M00L````<````X$T``!+0^O\6````!#H>```,!A"#!(8"C@,``#````!H8``` +MF.?]_PT!```$(AX``$4.$(8"0PT&1(\#C@1'C06,!DB#!P*8"@P'"$4+```@ +M````G&```-3/^O\%````!/<=```,!A"#!X8"C`:-!8X$CP,P````P&```%#H +M_?_E`P``!-L=``!%#A"&`D,-!D:/`XX$C05)C`9$@P<"<`H,!PA%"P``+``` +M`/1@```,[/W_9P````2K'0``10X0A@)##09#C`.#!%X*#`<(1PME"@P'"$L+ +M+````"1A``!,[/W_9P````1_'0``10X0A@)##09#C`.#!%X*#`<(1PMF"@P' +M"$H+,````%1A``",[/W_R`0```13'0``10X0A@)##09$CP..!$6-!46,!D2# +M!P/X`@H,!PA&"R````"(80``[L[Z_Q8````$*1T```P&$(,'A@*,!HT%C@2/ +M`RP```"L80``!/']_P"@P' +M"$0+`"````"08@``_,WZ_S(````$6AP```P&$(,&A@*,!8T$C@,``!`````P +M9P``_/;]_PT`````````'````$1G``#X]OW_,P````!2#A"&`DP-!D@,!PA* +MQ@`L````Z&(``!CW_?__`P``!`H<``!%#A"&`D,-!E"/`XX$C06,!H,'`J@* +M#`<(2`L@````&&,``*;-^O\M````!/0;```,!A"#!X8"C`:-!8X$CP,L```` +M/&,``,3Z_?]5````!-L;``!%#A"&`D,-!D*-`T6,!$B#!7$*#`<(00L````< +M````;&,``(#-^O\?````!+\;```,!A"#!88"C`2-`RP```",8P``U/K]_U4` +M```$KQL``$4.$(8"0PT&0HT#18P$2(,%<0H,!PA!"P```!P```"\8P``3\WZ +M_Q\````$DQL```P&$(,%A@*,!(T#*````-QC``#D^OW_M@````2#&P``10X0 +MA@)%#09!@P,"E@H,!PA/"T4,!P@<````A&@``'C[_?\Y`````$4.$(8"2@T& +M08,#9`P'"!P```"D:```F/O]_T8`````10X0A@)*#09!@P-Q#`<((````,1H +M``#(^_W_N@````!%#A"&`EP-!D&#`P*3#`<(````(````.AH``!D_/W_QP`` +M``!%#A"&`EP-!D&#`P*@#`<(````(`````QI```0_?W_N0````!%#A"&`EP- +M!D&#`P*2#`<(````(````#!I``"L_?W_QP````!%#A"&`F@-!D*,`T6#!`*. +M#`<(*````%1I``!8_OW_[0````!%#A"&`D,-!D.,`X,$70H,!PA("P*\#`<( +M```H````@&D``!S__?\``0```$4.$(8"0PT&28T#C`2#!6,*#`<(1`L"QPP' +M""@```"L:0``\/_]__\`````10X0A@)##09)C0.,!(,%8PH,!PA$"P+&#`<( +M,````%QE``#$`/[_80@```0'&@``10X0A@)##09-CP..!(T%C`:#!P.B`@H, +M!PA)"P```#````"090````G^_YD%```$YQD``$4.$(8"0PT&1H\#C@2-!46, +M!D2#!P--`0H,!PA$"P`L````Q&4``&P._O]W````!+<9``!%#A"&`D,-!D*- +M`TF,!$2#!7P*#`<(10L````L````]&4``+P._O]W````!(L9``!%#A"&`D,- +M!D*-`TF,!$2#!0)2"@P'"$<+```P````H&H```P/_O^-`````%L.$(8"0PT& +M=PP'"$O&4`P&$(8"4`P'",9&#`80A@)&#`<(,````%AF``!H#_[_TQ,```0K +M&0``10X0A@)/#09)CP..!(T%C`:#!P/0"@H,!PA!"P```"````",9@``GLKZ +M_\$!```$BQD```P&$(,'A@*,!HT%C@2/`R0````L:P``\"+^_YD``````E8. +M$(8"0PT&0XP#@P1U#`<(1\/&S``H````V&8``&@C_O\+`@``!&L9``!%#A"& +M`D,-!D*,`T2#!`.A`0H,!PA!"QP````$9P``Z,OZ_X4````$;1D```P&$(,$ +MA@*,`P``+````"1G```L)?[_/P(```15&0``00X0A@)##09$C0.,!$F#!0*" +M"@P'"$$+````'````%1G```=S/K_.`````0^&0``#`80@P6&`HP$C0,X```` +M=&<``!PG_O\B"```!"89``!!#A"&`D,-!D2/`XX$18T%2HP&2X,'`QP""@P' +M"$H+9`H,!PA$"P`@````L&<``/G+^O]7````!"@9```,!A"#!X8"C`:-!8X$ +MCP,P````;%4``.PN_O_+````!`P9``!!#A"&`D,-!D*/`T6.!$N-!8P&2X,' +M`F$*#`<(1@L`(````*!5``#XR_K_)`````3B&```#`80@P>&`HP&C06.!(\# +M-````"QH``!D+_[_!P$```3&&```00X0A@)##09$C@.-!$6,!42#!@*F"@P' +M"$D+<0H,!PA%"P`@````9&@``,#+^O\J````!*`8```,!A"#!H8"C`6-!(X# +M```H````!&T``!@P_O^^`````$$.$(8"0PT&0HP#1(,$`D(*#`<(1`L":0P' +M"#````"T:```K##^_T(/```$6!@``$4.$(8"0PT&1(\#C@1(C06,!H,'`U\) +M"@P'"$4+```@````Z&@``&;+^O_M````!)L8```,!A"#!X8"C`:-!8X$CP,0 +M````B&T``*0__O\-`````````#@````@:0``H#_^_R$K```$;Q@``$$.$(8" +M0PT&0H\#28X$3XT%C`:#!P-X#0H,!PA!"P/X$2XP>BX``"````!<:0``W\OZ +M_Q,(```$+QH```P&$(,'A@*,!HT%C@2/`S0```"`:0``8.KZ_[H$```$0H,!PA' +M"P/C`0P'",/&S,W.ST<,!A"#!X8"C`:-!8X$CP,`*````(AN``"T;?[_H@`` +M``!!#A"&`D,-!D2.`XT$18P%2H,&`G$*#`<(2`M4````.&H``#AN_O]I`@`` +M!#<:``!*#A"&`DH-!DV/`XX$C06,!H,'9`H,!PA+"P,X`<-"S$+-0LY"ST'& +M#`<(5PP&$(,'A@*,!HT%C@2/`U`*#`<(00L`5````)!J``!00(```3M +M&0``2@X0A@)*#09-CP..!(T%C`:#!V0*#`<(2PL#2`'#0LQ"S4+.0L]!Q@P' +M"%<,!A"#!X8"C`:-!8X$CP-0"@P'"$$+`"0```!D;P``>'+^_\@`````10X0 +MA@)##09&C@.-!(P%2(,&`K$,!P@<````C&\``#[2^O\*``````P&$(,&A@*, +M!8T$C@,``"P```"L;P```'/^_TX$````10X0A@)##09$CP..!$F-!8P&@P<# +M1`(*#`<(1PL``"@```#X6```('?^_PD!```$*QD``$4.$(8"0PT&0HP#1(,$ +M`LT*#`<(10L`'````"19``#,T?K_-P````03&0``#`80@P2&`HP#```@```` +MK&L``.31^O\6````!/L8``!*#A"&`D8-!D0,!PA!Q@`@````T&L``-;1^O\6 +M````!-L8``!*#A"&`D8-!D0,!PA!Q@`@````<'```)QW_O__`````$4.$(8" +M0PT&18,#`F8*#`<(00L0````E'```'AX_O\?`````````"````"H<```A'C^ +M_X@`````10X0A@)##08"4`H,!PA("P```!````#,<```\'C^_W$````````` +M)````.!P``!<>?[_J`````!%#A"&`D,-!D*.`TB-!(P%@P8"E0P'""`````( +M<0``Y'G^_T$`````10X0A@)##09"C`-$@P1R#`<(`"@````L<0``$'K^_W(` +M````10X0A@)##09$C@.-!$6,!42#!@),"@P'"$<++````%AQ``!D>O[_QP`` +M``!%#A"&`D,-!D*/`TZ.!(T%C`:#!P)S"@P'"$4+````*````(AQ```$>_[_ +MCP````!%#A"&`D,-!D*/`T6.!$6-!4:,!H,'`G0,!P@D````M'$``&A[_O]O +M`````$4.$(8"0PT&0HT#18P$1(,%`EL,!P@`(````-QQ``"P>_[_GP````!/ +M#A"&`D@-!@*""@P'"$$+````*`````!R```L?/[_AP````!%#A"&`D,-!D*- +M`TB,!$J#!0)<"@P'"$@+```L````+'(``/#J^O_F$````$4.$(8"10T&1(X# +MC01,C`5/@P8#(!`*#`<(00L````P````>%L``&!\_O^T&@``!,\6``!%#A"& +M`D,-!DF/`XX$C06,!H,'`S@""@P'"$$+````(````*Q;``"HS_K_TP,```3U +M%@``#`80@P>&`HP&C06.!(\#,````#AN``#(EO[_ORL```3Z%@``10X0A@)# +M#090CP..!(T%C`:#!P/&"PH,!PA""P```"````!L;@``)-/Z_^$%```$\A<` +M``P&$(,'A@*,!HT%C@2/`S`````H7```,,+^_Z8!```$51@``$4.$(8"0PT& +M1H\#C@2-!4:,!H,'`T$!"@P'"$L+```@````7%P``*W8^O\:````!#48```, +M!A"#!X8"C`:-!8X$CP,L````9',``(C#_O\$`0```$4.$(8"2PT&1(\#C@1& +MC05%C`9/@P<">0H,!PA)"P`<````E',``'/8^O\9``````P&$(,'A@*,!HT% +MC@2/`S@```#07```2,3^_QP#```$R1<``$4.$(8"0PT&0H\#28X$C06,!DB# +M!P)+"@P'"$H+`Z\!"@P'"$$+`"`````,70``,-CZ_UD````$G!<```P&$(,' +MA@*,!HT%C@2/`S````"8;P``",?^_\X;```$A!<``$$.$(8"0PT&1(\#C@1% +MC05&C`:#!P,&%`H,!PA'"P`@````S&\``#'8^O^$`@``!"D8```,!A"#!X8" +MC`:-!8X$CP,T````\&\``(#B_O_Z````!"@8``!.#A"&`DH-!D&#`V,*#`<( +M00L"K\-!Q@P'"$8,!A"#`X8"`"P```#`70``2./^_XT````$]!<``$4.$(8" +M0PT&1(T#C`1%@P4":@H,!PA!"P```!P```#P70``*MKZ_RH````$T1<```P& +M$(,%A@*,!(T#-````'AP```TVOK_F0````2Y%P``3@X0A@)*#09#C`.#!`)F +M"L-*S$'&#`<(10M&#`<(0```-XOK_ +M,P````0N&0``#`80@P>&`HP&C06.!(\#`````/__`0#__P$`__\!`/__`0#_ +M_P$`__\!`/__`0#__P$`__\!`/__`0#__P$`__\!`/__`0#__P$`__\!"K\" +M`P``T`,S``#__P$*SP(#``#@`R\``/__`0K/`@,``.`#+P``__\!"E4H``"& +M`07.`0#__P$$`!H``/__`1!?-P``[0$DZP(`F@(%]P(`__\!!``U``#__P$. +M)@4``#<%F`$`606,`0#__P$$+04``/__`2.\`04``,8#4/8'`*\$!8L(`/X$ +M!9<(`,$&-?8'`(\'!?\'`/__`0@/2#H`>04``/__`0#__P$`__\!"!T%```^ +M!4L`__\!!!`%``#__P$4-04``%(%]`$`<@7H`0#<`07H`0#__P$$+@4``/__ +M`10Q!0``6`64`@!R,(@"`/P!!8@"`/__`00N!0``__\!%"8%``!#!?0!`'4% +MZ`$`W`$%Z`$`__\!!"X%``#__P$4)@4``$@%]`$`>@7H`0#<`07H`0#__P$$ +M+@4``/__`1HG!0``.@7O`P!1!=<#`+$!!?L#`+4#!>,#`/__`00S!0``__\! +M*;@!!0``G`(%J@8`W@(TH08`G0,%B08`X0,%E08`H00QH08`W`0%M@8`__\! +M""T%``!5&3@`__\!$>D![`$``.0#!>P%`,X$!0``__\!!``:``#__P$2P`$E +MFP4`[P$%CP4`]@(%@P4`__\!!!HW``#__P$M-`4``%0%@PD`Z@$%]P@`H@(% +MFPD`P@0%ZP@`A`4%IPD`U04%CPD`T@<0@PD`__\!!#$%``#__P$`__\!;BX8 +M``!B!>4)`(L!!?$)`/\!!>4)`+0"$*D)`,L"!9$)`(T#!:D)`)@#!=D)`+(# +M!:D)`+T#!D#`/__`00`&@``_YL-`059!4!`*8& +M`[0&`^8&`P$``'T`````````_YL-`0`!``!]`````````/__`0;``1*]`P#_ +M_P$$&@4``/__`0#__P$`__\!`/__`0#__P$`__\!`/__`0#__P$$?F@``/__ +M`00`"@````#_FPT!!!(%'0$!````````_YL-`004!0```0```````/^;D`$! +M>-8-B0*Z.0/S$06O.@>'%(,#ESH'M1CY!K@Z!ZDA(<$Z![\C,+@Z!ZTD+:`Z +M!_PD9Y;@Z!^`H]0'!.@>4+@7J.0?-+P7;.0?1,"G(.0>H,12(.@?D +M,07(.0?',@7Y.0>>,X8!R#D'W#0%N#H'Q#6=`IDY!P$``'T#?0)]``"870`` +MG%T```````#_FX`!`6H3!?("![\"!,""A@'K`,%SP,'P`,%\@('\0,E +MSP,'L`0VD@8'_@0%X`<'E@49\@('C08%JP8'Y08%D@8'^08%\@('IP<%D@8' +M@@@%]@,#E@@%_0@'KP@%SP,'WP@%K`<'^`@%X`<'`0``?0-]`GT470``&%T` +M``````#_FQT!$6<%@@4!O@$%^00#SP)F^00#`0``?0```````/^;$0$$#P44 +M`P$``'T`````````__\!%]X":0``U@7L`P``G0H[U"``\PW(!P``__\!"`\% +M``!)!0```/^;B`$!?J,!!=4<`[$&`M4<`YX'!;$<`_X'!,;`X\-!>$<`[<-!:4<`\8-!>\;`XP.+>$<`\X/,Y`< +M`^40!>$<`]02!;T<`^<2!9D<`^$4,X<<`^$6!8<<`_T8!>$<`XX9!;T<`]`9 +M!>$<`P$``'T`````_YL=`1*N`4"X`0/]`06"`@/+!07P!0,!``!]``````#_ +M_P$`__\!`/^;00$VY0(%OA0#IP,%LA0#XP0%UA0#F`<%XA0#TP@%IA0!V0D% +MRA0!Z`TKRA0!B1(NRA0!RA,XXA0#`0``?0``````_YL=`1`T!<\%`T`%EP@# +MLP47SP4#`0``?0````````#__P$`__\!`/__`0#__P$`__\!`/__`0#__P$` +M__\!`/__`0#__P$`_YL-`00P`SL!`0```````/^;"0$``0```````/^;#0$$ +M,`,[`0$```````#_FPD!``$```````#__P$`__\!`/^;&0$,S@$"F`,#\`$# +MI`,!`0``?0````````#_FPT!``$``'T`````````__\!#B\7``!C!:P!`&X% +MH`$`__\!!"`J`````/^;&0$,]`0%@P8#EP4%]P4#`0``?0````````#_FQ4! +M"`\%%`-=!6<#`0``?0````````#__P$9/!L``%T%@P(`=A<``*H!!?L!`/__`00@3P``__\!"C4%``!)W@'!`@#__P$(#QDH`$D%``#__P$3NP(% +MUPT`T@2]`,-`/__`1#X`04``)$"&<@"`+X"!0$`__\!"B$%``", +M!@6=!P#__P$$,04``/__`0#__P$`__\!`/__`0#__P$PCP$%MP,`FP$%\P,` +MJ@$%YP,`S`$%VP,`C@(%SP,`F@(%BP0`X@(%_P,`HP,%PP,`__\!!9`7#$`&-`06N$`.U`06B$`/)`07;$`.$`@6B$`.\`@7/$`/A +M`@6Z$`/L`@7_$`.5`V+S$`.$!3ZZ$`/T!06+$0.""#*Z$`.]"`7G$`/S"`6Z +M$`/`"@+#$`'S"VNZ$`.C#07S$`/X#Q67$0,!``!]`````/^;%0$)#P5>`YT! +M7EX#`0``?0```````/__`1>,`04``*D!!=D'`-D"F`,``(D&!>4'`/__`00@ +M*@``__\!%I,#!0``LP0%F08`_P0%``#I!26E!@#__P$$#T,``````/^;U`(! +MQP)+Q@/32`&`!3OV1P.0$`7V1P.5$07'2`/R$0711@/E$@751P/S$@7)1P.K +M%`751P./%@7=1@.Y%@6!1P.,%P6E1P.7&06!1P/$&06]1P/L'`7'2`.('07V +M1P./'@6!1P/U'P751P.-(!J!1P/S(`6-1P.@(@751P/6(@6!1P.%(P6M1@.# +M)-T!WT@#R"8%]D<#J2<^X4<#]"<%F4<#YR@W]48#JRD%Z48#K2H%U4<#UBP^ +MWT@#HBXA]D<#NB\%O4<#]R\%CD@#_C`%@D@#J#$%L4<#ZS(%WT@#CC,%]D<# +MFC21`;U'`_,U'*%&`\DV!;U'`^(WF0'?2`/-.D681@.Z.P6Y1@/Y/`6A1@.( +M/1>F2`.E/06:2`/%/12F2`.R/@6R2`/G/@7J1P/^/@7%1@.B/P7J1P/A/P6^ +M2`/61`6]1P/B10681@,!``!]````````_YL=`1`:!1\#[@,%\P,#R`0%[`$# +M`0``?0````````#__P$`__\!`/__`1%5!0``IP$%SP,`F`*I`<\#`/__`00@ +M!0``__\!%F@%``#@`04``(($Z0:Q#@#3#4VQ#@#__P$$(P4``/__`0#__P$` +M__\!!&P%``#__P$((@4``"L%-0#__P$$$04``/__`07D`04``/__`00`!0`` +M__\!`/__`0#__P$`__\!!J\#*;P)`/__`0#__P$`__\!#A\%``"U`04``.8! +M-0``__\!!8L!!0``__\!$M\"!;P'`.L"!;`'`+D#!;P'`/__`00H!0``__\! +M%JL#!0``_0-X\P<`B08%``"T!P7S!P#__P$$(P4``````/^;$0$$+05)`P$` +M`'T`````````_YL-`0`!``!]`````````/^;$0$$+05)`P$``'T````````` +M_YL-`0`!``!]`````````/__`0#__P$0G@-[``"_!)T+``"*$$T``/__`0#_ +M_P$`__\!`/^;D`$!AP%5V@$``+0"!=LF`*$#!>\/!:\G`-$0!?,F`*42&(LG`,\4,0``M!D%TB8`K!SC`0`` +ME!X%QR<`_QX%NR<`AR$"``"$(A&+)P#C(@6Z)@""(P6N)@"V(P6B)@#"(P66 +M)@#*)`6Z)@#6)`7&)@`!``````#_FRD!($P%``!L'HH!`.T!!0``MP(%QP(` +M[0(%G`,`EP,%A`(``0```````/__`2J%`06W`P"3`07_`P"A`07S`P"N`@7G +M`P#"`@7;`P"#`P7/`P"7`P7#`P#__P$$;04``/__`14D!0``5@6G!`#%`@6G +M!`"K`Q"S!`#__P$$+@4``/__`3HR!0``N@(%_@\`_`,%EA``@`4%S@\`H@4% +MBA``X@4%\@\`K`8%V@\`R`D%Y@\`M@H%V@\`U0H%Y@\`__\!!$0%``#__P$& +ME`$%OP$`__\!!!H%``#__P$.6P4``'P%^P$`\0$%``#__P$$(`4``/__`7-, +M!0``^`$%``"(`Q<``/@#1K8>`.P%!0``W@<%``#%"3\``),*!9(>`-@*/``` +MA`P%AAX`EPX%``"\$`4``/H0!0``J1$%``#1$3$``(D2!9X>`*D3!;8>`,03 +M?```ZQ0%``"\&P6J'@"_'04``.@=!0``__\!!2BV`0``````_YOX`P'L`X$! +M!0``VP$5Z5(`C@(%``"K`P7@4@"]`P744@"%!`7^4@#%!`7@4@"Y!07^4@#Z +M!06L40"0!@6@40"-"/D!]5(!CPH%E%$!\0Q.RU(`W0U;GU,`WPX%EE,`Z@X% +MBE,`AP\%EE,`AA!UL5,`@Q,%J%,`H19;Y5$`A1<%OU(`[A@%]5(!UAD%``"3 +M'`7)4P#D'07)4P#C'AOU4@'('P7U4@';'],!J%,`Z2$]^E$`LR(%[E$`_R,% +MY5$`B"<%V5$`I2<%S5$`VB<%V5$`\R<%P5$`HR@%V5$`N"D%N%$`_"DG@%8` +MORH%]%4`[RH%Z%4`H"L%W%4`D"PPE58`_"P%TU4`BBT%QU4`FRT%NU4`_"T% +ME58`I2X%B58`TRZ9`=-5`.4R/X!6`,HS!:]5`*`Y!;A1`/4Y!9Y5`)8Z!9)5 +M`*(Z!895`*XZ!?I4`+HZ!>)4`,DZ!>Y4`-4Z!=94`/XZ!I3`,D_!>%3 +M`+A#+;-2`.Y#!:=2`/Q#!9M2`,-'/:A3`(U(!8]2`+%(!8-2`(=)!:A3`-A+ +M!>%3`)A-!`P'X`061!`#[`P4``-P%!>$%`*`&!;T' +M`/<'!?4$`/L(!8`)`-,)!;L)`/()!0``U@H%X`H`FPL%FPH`XPX%H@\`DP\% +MJP0`O0\%AQ```0``````````_YMY`3J!`07O`1.J`@4``-L"!:<#`),#!?@# +M`/,#!0``G`4%_P4`L0<%VP<`O@<%IP,`\P@%I0D`_P@%K@D`"@`)?0A]!WT& +M?05]!'T#?0)]`7T``````"Q1```840``#%$``/!0``#T4```^%```-10``#8 +M4```!%$``/__`0K/`@,``)`$+P``__\!"M\"`P``H`0O``#__P$05P4``(P! +M!?T!`*X!!?$!`/__`00M!0``__\!`/__`0#__P%64=,&``#6!X0"ES4`^@H% +MCC4`IA#*!0``RA>W`HXU`,(;!:@U`.<;!8(U`*(@E<`E0D%PE4`]0D%^58`M`SY!*%7`/@2'[95`(L5!:%7`*48 +M!;97`/X8J0>A5P#;(;`"V%8`A2:R`Z%7`.,K`M=5`+DL`K16`)(M`OA5`)DN +M`L!6`+4O!16`)A&!:%7`-Q(!`)`-L)!9`(`/T)!:X$`)4*!=@+`-,*!<(+`.<*!:X$`/L*!8\+ +M`*<+!;8+`/__`1"M`3,``.\!!9H#`*P"!0``__\!!``:``#__P$+9A8``*0" +MN`.3!@#__P$(#QDH`$\%``#__P'4`;T!!?HV`)0"!>XV`,8"!>4V`/H"!=`V +M`(0#!9(W`)(%!<(W`,H&!=PV`/<&!>HU`)4(!=(U`,$(!=XU`/$(!9XW`+X) +M!9DU`-0)!:HW`+\+/8(V`(D,!;8W`,0,@0F"-@#.%06X-@"B%CF"-@#/&`7& +M-0#I&@6L-@#A'.X!ES8`YQ\%I34`WB$%@C8`@2)'H#8`L",%Q#8`ER4%@C8` +M[R40AC<`NR8%L34`X"@%ES8`@RL%O34`]2\%BS8`]3$"L34`_S$?@C8`US(% +M]C4`T#02ES8`__\!'RL%90!#!><#`&`%J`0`B0(%``"M`P7,`P#U!`7,`P#_ +M_P$`__\!"3(%```]!8$!`/__`00@!0``__\!`/__`8<$CP(%D6P`J@(%A6P` +MCP0%]6D`A04%D6P`GP8%]6D`O08%O6L`SP8%R6L`LPD%E6D`M@L%H6D`F`P% +MK6D`Z`P%N6D`D0T%@6H`RPX%C6H`U`\HW6D`D!$%L6L`L!$%F6L`KQ(%I6L` +MOQ,%S6H`VA,%YVH`LA<"SVT`C!D%UFP`M1D%XFP`WAD%@6L`PQH%C6L`[!H% +MH&@`LAL%K&@`VQL%N&@`BAP%Q&@`KB(%T&@`L2/3`O1H`(TF!?QG`(TI!>EI +M`+8I!;5J`-\I!<%J`,0J!=QH`.TJ!>AH`+,K!?UH`-PK!8EI`(TL*:YM`(\M +M!8IM`*TOZ03=:0"T-"+Y:P"I-@7=:0#$.`6A:0#<.`7#;0"@.0+=:0"?.P75 +M:P#2.P7A:P"J/C[%:0#W/@71:0#O0@6A:0"(0P6W;0#J0RZ4:`"\13**;0#5 +M1P7%:0"!2`66;0"E2`6B;0#M2#[S9P"T207N;`#@2@*A:0#_2@+=:0#02RNN +M;0"43`+Z;`"H3BOT:`"(4@6R;`"B4T6N;0#P4P6(:`#/5$J%;`#Q506*;0"Y +M5@6R;`#@5@6F;`"'5RZR;`#)5P7*;`"?6`6R;`"\6"*^;`#>606:;`"T6K0! +MLFP`_%L%SV<`U5P%BFT`X%P%PV<`[%Q(BFT`S%TBVV<`\6$%LFP`ZF0%^6L` +M^V0%[6L`HF4%YV<`__\!'>@!!0``M`,%O`D`Z04%_@L`G0P%IPP`B@T%A`@` +M__\!#(<"!<8"`)D"!;H"`/__`00I!0````0````0`````0```$=.50`````` +M`P````(`````````!````&````!^&O[*1D1/`'LB='EP92(Z(F1E8B(L(F]S +M(CHB=6)U;G1U(BPB;F%M92(Z(F=L:6)C(BPB=F5RFEP +M(BPB=F5R@$``````!#M`0``````T/______ +M__^(5P8``````/`]`0``````8#X!``````!0>`$``````##M`0`````````` +M```````P6`8``````,`X`0``````,#H!``````#P5`$``````%`Z`0`````` +MD#H!``````#@.P$``````/C_________,%@&``````!P.0$``````$`Z`0`` +M````,%4!````````/`$`````````````````T%@&``````"0-`$``````%`V +M`0``````D%$!```````PZP$``````,`V`0``````8#%P&```````@#@(``````*`.`@`` +M`````"@"``````"P#@(`````````````````R%P&``````!``P(``````,`# +M`@``````X&L"``````!0!@``````T`<"``````#@_0$``````/`;`@``````P$\"``````#(____ +M_____V!>!@``````P`<"``````#0_0$``````)`:`@``````\"<"``````#` +M_________V!>!@``````L`<"``````#`_0$``````#`9`@``````0`@"```` +M``!@"`(``````+C_________8%X&``````"@!P(``````+#]`0``````T!<" +M``````"`#0(``````+#_________8%X&``````"0!P(``````*#]`0`````` +M%P%``````"!7`4``````(=!0``````95T%``````!R704``````'M=!0``````BUT%``````!% +M7P4``````)M=!0``````IET%``````"Z704``````,9=!0``````RUT%```` +M```Y7`4``````-E=!0``````Y%T%``````#O704``````/Q=!0```````EX% +M```````-7@4``````!9>!0``````(EX%```````S7@4``````#=>!0`````` +M/UX%``````!$7@4``````$I>!0``````4EX%```````=6P4``````!U;!0`` +M````75X%``````!F7@4``````'A>!0``````;EX%``````"`7@4``````)=> +M!0``````I%X%``````"P7@4``````,1>!0``````T5X%``````#97@4````` +M`.=>!0``````\5X%``````!@904```````5?!0``````4EH%```````;7P4` +M`````-1=!0``````+E\%```````X7P4``````#Y?!0``````2%\%``````!2 +M7P4``````%M?!0``````95\%``````!Q7P4``````'A?!0``````B5\%```` +M``"17P4``````)I?!0``````IU\%``````"T7P4``````+Y?!0``````F$4& +M``````!P1@8``````$!(!@``````X&D&``````!X:08````````````````` +M```````````(0`T`!P8``(AP!@```````6`%```````!8`4````````````` +M`````0``````````90,````````````````````````````````````````` +M````````````````````````Z@``````````````^ED%``````#]7P4````` +M```````````````````````@HP(````````````````````````````````` +M````````````````````````````9@(``````````````````0?Q!@`````$ +M8`4```````$````!````````````````````````````````````4%`"```` +M``````````````$$`P``````"F`%```````!```````````````````````` +M`````````````````$!'`@`````````````````!`0,```````]@!0`````` +M`0````````````````````````````````````````"01@(````````````` +M````(0`````````48`4```````$````````````````````````````````` +M````````D%@!``````````````````,`````````&F`%```````!`````0`` +M`````````````````````````````````"!8`0``````(%@!```````````` +M`````"!@!0```````0````````````````````````````````````````#0 +M5P$`````````````````"P`````````E8`4```````$````!```````````` +M````````````````````````@%&8&```````"`````````*AC!@```````@@```````"06P8````` +M``(0````````F&,&```````"&````````````````````'`%```````````` +M`@```*!;!@```````@````````"06P8```````((``````````````````!` +M<`4````````````"````@%L&```````"`````````)!;!@```````@@````` +M`````````````'!P!0````````````(````H7`8```````(`````````D%L& +M```````""```````````````````D'`%`````````````````+!P!0`````` +M``````,```"`6P8```````(`````````P&0&```````""````````)!;!@`` +M`````I```````````````````-!P!0````````````````#H<`4````````` +M`````````'$%`````````````@```!AE!@```````O`````````H908````` +M``(````````````````````@<04``````(!;!@`````````````````P<04` +M`````(!;!@````````````````!@<04``````(!;!@````````````````"` +M<04``````(!;!@````````````````"@<04``````(!;!@`````````````` +M``#`<04```````$````&````T&4&```````"`````````+AE!@```````@@` +M``````"@908```````(0````````B&4&```````"&````````'!E!@`````` +M`B````````"06P8```````(H``````````````````#@<04``````(!;!@`` +M``````````````#X<04``````(!;!@`````````````````0<@4```````$` +M```#````>&8&```````"`````````&!F!@```````@@```````"06P8````` +M``(0``````````````````"`;04`````````````````P&T%``````#89@8` +M````````````````P&0&````````````````````````````P*,"```````` +M```````````````````````````````````````````````````````````` +M````````````````````````*&4&```````````````````````````````` +M`````````````````%!T!0```````0````,```!@708```````(````````` +M2%T&```````""````````)!;!@```````A```````````````````'!T!0`` +M``````````(````P6P8```````(`````````D%L&```````""``````````` +M````````B'0%`````````````@```(!;!@```````@````````"06P8````` +M``((``````````````````"@=`4````````````"````,%L&```````"```` +M`````)!;!@```````@@``````````````````*AC!@`````````````````` +M```````````````````````````````````````````````````````````` +M`````````````'AF!@`````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````(AE!@`` +M`````````````````````````````````````````````````````````/AA +M!@`````````````````````````````````````````````````````````` +M`!!B!@`````````````````````````````````````````````````````` +M````````````````(&(&```````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````'AX!0````````````````"(>`4`````````````````H'@% +M`````````````````,!X!0````````````````#@>`4``````#AJ!@`````` +M````````````>@4````````````"````H%L&```````"`````````)!;!@`` +M`````@@````````!``````````(%`````````0`````````1!0````````$` +M````````'P4````````,``````````"@````````#0`````````P2`4````` +M`!D`````````"#8&```````;`````````!``````````&@`````````8-@8` +M`````!P`````````"`````````#U_O]O`````+`#````````!0````````#X +M#0````````8`````````V`,````````*`````````-$%````````"P`````` +M```8`````````!4````````````````````#`````````,AL!@```````@`` +M``````!`"````````!0`````````!P`````````7`````````.B1```````` +M!P````````#(%0````````@`````````('P````````)`````````!@````` +M````'@`````````(`````````/O__V\``````0``"`````#^__]O`````*@4 +M````````____;P`````#`````````/#__V\`````RA,```````#Y__]O```` +M`(0$```````````````````````````````````````````````````````` +M``````````````````````````````````````````````````````````"X +M:@8````````````````````````````VH````````$:@````````5J`````` +M``!FH````````':@````````AJ````````"6H````````*:@````````MJ`` +M``````#&H````````-:@````````YJ````````#VH`````````:A```````` +M%J$````````FH0```````#:A````````1J$```````!6H0```````&:A```` +M````=J$```````"&H0```````):A````````IJ$```````"VH0```````,:A +M````````UJ$```````#FH0```````/:A````````!J(````````6H@`````` +M`":B````````-J(```````!&H@```````%:B````````9J(```````!VH@`` +M`````(:B````````EJ(```````"FH@```````+:B````````QJ(```````#6 +MH@```````.:B````````]J(````````&HP```````!:C````````)J,````` +M```VHP```````$:C````````5J,```````!FHP```````':C````````AJ,` +M``````"6HP```````*:C````````MJ,```````#&HP```````-:C```````` +MYJ,```````#VHP````````:D````````%J0````````FI````````#:D```` +M````1J0```````!6I````````&:D````````=J0```````"&I````````):D +M````````IJ0```````"VI````````,:D````````UJ0```````#FI``````` +M`/:D````````!J4````````6I0```````":E````````-J4```````!&I0`` +M`````%:E````````9J4```````!VI0```````(:E````````EJ4```````"F +MI0`````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````"'`&```````!```````````````````` +M````````````0@$``````-AF!@``````Z&8&``````!8:@8``````&AJ!@`` +M````*&H&```````X:@8``````$AJ!@`````````````````````````````` +M```````````````````X>KRO)QP``"]U#@V +M7S8T+6QI;G5X+6=N=2\W>FEP+F1E8G5G`*D+`T.DY+`LZI\=O3$;)XV=CAG^ +M9#-C8S@S83!B93!C-S)F-C$T83(Y.31C,#-D,C8X-6)A8S,R8V,N9&5B=6<` +M````<:Y#@``N6YS='(` +M+F=N=2YV97)S:6]N`"YG;G4N=F5R0`N9FEN:5]A0`N9&%T82YR96PN````!P````(````````` +M<`,```````!P`P```````"0````````````````````$```````````````` +M````,0````$````"`````````)0#````````E`,````````<```````````` +M`````````0```````````````````#D```#V__]O`@````````"P`P`````` +M`+`#````````)``````````%``````````@```````````````````!#```` +M"P````(`````````V`,```````#8`P```````"`*````````!@````$````( +M`````````!@`````````2P````,````"`````````/@-````````^`T````` +M``#1!0```````````````````0```````````````````%,```#___]O`@`` +M``````#*$P```````,H3````````V``````````%``````````(````````` +M`@````````!@````_O__;P(`````````J!0```````"H%````````"`!```` +M````!@````,````(````````````````````;P````0````"`````````,@5 +M````````R!4````````@?`````````4`````````"``````````8```````` +M`'D````$````0@````````#HD0```````.B1````````0`@````````%```` +M&P````@`````````&`````````"#`````0````8``````````*`````````` +MH````````!L````````````````````$````````````````````?@````$` +M```&`````````""@````````(*````````"0!0``````````````````$``` +M```````0`````````(D````!````!@````````"PI0```````+"E```````` +M"`````````````````````@`````````"`````````"2`````0````8````` +M````P*4```````#`I0```````/./!`````````````````!````````````` +M````````F`````$````&`````````,`U!0``````P#4%``````!O$@`````` +M````````````0````````````````````*D````!````!@`````````P2`4` +M`````#!(!0``````#0````````````````````0```````````````````"O +M`````0````(``````````%`%````````4`4``````#`K```````````````` +M``!`````````````````````MP````$````"`````````#![!0``````,'L% +M``````!,&P``````````````````!````````````````````,4````!```` +M`@````````"`E@4``````("6!0``````Y'4```````````````````@````` +M``````````````#/`````0````(`````````9`P&``````!D#`8``````!\9 +M```````````````````$````````````````````X0````<````"```````` +M`(0E!@``````A"4&```````@````````````````````!``````````````` +M`````.\````'`````@````````"D)08``````*0E!@``````W``````````` +M``````````0```````````````````#]````#@````,`````````"#8&```` +M```(-@8``````!`````````````````````(``````````@`````````"0$` +M``\````#`````````!@V!@``````&```````(```````````````````` +M"``````````(`````````!4!```!`````P`````````@-@8``````"`V!@`` +M````F#0``````````````````"`````````````````````B`0``!@````,` +M````````N&H&``````"X:@8``````!`"````````!@`````````(```````` +M`!``````````C0````$````#`````````,AL!@``````R&P&```````H`P`` +M````````````````"``````````(`````````"L!```!`````P`````````` +M<`8```````!P!@``````D````````````````````!`````````````````` +M```Q`0``"`````,`````````P'`&``````"0<`8``````,!6```````````` +M``````!`````````````````````-@$```$````````````````````````` +MD'`&``````!$`````````````````````0```````````````````$@!```! +M`````````````````````````-1P!@``````-`````````````````````0` +M```````````````````!`````P`````````````````````````(<08````` +M`%`!T +C`"X`=`!X`'0````9`!0*`0`C<8QTZ6_:`14&`0`@@+2!```` +` +end --- /dev/null +++ contrib/libarchive/libarchive/test/test_read_format_7zip_sfx_modified_pe.exe.uu @@ -0,0 +1,109 @@ +begin 664 test_read_format_7zip_sfx_modified_pe.exe +M35J0``,````$````__\``+@`````````0``````````````````````````` +M````````````````````@`````X?N@X`M`G-(;@!3,TA5&AI6#[!C'1"0,0````,=$)`@`($``QT0D!`P@ +M0`#'!"0`````H3`P0`#_T(/L$+@`````R<.0D/____\`````_____P`````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````$UEGH`7U]?4E5.5$E-15]04T551$]?4D5,3T-?3$E3 +M5%]?`%]?:&5A9%]L:6(S,E]L:6)U7-T96U?=F5R$%`,38`7U]F +M:6QE7V%L:6=N;65N=%]?`%]?;6%J;W)?;W-?=F5RF5?;V9?:&5A<%]R97-E7-T96U? +M=F5R'1?96YD7U\`-WJ\KR<< +M``272;_;!P````````!B``````````VH&AD!``(Q,C,``00&``$)!P`'"P$` +M`2$A`0`,`P`("@'28TB(```%`1D,````````````````$1L`=`!E`',`=``N +I`'0`>`!T`"X`=`!X`'0````9`!0*`0`C<8QTZ6_:`14&`0`@```````` +` +end --- /dev/null +++ contrib/libarchive/libarchive/test/test_read_format_7zip_sfx_pe.exe.uu @@ -0,0 +1,4751 @@ +begin 644 test_read_format_7zip_sfx_pe.exe +M35J0``,````$````__\``+@`````````0``````````````````````````` +M````````````````````"`$```X?N@X`M`G-(;@!3,TA5&AIS^___'A>S^__\4`0`` +M4/\5_,!"`(7`=`Z#O?S^__\"=05J`5C)PS/`R<.XY)9"`.A7<`(`@^P,B]&- +M3>CH=3L!`(L0@V7\`#/)Z.WA``#_=>CHO@\``%F+3?1DB0T`````R<.XBY=" +M`.@><`(`@>P,`0``4S/;5E/_%6#"0@"-38CHWA0``(U-H(E=_(A=\XA=\>C- +M%```C4VLQD7\`>C/?`$`QD7\`O\5^,!"`%"-3;CH\10``(U5K(U-N,9%_`/H +M&PT``/]UN,9%_`+H0P\``#E=L%EV"5.-3:SH7PD``#/V.5VP=GF+1:R+!+"+ +M4`2#^@%V98L`9H,X+75=9HM(`F:#^4%R"6:#^5IW`X/!(&:#^7EU#X/Z`L9% +M\P$/A8P```#K-6:#^6]U'8/`!(U-H%#H;!4``(U-H.CO/```.5VD#Y5%\>L2 +M9H/Y<'4,@\`$C4V(4.A)%0``1CMUL'*'BD7S5XU-E*+`,4,`Z/,3``"-393& +M1?P$Z-0G``"-C7S____HW!,``(M-E(V5?/___\9%_`7HKRL``(3`=26Z8,=" +M`#/)Z)'@``#I)`$``+I(QT(`,\GH@.```&H!6^GT`P``:ACH%@X``%F)1>@[ +MP\9%_`9T"XO(Z#<%``"+^.L",_\[^\9%_`6)O6S___]T!HL'5_]0!(O/QD7\ +M!^A=N@``.\-T#(O(Z!W^___ILP```&B@````Z,0-``!9B47H.\/&1?P(=`N+ +MR.@+!@``B_#K`C/V._/&1?P'B77L=`:+!E;_4`2+SL9%_`GH6/T``#E=C(U. +M6`^5P(A&(8U%B%#HH10``(V-'/___^CS!```C4WG&`@``.%WQ +MC46@=0.-1=Q0C8U,____Z!84``"*1?,SR3K#B(5F____#Y7!B8TH____C4W$ +MB9TD____B)UG____Z%=Z`0"-3=#&1?P,Z$MZ`0"-3<3&1?P-Z+\(``"-A7S_ +M__^-3<10Z"D)``"-3=#HJ`@``(V%?/___XU-T%#H$@D``(V-Z/[__^CS`@`` +MC8WH_O__QD7\#N@4`P``B%WRB5VXB5V\B5W`C8UP____QD7\#^CD>0$`.%WS +M4XU%\E90C95P____#Y3`4(V%'/___U"-A>C^__]0C4704(U%Q%"-1;A0B\_& +M1?P0Z+H^`0"-C7#___^)1>C&1?P/Z&$'``#_=;C&1?P.Z#`,``!9BTWH.\L/ +MA'W19C8WH_O__QD7\#>CH!0``C4W0QD7\#.@(NP$`C4W$ +MQD7\"^C\N@$`_W7C^___&1?P-Z(\%``"-3=#&1?P,Z*^Z`0"-3<3& +M1?P+Z*.Z`0#_==SHD@L``%G&1?P)C8T<____Z)$#``"+1>S&1?P'.\-T!HL( +M4/]1"#O[QD7\!0^$\@```(L'5_]0".GG````@?D$0`"`=66-C>C^___&1?P- +MZ"`%``"-3=#&1?P,Z$"Z`0"-3<3&1?P+Z#2Z`0#_==SH(PL``%G&1?P)C8T< +M____Z"(#``"+1>S&1?P'.\-T!HL(4/]1"#O[QD7\!70&BP=7_U`(N_\```#K +M>CA=\@^%N@```(/Y`0^%K````+H(QT(`,\GH]MP``(V-Z/[__\9%_`WHG00` +M`(U-T,9%_`SHO;D!`(U-Q,9%_`OHL;D!`/]UW.B@"@``6<9%_`F-C1S____H +MGP(``(U-[,9%_`?HD5(!`#O[QD7\!70&BP=7_U`(:@);_[5\____Z&@*``#_ +M=93H8`H``%E97XU-K,9%_`'H6KD!`/]UH.A)"@``_W6(Z$$*``!9B\-97HM- +M]%MDB0T`````RC^___&1?P-Z.L#``"- +M3=#&1?P,Z`NY`0"-3<3&1?P+Z/^X`0#_==SH[@D``%G&1?P)C8T<____Z.T! +M``"-3>S&1?P'Z-]1`0`[^\9%_`5T!HL'5_]0"&H(Z4G___]6B_%7,_^-3@2) +M/NC]#@``B7X0B7X4B7X8B7XB)7?SH]`X``(U-V,9%_`'H +M,P4``(U%Z(U-V%#HH`4``/]UZ(A=_.@^"0``68U%V&K_4&H!B\Z(7>3&1>4! +MQD7F`<9%YP'H21T``(--_/^-3=CH'+@!`(M-]%Y;9(D-`````,G#Z0FX`0"+ +MP3/)B4@$B4@(B4@,B4@0B$@4B$@5QP"`QT(`PU:+="0(_TX$BT8$=12%]G0. +MB\[H#0```%;HQ0@``%DSP%["!`#'`8#'0@"#P0CICP,``%:+\>@2````,L"( +M1DB(1DF(1DJ(1DN+QE[#N+^70@#H`VD"`%%35HOQ,]N)=?"-3AB('HA>`8A> +M`HA>`XA>!(A>!8E>"(E>#(E>$.@C````C4XPZ*@-``"-3CR)7?SHG0T``(M- +M](O&7EMDB0T`````R<.+P3+)B`B(2`&(2`*(2`.(2`2(2`6(2`:(2`>(2`B( +M2`F#2!#_@T@4_XA("HA("XA(#(A(#HA(#\9``@&(2`3&0`8!QD`(`<9`#0'# +M5HOQ_W8\Z.8'``#_=C#HW@<``%E97L.X)YA"`.A':`(`45-6B_$SVXEU\,<& +M&,A"`,=&#`C(0@#'1A#XQT(`B5X4C4XPB%X:B%X;B%X'HA>'XA> +M((A>(8A>(HA>(XA>)(E>+.C2#```C4X\B5W\Z,<,``"-3DC&1?P!Z+L,``"- +M3EC&1?P"Z*\,``"-3F3&1?P#Z*,,``"-3G#&1?P$Z)<,``"-3GS&1?P%Z(L, +M``"-CH@```#&1?P&Z'P,``"-CI0```#&1?P'Z&T,``"+3?3'!M3'0@#'1@3` +MQT(`QT8(K,="`,=&#)S'0@#'1A",QT(`B\9>6V2)#0````#)PU6+[%:+=1!7 +MBWT,@R8`:A!H$.!"`%?H;6<"`(/$#(7`=0>+10B)!NM6:A!H4,9"`%?H4F<" +M`(/$#(7`=.5J$&A@QD(`5^@^9P(`@\0,ABTWT9(D-`````,G# +M4XM<)`A65XOYBP>+-)B%]G0/_S;HO`4``%;HM@4``%E94XO/Z,X!``!?7EO" +M!`"X:)A"`.@39@(`4597B_F)??"+=P2#9?P`A?9T'E.+!TZ+'+"%VW0.B\OH +M5/___U/H<04``%F%]G7D6_\WZ&0%``!97XM-]%YDB0T`````R<-65XOYBW<$ +MA?9T'E.+!TZ+'+"%VW0.B\OH0;0!`%/H,@4``%F%]G7D6_\WZ"4%``!97U[# +MN'R80@#HCF4"`%%65XOYB7WP@V7\`(MW!(7V=!.+!TZ+#+"%R73R:@'H/``` +M`.OI_S?HZ@0``%E?BTWT7F2)#0````#)PU97B_F+=P2%]G0.BP=._S2PZ,4$ +M``!9Z^[_-^B[!```65]>PU:+\>@4````]D0D"`%T!U;HH@0``%F+QE["!`"X +MDYA"`.@(90(`45:+\8EU\(-E_`"-3ASH%@```/]V$.AV!```65Z+3?1DB0T` +M````R<.XJ)A"`.C59`(`4597B_F)??"#9?P`BW<$A?9T$XL'3HL,L(7)=/)J +M`>BR.P$`Z^G_-^@Q!```65^+3?1>9(D-`````,G#58OL45:+<0@Y<01U-+K_ +M__]_._)R%8U%_&BPXT(`4,=%_.4'``#HCF0"`(O&*];!Z`)`.\)V`HO"`_!6 +MZ(8```!>R<.+5"0$5HOQ5XU*`8OYBP9I_____S\#?@2-#(B-!)#!YP)745#_ +M%6C!0@"#Q`S_3@1?7L($`+B^F$(`Z!9D`@!15HOQ:@SH8`,``%F+R(E-\(-E +M_`"%R70,_W4(Z*$)``"+R.L",\F+1@2-4`&)5@2+%EZ)#(*+3?1DB0T````` +MR<($`%.+7"0(N/___S]6.]A7B_%W`HO#P>`"4.@*`P``B_B+1@2%P%ET#\'@ +M`E#_-E?HT6,"`(/$#/\VZ!X#``!9B3Z)7@A?7EO"!`"#;"0$#.D=_/__@VPD +M!`SIL?S__X-L)`00Z0G\__^#;"0$$.F=_/__Z0````#I%V("`%6+[%%14U97 +MB_*+^3/`BPZ)1@0@1?\SVV:)`8M-"(L1B4$$9HD".4<$=ER+!V:+%%AF@_H@ +MB57X=`9F@_H)=0:`??\`=%%F@_HB=0R`??\`#Y3`B$7_ZR>+1@@[1@1U"HO. +MZ!@&``"+5?B+1@2+#F:)%$%`9H,D00"+30B)1@1#.U\$6\G"!`"+!XU$6`)0Z,P(```SP(7;#Y7`Z^2XX)A"`.BA8@(`@^PD5E&+ +M\HU-W.@^"```@V7\`(U-W.@A#0``C4WC&1?P!Z#P'``"-1>B-5=!0C4WR<-6 +M5XOYBW<$A?9T'U.+!TZ+'+"%VW0/_S/H5`$``%/H3@$``%E9A?9UXUN#9P0` +M7U[#58OL@^P05H/Y"HORR<-5B^R#[!A3,]LY70Q6BW4(5XOY=Q)R!8/^_W<+B]>+SNA_____ZV,Y +M70QW$7(%@_X*@$=?J`(@"+P4J#X`_!Z02*@$3(0@"(`G7M +MPU6+[(-]"`!U!\=%"`$```#_=0C_%6#!0@"%P%EU%(I%"VA(Y$(`B$4+C44+ +M4.B98`(`7OBPU-55E>+ +MVHOY9HLW9HL+1T=#0V8[\704Z"$```"+SF:+Z.@7````9CO%=0=FA?9T!NO6 +M,L#K`K`!7UY=6\.+P68]80!R&F8]>@!W!(/`X,-F/7\`=@H/M\!0_Q4TPD(` +MPXM4)`16BS&*`D*$P'0I9HL.1D9F@_E!<@EF@_E:=P.#P2`\07P&/%I_`@0@ +M9@^VP&8[R'4&Z]"P`>L",L!>P@0`5HH"9@^V\&8[,74)A,!T"4)!0>OL,L!> +MP[`!7L-65XH"9HLQ068/MOA!0F8[]W0J9H/^?WPU9FBP)"0F:% +MP'0,9HLQ04%F._!U!NOJL`%>PS+`7L-6B@)"A,!T$&:+,4%F#[;`068[\'4& +MZ^FP`5[#,L!>PU-55E>+^HO99HLW1T=FA?9T(&:+"T-#9CO.=.SHTO[__XO. +M9HOHZ,C^__]F.^AU!NO6L`'K`C+`7UY=6\-14U565XOJB]EFBS-FBWT`0T-% +M168[]W0;B\[HEO[__XO/B40D$.B+_O__9CE$)!!R"7<,9H7V=`SKSH/(_^L' +M:@%8ZP(SP%]>75M9PU97BWPD#(OQ@R8`C4P@0`5HOQ:A3H6P$``/]T)`R+1@2+#O]T)`R-#$'H@/S_ +M_RL&T?B)1@1>P@@`5E>+?"00B_%7Z"T!``"+3"0,BP:+T6G2____?P-6!(U4 +M$@)2C11(`\]2C01(4/\5:,%"`(/$#%]>P@@`58OL4U97BWT(B_&-1#\"4.C4 +M_/__B]B+1@190(L.B]-T$HE%"&:+`6:)`D)"04'_30AU\?\VZ.+\__]9B7X( +MB1Y?7EM=P@0`58OL4XM="%:!^_[__S^+\785C44(:+#C0@!0QT4(K"DS`>A% +M70(`C40;`E=0Z&_\__^+^&:#)P#_-NB6_/__@V8$`%E9B3Z)7@A?7EM=P@0` +M5E>+?"0,B_&#)@"-1#\"4.@[_/__68E^!(E^"(D&7U["!`!5B^Q1BU$$B\+1 +MZ(U$$!`D\$@[PG('/?[__S]V!;C^__\_.\)W%8U%_&BPXT(`4,=%_*PI,P'H +MO5P"`%#H`____\G#58OLBU$$BT$(5HMU""O"5SOP=C"-!#*+^-'OC40'$+_^ +M__\_)/!(.\)R!#O'=@*+QSO"=A6+^"OZ._YR#4A0Z+W^__]?7EW"!`"-10AH +ML.-"`%#'10BL*3,!Z%9<`@!3BUPD"%97BWPD%(OQBT<$.]AV`HO84XO.Z!W_ +M__^+#XL&A=MV#XO39HLY9HDX0$!!04IU\XL&7V:#)%@`B\9>6\((`%6+[%:+ +M=0A7B_F+1@1`4.CC_O__BT8$BP^+-HO1A7<((`%6+[%%35HMU#%>+?12+V8E=_(T$ +M/E#HD?[__XL#BTT(A?9V%8O0B74,*]%FBQEFB1P*04'_30QU\HM-$$>%_XT$ +M<'8.*\%FBQ%FB10(04%/=?2+1?Q?7EO)PA``58OL48M%"%:#9?P`B_'_<`3_ +M,/]R!/\RZ(?___^+QE[)P@0`5HOQ:@B#)@#H;_K__X-F!`")!L=&"`,```!F +M@R``68O&7L-6B_%J`>C__?__9@^V3"0(BP9F@V`"`&:)"(O&7L($`%.+7"0( +M5C/V9CDS5XOY=`N+PT9`0&:#.`!U]U:+S^C&_?__BP>-3@&%R8O3=@UFBS)F +MB3!`0$)"277SB\=?7EO"!`!5B^Q14U97BWT(B]DS]H`_`(E=_'0'1H`\/@!U +M^5:+R^B!_?__BP,SR87V=A&+T&8/MAPY9HD:04)".\YR\6:#)'``BT7\7UY; +MR<($`%:+="0(5XOY_W8$Z$G]__^+1@2+-HL/0'0-9HL69HD104%&1DAU\XO' +M7U["!`!65VH!B_%?.7X()10CH._G__XM%"%E9B0>)=PB+!XU. +M`87)B7<$B]-V#6:+,F:),$!`0D))=?.+QU]>6UW"!`!3BUPD"%:+\3O>=02+ +MQNM#5XM[!#M^"'8@?60(`C40_`E#H2OC___\VB]CH +M=?C__UF)'EF)?@B%_W06BTT(BP9V#XO79HL99HD80$!!04IU\XL&9H,D>`") +M?@1?7EM=P@@`5E?_="0,B_'_%93!0@"+^#M^"'8C40V`E#HD_?___\W +MB47\Z+WW__^+1?Q968D'B7<(BP6\G"!`!6B_&+1@@[1@1U!>@3^___9@^V5"0(BT8$ +MBPYFB11!9H-D00(`0(E&!%["!`!6B_&+1@@[1@1U!>CF^O__BT8$BPYFQP1! +M+@!F@V1!`@!`B48$7L-6B_&+1@@[1@1U!>B_^O__BT8$BPYFQP1!(`!F@V1! +M`@!`B48$7L-6B_&+1@@[1@1U!>B8^O__BT8$BPYFQP1!.@!F@V1!`@!`B48$ +M7L-6B_&+1@@[1@1U!>AQ^O__BT8$BPYFQP1!"@!F@V1!`@!`B48$7L-3BUPD +M"%97,_^+\68Y.W0+B\-'0$!F@S@`=?=7B\[H>OK__XM&!(O3BQZ-3P&%R8T$ +M0W8-9HL:9HD80$!"0DEU\P%^!(O&7UY;P@0`4U97BWPD$(OQ_W<$Z$#Z__^+ +M1P2+3@2+'HL70(T,2W0-9HL:9HD904%"0DAU\XM'!%\!1@2+QEY;P@0`58OL +M4XM="%97,_^`.P"+\70'1X`\'P!U^5>+SNCT^?__BT8$BPZ#90@`A?^-!$%V +M%XO(BU4(_T4(9@^V%!IFB1%!03E]"'+K9H,D>``!?@2+QE]>6UW"!`!6B_%J +M"NBR^?__BT8$BPZ-%$&+3"0(Z'_T__\K!M'XB48$7L($`%:+\8M,)`S_="0( +MBP:-!$A0_Q58P4(`687`674%@\C_ZP0K!M'X7L((`(M!!(7`=!Z+"6:+5"0$ +MC41!_F8Y$'0(.\%T"DA(Z_,KP='XZP.#R/_"!`"+$8M!!(T$0CO"=!9(2&:+ +M"&:#^5QT!F:#^2]UZRO"T?C#@\C_PU:+\5>+#HO!9HL09H/Z('0,9H/Z"G0& +M9H/Z"74$0$#KYRO!T?B+^'0?:<#___]_`T8$C40``E"-!'E04?\5:,%"`(/$ +M#"E^!%]>PU.+$597BWD$B\>%P'0@C71"_F:+'F:#^R!T#&:#^PIT!F:#^PEU +M!TA.3H7`=>0[QU]>6W0(9H,D0@")003#5HOQBT8(.T8$=07H/_C__XM.!(L& +MC4P)`E%0@\`"4/\5:,%"`(L&9HM,)!2#Q`QFB0C_1@1>P@0`BT0D"%,SVU9F +M.1B+\70[0T!`9H,X`'7WA=MT+E>+?"004U>+SNCT]O__BP:+3"04A=N-!'AV +M#XO39HLY9HDX0$!!04IU\P%>!%]>6\((`%-65XM\)!2+\8M?!(7;="M3_W0D +M%.BU]O__BP:+5"00BP^%VXT$4'8/B]-FBSEFB3A`0$%!2G7S`5X$7UY;P@@` +MBP%FBQ!`0&:%TG0O9CM4)`1U[U:-4/YFBS!`0&:%]G0.9CMT)`AT[V:),D)" +MZ^AF@R(`*Q%>T?J)403"!`!FBT0D!%-F.T0D#%97B_%T+HL>,_\Y?@1V)8L& +MBU0D$(T,>.B-\___A`]FBT0D%&:)!'M'.WX$_W4(B\]6Z#L```#_=0R+SU;HX/[__P-U +M_#MW!'+17UY;R<((`(M!!#M"!'46BQ*+"5)1_Q5\P4(`687`674$:@%8PS/` +MPU-6BW0D$%>+^8M,)!"+7P2-!#$[PW8$B_,K\87V=BF-%#&+!VG2____?P/3 +MC502`E*-%#&-%%"-!$A24/\5:,%"`(/$#"EW!%]>6\((`%97BWPD#(OQA?]T +M(XO/BP9IR?___W\#3@2-3`D"48T,>%%0_Q5HP4(`@\0,*7X$7U["!`"X])A" +M`.C#4@(`@^P84U97B_F+RHE5[.C)\/__BW<$,]L[\XEUZ`^$E````(U-W.AR +M]___._.)7?R)7?!V8(L'BTWP9HLT2&:#_B!U)#E=X'1!BTWLZ-KM__^+3>R- +M1=Q0Z$?N__^+1=R)7>!FB1CK(HM%X#E%Y'4(C4W"+3=QFB31! +M0&:)'$&)1>#_1?"+1?`[1>ARH#E=X'04BTWLZ(GM__^+3>R-1=Q0Z/;M____ +M==SHE_'__UF+3?1?7EMDB0T`````R<-5B^Q14U97B_DSP(ORBP^)1P1FB0&+ +M5@0[T'1]BPZ+'?#`0@!04%)14/]U"/_3A<")1?QU'_\5],!"`(7`=%J-10AH +ML.-"`%#'10AT3@0`Z,I1`@`[1PAV"U"+S^A1]/__BT7\BP^+5@2+-E!14E9J +M`/]U"/_3A3H&/;___]U"(-E_`"+UXU- +MY.@P____C47DB\Y0Z,_V____=>3HI/#__UF+QHM-]%]>9(D-`````,G"!`"X +M')E"`.C^4`(`@^P0@V7P`%:+\5*-3>3HM_+___]U"(-E_`"+T(O.Z'W_____ +M=>3H7/#__UF+QHM-]%YDB0T`````R<($`(`]R#%#``!T!>F4\?__Z<[Q__^` +M/<@Q0P``=`7I!0```.E4````5F:+`6:+,D%!0D)F.\9T+V:%P'0Q9H7V=#%F +M/5P`=`9F/2\`=0(SP&:#_EQT!F:#_B]U`C/V9CO&<@MW#NO"9H7`=`SKNX/( +M_U[#:@%87L,SP%[#4U565XOJB]EFBPMFBW4`0T-%168[SG0]9H7)=#]FA?9T +M/V:#^5QT!F:#^2]U`C/)9H/^7'0&9H/^+W4",_;H%_#__XO.B_CH#O#__V8[ +M^'(+=P[KLV:%R70,ZZR#R/_K!VH!6.L",\!?7EU;P[@PF4(`Z-!/`@"#[!!3 +MB]E65XO*B57PZ-;M__^+3HAO3__S/)._>)??QV/XL#9HL4 +M>&:#^EQT!F:#^B]U*(O7C01(*]&-3>124.A5]O__BTWPZ.#J__^+3?"-1>10 +MZ$WK__^-3P%'._YRP8L#*_%6C01(C4WD4.@H]O__BTWPZ+/J__^+3?"-1>10 +MZ"#K____=>3HP>[__UF+3?1?7EMDB0T`````R<.+`8M)!%97C31(._!T+&:+ +M?OZ-3OYF@_]<=`9F@_\O=0*+\3OP=!-FBW[^C4[^9H/_7'0&9H/_+W7GB\XK +MR-'Y45"+RNBS]?__BTPD#%;H[?3__U]>P@0`48-D)```5E>+\HOYB\[HY_C_ +M_XL.C41!`HO/4.C+\___B\=?7EG#BQ*+">D`````45.+V5569HLSB^I79HM] +M`&:%]G1IC4,"B40D$&:#_BIU%HM,)!"+U>C3____A,!U5V:%_W16ZSAF@_X_ +M=0=FA?]T2>LD9COW=!^`/<@Q0P``=3F+S^A9[O__B\YFB_CH3^[__V8[QW4C +M0T.#1"00`F:+,T5%9H7V9HM]`'6>,\!FA?\/E,#K!K`!ZP(RP%]>75M9PXM! +M!#/2APX!Y#0!T +M+H!Y#@!T*(!Y#P!T(H-Y!`%U'(L!:'S'0@"+`(L`4/\5?,%"`%F%P%EU!&H! +M6,,SP,-5B^Q1@'T,`%-65XOQ=0J`?@X`#X2[````BT4(BTX$BT`$*\$/B*H` +M```S_R%]_(!]#`!T(H!^#@!U$H!^#`!T!(OXZPB%P`^%AP```(!^#0!U!(7` +M='V`?@P`=!.`?0P`B47\=`J`?@T`=01(B47\.WW\B\>)10Q_6C/_A,"BT4(@'X/`(L`=!.+%!B+!HL,N.AE_O__A,!T(.L5BP08BQ"+!HL$N(L( +MZ$G\__^%P'4)1X/#!#M^!'+$BTX$._ET%8M%#$`[1?R)10Q^IC+`7UY;R<(( +M`+`!Z_4SP#E!"'4:.4$4=14Y02QU$(-Y(`%U"HM!'(L(ZP@0` +MB\?K]X!\)`0`5HUQ''4#C7$HB\[HP^?___]T)`R+SNBD`P``7L((`%6+[%%3 +M5HMU#%>)3?PSVX-^!`%V-(L&.%X/BSAT$#E=$'0+B\_H%_[__X3`=36+3?Q7 +MZ#\```!3B\Z+^.C`Y?___TT0B7W\Z\8Y7@1T%3A>#W00BP:+".CE_?__A,!U +M`XA>#XM-_%;_=0CH;?___U]>6\G"#`!6B_'_="0(Z"7___^%P'P(BTX0BP2! +MZQQ7C4X0Z'\"``#_="0,B_B-3P2)-^@B\O__B\=?7L($`(!\)`0`5E>-<1QU +M`XUQ*#/_.7X$=AS_="04BP;_="04BPRXZ,S]__^$P'4-1SM^!'+D,L!?7L(, +M`+`!Z_>X1)E"`.A82P(`@^P,4U:+=0A7_W4,B_E6:@#HH____X3`=`B+11"` +M(`#K5XM&!(/X`79?BP:+S_\PZ'W^__^+V(7;?$Y6C4WHZ(\```"#9?P`:@"- +M3>CHNN3__XM'$/]U$(LCH<9D! +M`+`!ZQZ#3?S_C4WHZ&&9`0#_=0R+SU9J`>@C____BTT0B`&+3?1?7EMDB0T` +M````R<(,`%:+\8M&"#M&!'4%Z,3M__^+1@2+#F;'!$%<`&:#9$$"`$")1@1> +MP[A8F4(`Z'M*`@!14U:+\3/;5XEU\(D>B5X$B5X(BT4(B5W\BW@$._MT,KC_ +M__\_._AW`HO'P>`"4.B6UW"!`"X;IE"`.BB +M20(`45:+\>@`Y?__:@SHY^C__UF+R(E-\#/`.\B)1?QT"/]U#.@G[___@TW\ +M_U#_=0B+SNA^````BTWT7F2)#0````#)P@@`5HOQ5XM&!(L.BWR!_(7_=`__ +M-^C.Z/__5^C(Z/__65G_3@1?7L.X@IE"`.@M20(`45:+\>B+Y/__:C3HC5WO__BTX$C5$!B58$BQ9>B02*BTWT9(D-```` +M`,G#5HOQBTPD"%>+T8L&:=+___\_`U8$B_G!YP+!X@)2C10XC42(!%)0_Q5H +MP4(`BP:+3"0<@\0,B0P'_T8$7U[""`"XEIE"`.BC2`(`45:+\6H0Z.WG__]9 +MB\B)3?"#9?P`AB0R"BTWT +M9(D-`````,G"!`!65XM\)`R+\5?HS/W__XI'#(A&#(I'#8AI'#HA&#HI' +M#XA&#XO&7U["!`#I`````.GH40(`5HOQ_W0D"/\5,,)"`(7`#Y7`B`9>P@0` +M5HOQ@#X`=02P`5[#_Q4LPD(`]]@:P&H`_L"(!E@/E,!>PU6+[%%35C+;48OR +MC4W\B%W\Z+#___^$P'0>_Q4HPD(`AL",L!>R<.XJ)E"`.C81@(`@^P@ +M@V7P`%97B_F+\HU-Y.BAF@R1"`.L^:@B-3=M: +MB\:#X`_![@2#^`IS!8/`,.L#@\`WB`%)2G7E@&7<`&B`R$(`C4WDZ*7O__^- +M1=2-3>10Z)GO__^-1>2+SU#HY.O___]UY.BYY?__68O'BTWT7UYDB0T````` +MR<-5B^Q15HOR,\"-5?Q04%)045!H`!,``/\5W,!"`(7`=00RP.L5_W7\B\[H +M".S___]U_/\5`,%"`+`!7LG#4U8SVU=3:`````)J`U-J`V@```!`B_I1_Q7, +MP$(`B_"#_O]T'/]T)!3_="045U;_%=#`0@"%P%8/E6\(( +M`%)1_Q7(P$(`A<`/E<##]\(```#P=`:!XO\_``#IW____U'_%<3`0@"%P`^5 +MP,-24?\5P,!"`(7`#Y7`PVH`4?\5O,!"`(7`#Y7`P[C$F4(`Z$1%`@"#[!A6 +MB_'HU08``(/X_W0+J!!T![`!Z0\!``"+SNB`%0``A,!T!S+`Z?T```!35XO. +MZ`@6``"-3>B+^%;H'^K__S/;C4WHB5W\Z"#O__\[PWP@BU7LC4K_.\%U%H/Z +M`74'BMKIM0```(M%Z(E-[&:)'$B-1>B-3=Q0Z'+J__^+=>S&1?P!BTWHZ*H` +M``"$P'5)_Q7TP$(`/;<```!T=HU-Z.C([O__B_`[\WQH=&:+3>B#_@%U#V:+ +M`68]7`!T568]+P!T3XU&`3OXQSMXEU[&:)'''KJSMUX'TSBT7C_==SH%.O__XM-Z.C;_O__A,!URNL" +MLP'_==SHL>/__UG_=>CHJ./__UF*PU];BTWT7F2)#0````#)P[C8F4(`Z`-$ +M`@"#[#A35C/;B_%35O\5O,!"`(7`=`2P`>M&_Q7TP$(`/;<```!T!#+`ZS6- +M3;SH`0(``(U-Y.BBZ/__4U:-3;R)7?SH9P4``(3`=`F+7=S!ZP2`XP'_=>3H +M,./__UF*PXM-]%Y;9(D-`````,G#_W$HZ!?C__]9PU:+\>@@!0``@_C_=!JH +M$'46J`%T$HO0B\Z#XO[HTOW__X3`=0)>PU;_%;C`0@"%P`^5P%[#5HOQ_W8$ +MZ-7B__]9B\[HD`(``%[#Z4\8``"X[)E"`.@S0P(`@>P\`@``,\")3?")002+ +M"5-FB86X_?__9HD!5HV%N/W__U>+/;#`0@"[%`$``%!3_]>+\(7V=00RP.M] +M._-S&(M-\&:#9>``C86X_?__4.CWZ/__L`'K88U-Y.BLY___,]L[=>R)7?QV +M"5:-3>3H=.7___]UY%;_USO#="^+3>0STF:)''%F.1ET!4)!0>OV.]")5>AU +M%4X[\'40BTWPC47D4.@'Z?__LP'K`C+;_W7DZ`;B__]9BL.+3?1?7EMDB0T` +M````R<-5B^Q14U97B_*+^>@9____A,"(1?]U"%>+SNADZ/__B\[H;^S__XOX +MBP:+30A'C1P_`\-0Z$KH__\[?@1S"HL&B7X$9H,D&`"*1?]?7EO)P@0`N`": +M0@#H#T("`(/L#%-65XOYB_*-3>CHUN;__X-E_`"-1>A0B]:+S^B!____BMC_ +M=>CH:^'__UE?BTWTBL->6V2)#0````#)PS/`B0&)002)00B)00R)01")012) +M01B)01R)02"(022(027#58OL@^PT4U97B_'HS?___X,._X-.!/^-?AB+S^@? +M(```BP>+';3`0@")1A"+1P2)1A2+!XE&"(M'!&H`B48,_]-J]O\5I,!"`(7` +M=&*#^/]T78U-S%%0_Q6HP$(`A")!XM%Y!/3 +MB4<$B58$L`'K$/\5],!"`(7`=01J!O_3,L!?7EO)PXM!(,'H!*@!="B+02R% +MP'0ABTDH9H,Y+G48@_@!=`^#^`)U!V:#>0(N=`,SP,-J`5C#,L##5HOQBP:# +M^/]T$E#_%:#`0@"%P'4$,L!>PX,._[`!7L-5B^R![%`"``!6B_'HS____X3` +M=!>-A;#]__]0_W4(_Q6+^8OR:@&+!VH`B48@BT<$B48(BT<(B48,BT<,B480BT<0B484 +MBT<4B488BT<8:@")1AS_=QSH\4("`(M/(#/;`\&-3B@3TR!>)"!>)8/'+(D& +M5XE6!.@)YO__7UY;PU6+[('L4`(``(V%L/W__U#_,?\5F,!"`(7`=00RP.L0 +MBU4(C8VP_?__Z'#___^P`+V6BLR$(` +M_Q60P$(`BS64P$(`B_AHF,A"`%?_UFB(R$(`5Z/4,4,`_]:CT#%#`%^+PUY; +MPU6+[('L6`(``%:+\>BM_O__A,!T1H,]U#%#``!U"FIX_Q6TP$(`ZS-J`/\5 +MM,!"`(V%J/W__VH`4&H`_W4(_Q74,4,`@_C_B09U"_\5],!"`(/X)G0%@S[_ +M=00RP.L0BU4,C8VH_?__Z`<```"P`5[)P@@`BP&#P0B)0A"+0?Q1B\J)0A3H +M`.7__\-5B^R![%@"``"AT#%#`(7`=0IJ>/\5M,!"`.L/C96H_?__4O\Q_]"% +MP'4$,L#K$(M5"(V-J/W__^BL____L`')P@0`@SG_=`O_="0$Z*_____K#?]T +M)`2+0010Z!7___^$P(M$)`AT!\8``;`!ZQ&`(`#_%?3`0@"#Z";WV!O`0,(( +M`%'_%8S`0@"#^/]U`@O`P[A$FD(`Z$L^`@"#[$A35E>+?0B+\8O/Z.`.``"+ +MV(7;#XRQ`0``9H-\7P(`#X2E`0``C01?C4W44.@SX___@V7\`%>-3>#H)N/_ +M_SM=Y,9%_`%S"XM%X(E=Y&:#)%@`BT78@_@&=A6+3=2ZO,A"`(U,0?3H<=[_ +M_X3`=0UHO,A"`(U-U.@BY___BTW@Z(0-``"$P(M%X'0V@_L"=`R#^P-U+&:# +M>`1<=26+SNC5^___BT8HC4XH,_^#^P*)>01FB3AU((U%X%#H!>3__^L5_W4, +MB\Y0Z"?___^$P`^$Y````#/_9H%F(._[@TW$_XD^B7X$C47@C4W(4,9%_`+H +M_^+__XU-K,9%_`/H(.+__XU%#XU-Q%"-1:Q0QD7\!.B/_O__A,!T-(!]#P!T +M)HM5U(M-K.CTW/__A,!U(_]UK,9%_`/HE]S__UF-3:SHWN'__^N\:@+_%;3` +M0@`RV^LVBTVP@_D'=A&-0?H[P7,*BTVLB46P9HD\08U%K(U.*%#H[.7__XM% +MO,9&)`&)!HM%P(E&!+,!_W6LZ$+<____=#H +M*-S___]UU.@@W/__65GIV@$``/]UX.@1W/___W74Z`G<__]968--\/^+S\=% +M_`4````SV^A%#```A,!T`VH$6XT,7XE-".@;"@``A,!T6V:#?%\&`'53B\_H +MX?W__XO8@_O_#X13`0``]L,0#X1*`0``B\[H6OK___]U"(E>((U>*(O+Z#+B +M__]J`E@Y0P1V"HE#!(L#9H-@!`!7B\[HF@$``+,!Z3L!``!FBP=F/5P`=`IF +M/2\`#X7_````9H-_`@"+SW4PZ'3]__^+V(/[_P^$Y@```/;#$`^$W0```(O. +MZ.WY__^+1BB#9BP`9H,@`(E>(.NMZ`L+``"%P`^&N0```&:#/$<`C1Q'B5WL +M#X2H````B\OH!0D``(7`#XV9````5XO.Z!(!``"$P'0.4XU.*.B#X?__Z>\` +M``!7C4W(Z'G@__^-3R+R^F,````QD4+ +M`8O/Z*+\__^`?0L`B]AU6X/[_W0%]L,0=5'_=-3?#H +M2?K__X!]#`!T%X3`=!.+3B#!Z0KVP0%T"%>+SNA:````BMB-3?#H`OK__XK# +MBTWT7UY;9(D-`````,G""`"+SNC,^/__@_O_=`6)7B#K!\=&(!````#_=>R- +M3BCHF.#___]UR.@!VO__68U-\.B[^?__L`'KM^FR^?__58OL@^PT5HOQBTT( +MC57,Z%,```"$P'1*5VH!:@!J`/]U[.@?/0(`BTWP,_\#P8D&BT70B48(BT74 +MB48,BT78B480BT7)1B")5@2P`5]>R<($ +M`+A8FD(`Z/4Y`@!148--[/^`9?``5HOR@V7\`&@````":@-J`6H`48U-[.@M +M`P``A,!U#(U-[.A:`P``,L#K&5;_=>S_%:C`0@"-3>R+\.A"`P``A?8/E<"+ +M3?1>9(D-`````,G#Z2L#``"X;)I"`.B+.0(`@^PX4U:+\8U-O.BL]___C4WD +MZ$W>__\SVXU-O%-6B5W\Z!#[__^$P'0,BT7

@$J`%U`K,!_W7DZ-;8__]9 +MBL.+3?1>6V2)#0````#)P[B`FD(`Z#(Y`@"#[#A35E>+^8ORC4V\Z%#W__^- +M3>3H\=W__S/;5E>-3;R)7?SHM/K__X3`=`R+1=S!Z`2H`70"LP'_=>3H>MC_ +M_UE?BTWTBL->6V2)#0````#)P[B4FD(`Z-4X`@"#[#A35HOQC4V\Z/;V__^- +M3>3HE]W__X-E_`!J`%:-3;SH6OK__XK8_W7DZ"[8__]9BL.+3?1>6V2)#0`` +M``#)PU:-<03_="0(B\[H`=___VHJB\[H@>#__U["!`"#.?]T"_]T)`3H??C_ +M_^L-_W0D!(M!!%#HQ_?__\($`%97BWPD#(OQ5XO.Z-#___^$P'0-B\_H5/?_ +M_X3`=`;KYS+`ZP*P`5]>P@0`5E?_="0,B_'HQ____X3`BT0D$'0%Q@`!ZV"` +M(`#_%?3`0@"#/O]T##/)@_@2#Y3!BL'K3(/X`G1!@_@%=4"_Q,A"`%?H]SH" +M`%F+3@@KR'08A-#$CH+=C_ +M_X3`=`2P`>L",L!?7L((`+BPFD(`Z)TW`@"#["!35E>)3?#HI]7__XL]B,!" +M`&H`:@#_UXO8A=N)7>@/A*4```"X____?SO8=P*+PP/`4.BXUO__B_!9B77@ +M@V7\`%93_]>+V#/_.]^)7>QTAV0FH" +M,\!;9H-\'OX`=2H#QHU-U%#H,MW__XM-\(U'`8E%Z(E=Y.APTO__BTWPC474 +M4.C=TO__B\-'0T,[?>QRQHM=[/]UU.AQUO__5NAKUO__.5WH65D/E,#K"5;H +M6];__UDRP(M-]%]>6V2)#0````#)P_\5],!"`(7`=0:X!4``@,-^"B7__P`` +M#0``!X##58OL5HOQZ"X```"$P'0E:@#_=1C_=11J`/]U$/]U#/]U"/\5S,!" +M`#/)@_C_#Y7!B0:*P5Y=PA0`5HOQBP:#^/]T$E#_%=3`0@"%P'4$,L!>PX,. +M_[`!7L-5B^Q1@V7\`(U%_%=0_S'_%83`0@"+^(/__W4._Q7TP$(`AR<($`%6+[%&+ +M10Q35E?_=1"+\8O(B47\C47\4/]U",'Y'_\V_Q6`P$(`B_B#__]U(?\5],!" +M`(O8A=MT%?]U%(O.Z&+___]3_Q6TP$(`,L#K(&H!:@!J`/]U_.@D.`(`B\@S +MP`//$]"+112)"(E0!+`!7UY;R<(0`/]T)`QJ`/]T)!#_="00Z'C____"#`!5 +MB^Q148-E^`"#9?P`C47X4&H`:@#HT/___X3`=`V+1?@+1?QU!6H!6,G#,\#) +MPU6+[%%15HOQN````("`?@0`=`6X``$`@/]U%(O._W40_W4,4/]U".@7_O__ +MA,"(11=T'H!^!`!T&(--^/^#3?S_C47X:@!0:@#_-O\5T,!"`(I%%U[)PA`` +MBD0D"&B`````]M@;P&H#@^`"#`%0_W0D$.B)____P@@`:@#_="0(Z-3____" +M!`!5B^Q1C47\:@!0@V7\`/]U#/]U"/\Q_Q5\P$(`BTT0BU7\A<")$0^5P,G" +M#`!5B^RX``!``#E%#'8#B44,_W40_W4,_W4(Z+7___]=P@P`_W0D$/]T)!#_ +M="00:````$#_="04Z%+]___"$`!H@````/]T)`QJ`?]T)!#HS____\((`/]T +M)`S_="0,_W0D#/\Q_Q70P$(`]]@;P/?8P@P`58OL4;@``$``.44,=@.)10R- +M1?QJ`%"#9?P`_W4,_W4(_S'_%7C`0@"+31"+5?R%P(D1#Y7`R<(,`%6+[%:+ +M=1!7B_F#)@"-11"#91``4(O/_W4,_W4(Z*3___^+31`!#H3`=`Z%R70.`4T( +M*4T,=`;KU#+`ZP*P`5]>7<(,`/\Q_Q5TP$(`]]@;P/?8PU6+[%%1C47X5E"+ +M\?]U#/]U".CN_?__A,!T$(M%^#M%"'4(BT7\.T4,=`0RP.L'B\[HN____U[) +MP@@`58OL@^P05E>-1?@S_XOQ4(E]^(E]_.C?_/__A,!T35.+SO]U#/]U".B8 +M____BMB$VW4(_Q7TP$(`B_B-1?"+SE#_=?S_=?CH?OW__X7_B$4/=`=7_Q6T +MP$(`A-M;=`N`?0\`=`5J`5CK`C/`7U[)P@@`9HL1B\%FA=)T$V:#^EQT$6:# +M^B]T"T!`9HL0Z^B#R/_#*\'1^,.+002%P'08BQ%FBT1"_F8]7`!T"V8]+P!T +M!>F2Y___PP^W`0P@@^AA@_@9=QMF@WD".G449HM)!&:#^5QT!F:#^2]U!&H! +M6,,SP,-65XOY,_9F.3=T"XO'1D!`9H,X`'7WA?9T-&:#?'?^.G4LB\_H+@`` +M`(3`=2&+S^BY`0``A,!T!H/'"(/&_(/^`G4/B\_HB`$``(3`=`0RP.L"L`%? +M7L-6B_%79HL&9CU<`'0*9CTO``^%A@```&:+3@)F@_E<=`9F@_DO=79F@WX$ +M+G5O9HM.!F:#^5QT!F:#^2]U7S/_9H7`=%B+QD=`0&:#.`!U]X/_!G4)9H-^ +M"CIU0>L[@_\2L",L!?7L-FBP%J7%IF.\)T!F8]+P!U +M:&:+00)F.\)T!F8]+P!U66:#>00_=5)FBT$&9CO"=`9F/2\`=4-FBT$(9CU5 +M`'0&9CUU`'4S9HM!"F8]3@!T!F8];@!U(V:+00QF/4,`=`9F/6,`=1-FBTD. +M9CO*=`9F@_DO=01J`5C#,\##5HOQ5V:+!F8]7`!T!F8]+P!U16:+1@)F/5P` +M=`9F/2\`=35J`HO.7^A7____A,!T!6H(7^L09HM&!&8]+@!T&&8]/P!T$HT, +M?NC,_?__A0(Z=01J`5C# +M,\##9HL!9CU<`'0&9CTO`'4K9HM!`F8]7`!T!F8]+P!U&V:#>00_=11FBTD& +M9H/Y7'0&9H/Y+W4$:@%8PS/`PV:+`68]7`!T!F8]+P!U,&:+00)F/5P`=`9F +M/2\`=2!FBT$$9CT_`'0&9CTN`'409HM)!F:#^5QT"6:#^2]T`S/`PVH!6,-6 +MB_'H=?___X3`=`.#Q@B+SNA/_?__A,!T#&:#?@8`=05J`5A>PS/`7L-FBP%F +M/5P`=!)F/2\`=`SH)/___X3`=0,SP,-J`5C#5E>+^3/VZ"G___^$P'0#:@1> +MC0QWZ/_^__^$P'0"1D:#R/^-%'=FBPIFAPXO.Z)S^__^$ +MP(O.=`9>Z7X```#H`@```%[#5HOQZ&G\__^$P'0$:@/K/6:+!F8]7`!T"F8] +M+P!T!#/`7L-FBT8"9H7`=!]F/5P`=`9F/2\`=1.-3@3H$````(U(`O?8&\!> +M(\'#:@%87L-65XOYZ-+[__^+\(7V?`V-3'<"Z,/[__^%P'T$,\#K!(U$,`)? +M7L.+P6:+4`B-2`AF@_I5=`9F@_IU=3!FBU`*9H/Z3G0&9H/Z;G4@9HM0#&:# +M^D-T!F:#^F-U$&:+4`YF@_I<=!9F@_HO=!#H:OO__X7`?0,SP,.#P`7#C4@0 +MZ'S___^-2`CWV!O`(\'#N-2:0@#HQBT"`(/L)%-65XOZB]E7BTT(Z,O3__^+ +MS^BF_O__B_"%]G19@_X!=%2-'#8#^XO/Z#P"``"$P'0]5XU-T.BDTO__@V7\ +M`(U-T.@5`0``A,!T&XM-"#MQ!',*BP&)<01F@R0#`(U%T%#H=];___]UT.C> +MS/__6;`!Z=4```"-3>CH'M+__X7;QT7\`0```'1,A?9U2%.-3>CH1=/__XU- +MZ.C(^O__BTWHZ!?^__^-3=R+V.CLT?__A?;&1?P"="V%VXT\=W4UBT7H(5WL +MC4WH9B$8Z$?B__]J`5OK'XU-Z.BIZ?__A,!UM3+;ZUN+1>B-3=R-!%A0Z.?2 +M__]7C4WB)7>QF@R18`(M- +M"(U%Z%#H%M/__XM-"(U%W%#HJ-7__[,!_W7+^8E]_#/VBP=FBPAFAL",L!?7EO)PV:+$58S]F:%TG18C4$$9H/Z+G5#A?9T$&:+2/IF +M@_E<=`9F@_DO=2]FBTC^9H7)=#9F@_E<=#!F@_DO="IF@_DN=11FBPAFA@2_?__ +MPU:+\?]T)`S_="0,_Q5PP$(`APU92B_%J`/\5A,%"`(7`B48(=0^X#@`' +M@&;'!@H`B48(7L-FQP8(`#/`7L-5B^Q6B_'HH0$``(M%"&:#9@(`9L<&"`"+ +M2`2+`%%0_Q6$P4(`A<")1@AU%J'\R$(`:$#H0@")10B-10A0Z%(J`@"+QEY= +MP@0`5HOQ9H,^"W0*Z%4!``!FQP8+`(I$)`CVV!O`9HE&"(O&7L($`%:+\6:# +M/A-T"N@P`0``9L<&$P"+1"0(9H-F`@")1@B+QE["!`!6B_%F@SX5=`KH"P$` +M`&;'!A4`BT0D"&:#9@(`B48(BT0D#(E&#(O&7L((`%:+\6:#/D!T"NC?```` +M9L<&0`"+1"0(BPB)3@B+0`1F@V8"`(E&#(O&7L($``^W`8/X!W8@@_@)=A2# +M^`MV%H/X#W8*@_@7=@R#^$!T!U'_%8S!0@##5HOQ#[<&@_@'=AF#^`EV&X/X +M"W8/@_@/=A&#^!=V!8/X0'4',\EFB0[K$E;_%8S!0@`SR3O!=1EF.0YU%(E. +M"&:)3@)FB4X$9HE.!HE.##/`7L-F@SD`=0AF@V$"`#/`P^F:____4U>+?"0, +MB]EF@S\`=`N+S^B%____APXO.Z*/___^%P'T(9L<&"@")1@A>PU6+[(/L)(M% +M$%:+=0B)5?2`)@"H`70&QD4+`>L5)`+VV!K`]M`C!=@Q0P"$P(A%"W0-BP&) +M1>R+002)1?#K#XU%[%!1_Q5@P$(`AQ0_Q5DP$(`A*9]_L"T8-] +M#/V(5O\/CO,````/MT7DF??[Q@8@@\8#`L&(1OX/MT7DF??[#[=%Y@+1B%;_ +MQ@8ZF??[@\8#`L&(1OX/MT7FF??[`M&#?0P`B%;_#XRM````#[=%Z)GW^\8& +M.H/&`P+!B$;^#[=%Z)GW^S/``M$Y10R(5O\/CH0```!J`5!0Q@8N_W7P1L=% +M^`<```#HVBD"`(M-[#/;`\%3$]-H@):8`%)0Z`0I`@")1?QJ!UF+1?PSTHO? +M2??SBT7\@,(PB!0Q,]+W\X7)B47\=>*+30R#^0=S`XE-^`-U^(/Y"'P@BT7T +M,]*+W_?S!#"(!D:#^0E\#8M%]#/2]_>`PC"(%D:`?0L`7UMT"O9%$!!U!,8& +M6D:`)@"P`5[)P@P`:@#_="0(4C/2Z,+]___"!`!5B^R#[$!6B_+_=0B-5<#H +MV____V8/MDW`@'W``&:)#G065XU-P(I1`4%&9@^V^D:$TF:)/G7O7U[)P@0` +MN.B:0@#H&28"`('L$`(``%-6@V7D`&:#I>3]__\`O@`!``!7C87D_?__B_I6 +M4%>+V?\UQ#%#`/\5(,)"`"OP@_X!?A"-A>3]__^+RU#H[B+RU#H4\O___]UZ.@HQ?__68M- +M]%^+PUY;9(D-`````,G#4U565XM\)!2+VHOIO@`!``#1YHU&_SM'"'8(4(O/ +MZ![(__^+!U904U7_%2#"0@"+SBO(@_D!?ME0B\_H!P```%]>75O"!`"+`8M4 +M)`1F@R10`#/29H,X`'0%0D!`Z_6)403"!`!5B^R![`0"``!35E>+?0B+VC/` +MBQ>)1P1FB87\_?__O@`!``!FB0*-A?S]__]64%-1B4W\_Q4@PD(`*_"#_@%^ +M$(V%_/W__XO/4.CQRO__ZPN+3?Q7B]/H/____U]>6\G"!`"+PHO1BPW$,4,` +M4.B-____PU:+\8L&APU%355:+\E>_%`$``(L&@V8$ +M`(OI9H,@`#E^"',(5XO.Z"['____-E7_%:3!0@"%P`^5PX3;=4MH*,E"`&@0 +MR4(`_Q5<".WX(=@A7B\[H[<;__XL&:@!7 +M4%7_5"0@A<`/E<.$VW4(@?\```$`=M17B\[HS_[__XK#7UY=6UG#N`2;0@#H +M`R0"`%%35HOR,]M7B_F+!HE>!%-FB1C_%5S"0@!7B5W\_Q6@7____B]:+SXE]\.@@____C4WPBMCH`?____\54,)"`(M- +M](K#7UY;9(D-`````,G#_R50PD(`Z=_^____="0(_W0D"&I%Z`,```#""`"X +M&)M"`.AW(P(`@^PL4U:+\5>+^HU-Z.@^R/__@V7\`(-ES`"X!`$``(EUR#E% +M\',)4(U-Z.C[Q?__BT7HBU40B470BT4(B478BT4,B\B)?=3WV1O)B47@@>$6 +M7D``B4W7<($`%9J(#/`6HOQ +M@^8!`\;1Z4IU]%[#C4$$4%'_%53`0@!0_Q58P$(`PU6+[(/L+(U-^.C?____ +MAC47@ +MQT7@(````%#_%4S`0@"+1?@[1>AR`XM%Z(D&L`%>R<.X``#_`,/H]?___X/X +M"G8%@^@*ZP-J`5AJ`S/26??Q.\%W`E%8@\G_.\%S`HO(B\'#4?\52,!"`,-3 +M5E>+?"00B]F+!X-G!`!F@R``_S/_%13"0@"+\(7V="X[=PAV"%:+S^CKP___ +MBP>-3@%14/\S_Q48PD(`._!V`HOP5HO/Z-3[__^%]G4-_Q7TP$(`]]@;P$#K +M`K`!7UY;P@0`58OLBT4(2$AT>(/H`W1=@^A)=$N#Z`5T/2V]````="](=!5( +M2'0$,L#K7/]U$(L!_W4,_U`TZT^+10R+$5;_=1`/M_#!Z!!64/]2#%[K.(L! +M_U`(ZS&+`?]0&+`!ZRC_=1"+`?]U#/]0,.L;BU40BP'!ZA!2#[=5$%+_=0S_ +M4!#K!8L!_U`47<(,`(-\)`0`=0__="0,BP'_="0,_U`L35_]U_%=J,/\5$,)"`/?8&\#WV%]>6\G#58OL@^P0BT4(5HMU#%>+ +M?1"#9?``B0:#9?0`B0>)1?B)1?R-1?!0_W$$_Q4$PD(`AR<($`%6+[(/L$/]U +M"/]Q!/\5_,%"`(U-\%%0_Q4`PD(`AP@@`58OL@^P04U:+=0A7BSWXP4(`B]F+!HE%^(M&!(E%_(M&"(E% +M\(M&#(E%](U%^%#_,__7C47P4/\S_]>+1?A?B0:+1?R)1@2+1?")1@B+1?2) +M1@Q>6\G"!`!5B^S_=0C_<03_%?S!0@`SR3A-'`^5P5'_=1C_=13_=1#_=0Q0 +M_Q7TP4(`]]@;P/?87<(8`%6+[(/L*%-6C7$$5_?9&\F)=?@CSHL1C4WHZ/#] +M__^$P`^$H````(U%V%#_-O\5`,)"`(7`#X2,````BW7DBUW@*W7<*UW8C57H +MC4W8B77\Z'D```"$P'1NBT7PBWWHBTWT*\P[V'\$._%^6(!]"`!T#XM% +M^&H#_S#_%?#!0@#K0XMU[#O8?0XKPYDKPHOXT?\#?>CK`HO8.4W\?1&+P2M% +M_)DKPHOPT?X#=>SK`XE-_(M%^&H!_W7\4U97_S#_%?3!0@!?7EO)P@0`BP$[ +M0@A]&XM!"#L"?A2+000[0@Q]#(M!##M"!'X$:@%8PS/`PU6+[(/L2%.-603W +MV1O)5B/+5XE=^(L1C4W(Z/W\__^$P`^$\@```(UUR(U]Z*6E_S/&1?\!I:7_ +M%>S!0@"+/0#"0@"+\(7V=#^+UHU-N.C)_/__A,`/A+X```"-5A05O_7A````A,!T!(!E_P"-1=A0_S/_UX7` +M#X2!````@'W_`'0HC57(C4W8Z'4```"$P'5LC57(C4W8Z"/___^$P'1=C77( +MC7WHI:6EI8M-X(M%\"M-V(MUY"M%Z(M=]"MUW"M=[#O(?S<[\W\S*\&9*\*+ +M^(O#*\:9T?\#?>@KPM'X`T7L.WW8=04[1=QT$6H!5E%0BT7X5_\P_Q7TP4(` +M7UY;R<.+`3L"?!R+00@[0@A_%(M!!#M"!'P,BT$,.T(,?P1J`5C#,\##BP$[ +M`G49(D-`````%O)PA``46A!94``_W0D$/]T)!#_-<0Q0P#_%>#! +M0@#""`!5B^R#["B+10B#9>``B47`.````_S&)1?3_%1S"0@#)P@P`58OL@^PHBT4(@V7@`(E%W(E% +M^(M%#,=%V`4```")1>R-1=A0:@!H31```/\Q_Q4R+10R)1>"-1=A0:@!H3!```/\Q_Q4+?"00@&<(`(!G +M"0#'1PP!````.PU<,T,`P@@`4U;_="00B_**V?]T)!#H&P```(7`?00SP.L._W0D%(K3B\A6Z&O_ +M__]>6\(,`%-6BS5<,T,`,\"%]E=V,+]<,D,`BQ>+6@@[7"00=1B+6@P[7"04 +M=0^$R70%BU($ZP*+$H72=0M`@\<$.\9RU8/(_U]>6\((`+A"FT(`Z$\9`@"# +M[`R#9?``5XOZB4WL@V7\`%?_=0R-5?#_=0CH8/___X-]\`")10QT0U9H@``` +M`,9'"0'H;+C__UF+R(E-Z(7)QD7\`70,_W7LZ*T+``"+\.L",_:`9?P`5HO/ +MZ$^'``"-3GC_=?#H1(<``%Z+1?"#3?S_A`PS/`P[@!0`"`PX/X!70H +M@_@&=!^#^`IT%(/X#WX%@_@1?A"%P'P5N`5``(##N`1``(##:@%8P[A7``>` +MPXM$)`2#80@`QP$_:4``B4$$P@0`58OLBT405B-%%%>+\8/X_W4$,]+K`XU5 +M$(M%""-%#(/X_W4$,\GK`XU-"(M&!%)14(LX_U<,B\B)1@AJ"EKH#?___U]> +M7<(0`(M$)`3'`:-I0`")000SP(E!$(E!%(E!",($`%6+[%-65XM]"(OQN``` +M`("+#SO(B4T(<@.)10B+1@2-70A3_W4(BPA24/]1#(E&"(M%"(D'`480BTX( +M7X-6%`!>A#5A0`7U["!`!6B_&+3@SH;Z,!`(-F#`!>PU:+\5>+?"0,@WX,`'0% +M.WX0=!J+SNC5____B\_H**,!`(E&#(E&!(E&"(E^$#/`7SE&#%X/E<#"!`!5 +MB^Q15HOQ@'X@`'5#@WXD`'4]BT84C57\4O]V$(L(_W8,4/]1#(M.#(E&)(M& +M!(E.!"O!`488BT7\C10!@U8<`(E6"(7`=`B*`4&)3@3K!L9&(`$RP%[)PXO! +M@V`,`,<`]VI``,.+400[40AT!XH"0HE1!,/IAO___[AXFT(`Z/L5`@"#["A3 +M5E>+V6HNB5WPZ.B___^+RXOPZ`K`__^-3>2+^%/H@;O__X-E_`"-3=CHHKK_ +M_T?&1?P!._=^'CMUZ',+BT7DB77H9H,D<`"+`XU-V(T$<%#HNKO__VI?C4WD +MZ)V]__^-33H4@`` +M`(3`=`6-?@'K`HO>._MUW/]U\(U5V(U-Y%/H-````(K8_W7,]ML:V_[#Z,JT +M____==CHPK3___]UY.BZM/__BTWT@\0,BL-DB0T`````7UY;R<-6BW0D#%=1 +MB_J+SNB)N___B\[_="0,Z+&^__^+SE?H%+[__XL.Z!3<__]?7L((`(O!,\G' +M0`3HR4(`QT`(V,E"`,=`#,C)0@#'0!"TR4(`B4@4@T@8_XA('(A(5(A(58E( +M6(E(7,<`H,E"`,=`!)#)0@#'0`B`R4(`QT`,<,E"`,=`$%S)0@##58OL4U:+ +M=1!7BWT,:A"#)@!;4V@0X$(`5^B=%`(`@\0,A+10B+R(U0$/?9&\DCRHD._T`4,\#K!;@"0`"`7UY;7<(,`%:+="0( +M_TX4BT84=12%]G0.B\[H#0```%;H'K/__UDSP%["!`"XCYM"`.B$$P(`45:+ +M\8EU\,<&H,E"`,=&!)#)0@#'1@B`R4(`QT8,<,E"`,=&$%S)0@"+3EB#9?P` +MA__^+312%R70%BU40B1&$P'0$,\#K+O\5],!"`(M.6(7) +M=`J+$5#_=ES_$NL7A7<(0`%6+[+@` +M`!``.440@$````7<(0`/\5],!"`(7`=0:X!4`` +M@,-^"B7__P``#0``!X##58OL45&#?10#<@>X`0`#@.L_C47X@V7X`%"+10C_ +M=12#9?P`C4@8_W40_W4,Z)+<__^$P'0$,\#K!>BD____BTT8A+?"0,,]LX7TAU$HM/!(U'!%#_41`[PP^%B````%9J`5-3_W;___]U$(U-\.@*Y___C4WPZ'/F +M__\SP%Y;R<(,`(O!P>@$)`&*T/;:&])F@>(`P('"`(```/;!`70)A,"X;0$` +M`'0%N/\!```+PL-6BW0D"(U&$%#_=@C_%:C`0@"%P`^5P(A&1%Z$P'4'Z"#] +M___K`C/`P@0`@\$(Z"C9__^$P'0#,\##Z07]__]5B^R-11!6BW4(4/]U$(U. +M"/]U#.CIV___BTT0BU44`4X0@U84`%Z%TG0"B0J$P'0$,\#K!>C+_/__7<(0 +M`%6+[%%1@WT4`W('N`$``X#K/XU%^(-E^`!0BT4(_W44@V7\`(U("/]U$/]U +M#.AVV?__BTT8A7<(0`(-L)`0$Z='Y +M__^#;"0$!.FI^O__@VPD!`CIO?G__X-L)`0(Z97Z__^#;"0$#.FI^?__@VPD +M!`SI8Z?__X-L)`0,Z7?Z__^#;"0$$.F+^?__@VPD!!#I1:?__X-L)`00Z5GZ +M__^+$;D@W$(`_R4DW$(`5E>+\;\@W$(`B\^+%O\5)-Q"`(M4)`R+S_\5(-Q" +M`(D&7U["!`"+1"0$BTPD#(E('#/`P@P`BT0D!(M,)`R)2"`SP,(,`%-6B_%7 +MBT9`BUX\.]AR`HO89H'C`/"X`!```#O8.'074XO/ +MZ(/___^#/P!U![@.``>`ZP6)7C@SP%]>6\-6B_&+1GA0BPC_40R%P'4'B\[H +MG?___U[#B\&Z```@`#/)QT`$>,M"`,=`"&C+0@#'0`Q4RT(`QT`01,M"`,=` +M%##+0@#'0!@@RT(`QT`<$,M"`,=`(/S*0@#'0"3LRD(`QT`HV,I"`,=`+,C* +M0@")2#")2#2)4#R)4$"*5"0$B4A(B4A0B4@XB%!$B$A%B4A,B4A4B4A8B4A< +MB4ALB4APB4ATB4AXQP"XRD(`QT`$J,I"`,=`")C*0@#'0`R$RD(`QT`0=,I" +M`,=`%&#*0@#'0!A0RD(`QT`<0,I"`,=`("S*0@#'0"0+?1!J$%N#)P!3:!#@0@!6Z'D,`@"#Q`R%P'4* +MBW4(B3?INP$``%-H,,-"`%;H7`P"`(/$#(7`=.-3:"#$0@!6Z$D,`@"#Q`R% +MP'4-BW4(B\:-3@3I@`$``%-H0,1"`%;H*0P"`(/$#(7`=0V+=0B+QHU.".E@ +M`0``4V@`Q$(`5N@)#`(`@\0,A````!3:-#" +M0@!6Z(D+`@"#Q`R%P'4-BW4(B\:-3ASIP````%-H,,1"`%;H:0L"`(/$#(7` +M=0V+=0B+QHU.(.F@````4[NPQ$(`4U;H2`L"`(/$#(7`=22+=0@Y1FR-3FQU +M$HM&>%%34(L0_Q*%P`^%@P```(O&C4XDZVB[D,1"`&H04U;H#PL"`(/$#(7` +M=2"+=0@Y1G"-3G!U#HM&>%%34(L0_Q*%P'5.B\:-3BCK,[MPPT(`:A!35NC: +M"@(`@\0,AP@0`N.>;0@#H.`H"`%%6B_&)=?"+ +M1GC'1?P%````A+SN@G_/__,\D[P0^%#0(``"!-"XE-U(E-V(E-W(E- +MX(E-^(E-](M]&(7_=!F+1>`[1P0/A](!``!R"XM%W#L'#X/%`0``@V7P`(!] +M"P!U-HM&.(M=^(M6-(M-#"O#`].)1>R-1>Q0Z%8-```#7>R)1?`[7CB)7?@/ +ME44+A`-5](L(4U)0_U$0B_B%_W1@BU7T._N-!!>)1>AV18-]\`!U38!^1`!T +M0XM.."O*._EW.H!]"P!T-(M.-(M=^(`D&0#_1?@Y1?AU\8M&>`/*5U&+&%#_ +M4Q`[^`^%#P$``(M%Z#E%^(E%]'6)ZP3&1?\!BWT8BUWT,](Y5?!U&XO#),`X +M50MT$#A5_W4%BUWXZPB`?D0`=`*+V#OZB5WL=!B+#XM'!"M-W!M%X#O0<@EW +M!#O9=@.)3>S_=>R+5C2+31#HP`P``(7`#X6F````BT7L`473E=]')T*5WT*5WX=!2+1C3_=?B- +M#!A14/\5:,%"`(/$#(-]'``/A%O^__^+5=R+3>"+PHOY*T74&WW8B7WH=0L] +M``!```^"._[__XM%'(E5U(U5W(E-V(L(4HU5W%)0_U$,A6\G"&`"+1"0$_W0D"(U(2.C&=0``,\#""`!6 +MBW0D"(M&2(7`=`J+"%#_40B#9D@`,\!>P@0`58OL45-6B_$SVU +M18M6:'0>BTY(BT9,*TY0&T94,_\[^'((=P0[T78"B]$[TW1ABT95#O#=2H[TW6D +MBWYD._MT'8M&8(M.-"O'=`V+T(H<.8@904IU]S/;B49@B5YD,\!?7EO)P[@0 +M```@Z_0[PW7PN`5``(#KZ56+[%.+71165X7;=`.#(P"+?1"%_W1MBW4(C4[H +MZ#7___^%P'5@BTY(BT8@.\AT,BO!._AR`HOXBT8<5_]U#`-&2%#HA@8"`"E] +M$`%]#(/$#(7;=`(!.P%^2(M&2#M&('4;_W9(BT9@_W8- +M?OR+S^C5____BT0D$(7`=`^+"(E.1(M`!(E&2,9&00&+S^A6]___7U[""`"+ +M1"0$_W0D"(U(3.@. +MP@0`58OLBT44A/U__^#;"0$'.G6]___@VPD +M!!SIV??__X-L)`0@Z<7U__^#;"0$(.FX]___@VPD!"#IN_?__X-L)`0DZ:?U +M__^#;"0$).F:]___@VPD!"3IG??__X-L)`0HZ8GU__^#;"0$*.E\]___@VPD +M!"CI?_?__X-L)`0LZ6OU__^#;"0$+.E>]___@VPD!"SI8??__U6+[%%35HMU +M"#/2BUT05XM.$(M&%"M.&(E5_!M&'#/_._AR"'<$.]EV`HO9,\"%VW0CBT8( +MC57\4E/_=0R+"%#_40R+5?P!5AB#5AP`A=)U!,9&(`&+311?7EN%R70"B1') +MPA``B\$SR8E(!,9`"`'&0`D!B4@,B4@0B4@8B4@@B4@HB4@P@0`N/^;0@#HN@`"`%%6B_&)=?"+ +M1A"#9?P`A +M&(A>",9&"0&)7@R)7A")7APSP%Y;P^@/````A@%````,\#"!`!6B_%J`HM."%J# +MP03'!A3,0@#H&?,!`/9$)`@!=`=6Z`6>__]9B\9>P@0`5HMT)`C_3@2+1@1U +M%(7V=`Z+SN@-````5NC@G?__63/`7L($`,`ZTB`9@D`BT8,._AV`HOXA?]T-5?_=A#_="04Z!C^`0`!?A"+ +M1"0@@\0,`7X8@U8<`(7`=`*)."E^#'4,C4X$QD8)`>A^\@$`,\!?7L(,`%.+ +M7"005E>%VXOQ=`.#(P"+?"04A?]T*H!^"`!U+(M$)!"+SHE&$(E^#.@8\0$` +MBTX$Z%#P`0`K?@QT"H7;=`*).S/`ZPG&1@@!N!```"!?7EO"#`!5B^Q65XM] +M"(M'$(MW#"OP.W40=@.+=1"%]G05BT\(5O]U#`/(4>AI_0$`@\0,`7<0BT44 +MA-3?R+^HL&46C`PD(`5O\0BT7\AR<-5B^Q14U97B_J+\56\G"!`!5B^Q14U:+=0A7B57\B]F+/H,F +M`(7_="NX````@#OX7<($ +M`%6+[%-65XM]"(O:B_&%_W0MN````(`[^',"B\>+#HU5"%)04U;_40P#70@K +M?0B%P'4..44(==:X!4``@.L",\!?7EM=P@0`5HOQC4X$Z/G[__^%P'4DC4X( +MZ.W[__^%P'48($80.48,C4X,=`)>PU:Z(89``.A![@$`7L-6BW0D"(M.!.BR +M[0$`@'X0`'41BP:+SO]0!(U.".A=[@$`Z^$SP%["!`"`81``@\$$Z4GN`0!6 +MB_&#?@0`C4X$QD80`70%Z#3N`0"#?@P`C4X,7G0%Z87M`0##N+Z<0@#HBOH! +M`%%35HOQ,]N)=?#'!F#-0@#'1@10S4(`QT8(^,="`,=&#$#-0@")7A"-3B"( +M7A>)7ACHH)'__XA>0XE>4(E=_(E>6(E>7(U.8,9%_`+H$I___XU.;,9%_`/H +M!I___XU.>,9%_`3HI0```(V.F````,9%_`7HZY[__XV.I````,9%_`;HGP(` +M`(V.\````.C1GO__B9X``0``C88$`0``B1B)6`2)GA`!``"-AA0!``")&(E8 +M!(E8"(V&,`$``(D8B5@$B5@(C8X\`0``QD7\#.CA'0``C8YH`0``QD7\#>B` +MGO__BTWTQP8@S4(`QT8$$,U"`,=&"`#-0@#'1@SPS$(`B\9>6V2)#0````#) +MPU:+\>A-GO__,\")1@R)1A")1A2+QE[#58OL5HMU$%>+?0R#)@!J$&@0X$(` +M5^AP^0$`@\0,A7<(,`(M$)`3_0!"+ +M0!#"!`!6BW0D"/].$(M&$'44A?9T#HO.Z`T```!6Z"^8__]9,\!>P@0`N'2= +M0@#HE?@!`%%15HOQB77P_[9H`0``QT7\#````.@$F/__BX8\`0``65"+"/]1 +M"(V.,`$``,9%_`OH)!P``(V.%`$``,9%_`KHXD8!`(N&$`$``,9%_`F%P'0& +MBPA0_U$(_[8$`0``Z+J7__^+A@`!``!9A<#&1?P'=`:+"%#_40A7_[;P```` +MZ)F7____MI@```#HCI?__UF-?GA9B7WLC4\,QD7\#>B#1@$`_S?HBTWT9(D-`````,G#B\$S +MR8D(B4@$9HE("(A("HA("XE(#(E($&:)2!2(2!:(2!>)2!B)2!QFB4@@B$@B +MB$@CPU6+[%.+V597C8LP`0``Z!@;``"+@P`!``"-LP`!``"%P'0)BPA0_U$( +M@R8`BX,0`0``C;,0`0``ABT!0A@15>R-1>CK`XM%#(MV4%!6BP[_41#K"[CJBT``P[@.``>`BTWT7UYDB0T` +M````6\G""`!5B^R-51"-31CH0````(U5$(U-".@U````BT40"T44=0N#910` +MQT40`0```/]U'/]U&/]U#/]U".BS]P$`_W44_W404E#H=O8!`%W"&`!35E>+ +M\8OZNP```("+5@2+!H72=P0[PW8J:@%9Z$'W`0")!HE6!(L'BU<$:@%9Z"_W +M`0")!XE7!(M6!(L&A=)WV'/27UY;P[BLG4(`Z''T`0!1BT4(4U97BX`P`0`` +MB67P_W40@V7\`(L(_W4,4/]1#.L+N,>,0`##N`X`!X"+3?1?7F2)#0````!; +MR<(,`%6+[%%1@&7_`%.+70A65S/_.7L$B_&)=?AT&(L#BP`Y>`1T"XL(Z,C# +M__^$P'0$QD7_`8-^2`-U$X!]_P!T#8MU#(L&B7X$9HDXZPZ#QF!6BW4,B\[H +M59K__SE[!(E]"`^&P@```.L",_\Y?0AT!XO.Z!&I__^+`XM-"(L\B(O.5^C' +MG/__BT,$2#E%"(M%^'4/@+B0`````'0&QD4/`>L$@&4/`(-^!`!U"(!]#P!T +M:.LF@WA(`W4F@WT(`'4@@W\$`G4:BP_H)\/__X3`=`^`?0\`=$.+1?C&0$$! +MZSJ+#C/_Z.ZM__^$P'4'Z(*\__^+^(!]#P!T((L.,M+H];G__X3`=1.+3?A6 +M:(#-0@!7QD%!`>AI`0``_T4(BT4(.T,$#X)`____7UY;R<((`+C`G4(`Z/KR +M`0"#[!!35HMU$#/;9HE=Y&:)7>:)'HE>!&:)7@B(7@J(7@N)7>R+01B-5>12 +MB5W\_W4,BP#_=0B+"%#_41@[PW0$B]CK'V:#?>1`=0V-1>2+SE#H)P```.L+ +M9CE=Y'0%NP5``("-3>3H!\G__XM-](O#7EMDB0T`````R<(,`(M$)`135C/V +MBU`(,]N)$8M0#(E1!`^W4`([UG08@_H9=Q-F.7`&=0T/MT`$@_ADP[CPG4(`Z*?Q`0"#[!A6B_'_=0R-3>CH]9;__X-E +M_`"#?0@`=#)HF,U"`(U-Z.C5FO__BU4(C4WB!FO__ +M_W7<@&7\`.CDD/__68M5$(U-Z.B#____BT90_W7HBPA0_U$<_W7HB_#HPI#_ +M_UF+QHM-]%YDB0T`````R<(,`% "0``%:+\>@WJO__B\9>6<-6B_'H3+K_ +M__]T)`R+SO]T)`Q0Z$O___]>P@@`N`R>0@#H[O`!`(/L&%:+\?]U#(U-Z.@\ +MEO__@V7\`(-]"`!T,FB8S4(`C4WHZ!R:__^+50B-3=SHE/___U"-3>C&1?P! +MZ,B9____==R`9?P`Z"N0__]9BU40C4WHZ,K^__^+512-3>CHO_[__XM&4/]U +MZ(L(4/]1'/]UZ(OPZ/Z/__]9B\:+3?1>9(D-`````,G"$`!3,MLX6AE6BW0D +M#`^4P%:#P@Q04NCHI/__A,!T"C@>=02P`>L$LP&*PUY;P@0`58OL48U%_%#H +MQ?____;8&L`C1?S)P[@HGD(`Z!7P`0"#[!135HOQ5S/;BT889HE=X&:)7>*) +M7>B+.(N&Z````(E%\(B>S````(L/C57@4FHU4%>)7?S_41@[PW0$B_#K5&:# +M?>`3=4+_=>B-CJ0```#HT0```(U-X.@OQO__9HE=X&:)7>*)7>B+!XU-X%%J +M"?]U\,=%_`$```!7_U`8.\-T'HOPZ94```!F.5W@=,:^!4``@(U-X.CPQ?__ +MB\;K9&:#?>`3=6R+1>C&ALP````!B8;(````@TW\_XU-X.C)Q?__C8:D```` +MB\Y0:@K_=?#H.OS__SO#=2J-AK````"+SE!J"_]U\.@C_/__.\-U$XV&O``` +M`(O.4&H,_W7PZ`S\__^+3?1?7EMDB0T`````R<-F.5W@=)Z^!4``@(U-X.EQ +M____5HMT)`B!Y@#P```SP('^`$````^5P$@D\(/`(/9$)`B2B4$D=04,`8E! +M)('^`*```%YU!(!))Z#&02@!P@0`BH&1````@WE(`XI11%"-@80```!0#Y3! +MZ!`W``##BT0D!%,RVXA8&(A8&8A8&CB9QP```'08BY&\````B5`0BY'````` +MB5`4QD`:`>L:BU$8.%I/=!)6BW)$B7`0BU)(B5`4QD`:`5XXF:\```!T%8N1 +MI````(D0BY&H````B5`$QD`8`3B9NP```%MT%HN1L````(E0"(N)M````(E( +M#,9`&0'"!`"X3)Y"`.C^[0$`@^Q`4U:+\8U-Z(V&A````%#H8Z/__S/;.5WL +MB5W\=!4XGI````!U"(U-Z.AQI/__.5WL=1(X7D(/A*`````X7A0@#H\NP!`('LE````(M%#%-6B_%7C4VDQ@`!Z`FK__^-3@PD?__ +M_W68QD7\`^CXB___68U5"%**5CKVVHV>V````(M%O!O2B47L(].-GKP```!2 +MBI;'````]MH;THM%P"/3B47P4HM&4/]V>(U5I(L(4HU5[%+_==Q0_U$4A8O__UGI3P$``+X$0`"`Z^/'1DP#````ZQ+'1DP"````,_;KS\=&3`$```#_ +M==R`9?P`Z$6+__]9BT9,@_@#=3>+S^BGU?__A,!U(U>+SO\U),Q"`.A\^?__ +MAP```"^!4``@.GB````QD8\`>F+`0``@_@$=6]7C4WHZ!J1__^- +M3>C&1?P$Z%W5__^$P'405XO._S4DS$(`Z#+Y___K)HL/BU7HZ-FE__^$P'4K +MZ'NT__^-3>A748O._S4HS$(`4.@P^O__A<"+\'4%O@5``(#_=>CI&/____]U +MZ.B6BO__Z18!``"+1<2+#\'H!*@!=!;H?Z7__X3`#X7^````5_\U,,Q"`.LR +MZ$RQ__^$P`^$Z````(L/Z$:G__^$P`^%V0```/\5],!"`(/X`@^$R@```%?_ +M-2S,0@"+SNB9^?__A<`/A0____\S]O]US.@DBO__68O&Z;,```"+#^@SN___ +MB]B%VP^,D0```(L'9H-\6`(`#X2#````5XU-Z.@7D/__.UWLQD7\!7,+BT7H +MB5WL9H,D6`"-C6#____H?*C__XU-B.@=C___:@"-C6#_____=>C&1?P&Z-NK +M__^$P'0I]D6``70CC47HC8[P````4.B3D/__BU6`BTWHB9;L````@^+^Z&JD +M____=8CHA(G___]UZ.A\B?__65F+10S_=6V2) +M#0````#)P@@`58OL48-E_`!1_W4,BTT(Z(6-__^+10C)P@@`N,*>0@#HJND! +M`(/L,%-65XM]#(OQQ@@(``&H8Z,:'__]9 +MB47L.\/&1?P#=`Z+R.@?`P``B_B)?>SK!8E=[(O[._O&1?P!B;[\````B7WH +M=`:+!U?_4`2`?CD`BX[\````BU7L6@+[,`````'1X]H;) +M````!'1O@&8^`/^VV````(V.!`$``.@XZO__:A3HE8;__X7`670,@V`$`,<` +MO,U"`.L",\"-O@P!``"-GA`!``!0B\N)!^AW50``BP>+C@@!``"+E@0!``"# +M8!``B5`(B4@,_S.+30CH554``(M][.G/````@'XM``^$F@```(!^.0`/A98` +M``"$T@^$B````(N.W````(N&V````(7)=P0[PW9TB8;@````B8[D````48N. +M_````%"#P0CH<;/__X3`B$8[=2F-1=R+SE#_-3C,0@#H=?7__XO8A=MT$H7_ +MQD7\`70&BP=7_U`(B_/K=8N&_````(U(".A.L?__A,!U%HU%W(O.4&BP@0`@\$(Z4>N__^-07B+21A0_W0D".C3-@``P@0`N/">0@#HE.0!`(/L +M%(M%$%-6BW4(5S/;C;X``0``B1B)9?")7?R+!SO#=`B+"%#_40B)'XN&$`$` +M`(V^$`$``#O#=`B+"%#_40B)'XM-#(V&\````(F>T````(F>V````(F>X``` +M`(A>.(A>.8A>.HA>.XA>/(A>/8A>/HA>/XA>0(A>08A>0HF>U````(F>W``` +M`(F>Y````(F.Z````(F>[````(E8!(L`.5T49HD8C8:8````B5@$BP!FB1AU +M"3A>%74$QD8]`8M&&%&+SHLXZ!;___\[PP^%#0(``&:)7>!FB5WBB5WHBP>- +M3>!1:AW_=0S&1?P!5_]0&#O#=`2+\.L29CE=X'0O9H-]X!5T$KX%0`"`C4W@ +MZ/>Y___IJ`$``(M%Z,9&.0&)AM````"+1>R)AM0```"-3>"(7?SHT;G__XM5 +M#(U&.%!J#XO/Z-(R```[PP^%CP$``(O.Z`+Q__\[PP^%@`$``(M.5#O+=!"- +M5GCH[O+__SK##X0<`0``BXZ(````.\MU##B>D`````^%!@$``(M&2(E=##O# +M#XR+````@_@!?A2#^`)T!8/X!'5\.\MT>$F)30SKD0```'0T,_\[OA@!``!S)(N&A````(N.%`$``(L$N(L,N8L` +MBPF+T.CLD?__AX!4``@.G'````BX88 +M`0``QD9"`8E%#/]U#(V.A````.CG!0``B5T(.5T4QD7\`G5".%X5=3TX7A1T +M36H0Z):!__\[PUET$8E8!(E8"(E8#,<`Y,U"`.L",\!0C4T(Z(!0```Y70AT +M"XM-$(M%"(E="(D!.5T(B%W\=`F+10B+"%#_40@SP.M)C44/B\Y0C44(4,9% +M#P'H-/C__XOP._-T%(M%"(A=_#O#=`:+"%#_40B+QNL<.%T/=*F+10B(7?P[ +MPW3`Z[BX69]``,.X#@`'@(M-]%]>9(D-`````%O)PA``BT0D!/]`!(M`!,($ +M`(M,)`3_202+001U"5'H"X'__UDSP,($`+C\GD(`Z'+A`0!1BT4(4U8SR3E- +M#%>)9?")3?R(2#UU$CA(%70)QT4,`0```.L$QD`]`8I8.8VXT````/;;&]N+ +M2%`CWXMP>%.+$?]U##/;.)B0````#Y7#4U91_U(8ZPNX^Y]``,.X#@`'@(M- +M]%]>9(D-`````%O)P@@`58OL@^P@4U:+\5>#O@`!````=0!1T/8N6Y````(V.X````#O7")GM@```!0 +MB\Z)OMP```#&1CH!Z.7Q__^+1?AFBTWZBM`*U`K1="[VV1O)C57P(\J-5>A1 +MBLSVV1O)(\KVV%&-3>`;P"/!BX[\````4(/!".A>K/__BX[\````Z)30__\S +MVSO#=4"+A@`!```[PW0,BPA0_U$(B9X``0``.9[T````=!^+ENP```"+CO`` +M``"-OO````#H6IK__XL'B5\$9HD8BT7\7UY;R/W0' +MB\[H.O___XM&4#/2.%XXBP@/E<)2_W4,4/]1(.L+N!6B0`##N`X`!X"+3?1? +M7F2)#0````!;R<((`%6+[(/L+%:+=0A7@WY4``^$PP```(!E"P"-3?3HG8/_ +M_X-]#`&+?1!U>(/__W1SC4W4Z(>#__^-3>#HC>L``(M.%(U%U%!7Z,LP``"% +MP'4BC474C4WT4.@%A?__BT84B]>+"(U%"U!J#^@`+@``AM$C4W@Z.`L`0#_==3HSWW__UGK$VHCC4WT +MZ!.$__]7C4WTZ-^'__\/MDT+_W7TBW94BP91_W445O]0#/]U](OPZ)M]__]9 +MB\;K`C/`7U[)PA``N!2?0@#H^]T!`%&+10B#9?P`4U:#>%0`C7!45XEE\'42 +MBT!(5FCPQ$(`4(L(_Q&%P'48BS;_=0R+!E;_4`SK"[A1HT``P[@.``>`BTWT +M7UYDB0T`````6\G""`"+5"0$5C/V9HL"0D)FAP[@HGT(`Z$G=`0"#[`Q35HOQ,]LY7AAU!S/`Z8X```!7B5WH +MB5WLB5WPB[XT`0``C4WH5XE=_.AJ`@``B7WL,_\YGC0!``!V)(M%Z(E\^`2- +M#/B+AC`!``"+!+C_QV&XM% +MZ(N.,`$``(M$^`2+#('H0/___T<[?>QRY8V.,`$``.BM````_W7HZ#-\__]9 +M,\!?BTWT7EMDB0T`````R<-65XOQZ*S\__^+SHOXZ#/___^%_W4"B_B#9A@` +MB\=?7L-358ML)`Q6,_:+V87M=A]7BP.+/+"%_W0/_S?HX'O__U?HVGO__UE9 +M1COU75O"!`!65XOYBW<$A?9T(%.+!TZ+'+"%VW00_W,< +MZ*9[__]3Z*![__]9687V=>);_S?HDGO__UE?7L-65XOYBW<$A?9T'E.+!TZ+ +M'+"%VW0.B\OHXN[__U/H:WO__UF%]G7D6X-G!`!?7L.X/I]"`.C+VP$`45:+ +M\6HPZ!5[__]9B\B)3?`SP#O(B47\=`7H2=K__X--_/^)!HL(4/]1!(M-](O& +M7F2)#0````#)PU.+602#^P%V1U:+,5>+^X/N"-'O4XO7B\[H)`$``$]U\XT\ +MWHM6"(L'BT\$B1>+5@Q+B5<$4XE&"&H!B4X,6HO.@^\(Z/D```"#^P%WUE]> +M6\-65XM\)`R+\87_="*+SXL&:$"48T,N%%0_Q5HP4(`@\0, +M*7X$7U["!`"X4I]"`.@"VP$`45.+V6HHZ$QZ__]9B47P,\D[P8E-_'0?BU4( +M5E=J!UF+\HOX@\(<\Z52C4@V@$`_S;H`'K__X,F`(-F"`"X____'UD[^'<"B\?!X`-0 +MZ+!Y__]9B0:)?@A?7EW"!`!5B^Q148M$T013BQS15HE%_%>)7?B-!!([10AW +M2W,@BWS!"(L#KL(M%_%^)'-%>B431!%O) +MP@0`@VPD!`3I9^#__X-L)`0$Z?'@__^#;"0$!.GTX/__@VPD!`CI2>#__X-L +M)`0(Z=/@__^#;"0$".G6X/__@VPD!`SI*^#__X-L)`0,Z;7@__^#;"0$#.FX +MX/__N&2?0@#H`BTWT7UYDB0T`````6\G"#`"X +M?)]"`.AHV`$`48M-"(-E_`!35HM!0%>%P(EE\'0._W40BPC_=0Q0_U$0ZR.+ +M242%R74$,\#K&/]U$(L!_W4,_U`(ZPNXZ:A``,.X#@`'@(M-]%]>9(D-```` +M`%O)P@P`N)"?0@#H!]@!`(/L%%-65S/;B67PB5W\9HE=X&:)7>*)7>B+10C& +M1?P!.%@4=!N#?0P$#X6O````@\!04(U-X.A8K?__Z9X```"+30R#^0IW2G1# +M@^D$=#=)270@270-24D/A8````#_<'SK1?]P8(U-X/]P7.BUK?__ZVN+0'R- +M3>#!Z`0D`5#H6*W__^M8!80```#KI8/`9.LU@^D+="U)="6#Z2EU/XM(?.AM +MQ___4(U-X.A1K?__ZRRXP:E``,.X#@`'@.LT@\!TZP.#P&Q0C4W@Z(*M__]F +MQT7B%P!FB5WD9HE=YO]U$(U-X.@EKO__C4W@Z(ZM__\SP(M-]%]>9(D-```` +M`%O)P@P`BP&+5"0$5HMQ#(L$D(-()/^)<""+00R#^/]T"HLQBP2&B5`DZP.) +M41#_012)40Q>P@0`BT0D!%>+4""#^O]T#8LYBQ27BW@DB7HDZP:+4"2)41"+ +M4"2#^O]T#8LYBQ27BW@@B7H@ZP:+4"")40R#2"#_@T@D__])%%_"!`!65XOY +MBTPD#(L'BS2(BP:%P'01BPA0_U$(@R8`5HO/Z)+___]?7L($`(-)#/^#21#_ +M@V$4`.DT!P``N*2?0@#H0M8!`%%6B_$SP(EU\(D&B48$B48(@TX,_X-.$/^) +M1?R)1A3HAK3__XM-](E&&(O&7F2)#0````#)PU:+\8M&%#M&&'(TBT80@_C_ +M=0>X!4``@%[#BPZ+!(&+"(/`&%!J`8L1:@!J`%'_4A"%P'4,_W80B\[H1___ +M_S/`7L.XPI]"`.B_U0$`45.+V5:+=0B+`U>+/+"+!X7`=!P[ARGO__@TW\_XOXA?9T!HL&5O]0"(O'ZT56B\^) +M=P3H7<(4`%:+="0(BTX,_W8(@<&8````Z%#^__^%P'4?BT8,BTX(_W0D +M#(N`F````(L$B(M`!(/`!%"+"/]1#%[""`"X_I]"`.CHTP$`@^Q,BT40@V7\ +M`%-6@R``5XM]"(EE\(!_%`!T"&H!6.E"`@``BT]`A/__C4WAS>/__BT]$BU70C47@$J`$/A;,! +M``"-3:CHW0$``&I@QD7\`^B8__^$P'4HZ#R< +M__^%]HOXQD7\`W0&BP96_U`(C4VHQD7\`NB\`@``B_?I-@$``(V?E````(O+ +MZ,#\__^%P(E%"'0BA?;&1?P#=`:+!E;_4`B-3:C&1?P"Z(<"``"+=0CI``$` +M`%:-3:B)=:SH]T```(U%W(U-L%#H!WG__X7VQD7\`W0&BP96_U`(B\OHW6W_ +M_XU%J(O+4.B#`P``4(O+B44(Z%W[__^+1V"+7UR-=S")1>R+SNCW`P``BT8$ +MBU7LC4@!B4X$BPZ-=QB)',&)5,$$B\[HE6W__XU%T(O.4.@#;O__C7L+N(FO0`##N`X`!X"+3?1?7F2)#0````!;R<(,`+@0H$(`Z&?1 +M`0!15E>+\3/_B77PB3Z-3@B)??R)?@3H)G;__X-.(/^+3?2#3B3_B7X8B7X< +MB\9?7F2)#0````#)PU6+[%:+=1!7BWT,@R8`:A!H$.!"`%?H.M$!`(/$#(7` +M=0>+10B)!NM,:A!HH,)"`%?H']$!`(/$#(7`=.5J$&B`PD(`5^@+T0$`@\0, +MA7<(,`%:+="0(_TX(BT8(=12%]G0.B\[H#0```%;H$W#__UDS +MP%["!`"X)Z!"`.AYT`$`45:+\8EU\,<&(,Y"`,=&!!#.0@"#9?P`@WX4`'09 +MBT80BTX,48M0*(`D"@"-B)@```#HO/G__XMV%(--_/^%]G0&BP96_U`(BTWT +M7F2)#0````#)PU:+\?]V".BB;___BS99A?9T!HL&5O]0"%[#N#R@0@#H`-`! +M`%%35HMU"#/;5XE=_(M&-(EE\#O#=#Z)70B+"(U5"%)H\,1"`%#&1?P!_Q&+ +M10@[PW0?_W4,BPA0_U$,B_"+10@[PXA=_'0&BPA0_U$(B\;K*XA=_#E>.'4' +MN`%``(#K'/]U#,9�&+3CB+`?]0$.L+N(>Q0`##N`X`!X"+3?1?7F2)#0`` +M``!;R<((`#/`P@P`,\#""`"X4*!"`.A?SP$`4597B_F)??"+=P2#9?P`A?9T +M'E.+!TZ+'+"%VW0.B\OH%O___U/HO6[__UF%]G7D6_\WZ+!N__]97XM-]%YD +MB0T`````R<-65XOYBW<$A?9T'E.+!TZ+'+"%VW0.B\OHU_[__U/H?F[__UF% +M]G7D6X-G!`!?7L.X9J!"`.C>S@$`45:+\6HHZ"AN__]9B\B)3?"#9?P`AB0R"BTWT9(D-`````,G"!`!5 +MB^Q15HMQ"#EQ!'4TNO___W\[\G(5C47\:+#C0@!0QT7\Y0<``.B/S@$`B\8K +MUL'H`D`[PG8"B\(#\%;HJ@```%[)PU6+[%%6BW$(.7$$=32Z____?SOR@"0#O"=@*+P@/P5NB6G0``7LG# +MN'B@0@#H",X!`%%65XM]"(OQB77PBP>%P(D&=`:+"%#_402+1P2#9?P`B48$ +MC4<(4(U.".B%<___BT<8BTWTB488BT<2+SE#HS7+___]UY.BB;/__68O&BTWT7F2)#0````#)P@@`N*B@ +M0@#H_P`B4WPBTL$5HOR5XU1`8M&!#O"=C\KP4B+^(L& +M9H,\>"YU,8L+C51X`NB;;/__A,!T(HU%X%=0B\[HYN+___]U#(M-\(-E_`"+ +MT.A9R<($`%%358O95E75M9PXO&Z_:X':%" +M`.C#RP$`@>Q4`0``4XM=+%8S]HES,(ES*(ES((ES&(ES$(ES"(DS5XF55/__ +M_XE-S(ES-(ES+(ES)(ES'(ES%(ES#(ES!(EUT(EUU(EUP(EUQ(EUR(M%&(EU +M_(!X2`!T"<=%Z`$```#K"8M%#(M`!(E%Z#EUZ(EU\`^&T0```(V-9/___^AO +MB?__C4V,Z!!P__^+11C&1?P!B;5D____B;5H____@'A(`'5*BT4,BTWPBP#_ +M-(B-3;3HMW#__VH!C8UD_____W6TQD7\`NBBC/__A,`/A-(```"+183!Z`2H +M`0^%V0```/]UM,9%_`'H7FK__UF+A6C___^+O63___^-3<")1:#H9_S__XM% +MQ(M-P/]%Q(M5H(D\P8M-P(E4P02+A63___\!1="+C6C_____=8P13=2`9?P` +MZ!)J____1?!9BT7P.T7H#X(O____BWWHB77@._YT$X/(_SOX=P*+QU#HM6G_ +M_UF)1>`[_L9%_`-V%HM-Z(M]X(O1,\#!Z0+SJXO*@^$#\ZIH@`$``.B):?__ +M68E%+#O&QD7\!'16B\CHC<___XOPZTWH6)/__XOPC56T_W4HN4S.0@!6ZQ'_ +M=2B^!4``@(U5M+DTSD(`5NBJ"0``_W6TZ'-I____=8SH:VG___]UP.AC:?__ +M@\0,Z@!QD7\!8M! +M#(M)"`^7PH!F1`")OF`!``")OE@!``")OE`!``")OD@!``")OD`!``"$THA5 +MYXA60XE.2(E&3(F^9`$``(F^7`$``(F^5`$``(F^3`$``(F^1`$``'0L_W74 +MBT4D_W70BPA0_U$,.\>)12QT%COWQD7\`W0&BP96_U`(BWTLZ0T'``"`92\` +M.7WHB7W8B7W@$ +MJ`$/A9D%``"+32"+!XL1BTT8BDE+48M-(%#_$H7`B47L#X4'!```C8WT_O__ +MZ`P'``#_M53___^-3:3&1?P'Z.0-``"-C:#^___&1?P(Z%0&``"+1#^___HBF[__XV%H/[__XV-]/[___]U'%#H,38``(7`B47L=0\YA3#___]\ +M%,=%[`$```"!?>P$0`"`#X2$`P``_W7LBP>+32!0C87T_O__BQ%0_W7,_U($ +MA<")A5C___\/A:8#```Y1>QT*(M%&,9%+P&`>$@`#X5_`@``BX5D____BXUH +M____`478$4W@-)`&(1;-T?XM%&(!X2P!U*8L_BTT@:`%` +M`("-E?3^__^+`5=2_W7,_U`$B_B%_P^%6@,``.EK____BT48C4VT@\`\4.BS +M;/__@WVX`,9%_`IU$(L/C56TZ-J$__^#?;@`=`B-3;3HB)3__XU%M(V.:`$` +M`%#H4FW__\9%_`G_=;3H4V;__UF+11B`>$@`#X6B````@[T$____``^$E0`` +M`(N%$/___X-E[`"#O03___\`B[T,____B46@=D2+A0#___^+3>R+%(B+31#H +M:?K__X7`?!L[1?!V%HM-X,8$"`&+3<"+%,&+1,$$*_H91:#_1>R+1>P[A03_ +M__]ROXM%H(O/"\AT+P-]T!-%U(7`?PI\!(7_L",\F$R8A(3W09BXU\____B4A$BTV`@&!.`(E(2&;'0$P7`(V%7/__ +M_XN-$/___U"+A0S_____=2@#A63___]6_W4D$XUH_____W4@:@!2_W44C97T +M_O__48M-S%#HO`4``(OXA?\/A04"``"+11B`>$@`=2:+E0S___^+O1#___\# +ME63___\3O6C___^)E5S___^)O6#____K#(N]8/___XN57/___P%5V(V./`$` +M`!%]W(L!`5`@$7@DBPF+AE@!``")02B+AEP!``")02R+12B#>`0`#X7!`0`` +M_[7D_O__Z)ED__]9QD7\!XU-I.BQ7___C8WT_O__QD7\!N@_!```QD7\!?]U +MC.AQ9/__6?]%\(M%\#M%Z`^"Q/O__S/_@'WG`'4*@'TO``^$)`(``/]UU(M% +M)/]UT(L(4/]1##O'B448#X3@`0``._?&1?P#=`:+!E;_4`B+?1CI>0(``.C1 +MC?__B_C_=8SH$&3__X7V6<9%_`-T!HL&5O]0"(OWZ5H!``#_=8SH\F/__X7V +M6<9%_`-T!HL&5O]0"(MU[.D[`0``_[7D_O__Z-!C__]9QD7\!XU-I.CH7O__ +MC8WT_O__QD7\!NAV`P``_W6,Z*QC__^%]EG&1?P#=`:+!E;_4`B^!$``@.GS +M````_[7D_O__Z(AC__]9QD7\!XU-I.B@7O__C8WT_O__QD7\!N@N`P``_W6, +MZ&1C__^%]EG&1?P#=`:+!E;_4`B+M5C____IJ@```/^UY/[__^@_8___6<9% +M_`>-3:3H5U[__XV-]/[__\9%_`;HY0(``/]UC.@;8___6<9%_`.%]NEA`0`` +M_[7D_O__Z`1C__]9QD7\!XU-I.@<7O__C8WT_O__QD7\!NBJ`@``Z3^___HV&+__UG&1?P'C4VDZ/!=__^-C?3^___&1?P&Z'X"``#_=8SHM&+_ +M_X7V6<9%_`-T!HL&5O]0"+X%0`"`_W7@Z)AB____=<#HD&+__UE9B\;I]0`` +M`.@YC/__B]B+U_]U*+E,SD(`4^B?`@``_W6,Z&AB__^%]EG&1?P#=`:+!E;_ +M4`B+\^NUBT4DC5784E"+"/]1$#O'B448=!8[]\9%_`-T!HL&5O]0"(M]&.F% +M````BX9``0``QD7\`XE#((N&1`$``(E#)(N&2`$``(E#*(N&3`$``(E#+(N& +M4`$``(E#,(N&5`$``(E#-(N&6`$``(E#"(N&7`$``(E##(N&8`$``(E#$(N& +M9`$``(E#%(M%##OWBT`$B0.)>P2+ACP!``"+2"")2QB+0"2)0QQT!HL&5O]0 +M"/]UX.B>8?___W7`Z)9A__]9B\=9BTWT7UY;9(D-`````,G"*`!35HOQ,]N- +M3@B)'N@B````C4Y$B5XHB5XLB5XPB5XTB5XXB5X\B%Y`Z*1F__^+QEY;PXO! +M,\F#"/^(2`2(2`6(2`:(2`>(2`B(2`F(2`J(2`N(2`R(2`V(2`Z(2`^)2!C& +M0!`!QD`1`8A($HA($XA(%(A(%8A(%HE(',9`!`'&0`4!QD`&`<9`!P'&0`X! +MQD`/`<9`#0'#N$:A0@#H5\$!`%%6B_$SP(EU\(D&B48$B48(B47\B48,B480 +MB484B488C4XDQD7\`8E&'(A&((A&(>C[9?__C4XPQD7\`N@/````BTWTB\9> +M9(D-`````,G#N%NA0@#H_<`!`%%35HOQ,]N)=?"#3@S_B5X0C4X8B!Z(7@&( +M7@*(7@.)7@2)7@B)7A3HJ67__XU.)(E=_.B>9?__BTWTB\9>6V2)#0````#) +MP[B1H4(`Z*O``0!15HOQB77PQT7\`P```.A0)```C4XPQD7\`N@M````_W8D +MZ`U@__^`9?P`68U.#.@)#P$`@TW\_XO.Z*0%``"+3?1>9(D-`````,G#5HOQ +M_W8DZ-U?____=ACHU5___UE97L.XI*%"`.@^P`$`@^P,4U97BWT,48O:B\_H +MQ&?__[Z8S4(`B\]6Z'1I__^+50B-3>CH[,[__X-E_`!0B\_H(6G__X--_/__ +M=>CHA%___UE6B\_H2&G__XO/4^@$:?__BTWT7UY;9(D-`````,G""`"X-J)" +M`.C/OP$`@>R$````4U97B_J)3>PSVXM'!(L/BT2!_(M-+(E%T(D9B5D$BP") +M7>")1<")7>2)7>B-392)7?SH>,A"`(U-B,9%_`3H9V3__U=0C4W$QD7\!>@?:____W6(Z'M> +M____=;3&1?P#Z&]>__]9B%T768U-U.BR8___C47$C8UP____4,9%_`;HQD7\!W1I@WX(`W1CC4V(Z(EC__^-1=2-58A0C4W$QD7\".AU;___BU78 +M.]-T-(M%U&:+3%#^9H/Y7'0&9H/Y+W4(2HE5V&:)'%`Y7=AT$XU%B(V-Q24(L(_U$4.\-T!XOPZ8<"``"-3:#H^F+__XU-K,9%_`GH_,H``#/_ +M.5WLQD7\"@^&I0```#A=%W4/.%WS=`HX7@)U!3A>`W1?BTW0C46@4%?H%Q`` +M`#O##X6O````.%VX=`6*1@+K`XI&`SK#=6$X71=T-(M5U(M-H.C[;/__A,!T +M(HM%V(M-H&:+!$%F.\-U!SA=N741ZPQF/5P`=`EF/2\`=`.(716/__BT7DBTW@_T7DB3R!1SM][`^"6____SE= +MY'4TBW463___]U#(U%E(M] +M)/]U"(O/4U"-1<10BD9+4(I&25"*1DC_=2#VV/]UT!O`(T404(U&&%#H>L7_ +M_XI%%XA'%SA>2W0,.%T8QT48`0```'0#B5T8B7T0.%Y(QD7\#G1UBW7`5_]U +M&(L&:O]35O]0'(E%&&:)7;!FB5VRB5VXBP:-3;!1:BQ6QD7\#_]0((7`=0N+ +M52R-3;#H]0```(U-L,9%_`[HLY+__^MBBTW$Z.-V__^$P`^%2?___^ADA?__ +MB_"-5<3_=2BY:,Y"`%;HR?O__^MMBP>-30A15XE="(E=#/]0$(OP._-T##O[ +MQD7\!W1/B\_K1HM%P%?_=1B+"/]UY/]UX%#_41R)11@SP#O[=`J+S^@RW___ +MB5T0.5T8=0.)11B+31S_=1B+`?]0#(M-$(OP.\O&1?P'=`7H"M____^U#H[UK__UF+QHM-]%]>6V2)#0````#)PB@`58OL40^W`5:#Z`"+\G10 +M@^@1=#](=#9(="A(2'05C47\:+#C0@!0QT7\GTX"`.@_NP$`BT$(B0:+00R) +M1@2P`>L?BT$(B0:#9@0`Z_$/MT$(ZP0/MD$(F8D&B58$Z]\RP%[)PU:+\8L. +MA9(D-`````,G#N%RB0@#H;;H!`%%35HOQ,]M7B77P +MB1Z)7@2)7@B+10B)7?R+>`0[^W0RN/___S\[^'<"B\?!X`)0Z(Y9__\[^UF) +M!HE^"'84BT4(B\Z+`/\TF.BJ````0SO?6V2)#0````#)P@0` +MN(:B0@#H_KD!`%%6B_&)=?"-CJ@```#'1?P"````Z(;Y__^-3GCH?OG___]V +M,.A>6?___W8DZ%99____=ACH3EG__XM&#(/$#(7`=`:+"%#_40B+1@C&1?P! +MA+^5*-3>3H +MSU[__X-E_`"-3>3HR````(U-Y.@S````@WWH`'4*:E^-3>3HV5[__XU%Y(O/ +M4.B@7O___W7DZ'58__]9B\>+3?1?9(D-`````,G#5HOQZ`\```"$P'4):E^+ +MSNB@8___7L-35E>+^;N0SD(`BP,S]H`X`'0'1H`\!@!U^3EW!')"4(O/Z-18 +M__^$P'0V@?N@SD(`-!'!FBPA`0&:% +MR70=9H/Y+G079H/Y('3J@\,$@?NHSD(`6\,RP.OX@WD$`'0FBP%F +M@S@N=1]FBU`"9H72=`UF@_HN=1!F@W@$`'4)@V$$`&:#(`##Z0````!65S/_ +M.7D$=F.+`8TT>&:+!'AF/3H`=#9F/2H`=#!F/3\`="IF/2``+][P`` +M@\)?B\)FB09'.WD$P[BTHD(`Z'BW`0"#[!Q3,]M6BW4(A,E7B%7S#X3! +M````BP:+"#E9!'59BU8$:@%;.],/AJ8```"+2`2#>00`#X69````:@);.],/ +MAHX```"+0`AH=,A"`(L`4/\5?,%"`%F%P%EU=VH#6SE>!'9OBP:+0`R+".C( +MAO__A,!T7VH$ZPV+">BYAO__A,!T5&H!BP9;BWR8_(-_!`)V/8L'C4WD@\`$ +M4.CT6___@V7\`(U%Y%!3B\[H'&W__X--_/__=>3H15;__UEJ`E@Y1P1V"HE' +M!(L'9H-@!`"%VW0$@&7S`(M&!#O8!'*T@'T,`'5'BT8$AP`B4WP5E>+\HU-X.BI6O__ +M@V7\`#/_.7X$=A^%_W0(C4W@Z`UK__^+!HU-X/\TN.C&7O__1SM^!'+ABTWP +MC47@4.A&6____W7@Z!M5__^+1?!9BTWT7UYDB0T`````R<.AA#1#`(/X2',- +MB0R%9#-#`$"CA#1#`,-65XOQ,_\Y?B!V'8M&'(L$N(L0BT0D#(L(Z"!5__^$ +MP'4.1SM^('+C@\C_7U["!`"+Q^OWN/2B0@#H*K4!`(/L,%-6,]M7B_F)7>B) +M7>R)7?")7?R)7=R)7>")7>2+30B-5>C&1?P!Z"]B__^+30R-5=SH)&+__S/V +M.5WL#X:2````@\<B-3<3&1?P#_S2P +MZ#E;__\[=>!S,HM%W(U-T/\TL.@F6___:'S'0@#_==#_%7S!0@#WV!K`6?[` +M68A%"W0)BT70B5W49HD8B\_HYD___XU%Q(O/4.@1`@``_W70QD7\`>CQ4___ +M_W7$Z.E3__]&63MU[%D/@G'___^-3=R(7?SHVP(!`(--_/^-3>CHSP(!`(M- +M]%]>6V2)#0````#)P@@`N""C0@#H(K0!`(/L1%>->0B+S^@I`0``@V7P`(,] +MA#1#```/AM0```!35KMD,T,`BS.-3;#HX````/]V#(-E_`"-3<#H?%O__XM& +M'(U-V(E%N(M&)(E%O(L&B46PZ*-8__^-3>3&1?P!Z)=8__^+1A#&1?P"A2-3;!0C4784.A6_O___W7D +MZ`M3____==B`9?P`Z/]2__]968O/Z-1.__^-1;"+SU#H8@$``(U-S,=%_`,` +M``#H=$[___]UP(--_/_HT%+___]%\(/#!(M%\%D[!80T0P`/@C7___]>6VH` +M:%[/0`"+S^AF````BTWT,\!?9(D-`````,G#5HOQ5S/_C4X0B3Z)?@2)?@B) +M?@SHTE?__XE^'(E^((E^)(O&7U[#5E>+^8MW!(7V=!Y3BP=.BQRPA=MT#HO+ +MZ+Q-__]3Z%%2__]9A?9UY%N#9P0`7U[#4XM9!(/[`79+5HLQ5XO[@^X$T>__ +M="04B]>+SO]T)!13Z%$!``!/=>N-/)[_="04BTX$BP=+_W0D%(D/B\Z#[P13 +M:@%:B48$Z"H!``"#^P%WVE]>6\((`+@^HT(`Z%FR`0!15E>+\6H8Z*)1__^+ +M^%F)??"#9?P`A?]T'U.+70A3B\_HWU?__X/##(U/#%/&1?P!Z,]7__];ZP(S +M_XM&!(U(`8E.!(L.B3R!BTWT7UYDB0T`````R<($`+A2HT(`Z/:Q`0!15HOQ +M:BCH0%'__UF+R(E-\(-E_`"%R70,_W4(Z#@```"+R.L",\F+1@2-4`&)5@2+ +M%EZ)#(*+3?1DB0T`````R<($`(L!BPK_<1#_+?0B+\8EU\(L'C4X0B0:+1P2)1@2+1PB)1@B+1PR)1@R-1Q!0 +MZ!)7__^#9?P`@\<<5XU.'.AP````BTWTB\9?7F2)#0````#)P@0`58OL45%3 +M5E>+VHOYC30;BP2?B47\.W4(=S=S&?]U$(U&`8T4MXE%^(T,A_]5#(7`?@.+ +M=?C_=1"-%+>-3?S_50R%P'T,BP2WB02?B][1YNO$BT7\B02?7UY;R<(,`+A\ +MHT(`Z-RP`0!14U:+\3/;5XEU\(D>B5X$B5X(BT4(B5W\BW@$._MT,KC___\_ +M._AW`HO'P>`"4.C]3___._M9B0:)?@AV%(M%"(O.BP#_-)CH+/[__T,[WW+L +MBTWTB\9?7EMDB0T`````R<($`%6+[(/L$%-6BW4,5XU]\#/;5X@>_W4(BP%F +MB5WP9HE=\E)1B5WX_U`8.\-T!(O8ZQUF@WWP"W4+9CE=^`^5P(@&ZPMF.5WP +M=`6[!4``@(U-\.B9AO__B\-?7EO)P@@`_W0D!&H&Z);____"!`#_="0$:D'H +MB/___\($`+B0HT(`Z/*O`0"#["!35HOQ,]M7BWT,BT8(B77L.\-T>3A>$75T +MC57HBPA2C57D4HU5#%)J`_]U"%#_41"%P'59@WWH4753BW7DT>Y..W<(=@A6 +MB\_H5E+__XL/._-V+8EU\(M%#&:+`(-%#`)F/2\`=05J7%CK"V8]7`!U!;A< +M\```9HD!04'_3?!UUF:)&3OSB7<$=7F+=>QFB5W49HE=UHE=W(L&C5744FH# +M_W4(BPB)7?Q0_U$8B_`[\W0,C4W4Z*V%__^+QNM69H-]U`AU$3E=W'0]_W7< +MB\_H85;__^L.9CE=U'4KBP>)7P1FB1B#3?S_C4W4Z'>%__\Y7P1U#HM-[%?_ +M=0CH)````.L1,\#K#8U-U.A8A?__N`5``("+3?1?7EMDB0T`````R<((`+BD +MHT(`Z,"N`0"#[!!35E>+?0R+50@SVXL'B5\$B_%FB1B-10^+#E#HA?[__SO# +M=5DX70]U4HU&,(O/4.@%5?__9HE=Y&:)7>:)7>R+-HU-Y%%J!?]U"(L&B5W\ +M5O]0&#O#=`2+\.L^9H-]Y`AU+(O/Z(96____=>R+S^@85___C4WDZ+J$__\S +MP(M-]%]>6V2)#0````#)P@@`9CE=Y'3?O@5``("-3>3HE(3__XO&Z]A5B^Q1 +M5HOQ_W4,_W4(Z`K^__^%P'4O.$83="@@1?^+#HM5"(U%_U#HXOW__X7`=14X +M1?]T#HM-#&C`SD(`4.CG6/__,\!>R<((`%-6BW0D$%>+V8L&@&88`(-F!`"- +M?AAF@R``@TX<_XU.#.C`2___BPN+5"005^B$_?__AAO____A6\((`+BXHT(`Z&>M`0"#[!!3,]M6 +M5V:)7>1FB5WFB5WLBWT0BW4,C57DB5W\B!^)'E*)7@2+`6H'_W4(BPA0_U$8 +M.\-T!(O8ZT@/MT7D*\-T3(/H$70N2'0E2'082$AT![L%0`"`ZRJ+1>R)!HM% +M\(E&!.L:BT7LB0:)7@3K$`^W1>SK!`^V1>R9B0:)5@3&!P&-3>3H4X/__XO# +MZPJ-3>3H1X/__S/`BTWT7UY;9(D-`````,G"#`"XS*-"`.BRK`$`@^P04U97 +MBWT,,]N+\8D?B5\$9HE?"(A?"HA?"V:)7>1FB5WFB5WLBP:-5>12:@S_=0B+ +M"(E=_%#_41@[PW0$B]CK9&:#?>1`=46-1>2+SU#HX+G__V8Y7PAU3(U-Y.A# +M@___BS:-3>11:BC_=0B+!E;_4!@[PW7'9H-]Y!-U*(M%[#O#=0-J%UAFB4<( +MZQAF.5WD=`>[!4``@.L+.%Y/=`:#QD2EI:6-3>3H>X+__XM-]%^+PUY;9(D- +M`````,G""`!5B^Q1A=)T`X`B``^W`8/H`'0J@^@3=!E(2'05C47\:+#C0@!0 +MQT7\GTX"`.C?JP$`A=)T`\8"`8M!",G#,\#)PS/`B4$0B`&(00&(00*(00.) +M002)00B)012+41B)01QFB0*)02B+221FB0'#N/BC0@#H>:L!`(/L&%-6B_$S +MVU>+1FB+3FPK10R-?E")7EB(7F`;31")1G")'XE>7(E.=(U.>(E?!.B5____ +M9HE=W&:)7=Z)7>2+10B-5=Q2:D>+"%")7?S_42`[PXE%\'00C4WXU-W.@5____C4WB5WDBT4(C57<4FHWBPA0QT7\ +M`@```/]1(#O#B47P=!"-3=SH\H#__XM%\.E+`0``9CE=W'0;9H-]W`B+1>1T +M!;CXSD(`4(V.D````.AI4/__C4W<(M=\(F.B````!O"B5YTQD9X`8F&C````.L..]!R"G<$._EV!,9&>0$S +MP(M-]%]>6V2)#0````#)PA``N`RD0@#H#*D!`(/L$%-6BW4,,]M79HE=Y(@> +M9HE=YHE=[(L!C7WD5U)1B5W\_U`@.\-T!(O8ZTL/MT7D*\-T3X/H`W0O@^@0 +M=!U(=`I(=`>[!4``@.LLBT4(BTWLB0B+3?")2`3K&8M%"(M-[(D(B5@$ZPR+ +M1>R+30B9B0&)403&!@&-3>3H`W___XO#ZPJ-3>3H]W[__S/`BTWT7UY;9(D- +M`````,G""`"X(*1"`.ABJ`$`@^P04U:+=0PSVU=FB5WDB!YFB5WFB5WLBP&- +M?>174E&)7?S_4"`[PW0$B]CK2P^W1>0KPW1/@^@#="^#Z!!T'4AT"DAT![L% +M0`"`ZRR+10B+3>R)"(M-\(E(!.L9BT4(BTWLB0B)6`3K#(M%[(M-")F)`8E1 +M!,8&`8U-Y.A9?O__B\/K"HU-Y.A-?O__,\"+3?1?7EMDB0T`````R<((`/]T +M)`R+1"0(_W0D#(L(Z`<```"%P'4`P@P`N"RD0@#HGJ%0``,\#K"[B`BTWT7UYDB0T` +M````6\G""`"X:*1"`.A4IP$`@^Q04U97B_DSVXL'.\-T"(L(4/]1"(D?BT<( +M.\-T"8L(4/]1"(E?"(M'##O#=`F+"%#_40B)7PR-3WCH9?O__X./A````/^` +M9Q``B9_8````C5<8C4VDB9_<````Z")8__^-3;")7?SHP$O__VHNC4VDQD7\ +M`>C84/__.\-\$(M-I(U$00*-3;!0Z-U,__^)7;R)7<")7<2+=0C&1?P"B5WP +MBP:+0`P[PW02@_C_=@.#R/]0Z/!%__]9B47PBPXSP,9%_`,Y60QV#XM-\(`D +M"`"+#D`[00QR\8!^'@!T#HM&((E%T(M&)(E%U.L*QT70``"``(E=U(M>"(7; +MB5WD?">-3;SHLD'__XM%P(M-O/]%P,=%Z`$```")'(&+1?#&!`,!Z;L```"+ +M!C/;B5T(.5@,#X:`````BT`(@'\7`(L$F(E%X'4&@'X9`'44BT7@NA3/0@"+ +M2!#HBT;__X3`=4^+3BS_<01J`%/HUQ0``(7`?3V+3>"-1;!0Z&WP__^%P'P9 +MBT4(_T4(4U"-3;SH2!0``(M%\,8$`P'K%(U-O.@70?__BT7`BTV\_T7`B1R! +MBP9#.U@,B+10B% +MP'0#B47HBUXP@V78`(-EW`"%VW0@B\OH@JC__X7`=0Z-5=B+R^B!J/__A1\!HM- +MZ(E-X#E%X(E%[`^&5`$``(M%O(M-[#/;BP2(B4<\BT8X.\-T$XL(C5784E-0 +M_U$,.\,/A6L!``"+3C`[RW0-Z`"H__\[PP^%5P$``(E="(U%"(O/4,9%_`3_ +M=SQ6Z/G\__\[PXE%Y`^%/0$``(M%"#O#=0G&1?P#Z=@```"+3C`[RW0>BU70 +M_W8XB57(BU74C5W(B57,BQ!345#_4@R+V.L\B5WDBPB-5>12:+#%0@!0QD7\ +M!?\1BT7D.\,/A`$!``#_=C2+"%#_40R+V(M%Y(7`QD7\!'0&BPA0_U$(4VH` +M:@"+S_]U".BM^/__A<")1>0/A08!``"#^P$/A2D!``"`?WL`C4=X=`F$6`1U +M!(K;ZP(RVX-][`!U*8-]Z`%U(XM//%")CX0```"-CZ@```#H4@$``(!^&@!U +M"(3;#X70````BT4(QD7\`X7`=`:+"%#_40C_1>R+1>P[1>`/@JS^__\S]CDW +M=0-J`5[_=?#H,4/___]UO.@I0____W6PZ"%#____=:3H&4/__X/$$(O&BTWT +M7UY;9(D-`````,G"!`"+V.FT````BT4(QD7\`SO#=`:+"%#_40B+7>3IFP`` +M`(M%",9%_`,[PW0&BPA0_U$(_W7PZ,I"____=;SHPD+___]UL.BZ0O___W6D +MZ+)"__^#Q!"X`4``@.N4BT4(QD7\`X7`=`:+"%#_40B+7>3K2HM%",9%_`.% +MP'0&BPA0_U$(:@%;ZS2%VW03BT4(QD7\`X7`="6+"%#_40CK'?]U"(O/Z#(1 +M``"+10C&1?P#A+?"0,B_&*!XU.&(@&BD+\?]U".C"^O__ +MA<`/A"(7`=`F+"%#_40B#(P"+1@R-?@R%P'0) +MBPA0_U$(@R<`BP93:)#%0@!0BPC_$8L&5VB@Q4(`4(L(_Q&+#HU&$5!J0EKH +MB`$``#/;.\,/A6T!``"+#HU&$U!J05KH<`$``#O##X57`0``BPZ-1A10:C]: +MZ%H!```[PP^%00$``(L.C4854&I`6NA$`0``.\,/A2L!``"+#HU&%E!J6UKH +M+@$``#O##X45`0``BPZ-1A)0:EU:Z!@!```[PP^%_P```(U6&(U-Z.AO4O__ +MC4WB-1$$"C4W<4.@J1___ +MBT8PC7XPB5\$9HD8BW8\._,/C)P```"+10B+`(M`"(LTL#E>('50C4VXZ+Q% +M__^+\(U-Q,9%_`+HKD7__U90C57HC4W0QD7\`^AJT___4(O/QD7\!.@T1___ +M_W70Z#E`____=<3H,4#___]UN.@I0/__@\0,ZSR-1=R+SE#H*.O__SO#?0(S +MP(M.'(U5Z(L$@8U(#%%0C4VXZ!K3__]0B\_&1?P%Z.1&____=;CHZ3___UG_ +M==SHX#____]UZ.C8/___65DSP(M-]%]>6V2)#0````#)P@0`58OL@^P04U:+ +M=0A7,]N-??"('HL!5U)19HE=\&:)7?*)7?C_4"`[PW0$B]CK'6:#??`+=0MF +M.5WX#Y7`B`;K"V8Y7?!T!;L%0`"`C4WPZ%]V__^+PU]>6\G"!`"XXJ1"`.C4 +MGP$`@^PP4U97,_^+\8E]\(E]_(E][(M=",9%_`&)?>B`>T``="UJ".C_/O__ +M.\=9=`N)>`3'`"S/0@#K`C/`4(U-[.CO#0``BT7LB4,TZ8\````Y>S`/A88` +M``!J8.C)/O__68E%"#O'QD7\`G0)B\CHCHKPT` +M`(U&)(U.&%#HOT7__XM&&(!G5`!0C4\8Z,=J__^$P'4PZ&IH__^`9?P`B_"+ +M1>R%P'0&BPA0_U$(BT7P@TW\_X7`=`:+"%#_40B+QND8`@``BT7PB4,PQD87 +M`5.+SNBS_/__@&87`(OX@_\!#X73`0``@WWH``^$R0$``(-[/``/A+\!``"` +MOJL`````=`R$AJP````/A*H!``"+1BB#^`0/AC\!``"+1BB+3B2-?B2Z),]" +M`(U,0?CH)C___X3`#X0@`0``BT8HB\^#P/Q0C4704.BIM/__BP.#90@`QD7\ +M`X-X#``/AO$```"+0`B+30BZ%,]"`(L\B(M/$.CB/O__A,`/A<(```"-1="- +M3=Q0Z.9#__^-3=S&1?P$Z&!&__^-1<2+SU#HKP$``%"-3=S&1?P%Z#!'____ +M=<3&1?P$Z),]__]9C7X8C47+2SSH*P$``(3`=#>+1>B+/U>`8%0`C4@8 +MZ$II__^$P'0ABT7PC8ZH````B4,P@TD,_^CN\?__4XO.Z%O[__^%P'1._W7< +MQD7\`^@./?__6?]%"(L#BTT(.T@,#X(/_____W70Z/0\__]9BT7L@&7\`(7` +M=`:+"%#_40B+1?"#3?S_AR` +M9?P`A+3?1?7EMDB0T````` +MR<($`%:+="00:A!H$.!"`/]T)!2#)@#HY)P!`(/$#(7`=0V+1"0(B0;_0`0S +MP.L%N`)``(!>P@P`5HOQ:@'_="0,C4Y@Z#M>__^$P'02BX:`````P>@$J`%U +M!6H!6.L",\!>P@0`58OL48-E_`"#>2``=0J+30CH-T'__^L-BT$R0`@``4U97B4WLZ+[___^+70B+0RB+0`2#^"!R +M"K@!0`"`Z1<%``"#9>``C8UD_?__C7L(Z!;:__^+\(M#*&H(@\`$6?.E@S@! +MPS_XM*!#O/=7&-C83]___H*P4``(US +M1(V-J/W__U:)??SHL4'__U:-C9S]___HI4'__X.-Q/W___]3C8V$_?__Z#C[ +M__^+\#OW#X72`@``BTWLZ&LV__^+3>R-A83]__]0Z!H*``"#3?S_C8V$_?__ +MZ-[@___I\_[__XL2.0B+=(K\B76T=@?'1>`!0`"`9HE]O&:)?;Z)?<2+!HU5 +MO%)J`8L(4,=%_`$```#_42`[QP^%I0(``&:#?;P3#X5Q!```BT7$C56XB47< +MBP924(L(_U$4.\0/A>L#```[QP^$XP,``(E]Z(L(C57H4FB@PD(` +M4,9%_`3_$3O'BT7H#X6*`P``.\) +M1>`/A0$"``"+0S@[QW0YB7W8BPB-5=A2:'#%0@!0QD7\!O\1BT78.\=T#_^U +M?/[__XL(4/]1#(M%V#O'QD7\!70&BPA0_U$(B;6D_O__B7W,B7W0B7W4C8UD +M____QD7\!^A2U___BP-J"(F%9/___XI%"UF-R- +MA63^__]0Z+P'``#_=:CH&#C___]US.@0./__6<9%_`19C8UD_O__Z&[>__^+ +M1>C&1?P#A3&1?P".\=T!HL(4/]1 +M"(M%\(--_/\[QW0&BPA0_U$(BT7@Z=````"-C63^___&1?P$Z)#=__^+1>C& +M1?P#.\=T!HL(4/]1"(M%Y,9%_`([QW0&BPA0_U$(BT7P@TW\_SO'=`:+"%#_ +M40B+1>#IA@```(MU[(V%W/[__U"-3C#HMO3__XV%?/[__XU.)%#HN#W___]U +MJ.B]-O___W7,Z+4V__]9QD7\!%F-C63^___H$]W__XM%Z,9%_`.%P'0&BPA0 +M_U$(BT7DQD7\`H7`=`:+"%#_40B+1?"#3?S_AC&1?P#A3&1?P" +M.\=T!HL(4/]1"(--_/^+1?`[QP^$6O___XL(4/]1".E/____QD7\`NO6@TW\ +M_^OAC4V\Z)EL___I-O___[B=I4(`Z!*6`0!14U:+\3/;B77PB1Z)7?R)7@2) +M7@B)7@R-3AC&1?P#B%X1B%X2B%X3B%X4B%X5B%X6B%X7Z+(Z__^-3B3&1?P$ +MZ*8Z__^-3C#&1?P%Z)HZ__^-3GC&1?P&B5Y$B5Y(9HE>3(A>3HA>3^B>U/__ +MC8ZH````QD7\!^B/U/__BTWTB\9>6V2)#0````#)P[C2I4(`Z'R5`0"#["A3 +M5E>+^3/;:+@```")7QB)7QSHMS3__UF)1?`[PXE=_'0+B\CH>`$``(OPZP(S +M]H--_/\[\XEU\'0&BP96_U`$BT4,C4WDQT7\`0```(E&1.C].?__C4W8QD7\ +M`NCQ.?__BUT(QD7\`X-[,`!U4X![0`!U38M+1(U%V%"-5>3HBU+__XU%V(O. +M4(U%Y%#H:[O__X7`B44,=#;_==CH833___]UY.A9-/__@TW\_UF%]EET!HL& +M5O]0"(M%#.G/````BTM$BU8(C48(45#_4@Q3B\^)_C__XO8BD89 +MA=N(1R%T)_]UV.@1-/___W7DZ`DT__^#3?S_687V670&BP96_U`(B\/I@``` +M`#/;.5XL=E>+1BB`/!@`=$B+1AR-5>2-3CLO/__BTWTQP:$ST(` +MQT8$<,]"`,=&"&#/0@#'1@Q0ST(`QT80/,]"`(O&7UYDB0T`````R<-5B^Q6 +MBW405XM]#(,F`&H0:!#@0@!7Z!&3`0"#Q`R%P'4'BT4(B0;K=&H0:"#%0@!7 +MZ/:2`0"#Q`R%P'3E:A!H4,5"`%?HXI(!`(/$#(7`=0J+10B+R(U0!.LZ:A!H +M<,5"`%?HQ)(!`(/$#(7`=0J+10B+R(U0".L<:A!H\,1"`%?HII(!`(/$#(7` +M=1>+10B+R(U0#/?9&\DCRHD._T`4,\#K!;@"0`"`7UY=P@P`5HMT)`C_3A2+ +M1A1U%(7V=`Z+SN@-````5NC",?__63/`7L($`+AJID(`Z"B2`0!15HOQB77P +MC8Z8````QT7\!0```.BFPO___[:(````Z(TQ____=E3HA3'___]V2.A],?__ +M_W8TZ'4Q____=BCH;3'__X--_/^#Q!2-3ASH9^```(M-]%YDB0T`````R<-6 +MBW0D#%=6_W0D$.@R_/__A?:+^'0+BP:+SO]0#(7`=0*+QU]>P@@`5E>+?"0, +MB_&%_W0&BP=7_U`$BP:%P'0&BPA0_U$(B3Z+QU]>P@0`5E>+\>C7+/__BTPD +M#(L&B]&+^6G2____/P-6!,'G`L'B`E*-%#B-1(@$4E#_%6C!0@"+!HM,)!R# +MQ`R)#`?_1@1?7L((`%:+\5>+1@2+#HM\@?R%_W0.B\_H$]?__U?HGC#__UG_ +M3@1?7L.+5"0(5HMT)!!7.]9T'8LYC00RT>B+#(B0R"BTWT9(D-`````,G" +M!`"XW:9"`.B`D`$`45-6BW4(B]E7B5WPBP:%P(D#=`:+"%#_402+1@2#9?P` +MA<")0P1T!HL(4/]1!(M&",9%_`&%P(E#"'0&BPA0_U$$BT8,QD7\`H7`B4,, +M=`:+"%#_402*1A"-2QB(0Q"*1A&(0Q&*1A*(0Q**1A.(0Q.*1A2(0Q2*1A6( +M0Q6*1A:(0Q:*1A>(0Q>-1AA0QD7\`^B6-?__C48DC4LD4,9%_`3HAC7__XU& +M,(U+,%#&1?P%Z'8U__^+1CR#QD2)0SR+1OR->T2)0T"EI:6+=0B-2WC&1?P& +MBT90B4-0BT94B4-4BT98B4-8BT9-3B3H +M)1@S_TX-E\`"# +M?G@`=B.+1G2+3?"+!(C_<`QJ`&A#`0``_W80_]/_1?"+1?`[1GARW8-^>`%W +M*X!^;0!J9_]V!'01_Q7\P4(`:@!0_Q7PP4(`ZP__%?S!0@!J`%#_%=3!0@"+ +M3GB+1G`[P7,-:@!0:$X!``#_=A#_T[$!Z.M;``!0:@%H`Q```/\W_],RR>C8 +M6P``4&H`:`,0``#_-__3NNP#``"-3<#HXO[__XL`@V7\`&ID4&H`B\_H"G+_ +M__]UP(--_/_HA"S__UFZ]`,``(U-P.BV_O__BP!J`5EJ9%")3?Q1B\_HW7'_ +M__]UP(--_/_H5RS__UFZ[P,``(U-P,=%J`(```#'190/````QT68`0```,=% +MG&0```#H;?[__XM%P(E%H(U%E%!J`FAA$```_S?_T_]UP.@0+/__QP0D)-!" +M`&H`B\_HKW'__V@`T$(`:@%J`(O/Z-9Q__]H\,]"`&H":@"+S^C&+RU#HD3+__XU-Y.B.,/__C4WDC49@45!7B\['1?P"````Z"$$ +M``"$P'4)4XU.8.@-,O__C5Y@C4W84^@Q,?__C47DB\Y0C4784,9%_`/H]`4` +M`(7`='"+3>0SP(E%Z&:)`3E&9'1@C4W,Z"\P__^-3;3&1?P$Z",P__^-1;2+ +MSE"-1-3>3H7C'__X!^;0!?6W0(C4WDZ'58____=>3_=@S_%=#!0@!J`&@"``$` +M:"@!``#_=@3_%=C!0@#_=>3H,BK__UFP`8M-]%YDB0T`````R<-5B^R#["Q3 +M5HU%Y%=0B_%J;NBA:___:@%J`/]V!/\5S,%"`(M]#(U%U"M]Y%!J98O.Z(%K +M__^+1>!J`2M%V(O.4(O'*T744/]UV/]UU&IEZ.9K__^-1?R+SE"-1?A0:@+H +M$6O__XU%_(O.4(U%]%!J`>@`:___BT40:@$K1?S_=?R+WXO.*T7H_W7X*UWX +M4(E%#%-J`NB@:___*UWT:@'_=?R+SBM=Y/]U]/]U#%-J`>B%:___C474B\Y0 +M:F;H]6K__XM=X(O'*UW8*T74:@%34(M%Z(M-#`/#T>`KR%'_==3_=@S_%?3! +M0@"-1=2+SE!J9^C`:O__BT7@:@$K1=A0B\A0_W74_W80 +M_Q7TP4(`C474B\Y0:F3HCVK__XT$&RM]U(O(BT7H:\#]*\%J`2M%V`-%#%!7 +M_W78_W74_W8(_Q7TP4(`7UXRP%O)P@P`@7PD!`&```!U">CN"0``L`'K$?]T +M)`S_="0,_W0D#.@::/__P@P`58OL@WT(`74/@WT,9W4)Z*P(``"P`>L._W40 +M_W4,_W4(Z'QH__]=P@P`5HOQBTPD#(L!.T8(#X6K````BT$(@_B4=VQT0CUE +M____=!F#^(YT!8/XD^MH@#U@,$,```^$@P```.MF4U&+SNA^````:@!J`&@! +M@```BMC_=@3_%=C!0@"*PUOK88M)$#M.3'4,@'Y0``^4P(A&4.L+A#^/MT('8P@_C]=@>#^/YT%.LD@#U@,$,``'4;B\[H +M*@L``.L2:@!J`&@!@```_W8$_Q78P4(`,L!>P@@`5HOQ:A'_%@/#[=)#"0!@_D(="2#^5)T$H/Y=G0$,L#K'XO.Z%,)``#K%(3`=.^+SNB4 +M!P``ZP>+SN@M"```L`%>P@0`BT0D!%:#Z&Z+\70<2$AT#_]T)`S_="0,Z&5G +M___K&XO.Z!$)``#K!XO.Z/@'``#_=@C_%<3!0@"P`5[""`!6B_%7BWX(_Q7` +MP4(`.\>+SG4'Z&P*``#K!>A9"P``7U[#N$2G0@#H)7P1FB1B+11")6`2+`&:)&#E>!'0.B]:#P53HTS/__X3`=`0RP.MY +M5HU-Z.C>+/__BTWHBT7LB5W\9HM40?YF@_I<=`9F@_HO=0Y(B47L9HD<08M% +M[(M-Z#O#=#MFBT1!_F8]7`!T,&8]+P!T*HU-Z.@7,?__B_"+ST96_W7HZ+,M +M__^+1>B+31"-!'!0Z.@L__^+3>BS`5'H3B;__UF*PXM-]%]>6V2)#0````#) +MP@P`BU0D"%-65XOYBTPD$#O*=06\(( +M`(M4)`B+1"0$4S+;5H/Z`HOQX@!`+-'ZRR%TG<' +M/0!`G`!R#&H46>ADB`$`LTWK%872=P<]$"<``'(*:@I9Z$V(`0"S2U*+SE#H +M1R3__X3;=!MFQP`@`$!F#[[+0&:)"$!`9L<`0@!`0&:#(`!>6\((`+B3IT(` +MZ'2%`0"![$@!``!3B]E65XU-P.A(D@``BT4(@&7O`(L]',)"`#/V.7`$B77\ +M#X28`0``BQ7@R$(`BPCHL"7__X3`#X6#`0``.7-XB77H=%Q65FA&`0``_W,0 +M_]<[QGY,5E9H1P$``/]S$/_7.T-X+!KIXR$(`BP"+".A+)?__A,!U`XEUZ(U-S.AG!``` +MC4W0QD7\`NB2*?___W4(C4W,QD7\`^@63/__C8U4____Z,]"__^-C7S____H +M;2G__\9%_`2-1>Z-3-3<#HAA___XV%5/___XU-P%#HGQ`` +M`.E[____Z$9-____M7S___^+\.B"(____W70Z'HC__]968U-S.@S0___@TW\ +M_XU-P.B]#P``B\;I/P,``/^U?/___^A2(____W70@&7\`.A&(___65F-3B)D```C4WCO2___A,!U#.C-3/__B_#I +MQP```#EUX(EU\'9:BT7`$``.L9O@5``("`9?P`C4W`0`=!2+$(M-W.C.,?__ +MAL4_W6,BT7PC4L@_W`@Z&A.``")1;0SP#E%M'T# +MB46TC4V845!H31```/\V_]>+3?`SP(/!&&:)A:S^__\Y001U!#D!=`UJ_XV5 +MK/[__^A?6___C86L_O__B\Y0:@'_=0CH&V?__XM%\&:#I:S^__\`BT@@P>D$ +M]L$!=1#_<`2-C:S^____,.B'^___C86L_O__B\Y0:@+_=0CHXF;___]UC.CT +M(/___W7<@&7\`.CH(/___T4(68M%"%D[0Q@/@J#^__]J`&H`:`00``#_-O_7 +MAAH*Q```/\V_]=H +MG@!!`%-H,!```/\V_]6V2) +M#0````#)P@@`:@%J_V@,$```_S'_%1S"0@##_W0D"(M,)!#_="0(Z+#Y___" +M#`"+P8,(_\.XL*="`.A.@`$`@^P<5HOQ5XU-Y.@8)?__@V7\`&H"C7X(:O]H +M#!```/\W_Q4B+SE"-1=Q0C49@4,9%_`'H +M_O?__X3`=!:-1>B+SE"-1=Q0Z.KY__^+SN@?````_W7HZ.(>____==SHVA[_ +M_UE97HM-]&2)#0````#)PU6+[(/L$%:+\5=J`HU^"&K_:`P0``#_-_\5',)" +M`(7`?0N`?FT`='#_=F#K8HU-_%%0B\_HT6/__X3`=`B+1?R#^/]U#8!^;0!T +M36A@T$(`ZSV+3A2+!(&+2"#!Z03VP0%T*8!^;0!T+VIL,_W`H_W8,_Q70P4(`7U[)P[CXIT(`Z)Q^ +M`0"#["135E>+^8U-Z.AE(___@V7\`(U-W.A9(___B_>-1P3WWAOVC57<(_#& +M1?P!BP[H,@@``(-]X`!T(HU?8(U%Z%"-5=R+R^C;!0``A,!U%?]UZ(L.:GM: +MZ+T```#_==SIEP```/]UW(!E_`#HM!W__X-][`!9=0W_=>CHI1W__^F%```` +MC4W0Z.@B__^+"XM5Z(U%T,9%_`)0Z"U0__^$P'16BTW0Z*,X__^$P'45_W70 +MBS;H(T?__XO0B\[H6````.LL4XU-W.A[(___C47HB\]0C47<4,9%_`/H/OC_ +M_XO/Z'/^____==SH-AW__UG_=PC_%<3!0@#_==#H)!W___]UZ.@<'?__65E? +MBTWT7EMDB0T`````R<.X#*A"`.AX?0$`@^P,5HOQC4WHZ)5(``"#9?P`@WT( +M`'03C4WHZ/\E__^-3>C_=0CH&R;__XM5Z(O.Z!@```#_=>CHQ!S__UE>BTWT +M9(D-`````,G"!`!J$&CDST(`4E'_%=S!0@##N"BH0@#H$7T!`(/L'%:+\5=J +M`HU^"&K_:`P0``#_-_\5',)"`(7`#XRY````C4WP45"+S^BJ8?__A,!T"(M% +M\(/X_W4,B\[H&?W__^F5````BTX4BSR!BT<@P>@$J`%U#X!^;0!U?XO.Z(8` +M``#K=HU&8(U-Y%#H2R+__X-E_`"#QRA7C4WDZ*DE__^-3>3HVS'__XU-V.A8 +M(?__4(U%Y%"+SL9%_`'H\?;___]UV(!E_`"+^.CJ&___A?]9=!?_=>2+QO?8 +MC4X$B]<;P"/!BPCHP_[__XO.Z/S\____=>3HOQO__UF+3?1?7F2)#0````#) +MP[A$J$(`Z!U\`0"#[!A6B_&-3>CHZ"#__X-E_`"-1>A0C4X,Z)I:__^-3=SH +MT"#__XM.8(M5Z(U%W,9%_`%0Z!1.__^$P'4L_W7HB\:#Q@3WV!O`:GLCQEJ+ +M".A&_O___W7CH01O__UE9ZU)7C;Z`````C47+S^@X2?__:@!J`&A'`0``_W80_Q4+?0B)3>R+!C/;B57PB5X$B\]FB1CH/4O__X3`=2@SR68Y'W02 +MB\=!0$!F.1AU^('Y!`$``',/BU7PBTWL5E?H:%?__^MBC8U4____Z&@````Y +M7?")7?S&1<$!=`O_=?"-3>#H[R#__SO[=`E7C4W4Z.(@____=>R-C53___]J +M7^AE7___@_@!=0V-1=2+SE#H)B'__[,!@TW\_XV-5/___^B3`0``BL.+3?1? +M7EMDB0T`````R<((`+BUJ$(`Z'QZ`0!14U:+\3/;B77PB5X$QP:@T$(`B5X( +MB5X,B5X0B5W\B5X4B5X8B5XB?````C4Y4QD7\`N@5'___C4Y@ +MQD7\`^@)'___@TYP_XA>;(A>;8E>=(E>>(E>?(V.@````,9%_`7HYQ[__XV. +MC````,9%_`;HV![__XM-],<&:-!"`(O&7EMDB0T`````R<.P`<,RP,(,`#+` +MPS+`P@@`:@'_<03_%;C!0@##:@O_<03_%;C!0@##:@+_<03_%;C!0@##:@C_ +M<03_%;C!0@##B\$SR8D(B4@$B4@(B4@,B4@0B4@4B4@8B4@AY````]D0D"`%T!U;H^QC__UF+QE["!`#'`=C00@##]D0D!`%6B_''!MC0 +M0@!T!U;HUQC__UF+QE["!`"XTZA"`.@]>0$`45:+\8EU\(U.&,=%_`$```#H +MN<<``(!E_`"-3@SHK<<``/\VZ)T8__]97HM-]&2)#0````#)P[@4J4(`Z/QX +M`0!15HOQB77P_[:,````QT7\!````.AL&/___[:`````Z&$8__]968U.=.CF +M!```_W9@Z$\8____=E3H1QC__UG&1?P!68U.(.AI____@&7\`(U.%.B&!``` +MBTWTQP;8T$(`7F2)#0````#)PU:+\>@>____]D0D"`%T!U;H!1C__UF+QE[" +M!`"X6ZE"`.AK>`$`@^Q\4XM="%97BP.+^3/V4HES!(U-X&:),.CY'?__:EQJ +M+XU-X(EU_.@>)/__C4W(Z`\=__^+3>#&1?P!Z+)(__^$P'08BTW@Z#9(__^$ +MP'47BTW@Z`Q)__^+\.LVBP_H'TC__X3`="*-1>"+RU#H=![___]UR.AY%___ +M_W7@Z'$7__]96>EQ`0``5XU-R.A4'O__C46\5E"-3>#H_(W__U"+R\9%_`+H +MV2#__\9%_`'_=;SH/!?__UG&10L!C4W4Z'\<___&1?P#.W7D#X0.`0``BT7@ +MC3PV9KI<`(T,!^@<%___AQ]!8M%Y.L#BT7L*\:- +M3=10BT7@`_A7Z"\>__^`?0L`#X2+````C8UX____Z'8U__^-3:#H%QS__U.- +M5/___\9% +M_`;HLSC__XA%\_]UO.B&%O___W6PQD7\!.AZ%O__@'WS`%E9=`R+19C!Z`2H +M`71`ZP2`90L`_W6@QD7\`^A6%O__@'T+`%EU"(U-U.AA````C474B\M0Z,T? +M__^+=>R%]GPAB\M&Z/@K___I_?[__XU%X(O+4.@0'?___W6@Z!46__]9_W74 +MZ`P6____=BQ%FBW1"_F:#_B!T!F:#_BYU"TB)001F@R1"`.O;7L.X<*E"`.@K +M=@$`@^P\4U:+\E>+^3/;BP:)7@2-3;AFB1CH9````(U5Q+F<&```B5W\Z#I1 +M__^-5="YGA@``.@M4?__C57A-&O__C4XDQD7\`NA!&O__BTWTB7XPB7XTB7XXQP80T4(`B\9?7F2)#0`` +M``#)P[C-J4(`Z#]U`0!15HOQB77PC4XPQT7\`P```.B[PP``_W8DZ*H4____ +M=ACHHA3___]V#.B:%/__BTWT@\0,QP;8T$(`9(D-`````%[)PU:+\>BJ____ +M]D0D"`%T!U;H;Q3__UF+QE["!`!5B^Q35HMU"(O9._-U!(O#ZU*+R^BS`0`` +MBW8$.W,(=B6!_O___W]V%8U%"&BPXT(`4,=%".4'``#HP70!`%:+R^C'$/__ +M5S/_A?9V%(M%"(O+BP#_-+CH$@$``$<[_G+LB\-?7EM=P@0`N.*I0@#H:W0! +M`%%65XOQZ,@/__]J..BO$___B_A9B7WP,\`[^(E%_'01B\_H=#+__XU/*.@5 +M&?__B\>+3@1?C5$!B58$BQ9>B02*BTWT9(D-`````,G#5E>+^8MW!(7V="!3 +MBP=.BQRPA=MT$/]S*.B)$___4^B#$___65F%]G7B6_\WZ'43__]97U[#N/2I +M0@#HWG,!`%%65XOYB7WP@V7\`(MW!(7V=!.+!TZ+#+"%R73R:@'H&````.OI +M_S?H.A/__UE?BTWT7F2)#0````#)PU:+\>@4````]D0D"`%T!U;H%A/__UF+ +MQE["!`!6B_'_=@SH!!/__UF+SN@%P@``7L.X"JI"`.AG+^8MW!(7V=!Y3BP=. +MBQRPA=MT#HO+Z&`O__]3Z'D2__]9A?9UY%N#9P0`7U[#4XL=_,%"`%97B_%J +M9?]V!/_3_W8,BSW0P4(`B48(_W8$_]=J9/]V!/_3_W884/_7_W8D_W8(_]Q74(U%^%"+V6H(Z*Q2__^-1?R+RU"-1?10:@+H +M*5/__XU%_(O+4(U%\%!J`>@84___BWT0BW4,*WW\*W7TC4,$:@$K?>PK=?AJ +M`(E%$/\P_Q7,P4(`:@&+R_]U_/]U]%=6:@+HI5/__RMU\&H!_W7\B\LK=?C_ +M=?!75FH!Z(Q3__^+1?@#P(O(BT4,*\&+31!0_W,(Z`D```!?7C+`6\G"#`!5 +MB^R#[!B-1>A64(OQ_W4(_Q4`PD(`BT7HB47XBT7LB47\C47X4/\V_Q7XP4(` +MBT7T:@$K1>Q0_W4,_W7\_W7X_W4(_Q7TP4(`]]@;P%[WV,G""`!6B_&-1B2- +M3@A0Z`)0__]J`?]V!/\5N,%"`%[#5HOQ_[:4````QP;4QT(`QT8$P,="`,=& +M"*S'0@#'1@R0,``"-5F3H#4S__XU6<+GF#```Z`!,__^-5GRY_0P``.CS +M2___:'310@"-CH@```#H01C__X-F*`"`9A\`7L/_="0$QD$?`8M)5('!6`$` +M`.A.%P``P@0`5HOQZ!L,``#_="0(B\[HU/___U["!`"+1"0$_W0D#(M(5/]T +M)`R!P5@!``#H_A4``#/`P@P`BT0D!/]T)`B+2%2!P5@!``#H.18``,((`(M) +M3('!6`$``.F"%0``,](X411U,SE4)`1T!L9!$@'K`XA1$HM$)`@[PG09QD$3 +M`?]P!(M)3/\P@<%8`0``Z)T5``#K`XA1$S/`P@@`5HOQ5[]8`0``@'X4`'47 +MBT0D#(7`=`__<`2+3DP#S_\PZ)@5``"+3DP#S^@3%0``7U[""`#_="0$C4$( +MBTD(4/]1#,($`%6+[(/L8%-6C4V@Z#T!``"+11`SVSO#=06(7;'K#XL(BT`$ +MB4W`B47$QD6Q`8M%%#O#=06(7;#K#XL(BT`$B4VXB46\QD6P`?]U#(U-R.AH +M%?__BT4-3?#_=1CH(A7__XMU"(M^5(I&((A%VHV/4`$` +M`.B#8@$`BX]4`0``Z+AA`0"+=E1?._-T!8U&!.L",\#_,(U-H&BL#0``Z'53 +M__]J`EDKP71/:@1:*\)T/TAT-2VQ`0``="-(=!4M^`L``'0'O@5``(#K.XM% +M)(D0ZR*+123'``,```#K%XM%),<``0```.L,BT4DB0CK!8M%)(D8,_;K#HM% +M)+X$0`"`QP`%````C4V@Z)$```"+QEY;R<(@`+@GJD(`Z$QN`0!14U:+\3/; +MB77PB5X$QP:@T$(`QD8(`8A>"8U.*(E=_(A>$(A>$8A>$NCW$O__C4Y0QD7\ +M`8A>.(A>.8A>.NCB$O__BTWTQP9\T4(`B\9>6V2)#0````#)PU:+\>@>```` +M]D0D"`%T!U;H9PW__UF+QE["!`#_<1CH6`W__UG#5HOQ_W90Z$L-____=BCH +M0PW__UG'!MC00@!97L-5B^R#?1``4U:+=0C_=0P/E<.-3CR(7AGHJQ/__XM- +M%(V&E````(/I`'0;2703270+2745C8:(````ZPV-1GSK"(U&<.L#C49DBTY4 +M4_]U#('!6`$``%#HJA,``%Y;7<(4`/]T)`B+3"0(Z*/\__\SP,((`% "0` +M`%:+\6H`Z"0<__^+QEY9P[A$JD(`Z!UM`0"#[!Q35E>+?0R+V3/VBP>)=P0[ +MWHE5\&:),`^$[````(U#_X/X"'=$_R2%$!5!`+Z)#@``ZS:^B@X``.LOOHL. +M``#K*+Z,#@``ZR&^C0X``.L:OHX.``#K$[Z/#@``ZPR^D`X``.L%OI$.``"- +M3>3H@A'__X-E_`"#?>@`=12%]G0=C57DB\[HS$?__X-]Z`!T#8U%Y(O/4.B: +M%?__ZQ1H@,A"`(O/Z,@5__^+SU/H&1;__X-]\`"^F,U"`'0S@_L)="Y6B\_H +MJ!7__[I^#@``C4W8Z")&__]0B\_&1?P!Z%,5__^`9?P`_W78Z+8+__]95HO/ +MZ'H5__^+S_]U".CH%/___W7DZ)L+__]9BTWT7UY;9(D-`````,G""``B%$$` +M*11!`#`400`W%$$`/A1!`$4400!,%$$`4Q1!`%H400!5B^R#[`R#?0P`5HMU +M"'0MC4WTZ)T0__^+51"+30R-1?10_W8\Z(O^____=?2+SN@C^____W7TZ"D+ +M__]9BT8\@V9``%YF@R``,\#)P@P`58OL@^P,@WT,`'0QC4WTZ%(0__^+51"+ +M30R-1?10_W44Z$#^__^+10C_=?2-2/3HU/K___]U].C:"O__63/`R<(0`%:+ +M\?]T)`B-3BSH4Q'__\9&%`$SP%[""`"X:*I"`.@G:P$`@^PP4U:)3>Q7,_:+ +M^HU-X(EU\.CH#___B77\B77PNTC10@"+3?!J`5[3YH7W='B+$XU-U.BWW/__ +M@WW8`,9%_`%T5X/^!'4T:)C-0@"-3=3H*!3__[I^#@``C4W(Z*)$__]0C4W4 +MQD7\`NC2$___QD7\`?]UR.@U"O__68-]Y`!T"(U-X.A$$___C474C4W@4.BK +M$___]]8C_O]UU(!E_`#H"@K__UG_1?"#PP2!^W310@`/@FK___^%_W0LC57& +MB\_&1<0PQD7%>.B."?__@WWD`'0(C4W@Z/$2__^-1<2-3>!0Z)03__^+3>R- +M1>!0Z-X/____=>#HLPG__XM%[%F+3?1?7EMDB0T`````R<.XY*I"`.@-:@$` +M@^Q<@V7P`%.+70A65XE5[(M#!(OYA<`/AH$!``"+`XM-\(LTB(U>>(O+Z#0# +M``"$P'4*@WL,``^,30$``(-_!`!U$?]U#(O/Z(X2__^+S^A@$O__@WWP`'0* +MC588B\_H)P,``(O3B\_H,`,``(-[#``/C!,!``!HR-%"`&I)6HU-O.C:-``` +M@V7\`(O0B\_H]P(``(--_/__=;SH]@C__XM##%DY1CQU+KK+"P``C4W(Z"#; +M__^+T(O/QT7\`0```.C%`@``@TW\__]UR.C$"/__Z;(```"%P'T'N,310@#K +M#(M-[(M)"(L$@8M`$(O0C4W@Z.8#``!0NLD+``"-3=3'1?P"````Z-H&``"+ +MT(O/QD7\`^AQ`@``_W74Z'0(____=>"#3?S_Z&@(__^+=CQ9A?99?0>ZQ-%" +M`.L,BT7LBT`(BS2PBU80C4VDZ(P#``!0NLH+``"-3;#'1?P$````Z(`&``"+ +MT(O/QD7\!>@7`@``_W6PZ!H(____=:2#3?S_Z`X(__]96?]%\(M%"(M-\(O8 +M.T@$#X)__O__,_8YR+20B+!(&+0!"+T(U-F.B2 +M`@``4(U-U,9%_`?H,`[__\9%_`;_=9CH,0?__UF-1=2+UE"-3>#HB2#/__C46\C4W@4(U%R%#& +M1?P*Z(<3____=!0C46\4,9%_`SH0Q/___]UO.B?!O___W7(QD7\ +M".B3!O__68U%X%E0B\_H%Q#___]UX.A^!O___W74@TW\_^AR!O__65F+S^B' +M#___C5,PB\_H9@```#/VBT<$.\9T$HL/9H-\0?X*=0A(B4<$9HDT08M-]%]> +M6V2)#0````#)P@P`,\`Y001U'3E!"'48.$$"=00X`74/.$$!=0HY01QU!3E! +M*'0#:@%8PU:+\5+HDP___XO.Z!D/__]>P[@0JT(`Z&9F`0"#[!Q35HOR5XOY +M@'X!`(M>!'0#@\L@B\[H`P$``(7;B47P="2+TXU-Y.@'^___@V7\`(O0B\_H +MJ?___X--_/__=>3HJ`7__UF#?AP`=`J-5AB+S^B,____@WWP`'1B:-S10@!J +M2%J-3>3H3#$``%"+S\=%_`$```#H`P___X--_/__=>3H9@7__UF+S^A5#O__ +MB\_H=0[__XM5\(U-Y.B2^O__B]"+S\=%_`(```#H,?___X--_/__=>3H,`7_ +M_UF#?B@`=$MHR-%"`&I)6HU-V.CD,```4(O/QT7\`P```.B;#O__@TW\__]U +MV.C^!/__B\_'!"38T4(`Z+T.__^#QB2+SU;H=@[__XO/Z/P-__^+3?1?7EMD +MB0T`````R<.`>0(`BT$(=0V`.0!T"/9!!$!U`@Q`P[@DJT(`Z"5E`0"#[!"# +M9?``5HOQ5XOZ:EN-3>3H"@K__X-E_`!7C4WDZ,\-__^-3>1J7>C\#/__C47D +MB\Y0Z)@*____=>3H;03__UF+QHM-]%]>9(D-`````,G#N#BK0@#HR60!`(/L +M#%:+\?]U$(U.+.C0"O__C4WHQD84`>B%"?___W44BU4(@V7\`(U-Z/]U$/]U +M#.A]^O__@WWL`'02_W7H_T8DC4[\Z.+S__^`9A0`_W7HZ/T#__]9,\"+3?1> +M9(D-`````,G"$`!6B_&`?A@`=!*#?C0`=`C_=C#HK?/__X!F&`!>P[A,JT(` +MZ#MD`0"#[`Q3BUT(5HOQA=MU!#/`ZU3_1B2!^P1``(!T1X'[<``'@'0_5XU^ +M_(O/Z*G___^#?CP`=`J+=CB+!U97_U`CHRG+___\PBP^#9?P`5_]1 +M'/]UZ.AF`___63/`7^L"B\.+3?1>6V2)#0````#)P@0`_W0D!,9!'0&#P53H +M,0K__S/`P@0`58OL@^P<5HMU",9&$@&`?A$`=6Y7C4WDZ(8```"+?D2-CU`! +M``#H%51HV`X``.@' +M2/__@_@!=!#_=?#HV`+__UFX!$``@.LUC47PC4Y(4.BW"?___W7PQD81`>BX +M`O__6?]V2/\5B,%"`(M-#(D!]]@;P"7R__A_!0X`!X!>R<((`+A@JT(`Z`-C +M`0!15HOQB77P@V8$`,<&H-!"`(-E_`"#9@@`C4X,Z+L'__^+3?2`9A@`QP;P +MT4(`B\9>9(D-`````,G#5HOQZ!0```#V1"0(`70'5N@]`O__68O&7L($`%:+ +M\?]V#.@K`O__6<<&V-!"`%[#N'RK0@#HCV(!`(/L'(-E\`!6B_%2C4WDZ"@( +M__^#9?P`:"C20@"-3=CHAP?___]U"(U%V(U-Y,9%_`%0Z'T.__^`9?P`_W78 +MZ-4!__]9C47D4(O.Z.P'____=>3HP0'__UF+QHM-]%YDB0T`````R<($`+B0 +MJT(`Z!QB`0"#[!"#9?``5HOQC4WDZ-/3____=0B#9?P`B]"+SNAA_____W7D +MZ'L!__]9B\:+3?1>9(D-`````,G"!`!6BW0D"(M&!(/X2'8;@\"XB\Y0:B3H +M=P[__V@PTD(`:B2+SNC*#/__BT8$AP@0`_W0D!/]Q!/\5_,%"`&H`_W0D#&AP`0``4/\5',)"`(7` +M=`=0_Q6TP4(`P@@`N*RK0@#H6F$!`(/L6%-6BW4,5XM]"(O95HU-G%?HY__^ +M_XU%G(U-Z%#H4@;__X-E_`"-1>A0NK`-``"-3=SH^_[__U"+R\9%_`'H+PK_ +M__]UW.B6`/___W7H@TW\_^B*`/__687V67<,@?\`!```#X*-````@_X"P4`P``4U97BWT(B4W8C5\8 +MB\OH6`K__XUP`8U%W%90B\OH4';__XM-V(U%W#/;4(E=_.@N_O__C4WB-!'!0Z!,%__^+==B-1>A0B\[&1?P!Z`7^__^-1>B-3=Q0Z/,( +M____=>B(7?SH5__^_UF-3=SH;`C__S@?=`[_=PR-3=S_=PCH3_[__XU-W.A2 +M"/__.%\!=$RZ]`,``(U-Z.AV.?__4(U-W,9%_`+HI@C___]UZ(A=_.@*__[_ +MC4WA6Z-<$__\Y70C' +M1?P#````=$@X7P(/A%T!``"+1>R#^`0/@E$!``"+3>BZ),]"`(U,0?CHC?_^ +M_X3`=4>+1>B+3>RZ3-)"`(U,2/CH=?_^_X3`#X0@`0``ZRF-3>CH^0C__T"- +M3>A0Z,0+__]J+HU-Z.BZ"/__.\-\"5"-3>CHK0O__SE=['4-:$#20@"-3>CH +M-0;__SA?`L=%#"````!T0HU-G.BX'/__C4W$Z%D#__^+!E-0C4V#\__]T +M0XN%Y/S__SO#?"T[1=1T*#O#=04Y70AU'SE="(E%U(M%$'0#BT44_[7@_/__ +MBTW84.A2_/__ZPS_M>#\____%;3!0@#_=>B#3?S_Z%+]_O__10A9@WT(`@^" +MA/[__^L)_W7HZ#K]_O]9BTWT7UY;9(D-`````,G"$`!35HOQ5VIE:F2-1A!J +M9E#H.OW__VIO:FZ-1CAJ<%"+SN@I_?__B\[H/$#__XL]_,%"`#/;.%X(=3)5 +M:+@!``#_=@3_UXLM\,%"`%-0_]5HN0$``/]V!/_74U#_U6BQ#0``_W8$_]=3 +M4/_573A>"70D4XL=V,%"`&H':`$$``#_=@3_TVH'_W8$_]=J`5!J*/]V!/_3 +M7UZP`5O#5FH`B_%J9.AH^___:@!J98O.Z%W[__]J`&INB\[H4OO__VH`:F^+ +MSNA'^___,L!>PXM$)`2#^`9R*(/X!W85/;P@@`5HOQZ#[___]J`?]V +M!/\5N,%"`%[#N!BL0@#HO5L!`%%35HOQ,]N#R/^)=?")1@B)7A")1AB)7B") +M1BB)1C"-3CB('HA>`8A>`HA>`XE&#(E>%(E&'(E>)(E&+(E&-.A2`/__C4Y$ +MB5W\Z$<`__^-3E#&1?P!Z#L`__^)7ER)7F")7F2-3FC&1?P#Z!L```"-CI@` +M``#H,E`!`(M-](O&7EMDB0T`````R<.X/*Q"`.@H6P$`45%6B_%7B77PZ//_ +M_O^#9?P`C4X,Z.?__O^-?AC'1?P!````B\^)?>SHT__^_XU/#,9%_`+HQ__^ +M_XM-](O&7UYDB0T`````R<-6B_'_=@SH7/K^__\VZ%7Z_O]965[#4U:+\5>- +MOI@```!7_Q5`P$(`BEX!5_\51,!"`%^*PUY;PU.+'4#`0@!6B_%7C;Z8```` +M5__3@#X`=1B`?@$`=!E7_Q5$P$(`:F3_%3S`0@!7Z^&^!$``@.L",_97_Q5$ +MP$(`B\9?7EO#_S'_%43`0@##5HOQ5XV^F````%?_%4#`0@"+1"0,5XE&"(M$ +M)!2)1@S_%43`0@!?7L((`%:+\5>-OI@```!7_Q5`P$(`BT0D#%>)1B"+1"04 +MB48D_Q5$P$(`7U[""`!6B_%7C;Z8````5_\50,!"`(M$)`R%P'0+BPB)3A"+ +M0`2)1A2`/@!T![X$0`"`ZPB`?@$`=0TS]E?_%43`0@"+QNL.5_\51,!"`(O. +MZ`G___]?7L($`+A0K$(`Z*!9`0!15HOQ5XV^F````%>)??#_%4#`0@#_=0B# +M9?P`C4Y$Z/C__O^#?0P`=`W_=0R-3E#H@__^_^L+BT90@V94`&:#(`"*11!7 +MB$8#_Q5$P$(`B\[HI/[__XM-]%]>9(D-`````,G"#`"X;*Q"`.@P60$`@^P0 +M5HOQ5XV^F````%>)??#_%4#`0@#_=0B#9?P`C4WDZ";^_O^#QES&1?P!B\[H +M8_3^_XU%Y(O.4.C1]/[__W7DZ'+X_O]95_\51,!"`(M-]%]>9(D-`````,G" +M!`"X5JU"`.C'6`$`45%35HOQ,]M7B77LB5X$QP:@T$(`C4XDB5W\B%X(B%X) +MB%X*B%X+B%X,B%X-B%X.B%X/B%X0B%X1B%X2QD83`<9&%`&)7AB)7AR)7B#H +M3OW^_XU.,,9%_`'H0OW^_XU./,9%_`+H-OW^_XU.2,9%_`/H*OW^_XU.5,9% +M_`3H'OW^_XU.8,9%_`7H$OW^_XU.;,9%_`;H!OW^_XU.>,9%_`?H^OS^_XV. +MA````,9%_`CHZ_S^_XV.G````,9%_`F)GI@```#HUOS^_XV&J````,=`"`$` +M``")&(E8#(V&T````(F>R````(F>S````(D8B5@$B5@(C;[<````B1_&1?P, +MC8XH`0``Z)/\_O^-CC0!``#&1?P-Z(3\_O^)GE`!``")GE0!``"-CE@!``#& +M1?P0Z,G[__^#C@@"``#_,]*-CE0!``#&1?P1B9X,`@``QP:LTD(`Z#Q+`0"% +MP'05C47P:+#C0@!0QT7PRUX4`.AS5P$`,]*-CE`!``#H%DL!`(7`=!6-1?!H +ML.-"`%#'1?#+7A0`Z$U7`0!7:,#&0@!J`5-H(.!"`/\56,)"`(L_._MT!HL' +M5_]0#(M-](O&7UY;9(D-`````,G#P[B,K4(`Z/%6`0!15HOQB77PC8:8```` +MQT7\`P```%#_%3C`0@"-3FCH-````(U.7,9%_`+H5*4``/]V4.A#]O[__W9$ +MZ#OV_O__=CCH,_;^_XM-](/$#&2)#0````!>R<-6B_'_=B3H&/;^__]V&.@0 +M]O[__W8,Z`CV_O__-N@!]O[_@\007L-6B_'H%````/9$)`@!=`=6Z.?U_O]9 +MB\9>P@0`N&BN0@#H358!`%%6B_&)=?"-CE@!``#'1?P0````Z#G___^-CE0! +M``#HR4@!`(V.4`$``.B^2`$`_[8T`0``Z)SU_O__MB@!``#HD?7^_XN&W``` +M`%F%P%G&1?P+=`:+"%#_40B-CM````#&1?P*Z'6D``#_MIP```#H8?7^__^V +MA````.A6]?[__W9XZ$[U_O__=FSH1O7^__]V8.@^]?[__W94Z#;U_O__=DCH +M+O7^__]V/.@F]?[__W8PZ![U_O__=B3H%O7^_XM-](/$*,<&V-!"`&2)#0`` +M``!>R<-6B_&#OMP`````=#&#ON``````="B-CE@!``#HC_K__X3`=`5J"%CK +M#(I&"_;8&\"#X`)`0%"+SN@"````7L.+@=P```"%P'05BXG@````A75O"!`!14U:+ +M\3/;BX8,`@``.\.)AN````!U#_]V!/\5[,%"`(F&X````#F>X````'43B\:- +M3@3WV!O`(\&+`(F&X````%57@\__B9Y$`0``B;[`````B;ZX````B;[P```` +MB;[X````B;X``0``B;Y(`0``B;[$````B;Z\````B;[T````B;[\````B;X$ +M`0``B;Y,`0``_Q6LP$(`B8;D````C88H`0``B9[H````B;X(`0``B;X0`0`` +MB;X8`0``B;X@`0``B9[L````B;X,`0``B;X4`0``B;X<`0``B;XD`0``B5@$ +MBP"+/?S!0@!J9&:)&(V&-`$``(E8!(L`9HD8_W8$_]=J98F&R````/]V!/_7 +M4XL=',)"`(VNS````&H!:`4@``!0B44`_]-J(&H`:#80``#_=0#_TXV.5`$` +M`,9&"0'H$T)1"00C49(4(U,)!3H`S+__XU&2(U.5%#H +MV/G^_VHFC4Y4Z/3^_O]HO@$``/]V!/_7B40D$(U&;%"-3"04Z-(Q__^-5F"Y +MO0$``.AE+O__C59XN9L!``#H6"[__XV6A````+F_`0``Z$@N____MIP```#_ +M=@3_%=#!0@"+SN@P%0``B\[HXA4``&HH:%C)0@!J`(O-Z.,W__]HS`$``&A8 +MR4(`:@&+S>C0-___:/__``!J`&@>$```_W4`_]-H__\``&H!:!X0``#_=0#_ +MTVH`B\[HC/W__XV&E````(O.4(V&D````%!J`NAH,___:@&+SL>&0`$``%(` +M``#H3C3__X!^%`!U/&CP`P``_W8$_]>++?#!0@!J`%#_U6IN_W8$_]=J`%#_ +MU6A!#P``_W8$_]=J`%#_U6I]_W8$_]=J`%#_U8.^"`(```"-A@@"``!?77P= +M#[<`4/\UQ#%#`/\5.,)"`%!J`6B`````_W8$_]-J`&C(````:@/_=@3_%>C! +M0@"+SHF&F````.B*&```B\[H:_S__UZP`5M9PU6+[(/L+%-6C4745U"+\6@\ +M#P``Z.$R__^+3=B+1>"+7=0KP8E%[(U%U(E-^%!H/0\``(O.B5WTZ+TR__^+ +M1=B-?@0K1?AJ`6H`_S>)1>3_%L"B9Y``0``BUT0*YZ4````:F?_ +M-RM=^/\5_,%"`/]U_(O/4.AEW___:F;_-_\5_,%"`/]U_(O/4.A0W___:F3_ +M-_\5_,%"`/]U_(O/4.@[W___BT7TB[Z0````B440`\"-!'@#QSM%_'XA@WT0 +M!7P'_TT02$CK[HM%$&H#`\"+R(M%_"O!69GW^8OX@_\"?0-J`E^-1=2+SE!J +M9>C5,?__B\-J!"M%V%DK1?B)1?"+AI0```"-!$"9]_F+3?P#AI0````Y1?!] +M#(E%\(T$/SO(?@(KSVH!_W7P4?]UV/]U]/^VS````/\5],%"`(M%#&H!_[:4 +M````*\B+3?B)30SK`XM%_(M-](E-\(M-$(/Y"G(3 +M=0:+5?B)50R+5>@#P@-%](E%\(L$C5320@"%P'04:@&+SO]U[%?_=0S_=?!0 +MZ/$P__^+1?!J`?]U[`/'B\Y3_W4,4(M%$/\TA5C20@#HT3#__XM%Y(-%$`(! +M10R#?1`4-OI@```!7_Q5` +MP$(`BD0D#%>(!O\51,!"`%]>P@0`4XM<)`Q65XM\)!"+\3N^P````'4,.Y[$ +M````#X2/````@XZX````_X..O````/^)OL````")GL0```"#IJ@`````B;ZP +M````A=N+QXO3B9ZT````=PB!_P"```!R&VH!6>@@40$`_X:H````A=)W[G(' +M/0"```!SY8N.J````(O'B]/H_E`!`#N^L````(V.L````'4&.UD$=0%`4&H` +M:`8$``#_ML@```#_%1S"0@!?7EO""`!5B^Q35HOQ5XM]#(N6Q````(N&P``` +M`#OZ=T!R!3E%"',YBX:\````BXZX````._AR*7<%.4T(=B*+70AJ"BO961OX +MBX;`````Z()0`0`[^G)X=P0[V')RBWT,BXZH````BT4(C9ZH````B]?H7U`! +M`(U+"(M="#L9=08[>01U`4!J`%!H`@0``/^VR````/\5',)"`(N&W````(7` +M=!^+CN````"%R705_[;$````BQ#_ML````!74U%0_U(DB9ZX````B;Z\```` +M7UY;7<((`%-55E>+?"04:@!H$`X``(OQ_W0D(%?H]$X!`(O8:<`0#@``*_AJ +M/(OJB\75O""`!5B^R#[%"+112+ +M50Q6BW40.Q!7B_EU!3MP!'0M9H-EL`")$(EP!(O"(\:#^/]T"E:-3;!2Z!8` +M``"-1;!0_W4(_W<$_Q6\P4(`7U[)PA``BU0D"(M$)`13,MM6@_H8B_%R%7<' +M/0```&IR#&H>6>B\3@$`LT?K+(72=P<]`(`:!G(,:A19Z*5.`0"S3>L5A=)W +M!SV@A@$`<@IJ"EGHCDX!`+-+4HO.4.B(ZO[_A-MT+S/2,\!F.19T"HO.0$%! +M9CD1=?B-!$9F#[;+9L<`(`!`0&:)"$!`9L<`0@!FB5`"7EO""`"XE*Y"`.BA +M2P$`@>S8````4U:+\5>-OO`!``!7B7V<_Q5`P$(`BX9@`0``@V7\`(E%R(N& +M9`$``(E%S(N&:`$``(E%K(N&;`$``(E%L(N&<`$``(E%P(N&=`$``(E%Q(N& +M>`$``(E%I(N&?`$``(E%J(N&@`$``(E%N(N&A`$``(E%O(N&B`$``(J>6@$` +M`(E%U(N&C`$``(U6)(E%V(U%WU"-CI`!``#H=`<``(U%ZHU6,%"-CJ@!``#H +M8@<``(U%WHU6/%"-CIP!``#H4`<``(J&6P$``#A&"'0'QD7J`8A&"(N&N`$` +M`(--_/]7B46<_Q5$P$(`_Q6LP$(`A-N+^'0+BT7`B47@BT7$ZPF+1"+ +M1R)1?"+1>`C1>2#^/]T28N. +MN````(V&N`````M(!'4@B\,+1?!U&8N.P````(V&P`````M(!'4@BT7@"T7D +M=!C_=>2+SO]UX.A'^____W7PB\Y3Z/+[__^-A@@!``"+SE#_=NA] +M_?__C8;D````B\^[Z`,``&H`*PA3B3@!CN@```"#ENP`````_[;L````_[;H +M````Z(I+`0"`9>L`.X;X````B_IU"#N^_````'0O5XF&^````(V-3/___U") +MOOP```#&1>L!Z$C\__^-A4S___]0:GC_=@3_%;S!0@"`9>D`@'WK`'4*@'T( +M``^$M`0``(M]G#M^&'9!B\[H[0T``&H`C8U<____5^@)Z/[_C85<____4&I^ +M_W8$_Q6\P4(`@'X+`'44:@&+SL9&"P'H*?3__XO.Z,'S__^+1>P+1?`/A,8! +M``"+1>"+3>0CP8/X_W4FBXX``0``C88``0``(T@$@_G_#X2'````@PC_@T@$ +M_VA8R4(`ZVXSP#/2.4WP=R]R"(M-X#E-[',EBT7@_W7P*T7LBTWD_W7L&TWP +M45#_MNP```#_MN@```#H804``&H`4U)0Z&=*`0`[A@`!``"-C@`!``!U!3M1 +M!'0DB0&)4012C8U,____4.@S^___C85,____4&IY_W8$_Q6\P4(`B[[H```` +MBX;L````B\\+R'4)@V7,`&H!7^L#B47,:@!3_W6P_W6LZ#1+`0#_=1`$``'47.X9(`0``C8Y(`0``=0D[400/A)$```!2B89( +M`0``C8U,____4(F>1`$``(F63`$``.A]YO[_,](SP&8YE4S___]T#HV-3/__ +M_T!!068Y$77X9L>$14S___\@`$`[VG0.9@^V30MFB8Q%3/___T!FQX1%3/__ +M_T(`0&;'A$5,____+P!`9L>$14S___]S`&:)E$5.____C85,____4&I[_W8$ +M_Q6\P4(`BTW@,](C3>0SP(/Y_W0C4FID_W7P_W7LZ"E*`0"+3>`+3>1T#?]U +MY/]UX%)0Z.1(`0`[AO````"-CO````!U!3M1!'0)B0&)403&1>D!_W6HC8T< +M_____W6DZ*SE_O^+AB@!``"+/7S!0@"-GB@!``"-C1S___]14/_7687`670@ +MC84<____B\M0Z._L_O^-A1S___]0:F__=@3_%;S!0@"+1<`STB-%Q&:)E1S_ +M__^#^/]T56:A[-)"`&8[PF:)A1S___]T&#/`9HN([M)"`&:)C`4>____0$!F +M.\IUZC/)9CF5'/___W0.C84<____04!`9CD0=?C_=<2-C$T<_____W7`Z`'E +M_O^+AC0!``"-GC0!``"-C1S___]14/_7687`670@C84<____B\M0Z$KL_O^- +MA1S___]0:G#_=@3_%;S!0@"*1A.$P'0+BTW4B4WLBTW8ZPF+3;B)3>R+3;R$ +MP(E-\'0(BUVXBWV\ZP:+7=2+?=B+PR/'@_C_=3J+1>PC1?"#^/]U+XV&$`$` +M`(O.4/]UL/]UK&I\Z#?Y__^-AA@!``"+SE!J_VK_:F[H(_G__^G:````C880 +M`0``B\Y05U-J?.@,^?__C888`0``B\Y0_W7P_W7L:F[H]OC__XM%["-%\(/X +M_P^$HP```(O#(\>#^/\/A)8```"+PPO'#X2,````:@!J9/]U\/]U[.@P2`$` +M5U-24.CW1@$`B[X@`0``C8X@`0``._AU!XMY!#OZ=%V)`8E1!%*-C5S___]0 +MZ,/C_O]F@[U<____`(V%7/___W0(0$!F@S@`=?B+#>C20@"ZZM)"`&:)"$!` +M9H7)=`QFBPIFB0A`0$)"Z^^-A5S___]0:GW_=@3_%;S!0@"`?>D`=0:`?=\` +M=`>+SNC]!0``@'W>`'0\C48\C4V@4.A:ZO[_BY9``0``C4V@QT7\`0```.CG +M````_W6@:F?_=@3_%;S!0@#_=:"#3?S_Z`CD_O]9@'WJ``^$L0```(U-T.A% +MZ?[_C4VTQT7\`@```.@VZ?[_@'X(`,9%_`-T"8U&,(U-T%#K,(U^,(O/Z&KN +M_O^%P'P>C5@!C4W04_\WZ`+K_O^+!XU-M(T$6%#H..K^_^L)5XU-M.B1ZO[_ +MBY9``0``C;Y``0``C4W0Z$\```"+%XU-M.A%````C4W0Z);L_O^-1;2-3=!0 +MZ/WL_O__==!J9O]V!/\5O,%"`/]UM.A6X_[__W70Z$[C_O]968M-]%]>6V2) +M#0````#)P@0`5HOQBT8$.\)V'%>+^BO"T>]05^A+\/[_B\YH,-)"`%?HG^[^ +M_U]>PU97B_*+^8O7B\[H"_#^_XM,)`SVV!K`_L"(`70(5XO.Z.'I_O]?7L($ +M`%6+[%-65_]U#/]U".B'````BUT0B_C_=113Z'D```"+\(T$/H/X0'9$._YV +M%XM%"(M5#&H!3UGHQ$4!`(E%"(E5#.L3BU44:@%9B\-.Z*Y%`0"+V(E5%(M% +M&(M5'&H!6>B;10$`B448B54I(=??#5HOQC8Y8`0``Z,+G__^$P'40B\[H(`D` +M`&H`B\[HR_;__[`!7L((`+BHKD(`Z&9"`0"#[!Q35HOQ,]M7B77L.%X1B67P +MB5WHB5W\=&6-3>#H``$``(M%#&CT`0``4\9%_`&+`(E%V(N&4`$``(E%W(U% +MV%!J`O\5-,!"`#O#=2&-CE@!``#HH0```#K#=1(Y7>!T"?]UY/\5/,)"`#/` +MZWHY7>"(7?QT"?]UY/\5/,)"`/]U"(V.G````.A4Z/[__W40B\YJ8>AW)O__ +MB47HZQV+1>R-B%0!``#&0`D!Z$4U`0"X83]!`,.+=>PSVXM-#.B2-`$`.%X2 +M=1TX'<`Q0P!U%6H0:.3/0@!H]-)"`/]U$/\5W,%"`(M%Z(M-]%]>9(D-```` +M`%O)P@P`@WE@`'4/@\%HZ`L```"$P'4#,\##:@%8PS/`.4$0=04Y02AT`VH! +M6,-6:`)_``"+\6H`_Q5`PD(`A<")!G0*4/\5/,)"`(E&!(O&7L.#.0!T"?]Q +M!/\5/,)"`,.XS*Y"`.@&00$`@^Q$4U97B_%J`.B_Z___:@&+SNA#]?__NI@! +M``"-3>#HJK+__XL`C7X$4&H"_S?_%;S!0@#_=>#H4N#^_XL=_,%"`%EJ`O\W +M_]-J`6H!:/0```!0_Q4S_%4#`0@`YGK@!``"-GL`!``!3C4VPQD7\`@^51?/H_P```(/# +M&(U-R%/H\P```/]U[,9%_`'_%43`0@`SVSE=P'0I.5VTQD82`74-:!330@"- +M3;#HG.?^_X`]P#%#``!U;6H0_W6P_W6\ZS&`??,`=3LY7=C&1A(!=#(Y7@*!```ZPE3_S?_%;C!0@"- +M3;#HXNC__XM-]%]>L`%;9(D-`````,G#N."N0@#H83\!`%%6B_&)=?#H+N3^ +M_X-E_`"-3@SH(N3^_XM-](O&7F2)#0````#)PU97BWPD#(OQ5^BHY?[_@\<, +MC4X,5^BP@P`N/RN0@#HN3X!`(/L&%:+\8U-Z.B$X_[_@V7\`(V.6`$` +M`.C4X___A,!T%XV&A````(U-Z%#HH^?^_XU-Z.C:YO[_BX;P````BX[T```` +MB]`CT8/Z_W0445"-3>CH:.#^_VHEC4WHZ%WF_O^`?A``=!2-3>CHH^;^_XU& +M5(U-Z%#H6.?^_XU-Z.B/YO[_C8:<````C4WH4.A!Y_[_@WXH`'0XC48DC4W< +M4.C!X_[_:B2-3=Q:QD7\`>A4^O__C4WHZ%?F_O^-1=R-3>A0Z`SG_O__==SH +M<]W^_UG_=>C_=@3_%=#!0@#_=>CH7MW^_UE>BTWT9(D-`````,G#5HOQC8Y8 +M`0``Z/'B__^$P(U&>'4#C49L_S!HO@$``/]V!/\5O,%"`(O.Z-7^__]>PU6+ +M[%%35HOQ5XV^6`$``(O/Z+CB__^*V(O/]ML:V_[#B%W\_W7\Z#D```#_%:S` +M0@"$VXOX=!2+SXV&Z````"N.Y`````$(@U`$`(O.Z,WG__^+SHF^Y````.AP +M____7UY;R<-6B_%7C;Z8````5_\50,!"`(I$)`Q7B$8!_Q5$P$(`7U["!`!6 +MB_&`?A``C49@=0.-1DC_,&B\`0``_W8$_Q6\P4(`B\[H)?[__U[#5HOQ@'X0 +M``^4P(A&$/;8&\"#X""#P"!0_Q54P$(`4/\5,,!"`(O.Z*S___]>P[@0KT(` +MZ*X\`0"#["QF@V7(`(!]#`!35E>+\70,BTX@C57(0>C8VO[_B[[4````C47( +MC9[,````4%>+R^BO(?__.\=U/?]U"(O+:@%7Z-4A____=0B-3>CH=^'^_X-E +M_`"!QM````"+SNBQU_[_C47HB\Y0Z!_8_O__=>CHP-O^_UF+3?1?7EMDB0T` +M````R<((`+@LKT(`Z!L\`0"#[!A35E>+^?]U"(U-Z.@DX?[_,]O&10@!B5W\ +M.5WL=$N+3>AFN@H`Z(/;_O^+\#OS?#F-1=Q64(U-Z.@,4O___W4(BP"+S\9% +M_`%0Z!+_____==R(7?SH2-O^_UE&5HU-Z(A=".BPZ/[_Z[#_=0B+S_]UZ.CJ +M_O___W7H_T<@Z"#;_O]97XM-]%Y;9(D-`````,G"!`"X2*]"`.A[.P$`@^P0 +M4S/;5E>+\8E=Y(E=Z(E=[(V&\`$``(E=_%")1?#_%4#`0@"+OK@!``"+1A@[ +M^,9%_`%V-8O?C4WD*]CH4-G^_U.-3>3H5AC__XM>&#O?3_ +M-)CH]];^_T/KZ(E^&#/;_W7P@&7\`/\51,!"`#E=Z'1V,_\Y7>AV%8M%Y(O. +MBP2X_S#HPO[__T<[?>ARZX%^&$!"#P!R!H-^'&1S2XM.'(/Y9'(3Z%D```"+ +M3AB+^.A/````.\=V,(L]',)"`&C__P``4[L>$```4_^VS````/_7:/__``!J +M`5/_MLP```#_UXM&&(E&'(--_/^-3>3H#8D``(M-]%]>6V2)#0````#)PU9J +M`8O!7FH*,])9]_&%P'0#1NORB\9>PU6+[(/L$(M%"%-(5DB+\70D+;H!``!T +M#TA(#X7"````Z)G\___K!XO.Z$#]__^P`>FZ````,MLX7@QT%&H(QD82`?]V +M!/\5N,%"`.F2````.%X-==F-CE@!``#H+-___SK#B$7_=0>+SNA0_/__5XN^ +MG````+K``0``C4WPQD8.`>B7J___BP"+SO?9C58$:@,;R5#E]U!,9�$X7?]U!XO.Z/K[__\X7@]T#(O. +MZ'3X___I6?___SA>#0^$4/___\9&$@'_=0R+SO]U".@*&?__7EO)P@@`5HOQ +M@'X*`'06:@!J`&@!@```_W8$_Q78P4(`@&8*`%[#5HOQ@'X1`'46C8Y0`0`` +MZ+HL`0"+CE0!``#H[RL!`(!^"0!T%&H`:@!H`8```/]V!/\5V,%"`%[#QD8* +M`5[#58OL@^PHBT4,5HOQBP@[CLP```!U&X%X"&7___]U$@^W0`R#Z"UT08/H +M%'0+2$AT.#+`7LG""`!J$?\5R,%"`,'H#Z@!=.IJ`EB)1>B)1>2-1=A0:O]H +M*Q```/^VS````/\5',)"`.L6:A'_%AS"(M%Y(L$N.L"B\>+B]````#_-(&-3=CH&>'^_V@*]"`.AA-P$`48-E\`!6B_ ?P`5KH)2D$`C4WPZ)`B_#K$_]U#(U%\(O.4/]U".BR]/__,_:-3?#HN"D!`(M-](O& +M7F2)#0````#)P@@`N(2O0@#H_38!`% ?P`4U:+=0A7B\Z)9?#H+0```,:& +M4`(```&+3?1?7C/`9(D-`````%O)P@0`BT4(QX!,`@``!4``@+@O2D$`P[BX +MKT(`Z+$V`0"#[#135E>+\8EE\(EU[(EUZ#/;C4W,B5W\Z&S;_O^+!HO.QD7\ +M`O]0/(F&3`(``.M__W7DC4W,Z(W<_O^X"DM!`,/_=>"-3PSVXN63`(``,=%_`$```"!^@1``(!T*SE=T'4F.]-T(HU-P.@&`0``4(U- +MS,9%_`7H2MS^__]UP,9%_`'H2]7^_UF-EB@"``"-31`(``'1#C;XT`@``C9[8`0``5XO+Z-';_O^#QPR- +M2PQ7Z,7;_O_K(8U%S(V.S`$``%#HM-O^_SF>3`(``'4*QX9,`@``!4``@/]U +M[/\51,!"`/]US.B>U/[_68O.Z,_[__^+3?1?7F2)#0````!;R<.+">FY^___ +M5E>+^HOQ@W\$`'03@WX$`'0%Z(?=_O]7B\[H\MW^_U]>PU "0``%:!^@X` +M!X"+\74,NK@+``#H@Z;__^L'B\[HBD/__XO&7EG#N,RO0@#HHC0!`(/L,(-E +M\`!6B_)7@?[H`P``B_ES.XV6Z`,``(U-Y.A(IO__@V7\`(-]Z`!T%HU%Y(O/ +M4.@6VO[__W7DZ.O3_O]9ZRW_=>2#3?S_Z-S3_O]9@WT(`'0%_W4(ZPZ-5<2+ +MSNB&TO[_C47$4(O/Z$[9_O^+3?2+QU]>9(D-`````,G"!`#H!0```.D*```` +MN8@T0P#I8[K__V@034$`Z&TW`0!9P[F(-$,`Z:^Z__]5B^R![+0"``"#C5#] +M____B\*%P'4#:B!8:!!```"-E4S]__]HM`(``%)04?\5H,%"`(M-"(N54/W_ +M_XD1R<($`%6+[%?S_C47\4.BN____AP```"+1?"%P`^,X0```(M-"('A``@``(E-"'0%@\<8 +MZP.#QPR#9>P`C71#`HU%[(O64(O/Z'$!``"%P'P-BP^+!(&+0`SI&0$``&:+ +M!C/29H7`=$V+SF8],`!R$68].0!W"T)!06:+`6:%P'7IA=)T,&:#/%8`=2F+ +M=>B#?B@`=1B-1B2Y,--"`%!J(%KHS/[__\=&*`$```"+1B3IP@```(U-V.B$ +MU_[_@V7\`%:-3=CHMMC^_XM%\(M5"(/*((T,0^C8_O__@7\$```!`(E%Y',. +MC478B\]0_W7LZ)4!``#_==B+=>3H\='^_UGK>+1"00B3B#R/]?7EO"!`!14U6+Z597,]N+ +M?02)5"00A?]T)XM%`(TT'XM,)!#1[HL$L(L0Z-W2_O^%P'0>?02+_NL#C5X! +M.]]UV8M$)!B)&(/(_U]>75M9P@0`B\;K]('LM`(``#/`A,D/E+1"0<@\0,B0:+ +M1"04B48$_T<$7U["#`"X]J]"`.C4,`$`45-6B]GH,+?0Q7B\[H5=;^_XM'#%^)1@SK`C/V@TW\_U;_=0B+R^BA +MY_[_BTWT7EMDB0T`````R<((`%.+7"0(N/___Q]6.]A7B_%W`HO#P>`#4.BW +MS_[_B_B+1@2%P%ET#\'@`U#_-E?H?C`!`(/$#/\VZ,O/_O]9B3Z)7@A?7EO" +M!`"X"+!"`.@L,`$`@^P,5HOQ:F3_=@2#9B@`@V8L`/\5_,%"`(E&"(U&#%"- +M3>CHL-7^__]UZ(-E_`#_=@C_%=#!0@!J`?\UQ#%#`/\5.,)"`%!J`6B````` +M_W8$_Q4- +M3=SH5M3^_X-E_`"-?@B-1=R+SU#H!@[__[I*#0``C4W0Z">A__^-3>C&1?P! +MZ"O4_O^+QH/&!/?8&\"+5=`CQL9%_`*+"(U%Z%#_==SHW;/___]UZ(3`=`O_ +M-_\5T,%"`/]UZ.BDSO[__W70Z)S._O__==SHE,[^_XM-](/$#&2)#0````!? +M7LG#N$"P0@#H\"X!`(/L#%:+\6AF#0``_W8$_Q6PP4(`@_@!C4WH#Y3`B$8P +MZ*33_O^#9?P`C47H4(U.".A6#?__C4WHZ$[9_O^-3>CH^]C^_XU-Z.A&_/[_ +MC47HC4X,4.@3U?[_:@'_=@3_%;C!0@#_=>CH#<[^_UE>BTWT9(D-`````,G# +MBX%<`@``@^PXA- +MN2@"``!74%92_[%T`@``BY%@`@``_[%P`@``_[%L`@``_[%H`@``_[%D`@`` +MBXE8`@``Z$1B__]?7H/$.,.X=[!"`.@!+@$`@>SP`@``BT4@4U97B_DSVXOR +MC8T$_?__B!CH#`,``(M%"(FU9/___XMU&(F]7/___XM]$(E=_#A>2XF%:/__ +M_P^%;P$``(U&,(U-Z%#H6]/^_SE=[,9%_`%U"(U-Z.AAZO[_.%T<#X3Q```` +MC4VB-5=S&1?P#Z##J_O^$P'4:BQ5,TT(` +M,\GH$9___XM%(+X%0`"`Q@`!ZU^-3=SH[_K^_XU%W(U-J%#HO-/^_XM&#(-_ +M!`&)1__^+ +M12#_=>C&``'H`\S^_X--_/]9C8T$_?__Z*X"``"X!4``@.GC````C4XPZ/OY +M_O^(7?S_=>CHULO^_UF*5DN-3=#VVAO2@^("@<+D#```Z/V=__^-1="-38!0 +MQD7\!.B@TO[_BT4DC8T$_?__B85@____4(E(5(V-?/___^AFFO__BXU@____ +MZ!F[__^+10R)M7C___]J`8F%;/___XM%%%[_=2B)A73___^-1="-C03]__]0 +MB)T7_?__B;UP____B;4,____Z%'T__\[PW0$B_#K'3B=5/___W0*.)T6_?__ +M=`*+WHM%((NU4/___X@8_W70Z!C+_O^#3?S_68V-!/W__^C#`0``B\:+3?1? +M7EMDB0T`````R<(D`+B7L$(`Z&(K`0!14U:+\3/;B77PB5X$QP:@T$(`C4X, +MB5W\B5X(Z!K0_O^-3AC&1?P!Z`[0_O^+3?2(7B2(7B6(7C"(7C''!I#30@#& +M1C`!B\9>6V2)#0````#)PU:+\>@4````]D0D"`%T!U;H@\K^_UF+QE["!`!6 +MB_'_=ACH<P[BZL$(`Z,PJ`0!15HOQ5XEU +M\.@^````,_^)??R)OG@"``"-CGP"``#&1?P!Z'[/_O^+3?2-AH@"``").(EX +M!(EX",<&R--"`(O&7UYDB0T`````R<.XVK!"`.AW*@$`45-6B_&)=?#HF='_ +M_XV&$`(``#/;B5W\B1B)6`2)6`B-CAP"``#&1?P!Z!;/__^+3?3'ADP"```% +M0`"`B)Y0`@``QP8(U$(`B\9>6V2)#0````#)PU:+\>@4````]D0D"`%T!U;H +MELG^_UF+QE["!`"X^K!"`.C\*0$`45:+\8EU\(V.'`(``,=%_`$```#H2=/_ +M_X!E_`"-CA`"``#H9G@``(--_/^+SNART___BTWT7F2)#0````#)P[@HL4(` +MZ+(I`0!15HOQB77PC8Z(`@``QT7\`@```.A4````_[9\`@``Z!?)_O^+AG@" +M``"`9?P`AP@0`N#RQ0@#H.RD!`%%65XOYB7WP@V7\ +M`(MW!(7V=!.+!TZ+#+"%R73R:@'H&````.OI_S?HE\C^_UE?BTWT7F2)#0`` +M``#)PU:+\>@9SO__]D0D"`%T!U;H<\C^_UF+QE["!`"X6+%"`.C9*`$`@^P8 +M4U:+\3/;5XL&.\,/A)\````Y7BP/A(,```"+3B@Y&71\B5WPBPB-5?!2:)## +M0@!0B5W\_Q&+1?`[PW13BPB-5>124/]1#(OX._MT%8M%\(--_/\[PW0&BPA0 +M_U$(B\?K/HM%Y"-%Z(/X_W0@BTX+':QBTXH +M.1RY=$.+"(U5W%)74/]1#(O8A=MU/8M%W"-%X(/X_W0BBTXR#3?S_ +MA+5@S!X0*+.@/Y.T8$ +M#X."````BQ8#PH`X`'5Y@V7X`,8``8M&#(,_`(M`*(L,"'9;B4W\_W7\BTX, +MZ%\```"$P'4\BT8,@V4(`(M($(7)=A6+4`R+&CM=_'0U_T4(@\((.4T(+30CK +MU#+`7UY;R<($`(M!'#/2A +MA=(/G<#"!`!6B_&+1@R+4`3HN%X``(M&#(O._W`DZ`W___^$P'0:BTX$,\"% +MR78-BS:`/`8`=`E`.\%R];`!7L,RP%[#@V$L`(-A.`##N&RQ0@#H8B8!`(/L +M'%-65XOQZ.#___^+1@0STCO"B57L#X2!````BTX0C7C_._EU=SO"B57P=F.- +M7BB+R^B1P?[_BT,$BU7L@V7H`(U(`8E+!(L+B12!BP:+3?"#/(@`C3R(=B2- +M3C3H9L'^_XM&.(M5\/]%Z(U(`8E..(M.-(D4@8M%Z#L'6V2)#0````#)PU6+[(I%$%-6B_&+30A7 +MB$8,,\`[R'0/BQ&-1A")$(M)!(E(!.L&B480B484BUX(C7X<4XO/B488Z*)* +M__^)7P2+7@B-3BA3Z&@"__\SP(E>+#E&"'9(BTT,,]L[RW0JBQ2!.].)51!T +M((O(BQ+!X0.+V0,?B1.+51"+4@2)4P0##XM6*(D,@NL/BP^)',&)7,$$BTXH +MB1R!0#M&"'*X7UY;7<(,`%6+[%.+70A65XOY4XUW!(O.Z/7]__^$P'0$L`'K +M4(M.$#/`A=`M`@\8(.\%R](/(_X7`?16-10AHL.-"`%#'10C% +M=S,!Z+8D`0"+3Q"+1,$$BT]$@#P!`'4$,L#K"%"+S^@'````7UY;7<($`(M$ +M)`1355:+\5?!X`*+3BPS[8L<`8M.!(L\`87_=A2-!"N+SE#H8?___X3`=`Y% +M.^]R[+`!7UY=6\($`#+`Z_6X>+%"`.@I)`$`45 ?P`4U97B67P:@")3>SH +M'P```(M-]%]>9(D-`````%O)PXM%[,=`;`5``("X_5Q!`,.XC+%"`.CJ(P$` +M@^P04U:+\5=J`8I&:%F$P'0%B4WHZP:+5B")5>B$P'0(BT8@B47LZP.)3>S_ +M=>B-?E"+S^C8`/___W7LC5Y,\`Y1>R)1?!V(HM.?(L$@8L(BT,$ +MC5`!B5,$BQ.)#(*+1?!`.T7LB47P2+1AB#9?P`A+ +M3D"+">L#BTXPA-)T!8M6,.L%BU9`BQ+_=0B)5>B+$%&+"_]UZ/\QBP__,5#_ +M4@SK.(I&:(3`=`6+3D#K`XU.,(3`C48P=0.+1D#_=0B+&XL_B47P_W7LBT8< +M48L04_]UZ/]U\%=0_U(,@TW\_XO.B49LZ!$```"+3?1?7EMDB0T`````R<($ +M`%-55HOQ,^TSVXEN5(EN8#EN=%=V&HM&<(L\F(L'.\5T"(L(4/]1"(DO0SM> +M='+F,]LYKH````!V'8M&?(L\F(L'.\5T"(L(4/]1"(DO0SN>@````'+C7UY= +M6\.+">F>____4U97B_'_="00C4X$Z"P````SVXU^:(E>2(O/B5Y@Z.`&```Y +M7A1V#8O/Z*4&``!#.UX4@34___BT4$C4@!B4T$BTT` +MC6]0B!P!BEX(B\WH]U+__XM%!(U(`8E-!(M-`(@<`8U/=.AA!@``B]B+1@R) +M0R#_-HU+&.C(C____W8$C4L+?BAU;8M&=(L$N(-X(`%U88M&1(`\.`!T6(M& +M+(U>!(O+BP2X4(E%".C^^?__A,!U0(M+$#/`A@!````ZP6+$(E5Z(3)=`>+`(E%[.L' +MQT7L`0```(U?<(O+Z&8:``"+1>B%P'8/B47HB\OH=`0``/]-Z'7T@\=\B\_H +M1AH``(M=[(7;=@J+S^A7!```2W7V_T7PBT7P.T9\2$ +MP'4#BTH$BM#VVAO2]](CU_;8&\")5>`CQXOYB]B+1GC!YP*)7=R+#`>+27R+ +M#)F+7>3!XP)1BP0#BT!PBP20BU7PB47DBT9L_W7DBP20B\CH3"#__S/`B47H +MB47\B47LBT9XQD7\`8L<`XU+&.@A`0``BPB-5>B[,,1"`%)34/\1BT9XBSP' +MBT<8AB%P'0E@WWL`'0?BPB_```(`%?_=>!0 +M_U$,BT7L5_]UW(L(4/]1$(M%Z(M-[(!E_`"%R70)BP%1_U`(BT7H@TW\_X7` +M=`:+"%#_40C_1?"+1?`[1A@/@MS^__^+1BR+3GB`?F``BUT(BP2!=`Z+0'#_ +M,XL(Z/R,___K#XM-#(M`?/\QBPCHZXS__S/_.7XD=E*+10PKPXE%#(M&((M. +M/(M6,(L$N(L,@<'A`BL$$8M6>(!^8`"+#!%T$XM5#(M)?/\T&HL,@>BJC/__ +MZPV+27#_,XL,@>B;C/__1X/#!#M^)'*VBTWT7UXSP%MDB0T`````R<((`(L! +MA(M$)`R+.3E';'0*1H/!!#OR +MP@0`58OLBT444U97_W4,@"``B_'_=0B-3OSH1/W__S/;,_\Y7GAV&CM^8'0/ +MBT9TBPRXZ)0B__\[PW5W1SM^>'+F,_\Y7GAV&CM^8'0/BT9TBPRXZ-(B__\[ +MPW561SM^>'+FBT9@BTYT_W40BPR!Z(CY__\S_SE^>'9-.WY@=!2+1G2+!+B+ +M2`CH,A`!`(7;=0*+V$<[?GARX87;="I^#('C__\``('+```'@(O#Z<0````/ +MCKX````E__\```T```>`Z:\```"-?OQH!$``@(O/Z`3___^%P`^%F````&@. +M``>`B\_H\/[__X7`#X6$````BTYX,_^%R;L0```@=B2+5G2+`HM`;(7`=!`[ +MPW0,@_@!=`<]!4``@'5:1X/"!#OY#/_A=)V +M&(M.=(L!BT!LA=02+QNM)5XM[!#M^"'8D_S;HR+O^_X-F"`"#9@0`@R8`B\?!X`-0 +MZ'Z[_O]9B099B7X(A?^)?@1T$HO'P>`#4/\S_S;H/AP!`(/$#(O&7UY;P@0` +M4XM<)`A6B_$[WG4$B\;K25>+>P0[?@AV)/\VZ&J[_O^#9@@`@V8$`(,F`(O' +MP>`"4.@@N_[_68D&68E^"(7_B7X$=!*+Q\'@`E#_,_\VZ.`;`0"#Q`R+QE]> +M6\($`%:+\>@"M_[_:@3HZ;K^_X7`670%@R``ZP(SP(M.!(U1`8E6!(L67HD$ +MBL-6B_'HU[;^_VH@Z+ZZ_O^%P%ET"8,@`(-@!`#K`C/`BTX$C5$!B58$BQ9> +MB02*PU97B_F+=P2%]G0>4XL'3HL1; +M@V<$`%]>P[B^L4(`Z`\;`0!15HOQZ&VV_O]HB````.A1NO[_68O(B4WP,\`[ +MR(E%_'0%Z!L```"+3@2-40&)5@2+%EZ)!(J+3?1DB0T`````R<-6B_&-3ACH +M/@```#/)C49\B4X$B4X(B4X,B4Y0B4Y4B4Y8B4Y@4````]D0D"`%T!U;HV;G^_UF+QE["!`"X$+)"`.@_&@$` +M45:+\8EU\,<&2-1"`,=%_`4```#H;1___XU.?,9%_`3H6@$``(U.<,9%_`/H +M^````/]V7.B/N?[__W90Z(>Y_O^`9?P`65F+SN@A````@TW\_XO.@\88]]D; +MR2/.Z'8```"+3?1>9(D-`````,G#N#VR0@#HQAD!`%%6B_&)=?#'!E#40@#' +M1?P"````Z/0>__^-3@SH10P!`(U.".@]#`$`C4X$Z#4,`0"+3?1>9(D-```` +M`,G#5HOQZ+#____V1"0(`70'5NC\N/[_68O&7L($`.D'#`$`N%"R0@#H71D! +M`%%6B_&)=?#_=BB#9?P`Z-.X_O__=ASHR[C^_XM&!%F%P%ET!HL(4/]1"(LV +M@TW\_X7V=`:+!E;_4`B+3?1>9(D-`````,G#N&2R0@#H#!D!`%%3B]E6B5WP +MBW,$@V7\`(7V="-7BP-.BSRPA?]T$XL'A+)"`.BV&`$`45.+V5:)7?"++`TZ+/+"%_W03BP>%P'0&BPA0_U$(5^@/N/[_687V==]?_S/H +M`KC^_UE>BTWT6V2)#0````#)PXL!A&(E%^(E5_'4%.U,$=!.+ +M!E-J`%+_=?B+"%#_41"%P'5*BTX(BT8,*TWX&T7\,]([T'(*=P4Y31!V`XE- +M$(LVC4T04?]U$(L&_W4,5O]0#(M-$#/2`4\0$5<4`0N+31014P2%R70%BU40 +MB1%?7EO)PA``58OLBTT4BT4(@^D`="%)=!))=`>X`0`#@.M"BT@8BU`+30R%R7,*N(,`!X#K%XM-#(E($(E0%(M% +M&(7`=`6)"(E0!#/`7<(4`(M$)`C'``(````SP,((`(M$)`B#^`)R![A7``>` +MZR4/MH!8U$(`BTPD$(D!BTPD%&8/MH"8RT(`9HD!BT0D#(,@`#/`PA0`BT0D +M"(/X`G('N%<`!X#K)0^V@%S40@"+3"00B0&+3"049@^V@)C+0@!FB0&+1"0, +M@R``,\#"%`!5B^R#[!"+10PSR4AFB4WP9HE-\HE-^'0\@^@F="^#Z`5T&(/H +M(W4VBT4(_W`T_W`PC4WPZ.7K_O_K(XM%"#E(''0;BT`8_W`$_S#KY(M%"/]P +M$.L!48U-\.B;Z_[__W40C4WPZ)WL_O^-3?#H!NS^_S/`R<(,`+CRLD(`Z'X5 +M`0"![(P```!35HOQ5U:+!O]0$(M%##/_.\R+"(U5[%)H4,5" +M`%")??S_$3E][`^$>04``(U-S.@4NO[_9HF]=/___V:)O7;___^)O7S___^+ +M1>QJ`EN-E73___^+"%)J!%"(7?S_40P[QXE%W'0MC8UT____Z'7K_O__=T_O^+1>R#3?S_63O'Z=T$``#_M7S___^-3^_O^->`&-1:A74(U-S.BI*O__BT7,C4W` +MQD7\`XT$>%#H@;G^_XU%P(U-X%#&1?P$Z`&Z_O^+3>#&1?P%Z`"T_O^-38SH +M&KG^_XU-F,9%_`;H#KG^_XM%Y(!E\P`[P\9%_`>+^P^"$@0``(M-X+J"-3$'Z9H,Y,'4'1RO+._AR\SOX +M#X5]`P``*\>-3+3<"-!$&- +M39A0Z$>Y_O^*1?.(1:2+1:R#^`%S#VB,U$(`C4XDZ*VZ_O_K#4B-3B10_W6H +MZ-FY_O^+70B-582+R^@L%O__B_B%_W1+_W68Z'.R_O__=8SH:[+^__]UX.AC +MLO[__W7`Z%NR_O__=:CH4[+^__]US.A+LO[_BT7L@TW\_X/$&(7`=`:+"%#_ +M40B+Q^G@`@``BT6$BTV(`48PC7X8B4WR-50A2QD7\#/]UM(L(4/]1$(O8@_L!#X2^```` +MA=L/A2L!``"+30B%R0^$O````(U5A.B[%/__B]B%VP^%#@$``(M%A(M-B`%& +M,(E-W(O8$4XTB\_H#T/__XM'!(M5W(U(`8E/!(L/B1S!C5X,B53!!(O+Z*VL +M_O^-10B+RU#H_`L``(M&$(.E#H*[#^__]UP.@CL/[__W6HZ!NP +M_O__=O_O__=<#H +MOZ_^__]UJ.BWK_[__W7,Z*^O_O^#Q!R+1>R#3?S_AO +M_O^+1>R#3?S_@\08A6V2)#0````#)P@@`N`2S +M0@#HK`\!`(/L#%-6B_%7BU80BT8,2H!^&`"-#!)FBSP!="!F@_]Z=0AFQP0! +M80#K#&:#_UIU,&;'!`%!`(72=!3KSV:#_SEU'H729L<$`3``=`;KO3+`ZSR- +M7@QJ,8O+Z">Z_O_K"XM&#(U>#$=FB3Q04XO6C4WHZ.NS_O^+30B#9?P`4.BE +MM?[__W7HZ*JN_O]9L`&+3?1?7EMDB0T`````R<($`+@0LT(`Z`,/`0!14U:+ +M=0A7@V7\`(EE\/]U%(O._W4,Z&#Y__^+^(7_=`:+!E;_4!"+Q^L+N#YR00## +MN`X`!X"+3?1?7F2)#0````!;R<(0`%:+="0(5S/_B7XPB7XTBT8DB7XHC4X, +M9HDXZ-L(``")?AQ?,\!>P@0`BTPD!#/`.4$0BTPD"`^5P(D!,\#""`!5B^R# +M[!`SP(-]$`-FB47P9HE%\HE%^'0?@WT0!G8H@WT0"'/^__]U%(U-\.@QY?[_C4WPZ)KD_O\SP,G" +M$`"X2+-"`.@2#@$`@^P44U8SVU#?1`! +M=0>+10PY&'0*N%<`!X#I>P(``(M%"(M]&(E=X(E=Y/]P-(L/_W`P5_]1##O# +M#X5;`@``B5T0,\`Y712-31#&1?P!#Y7`B_"+!U914U?_4!2+V(7;=!B+11"` +M9?P`AR+PSO#QD7\`8E%#'0&BPA0_U$$:C#&1?P#Z&FL_O]9B\B) +M310[R\9%_`1T">B>"___B_#K`C/V._/&1?P#B744=`:+!E;_4`135XO.QD7\ +M!>A9#/__BT7@BTWDB48HB48@B4XLB4XDB\[H'`W__X7`B47H=#N+113&1?P# +MACI'P$``(M%"#M8$'55BT40ACK=/]U +M%(M%#(L(:@!J`/]U$%=0_U$,B_B%_W0WBT44QD7\`X7`=`:+"%#_40B+10S& +M1?P!A`BTWT7UYDB0T`````6\G"%`"+P3/) +MQT`$5,M"`,=`"$3+0@#'0`P$U4(`QT`0]-1"`(E(%(E(&(E('(E(((E(),<` +MY-1"`,=`!-#40@#'0`C`U$(`QT`,L-1"`,=`$*#40@##58OL4U:+=1!7BWT, +M:A"#)@!;4V@0X$(`5^@("P$`@\0,AQT!HL(4/]1!(M]",9%_`(S]CMW#'-GB5W,B5W4B5W8B5W2B)??QV*E.+022+??R+!)"+6`R)!2+>`@#]Q%= +M_#/_B7@80HEX'#M1*'+86XM%_(EY$(EQ&(EY%(EY"(E!'%\SP%[)PXO!,\F) +M2`2)2"")2"2)2"B)2"S'`!350@##58OL5HMU$&H0:!#@0@#_=0R#)@#HHP@! +M`(/$#(7`="QJ$&B`PD(`_W4,Z(T(`0"#Q`R%P'06:A!HH,)"`/]U#.AW"`$` +M@\0,AP@0`N(.S0@#H!0@!`%%6B_&)=?"#9?P`C4XD +MZ(0!``"+=B"#3?S_A?9T!HL&5O]0"(M-]%YDB0T`````R<.XFK-"`.C*!P$` +M46HXZ!>G_O]9B\B)3?`SP#O(B47\=`7H#````(M-]&2)#0````#)P[BZLT(` +MZ)@'`0!15HOQ,\")=?#'!GS50@#'1@1LU4(`B48(B48,B480B484B47\B488 +MB48@WK/[_BTWTQP8XU4(`QT8$*-5"`(O&7F2)#0````#) +MPU6+[%:+=1!J$&@0X$(`_W4,@R8`Z$\'`0"#Q`R%P'4'BT4(B0;K/&H0:(#% +M0@#_=0SH,@+`TZ+/+"%_W03BP>%P'0&BPA0_U$(5^AGI?[_687V +M==]?_S/H6J7^_UE>BTWT6V2)#0````#)PU.+V5:++\6H$Z(FD_O^+^%F%_W04BT0D#(L` +MA<")!W0*BPA0_U$$ZP(S_XM&!(U(`8E.!(L.B3R!7U["!`!65XM\)`R+\8L' +MA<")!G0&BPA0_U$$BT<(B48(BT<,B48,BT<0B480BT<4B484BT<8B488BT<< +MB48P@0`5HOQZ`\````SP(E&0(E&1(E&2(O&7L.+ +MP3/)B0B)2`2)2`B)2`R)2!")2!2)2!B)2!R)2"")2"B)2"R)2#")2#2)2#B) +M2#S#58OL45%6BW4(5XM^"(/'&%?_%4#`0@"+1@B+3A"+5A0[2!!U!3M0%'0G +MBT`(:@")5?QJ`/]U_(L045#_4A"%P'5.BT8(BTX0B4@0BTX4B4@4BT8(@V4( +M`(U5"(M`"%+_=1"+"/]U#%#_40R+30@!3A"+3@B#5A0`BU80B5$0BU84B5$4 +MBTT4AS````` +MBT4L4XM=%%:+=1B`(`"+0PA7B4WLB_Z+2S#!YP*+#`^-!,B-3:2)19CH"0T` +M`(-E_`"-1:105HO+Z!BM#P``C94T____C4VDQD7\`N@F#0``C8TT +M____Z#W<__^$P`^$)@<``(M3-(M++(M#*,9%&P$/MA0R`Q0/@WT<`(L,T(M$ +MT`1T+HMU'(L6BW8$._!R$'<$.]%V#+X%0`"`Z6H)```[T74*._!U!L9%&P'K +M!(!E&P"+=>R`/@!T%HU6!(V--/___^B<#0``A,`/A3T!``"+=>R`)@"+1EB# +MQEB%P'0)BPA0_U$(@R8`:(0```#H9J'^_UF)182%P,9%_`-T"VH`B\CH00H` +M`.L",\"+3>Q0QD7\`HE!4(O.Z$9P__^+1>R+0%"%P'0%C4@$ZP(SR8M%[(V5 +M-/___U*)2%2+`?]0!(7`#X72````(47H.46H#X:-````,]N+1:2#9<@`@V7, +M`(TT`_]V!(U5R#+)QD7\!/\VZ#/H_O^%P`^%H@```(MV$(/^`74+.47(#X29 +M````ZQ.#?__^-A73___^-3D!0Z*#D__^+1>R+\,8``8M.5(L!_U`4 +M,\D[P71ZB_#IZ`<``,9%_`6+\.L)QD7\!KX!0`"`C4W,Z%_H__^-3`#B4VR) +M3>B+2%2+`?]0#(L(AB+2@P[R0^%<0,``(M%\(7`=">+ +M4@B+,%%24/]6#(OP@?Y7``>`=06^`4``@(7V#X51`P``BT7PZPB%R0^%L0,` +M`(7`QD7\`G0&BPA0_U$(@V7P`(L'C4WP46BPQ$(`5\9%_`S_$(M%\(7`#X3+ +M````BTTTQ@$!BTTPA0`BP&-5>124<9%_`W_4`R+\(7V#X4! +M`P``BT4XBWT\B\_&``'HM`8``#EUY'0-_W7DB\_HR:3^_XMW!(T$-HU-T%#H +M3@L``(M]Y#/)A?;&1?P/=AJ+5=!FBP1/B`1*,]**U(M%T(A42`%!.\YRYO]U +MU(M%\/]UT(L(4/]1#(OPA?8/A9D"``"-3=#&1?P2Z"@+``#_==#HUYW^_UF- +M3>3&1?P3Z*L%``#_=>3_%9#!0@"+1?"+?=R%P,9%_`)T!HL(4/]1"(!EE`"# +M9?``BP>-3?!1:+##0@!7QD7\%/\0BT7PA@SP,9%_!6%]HE%P'08N/___S\[ +M\'<"B\;!X`)0Z-^<_O]9B47`@V7<`,9%_!:%]@^&EP```(MUZ(E%\(M5K#/) +M.4VP=A*+PHLX.WW$=`Q!@\`(.TVP#&1?P7Z,<)``"#?;@!BW4(QD7\&`^&W@```(M-X(M]F(/!$(L&BU<$48L/ +M4P--#!-5$%)15O]0$#O##X2J````B_#I`0,``(M%\,9%_`*%P`^$"P,``(L( +M4/]1".D``P``BT7PQD7\`NODBT7PQD7\`NL-BT7PQD7\`NO2QD7\`H7`=%R+ +M"%#_40CK5,9%_`[K&8U-T,9%_!#HCP@``/]UT.@^F_[_6<9%_!&-3>3H$@,` +M`/]UY/\5D,%"`(M%\,9%_`+KB8M%\,9%_`+K@/]UP.@.F_[__W7HZ`:;_O]9 +M6;X!0`"`Z7<"``"+1>!6C4@(Z,5I___K`XM]F#E=N(E='`^&`P$``#/)B4U` +MBUT,BT40`Q_&1?P9$T<$@WVX`8E%3'4BBW4(45%0BQ935O]2$(O8A=L/A5T! +M``!6C4U`Z'=I___K1VH@Z&.:_O^%P%ET$H-@!`"#8!@`QP#`U4(`B_#K`C/V +M5HU-0.A,:?__BT7@C4X84(E%%.@]:?__BT44B5X0B48(BT5,B484:BCH')K^ +M_X7`6702@V`$`(-@"`#'`+#50@"+\.L",_96C4V(Z`+?__^+R.C^:/___W5` +MC4X(Z/-H__^+1PB+3PPK!\9%_!@;3P2#9A@`@V8<`(!F(`")1A")3A2+14"% +MP'0&BPA0_U$(_T4`"4.B$F?[_B_A9B7U`,\D[\W80BT6(BP2(BP")!(]!.\YR +M\(MU(#OS#X3I````B5T<.5TDQD7\&P^$G````(M%[(M(5/]Q8.AWU?__A,`/ +MA88```!J#.@PF?[_68E%"#O#QD7\''1D_W4DB\CHV@,``.M:BT5`QD7\&(7` +M=`:+"%#_40B+1>#&1?P74(L(_U$(C4V(QD7\`NB#X/___[5T____@&7\`.@3 +MF?[_68V--/___^B4`0``@TW\_XU-I.CZ!0``B\/IF@```#/`4(U-',9%_!OH +MO&?__XM%'(EU%#O#=0.+122+3>S_=2R+2510C444BQ%05_]2'(OPBT4<.\/& +M1?P:=`:+"%#_40A7Z*N8_O]9ZPQ7Z**8_O]9O@5``("+1>#&1?P74(L(_U$( +MC4V(QD7\`NCDW____[5T____@&7\`.ATF/[_68V--/___^CU````@TW\_XU- +MI.A;!0``B\:+3?1?7EMDB0T`````R<)(`%:+\8M&!(7`=`U0:@#_-NAX^P`` +M@\0,_S;H*YC^_UE>P_\Q_Q60P4(`PU:+\8L&A7<(,`%:+\8L&APU:+\5?_="0,C7X$B\_H+````#/)C49XB4YHB4YL +MB4YPB4YTB0B)2`2)2`C'!]S50@#'!M#50@"+QE]>P@0`5HOQC4X$Z%CS__^* +M3"0(,\")1D2)1DB)1DR)1E")1E2)1EB)1F"(3ES'!@#60@"+QE["!`!6B_'_ +M="0(C4X$Z"K5__^#9D@`@V9@`#/`7L($`%:+\>@4````]D0D"`%T!U;HGY;^ +M_UF+QE["!`!6B_'_=E#'!@#60@#HAY;^__]V1.A_EO[_65F-3@3H`O___U[# +M5HMT)!!J$&@0X$(`_W0D%(,F`.CX]@``@\0,A@8 +M````]D0D"`%T"HU&_%#HV97^_UF-1OQ>P@0`N!NU0@#H/O8``%%6B_&)=?"- +M3G3'1?P!````Z%@#``"`9?P`C4YHZ!`#``"-3OSWV1O)(\[H__[__XM-]%YD +MB0T`````R<.+P3/)B0B)2`2)2`B)2`R)2!")2!3#BT0D!%:+\<<&0,U"`(-F +M!`"%P(E&"'0&BPA0_U$$QP8DUD(`B\9>P@0`5HMT)`C_3@2+1@1U%(7V=`Z+ +MSN@-````5N@LE?[_63/`7L($`(M!"(7`=`:+"%#_40C#58OL45-65XOZB_&+ +MS^C,````@V=$`(M&#(U?#%"+RXE%_.BY&O__BT7\@V7\`(E#!(-^#`!V)HM% +M_(M."(O0BP/!X@,#R@/"_T7\BQ&)$(M)!(E(!(M%_#M&#'+:BUX$B\]3Z$W2 +M_O^)7P2+7@2-3T!3Z&D:__\SR8E?1#E.!'8IB4W\BT7\BQ<#!H-%_!B+6!") +M'(J+5T"+&(D6\G#,\")002)01")01SI*\[_ +M_U6+[%%14U:+<017.W($#X7#````@V7\`(7V=AR+`HLY*_B+'`<[&`^%J@`` +M`/]%_(/`!#EU_'+JBT$0.T(0#X63````@V7\`(7`=C&+<@R+00R)=?@I1?B- +M?@2+7?B+,#LT`W5RBW`$.S=U:_]%_(/'"(MU_(/`"#MQ$'+>BWE$@V7\`(7_ +M=B.+0D"+<4`K\(L6\G#,L#K]U:+\?]V +M0.A#D_[_68O.Z,C[__]>PU:+="0(_TX$BT8$=12%]G0.B\[H#0```%;H&Y/^ +M_UDSP%["!`"+01B%P'0&BPA0_U$(P^D`````5HOQ_W80Z/:2_O__=@CH[I+^ +M_UE9BPY>A+^8MW!(7V="93BP=.BQRPA=MT%HU+!.B.Y0``B\OHA^4``%/H:I+^_UF% +M]G7<6_\WZ%V2_O]97U[#N#"U0@#HQO(``%%65XOYB7WP@V7\`(MW!(7V=!*+ +M!TZ+#+"%R73RBP%J`?\0Z^K_-^@CDO[_65^+3?1>9(D-`````,G#N$:U0@#H +M@?(``%%6B_%J,.C+D?[_68O(B4WP,\`[R(E%_'0%Z&\```"#3?S_B0:+"%#_ +M402+3?2+QEYDB0T`````R<.+`5"+"/]1",-3BEPD"%:+\?;#`G0D5XU^_&A[ +MCT$`_S=J&%;H5O(``/;#`70'5^BPU:+="0( +M_TX$BT8$=12%]G0.B\[H#0```%;H09'^_UDSP%["!`!6B_&-1AA0_Q4XP$(` +MBW8(A?9T!HL&5O]0"%[#_W$(Z!:1_O]9PXM$)`2`80X`@&$T`(E!*(M$)`B) +M02"+1"0,B4$DZ+0!``#"#`"X6+5"`.A<\0``45-6B_%7,]N+3BB+1BR+5B"+ +M^<'G!`-X6#O3=`2+$NL"B]$[RG4-,](X7@P/E<*)5?#K!\=%\`(````X70AT +M)#E=\'4?.XC@````)1AB+1P2)1AQU+8-]"`!U)XM&+(M.*#N(X````',,BX#<```` +M@#P(`'4-@'\-`'4'QT7P`@```(MV,/]U\(L&5O]0&(--_/^+\(M%"(7`=`:+ +M"%#_40B+QHM-]%]>6V2)#0````#)P@0`5HOQBT8(A=`-J`UA0Z)+____# +M5HOQ@WXD`'0OBT8LBTXHP>$$BT!8`\&+"`M(!'4::@"+SN@H_O__A#@^$F@```#/`.T8<=P=R"#M.&'(#BTX8.%X/B4T(=`ZX```0`#O(=@6+ +MR(E-"(M&"#/_.\-T$XL0C7T(5U'_=0Q0_U(,BTT(B_@X7@]T$HM5#%&+3A#H +MC>T``(M-"(E&$(M%%#O#=`(!"`%-#"E-$"E.&!E>'(M&&`M&''49B\[H\O[_ +M_SO#=4&+SN@3____.\-U-HM-"#O[=38[RW0IZQR+SNC[_O__.\-U'CE>)'0D +M4XO.Z#G]__\[PW4-BTT0.\L/A3;___\SP%]>6UW"$`"+Q^OUQD8T`;@0```@ +MZ^I6B_&#?B0`=":`?@X`=!'_="0(B\[H.O[__X7`=1/KXVH!B\[HZ?S__X7` +M=-;K`C/`7L($`+C/M4(`Z#GN``"![*@```!3BUT85EAT!HL#4_]0!(-]$/^)=PSVU-7QD7\`NBC[/[_:@&-C4S____HT>C__XE=Y(L'C4WD +M46A`Q4(`5\9%_`3_$&HXZ%.,_O\[PUET&HE8!(E8""!8#,9`#0&)6##'`$#6 +M0@"+^.L",_^+WXE]Q(7_B5W0=`:+!U?_4`3_=>B-1D"-3S#&1?P%B4S&1?P!4(L(_U$(@&7\`(7_=`:+!U?_4`B+113IP`4``(M5W#M5 +M$')0.]C&1?P$=`:+`U/_4`B+1>3&1?P#A3&1?P#AB`9?P`AS&1?P!4(L(_U$(BT7H@&7\`(7`=`:+"%#_40B+1>#IDP(``(M- +MQ&H"Z(?Z__^+^(7_='F-3;C&1?P-Z.'P____=;CH;HC^_XM%V%F%P,9%_`5T +M!HL(4/]1"(7;QD7\!'0&BP-3_U`(BT7DQD7\`X7`=`:+"%#_40B-C4S____& +M1?P"Z`,#``"+1>S&1?P!4(L(_U$(BT7H@&7\`(7`=`:+"%#_40B+Q^D*`@`` +MQD7\#ND>`0``BT7$:@);@W@D``^411>#?>`!=!R!?>`!0`"`=01J`>L.@'T7 +M`'0)@'T+`'0#:@9;BTW$4^C&^?__A<")13&1?P# +MAB`9?P` +MAR#P"`!"(M-K!%(!.EM^O__BTW$:@+HA/C__X7`B440=&NX(9I!`,.+1=C& +M1?P%AS&1?P!4(L(_U$(BT7H@&7\`(7`=`:+"%#_ +M40B+11#K%&H`:@#HH>8``+B5FD$`P[@.``>`BTWT7UYDB0T`````6\G"%`!6 +MB_'H4>[___\VZ-^%_O]97L-5B^Q6BW40:A!H$.!"`/]U#(,F`.A@Y@``@\0, +MA9(D-`````,G#N"*V0@#H +M4N4``%%35HOQ,]N)=?#'!GS50@#'1@2@UD(`C4X0B5X(Z%````")7CB-3D") +M7?SH#P,``(V.E`$``,9%_`'H[(G^_XM-],<&;-9"`,=&!%#60@"(GI`!``"( +MGI$!``#'AJ`!```$````B\9>6V2)#0````#)PU6+[%%35HOQZ(#"_O^)!HE& +M!+@```!`,]N)1A")1AB-3?R(7@B)1?R)1B")7A2)7ASHAL+^_SK#B$8)=&)7 +MBWW\N````'")?B`[^'8"B_@SP#TS,S,#=R!R"('_,S,S,W<64VI04%?H5.<` +M`%-J9%)0Z!KF``#K%%-J9%!7Z`[F``!3:E!24.@TYP``P>\%:_\1B480B7X8 +MB584B5X<7UY;R<-5B^Q6BW40:A!H$.!"`/]U#(,F`.A*Y```@\0,A7<(,`%:+="0(_TX( +MBT8(=12%]G0.B\[H#0```%;H-(/^_UDSP%["!`"X-[9"`.B:XP``45:+\8EU +M\,<&;-9"`,=&!%#60@"#9?P`5NC("```_[:4`0``Z/J"_O]9C4Y`Z!X```"+ +M=CB#3?S_A?9T!HL&5O]0"(M-]%YDB0T`````R<-6B_'_MC0!``#HQ8+^__^V +M,`$``.BZ@O[__[8@`0``Z*^"_O^#Q`R+SN@"````7L-6B_%7_[;P````Z)2" +M_O__MN@```#HB8+^__^VW````.A^@O[__[;0````C;[$````Z&V"_O__-^AF +M@O[__[:X````C;ZL````Z%6"_O__-^A.@O[__[:@````C;Z4````Z#V"_O__ +M-^@V@O[__[:(````C7Y\Z"B"_O__-^@A@O[__W9PZ!F"_O__=F3H$8+^__]V +M6.@)@O[_@\0XB\[H`P```%]>PU:+\?]V3.CQ@?[__W8\Z.F!_O__=CCHX8'^ +M__]V-.C9@?[__W8PZ-&!_O__=BSHR8'^__]V*.C!@?[__W8DZ+F!_O__=ACH +ML8'^__]V#.BI@?[__W8(Z*&!_O^#Q"Q>PU:+\>@@````C88@`0``,\F)"(E( +M!(E("(F.,`$``(F.-`$``(O&7L.XD;9"`.CAX0``45%6B_%7B77PZ*X````S +M_XE]_(E^6(E^7(E^8(E^9(E^:(E^;(E^<(E^=(E^>(U&?(DXB7@$B7@(B7@, +MB7@0B7@4C8:4````B3B)>`2)>`B)>`R)>!")>!2-AJP```").(EX!(EX"(EX +M#(EX$(EX%(V&Q````(E%[(DXB7@$B7@(C4@,QD7\!N@[[O__C8;<````BTWT +MB3B)>`2)>`B-AN@```").(EX!(F^\````(O&7UYDB0T`````R<.+P3/)B0B) +M2`2)2`B)2`R)2!")2!2)2!B)2!R)2"")2"2)2"B)2"R)2#")2#2)2#B)2#R) +M2$"(2$2)2$B)2$R)2%")2%3#BT0D!(M,)`B+@)P```")`3/`P@@`BT0D"(,@ +M`#/`P@@`N`%``(#"%`!5B^R#[!"+10PSR8/H1V:)3?!FB4WRB4WX=%Q(=#B# +MZ!4/A8H```"+10@XB(H!``!U&#B(BP$``'40.(B,`0``=0@XB(X!``!T9VH! +MC4WPZ#>V_O_K6XM%"#/2.(B,`0``=`-J`EHXB(T!``!T`X#.`3O1=#SK,8M% +M"#/2.(B(`0``=0-J`5HXB(H!``!T`X/*`CB(BP$``'0#@\H@.(B.`0``=`.` +MS@%2C4WPZ/^U_O]6C4WP_W40Z`"W_O^-3?"+\.AGMO[_B\9>R<(,`%6+[(/L +M)(M5"%-6@_K_5P^$M0```(M!>(M)?(LTD(M$D`2#9>0``\XKQHE-W(U-W(E% +MX.CL"0``A<")1?0/A(<```"-3=SH4`@``(M-Y(A%"X/@#VH`B47XBT7<7U>- +M-`%;B7W\=C.+1?QJ"%D/M@0PF8E%\(E5[(O'B]/HA^(``(M-\`O(BT7L"\+_ +M1?R+V(M%_#M%^(OY2!_P$'\09U!(7;="?V10L@=`^-3=SH:@D` +M`(-E[``!1>3_3?0/A7G___\RP%]>6\G"!`"P`>OUBT0D#(,@`(M$)!#'`#X` +M```SP,(0`(M$)!"#(`"+1"0,@PC_,\#"$`!5B^R+11A65XM]%#/V@WT0`XDW +MB3"+11R),'5)BTT(BX$L`0``.\9T/(N1)`$``#O6=#*+=0Q3BPRPBT2P!(O9 +M:=O___]_`\-;T>`]````@',3C0Q*B0^+31B)`8M%',<`40```%\SP%Y=PA@` +M5HMT)!17B\[H#[7^_X7`#X6T`0``BT0D$(M,)`R+^(N1F````,'G!`/7BWPD +M%(/_"P^'ZP````^$V0```(/O`P^$P0```(/O`P^$HP```$\/A)4```!/=$I/ +M=!-/#X5D`0``4(V1I````.E1`0``.X$(`0``C9$$`0``#X-&`0``BQ*`/`(` +M#X0Z`0``BXD0`0``BP2!9L<&$P")1@CI)`$``(N1=`$``(L4@H/Z_W0HB[EP +M`0``.027#X4'`0``4H/!0.@%`0``B48(9L<&%0")5@SI[@```(-F"`"#9@P` +M9L<&%0#IW````(L"BU($Z]>*4@UFQP8+`/;:&])FB58(Z<````!64(/!0.C9 +M#0``Z;,```!0C9&\````Z9X```"#[PP/A(X```"#[P-T>8/O!'1A3T]T,X/O +M"`^%A0```('![````#M!!'-ZBQ&`/`(`='*+40R+#,*+1,($B4X(9L<&%0") +M1@SK6SN!(`$``',1BXD<`0``@#P!`'0%:@%8ZP(SP/;8&\!FQP8+`&:)1@CK +M,8!Z#@!T*XM2"&;'!A,`B58(ZQZ+D70!``#_-(+HW/S__^O.4(V1U````(O. +MZ"T````SP%]>PA``BT$PBU0D!(M)"%:+=)`$5XL\D(L$\2L$^8M4\00;5/D$ +M7U["!`"+1"0$5CM"!',MBS*`/`8`="6+<@R+%,:+1,8$9H-A!`!F@V$&`&;' +M`4``B5$(B4$,9L=!`A<`7L($`+BWMD(`Z$+<``"![)````!35HMU"%>)9?`S +MVXL&5HE=_/]0$(M]%,9%_`$[^XE]['0&BP=7_U`$B5T4._O&1?P#=`Z+!XU- +M%%%H\,1"`%?_$(F=9/___XF=:/___\9%Y`'_=1"-C63____&1?P$B)Z(`0`` +M_W4,Z.D(```[PXE%$'0[BX5D____QD7\`SO#=`:+"%#_40B+113&1?P".\-T +M!HL(4/]1"#O[QD7\`70&BP=7_U`(BT40Z)7?R+ +M1CB)9?`[PW0)BPA0_U$(B5XXC4Y`Z#<```"-CI0!``"(GI`!``"(GI$!``#H +M8.+__S/`ZPNXKJ9!`,.X#@`'@(M-]%]>9(D-`````%O)P@0`4U:+\3/;5XB> +M2`$``(B>20$``(B>2@$``(B>2P$``(B>3`$``(B>3@$``(B>30$``.A/```` +MC8[X````Z#@!``#_MC`!``"-OC`!``#H@WG^_XD?_[8T`0``C;XT`0``Z'!Y +M_O]9B1]9B9XX`0``B9Y``0``B9X\`0``B9Y$`0``7UY;PU-65XOQZ'(```"+ +MAN@```"-GN@````S_SO'=`E0Z"YY_O]9B3N)>P3_MO````"-GO````#H%WG^ +M_XD[B7Y6\-65XOQ,_^)/O]V".C$>/[_B7X(B7X$ +MB7X0B7X<_W8DZ+!X_O^)?B3_=BCHI7C^_XE^*/]V+.B:>/[_B7XL_W8PZ(]X +M_O^)?C#_=C3HA'C^_XE^-/]V..AY>/[_B7XXBT8\@\0<.\=T"E#H9GC^_UF) +M?CR)?D!?7L,SP(E!"(E!$(E!&(E!((E!#(E!%(E!'(E!)(E!+,.#;"0$!.EN +M]/__@VPD!`3IT]'__X-L)`0$Z<[T__^+400SP(72=`^+"0/1@#D`=`%`03O* +M=?7#5HOQ@'X$`'0@BPZ+03B+4`0K4`AT!,9!/`&*1@6+#E#H!@```(!F!`!> +MP_])!(M!!'09@'PD!`"-!$"-%(&-0OR)03AT!HM*$`%(",($`%:+\>BI____ +M_W0D$(M,)`R)#O]T)!#HD0```(I$)!3&1@0!B$8%7L(0`(M$)`AJ`/]P!/\P +M_W0D$.C"____P@@`58OL45.)3?SH8____XM="(M+..B)````A,!T,E97BWT, +MA?]U!>@I````BTLXZ/@!``"+\#MW!'(%Z!4```"+!XM-_/\TL%/HG?___U]> +M6\G""`!5B^Q1BD7_:`@60P"(1?^-1?]0Z*/7``!6B_&#?@0$=07HVO___XM& +M!(T,0$")1@2+1"0(C4R."(E..(OQ@V8(`(D&BT0D#(E&!%[""`!6B_&+1@@[ +M1@1R!>BB____BTX(BP:*!`%!B4X(7L-65XM\)!"+\87_="6+1@0K1@@[^'8% +MZ'G___^+1@A7`P90_W0D%.@VUP``@\0,`7X(7U[""`"+5"0(5HOQ5XM\)`PS +MR8M&!"M&"#O1<@MW!#OX=@7H.____P%^"%]>P@@`5HOQZ`L```!24(O.Z,3_ +M__]>PU6+[%%35HOQC47\5U"+3@B+5@0KT0,.Z!X```"#??P`B_B+VG4%Z/7^ +M__^+1?R+TP%&"(O'7UY;R<-5B^R#[!!3B]I65X7;B_$/A)P````/M@9&2ZB` +MB47X=0Z+30C'`0$```#IB@```(7;='X/M@:9:@%&B47PB57T2U_'1?P(```` +MN(````"+S]/HBTWXA<%T.87;=%0/M@:+3?R9Z#C9```)1?`)5?2#1?P(1DM' +M@WW\0'+-BT4(BU7TQP`)````BT7P7UY;R<($`(MU"$B-5P$CP8O/B1;!X0,S +MTNCXV```"T7P"U7TZ]J+10B#(``SP#/2Z\Y5B^Q1Z`#___^%TG<'/?___W]V +M%(I%_VA(%D,`B$7_C47_4.B\U0``R<-6B_&+1@B#P`0[1@1V!>CL_?__BTX( +MBP:+!`&#P02)3@A>PU:+\8M&"(/`"#M&!'8%Z,G]__^+3@B+T8/!"`,6BP*+ +M4@2)3@A>P[C8MD(`Z$;5``"#[!A35HOQ5XM-"&H@C7Y8B]?HHMG^_X7`#X6" +M`0``B\_H_`$``(3`=`B)1>QS.>L#BT7L +M:A2+^"M]Y%J-2`SHZ=(``(M-[#M!"'1&BT7PC0P[C10#B57HZ),````[1>B) +M1>QRS(M]Y(M%\&H@`47<@U7@``/'4%?_%6C!0@"+70R#Q`SI./___XOPZT)J +M`5[K/6H@C49845#H$=0``(/$##/``WW`!?D!:4E(11D2+1D"+ +M=D2+.8/`(!/R5E!1_U<0BWWDB_"+S^@780``B\:+3?1?7EMDB0T`````R<(( +M`(L)Z?U@``!3B\([R'-@BED%@\$&@/LW="^`^WIT%H#[O'04@/NO=!.`^R=T +M$X#[''03Z]9)ZQ%)2>L-@^D#ZPB#Z03K`X/I!8!Y`;QUO(!Y`J]UMH!Y!!QU +ML(!Y`R=UJH`Y>G6E@'G_-W6?C4'_6\-6B_&`?@*\=3"`?@.O=2J`?@4<=22` +M?@0G=1Z`?@%Z=1B`/C=U$VH4C4X,6NBCT0``.T8(7@^4P,,RP%[#5HOQ@V9X +M`(-F?`#H.````(M,)`B-1DA0C59`Z&36_O^%P'4@_W0D#(O._W0D#.AD_?__ +MAP@@`5HOQBP:#9@0`APU:+\8M...B]^___"\)T"HM...B>^___Z^I>P@0`58OL@^PP4U97B_F) +M?=CHC_S__XO8,_8[WHE=Z`^$30(``(/[0`^'1`(``(M-"%/H"Q\``#O>B77T +MB77X#X85`0``B77LBT4(BW7LB\\#,.C%^O__J,"(1?\/A10!``"#X`^+R(/Y +M"(E-W`^'%P$``(M'"(M7!"O0.\H/AP1V.^L# +MBT7DBTWP:@@/M@0!F8OX68E]X(OZBU74B\/HU-0``(M-X`OZ"\C_1?"+V8M- +MW#E-\(E]U'+*BWW8BT<(`\'V1?\0B4<(BT74B1Z)1@1T$XO/Z+G[__^+SXE& +M$.BO^___ZP?'1A`!````]D7_('0CB\_HF?O__XU>"%"+RXE%W.A`U/[__W7< +MB\__,^@4^O__ZQ:+1@B%P'0+4.B]CH8QX``(-E^`"%VW90ZRN* +M10MH2!9#`(A%"XU%"U#H_]```(I%"VA(%D,`B$4+C44+4.CKT```BW7HBP:+ +M3?B--,B+S^CU^O__B\^)!NCL^O___T7XB48$.5WX6\G"!`"*10MH2!9#`(A%"XU%"U#H`]`` +M`%6+[(/L#(M!.(M5"(M)/%:+-)"+1)`$_W4,@V7\``/.*\:)3?2-3?2)1?CH +M3?W__XM%^%XK1?QT%8U%"&BPXT(`4,=%"&@#,P'HM<\``,G""`!35E>+^8M, +M)!3H)*;^_XN'\````(7`=&6#O^@`````=%R+3"00BQR(BW2(!"OS@?X`0``` +M+3"04C5;_Z+"D_O^%P'4YBT0D%(7VBT@(BX?H````C1Q8=B-FBP-#0V8] +M+P!U!6I<6.L+9CU<`'4%N%SP``!FB0%!04YUW3/`7UY;P@@`5HOQBTXXZ$;X +M__\[1"0(=08[5"0,=!,+PG4%Z%'W__^+3CCH%OC__^O97L((`%6+[%%35E>+ +M?0B)3?R+7P2-=PQ3B\[HZJO^_XE>!(L&BS\S]H7;=B.)10@SP#@$/G0+BT7\ +MBT@XZ`?Y__^+30B#10@$1COSB0%RX%]>6\G"!`!6B_'_="0,_W0D#.B1#``` +M_W0D#(O.Z)/___]>P@@`N.RV0@#H8\X``(/L(%-65XOYBT\XZ(_X__]J`&H) +MB\^+\.@Z____BT4(C5@(C48!4(O+Z!<<``"+10@SR3OQB4WLB3")3?")30AV +M.^L#BTT(BP.+5>R)%,B+5?")5,@$BT\XZ$KW__\!1>P15?`Y5?!W#'(%.47L +MR)!/.+1?")1/,$BT\XZ!3W__^+R`O*=$Z# +M^`IU/S/`.]!U.8E%U(E%V(E%W(E%X(E%Y(E%Z(E%_(U%U%!6B\_H$?____]U +MX(--_/_H&FW^__]UU.@2;?[_65GKKHM/..BO]O__ZZ2+3?1?7EMDB0T````` +MR<($`+@0MT(`Z&#-``"#[%Q35E+\6H+Z$+^__^+3CCH@O?__X!EM`"` +M9;4`B47HB7WD_W4(C4VPB7W\5N@[]?__BT8XBWT,BU@(C4\P`QB+1>B)1P1` +M4(E=S.@:&P``_W7HC4\TZ#P;``"+1>B-3SA`4.@"&P``BT7HC4\L0%#H]1H` +M`#/)B4V8B4VR+3=B+4`@KTXM=U`,0BTP,``(M#!"M#"#E%X'8%Z*+T__^+2PB+`P/!,\DY +M3>")1<")3;B)3;R)3=QV.NL#BT7`BTW<:@@/M@0!F8OXBT6XB]J+5;Q9Z"3/ +M```+^`O:_T7`#P8E#"(%_4(`` +M``!S#O]UO(U/3/]UN.A&&```]D4+$,=%W`$```!T(XO+Z._U__^#^$")1=P/ +MA^D"``"+R^C<]?__@_@!#X7M`@``BT7<`47L@WWL0`^'\0(``/9%"R!T;8O+ +MZ+;U__^+2P2)10@K2P@[P78(Z,WS__^+10B#?;@A=2"#?;P`=1J#^`%U/8M. +M.(M1"(L)B@P*.$]$H```"+7=CKXXM5[$@[T`^"5P(``(U-F.CE`@``BU7PC4VD +MZ-H"``"+1?"#90@`2(7`=E&+3CCH[O3__SM%[`^#3P(``(M-F`/!@#@`#X5! +M`@``Q@`!BTXXZ,ST__^+3?`[P0^#%P(``(M5I`/"@#@`#X4)`@``_T4(Q@`! +MC4'_.44(Q)*\&#^`&)1=QT-(-E"`"%P'8LB\OHA?3__SM%[`^# +M^@$``(M-F`/!@#@`#X7L`0``_T4(Q@`!BT4(.T7<2)!)D#1?"+3=")1>2+ +M1S")#)B+!RO!.47<=@7H//+__XM%W(I-Q`%%T(M'-(@,&$,[7>B)7=0/@@3] +M__^+1CB+3RR+5>2+6`@K72)5-G\R```BD4/:$@60P"(10^-10]0 +MZ,K(``"*10]H2!9#`(A%#XU%#U#HML@``(I%#VA(%D,`B$4/C44/4.BBR``` +MBD4/:$@60P"(10^-10]0Z([(``"*10]H2!9#`(A%#XU%#U#H>L@``(I%#VA( +M%D,`B$4/C44/4.AFR```BD4/:$@60P"(10^-10]0Z%+(``"*10]H2!9#`(A% +M#XU%#U#H/L@``(I%#VA(%D,`B$4/C44/4.@JR```BTXXZ#3Q___IY/[__XM- +M]%]>6V2)#0````#)P@@`4XO:5HOQ4^B6K___B5X$BS:%VW86B\M7B]$SP(O^ +MP>D"\ZN+RH/A`_.J7UY;P^D[[___N"2W0@#HK\<``(/L-%-6BW4(5XO9_W8$ +MC7XDB\^)7?#HHQ4``#/`.48$=@^+#\<$@0$```!`.T8$@`@_@!=DY(B47LZP.+7?"+2SCH%O#__XO/B474B]KH;_C^_XM'!(L7 +MC4@!B4\$BTW4`4WDB0S"B5S"!!%=Z#E=Z'<,<@4Y3>1S!>C^[O___TWL=;B+ +M5C2+70B+3BR+1B@/MA0:BUT,`Q0+BPS0B4W,BUS0!#M=Z'<,<@4[3>1S!>C( +M[O__B\_H!OC^_XM'!(L7C4@!B4\$BTW,*TWD&UWHB0S"B5S"!(M=\/]%"(M% +M"#M&!`^"*?___XM+..AL[___B47!(E="'9KBT8DB\O!X0*) +M30R+!`&#^`&)1>AV".A?[O__BTT,@WWH`74^BU8TBT8H#[8<&HM6+`,<$8O+ +MB5T,BQS(BT3(!(O/B470Z'7W_O^+1P2+5="-2`&)3P2+#XD#(`\`P!U`P%- +M[$`[1@1RX8M%W(M=$`M%X`^$#P$``(-]W`H/A>$````SP#E%X`^%U@```(E% +MP(E%Q(E%R(M-\(E%_(U%P%#_=>SH5`,``/]W!(O+Z%P!```SP#E&!(E%#(E% +M$(E%"`^&C@```(M6)(O(P>$"BQ01@_H!B57H=2X[1A!S*8M6#(`\`@!T'8L# +MBU4,Q@00`8M&&(M3#(L$"(M-#/]%#(D$BNM`BU7HA=)V/(E5Z(M%$(M-P(M5 +M#/]%$(H,"(L#B`P0,\"$R70+BT7PBT@XZ!KO__^+2PR+50S_10S_3>B)!)%U +MRHM%"$`[1@2)10@/@G+_____=<"#3?S_Z!!D_O]9ZPN+1?"+2#CHJ^W__XM% +M\(M(..BS[?__B47<"\*)5>`/A?'^__^+?P0Y>P1T;E>+R^AW````,](SP#E6 +M!(E5"'9:BWXDB\K!X0*+/`^#_P&)?0QU)CM6$',ABWX,@#P7`'08BQ/&!`(! +MBU88BWL,BPP*BU4(B0R'0.L8BTT,A+ +MSNCDH/[_B7X$7U["!`!5B^R#[!!35E>+^8M/..CG[/__BW40@_@&B47XB57\ +M=6:%TG5BBT\XZ,WL__^+70R)`XO"B5,$.T=4<@YW!XL#.T=0=@7HT.O__U:+ +MS^CV]/__BP:+3@B-%,&+3U`K"XM'5!M#!(M:!#O8<@UW!HL".\%V!>BAZ___ +MBT\XZ'GL__^)1?B)5?R#??@'=1^#??P`=1E6B\__=0CHK?7__XM/..A4[/__ +MB47XB57\@WX$`'0;@WX(`(U>"'42:@&+R^C3$```BP.#(`"#8`0`@WWX"'4A +M@WW\`'4;_W48B\__=116Z!7[__^+3SCH"^S__XE5_.M5_W8$C4XDZ,40```S +MVSE>!'9`BWT4BT8D4XO.QP28`0```.@_````B\^)1?")5?3H-_3^_XM'!(M5 +M\$.-2`&)3P2+#XD4P8M5](E4P00[7@1RPXM%^`M%_%]>6W0%Z,3J___)PA0` +MBT0D!(M1+%:+<32+%(*+22@/MC0&`]9>BP31BU31!,($`%6+[%%35HMU#%>+ +M?0B)3?Q7B\[HUZG__S+`,LDSVXE^!(LVA?]V((3)=0V+1?R+2#CHMNK__[&` +MA,@/E<*(%#/0Z4,[WW+@7UY;R<((`%-6B_&+3CCHDNK__X3`=1'_="00B\[_ +M="00Z)/____K,HM<)`R+="004XO.Z'"I__^)7@2+-H7;=AF+RU>+T;@!`0$! +MB_[!Z0+SJXO*@^$#\ZI?7EO""`"X.+="`.B)P0``@^P,4XM=$%97BWT,B4WP +M5U/HB/___X!E[`"`9>T`_W4(@V7\`(U-Z/]U\.AKZ?__C7<,4XO.Z*#F_O^# +M90P`B5X$BS:+/X7;=B>+30PSTC/`.!0Y=`N+1?"+2#CHL>O___]%#(D&B58$ +M@\8(.5T,+^8V-9/___^BVW___,]N)7?R)7=2)7=B)7=R-3;S&1?P! +MZ*C-__^-3P/AAP!``#K`XMU +M[(M-%.C&#@``B\B+19B)3>0/MA0PBT60`Q2PBT6,BS30._:+1-`$#X54`0`` +M.]@/A4P!``!6Z"+#_O^-3>CH\`X``(M%Y%-3:@&+"(M%Z%/&1?P%_W4DB4@( +MC4WSB5@0_W4@B7`,BP>(7?/_=1S_=1A14U.-C63_____=>A3_W7L48M-$(L1 +MBTD$`U4($TT,45)0C8T(____Z(:\__\[PXE%X`^%[````#A=\W0$QD<\`8M% +MZ#MP$'0%Z!+H__^+1>P[A73___]S+XN-C8Y___BT7HQD7\!%"+"/]1"/]%[(M%[#N% +M:/___P^"YO[__XN%;/___SO#=!.+C63___^+%,B+1,@$`5=X$4=\C8T(____ +MQD7\`^B&V?___W7(Z*E>_O__=;SHH5[^__]UU.B97O[_@TW\_X/$#(V-9/__ +M_^B+W/__,\"+3?1?7EMDB0T`````R<(@`(I%$VA(%D,`B$43C4434.CWO@`` +MBT7HQD7\!%"+"/]1"(V-"/___\9%_`/H&=G___]UR.@\7O[__W6\Z#1>_O__ +M==3H+%[^_X--_/^#Q`R-C63____H'MS__XM%X.N0N-VW0@#H@KX``('LD``` +M`%-6B_%7BTXXZ+3G__^+?0B#^`*)1>R)5?!U)#/;.]-U((V'^````(O.4.C* +MZ___BTXXZ(KG__^)1>R)5?#K`C/;B5WP$QD7\`W5$.5WP=3^-A63___^-GQ`!``!0C4644%>-1=Q3 +M4(O.Z++Y__^+AP@!``"+CPP!```!`Q%+!(M...B3YO__B47LB57P,]N#?>P% +M#X70!```.5WP#X7'!```BTXXZ&?G__^-GR`!``")10B+R^C%[O[_BT,$C4@! +MB4L$BPO'!,$)````@V3!!`"+R^BG[O[_BT,$C4@!B4L$BPO'!,$&````@V3! +M!`"#?0@`=B@SP#F%:/___W0@B\OH>>[^_XM#!(U(`8E+!(L+QP3!"@```(-D +MP00`,\")1:")1:2)1:B)1:R)1;")1;2)1;B)1;R)1<#&1?P&B440BTXXZ-'E +M__^+3CB)1<0+PHE5R`^$IP(``.B[Y?__BTXXB47,B570BT$$*T$(,\D[T7(, +M=P4Y1BZY/__@&6``(!E@0"+1CAJ`?]US,9%_`>+2`@#"%%6C8U\____ +MZ`#D__^#?<@`#X<=`@``<@V!?<0```!`#X<.`@``BT7$@\#R@_@+#X?_`0`` +M_R2%!B+A^@```"+3CA0Z([D__^+10B-C_````!`4.B\"0`` +M,\`Y10B)11B)10QV78M%Z(M5&(N/Z````"O"T>B-#!''110`````=!!F@SD` +M=`K_111!03E%%'+P.444=07HS^/__XM5&(N'\````(M-#-'JB12(BT48BU44 +M03M-"(E-#(U$4`*)11ARHXM-&(N'\````(M5#-'IB0R0BT7H.448=`3&1CP! +MQD7\!XU-A.L_C8?$````B\Y0_W4(Z"'Y__^`99``@&61`(U%W(U-C%!6QD7\ +M">@%X___C8?$````B\Y0Z`?L___&1?P'C4V,Z%OB__^+R^A\[/[_BT,$BU7$ +MC4@!B4L$BPN)%,&+5A- +MXO__C8U\____QD7\!NA;X?__Z4#]___H%./__XE%[(M%""M%$(E5\#M%F'04 +MBD4+:$@60P"(10N-10M0Z,JY``"#91@`@V44`(U-N.@#X?__A<")1>AT%O]U +M"(V?W````(O+Z#FA__^+10B)0P3_=0B-7UB+R^AK"```BT4(B4,$,]N%P(E= +M#`^&T@```"%=$(M'6(M5&`-%$(-@"``[7:1S"(M-H(H,"^L",LF$R754($@- +MBUT4QD`,`8M-E#+2C0S9BQF)&(M=%(M)!(E(!#N=:/___W,0BXUD____.!0+ +M=`5J`5GK`C/)A,F(2`YT#(N-@`=`F+A]P```"(%!B#11`00SM="(E=#`^",?____]UN.@,6/[_ +M_W6LZ`18_O__=:#&1?P#Z/A7_O^#Q`R+S^B*````BT7L"T7P=0N+=CB+1@0K +M1@AT!\:'30$```'_M7#____HR5?^__^U9/___^B^5_[__W64Z+97_O^#3?S_ +M@\0,C4W6V2)#0````#)PA0`6\9!`'[&00"#QD$`$,5! +M`)[&00"FQD$`KL9!`//%00`(QT$`",=!`)/&00#(QD$`58OL@^P,4U:+\5?_ +M=@2-CC`!``#HT04``/]V7(V.-`$``.C#!0``,\`S_S/;.49+?0B+\8O/Z)3<__^+1D")AP`!``"+1D2)AP0!``"*3EZ-A_@```"("(I. +M7X`X`(B/^0````^%"P$``(M.:(M&9(E-Z(M.<(M>;(M61(E-V(M.=(E-"(M. +M0(/!(&H@B8\(`0``68/2`("G2`$```")CT`!``"#IT0!````@WWH`(E%Y(E= +MU(F7#`$```^,M````'\(A<`/@JH```"+5=B!^@```$`/AYL```!R"(7;#X>1 +M````B4YX@V9\`(O+"\IU*`M%Z'5_@WT(`'5YQH=(`0```8M&>(F'.`$``(M& +M?(F'/`$``#/`ZU^`OTP!````=0?&AT@!```!`5YXBTWHB490B4Y4$59\`]@3 +MT8O#@\`@B\J#T0")AT`!``")CT0!``"+3D@KCP@!``"+1DP;APP!```[PG6V2)#0````#)PA0`BP9J`&H!_W7HBPC_ +M=>10_U$0A`Z\:#9>P`@V7P`(7;=`U3Z*Q4 +M_O]9B47LB5WPBPZ+5>R#9?P`4^BTN?[_AR+T^C``@&7A`(U%[(U-W%!6QD7\ +M`>CTW/__,]N)7__^#^`%U!#O3='B#^!=U!#O3 +M=`7H,-W___]U&(U%R(O._W44_W40_W4,4(V'&`$``%#_MPP!``#_MP@!``#H +MIO/__SO#=6DY7CRW/__C4W+?0B)9?#_=1B# +M9?P`B_'_=13_=1#_=0Q7Z.'\__^`?CP`=`?&ATH!```!/0%``(!U-XI%"VA( +M%D,`B$7OC47O4.C5LP``BT4(QH!.`0```;A[S4$`PXM%",:`2@$```&X>\U! +M`,-J`5B+3?1?7F2)#0````!;R<(4`%6+[%%35HMQ!#/;A?97B4W\=#*+$8T$ +M'M'HBSS"BTS"!#E]"'4%.4T,="@Y30QW"W(%.7T(+?0B+V3M[!'1F +M5C/VA?]T3+ZJJJH*._YW`HOWC01VC03%!````%#H0U+^_UF)1?"#9?P`A`16:AA7B3#H]K,``(OWBWT(ZP(S]H--_/^+"X7)=`=J +M`^ARP/__B3.)>P1>BTWT7UMDB0T`````R<($`%97BWPD#(OQ.WX$="Q3,]N% +M_W07N/___Q\[^'<"B\?!X`-0Z,=1_O]9B]C_-NCQ4?[_68D>B7X$6U]>P@0` +M5E>+?"0,B_$[?@1T+%,SVX7_=!>X____/SOX=P*+Q\'@`E#HB5'^_UF+V/\V +MZ+-1_O]9B1Z)?@1;7U["!`!6B_'_-NB=4?[_@R8`N/___Q\Y1"0,67<$BT0D +M",'@`U#H35'^_UF)!E["!`!6B_'_-NAP4?[_@R8`N/___S\Y1"0,67<$BT0D +M",'@`E#H(%'^_UF)!E["!`!6B_'_-NA#4?[_BT0D#(,F`(/X_UEV`X/(_U#H +M^5#^_UF)!E["!`!6B_'H_$S^_VH(Z.-0_O^%P%ET"8,@`(-@!`#K`C/`BTX$ +MC5$!B58$BQ9>B02*PU97B_F+=P2%]G0?4XL'3HL+?0B#9@0`.WX( +M=D:!_____W]V%8U%"&BPXT(`4,=%".4'``#H];```/\VZ%=0_O^#)@"#9@@` +MN/___P]9._AW`HO'P>`$4.@'4/[_68D&B7X(7UY=P@0`N#:X0@#HG+```%%H +MJ`$``.CF3_[_68O(B4WP,\`[R(E%_'0%Z"'+__^+3?1DB0T`````RPY"0D)"0D)"0D)"0D)!65XOQOP4```"+#NC` +M/```@\8$3W7S7U[#D)"0D)"0D(I4)`13,]M5A-(/E<-6@\,$5[T`````=$N+ +M\8M^*(/G_(/_!',%OP0```"+#H7)=!0[?A1T)H7)=`OH<3P``,<&`````(O/ +MQT84`````.@]/```AY!````+\0X$(`B_`SV\<" +M`````/.G=16+1"007XD"7HM($%M!B4@0,\#"#`"Y!````+]`PT(`B_`SV_.G +M=16+1"007XD"7HM($%M!B4@0,\#"#`"Y!````+^PPT(`B_`SV_.G=1R+1"00 +MAB4@0,\!;P@P`N00```"_P,-"`(OP,]OSIW4B4@0,\!;P@P` +M7UZX`D``@%O"#`"0D)"0D)"0D)!6BW0D"(M&$$B)1A!U%H7V=!"+SN@7```` +M5NAZ3?[_@\0$,\!>P@0`D)"0D)"0D)"%R70%@\$8ZP(SR>FP_?__BT0D!(M4 +M)`B+3"0,B4R0-#/`P@P`D)"0D)"0D)"0D)"+1"0$BTPD#(E(1#/`P@P`BT0D +M"(M,)`2%P`^5P(B!U`(``#/`P@@`D)"0D)"0D)!35E>-46"-@9````"[!``` +M`#/_B[!P____@\((B7#PB3")>*R)>+R)>OB)>OR#P`1+=>!?7H'!@````%OI +MGSL``)"0D)"0D)"0D)"0D)"0D%%35597B_F+MZ@```"+!+>+K+>`````B82W +M@````(F$MY````"+7+=,A=MV#2OHB\N*%"B($$!)=?>+1+<\A<`/A;T```"+ +M1+<4BVPD&(U4)!`KPXM-`%*+%+>)1"044(O#`\)05?]1#(M,)!")1+<\A+"(M`!"O+&\4STCO0<@AW!#OY=@*+^8M&*(F&N`````/'A?^)AKP` +M```/A*X```"+1"10A<`/A($```"+AK@```"+3BB+?"00*\$SR0/#B]`3S2O7 +MB_D;?"04B7PD+'4(@?H````!75N#Q"#"(`"*AM@"``"$P`^$^````(N& +MT````(7`=`]?7EVX`0```%N#Q"#"(`"+AL````"%P'04@_@(=`]?7EVX`0`` +M`%N#Q"#"(`"+1"1(A+ +M?,APBTS(=(M$)!0#UC/V*_H;SHDXB4@$7S/`7L(,`)"0@VPD!`3I9OG__\S, +MS,S,S(-L)`0$Z08;``#,S,S,S,R#;"0$!.E6^O__S,S,S,S,@VPD!`CI-OG_ +M_\S,S,S,S(-L)`0(Z=8:``#,S,S,S,R#;"0$".DF^O__S,S,S,S,@VPD!`SI +M!OG__\S,S,S,S(-L)`0,Z:8:``#,S,S,S,R#;"0$#.GV^?__S,S,S,S,:O]H +M2[A"`&2A`````%!DB24`````46C@`@``Z#5'_O^#Q`2)1"0`A<#'1"0,```` +M`'06B\CH1OC__XM,)`1DB0T`````@\00PXM,)`0SP&2)#0````"#Q!##D)"0 +MD)"0Z0L```"0D)"0D)"0D)"0D+E0UT(`Z3.-_O^0D)"0D)"+1"0$,\F)2`B) +M2`PSP,($`)"0D)"0D)"0D)"0D)"0D%:+="0(BU0D$%>+3@B+?"00C48,4%&+ +MS_]6$(M.""O'`\A?B4X(7L(,`)"0D)"0D&H4Z'Y&_O\SR8/$!#O!=!>)2`2) +M2`B)2`S'0!!P%T(`QP"AF1O[_@\0$,\#"!`"0D)"0D.D+````D)"0D)"0D)"0 +MD)"Y>-="`.ECC/[_D)"0D)"0BT0D!,=`"``````SP,($`(M4)`Q6BW0D"%>+ +M?"00BT8(B\]0_U8,BTX(*\<#R%^)3@A>P@P`D)"0D)"0D)"0D(M$)`2+2!") +M2`PSP,($`)"+5"0,5HMT)`A7BWPD$(M&#(O/4/]6&(M.#"O'`\A?B4X,7L(, +M`)"0D)"0D)"0D)"+3"0,BU0D!#/`AY +M!````+\0X$(`B_`SV\<"`````/.G=!*+\+D$````OV#$0@`SP/.G=16+1"00 +M7XD"7HM(!%M!B4@$,\#"#`!?7K@"0`"`6\(,`)"0D)"0D)"0D)"0:A#HKD3^ +M_S/)@\0$.\%T%(E(!(E(",=`#'`50@#'`,#80@##,\##D)"0D)"0D)"0:A#H +M?D3^_S/)@\0$.\%T%(E(!(E(",=`#.`30@#'`,#80@##,\##D)"0D)"0D)"0 +M:A#H3D3^_S/)@\0$.\%T%(E(!(E(",=`#-`40@#'`,#80@##,\##D)"0D)"0 +MD)"0:A#H'D3^_S/)@\0$.\%T%(E(!(E(",=`#(`40@#'`,#80@##,\##D)"0 +MD)"0D)"0Z0L```"0D)"0D)"0D)"0D%:^L-="`(O.Z#"*_O^#QB"!_E#80@!R +M[E[#D)"0D)"0:ASHOD/^_S/)@\0$.\%T+,=`!,C*0@")2`B)2`R)2!#'0!0# +M````QT`8,!-"`,<`Y-A"`,=`!-380@##,\##D(M4)`R+1"0(4U97N00```"_ +M$.!"`(OP,]O'`@````#SIW45BT0D$%^)`EZ+2`A;08E("#/`P@P`N00```"_ +M8,1"`(OP,]OSIW45BT0D$%^)`EZ+2`A;08E("#/`P@P`B_"Y!````+]PPT(` +M,\#SIW4OBT0D$(7`=!2-2`1?B0J+2`A!7HE("#/`6\(,`#/)7XD*BT@(05Z) +M2`@SP%O"#`!?7K@"0`"`6\(,`)"0D)"0Z0L```"0D)"0D)"0D)"0D+E0V$(` +MZ1.)_O^0D)"0D)!J'.BN0O[_,\F#Q`0[P70LQT`$R,I"`(E("(E(#(E($,=` +M%`$```#'0!@0%D(`QP#DV$(`QT`$U-A"`,,SP,.0Z0L```"0D)"0D)"0D)"0 +MD+EPV$(`Z;.(_O^0D)"0D)!6B_&+3AC'!N340@#'1@30U$(`QT8(P-1"`,=& +M#+#40@#'1A"@U$(`Z(,O``"+=AR%]G0&BP96_U`(7L.0D)"0,\#""`"0D)"0 +MD)"0D)"0D(/L$%.+7"0855:+0QA7A+$%&+SU8#2QC'1"0<`````%%0_U(,BTPD%(E$)!@[S@^' +MSP````/YA.]]RKXM<)"2+1"08ZQ&+50`# +MUXE5`(M-!(/1`(E-!(7`=4R!_P```@!U0HM$)#B%P`^$ZO[__XM%`#/))?__ +M/P`+P0^%V/[__XM$)#A555"+"/]1#(7`=1;IP_[__U]>7;@%0`"`6X/$$,(8 +M`#/`7UY=6X/$$,(8`)"0D)"05HMT)`A7BWPD$(7_=`:+!U?_4`2+1AB%P'0& +MBPA0_U$(B7X8QT8<`````,=&(`````!?,\!>P@@`D)"0D)"0D%:+="0(BT88 +MA +M=`*)"EG"$`"0D)"0D)"+1"0$BTPD"(M0$(D1BT`4B4$$,\#""`"0D)"0D)"0 +MD&HHZ(X__O\SR8/$!#O!=$['0`14RT(`QT`(1,M"`,=`#`350@#'0!#TU$(` +MB4@4B4@8B4@BT@<6T&)2!PSP,(,`+D$````OS##0@"+\#/;\Z=U%8M$)!!?B0)> +MBT@<6T&)2!PSP,(,`+D$````OW##0@"+\#/;\Z=U((M$)!"%P`^$`@$``(U( +M!%^)"HM('$%>B4@<,\!;P@P`N00```"_L,-"`(OP,]OSIW4@BT0D$(7`#X30 +M````C4@(7XD*BT@<05Z)2!PSP%O"#`"Y!````+^0PT(`B_`SV_.G=2"+1"00 +MA<`/A)X```"-2`Q?B0J+2!Q!7HE('#/`6\(,`+D$````OS#$0@"+\#/;\Z=U +M'(M$)!"%P'1PC4@07XD*BT@<05Z)2!PSP%O"#`"Y!````+^@PT(`B_`SV_.G +M=1R+1"00AB4@<,\!;P@P`B_"Y!````+_0PT(`,\#S +MIW4OBT0D$(7`=!2-2!A?B0J+2!Q!7HE('#/`6\(,`#/)7XD*BT@<05Z)2!PS +MP%O"#`!?7K@"0`"`6\(,`)"0D(M$)`2+2!Q!B4@P@0`D)"0D)"0D)#'`=#90@#' +M003`V4(`QT$(L-E"`,=!#*#90@#'01",V4(`QT$4?-E"`,=!&&S90@"+22"% +MR70%Z00\``##D)"0BT0D!(M,)`R)2"@SP,(,`(M$)`2+3"0,B4@L,\#"#`"# +M?"0,`70(N`%``(#"#`"+1"0(B@`\*'8(N`%``(#"#`"+3"0$B$$L,\#"#`"0 +MD)"+3"0(,\"%R8M,)`0/E<")02PSP,((`)"0D)"0D)"0D(/L8%-55HMT)'`S +MVU>+1B")7B@[PXE>+'4ENB#<0@"Y&-Q"`.BW.@``.\.)1B!U#U]>7;@.``>` +M6X/$8,(8`(U,)"CH:#H``(M./(M&.(E,)"R+3D")1"0HBT9$.\O'1"0P`0`` +M`(E$)'0/A)0```"#^`$/@HL```"*1C"+7DB+;DP\*'4%@\C_ZQ,E_P```(O( +M@^`!T>F#P0L,`M/@B\CH:P$``(O(,__!Z00#R#O`=5`[^G5,.\AR2(M4)#2) +M1"0X`\)7B4PD0(V$"````0!055/H.)P``#/).\IR#'<&.40D='8$B40D=(M$ +M)'2%P'4(QT0D=`$```"+3"1TB4PD,#/;BU0D>(U,)%A2Z,:"_O^-3"1`BT0D +M?%#H*8/^_XU,)!R+O"2(````5^A*@O[_BTY`C50D'/??&_^)3"00(_J-1"00 +M5XU,)!A0BT8TC50D8%&+C"20````4E"-5"1448M.((U$)$!2BE8P4(E<)#2) +M7"0XZ-5#``"+R(-\)#`!=@>+5"00B59`BWPD%(M$)"2+;"08B7XH.\.);BQU +M98M$)$@[PW5=BT0D8#O#=`6#^0AT4#O+=4````C4@$7XD*BT@405Z)2!0SP%O"#`"Y!````+^PPT(`B_`S +MV_.G=1R+1"00AB4@4,\!;P@P`N00```"_D,-"`(OP +M,]OSIW4 +MB4@4,\!;P@P`7UZX`D``@%O"#`"0D)"0D)"0BT0D!(M(%$&)2!2+P<($`%:+ +M="0(BT842(E&%'46A?9T$(O.Z!<```!6Z)HT_O^#Q`0SP%["!`"0D)"0D)"0 +MD%:+\;HPW$(`C4Y0QP9LVD(`QT8$7-I"`,=&"$S:0@#'1@P\VD(`QT80*-I" +M`.B>7P``BTXT7NE%(0``D)"0D)"+1"0$BTPD#(E(%#/`P@P`BT0D!(M,)`R) +M2`PSP,(,`%:+\8M.-(7)=`J+1B2+5B`[PG0HZ`PXM.)(E.(#/`7L.+1"0,BU0D"%:+="0(:##<0@!0 +MC4Y,Z&5@``"+R.@>````AL%QD0D$@"+7"0@A=MU:H72 +M=02%P'1BBVPD'(/]`719BE0D$H32=`6#_0-U3(M4)"C&1"03`#O":(7`B5PD&`^% +MQ@```(I$)!.$P'5+ZPO&1"03`>NZBUPD&(M$)$B%P`^$2O[__XM60(ML)"R+ +M3D2+?"0P*]4;SXU^2(E,)#B-3"0TB50D-(L05U%0_U(,A.D8_O__BT0D +M((7`=6:+1"0<@_@!=3:*1AB$P'0ABD8:A,!T&HM6.(M.2(U&2(/&.#O1=3^+ +M3@2+4`0[RG4UBT0D%%]>75N#Q"S"#`"*3"02A,ET'X/X`W0:BDX8A,ET!8/X +M!'4.BT0D%%]>75N#Q"S"#`"X`0```%]>75N#Q"S"#`"0D)"0D)"0D)"0D)!6 +MBW0D"(M&-(7`=0FX5P`'@%["&`"+1"084%;HP/S__XM,)!R+5"00BT0D#%%2 +M4(O.Z!K]__^%P'4KBDX8A,ET)(M4)!2%TG0Y!````+\0X$(`B_`SV\<"`````/.G=16+1"007XD"7HM( +M$%M!B4@0,\#"#`"Y!````+\PPT(`B_`SV_.G=16+1"007XD"7HM($%M!B4@0 +M,\#"#`"Y!````+]PPT(`B_`SV_.G=1R+1"00AB4@0 +M,\!;P@P`N00```"_L,-"`(OP,]OSIW4B4@0,\!;P@P`7UZX`D``@%O"#`"0D)"0D)"0 +MD)"+1"0$BT@008E($(O!P@0`5HMT)`B+1A!(B480=1:%]G00B\[HA_[__U;H +MRBS^_X/$!#/`7L($`)"0D)"0D)"0BT0D#%:#^`57P@P`BTPD +M$(M\)`R*`8B'/$H``(MQ`3P"`7L(,`&@HW$(`B]:-3SSH26P``/?8&\!?)?+_^']> +M!0X`!X#"#`!?N`%``(!>P@P`D)"0D)"0D)"0D)"05HOQ5S/_BX9$2@``.\& +M2$H```,````[QP^%5P$``+@!````7XF&1$H``%[""``STHU.0(J60$H``,>& +M2$H```$```#H37```(J&0DH``%.$P%5T,(N.4$H``(N>6$H``(N&5$H``(N6 +M7$H``"O+BUPD&!O",]([T'(.=P0[V78(B]GK!(M<)!B+;"04,\`#W8O].^MT +M&HU.0.C7>```BDXXA,EU"X7`?`>(!T<[^W7FBYY82@``BDXX*_U=`]^)GEA* +M``"+EEQ*``"#T@!;A,F)EEQ*``!T)8M&/,>&2$H```,```"%P`^%B````+@! +M````7XF&1$H``%[""`"%P'Q%BHY!2@``A,ET-(J.0DH``(3)="J+CE!*``"+ +MEEA*```[RG4:BY942@``BXY<2@``.]%U"HN.C````(7)=0=?,\!>P@@`@_C_ +M=1N+AHP```"%P'41QX9(2@```@```%\SP%[""`#'ADA*```#````N`$```") +MAD1*``!?7L((`)"0D)"0@^P04U56BW0D(%>+1A2%P'4@N0```0#H-!<``(7` +MB484=0]?7EVX#@`'@%N#Q!#"&`"+3"0TBT0D*%%6B48LZ$P!``"+1A2+EEQ* +M``"+GEA*``"-OEA*``!H```!`%"+SHE4)"3HMOW__XM6%(OHBP>+3"0L*\-0 +MZ-B._O^%P`^%``$``(7M#X6H````@[Y(2@```@^$IP```(M$)#B%P'0PBTX< +MBU8DBVXPBUXT*\HST@/-5Q/3B4PD%(L(B50D&(U4)!124/]1#(7`#X6S```` +MBH9"2@``A,!T&XM'!(N.5$H``#O!=UAR#(L/BX902@``.\AS2HM&%(M7!(L? +M:````0!0B\Z)5"0DZ!#]__^+5A2+Z(L'BTPD+"O#4.@RCO[_A<`/A%K___]? +M7EU;@\00PA@`7XO%7EU;@\00PA@`BH9!2@``A,!T.(M4)#"%TG0PBT8+4@0[T70/7UY=N`$```!;@\00PA@`,\!? +M7EU;@\00PA@`D(M4)`B+1"0$4S/;.],/E<$ZRXB(0DH``'01BPJ)B%!*``"+ +M4@2)D%1*``")F%A*``")F%Q*``")F$A*``")F$1*```SP%O""`"0D)"0D)"0 +MBT0D"(M,)`2%P`^5P(B!.4H``#/`P@@`D)"0D)"0D)"+1"0$5HM($(M0&(MP +M)"O*,](#SHMP*(M$)`P3UEZ)"(E0!#/`P@@`D)"0D)"0D)"#;"0$!.D&^O__ +MS,S,S,S,@VPD!`3I%OO__\S,S,S,S(-L)`0(Z>;Y___,S,S,S,R#;"0$".GV +M^O__S,S,S,S,@VPD!`SIQOG__\S,S,S,S(-L)`0,Z=;Z___,S,S,S,Q35FA@ +M2@``Z'DG_O^+\#/;@\0$._-T9\<&$-M"`%?'1@3(RD(`QT8(!-5"`(U^&,=& +M#/340@")7A"+SXE>%.C'6\->,\!;PY"0D)"0D)"0 +MD)"0D)#I"P```)"0D)"0D)"0D)"0N>C:0@#I,VW^_Y"0D)"0D%-5BVPD#(O1 +M5E>+2@2+100[R'55BP*+=0`[QG5,A73+`6\($`)"0D)"0D)"0D)"0D)"0@^P<4XO955:+"U>#^3]U +M:HM+!#/`AD" +M\ZN+RH/A`_.J7UY=6X/$',.#^09V!;D&````BU,-1"08:+#C +M0@!0QT0D(`$```#H388``(M+!('"@````(O!C7,(B_K!Z0+SI8O(@^$#\Z2+ +M2QR+>P2+D"\Z6+R(/A`_.DC7PJ^#/)B]>)?"0@B0J)2@2+3"00 +MZ,Z0``"+1"00BTPD&(/Y`8VP@````(ET)!R+QG8N28E,)!3K!(MT)!R+S0/% +MB]&+^,'I`O.EB\J#X0/SI(M,)!1)B4PD%'7=BWPD((L+N`$```#3X#/VB40D +M((M4)!B+QHO/`_*)`4`#S3O&+3"00BT0D)%"-D8````#HH9```#MT)"!R +MTXMT)!"-4R"+SNA-CP``BTPD*#/`B]&+_L'I`O.KB\J#X0/SJHO.Z*`2``!? +M7EU;@\0BWPD%(M#!(O/BS2H5NA_ +M_?__A,!U$8M#"$4[Z'+F7UY=,L!;P@0`N>#___\K]XU'("O/BA0&B!!`C10! +M@_H@6\($`)"0D)"0D)"0D)"05HOQBT8(BPX[P7(FBU8$ +MB\A7BWR*_(7_=!"+S^@O````5^B2(_[_@\0$BT8(7TB)1@B+1"0(C4X$4&H` +MZ.\+``!>P@0`D)"0D)"0D)"0D)"+T5>+2AR%R705BWH85HOQ,\#!Z0+SJXO. +M7H/A`_.JC4H(,\#'`@````#'0@0`````B0&->B")002)00B)00RY"````/.K +MBU(84N@:(_[_@\0$7\.0D)"0D)"0D)"0D)#H"P```.DV````D)"0D)"0:B"Y +MN#1#`.@$````PY"0D(O!BTPD!(D(,\F)2`2)2`B)2`S"!`"0D)"0D)"0D)"0 +M:.#]00#HH88``%G#D)"0D+FX-$,`Z08```"0D)"0D)!358OIBUT(A=MT9E97 +MBT4$2XLTF(7V=%.+3AR%R703BWX8B]$SP,'I`O.KB\J#X0/SJHU."#/`QP8` +M````QT8$`````(D!C7X@B4$$B4$(B4$,N0@```#SJXM6&%+H1R+^_U;H02+^ +M_X/$"(7;=9Y?7HM%!%#H+R+^_X/$!%U;P^@+````Z18```"0D)"0D)"YR#1# +M`.EV=P``D)"0D)"0:*#^00#HX84``%G#D)"0D&C(-$,`_Q4XP$(`PY"0D)"+ +MP3/2,\G'`!````")2`2)2`B)2`R)2"B)2"R)2!")2!2)4!B)4!R)4"")4"2) +M2&")2%")2%2)2%B)2%S#D)"0:O]HJ+A"`&2A`````%!DB24`````4597B_EH +MR#1#`,=$)`S(-$,`_Q5`P$(`C7<0B\]6QT0D&`````#HP/S__X3`=2935KFX +M-$,`Z+#\__^*V(3;=0>+SNC#^O__5HO/Z(O]__^$VUMU"U:YN#1#`.@+_?__ +M:,@T0P#_%43`0@"+3"0,7UYDB0T`````@\00PY"0D)"0D)"0D)"0D)"0D&K_ +M:-.X0@!DH0````!09(DE`````(/L"%-6B_$SVU>)="0,QP:$VT(`QT8$[,I" +M`(U.#(E>".CE_O__B5YPQT9TR,I"`&HTB5PD(,<&;-M"`,=&!%S;0@#'1G1, +MVT(`Z'$@_O^+^(/$!(E\)!`[^\9$)!P!="=J((O/Z)$+``#'!S3;0@#'1P0@ +MVT(`QT<6V2)#0````"#Q!3#D)"0D)"0D)"0D)"0D)"0:O]H +M![E"`&2A`````%!DB24`````45.+V5565XE<)!#'`ZC;0@#'0P28VT(`BT-P +M,_8[QHET)!QT!HL(4/]1"#O>=`6#PPSK`C/;BTLL.\YT$XM[*(O1,\#!Z0+S +MJXO*@^$#\ZJ-2Q@SP(ES$(ES%(D!C7LPB4$$B4$(B4$,N0@```#SJXM3*%+H +MFQ_^_XMK"(/$!#ON=&*+0P1-BS2HA?9T4XM.'(7)=!.+?AB+T3/`P>D"\ZN+ +MRH/A`_.JC4X(,\#'!@````#'1@0`````B0&-?B")002)00B)00RY"````/.K +MBU884N@\'_[_5N@V'_[_@\0(A>UUGHM#!%#H)A_^_XM,)!B#Q`1DB0T````` +M7UY=6X/$$,.0D)"0D)"05HOQZ-C^___V1"0(`70)5NCT'O[_@\0$B\9>P@0` +MD)!3B]E55HM++#/V.\Y7=!.+>RB+T3/`P>D"\ZN+RH/A`_.JC4L8,\")_O^+:PB#Q`0[[G1BBT,$ +M38LTJ(7V=%.+3AR%R703BWX8B]$SP,'I`O.KB\J#X0/SJHU."#/`QP8````` +MQT8$`````(D!C7X@B4$$B4$(B4$,N0@```#SJXM6&%+H/Q[^_U;H.1[^_X/$ +M"(7M=9Z+0P10Z"D>_O^#Q`1?7EU;PY"0D)"0D)"0BU0D#(M$)`A35E>Y!``` +M`+\0X$(`B_`SV\<"`````/.G=16+1"007XD"7HM("%M!B4@(,\#"#`"Y!``` +M`+]@Q$(`B_`SV_.G=16+1"007XD"7HM("%M!B4@(,\#"#`"Y!````+^PQ$(` +MB_`SV_.G=1R+1"00AB4@(,\!;P@P`B_"Y!````+]P +MPT(`,\#SIW4OBT0D$(7`=!2-2'1?B0J+2`A!7HE("#/`6\(,`#/)7XD*BT@( +M05Z)2`@SP%O"#`!?7K@"0`"`6\(,`)"0D)"0D)"+1"0$BT@(08E("(O!P@0` +MBTPD!(M!"$B)00AU#87)=`>+`6H!_U`4,\#"!`"0D)"+5"0,BT0D"%-65[D$ +M````OQ#@0@"+\#/;QP(`````\Z=U%8M$)!!?B0)>BT@(6T&)2`@SP,(,`+D$ +M````OV#$0@"+\#/;\Z=U%8M$)!!?B0)>BT@(6T&)2`@SP,(,`(OPN00```"_ +MD,1"`#/`\Z=U+XM$)!"%P'04C4@$7XD*BT@(05Z)2`@SP%O"#``SR5^)"HM( +M"$%>B4@(,\!;P@P`7UZX`D``@%O"#`"0D)"0D,P@0` +MD)!6B_'H&````/9$)`@!=`E6Z`0<_O^#Q`2+QE["!`"0D&K_:$>Y0@!DH0`` +M``!09(DE`````%%3B]E55E>)7"00QP.HVT(`QT,$F-M"`(M#<#/V.\:)="0< +M=`:+"%#_40@[WG0%@\,,ZP(SVXM++#O.=!.+>RB+T3/`P>D"\ZN+RH/A`_.J +MC4L8,\")75N#Q!## +MD)"0D)"0D%.+7"0(,\DSP(E+J(E+K(E#L#/2B4.T58E#N%:)0[R-0^B)2_A7 +MB1")4`2)4`B)4`R+1"0<.\$/A*\```"+="08B@Z+T8/B/_;!P(E3J'412%_W +MV!O`7ETE5P`'@%O"#`"#^`%W#%]>7;A7``>`6\(,`#/2BE8!B_J+T<'I!L'J +M!XOO@^$!@^T$`\\#U8OIC4PJ`CO!=`Q?7EVX5P`'@%O"#`"#Q@(S +M_X72B5.L=@R*!D:(1#NP1SOZD"\Z6+R(/A`_.D +M,\"+3?1DB0T`````7UY;B^5=P@P`N&D'0@##BTWT7UZX#@`'@&2)#0````!; +MB^5=P@P`D)"0D)"0D)"0D)"0D)"058OL:O]H>+E"`&2A`````%!DB24````` +M45-6BW4(5S/;B67PC4X,B5W\Z#'W__^)70B+1G"-50A2:)#$0@"+"%#&1?P! +M_Q&+^#O[="F+10B(7?P[PP^$E@```(L(4/]1"(O'BTWT9(D-`````%]>6XOE +M7<($`(M%"#O#=1BX!4``@(M-]&2)#0````!?7EN+Y5W"!`"+$(U./&H@45#_ +M4@R+^#O[="6+10B(7?P[PW0&BQ!0_U((B\>+3?1DB0T`````7UY;B^5=P@0` +MBT4(C59<:A!2BPA0_U$0B_@[^W0EBT4(B%W\.\-T!HL(4/]1"(O'BTWT9(D- +M`````%]>6XOE7<($`(MV<%:+%O]2#(OPBT4(.\.(7?QT!HL(4/]1"(O&BTWT +M9(D-`````%]>6XOE7<($`+C,"$(`PXM-]%]>N`X`!X!DB0T`````6XOE7<($ +M`)"0D)"0D)"0D)"0D(M$)`2+5"0,4HM4)`R+0'!24(L(_U$0P@P`D)"0D)"0 +M9*$`````:O]HF[E"`%!DB24`````@^P(4U6+Z597BTT(BT4$.\%U?H'Y____ +M?W(7C40D+&BPXT(`4,=$)#3E!P``Z-EW``"+P;K___]_P>@"*]%`.\)V`HO" +MC30!N/___S^!_O___S^)="00=P*+QHT,A0````!1Z-@6_O^+302#Q`2%R8O8 +M=`N+=0"+^_.EBW0D$(M%`%#H[!;^_X/$!(E=`(EU"&I`Z*@6_O^+V(/$!(E< +M)!0SP#O8B40D('1TBW0D+(L6B1.+3@2-5@B)2P2-2PB+.HDYBWH$B7D$BWH( +MB7D(BU(,B5$,B4,8B4,R"Y"````/.EZP(SVXMT)"B+ +M?02+10"+UL'B'BO6C0RP`]?!X@)2C52P!%%2_Q5HP4(`BT4`BTPD)(/$#(D< +ML(M%!$!?B44$7EU;9(D-`````(/$%,((`)"0D)"0D)"0D)"0D)"0D(-L)`0$ +MZ=;W___,S,S,S,R#;"0$=.G&]___S,S,S,S,@VPD!'3IEOC__\S,S,S,S(-L +M)`1TZ9;X___,S,S,S,R#;"0$!.FF^/__S,S,S,S,@VPD!`3I=OC__\S,S,S, +MS&K_:+NY0@!DH0````!09(DE`````%%J>.A(%?[_@\0$B40D`(7`QT0D#``` +M``!T%HO(Z%GT__^+3"0$9(D-`````(/$$,.+3"0$,\!DB0T`````@\00PY"0 +MD)"0D)"0D.D+````D)"0D)"0D)"0D)"Y\-M"`.E#6_[_D)"0D)"0Z0L```"0 +MD)"0D)"0D)"0D.E;<@``D)"0D)"0D)"0D)"+1"0$5HOQN3`!``#'!H3;0@#' +M1@38RD(`QT8(`````,9&#`")1A#'1B``````Z'T"``"%P(E&('47C4PD"&BP +MXT(`4<=$)!`!````Z#]U``"-1B0STL<&U-M"`,=&!,#;0@")$(E0!(E0"(E0 +M#(O&7L($`)"0D)"0D)"0D)"0D%:+="0(BTX@C58DQT84`````.@Y;```BD8, +M7O;8&\`E_[__?P4!0`"`P@0`D)"0D(M$)`16BD@,A,EU!C/`7L(,`(MT)!"# +M_A!S#8O&7O?8&\"#X!#"#`"+5"0,BT@@P>X$5O]0&(O&7L'@!,(,`)"+1"0, +M5J@'=3&#^!!R+(/X('P@P`N%<`!X!>P@P`D)"0D)"0D)"0D)"0D(-\)`P0=`BX5P`'@,(, +M`(M$)`2+3"0(5HLQC5`@@\#\B3*+<010B7($BW$(B7((BTD,B4H,Z`;___\S +MP%["#`!35597BWPD%(LWB]J+Z<<'`````(7V="B-1"044(M%`(O3B\V)="08 +M_]"+3"04`0\#V2OQAA`=@``6+PL=!*`,```"- +M>3S!XA"Y@0````O"\ZM?P\S,S,S,S,S,S,S,S,S,S(M!,%-55HMQ-+L%```` +M5SOS=TR+43C'02@)````=#20BWDT@_\!=0B%T@^%D@```(MQ##MQ'`^$D``` +M``^V+L'B"$<+U4:)<0R)43B)>30[^W7-@_K_=&K'033_____BU$HC7+_@_X" +M+!)$[1)$0#X3Y`@``C7`$B321BP"+42R#P@0/R"O"B5$LN@0```"-@(.W$D=>Q?7EV)03")42@SP%O# +M7UY=N`$```!;PU]>7<=!*`,````SP%O#C9L`````BU$T@?H````!`8B!8+PH/"&$;VPOYT3HV0@/__\/?"\/__ +M_W1`#[97`\'@&(@6"\*#PAA&]L+^="R-D(#___#WPO#___]T'H/'!#O]="$/ +MMA?!X!B(%@O"@\(81O;"_@^%:O___SO]=3R-FP`````[>1`/A/P````[<20/ +MA/,````/MA?!X!B(%@O"@\(81O;"_G01C9"`___P]\+P____=`-'Z\J+UBM1 +M((EQ(`$1`5$LC5`7P>H&@^(!B_KWWXM9.(OPP>X8(_<#\HOXP>\%@^3R+>32+U\'J"P^OUCO:H%`]9FB54`Z5K^ +M__\K^BO:B];!Z@4K\HU0U\'J!H/B`8EY-(E9.$)FB74`BS21.W21$`^$D0`` +M`(L&@\8$B321BU$LBW$@@\($#\@KPHE1+(M1)"O6@_H$1`!42SWWQO_@^<(B7DH +M7XEQ(%Y=B4$P,\!;PX72=!N(!L'H"(/Z`781B$8!P>@(@_H"=@:(1@+!Z`B) +M03"-!#*)02"#P@2+032)42@]`````7,@BU$,.U$<=!C!X`B)030/MC*+03C! +MX`@+QD*)03B)40Q?7ETSP%O#S,S,S,S,S,S,4XO!BTPD"%:#XOQ7C3P0*\@[ +MQP^$C0```(L0C;(```!L@\`$]\8```#\=%V!P@```'#WP@```)]UUX'"```0 +M`/?"``#@`'7)B_*#YN"+VL'K&@OSC5P(_,'K"8'C^/]_`"OSB]Z!X___'P"! +MZP``$`"#SN2!X^#__P#!YAH+WH/B'PO:B5C\ZXB-=`C\P>X"*]:!XO___P.! +MR@```)2)4/SI:____U]>6\($`,S,S,Q3B\&+3"0(@^+\5@/05RO(L^L[PG,Q +M@\`$.%C_=`P[PG,E@\`$.%C_=>B+>/R-=`@$P>X"*_Z!Y____P"!SP```.N) +M>/SKRU]>6\($`,S,S(O!BTPD!%:#XOPKR%>--!"#Z00[QG0LBQ"-NKC___Z# +MP`3WQ_P```-UZ0_**]`KT8'B____`X'*````2`_*B5#\Z]!?7L($`,S,S,S, +MS,S,B\&+3"0$@^+\*\A6C300@^D$.\9T,HL0#\J#P`3!P@*!PO___P#WP@,` +M`/YUY"O0*]&!XO___P&!ZO___P#!R@(/RHE0_.O*7L($`,S,S,R#XOZ+P8/Z +M`@^&AP```%97BWPD#(UT`OXK^(V;``````^V2`$[QG-K#[90`X/Q""/*@\`" +M@?GX````+_!P`` +MP>$+"\J#P`*-%#C1ZBO*B]'!Z@N!XO\'``"!R@#P``"!R0#X``!FB5#\9HE( +M_CO&+__Q\!,_J!S0``P/\KU8'B +M__\__X'"``#@`('B__\?`0O7B\[3XHE0_$:#Y@-UK.N`7UY=6\($`,S,S(/B +M_HO!@_H *`0``4U>+?"0,58U<$/HK^%:-9"0`.\,/@RP!```/MPB#\1!! +M]L%W=!L/MT@"@_$008/`!/;!=W7<@^@".\,/@P4!``#VP0AU<('I@0```/?! +M@`T``'0%@\`"Z[D/MU`"#\J+\8'F`/```,'F!<'J#PO6*]`KUXOR@>;^!P`` +MP>8)B^J!Y0``\/\+]0/V`_:+ZH'E``@```OU@\%PP>8)@>'_#P``"_&!X@#P +M#P`+\HDP@\`$Z5S___^+$/?!@`X``'5(B_+![AN!P?@.``"+[L'A$H/E'3O- +M<]>+2`0/R2O(*\^-J0`(``"!Y0#P___!Y@?!X13!Z@P+RHUT+A>),(E(!(/` +M".D*____BW`$P>$(C6[],^GWQ0.`#P!T"(/`!NGO_O__B\[!X0R!X@#P___! +M[A2!R175];P@0`S,S,S,R+P8/Z!0^"2@$` +M`(M,)`A358ML)`Q6*^A7BSF-7!#\@\4$.\,/@R$!``"+$('RZ.CHZ(/`!/;" +M_G4$2$CK%]'O]\(`_@``=0-(ZPK1[_?"``#^`'5[2(7_#X3!````.\,/A^0` +M``"#_P1W6X/_`W16T>\/MA0'0O;"_G1,BS"!Q@````'WQ@```/YU/`/_C0PH +M`_\K\0/_B]:+S]/J0O;"_G4.N@`!``#3XDHS\BOP*_6!YO___P&![@````$S +M_XDP@\`$ZQ31[X//!.E2____,__WP@```/YT13O#]\(```#^=!<[PW,_BQ"!\NCHZ.B#P`3V +MPOYUU$A(2#O#=R>+$('"`````??"````_G65*]`KU8'B____`8'J`````8D0 +M@\`$ZY!(BTPD&(DY7UY=6\((`,S,S,S,S,S,:``!``!J`%'H_VH``(/$#,/, +MS,S,S,S,S,S,S,S,S,Q7B_J+5"0,A=)T88M$)`A35C/VC1P0.]=W)E6+Z2OH +MD(H4*``00$8[PW7U73O^=`LK_HH4#H@104]U]RO&ZR&0BA0.`!!&0#OW=?7W +MWXU)`(H4!P`00#O#=?8#QXUD)`"*$(@10$$[PW7V7EM?P@@`@>S4`@``5O\5 +M(,!"`&8]!@!T*FBLW$(`:)#<0@#_%5S`0@!0_Q64P$(`A+/>3`0@")3"0,O6P```"*#HM$ +M)`Q&A,ET%&8STH/``HK11F:)4/Z*3O^$R77L9L<`+@!FQT`"9`!FB6@$9HEH +M!F;'0`@``&H(C40D%&H`4/_7@#X`=;A?75Z!Q-0"``##D)"#[`A6B_&`^BAW +M574%@\C_ZQ(/ML*+R-'I@^`!@\$+@\@"T^"+R(O0B$0D!<'H&(A$)`B+1"00 +MP>D(P>H04(A,)`J(5"0+:@6-3A"-5"0,QD0D#`3H]S$``%Z#Q`C"!`"X!``` +M`%Z#Q`C"!`#,S,S,@^P(5HOQ@/HH=U5U!8/(_^L2#[;"B\C1Z8/@`8/!"X/( +M`M/@B\B+T(A$)`7!Z!B(1"0(BT0D$,'I",'J$%"(3"0*B%0D"VH%C4X0C50D +M#,9$)`P$Z"@\0(P@0`N`0```!>@\0(P@0`S,S,S#/`B0%FQT$%X`") +M00R#P1#I2RL``,S,S,S,S,S,S,S,BQ&#^@5W-?\DE3`<0@`RTHA1!HA!!#K" +M=0:X"````,.$P'@>/`%U"L9!!<"X`0```,,\`G<&@'D%X'4:N`D```##.D$% +M+^L) +M1"0DA<`/A%H!``"+5"0@4(OXBT8@`T8H4E#HW&,```%^*(/$#(-^/`!U#XM& +M%(O(*TXX.\]W`XE&/`%^.(M$)"0!10`!1"0@*48,BT8,]]@;P(/@!XD&Z:(` +M``"#^@9U'X#YH!O20H#YX%(;TD*-3A#HDR@``(M$)"3'!@<```"+3@@[P78$ +MB4PD)(M$)"R+5"044%*+5"0HC40D+%!2C4X0C10?Z*\H``"+5"0D`54`BTXH +M*58(`50D((M^""O+*4X,BUX,A<`/A9<```"+1"0LBP"#^`,/A(0```"%TG43 +MA +M7<7;@!````6X/$#,(0`,S,S,S,4U565XM\)!B+ZHL7 +MB_''!P````"#/@F)5"08#X1;`0``BUPD%(L.@_D(#X07`0``A>UU"CEL)!P/ +MA!4!``"#^09T5H/Y!W11BP<[P@^$DP```$")!XH#B\[H$OS__T.)!H/X`744 +MBDX$.L@/A.X```"`^>`/@^4```"%[74)@_@(#X7,````@_@````BU0D +M&.F6````A>T/A+(```"+PBL']D8$@'4MA)!NM7QD8&`87`=1$Y1@AT'%]>7;@#```` +M6\(,`(/Y!G4+QP8'````@#L`=7:+3@@[P78"B\$!!P/8*48(=1R+3@R+Q3OI +M=@*+P2E&#(M.#`%&*"OHA+^8L'B^JZR"P` +M`/_0B_`SVSOS=0=?7ETSP%O#C4X$B2[HIN[__\=&$`<```")7A2)?@R)7FB) +M7FR(7G")GO@```"-AD`'``"Y(````(A8_(D8B5@$!3`!``!)=?!?B\9>75O# +MS,S,S,S,S,Q35HVW0`<``+L@````C4D`BQ:%TG04BP^+003_T,<&`````,=& +M!`````"!QC`!``!+==U>6\/,S,S,S,S,S,S,4U565XOY,]LX7W!T$8U7!(V/ +MA````.B%*@``B%]PBU=H.]-T"HL/BT$$_]")7VB)7VPYG_@```!T$8V/``$` +M`.C[+P``B9_X````C;<\!P``O2`````X'G00C4Z6+3PR+002+UU]>75O_X,S,S,S,S,R#[!A358OJB\5IP#`!``!6BW0D*#/2 +MB]E7C;P8R`8``(E6$#D6='0X5W1U.HV/G````(E7((E7&,9'=`'H+^W__VGM +M0/G__X'E@`\``,>'J`````P```")KZP```"+2PR)CZ0```"+S^C#^/__,\") +MAX@```")AXP```")AX0```")AX````")AY````")AY0```")AY@````STHM# +M*(E4)!#'1"08`0```(E$)!0Y4T1T*XM#2"N#\````(M+3!N+]````#O1$````.50D+'1P +MQT80`0```(M6$(F7@````%]>75N#Q!C"!`"#^`5U'(M/*(7)#X1(____@?D` +M0```(````ZR+'1A`#````@_@!=!:+;"00.^IT#HM$)!0KP3O%=@*+Q0/( +M`8OP````$9/T````B4X8B58`````7UY=6X/$&,($`,S, +MS&G2,`$``%97B_F#O#I0!P```(N$.D`'``"-M#K(!@``=0ZX`0```%^)AI@` +M``!>PX7`="*+CHP````Y3GQS.XL/B]"+003_T,=&>`````#'1GP`````BP^+ +MEHP```"+`?_0A +M7;@+````6\(8`(N6C````#N6E````'4&QP$!````,\!?7EU;PA@`S,S,S,Q1 +M:=(P`0``4U56B_&+3"0DBZPR7`<``(N<,D`'``"-A#+(!@``BU0D*%73/`6UG"&`!?7EVX"P```%M9PA@`S,S,S,S,S,S,@'YP`'48QX:4```` +M`````,>&C`````````#&1G`!BE8P5XU&!%"-3G3H0O/__X7`=42+5FB%TG0( +MBTYL.TX8="N+#HM!!/_0BPZ+5AC'1FP`````BP'_T(E&:(7`=0>X`@```%_# +MBTX8B4YLC4YTZ&SS__\SP%_#S,S,S,S,S,R#[$155C/M5XOP.6PD5'06B_[H +M*?G__XV.``$``.B>)P``B40D5.A5____.\4/A?H"``"+1EB+3ER+5E")1"0X +MBT94B4PD/(E4)$"+EIP````SR5.)1"1(B6PD%(E,)!");"0@B50D'.L,C9L` +M````,^V+3"00.4PD%'5D.6PD6'0EC8X``0``C50D$.BO)P``B40D((EL)!0[ +MQ775,\F);"18B4PD$#EN8'4TBT9LBTXTBU9HB40D$(U$)!!0BP&);"08B50D +M)/_0BTPD$(E&9#O-=`0[Q70'QT9@`0```(N&F````(M6'(N^G````(OH*VPD +M'#OJ=@:+1"0<`\(KQS/MB40D&#EN1'0NBT9(*T90BU9,&U94B50D4#/2.U0D +M4'(6=P8Y1"08<@Z)1"08.59`=`6]`0```(M$)!0KR(E,)"B-3"0P48M,)"15 +MC50D,%*+5"0D`\A1`]>-3G3H+//__XM,)"@!3"04`4Y8O0````"+T!%N7(N& +MG````"O'`490B50D-!%N5#EN1'0+S?_0A<`/A8P```"+3EB+5ER+1E")3"0\BTY4B50D0(E$ +M)$2)3"1(Z:_]___'1"0L`0```.D:____BT0D-#O%=5:+1"0P@_@!=2DY;D!T +M+SEN1'0JBU9(.U90=0B+1DP[1E1T&EM?7K@!````78/$1,($`#EN0'42.6PD +M)'0,6U]>,\!=@\1$P@0`@^@#]]@;P(/@^X/`!EM?7EV#Q$3"!`#,S,S,S,S, +MS,S,@^P04U8SVU>+?"0TB_&)'XE?!(#Z*'8,7UZ-0P1;@\00PB``BT0D((A6 +M,(L(B4X8BU`$B582(E>3(E>1#O#=!+'1D0!````BPB)3DB+4`2) +M5DR+1"0L58ML)#R)1D")7E")7E2)7EB)7ER)7F")7F2)70`SP(-^(`$/AB`! +M```X7G!T$8U6!(V.A````.@:(```B%YPBU9H.]-T"HL.BT$$_]")7FB)7FR) +MGO````")GO0````YGO@```!U%8V.``$``,>&^`````$```#H&B4``(M,)$"+ +M5"0TB8X0`0``C48$C4PD$(F6#`$``(M6)(F&%`$``(M&((F.&`$``(V.``$` +M`(FV'`$``(D1B88$`0``QT4``0```,=$)!#P(4(`QT0D%%`D0@#'1"08\"1" +M`,=$)!P0)D(`Z+TE``"+CG@!``")#XN6?`$``(E7!#O#=7.+AIP!```[PW5I +M.9Y$`0``=1"+AD@!``!=7UY;@\00PB``BXY(`0``BY9P`0``B4YDBXYX`0`` +MB59@BY9\`0``N`$```")3EB)5EQ0B\:)70#HXOK__XM.6(D/BU96X/$$,(@`,S,S,S,S,S,S,S,@^Q,BU0D4(M* +M0(M"#(E,)`B+2C2)3"0PBTH\B40D((M",(E,)#@/MDH"4U6)1"0LBT(X5HE$ +M)$`/M@*^`0```-/F#[9*`8E$)$R]``$``-/EB\B+0A!7OP`!``#3[XM*%(E$ +M)#B+0AB)3"0\BTHHB40D'(M"+$Z)3"0LBTH<*^^)1"1,BT(@BU(DB70D5(EL +M)%C'1"0H`````(E,)!"+_XM<)"R+3"0P(][!XP2)7"0D`UPD&`^WC%D`_O__ +M/0````%S%(MT)!`/MC[!X@C!X`@+UT:)="00B_C![PL/K_D[UP^#.`<``+X` +M"```*_'![@4#\8O.BW0D,&:)C%X`_O__@<:``@``@WPD+`"+QW4'@WPD3`!T +M+(M,)!R%R74$BTPD/(M<)#@/MEP9_XM,)"S!X0@#V8M,)%`CW=/CC0Q;C31. +MBTPD&/]$)"R#^0)?"00B_C![PL/K_D[UW,9B\>_``@``"OY +MP>\%`_EFB7X"N0(```#K%"O'*]>+^<'O!2O/9HE.`KD#````BVPD$(T<"0^W +M##,]`````7,1#[9]`,'B",'@"`O718EL)!"+^,'O"P^O^3O7+^<'O!2O/9HD,,T,#VP^W##,]`````7,1#[9] +M`,'B",'@"`O718EL)!"+^,'O"P^O^3O7+^<'O!2O/9HD,,T,#VP^W##,]`````7,1#[9]`,'B",'@"`O718EL +M)!"+^,'O"P^O^3O7+^<'O!2O/ +M9HD,,T,#VP^W##,]`````7,1#[9]`,'B",'@"`O718EL)!"+^,'O"P^O^3O7 +M+^<'O!2O/9HD,,T,#VP^W##,] +M`````7,1#[9]`,'B",'@"`O718EL)!"+^,'O"P^O^3O7+^<'O!2O/9HD,,T,#VP^W##,]`````7,1#[9]`,'B +M",'@"`O718EL)!"+^,'O"P^O^3O7+^<'O!2O/9HD,,T.-+!L/MPPN/0````%S%(M\)!`/MA_!X@C!X`@+TT>) +M?"00B_C![PL/K_D[UW,IB\>_``@``"OYP>\%`_EFB3PNBW0D'(M\)#B+S8@, +M/D:)="0+^\'O!2O?9HF<3@("``"[`P````/MB_F)?"0@ +M(\T#^0/[C3Q^B7PD%`^W/XEL)"0]`````7,4BVPD$`^V;0#!X@C!X`@+U?]$ +M)!"+Z,'M"P^O[SO5B7PD%`^W/ST````! +M((P>`("]/_1"00B]C!ZPL/K]\[TW,=B\.[``@``"O?P>L% +M`]^+?"04`^TS3"0@9HD?ZQ8KPRO3B]_!ZP4K^XM<)!1FB3N-;"T!BWPD)`/_ +MB]DCSXE<)"`#V0/=B7PD)(T\7HE\)!0/MS\]`````7,3BUPD$`^V&\'B",'@ +M"`O3_T0D$(O8P>L+#Z_?.]-S'8O#NP`(```KW\'K!0/?BWPD%`/M,TPD(&:) +M'^L6*\,KTXO?P>L%*_N+7"049HD[C6PM`8M\)"0#_XO9(\^)7"0@`]D#W8E\ +M)"2-/%Z)?"04#[<_/0````%S$XM<)!`/MAO!X@C!X`@+T_]$)!"+V,'K"P^O +MWSO3B7PD%`^W/ST` +M```!((P>`("]/_1"00B]C!ZPL/K]\[TW,=B\.[``@``"O? +MP>L%`]^+?"04`^TS3"0@9HD?ZQ8KPRO3B]_!ZP4K^XM<)!1FB3N-;"T!BWPD +M)`/_(_D#^0/]#[<,?HTT?CT````!((P>`("]-'B7PD$(OX +MP>\+#Z_Y.]=S*HO'OP`(```K^<'O!0/Y9HD^BW0D'(M\)#B-3"T`B`P^1HET +M)!SIL`H``"O'*]>+^<'O!2O/BWPD.&:)#HMT)!R-3"T!B`P^1HET)!SIB0H` +M`(OQP>X%*\Z+="0P9HF,7@#^__^+3"08#[=,3B`KQRO7/0````%S%(MT)!`/ +MMC[!X@C!X`@+UT:)="00BVPD,(OPP>X+#Z_Q.]9S)8O&O@`(```K\<'N!0/Q +MBTPD&&:)=$T@@\$,C;4`^O__Z>(!``"+?"08*\8KUHOQP>X%*\YFB4Q](`^W +M='TX/0````%S$XM,)!`/M@G!X@C!X`@+T?]$)!"+R,'I"P^OSCO1#X.T```` +MO0`(```K[L'M!0/NB_6+;"0P9HET?3@/M[1=`/3__XO!@?D````!D%*_%FB;1=`/3__^G:```` +M*\$KT8O.P>D%*_%FB71].`^W3'U0/0````%S%(MT)!`/MA[!X@C!X`@+TT:) +M="00B_#![@L/K_$[UG,9B\:^``@``"OQP>X%`_&+3"1`9HET?5#K>2O&*]:+ +M\<'N!2O.9HE,?5`/MTQ]:#T````!P>((P>`("]-&B70D$(OP +MP>X+#Z_Q.]9S&8O&O@`(```K\<'N!0/QBTPD1&:)='UHZQPKQBO6B_'![@4K +MSHMT)$1FB4Q]:(M,)$B)="1(BW0D0(ET)$2+="0TB70D0(E,)#2#_P<;R8/A +M_8/!"XVU`/;__P^W/HE,)!@]`````7,4BTPD$`^V&<'B",'@"`O308E,)!"+ +MR,'I"P^OSSO1#X,C`0``NP`(```KW\'K!0/?BWPD)&:)'HTT?@^W?@*+P8'Y +M`````7,6P>$(B\&+3"00#[89P>(("]-!B4PD$(O(P>D+#Z_/.]%S&8O!N0`( +M```KS\'I!0//9HE.`KD"````ZQ0KP2O1B\_!Z04K^6:)?@*Y`P```(T<"0^W +M##,]`````7,3BWPD$`^V/\'B",'@"`O7_T0D$(OXP>\+#Z_Y.]=S%(O'OP`( +M```K^<'O!0/Y9HD\,^L0*\\%*\]FB0PS0XT,&P^W/#$]`````7,3 +MBUPD$`^V&\'B",'@"`O3_T0D$(O8P>L+#Z_?.]-S&HO#NP`(```KW\'K!0/? +M9HD<,8/I".D``@``*\,KTXO?P>L%*_MFB3PQ08/I".GH`0``*\$KT8O/P>D% +M*_EFB3X/MWX0/0````%S%(M,)!`/MAG!X@C!X`@+TT&)3"00B\C!Z0L/K\\[ +MT0^#'P$``+L`"```*]_!ZP4#WXM\)"1FB5X0C71^$`^W?@*+P8'Y`````7,6 +MP>$(B\&+3"00#[89P>(("]-!B4PD$(O(P>D+#Z_/.]%S&8O!N0`(```KS\'I +M!0//9HE.`KD"````ZQ0KP2O1B\_!Z04K^6:)?@*Y`P```(T<"0^W##,]```` +M`7,3BWPD$`^V/\'B",'@"`O7_T0D$(OXP>\+#Z_Y.]=S%(O'OP`(```K^<'O +M!0/Y9HD\,^L0*\\%*\]FB0PS0XT,&P^W/#$]`````7,3BUPD$`^V +M&\'B",'@"`O3_T0D$(O8P>L+#Z_?.]-S%XO#NP`(```KW\'K!0/?9HD<,>FA +M````*\,KTXO?P>L%*_MFB3PQ0>F,````*\$KT8O/P>D%*_EFB7X0N0$```#K +M!XVD)`````"-'`D/MXPS``(``#T````!((P>`("]?_1"00 +MB_C![PL/K_D[UW,:B\>_``@``"OYP>\%`_EFB;PS``(``(O+ZQ8KQRO7B_G! +M[P4KSV:)C#,``@``C4L!@?D``0``!Z?````"#?"08#(E,)"@/@G`$``"# +M^01R!;D#````0<'A!P^W="D"`\T]`````7,4BWPD$`^V'\'B",'@"`O31XE\ +M)!"+^,'O"P^O_CO70*^`@```.L4*\\%*_=FB7$"O@,```"+;"00C1PV#[((P>`("]=% +MB6PD$(OXP>\+#Z_^.]=S%(O'OP`(```K_L'O!0/^9HD\"^L0*\\% +M*_=FB30+0P/;#[((P>`("]=%B6PD$(OXP>\+#Z_^ +M.]=S%(O'OP`(```K_L'O!0/^9HD\"^L0*\\%*_=FB30+0P/;#[((P>`("]=%B6PD$(OXP>\+#Z_^.]=S%(O'OP`(```K +M_L'O!0/^9HD\"^L0*\\%*_=FB30+0P/;#[((P>`("]=%B6PD$(OXP>\+#Z_^.]=S%(O'OP`(```K_L'O!0/^9HD\"^L0 +M*\\%*_=FB30+0XTT&P^W/`X]`````7,1#[9=`,'B",'@"`O318EL +M)!"+V,'K"P^OWSO3F#Y@%)@\X"@_\.#X."````T^:]`0`` +M`$:-20"+?"0P#[>\=P#S__\]`````7,3BUPD$`^V&\'B",'@"`O3_T0D$(O8 +MP>L+#Z_?.]-S((O#NP`(```KW\'K!0/?BWPD,&:)G'<`\___`_4#[>L;*\,K +MTXO?P>L%*_N+7"0P`^UFB;QS`//__P/U2760*_7IDP$``(ML)!"#Z02+_ST` +M```!((P>`("]=%T>@KT(OZP>\?]]^-='8$B6PD$#T````!((P>`("]-%B6PD$(O8P>L+#Z_9.]-S +M&8O#NP`(```KV<'K!0/99HE?`KD"````ZQ0KPRO3B]G!ZP4KRV:)3P*Y`P`` +M``^W'$\]`````7,0#[9M`,'B",'@"`O5_T0D$(OHP>T+#Z_K.]5S%XO%O0`( +M```KZ\'M!0/K9HDL3X/!`NL2*\4KU8OKP>T%*]UFB1Q/@\$$#[<<3ST````! +MT+#Z_K.]5S%XO%O0`(```KZ\'M +M!0/K9HDL3X/!!.L2*\4KU8OKP>T%*]UFB1Q/@\$(#[<<3ST````!T+#Z_K.]5S%XO%O0`(```KZ\'M!0/K9HDL +M3X/I".L/*\4KU8OKP>T%*]UFB1Q/"_&#_O\/A.````"+3"1$@WPD&!.)3"1( +MBTPD0(E,)$2+3"0TB4PD0(U.`8E,)#0;R8/A_8/!"HE,)!B+3"1,AB4%`B5$TBU0D0!O`78E91(E1/$!;@\1,P@P`@^P44U565XOXBT0D+(L( +MBT<,BV]`BU<@BW8(P>(("_-`B40D +M*(O"P>@+#Z_'._!S!HO0`\GK""O0*_"-3`D!@?D``0``_``$``+D!````ZP.-20"+;"08B\<# +MVXE$)"`#P2/[`\8(P>(("_5`B40D*(O"P>@+#Z]$)!0[\',*`\DS?"0@B]#K""O0*_"-3`D! +M@?D``0`` +M78D!BT0D$%N#Q!3""`"+?"08#[=,;R`KT"OPB4PD%(M,)"B!^@````%S&CM, +M)!`/@R;^__\/M@'!Y@C!X@@+\$&)3"0HB\+!Z`L/KT0D%#OP8(P>(("_=!B4PD*(O*P>D+#Z_(BT0D&#OQL>`#T__^+T8'Y`````7,@BWPD*#M\)!`/@X3]___!X0B+T0^V#\'F +M"`OQ1XE\)"B+RL'I"P^OS3OQ#X.'````B]'IX_[__XM\)"@KT2OQ#[=,:%") +M3"04@?H````!8(P>(("_%'B7PD*(O*P>D+#Z], +M)!0[\7,$B]'K/P^W;&AH*]$K\8'Z`````7,:.WPD$`^#^_S__P^V#\'F",'B +M"`OQ1XE\)"B+RL'I"P^OS3OQL$*]$K\8M,)"C'1"0@#````(VX`/;_ +M_P^W!X'Z`````7,:.TPD$`^#L/S__P^V*<'F",'B"`OU08E,)"B+RL'I"P^O +MR(M$)"@[\7,1B]&-'%\S[<=$)!0(````ZUX/MV\0*]$K\8'Z`````7,:.T0D +M$`^#9?S__P^V",'F",'B"`OQ0(E$)"B+RL'I"P^OS3OQXO*P>D+#Z_(._%S!HO1 +M`__K""O1*_&-?#\!BT0D%#OX8(P>(("_=`B40D*(OZP>\+#Z_Y._=S"`/KB]<#V^L(`]LKUROW +M`^O_3"04=:SI_/O__\S,S,S,S,PSP,=!1!,!``")04P[T'0-B4$HB4$LQT%$ +M%`$``#E$)`1T!\=!1!0!``#"!`#,S,PSP(E!&(E!3(E!*(E!+,=!1!0!``## +MS,S,S,S,S,S,S(/L$%-55E>+?"0HBR^+\8M,)##'!P````#'`0````"+1D2) +M5"04B6PD$+H!````/1(!```/AA`!```]%`$``'89+?\!``#WV%\;P%Z#X/9= +M@\`+6X/$$,(0`(M<)"2%[70FBT9,@_@% +M7<`("\$/MDY3P>`("\$/MDY4P>`( +M"\&)1B0Y?BQU##E^*'4'/0#\_[]SJH%^1!,!``#'1B#_____B7Y,=D4/M@8/ +MMDX!BWX(`\BX``,``-/@!<`'``!T&HO(N``$```/M^B+Q<'E$`O%T>GSJQ/) +M9O.K,_^)5CR)5CB)5C2)5C")?D")?D3K!(M<)"2!?D02`0``#X2)`@``ZP>- +M20"+7"0DBWY$BVPD$(O/A7;@+````6X/$$,(0 +M`#OY=>:+5"0H`]D!"HE<)"3I[P```#/M@\O_@_\4@^M0.UY,#X)P____@WPD&`!T"8/X`@^% +MC@$``(-^+`"+5"04C4Y0B4X<=12+1@2+?A@K1BB+ZBOO.^AV`XT4!U%25NCS +MXO__@WXL`'4+BTX$.4XH<@.)3BR+3AR+5DPKSH/I4(7;>1.#^10/APO___\[ +MR@^"`____^L(.]D/A?G^__\KRHM4)"@!3"0D`0K'1DP`````*4PD$(7`#X4O +M`0``@7Y$$@$```^%?/W__X-^)``/A1\!``"+1"0P7UY=QP`!````,\!;@\00 +MPA``BTPD,%]>7<7<<"`P```#/`6X/$$,(0`(M$)"@! +M.#/`B7Y,A?]T#(H,&(A,!E!`.\=R](M4)#!?7EW'`@(```"X`0```%N#Q!#" +M$`"#_Q0/@_']__^+1"0HB7Y,`2B+1"0P7UY=QP`#````,\!;@\00PA``BT0D +M*(M4)#"+RRM.3%\!"(E>3%Y=QP("````N`$```!;@\00PA``QT9$``(``%]> +M7;@!````6X/$$,(0`,S,S,R+PE:+\8M6"(O(BT`$_]#'1@@`````7L/,S,S, +MS,S,S%:+\HM&!%>+^8M7"(O._]"+5Q#'1P@`````BT8$B\[_T,='$`````!? +M7L/,S,S,S(-\)`0%+?"0<@<7`!P``A=)T +M!3MN2'0JBT<$B\__T,=&"`````"+!XU4+0"+S__0B48(A@\0(P@@`@?L` +M`$``<@6X__\/`(TL&/?0(^@[ZW,"B^N+5A"%TG0%.VX4=#V+1P2+S__0QT80 +M`````(L'B]6+S__0B480A +M@\0(P@@`BTPD$(E>!%M?B6X4B0XSP%U>@\0(P@@`S,S,S,S,S,S,S,S,S#/` +MB1&)00B)01")002)00R)013#D)"0D)"0D)"0D)"05HOQ5XU^&%?_%4#`0@"+ +M5@B+1"0,BTPD$`/0BT0D&(E6"(M6#!/1BTX0B58,BU0D%`/*B4X0BTX4$\B+ +M1@2%P(E.%'4CBPZ%R70=BU84BT804HM6#%"+1@A24/\1APXE&7(/`$%[#D)"0D)"0D)"0D)"0D)!7B_F+5UR%TG07BT=@ +MBT]D.\%U#8M/%/]1!,='7`````!35C/VC9_(````BT=8._!W'(N/@````#OQ +M<@:+QBO!ZP0KP0/&.8>$````=P>+R^A+____1H/#*(/^('+-BX>$````7H7` +M6W4.BT]@BT=D.\AU!#/`7\.X`0```%_#D%-55HOQ5XOJBX:$````A<`/A+@` +M``"+AH````"#P`6-!("-/,:+10"%P'1=BU<(BTX4BQK_402+3Q"+1Q0+R(E? +M"'5%B\_HU?[__XN&A````$B)AH0```!T=(N6@````(M.6$*+PHF6@````#O! +M=0K'AH``````````BX:`````@\`%C12`C3S6BT<,A +M78/`$%O#BT9@BTYD*\AT%XM67(E-`#/)7XE.8(E.9%Y=C40"$%O#QT4````` +M`(M67(72=`V+3A3_403'1EP`````7UY=,\!;PY"0D)"0D)"0D)"0D)"0D%8S +M]LZ84D``"0 +MD)"0D%:+\>@8````@<:P````5O\5.,!"`%[#D)"0D)"0D)"04U:+\5>[(``` +M`,=&)`$```"-OL@```"+S^@B````@\@(````B\Y>Z3#]__]6B_%7BT88C7X8A)1C")1D2#R/\S_XF&D````(F&E````(M&!(E^>(E^:(/X +M((E^?(E^-(E^.(E^/(E^0(E^<(F^B````(E^;(E^2(E^3(E^4(E^8(E^9(F^ +M@````(F^A````'8%N"````"+3B")1E2+!HE^6#O!=#*-GL@```"](````#E[ +M"'0'B\OH7_S__X/#*$UU[HM67#O7=`F+3A3_402)?ER+#HE.((M6$(V.F``` +M`.AF^___BT98B7XDB7XHC52`&4")1EB-+-:+S>A[````B]@[WW4TC4T@Z(TA +M``"+V#O?=2:-31SH?R$``(O8.]]U&%7HDP```(O8.]]T(8O.B7Y$Z&,````[ +MWWX.@>/__P``@`.]]T`XE>0#E^.'4-.7Y`=0@Y?CQU`XE^1(M&1%_W +MV!O`7O?0(\-=6\.0D)"0D)"0D)"05HOQC4X@Z/4B``"%P'4,C4XPY"0D%6+[%:+ +M=0B+1@3!X`>#P`,D_.BY,```B\16B48DZ`X```"-9?Q>7<($`)"0D)"0D%97 +MBWPD#(O/Z%,```"+/XOPA?:+1RAT0X7`=0.)=RB-C^0```#'1R0!````Z'\@ +M``"-C^@```#H="```(7VB]9^#('B__\``('*```'@(V/F````.BG^O__B\9? +M7L($`('LI````%.+&556B4PD&(M)'#/V5XET)$")="1$B;0D@````(ET)'") +M="1LB70D-.A;'P``.\8/A08)``"+0R0S_SO'#X7W"```BTLTBT,PB^F+\(/` +M`5565Q//B4,P5XE+-%>-5"0T5XO+B70D<(EL)'3H>`D``(M+<#O'B40D*(E, +M)!")?"0\B;PDA````(E\)'R)O"2(````B7PD2(E\)!2)?"08#X6[`P``.7PD +M(`^%L0,``(M4)!R+:V2+0V")?"0DBW((*^B)="1,._=U+8L3BTL4@\(0_Q&+ +M\#OWB70D3`^$&@(``(M$)"2)/CO'=`2),.L'BT0D'(EP"(U&$#OOB40D+(E$ +M)#!T)8M+7(M38(O%B6PD%(U,$1")?"08B6PD2(E$)#B)3"0PZ>L```"+$XM+ +M#(U$)#B)5"0XBU0D+%#HAK?__S/)BU0D%(E$)"B+1"0X`]")5"04BU0D&!/1 +MB50D&(M4)"0[UW4$B40D2(M3:`/0B5-HBU-L$]$SR8E3;(L3.\*Z`0````^5 +MP3O/B4PD$'0#B5-PBTPD*#O/=`Z)2TB)4W")5"00B7PD*(M,)!2+5"1`BWPD +M1"O*BU0D&!O7B90DL````'4%@_D!+1"1-5"0T5XO+ +MZ``(```[QXE$)"@/A6P"```Y?"0@#X5#`@``BT0D&(M4)!2)1"1$BT0D.(E4 +M)$#K`C/_BU0D)#/).]>+5"0P#Y3!B80DE````(M$)!")C"2,````B90DD``` +M`(M4)!R-C"2,````B80DF````(M#&(M2!%&+2QS'A"2D`````0```/\0BY0D +MG````(N$)*````"#^@''A"2$`````0```(E$)#0/A($```"+A"24````.^]T +M+8MT)#"+?"0LB\B+T<'I`O.EB\J+E"2<````@^$#\Z2+2V"+="1,`\@S_XE+ +M8#O7#X6)````.7PD$`^%C````#M$)#AU;(ET)"2+-COOB70D3`^$U_W__S/M +MB7M@B7MDZV")>V3I^````,=$ +M)"@+````Z0H!``"#^@-U",=$)!`!````BTPD.+X!````.\&)="0\=0N)>V") +M>V3IP@```(/Z`W5!BU0D,"O(`]`[[XF4)(````")3"1P=`2)="1LBW0D%(M4 +M)!@K\8M,)"0;USO/B70D%(E4)!@/A8(```")1"1(ZWP[[W0*B40D%(E\)!CK +M8(O+Z![W__\[QW4*B70D$(ET)'SK68M,)#B+E"24````BVPD%(M\)!@KRKX` +M````*^F)2V0;_HES8(MT)#")?"08B_B+P0/RB6PD%,'I`O.EB\B#X0/SI(N$ +M))0````S_SE\)"1U!(E$)$B)?"00.7PD*'49BTPD7(M$)%A1C50D)%"+R^@L +M!0``B40D*(M$)"B)?"0D.\=U-CE\)#QT*CE\)"!U*HM,)!R+0QB+402+2QS_ +M4`0[QXE$)"1T#(E\)#S'1"00`0```#E\)"!T",=$)!`!````BT0D$(E\)#`[ +MQXE\)$QU;(M#6(M+5#O!%&+C"2,````4HM4)"Q1BTL< +M4(M2!/]6#(OP._5T#K@!````B40D+(E#4.L,.6PD:'47.6PD$'41BT0D7(M, +M)%A048O+Z)8"```Y;"0T=&TY;"0\=",[]74?.6M0=1HY;"0D=10Y;"0@=0XY +MJX0```!U'3EL)"QT1#FKA````'4/BW0D'(M6!(F3@````.L$BW0D'(M$)!2+ +M3"08B]`+T74&.6PD$'4QBU0D2(E&$(E6#(E.%/^#A````.L$BW0D'#EL)!!U +M$HM$)#"-2"#H?1<``#O%=6SK,CEL)&AT$8V+Z````.AF%P``.\5U5>L,.6X$ +M=$S'0R0!````C8OD````Z$D7```[Q74XBTX75N!Q*0```##,\!?7EU;@<2D```` +MPY"05HOQZ-CU__^%P'4?BT88C4X8A +MPWX*)?__```-```'@%[#D)"0D)"0D%-6B_%7B]J-OK````!7_Q5`P$(`BX:( +M````AX +M`0```.L",\")`XNVG````%?_%43`0@"+QE]>6\(8`)"0D)"0D)"0D)"0D%:+ +M\5>-OK````!7_Q5`P$(`BX:(````BTPD#(7`BT0D$'02.X:4````=R!R"#N. +MD````',6B8Z0````B8:4````QX:(`````0```%?_%43`0@!?7L((`)"0D)"0 +MD)"0D%:+\3/`QT8T`````#/2B_^#^`QR![D$````ZP:+R,'I`D&(A!:0```` +M0DEU]8A4!FA`@_@FP\S,S,S,S,Q35HOQB]J+5C2% +MTG0%.5XH=#U7BWPD$(M'!(O/_]"+P_?8@^`#QT8H`````,=&-`````")1C"- +M%!B+!XO/_]")1C1?AB+3"04BWPD$$>#P02)?"00B4PD%(/_)G*^C4PD +M$(ET)!")3"04A?9T9HU&`HE$)!@/MP"-3@2+WHLQABW0D$(O>A?9T?XO_#[=#`HO+BUL$A#[9T.F=/*\:+K((,`0``C31VC32QB2Z)M((, +M`0``BX2Z$`$``(D!B8RZ$`$``(7;=8-?7EU;@\0,P\S,S,S,S,S,S,S,@WHL +M`%:+\'4;Z'+^__^+A+(0`0``A+.(F\BA`!```/MG0R:`^V3!%H*\Z- +M-':-'+`/MK01CP````^V?!9H._ET(`^V?!9G3BO/58NLB@P!``"-/'^-/+N) +M+XF\B@P!``!=BXRR$`$``(D+7XF%(E."+H``0``9HD0 +MN@$!``!FB5`"B4@$B5@(,]*-00*-9"0`,\F(4/[&0/\!9HD(9HE(`D*#P`:! +M^@`!``!RY(V6_`D``(E4)`A5ZP>-I"0`````BWPD##/MZPB-I"0`````D`^W +MA>#<0@`STHU+`O?QN@!````KT`^WRC/`C9L`````9HD,1X/`"(/X0'+T@\4" +M@\<"@_T0H09HE0!D]FB6@$B]")<`C!ZA!FB4$" +M9HE1!(OPA?]UC%]>75N!Q`0!``#"!``SP%]>75N!Q`0!``#"!`#,S,S,S,S, +MS,R#["!35E>+^8M7"(!Z`1]S98L'BT@(A) +M1P2%P'4.B_?H;OS__U]>6X/$(,.+?PAFB4<"P>@09HE'!%]>6X/$(,.+1PB+ +M3T"*$(@108E/0#M/1'/*BU<(#[="!`^W<@+!X!`+QHE,)!1T)CO!=PI7Z)_] +M__^%P'2F_T\,=2"+3P0STCL/B40D%`^5PBE70.L-9HE*`L'I$&:)2@2+!XL/ +M58MO!(E,)"R)!XE'!#OI#X0=`@``#[-<0&+U^@\^___B40D)(7`#X2G`0``BTPD +M$(MU!(O0B4PD$(U.""O&BUGXB1J+6?R)6@2+&8D<"(/"#(/!#/],)!!UY(M$ +M)""+E(<0`0``BUPD%(D6B;2'$`$``(M$)"2+="0 +M($*]8[ +MPAO2C1QV`]M"`]L[PQO;0P/3C33V.\8;P(U$`@6+5"0D`\AFB4T"B$(!BVT( +M.VPD+'00BW0D'.D)_O__B_?HPOG__UU?7EN#Q"##S,S,S,S,S,S,S(L&@^P4 +M4U6+:`2+1@A7.\5T*HL09HMX!(U(^NL#C4D`BQF)&&:+601FB5@$@^@&@^D& +M.\5UZHD09HEX!(L^#[9(`0^W7P(STBO9.58,#Y7"B50D%(U4"@0/MP_1ZDF) +M3"00B%`!#[9(!P^V>`&#P`8KV0-,)!31Z0/1B50D#(A(`3O/=D"+$(E4)!AF +MBU`$9HE4)!R+T(MZ^HDZ9HMZ_F:)>@2#Z@8[U70(#[9Z^SO/=^2+3"08B0IF +MBTPD'&:)2@2+5"0,_TPD$'6:0(`X``^%_````#/)@^@&08`X`'3WBQ8/MSH# +MV8O'*\&-3P'1Z6:)`H/X`754#[9%`>L&B_^+1"000-'KT>B)1"00@_L!=^Z- +M0@*+50")$&:+501FB5`$BE0D$(A0`8E&"`^VA#&/````BXR&$`$``(E-`%^) +MK(80`0``75N#Q!3#C5`!T>H[RG1X#[:\,8\````/MH0RCP```(E\)!0[^'1@ +MBXR&$`$``(7)=$R+.8F\AA`!``"+!HE4)!"+T8E(!(U%""O5BWCXB3F+>/R) +M>02+.(D\`H/!#(/`#/],)!!UY(M$)!2+C(80`0``B4T`B:R&$`$``.L)5U6+ +MSNCC]/__BU0D#(L&B\O1Z2O1`]-?9HE0`HM0!%V)5@A;@\04P\S,S,Q65XLY +M#[TD;P#``"-A)&\`P``BD@" +MB];3ZC/)75LK\H72#Y3!9HDP7UX#RHM4)`2)"L($`(V!N`,``(M,)`Q?QP$! +M````7L($`,S,S,S,S,S,S,S,S,S,5HOQBT8(BPX/ME`!9H-!`@0/MDC[@\($ +MB%`!.]%V+U-FBU@$58MH^HU(^E>+.(DH9HMI!(DY7V:):`1FB5D$78E."%N# +M^GQV!>@B_?__BTX(#[=!!`^W40+!X!`+PH-^#`!U##M&0'8'B0:)1@1>PXO. +M7NFH^?__S,S,S,S,S,Q35HOQBU8(#[9"`5>+/@^W7P*-#``[V1O)]]D!3B"# +MPP2#P`2)3A1FB5\"B$(!@_A\=@7HN/S__XM."`^W000/MU$"P>`0"\*#?@P` +M=0X[1D!V"5^)!HE&!%Y;PU^+SEY;Z3KY___,S,S,S,S,S,S,5HOQBTX(#[9! +M`8M6)(E6((L69H-"`@2#P`2(00&#^'QV!>A9_/__B\Y>Z0'Y___,5HOQBTX, +MQT8$`````,<&_____XL!_]"$P'0$,\!>PU>_!````(M.#(L1_]*+3@0/ML#! +MX0@+P4^)1@1UZ(/X_QO`7_?87L/,S,S,S,S,S,R![`P!``!355:+\8LN9H-] +M``%7#X3@`0``BT4$#[==`HE$)!2+1D@STO?SBWY,,]*+R(O']_&+5"04B4Y( +M#[92`8E,)!B+R"O">6J+1"08#Z_"B49(/0````%S.XM.5(L!_]"+5DS!9D@( +M#[;(P>(("\J!?D@````!B4Y,(("\K!9D@(B4Y, +MBT0D%(E&"(H8B\[H:?[__U]>70^VPUN!Q`P!``##QT84``````^W50!*B50D +M$(M4)!2#P@:)5"04#[92`2O"#XBA````_TPD$'7C.\L/@W($```KR(M$)!@K +MV8O0#Z_8BT8(#Z_1*_J)?DR)7D@/M@B!P<````#!Z06#X0B)3APSP(VD)``` +M``"#R?^)3(0,!``"+;"04#[95`8M>2"O**\@/K\N+PP^OPBOYB7Y,B49(/0````%S.XM. +M5(L!_]"+5DS!9D@(#[;(P>(("\J!?D@````!B4Y,(("\K!9D@(B4Y,B6X(BET`B\[HI?S__U]>70^VPUN!Q`P!``##BT8(#[8` +M!<````#!Z`6#X`B)1AR+30@/MQ$/MHPRIP$```^V50*!PL````"-?0+!Z@2# +MXA`#R@^V50/!X@8#T(M&(,'X&H/@(`/1`\(#1A0/MXQ&?`D``(V41GP)``"+ +M1DC!Z`X/K\&-62#!ZP$("\'!9D@(B49,#[='!`^W5P(/MD\!BA_!X!`+PKH!```` +M`58@B584@?F`````#Y+"`M&)?@B(5P&#?@P`=1@[1D!V$U^)!HE&!%Y=#[;# +M6X'$#`$``,.+SNC!]?__7UY=#[;#6X'$#`$``,-FB0K!Z0H/MHPQJ`,``"E& +M3"E&2(E.$#/`ZPB-I"0`````D(/)_XE,A!R)3(0@B4R$)(E,A"B)3(0LB4R$ +M,(E,A#2)3(0X@\`(@_A`LC_8T$0HD. +MB_\/ME`&#[8(#[9H!P^V5!0<#[9,#!R#P`PCU0^V:/4CS0/Y`_I+==F-5"08 +M4HM4)!2+SNC)^?__BUPD&(E$)!"+1D@ST@/?]_.+3DPSTHE<)!B+Z(O!]_6) +M;D@[QW)4.\,/@P8!``"+Q0^OQRO(BT0D$(E.3(O+*\\/K\V)3DAF`1B+#HM! +M!`^W"8T428T,4)`/MA"#P`;&1!0<`#O!=?'IS/[__U]>78/(_UN!Q`P!``## +MBPZ+>02+R(VD)``````/MA>L/ME?[@^\&*\B+ +MW2O*#Z_+*4Y,B\,/K\*)1D@]`````7,[BTY4BP'_T(M63,%F2`@/MLC!X@@+ +MRH%^2`````&)3DQS&8M.5(L!_]"+5DP/MLC!X@@+RL%F2`B)3DR+1"00BD@" +M@/D'70^VPUN! +MQ`P!``##7UY=N/[___];@<0,`0``P\S,S,Q6B_&+!H7`=")0_Q74P$(`AP\QJ_U'_%1S`0@"#^/]U#?\5 +M],!"`(7`=0.#R/_#S,S,S%-65XOQBP9J_U#_%1S`0@"+/?3`0@"#^/]U"__7 +MA6\/,S,S,S,S,S%:-1"0(4&H`B_&+3"0045)J`&H`Z$<0 +M``"#Q!B)!EZ%P'0%,\#"!`#_%?3`0@"%P'4%N`$```#"!`#,S,S,S,R+`5#_ +M%13`0@"%P'0#,\##_Q7TP$(`AA)9>C'1?P`````4?\5!,!"`,=%_/__ +M__\SP(M-\&2)#0````!?7EN+Y5W#N`$```##BV7HQT7\_____[@(````BTWP +M9(D-`````%]>6XOE7B#P`.)`8/!$#/`5[\!````A?9T#8L:B1R!0(/"!#O& +ML0P>@(@>/_````#[:;`-U"`"7_````#[:``-U"`,'B +M"`O3,\?!X@@#_PO"]\<``0``=`6_&P```(O6ZU6#^@1U4(/^!G9+B]C!ZQ"+ +MZ,'M&`^VK0#=0@"!X_\````/MIL`W4(`P>4("]V+Z,'M"('E_P````^VK0#= +M0@#!XP@E_P````^V@`#=0@`+W<'C"`O#,P&#P02)1+'\2CM,)!0/A3/___]? +M7EU;P@0`S,S,S,S,S,S,S,S,5E>+?"0,5XOQZ-+^__^-5Q0SR872=&]3ZP:- +MFP````"+1(X@B_C![Q"!Y_\````/MK\`W4(`BSR]`$U#`(O8P>L(@>/_```` +M#[:;`-U"`#,\G0!)0P"+V,'K&`^VFP#=0@`S/)T`44,`)?\````/MH``W4(` +M,SR%`$5#`$&)?(X<.\IRFUM?7L($`,S,S,S,BP*)`8M"!(E!!(M""(E!"(M2 +M#(E1#,/,S,S,S,S,S,R#[$"#?"1$`(O!B40D#`^$/04``%-5C4H(5HE,)!!7 +MD(M1^(LIBWG\BTD$B4PD/(M($(E,)!#!X06+=`@@BUP(*#/=,_*-1`@@BT@$ +MB6PD.#//B50D,(M0##-4)#R)?"0TB_J+Z\'M$('E_P```,'O"('G_P```(L\ +MO0!)0P`S/*T`34,`B^G![1@S/*T`44,`B^Z!Y?\````S/*T`14,`B50D+(ON +MP>T(@>7_````P>H0@>+_````BQ25`$U#`#,4K0!)0P"+Z\'M&#,4K0!10P"+ +MZ8'E_P```#,4K0!%0P")="0@B^G![A#![0B!YO\```"!Y?\```")="08BS2M +M`$E#`(ML)!@S-*T`34,`BVPD+#-X\#-0],'M&#,TK0!10P"+Z\'K",'I$('C +M_P```(L7_ +M````,S2M`$5#`(/H(#-P&('A_P```#,T8,PRM +M`%%#`,'J$(ON@>+_````@>7_````,PRM`$5#`,'N"#-("('F_P```(LLM0!) +M0P`S+)4`34,`P>\8,RR]`%%#`('C_P```#,LG0!%0P"+\3-H#,'N$(O5P>H( +M@>+_````BSR5`$E#`(M4)"3!ZAB!YO\````S/+4`34,`BW0D(#,\E0!10P"+ +MUH'B_P```#,\E0!%0P"+U3-X\(/H(,'J$(O>P>L(@>+_````@>/_````BQ25 +M`$U#`#,4G0!)0P"+V<'K&#,4G0!10P"+7"0D@>/_````,Q2=`$5#`(M<)"3! +MZPB!X_\```"+')T`24,`P>X0@>;_````,QRU`$U#`(OUP>X8,QRU`%%#`(OQ +M,U`4@>;_````,QRU`$5#`,'I"#-8&('A_P```(L,C0!)0P"+\XM<)"3!ZQ"! +MX_\````S#)T`34,`@>7_````B]F+3"0@P>D8,QR-`%%#`#,4(B\[!Z1"!X?\````/MHD`54,`"\W! +MX0B+Z\'M"('E_P````^VK0!50P`+S<'A"(OO@>7_````#[:M`%5#``O-,PB+ +M[HE,)$#![1@/MJT`54,`P>4(B\O!Z1"!X?\````/MHD`54,`"\W!X0B+[\'M +M"('E_P````^VK0!50P`+S<'A"(OJ@>7_````#[:M`%5#``O-,T@$B4PD1(O/ +MP>D0@>'_````#[:I`%5#`(O+P>D8#[:)`%5#`,'A"`OIB\K!Z0B!X?\````/ +MMHD`54,`P>4("^F+SH'A_P````^VB0!50P#!ZA#!Y0@+Z3-H"('B_P````^V +MD@!50P#![Q@/MH\`54,`P>$("]'![@B!YO\````/MHX`54,`P>(("]&!X_\` +M```/MHL`54,`P>(("]$S4`R+1"0R+<`@S]8EQ\(MP##/RBU0D,(EQ](D0BU0D-(E0!(M4)#B)4`B+5"0\B5`, +MBU0D5$J)5"14B4PD%(72#X73^O__7UY=6X/$0,($`,S,S,S,S,S,S#/`#[:( +M`-U"`(B!`%5#`$`]``$``'+K5E-5,_97C4D`#[:.`-U"`(O1@.*`#[;"]]@; +MP(/@&XT4"3/")?\```"+^#/YB]?!X@@+T<'B"`O1P>(("]")%+4`-4,`#[:N +M`%5#`(O1P>((B]H+T`O9P>,("]C!X`@+Q\'@"`O!P>(("]?!X`@+P<'B"`O1 +MB02U`$%#`,'C"`O?B\4D@`^VP/?8&\")%+4`/4,`@^`;C4PM`#/!)?\```"+ +MT(#B@`^VRO?9&\F#X1N-%``SRH'A_P```(O1@.*`#[;2]]H;TH/B&XT\"3/7 +M@>+_````B_J)'+4`.4,`B]HST3/X,_V+RC/"B](("]'!X@@+T\'B +M"`O0B12U`$5#`(O1P>(("]/!X@@+T,'B"`O7B12U`$E#`(O3P>(("]#!X`@+ +MQ\'B",'@"`O7"\'!X@C!X`@+T0O#B12U`$U#`(D$M0!10P!&@?X``0``#X*P +M_O__OI!X0@#H!@<``%]=6X7`=!J^\(Q"`.@5"```A +MPXDU%(9#`%[#S,S,S,S,S,S,S,S,S(M$)`1H`%9#`%#H(1(``,($`,S,S,S, +MS,S,S,S,S,S,4HO1@\G_Z-7____WT,/,S#/2B\*#X`'WV"4@@[CMB\K1Z3/! +MB\B#X0'WV8'A((.X[='H,\B+P8/@`='I]]@E((.X[3/!B\B#X0'WV8'A((.X +M[='H,\B+P8/@`='I]]@E((.X[3/!B\B#X0'WV8'A((.X[='H,\B+P8/@`='I +M]]@E((.X[3/!B\B#X0'WV8'A((.X[='H,\B)#)4`5D,`0H'Z``$```^"9O__ +M_[@$5D,`NL`"``!6BTC\B_'!Z0B!YO\````S#+4`5D,`@\`0B8CL`P``BTCP +MB_'!Z0B!YO\````S#+4`5D,`B8CP`P``BTCTB_'!Z0B!YO\````S#+4`5D,` +MB8CT`P``BTCXB_&!YO\```#!Z0@S#+4`5D,`2HF(^`,``'6.7L-6B_'H-P4` +M`/9$)`@!=`=6Z)F?_?]9B\9>P@0`S/\E>,%"`,S,:O]09*$`````4(M$)`QD +MB24`````B6PD#(UL)`Q0P\S_)73!0@#_)7#!0@#_)6S!0@#_)63!0@!5B^QJ +M_V@XX$(`:,:$0@!DH0````!09(DE`````(/L#%-65X-EY`"+=0R+Q@^O11`! +M10B#9?P`_TT0>`LI=0B+30C_513K\,=%Y`$```"#3?S_Z!$```"+3?!DB0T` +M````7UY;R<(0`(-]Y`!U$?]U%/]U$/]U#/]U".@!````PU6+[&K_:$C@0@!H +MQH1"`&2A`````%!DB24`````45%35E>)9>B#9?P`_TT0>!N+30@K30R)30C_ +M513K[?]U[.@:````6<.+9>B#3?S_BTWP9(D-`````%]>6\G"$`"+1"0$BP"! +M.&-S;>!T`S/`P^GT`P``58OL:O]H6.!"`&C&A$(`9*$`````4&2))0````"# +M[!!35E3KY<=% +MX`$```"#3?S_Z!$```"+3?!DB0T`````7UY;R<(4`(-]X`!U$?]U&/]UY/]U +M#/]U".@+____P\S,4U:+1"08"\!U&(M,)!2+1"00,]+W\8O8BT0D#/?QB]/K +M08O(BUPD%(M4)!"+1"0,T>G1V]'JT=@+R77T]_.+\/=D)!B+R(M$)!3WY@/1 +M<@X[5"00=PAR!SM$)`QV`4XSTHO&7EO"$`#,S,S,S,S,S%.+1"04"\!U&(M, +M)!"+1"0,,]+W\8M$)`CW\8O",]+K4(O(BUPD$(M4)`R+1"0(T>G1V]'JT=@+ +MR77T]_.+R/=D)!21]V0D$`/1<@X[5"0,=PAR#CM$)`AV""M$)!`;5"04*T0D +M"!M4)`SWVO?8@]H`6\(0`,S,S,S,S,S,S,S,@/E`CT````:%PP +M0P!H6#!#`.C?````H0B&0P")192-1910_S4$AD,`C46<4(U%D%"-1:!0_Q4X +MP4(`:%0P0P!H`#!#`.BL````@\0DH33!0@"+,(EUC(`^(G4Z1HEUC(H&.L-T +M!#PB=?*`/B)U!$:)=8R*!CK#=`0\(';RB5W0C46D4/\5`,!"`/9%T`%T$0^W +M1=3K#H`^(';81HEUC.OU:@I84%934_\5D,!"`%#H`(K]_XE%F%#_%3#!0@"+ +M1>R+"(L)B4V(4%'H(0```%E9PXMEZ/]UB/\5*,%"`/\E&,%"`/\E',%"`/\E +M(,%"`/\E+,%"`/\E/,%"`&@```,`:````0#H!P```%E9PS/`P\/_)53!0@#, +MS,S,S,S,S,S,S,R#[!#_%2#`0@`\!7(DZ&X!``"%P'0;N@$```"-#"3H/0$` +M`(M$)`C!Z!F#X`&#Q!##,\#!Z!F#X`&#Q!##S,S,@^P0:A'_%23`0@"%P'1# +M_Q4@P$(`/`5R.>@B`0``AC.````@_@'@%P>D)(\&#X`&#Q!##,\"# +MQ!##4U>+^8O",\D/HHD'B5\$B4\(B5<,7UO#S,S,S,S,S,RH*,_J+SL')!XO6 +MPZ'+\__^%P'05QP58,4,`D)-"`,<%`(9#`)"30@## +MQP4`AD,``````,<%6#%#`!"(0@##S,S,S%-55HOQ5XOZBU8(@^(_QD0R0(!" +M@_HX=C&#^D!T&+A`````C4Y`*\(#RE!J`%'HF?C__X/$#(L&C5Y`C6X@B]-J +M`8O-_]`STNL&C5Y`C6X@N#@````KPE"-1D`#PFH`4.AG^/__BTX(@\0,BT8, +MB],/I,@#P>$##\@/R8E&>(L&B4Y\B\UJ`?_0B]6[!````(M*!(U_"(L"C5(( +M#\B)1_@/R8E/_(/K`77F7XE>"(E>#,=&)(6N9[O'1BAR\VX\QT8L.O5/I<=& +M,']2#E''1C2,:`6;QT8XJ]F#'\=&/!G-X%M>QT4`9^8):EU;P\S,S*%8,4,` +MB0''00@`````QT$,`````,=!(&?F"6K'022%KF>[QT$H!;P\S,4U57BWPD$(OJB]F%_W1\ +MBT,(5H/@/[Y`````*_`!>PB#4PP`._=V%U>#P$`#PU50Z+WT__^#Q`Q>7UU; +MP@0`AX&5O_0@^<_=!/!Y@:-0T!7`_564.AK]/__@\0,7E]=6\($`,S,S,S, +MS,S,S,S,S,S,S%97BT0D#(MQ$,'F!68/;RF#P2!F#V\T,68/;SF#[A#ID``` +M`(VD)`````#K`\S,S&8/;PIF#V]2$&8/;UH@9@]O8C"+_F8/[\YF#^_69@_O +MWF8/[^9F#V\$.68/.-[(9@\XWM!F#SC>V&8/.-[@@^\0=>)F#SC?SV8/.-_7 +M9@\XW]]F#SC?YV8/[\UF#^\29@_O6A!F#^]B(&8/;VHP9@]_"F8/?U(09@]_ +M6B!F#W]B,(/"0(/H!`^#<____X/`!(/N$.LV9@]O`HO^9@_OQF8/.-Y$.1!F +M#SC>!#F#[R!U[F8/.-Y!$&8/.-_'9@_OQ68/;RIF#W\"@\(0@^@!<\5F#W]I +MX%]>P@0`C9L`````5E>+1"0,BW$0P>8%@_@(#X+G_O__Q?EO*8/!(,3B?5HT +M,<3B?5HY@^X0B_X#]E.![,`!``"+W(/CX,3B?5H$.<7]?P1[@^\0=?"#Z`B- +M20"+_L7-[PK%S>]2(,7-[UI`QV,3B +M7=[@@^\@=>+$XG7?S\3B;=_7Q.)EW]_$XEW?Y\3C53@J`<7U[\W%[>]2$,7E +M[UHPQ=WO8E#%^6]J<,7^?PK%_G]2(,7^?UI`Q?Y_8F"!PH````"#Z`@/@WG_ +M__^#P`C1[H'$P`$``%O%^'?IN?[__\($`(O_5E>+1"0,BW$0P>8%9@]O`8/! +M(&8/;Q%F#V]9$&8/;V$@9@]O:3!F#V]Q0&8/;WE0`\[WWH/&8.M,C:0D```` +M`&8/;PJ+_F8/[\IF#^_!9@\XW,-F#SCX/'$'7P@^@( +MB_^+_L75U.[%U>_/Q=74[L75[]?%U=3NQ=7OW\75U.[%U>_GQ?UO!#O$XG7< +MR,3B;=S0Q.)EW-C$XEW7O6D#%W>]B8,7^?PK%_G]2(,7^?UI`Q?Y_8F"!PH````"# +MZ`@/@W/___^#P`C$XWTY[0'1_H'$X`$``%O%^'?IY_W__\($`,S,S,S,S%-5 +M5E>+P8M\)!2+;"08@_\?#X*)`0``]\(#````=!,/MC(/MMA"P>@(,_,S1+4` +M3^OE,P*-?#KE*]>-FP````"+3!<,BUP7"`^V\S.,M0`,```/MO?!ZQ`SC+4` +M"```#[;SP>L(,XRU``0``#-,G0"+7!<$#[;S,XRU`!P```^V]\'K$#.,M0`8 +M```/MO/!ZP@SC+4`%```,XR=`!````^V\(O8P>L8,XRU`"P``#.,G0`@``#! +MR!`/MO#!Z!@SC+4`)```,XR%`"@``(M$%QB+7!<4#[;S,X2U``P```^V]\'K +M$#.$M0`(```/MO/!ZP@SA+4`!```,T2=`(M<%Q`/MO,SA+4`'```#[;WP>L0 +M,X2U`!@```^V\\'K"#.$M0`4```SA)T`$```#[;QB]G!ZQ@SA+4`+```,X2= +M`"```,')$`^V\<'I&#.$M0`D```SA(T`*```@\(8#X/?_O__@\<8@^H8#[;8 +M#[;,P>@0#[;PP>@(BT2%`#.$G0`,```SA(T`"```,X2U``0``(/"!'(%,P07 +MZ\X#UX/'`ROZA?]T$P^V,@^VV$+!Z`@S\S-$M0!/=>U?7EU;P@@`S,Q358OL +MBUPD#(/D\(/L$(T%$-]"`(/[``^$#@,``/,/;Q'S#V]9$&8/<,(;9@]PTQMF +M#V_:9@]LT&8/;=B-9"0`9@]_%"1F#V_+9@]O!0#?0@#S#V\B9@\X`.#S#V]J +M$&8/.`#H\P]OQF#V]`0&8/_L0/.,O39@]PP`X/ +M.,S\#SC+VF8/;\5F#SH/Q`1F#_[P#SC-]68/;T!09@_^Q0\XR]-F#W#`#@\X +MS.4/.,O:9@]OQF8/.@_%!&8/_O@/.,W^9@]O0&!F#_[&#SC+TV8/<,`.#SC, +M[@\XR]IF#V_'9@\Z#\8$9@_^X`\XS>=F#V]`<&8/_LCH;HG]_UG#C8UL____Z6[1_O__=>CH68G]_UG#C4WL +MZ5S1_O^-C1S____I'(/]_XU-W.GB+O[_C4W$Z3TX__^-3=#I-3C__XV-Z/[_ +M_^G^@OW_C4VXZ;\N_O^-C7#____I,X3]_[A0X4(`Z7/I___,S,R-3=CI]'_] +M_XU-Z.F7+O[_N/CA0@#I5NG__\S,BTWP@\$PZ8`N_O^X*.)"`.D_Z?__S,S, +MBTWP@\$PZ6@N_O^+3?"#P3SI72[^_XM-\(/!2.E2+O[_BTWP@\%8Z4^" +M_?^XL.)"`.FIZ/__S(M-\.G7+?[_N.CB0@#IENC__\S,BTWPZ<,M_O^X$.-" +M`.F"Z/__S,R+3?"#P1#IK"W^_[@XXT(`Z6OH___,S,R+3?#IERW^_[A@XT(` +MZ5;H___,S/]U\.C=A_W_6<.XP.-"`.E`Z/__C4W3I-RW^ +M_[B`Y$(`Z?;G___,S(U-Y.DC+?[_N*CD0@#IXN?__\S,C4WDZ0\M_O^XT.1" +M`.G.Y___S,R-3>CI7C;__[CXY$(`Z;KG___,S(M-\.GG+/[_N'#E0@#IIN?_ +M_\S,_W7PZ"V'_?]9P[B8Y4(`Z9#G____=?#H&8?]_UG#N,#E0@#I?.?___]U +M\.@%A_W_6<.XZ.5"`.EHY___C4WDZ9CI@RS^ +M_XU-W.E[+/[_N#CF0@#I.N?__\S,C4V\Z:*C_?^X:.9"`.DFY___S,R-3>3I +M4RS^_[B0YD(`Z1+G___,S(U-Z.D_+/[_N+CF0@#I_N;__\S,C4W4Z2LL_O^- +M3>#I(RS^_XU-Q.F!K/W_C4W$Z8VC_?^-3:SI"RS^_XU-\.EIK/W_C4W(Z?LK +M_O^XX.9"`.FZYO__S,R-3>SI'JW]_[@XYT(`Z:;F___,S(U-O.D.H_W_N&#G +M0@#IDN;__\S,C4V\Z?JB_?^XB.="`.E^YO__S,R-3;SIYJ+]_[BPYT(`Z6KF +M___,S(U-X.F7*_[_C4W4Z8\K_O^XV.="`.E.YO__S,R-3=#I>RO^_XU-Z.ES +M*_[_C4WCI5RO^_[A0Z$(`Z1;F___,S(U- +M].EVPOW_C4WPZ73"_?^X>.A"`.GZY?__S,R-3>CI)RO^_[BHZ$(`Z>;E___, +MS+C0Z$(`Z=KE___,S(U-\.ENS?[__W7HZ%F%_?]9P[@HZ4(`Z;SE__^+3?#I +M4LW^_[A8Z4(`Z:KE___,S(U-Y.G7*O[_C4W8Z<\J_O^-3O,_O^+3?"#P5SIX,S^_XM-\(/!;.G5S/[_BTWP@\%P +MZCI5RC^_XU-W.E/*/[_N/CL +M0@#I#N/__\S,C4WHZ3LH_O^-3=SI,RC^_[@H[4(`Z?+B___,S(U-X.EHN?W_ +MC4W@Z6"Y_?^X6.U"`.G6XO__S,R-3>CI9C'__XU-W.G[)_[_C4VTZ;[U_?^X +MB.U"`.FRXO__S,R-3:3I&I_]_XU-F.G7)_[_C4WCIQR?^_XU- +MZ.F_)_[_C8U@____Z>^>_?^XP.U"`.ESXO__S,S,C4W0Z9\G_O^-3=SIER?^ +M_XU-Q.F/)_[__W7LZ.&!_?]9PXU-Z.GDR?[_N!CN0@#I/.+__XU-X.EK)_[_ +MN&#N0@#I*N+__\S,C4W@Z:"X_?^-30CIMLG^_[B([D(`Z0[B___,S+CP[D(` +MZ0+B___,S+A([T(`Z?;A___,S+B@[T(`Z>KA___,S(U-Z.D7)_[_N/CO0@#I +MUN'__\S,_W7PZ%V!_?]9P[@@\$(`Z<#A____=?#H28']_UG#N$CP0@#IK.'_ +M_XU-Z.G;)O[_N'#P0@#IFN'__\S,N)CP0@#ICN'__\S,N/#P0@#I@N'__\S, +MC4W@Z?BW_?^X2/%"`.ENX?__S,R+3?#I`Q+^_[BH\4(`Z5KA___,S/]U\.CA +M@/W_6<.-3?#IY,C^_[C0\4(`Z3SA__^-3=#I:R;^_XU-W.EC)O[_C4VHZ0@1 +M_O__=0CHK8#]_UG#C4T,Z;#(_O^-30SIJ,C^_[@`\D(`Z0#A__^+3?#IELC^ +M_[B(\D(`Z>[@___,S(M-\(/!%.E_R/[_N+#R0@#IU^#__\S,S(U-".EJR/[_ +MN-CR0@#IPN#__\S,BTWPZ>\E_O^X./-"`.FNX/__S,S_=?#H-8#]_UG#N&#S +M0@#IF.#__XM-\.DNR/[_N(CS0@#IAN#__\S,C4WDZ;,E_O^XL/-"`.ERX/__ +MS,R-3>#IGR7^_XU-U.F7)?[_N-CS0@#I5N#__\S,C4W`Z8,E_O^-C63____I +MLYS]_XU-M.EP)?[_C4W@Z6@E_O__=2SHNG_]_UG#C8WP_O__Z;K'_O^-C63_ +M___I@YS]_XV-]/[__^E9'_[_C4VDZ;1Z_?^-C:#^___I("7^_XU-M.DB)?[_ +MN`CT0@#IX=___\R+3?#I&"7^_XM-\(/!#.EG+O__BTWP@\$DZ?DD_O^X@/1" +M`.FXW___BTWP@\$8Z>0D_O^XN/1"`.FCW___S,S,BTWPZ=@D_O^+3?"#P0SI +M)R[__XM-\(/!).FY)/[_BTWP@\$PZ2`?_O^XX/1"`.EMW___S(U-Z.F;)/[_ +MN"#U0@#I6M___\S,C4W@Z8___,S(M-\.DVQO[_BTWP@\$$Z2O&_O^+3?"#P0CI(,;^ +M_[@X]D(`Z7C>__^-3>3IIR/^_[AP]D(`Z6;>___,S(U-Y.F3(_[_C4W8Z8LC +M_O^XF/9"`.E*WO__S,R-3>#I=R/^_[C(]D(`Z3;>___,S(U-Z.G&+/__C4W< +MZ;XL__^-3<3I4R/^_XU-Q.D^@_[_N/#V0@#I"M[__\S,C4VPZ?9X_?^-3=CI +M+R/^_XU-Y.DG(_[_C4W`Z1\C_O^X,/="`.G>W?__S,S_=?#H97W]_UG#BTWP +MZ0$C_O^X2S_?^X0/A"`.E:W?__S,R-3>3IT+/]_[AH^$(`Z4;= +M___,S(U-Y.F\L_W_N)#X0@#I,MW__\S,C4W3I?+/]_[CX^$(`Z?+<___,S(U- +MY.EHL_W_N"#Y0@#IWMS__\S,N$CY0@#ITMS__\S,C4VDZ?\A_O^-3;#I]R'^ +M_XU-O.GO(?[_C4WPZ>[#_O^-3>SIYL/^__]U".C1>_W_6<.-3=#I +M;2'^_XU-W.EE(?[_C4W$Z5TA_O^X0/I"`.DCIC\/^_XV-9/[__^GF(?[_C4W8Z7S# +M_O^-3.D4&_[_N/CZ0@#I8=O__\S_=?#HZ7K] +M_UG#C4WPZ>S"_O^-3>3I?2#^_XU-V.EU(/[_C4W,Z6T@_O^X6/M"`.DLV___ +MBTWP@\$`?_O^+3?"# +MP6#I$)?]_[CP^T(`Z93:____=?#H'7K]_UG#N$#\0@#I@-K__XM-\.D6PO[_ +MBTWP@\$$Z0O"_O^+3?"#P0CI`,+^_XM-\(/!#.GUP?[_BTWP@\$8Z8,?_O^+ +M3?"#P23I>!_^_XM-\(/!,.EM'_[_BTWP@\%XZ=09_O^X:/Q"`.DAVO__S(M- +M\(/!&.E,'_[_N,C\0@#I"]K__\S,S(U-P.DW'_[_C4W`Z2\?_O^-3>3I)Q_^ +M_XU-V.D?'_[_C4W,Z16 +M_?^-3=SI)RC__XU-W.F\'O[_C4V,Z;0>_O^-3=#IK![^_[AH_4(`Z6O9___, +MS,R-3>3IEQ[^_XU-V.F/'O[_N,C]0@#I3MG__\S,C4W_O^-3>CI_O^-3=#I3Q[^_XU-W.E''O[_ +MN"C^0@#I!MG__\S,C4WHZ3,>_O^X:/Y"`.GRV/__S,R-3>3I'Q[^_XU-V.D7 +M'O[_N)#^0@#IUMC__\S,C4WHZ0,>_O^-3=SI^QW^_[C`_D(`Z;K8___,S(V- +M5/___^FO7_[_N/#^0@#IH]C__\S,S(M-\.DU7_[_BTWP@\$4Z7=D_O^+3?"# +MP2#I0U_^_XM-\(/!5.FN'?[_BTWP@\%@Z:,=_O^+3?"#P73I@63^_XM-\('! +M@````.F*'?[_N!C_0@#I2=C__\R+3?#I=QW^_XM-\(/!#.G/)O__N'#_0@#I +M*]C__\S,S(M-\.F]7O[_BTWP@\$4Z?]C_O^+3?"#P2#IRU[^_XM-\(/!5.DV +M'?[_BTWP@\%@Z2L=_O^XH/]"`.GJU___S,R-3>#I%QW^_XU-R.D/'?[_C4V\ +MZ0<=_O^-3=3I_QS^_XV->/___^DOE/W_C4VPZ>P<_O^-3;SIY!S^_[CH_T(` +MZ:/7___,S,R-3;CI5V+^_[A``$,`Z8[7___,S(M-\.DA7O[_BTWP@\$,Z;`< +M_O^+3?"#P1CII1S^_[AH`$,`Z637__^+3?#I^5W^_XM-\(/!#.F('/[_BTWP +M@\$8Z7T<_O^+3?"#P23I3I`QS^_XU-V.G[ +M&_[_N(@!0P#INM;__\S,C4W@Z><;_O^-3=3IWQO^_XU-R.G7&_[_N+@!0P#I +MEM;__\S,C4V\Z<,;_O^-33I-QO^_XU-V.DO&_[_N(`"0P#I[M7__\S,C4WDZ1L; +M_O^XP`)#`.G:U?__S,R-3>CI!QO^_[CH`D,`Z<;5___,S(U-Z.GS&O[_N!`# +M0P#ILM7__\S,BTWPZ45<_O^X.`-#`.F>U?__S,R-3>3IRQK^_XU-V.G#&O[_ +MN&`#0P#I@M7__\S,C4WDZ:\:_O^XD`-#`.ENU?__S,R-3>CIFQK^_XU-W.F3 +M&O[_N+@#0P#I4M7__\S,C4WCI=QK^_XU-Z.EO&O[_C4WHZ6<: +M_O^-39SIFI']_[CH`T,`Z1[5___,S(M-\(/!..E(&O[_BTWP@\%$Z3T:_O^+ +M3?"#P5#I,AK^_XM-\(/!7.F*(___N#`$0P#IYM3__\S,BTWPZ1,:_O^+3?#I +M_GG^_XM-[.D#&O[_N'`$0P#IPM3__\S,C4WPZ6%Z_O^XJ`1#`.FNU/__S,R- +M3?#I37K^_XU-Y.G3&?[_N-`$0P#IDM3__\S,BTWLZ25;_O^+3>R#P23IM!G^ +M_XM-[(/!,.FI&?[_BTWL@\$\Z9X9_O^+3>R#P4CIDQG^_XM-[(/!5.F(&?[_ +MBTWL@\%@Z7T9_O^+3>R#P6SI.EG&?[_BTWL@<&$````Z5D9 +M_O^+3>R!P9P```#I2QG^_XM-[('!T````.F@(O__BTWL@<'<````Z9:[_O^+ +M3>R!P2@!``#I(1G^_XM-[('!-`$``.D3&?[_BTWL@<%0`0``Z6JZ_O^+3>R! +MP50!``#I7+K^_XM-[('!6`$``.F_?/[_N``%0P#IJ-/__XM-\(/!..G4&/[_ +MBTWP@\%$Z.E'&/[_BTWP@<&$````Z3D8_O^+3?"!P9P```#I*QC^_XM-\('!T````.F` +M(?__BTWP@<'<````Z7:Z_O^+3?"!P2@!``#I`1C^_XM-\('!-`$``.GS%_[_ +MBTWP@<%0`0``Z4JY_O^+3?"!P50!``#I/+G^_[CP!4,`Z9;2___,S(U-G.DU +M>/[_C4V@Z;L7_O^-3=#ILQ?^_XU-M.FK%_[_N)@&0P#I:M+__\S,C4W@Z4F1 +M_O^XV`9#`.E6TO__S,R-3;#I=G?^_XU-L.FR>_[_C4WLZ>5W_O^X.`=#`.DR +MTO__S,R+3?#I7Q?^_[AP!T,`Z1[2___,S(U-Z.E+%_[_C4WCI+Q?^_[C(!T,`Z>[1___,S(U-Z.D;%_[_C4W3I8B#__XU-\.EI=_[_N"`(0P#IMM'__\S,C4WDZ>,6 +M_O^-3=CIVQ;^_[A0"$,`Z9K1___,S(U-\.DLN/[_N(`(0P#IAM'__\S,N*@( +M0P#I>M'__\S,C4WHZ7J<_O^-3SI +M^7;^_[@`"4,`Z4;1___,S(U-Y.ES%O[_N,`)0P#I,M'__\S,C4W8Z5\6_O^X +MZ`E#`.D>T?__S,S_=?#HI7#]_UG#N!`*0P#I"-'__XU-Z.DW%O[_N#@*0P#I +M]M#__\S,C4W?[_BTWP +M@<$0`@``Z:@>__^XF`M#`.D$T/__BTWPZ?ZE_O^+3?"!P7@"``#IC+?^_XM- +M\('!?`(``.D7%?[_N,@+0P#IUL___\S,BTWPZ0,5_O^X``Q#`.G"S___S,R- +M3?#I5K?^_XU-[.E.M_[_N"@,0P#IIL___\S,C4W8Z=,4_O^X6`Q#`.F2S___ +MS,RX@`Q#`.F&S___S,R-3>3I,:W^_[C8#$,`Z7+/___,S(U-Z.D&M_[_C4WL +MZ?ZV_O^X``U#`.E6S___S,S_=?#HW6[]_UG#N#`-0P#I0,___XM-\(M%\(/` +M&/?9&\DCR.G-M?[_BTWPZ5RU_O^+3?"#P5#I4!3^_XM-\(/!7.E%%/[_BTWP +M@\%PZ?6U_O^+3?"#P7SI0+;^_[A8#4,`Z>[.___,S(M-\(/!!.E]M?[_BTWP +M@\$(Z7*U_O^+3?"#P0SI9[7^_[BH#4,`Z<'.___,BTWPZ5:V_O^XX`U#`.FN +MSO__S,R+3?#IVQ/^_[@(#D,`Z9K.___,S(M-\.G'$_[_N#`.0P#IAL[__\S, +MC4WLZ1JV_O^-3SI0+7^ +M_XU-S.DXM?[_N.`/0P#ID,W__XM-\(/!(.DCM?[_N%`00P#I>\W__\S,S/]U +M\.@!;?W_6<.X>!!#`.EDS?__BTWP@\$,Z4G'_O^+3?"#P1CIA1+^_[B@$$,` +MZ43-__^+3?#I'3_O^-3?#I#K3^_XU-Z.F?$?[_ +MC4W`Z9<1_O^-38CI2K/^_XU-X.D1VO[_C4WDZ;'3_O^-3=#I=Q'^_XU-Y.FA +MT_[_C4U`ZS_O^-3=CI#[/^_XU-N.D,Y?[_C4VXZ9@0_O^-3;CID!#^ +M_XU-N.F($/[_C4VXZ8`0_O^-3;CI>!#^_XU-N.EP$/[_N/@20P#I+\O__\S, +MS(M-\(/!".F_LO[_N.@30P#I%\O__\S,S(M-\(/!!.E,U_[_N!`40P#I_\K_ +M_\S,S(M-\(/!..F/LO[_BTWP@\%`Z:3G_O^X.!1#`.G3II/;^_[A8%D,`Z2;*___,S(U-U.E& +M;_[_N(`60P#I$LK__\S,C4VPZ5("__^-39CI-P_^_XU-I.DO#_[_N*@60P#I +M[LG__\S,C4W`Z1L/_O^XX!9#`.G:R?__S,R-3>CI&@+__[@(%T,`Z<;)___, +MS(V-9/___^E.Y_[_C4W4Z>@._O^-3;SIX`[^_XU-O.G+;O[_C8T(____Z?SC +M_O^-3>CI3]?^_[@P%T,`Z83)__^-3=SI%AC__XU-E.FK#O[_C8UD____Z:`. +M_O^-C63____IB&[^_XU-H.F-#O[_C4VLZ84._O^-3;CI?0[^_XV-?/___^F% +M`?__C4V$Z7T!__^-38SI=0'__[B`%T,`Z2')___,C4WLZ4\._O^-3=SI6@'_ +M_XU-R.FB%___N/`70P#I_LC__\S,N"@80P#I\LC__\S,_W7PZ'EH_?]9P[B0 +M&$,`Z=S(____=?#H96C]_UG#N+@80P#IR,C__XM%\%#H4&C]_UG#N.`80P#I +ML\C__\S,S,S,S,S,S,S,BT7P4.@P:/W_6<.X"!E#`.F3R/__S,S,S,S,S,S, +MS,R+1?!0Z!!H_?]9P[@P&4,`Z7/(___,S,S,S,S,S,S,S(U-\.D);O[_N%@9 +M0P#I5LC__\S,S,S,S,S,S,S,S,S,BTWLZ:A'__^+1?!0Z,AG_?]9P[B`&4,` +MZ2O(___,S,R#??``#X0.````BT7P@\`,B470Z0<```#'1=``````BTW0Z:E( +M__^XL!E#`.GWQ___S,S,S,S,S,S,S,S,S,S,@WWP``^$#@```(M%\(/`#(E% +MT.D'````QT70`````(M-T.EI2/__N-@90P#IM\?__\S,S,S,S,S,S,S,S,S, +MS+@`&D,`Z9['___,S,S,S,R-30CI+J_^_[A8&D,`Z8;'___,S,S,S,S,S,S, +MS,S,S(M%\%#H`&?]_UG#N+@:0P#I8\?__\S,S,S,S,S,S,S,BT7P4.C@9OW_ +M6<.XX!I#`.E#Q___```````````````````````````````````````````` +M``````````````````````````````````"L)P,`D"<#`'PG`P!H)P,`6B<# +M`$XG`P`^)P,`*"<#`!HG`P#^)@,`\"8#`.`F`P#,)@,`LB8#`)HF`P"2)@,` +M>B8#`&(F`P!()@,`,B8#`"(F`P`.)@,`]"4#`.`E`P#&)0,`KB4#`)PE`P". +M)0,`@"4#`'`E`P!D)0,`6"4#`$8E`P`X)0,`'B4#``@E`P#T)`,`XB0#`-(D +M`P#`)`,`M"0#`*0D`P"&)`,`=B0#`%XD`P!.)`,`0"0#`"PD`P`@)`,`#"0# +M`/8C`P#H(P,`VB,#`,PC`P"V(P,`I",#`((C`P!P(P,`8B,#`%(C`P`\(P,` +M+",#`!HC`P`*(P,`F",#``````#:(0,`Y"$#`.XA`P``(@,`%"(#`#@B`P!, +M(@,`6B(#`&0B`P!L(@,`>B(#`((B`P",(@,`G"(#`*@B`P"\(@,`S"(#`-PB +M`P#J(@,`_"(#`,8A`P"^(0,`M"$#`*HA`P"@(0,`E"$#`(HA`P!T(0,`8"$# +M`-`A`P``````!```@`(``(`)``"`!@``@`<``(``````+"$#`$(A`P`4(0,` +M`````+@@`P"B(`,`E"`#`(@@`P!V(`,`:B`#`%X@`P!0(`,`/B`#`"P@`P`< +M(`,`#"`#`/X?`P#L'P,`VA\#`,H@`P"\'P,`KA\#`*`?`P".'P,`@!\#`'`? +M`P!@'P,`3!\#`#H?`P`B'P,`"A\#`/@>`P#H'@,`VAX#`,8>`P"T'@,`HAX# +M`)(>`P"$'@,`UB`#`.(@`P#N(`,`_"`#`,@?`P``````1!X#`#0>`P!F'@,` +M5AX#`"0>`P``````````````````````````````````````:0\7(\%`BB<` +M```#``$``&D/%R/!0(HG`````P`"``!I#Q7-T96T@5F]L=6UE($EN9F]R;6%T:6]N +M7"H`Y,A"`%QVQ``#\:0`!=;4``WFU``*QN0``\@4(`/(%"`#R! +M0@`\@4(`/(%"`#R!0@`\@4(`/(%"`#R!0@`\@4(`/(%"`#R!0@`\@4(`/(%" +M`#R!0@`\@4(`/(%"`"I_0``T?T``/G]``.9]0``,?T``%G]``"!_0`#F?4`` +MSGU``.Y^0`#X?D```G]``.9]0`#0?D``VGY``.1^0``WD``=GY``(!^0`"*?D``FGE``*]Y +M0`!8?D``8GY``&Q^0`"#?$``.GY``$1^0`!.?D``4GQ``&=\0``T``_GU```A^0``2?D``'WQ``)]T0`"<=D``J79``&EW0``\@4(` +M/(%"`#R!0@`\@4(`/(%"`#R!0@`\@4(`/(%"`#R!0@`\@4(`/(%"`#R!0@`\ +M@4(`/(%"`#R!0@`\@4(`/(%"`#R!0@`\@4(`/(%"`#R!0@`\@4(`/(%"`#R! +M0@`\@4(`/(%"`#R!0@`\@4(`/(%"`#R!0@`\@4(`/(%"`#R!0@`\@4(`/(%" +M`#R!0@`\@4(`/(%"`#R!0@`\@4(`/(%"`#R!0@`\@4(`/(%"`#R!0@`\@4(` +M/(%"`#R!0@#;?T``;Y]``">`0`#,@$```!,3"`@("Q45$T!`0`L+"PL+$Q,( +M"P@("`@(%0@5"!45"!,+%145%1,+"P@5%1,(%0@("!,3"`@5%1,("`@("PL+ +M"P@("!43$P@5%145%145"`@("PL+%14("!45"P@("`M`$Q,3$Q,3````O9I! +M`&^?0`";@D``CH%``+B(00!OGT``5()``'.!0`#,S$(`L,Q"`)3,0@!XS$(` +M8,Q"`#S,0@!#86YN;W0@0!#86YN +M;W0@9FEN9"!A00`/8$``T21!`)I@0``J +M!T$`+P=!`!0J00`$)4$`-"5!`$,'00!/!T$`6P=!`#('00`R!T$`>P`P`'T` +M```@`"X`+@`N`"````!I0@``7U]F:6QE7U\`````+FEC;P`````\#P``>``` +M`#T/``!Y````"`0``&\`````````<````$(/``!^````/@\``'H````_#P`` +M>P```$`/``!\````\`,``&X```!!#P``?0```$5R#Y!`!0J00":4D$`[E9!`/=!00!$+$$`FF!``#0O00`O +M!T$`%"I!`+Q&00!=AD(`0P=!`/DQ00!;!T$`$4A!`'@^00`4*D$`/(%"`*MF +M00#=7$$`B&=!`#R!0@`#!P``)T\```````#J`````````!3/0@"(U$(````` +M```````\>4$````````````P,#$`9FEL90`````P,```,#$``&%A``"=?$$` +M\')``*=\00"PX$$`B7Q!`-)R0`"3?$$`4-Y!`'5\00"$\D``?WQ!`&#@00!A +M?$$`9O)``&M\00``X$$`0.!!`!!V00`_&D``WW9!`&#>00`\@4(`/(%"`#R! +M0@`\@4(`/(%"`#R!0@`\@4(`/(%"`'IX00!OGT``W'A!`"!I00`Q:D$`37Q! +M`&6H00!7?$$`!'=!`,YY00!">D$`3WI!``-R00!400!,7T$`P%]!`/M?00#67T$`AXI!`"-C00">9$$`Y8E!`,B)00`\@4(` +M/(%"`#R!0@`\@4(`/(%"`#R!0@`\@4(`VW]``&^?0`!/BT$`L7Q!`#KD0`!O +MGT``.H]!`+V:00!OGT``"9M!`)>100!;J$$`9:A!`&^H00`5HD$`**)!`$:@ +M00#_H4$`TYQ!`$)Z00!'G4$`Q*1!`%RF00`QH$$`E:)!`,V200!:H$$`1J!! +M`%*@00!&H$$`4J!!`#R!0@`\@4(`/(%"`#R!0@`\@4(`/(%"`#R!0@`````` +M"$`-``<&``!0,4,`Z-9"`.C60@```````0```&K000```````````#=Z``#@ +MV$$`\-A!``#900!`TT$`8--!`+#800#`V$$`T-A!`$#800"`V$$`D-A!`*#8 +M00!PTT$`\-%!`*#S00``TT$`\-1!`#R!0@`\@4(`/(%"`#R!0@`\@4(`/(%" +M`#R!0@`\@4(`$-E!```````;`0,#`````'#70@`$``````````````!"0THR +M`````.#900```````P$#`P````"8UT(``0````$`````````0D-*`%#;00`0 +MVD$`(-I!`)#900"PV4$`(-M!```````%`@,#`````+S80@`!`````0`````` +M``"PVT$```````$$`P,`````M-A"``$````!`````````.#;00```````04# +M`P````"PV$(``0````$`````````$-Q!```````!!P,#`````*C80@`!```` +M`0````````!`W$$```````4(`P,`````H-A"``$````!`````````*#<00`` +M````"@````````"8V$(``0````$`````````L-U!```````+`````````)#8 +M0@`!`````0````````!225-#5@```$%2338T````4U!!4D,```!!4DU4```` +M`$%230!)038T`````%!00P!0VT$`$-I!`"#:00!@VD$`<-I!`%#B00!@XD$` +M<.)!`.#:00#@W$$`8`-"`!#B00"@VD$`L-I!`-#@00#0X$$````````````8 +MV4(``0``````````````0V]P>0````#0X4$```````,`````````0-E"``$` +M```!`````````$1E;'1A````4.)!`&#B00!PXD$`H.%!`.#<00!@`T(`$.)! +M`&#A00"`X4$`8.E!`'#I00"`Z4$`4.A!`##I00!`Z4$`4.E!`$#H00``Z4$` +M$.E!`"#I00!`Y4$`4.5!`-#H00#@Z$$`\.A!`"#H00"@Z$$`L.A!`,#H00"0 +MY4$`<.A!`(#H00"0Z$$`8.5!`"#C00#`Y$$`T.1!`+#E00`\@4(`/(%"`#R! +M0@`\@4(`/(%"`#R!0@`\@4(`/(%"`)#I00``````(0`````````@VD(``0`` +M````````````3%I-03(```"@\4$`L/%!`,#Q00!0[$$`8.Q!`'#Q00"`\4$` +MD/%!`-#M00!`\4$`4/%!`&#Q00"P[4$`$/%!`"#Q00`P\4$`L.Q!`)#J00#0 +MZT$`X.M!`*#P00``````T/%!```````!`0,``````*#:0@`!```````````` +M``!,6DU!`````,#X00#PV$$`T/A!`%#X00"@^$$`P-A!`+#X00`P^$$`@/A! +M`)#800"0^$$`X/-!`)#R00"@\T$`L/-!`%#V00#@^$$```````$$`P`````` +M"-M"``$``````````````%!0340`````/(%"`#R!0@`\@4(`/(%"`.`*0@!@ +MXD$`\`I"`)`,0@#@#$(`D`-"`&`#0@!P`T(`(`Q"`%`,0@!@!$(`L`I"`,`* +M0@#0"D(`P`5"`*`*0@!@XD$`\`I"`,`&0@"``D(`8`-"`'`#0@"0!T(`\`A" +M`(`$0@`\@4(`/(%"`#R!0@`\@4(`/(%"`#R!0@`\@4(`/(%"`,`&0@`\@4(` +M/(%"`#R!0@"0!T(`\`A"`)`!0@#@"D(`8.)!`/`*0@"0#$(`X`Q"`)`#0@!@ +M`T(`<`-"`"`,0@!0#$(`8`1"````````"T(```````$'\08`````$-Q"``$` +M```!`````````#=Z0453````X`U"```.0@`0#D(`,`Y"`!`.0@`P#D(`D`Y" +M`,`.0@`\W$(`=7-E7,`9'=M +M87!I`&-R>7!T8F%S90!O;&5A8V,`8VQB8V%T<0!V97)S:6]N`'5X=&AE;64` +M````:P!E`'(`;@!E`&P`,P`R`"X`9`!L`&P``````%-E=$1E9F%U;'1$;&Q$ +M:7)E8W1O7Q<=@Q%03'(\,8E@6:!Q*`XNLGLG4) +M@RP:&VY:H%([UK,IXR^$4]$`[2#\L5MJR[XY2DQ8S]#OJOM#33.%1?D"?U`\ +MGZA1HT"/DITX];RVVB$0__/2S0P3[%^71!?$IWX]9%T9"]O@,CH*208D7,+3K&*1E>1YY\@W;8W53JEL5O3J97JN"+IX)2XX?B8$6G9CI2;'H?ISE4HWXRAB0V_ +MYD)H09DM#[!4NQ:8+XI"D40W<<_[P+6EV[7I6\)6.?$1\5FD@C^2U5X@*<&W)MT\9O!P6F;Y(9'ON_&G<$/S*$, +M)&\LZ2VJA'1*W*FP7-J(^79243Z8;<8QJ,@G`[#'?UF_\PO@QD>1I]518\H& +M9RDI%(4*MRB_HDMF&JAP +MBTO"HU%LQQGHDM$D!IG6A34.]'"@:A`6P:09"&PW'DQW2">UO+`TLPP<.4JJ +MV$Y/RIQ;\V\N:.Z"CW1O8Z5X%'C(A`@"QXSZ_[Z0ZVQ0I/>C^;[R>''&`P(! +M``<&!00+"@D(#PX-#)@OBD*11#=QS_O`M:7;M>E;PE8Y\1'Q6:2"/Y+57ARK +MF*H'V`%;@Q*^A3$DPWT,571=OG+^L=Z`IP;^[\:=P0_, +MH0PD;RSI+:J$=$KB2T20&F=:%-0[T<*!J$!;!I!D(;#<>3'=()[6\L#2S#!PY +M2JK83D_*G%OS;RYH[H*/=&]CI7@4>,B$"`+'C/K_OI#K;%"D]Z/YOO)X<<8` +M`````````,````````!&1//]5FW]T!&5B@!@E\F@D*C@0@#K@$(`_____P`` +M``"P@4(``````/____\$@D(`#H)"``````#_____`````*:"0@``````____ +M_PJ&0@`>AD(``````&`Q0P```````````/____\``````````'C@0@`````` +M```````````!````D.!"`````````````````&`Q0P"8X$(``````"`%DQD" +M````X.!"``$```#PX$(`````````````````_____P````#_____```````` +M`````````0````(````(X4(```````D```!H,$,``````%(00``````````` +M``````!F$$``(`63&0$```!(X4(```````````````````````````#_____ +MW)9"`"`%DQD1````<.%"````````````````````````````______"60@`` +M````^)9"``$`````ET(``@````B70@`"````$)="``0````8ET(`!0```".7 +M0@`%````+9="``<````XET(`!P```$*70@`)````2I="``H```!5ET(`"P`` +M`%V70@`,````99="``T```!MET(`#@```'B70@`/````@)="`"`%DQD"```` +M&.)"````````````````````````````_____YB70@``````H)="`"`%DQD! +M````2.)"````````````````````````````_____[270@`@!9,9"````'#B +M0@```````````````````````````/_____,ET(``````->70@`!````XI=" +M``(```#MET(``P```/B70@`$`````YA"``4````.F$(`!@```!F80@`@!9,9 +M`P```-#B0@```````````````````````````/____\TF$(``````#^80@`! +M````2IA"`"`%DQD!````".-"````````````````````````````_____V"8 +M0@`@!9,9`0```##C0@```````````````````````````/____]TF$(`(`63 +M&0$```!8XT(```````````````````````````#_____B)A"`"`%DQD!```` +M@.-"````````````````````````````_____Z"80@`!````B#!#``````#_ +M____``````0```````````````$```"(XT(`````````````````J.-"`"`% +MDQD!````X.-"````````````````````````````_____[280@`@!9,9`P`` +M``CD0@```````````````````````````/_____(F$(``````-"80@`!```` +MV)A"``````!H,$,``````/____\``````0```````````````0```"#D0@`` +M``````````````!`Y$(`(`63&0$```!XY$(````````````````````````` +M``#_____[)A"`"`%DQD!````H.1"````````````````````````````____ +M_P"90@`@!9,9`0```,CD0@```````````````````````````/____\4F4(` +M(`63&0$```#PY$(```````````````````````````#_____*)E"`"`%DQD! +M````&.5"````````````````````````````_____SR90@`!````F#!#```` +M``#_____``````0```````````````$```"H,$,``````/____\`````!``` +M`````````````@```$#E0@`@Y4(``````"`%DQD!````D.5"```````````` +M````````````````_____U"90@`@!9,9`0```+CE0@`````````````````` +M`````````/____]DF4(`(`63&0$```#@Y4(````````````````````````` +M``#_____>)E"`"`%DQD!````".9"````````````````````````````____ +M_XR90@`@!9,9`0```##F0@```````````````````````````/____^@F4(` +M(`63&0(```!8YD(```````````````````````````#_____M)E"``````"\ +MF4(`(`63&0$```"(YD(```````````````````````````#_____T)E"`"`% +MDQD!````L.9"````````````````````````````_____^290@`@!9,9`0`` +M`-CF0@```````````````````````````/_____XF4(`(`63&0<`````YT(` +M``````````````````````````#_____#)I"```````4FD(``0```!R:0@`! +M````))I"``,````LFD(`_____S2:0@`%````/)I"`"`%DQD!````6.="```` +M````````````````````````_____U":0@`@!9,9`0```(#G0@`````````` +M`````````````````/____]DFD(`(`63&0$```"HYT(````````````````` +M``````````#_____>)I"`"`%DQD!````T.="```````````````````````` +M````_____XR:0@`@!9,9`@```/CG0@```````````````````````````/__ +M__^@FD(``````*B:0@`@!9,9`P```"CH0@`````````````````````````` +M`/____^\FD(`_____\2:0@`!````S)I"``$``````````````&#E0@`@!9,9 +M`0```'#H0@```````````````````````````/_____@FD(`(`63&0(```"8 +MZ$(```````````````````````````#_____])I"``````#\FD(`(`63&0$` +M``#(Z$(```````````````````````````#_____$)M"`"`%DQD"````\.A" +M``$`````Z4(`````````````````_____P````#_____```````````````` +M`0````$````8Z4(``````````````````````*%E0``@!9,9`@```$CI0@`` +M`````````````````````````/____\PFT(``````#B;0@`@!9,9`0```'CI +M0@```````````````````````````/____],FT(`(`63&0,```"@Z4(````` +M``````````````````````#_____8)M"``````!HFT(``0```'";0@`@!9,9 +M`0```-CI0@```````````````````````````/____^$FT(`(`63&08````` +MZD(```````````````````````````#_____G)M"``````"PFT(``0```+N; +M0@`"````QIM"``,```#1FT(`!````-R;0@`@!9,9`0```%#J0@`````````` +M`````````````````/_____TFT(`(`63&0X```!XZD(````````````````` +M``````````#_____#)Q"```````7G$(``0```"*<0@`"````+9Q"``,````X +MG$(`!````$.<0@`%````3IQ"``8```!)Q"``D` +M``"&G$(`"@```)2<0@`+````HIQ"``P```"PG$(`(`63&0X````(ZT(````` +M``````````````````````#_____R)Q"``````#3G$(``0```-Z<0@`"```` +MZ9Q"``,```#TG$(`!````/^<0@`%````"IU"``8````8G4(`!P```":=0@`( +M````-)U"``D```!"G4(`"@```%"=0@`+````7IU"``0```!LG4(`(`63&0$` +M``"8ZT(```````````````````````````#_____@)U"`"`%DQD"````P.M" +M``$```#0ZT(`````````````````_____P````#_____```````````````` +M`0````$```#HZT(``````````````````````$:+0``@!9,9`@```!CL0@`! +M````*.Q"`````````````````/____\`````_____P````````````````$` +M```!````0.Q"``````````````````````#DBT``(`63&0(```!P[$(``0`` +M`(#L0@````````````````#_____`````/____\````````````````!```` +M`0```)CL0@``````````````````````P8Q``"`%DQD!````R.Q"```````` +M````````````````````_____[B=0@`@!9,9`0```/#L0@`````````````` +M`````````````/_____,G4(`(`63&0(````8[4(````````````````````` +M``````#_____X)U"``````#HG4(`(`63&0(```!([4(````````````````` +M``````````#______)U"```````$GD(`(`63&0(```!X[4(````````````` +M``````````````#_____&)Y"`/____\@GD(`(`63&0,```"H[4(````````` +M``````````````````#_____-)Y"```````\GD(``0```$2>0@`@!9,9!P`` +M`.#M0@```````````````````````````/____]8GD(``````&">0@`!```` +M:)Y"``````!HGD(``````'">0@``````>)Y"``4```"`GD(`(`63&04````X +M[D(```````````````````````````#_____F)Y"``````"@GD(``0```*B> +M0@`!````L)Y"``$```"ZGD(`(`63&0$```"`[D(````````````````````` +M``````#_____S)Y"`"`%DQD$````J.Y"``$```#([D(````````````````` +M_____P``````````X)Y"``````#HGD(`_____P```````````@````,````! +M````X.Y"``````````````````````!3GT``(`63&0(````0[T(``0```"#O +M0@````````````````#_____`````/____\````````````````!`````0`` +M`#CO0@``````````````````````]9]``"`%DQD"````:.]"``$```!X[T(` +M````````````````_____P````#_____`````````````````0````$```"0 +M[T(```````````````````````^B0``@!9,9`@```,#O0@`!````T.]"```` +M`````````````/____\`````_____P````````````````$````!````Z.]" +M``````````````````````!+HT``(`63&0$````8\$(````````````````` +M``````````#_____()]"`"`%DQD!````0/!"```````````````````````` +M````_____S2?0@`@!9,9`0```&CP0@```````````````````````````/__ +M__](GT(`(`63&0$```"0\$(```````````````````````````#_____7)]" +M`"`%DQD"````N/!"``$```#(\$(`````````````````_____P````#_____ +M`````````````````0````$```#@\$(``````````````````````(*H0``@ +M!9,9`@```!#Q0@`!````(/%"`````````````````/____\`````_____P`` +M``````````````$````!````./%"``````````````````````#CJ$``(`63 +M&0,```!H\4(``0```(#Q0@````````````````#_____``````````"(GT(` +M_____P```````````0````(````!````F/%"``````````````````````"[ +MJ4``(`63&0$```#(\4(```````````````````````````#_____G)]"`"`% +MDQD"````\/%"````````````````````````````_____["?0@#_____NI]" +M`"`%DQD(````(/)"``$```!@\D(`````````````````_____P`````````` +MS)]"``$```#4GT(``@```-R?0@`#````Y)]"``,```#NGT(``P```/:?0@#_ +M____```````````&````!P````$```!X\D(``````````````````````(.O +M0``@!9,9`0```*CR0@```````````````````````````/____\(H$(`(`63 +M&0$```#0\D(```````````````````````````#_____'*!"`"`%DQD#```` +M^/)"``$````0\T(`````````````````_____P``````````-*!"`/____\` +M``````````$````"`````0```"CS0@``````````````````````@;%``"`% +MDQD!````6/-"````````````````````````````_____TB@0@`@!9,9`0`` +M`(#S0@```````````````````````````/____]@0@`#````X:!"``4```#LH$(`!@```/>@0@`'`````J%"``@````* +MH4(`"0```!6A0@`@!9,9`P```*#T0@```````````````````````````/__ +M__\HH4(``````#"A0@`!````.Z%"`"`%DQD!````V/1"```````````````` +M````````````_____U"A0@`@!9,9!`````#U0@`````````````````````` +M`````/____]HH4(``````'"A0@`!````>Z%"``(```"&H4(`(`63&0$```!` +M]4(```````````````````````````#_____G*%"`"`%DQD0````:/5"```` +M````````````````````````_____["A0@``````N*%"``$```#`H4(``@`` +M`,BA0@`#````TZ%"``0```#;H4(``P```..A0@`&````ZZ%"``<```#VH4(` +M!P```/ZA0@`'````!J)"``<````6HD(`!P````ZB0@`'````'J)"``<````F +MHD(`#@```"ZB0@`@!9,9`0````CV0@```````````````````````````/__ +M__]`HD(`(`63&0$````P]D(```````````````````````````#_____5*)" +M`"`%DQD#````6/9"````````````````````````````_____VBB0@`````` +M<*)"``$```![HD(`(`63&0$```"0]D(```````````````````````````#_ +M____D*)"`"`%DQD"````N/9"````````````````````````````_____Z2B +M0@#_____K*)"`"`%DQD!````Z/9"````````````````````````````____ +M_\"B0@`@!9,9!````!#W0@```````````````````````````/_____4HD(` +M`````-RB0@`!````Y*)"``$```#LHD(`(`63&00```!0]T(````````````` +M``````````````#_____`*-"```````(HT(``0```!"C0@#_____&*-"`"`% +MDQD"````D/="````````````````````````````_____RRC0@``````-J-" +M`"`%DQD!````P/="````````````````````````````_____TBC0@`@!9,9 +M`0```.CW0@```````````````````````````/____]/E"```````` +M`````````/____\`````_____P````````````````$````!````D/E"```` +M``````````````````"6V4``(`63&08```#`^4(````````````````````` +M``````#_____.*1"``````!`I$(``0```$BD0@`"````4*1"``,```!8I$(` +M!````&"D0@`@!9,9!@```!#Z0@```````````````````````````/____]T +MI$(``````'RD0@`!````A*1"``(```",I$(``P```)2D0@`!````G*1"`"`% +MDQD&````8/I"````````````````````````````_____["D0@``````N*1" +M``$```#`I$(``0```,JD0@`#````TJ1"``0```#:I$(`(`63&0D```"P^D(` +M``````````````````````````#_____[*1"`/_____WI$(`______^D0@`" +M````!Z5"``,````/I4(`!````!>E0@`%````(J5"``4````JI4(`!P```#*E +M0@`@!9,9"````!C[0@```````````````````````````/____](I4(````` +M`%"E0@`!````6Z5"``(```!FI4(``P```'&E0@`$````?*5"``4```"'I4(` +M!@```)*E0@`@!9,9!0```'C[0@```````````````````````````/____^H +MI4(`_____[*E0@`!````NJ5"``(```#"I4(``P```,JE0@`@!9,9!@```,#[ +M0@```````````````````````````/_____E0@`!````\J5" +M``(```#]I4(``P````BF0@`$````$Z9"`"`%DQD&````$/Q"```````````` +M````````````````_____RBF0@``````,Z9"``$````^ID(``@```$FF0@`# +M````5*9"``0```!?ID(`(`63&0$```!@_$(````````````````````````` +M``#_____=*9"`"`%DQD(````B/Q"````````````````````````````____ +M_XBF0@``````D*9"``$```";ID(``@```*:F0@`#````L:9"``0```"\ID(` +M!0```,>F0@`&````TJ9"`"`%DQD!````Z/Q"```````````````````````` +M````_____^BF0@`@!9,9!@```!#]0@```````````````````````````/__ +M__\`IT(`_____PBG0@#_____$*="``(````8IT(``P```""G0@`$````**=" +M`"`%DQD!````8/U"````````````````````````````_____SRG0@`@!9,9 +M"````(C]0@```````````````````````````/____]0IT(``````'.G0@`` +M````6*="``````!@IT(``P```&BG0@``````>Z="``4```"#IT(`!@```(NG +M0@`@!9,9`@```.C]0@```````````````````````````/____^@IT(````` +M`*BG0@`@!9,9`@```!C^0@```````````````````````````/____^\IT(` +M`````,2G0@`@!9,9!````$C^0@```````````````````````````/_____8 +MIT(``````."G0@``````Z*="``(```#PIT(`(`63&0$```"(_D(````````` +M``````````````````#_____!*A"`"`%DQD"````L/Y"```````````````` +M````````````_____QBH0@``````(*A"`"`%DQD"````X/Y"```````````` +M````````````````_____S2H0@``````/*A"`"`%DQD!````$/]"```````` +M````````````````````_____U"H0@`@!9,9!P```#C_0@`````````````` +M`````````````/____]HJ$(``````'"H0@`!````>ZA"``(```"&J$(``P`` +M`)&H0@`$````G*A"``4```"GJ$(`(`63&0(```"0_T(````````````````` +M``````````#_____P*A"``````#(J$(`(`63&04```#`_T(````````````` +M``````````````#_____X*A"``````#HJ$(``0```/.H0@`"````_JA"``,` +M```)J4(`(`63&0<````(`$,```````````````````````````#_____(*E" +M```````HJ4(``0```#"I0@`!````.*E"``,```!`J4(`!````$NI0@`%```` +M4ZE"`"`%DQD!````8`!#````````````````````````````_____VBI0@`@ +M!9,9`P```(@`0P```````````````````````````/____]\J4(``````(2I +M0@`!````CZE"`"`%DQD$````P`!#````````````````````````````____ +M_Z2I0@``````K*E"``$```"WJ4(``@```,*I0@`@!9,9`0`````!0P`````` +M`````````````````````/_____8J4(`(`63&0$````H`4,````````````` +M``````````````#_____[*E"`"`%DQD!````4`%#```````````````````` +M````````_____P"J0@`@!9,9`@```'@!0P`````````````````````````` +M`/____\4JD(``````!RJ0@`@!9,9`@```*@!0P`````````````````````` +M`````/____\TJD(``````#RJ0@`@!9,9`P```-@!0P`````````````````` +M`````````/____]0JD(``````%BJ0@`!````8*I"`"`%DQD.````$`)#```` +M````````````````````````_____W2J0@#_____?*I"`/____^$JD(``@`` +M`(RJ0@#_____E*I"``0```"P0@``````;[!"`"`%DQD"````*`M#```````````````````` +M````````_____X2P0@``````C+!"`"`%DQD"````6`M#```````````````` +M````````````_____Z2P0@``````K+!"`"`%DQD"````B`M#```````````` +M````````````````_____\2P0@``````S+!"`"`%DQD"````N`M#```````` +M````````````````````_____^2P0@``````[+!"`"`%DQD#````Z`M#```` +M````````````````````````_____P2Q0@``````#+%"``$````:L4(`(`63 +M&0$````@#$,```````````````````````````#_____-+%"`"`%DQD"```` +M2`Q#````````````````````````````_____TBQ0@#_____4+%"`"`%DQD! +M````>`Q#````````````````````````````_____V2Q0@`@!9,9`@```*`, +M0P`!````L`Q#`````````````````/____\`````_____P`````````````` +M``$````!````R`Q#```````````````````````,74$`(`63&0$```#X#$,` +M``````````````````````````#_____A+%"`"`%DQD"````(`U#```````` +M````````````````````_____YBQ0@``````H+%"`"`%DQD!````4`U#```` +M````````````````````````_____[2Q0@`@!9,9!@```'@-0P`````````` +M`````````````````/_____(L4(``````-RQ0@`!````Y+%"``(```#OL4(` +M`P```/JQ0@`$````!;)"`"`%DQD#````R`U#```````````````````````` +M````_____QRR0@``````)[)"``$````RLD(`(`63&0$`````#D,````````` +M``````````````````#_____2+)"`"`%DQD!````*`Y#```````````````` +M````````````_____URR0@`@!9,9`0```%`.0P`````````````````````` +M`````/____]PLD(`(`63&0T```!X#D,```````````````````````````#_ +M____A+)"``````",LD(``0```)2R0@`!````G[)"``,```"GLD(`!````*^R +M0@`%````M[)"``4```"_LD(`!P```,>R0@`(````TK)"``<```#:LD(`!P`` +M`.*R0@`+````ZK)"`"`%DQD!``````]#```````````````````````````` +M______RR0@`@!9,9`@```"@/0P`!````.`]#`````````````````/____\` +M````_____P````````````````$````!````4`]#```````````````````` +M```X+-"`"`%DQD!````F!!#```````````````````````` +M````_____Y"S0@`@!9,9`@```,`00P```````````````````````````/__ +M__^DLT(``````*^S0@`@!9,9`0```/`00P`````````````````````````` +M`/_____$LT(`(`63&0$````8$4,```````````````````````````#_____ +MV+-"`"`%DQD!````0!%#````````````````````````````_____^RS0@`@ +M!9,9'0```&@10P```````````````````````````/____\`M$(```````BT +M0@``````$[1"``(````>M$(``@```"BT0@`"````.+1"``(```!`M$(``@`` +M`$BT0@`"````,+1"``(```!0M$(``@```%BT0@`"````8+1"``(```!HM$(` +M#````'"T0@`,````N+1"``T```!XM$(`#0```,"T0@`,````R+1"``T```"` +MM$(`#````(BT0@`"````D+1"``(```"8M$(`%0```*"T0@`"````J+1"`!<` +M``"PM$(`&````-"T0@`8````V+1"`!H```#@M$(`&P```.BT0@`@!9,9`@`` +M`'`20P```````````````````````````/_____\M$(``````!"U0@`@!9,9 +M`0```*`20P```````````````````````````/____\HM4(`(`63&0$```#( +M$D,```````````````````````````#_____/+5"`"`%DQD!````\!)#```` +M````````````````````````_____U"U0@`@!9,9$0```!@30P`"````H!-# +M`````````````````/____\``````````&2U0@`!````;+5"``(```!TM4(` +M`P```'^U0@`$````A[5"``4```"/M4(`!@`````````'````E[5"``<```"W +MM4(`!P```+^U0@`'````Q[5"``<```"?M4(`!P```*>U0@`'````K[5"``8` +M````````_____P`````'````#@````\````!````R!-#```````/````$``` +M``$```#8$T,`````````````````"II!`````````````````(^:00`@!9,9 +M`0````@40P```````````````````````````/_____[9"``4```")MD(`(`63&0<````(%4,``@```$`5 +M0P````````````````#_____`````````````````0```)RV0@`"````I+9" +M``,```"LMD(```````````#_____``````$````$````!0````$```!H%4,` +M``````4````&`````0```'@50P`````````````````QID$````````````` +M````0*9!`"`%DQD"````J!5#``$```"X%4,`````````````````_____P`` +M``#_____`````````````````0````$```#0%4,````````````````````` +M`*BF00``````Z#!#``````#_____``````$```````````````$```#@%4,` +M`````````````````!9#```````8,4,``````/____\``````0`````````` +M`````@```!@60P#@%4,``````````````````````#@60P`@!9,9`0```'@6 +M0P```````````````````````````/_____0MD(`(`63&0$```"@%D,````` +M``````````````````````#_____Y+9"`"`%DQD#````R!9#```````````` +M````````````````______BV0@```````+="``$````(MT(`(`63&0$````` +M%T,```````````````````````````#_____'+="`"`%DQD!````*!=#```` +M````````````````````````_____S"W0@`@!9,9!@```%`70P`````````` +M`````````````````/____]$MT(``````$^W0@`!````5[="``$```!?MT(` +M`P```&>W0@`$`````P!0P@(`3!T#````````````""$#`*S! +M`@`\'0,```````````!4(0,`G,$"`*@<`P```````````"PB`P`(P0(`H!L# +M````````````OB<#``#``@```````````````````````````*PG`P"0)P,` +M?"<#`&@G`P!:)P,`3B<#`#XG`P`H)P,`&B<#`/XF`P#P)@,`X"8#`,PF`P"R +M)@,`FB8#`)(F`P!Z)@,`8B8#`$@F`P`R)@,`(B8#``XF`P#T)0,`X"4#`,8E +M`P"N)0,`G"4#`(XE`P"`)0,`<"4#`&0E`P!8)0,`1B4#`#@E`P`>)0,`""4# +M`/0D`P#B)`,`TB0#`,`D`P"T)`,`I"0#`(8D`P!V)`,`7B0#`$XD`P!`)`,` +M+"0#`"`D`P`,)`,`]B,#`.@C`P#:(P,`S",#`+8C`P"D(P,`@B,#`'`C`P!B +M(P,`4B,#`#PC`P`L(P,`&B,#``HC`P"8(P,``````-HA`P#D(0,`[B$#```B +M`P`4(@,`."(#`$PB`P!:(@,`9"(#`&PB`P!Z(@,`@B(#`(PB`P"<(@,`J"(# +M`+PB`P#,(@,`W"(#`.HB`P#\(@,`QB$#`+XA`P"T(0,`JB$#`*`A`P"4(0,` +MBB$#`'0A`P!@(0,`T"$#```````$``"``@``@`D``(`&``"`!P``@``````L +M(0,`0B$#`!0A`P``````N"`#`*(@`P"4(`,`B"`#`'8@`P!J(`,`7B`#`%`@ +M`P`^(`,`+"`#`!P@`P`,(`,`_A\#`.P?`P#:'P,`RB`#`+P?`P"N'P,`H!\# +M`(X?`P"`'P,``P#:'@,` +MQAX#`+0>`P"B'@,`DAX#`(0>`P#6(`,`XB`#`.X@`P#\(`,`R!\#``````!$ +M'@,`-!X#`&8>`P!6'@,`)!X#``````!C;VUD;&4-L:7!B;V%R9```20)3971#;&EP8F]A +M'17``!Y`4=E=%=I;F1O=U1E>'1,96YG=&A7``"9`E-Y0``D0)M86QL;V,``%X"9G)E90``[0)W8W-S='(` +M`.$"=V-S8VUP``"9`FUE;7-E=```O@)S=')L96X``*8`7V)E9VEN=&AR96%D +M97@``,H`7V5X8V5P=%]H86YD;&5R,P``#@`_/S%T>7!E7VEN9F]`0%5!14!8 +M6@``35-60U)4+F1L;```+@`_=&5R;6EN871E0$!905A86@!5`%]?9&QL;VYE +M>&ET`(8!7V]N97AI=`#3`%]E>&ET`$@`7UAC<'1&:6QT97(`20)E>&ET``"/ +M`%]A8VUD;&X`6`!?7V=E=&UA:6YA45X5P``=@%'971-;V1U;&5&:6QE +M3F%M95<``%("3&]C86Q&5<``'T`1&5L +M971E1FEL95<`'0-3971,87-T17)R;W(``#D!1V5T0W5R5<``-4!1V5T5&EC:T-O=6YT``!:`4=E=$9I;&5);F9O@%'971-;V1U;&5(86YD;&57``"9`4=E=%!R;V-E4UA7-T96U);F9O`/H! +M1VQO8F%L365M;W)Y4W1A='5S``#``4=E=%-Y@!$96QE=&5#`4=E=%9E7!E7VEN9F]`0`````````````$````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````?P`````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````8``P```$```(`%````8```@`8```"0``"`#@```"`! +M`(`0````.`$`@!@```!0`0"````````````````````"``$```!H`0"``@`` +M`(`!`(````````````````````0`80```)@!`(!(#0``L`$`@*P-``#(`0"` +MV`X``.`!`(```````````````````!``&@```/@!`(`<````$`(`@!T````H +M`@"`0````$`"`("\````6`(`@+T```!P`@"`SP```(@"`(#0````H`(`@-4` +M``"X`@"`U@```-`"`(#7````Z`(`@-P``````P"`Z````!@#`(#I````,`,` +M@.H```!(`P"`[````&`#`(````````````````````$``0```'@#`(`````` +M``````````````$``0```)`#`(````````````````````$``0```*@#`(`` +M``````````````````$`"00``,`#``````````````````````$`"00``-`# +M``````````````````````$`"00``.`#``````````````````````$`"00` +M`/`#``````````````````````$`"00````$``````````````````````$` +M"00``!`$``````````````````````$`"00``"`$```````````````````` +M``$`"00``#`$``````````````````````$`"00``$`$```````````````` +M``````$`"00``%`$``````````````````````$`"00``&`$```````````` +M``````````$`"00``'`$``````````````````````$`"00``(`$```````` +M``````````````$`"00``)`$``````````````````````$`"00``*`$```` +M``````````````````$`"00``+`$``````````````````````$`"00``,`$ +M``````````````````````$`"00``-`$``````````````````````$`"00` +M`.`$``````````````````````$`"00``/`$``````````````````````$` +M"00````%``````````````````````$`"00``!`%```````````````````` +M``$`"00``"`%``````````````````````$`"00``#`%```````````````` +M``````$`"00``$`%````J`,`Z`(`````````````Z*H#`"@!```````````` +M`,"Q`P!@`N`',`9@!X +M``````!L`"0``0!,`&4`9P!A`&P`0P!O`'``>0!R`&D`9P!H`'0```!#`&\` +M<`!Y`'(`:0!G`&@`=``@`"@`8P`I`"``,0`Y`#D`.0`M`#(`,``R`#0`(`!) +M`&<`;P!R`"``4`!A`'8`;`!O`'8````^``L``0!/`'(`:0!G`&D`;@!A`&P` +M1@!I`&P`90!N`&$`;0!E````-P!Z`"X``!T`'(`80!C`'0``````````5``````N``X`$``$``"`/__@`!#`&$`;@!C +M`&4`;`````````#`",B```````\``````&0!V```````0P!O`&X`9@!I`'(` +M;0`@`$8`:0!L`&4`(`!2`&4`<`!L`&$`8P!E````"`!-`%,`(`!3`&@`90!L +M`&P`(`!$`&P`9P```````E``````"``'`%0!"`"M#?__@@!$`&4``!I`',`=`!I`&X`9P`@`&8`:0!L`&4```````,``%``````"``L`!@`&`!D +M`/__@@`````````#``!0``````@`1``8`!@`90#__X(`````````@``"4``` +M```H`"P`-`$R`&8`__^"`````````````E``````"`!B`%0!"`"O#?__@@!W +M`&D`=`!H`"``=`!H`&D``',``````!0`'(`;P!G`'(`90!S`',````(`$T`4P`@ +M`%,`:`!E`&P`;``@`$0`;`!G`````0`!4`````!P`+0`4``0`+P!__^``"8` +M0@!A`&,`:P!G`'(`;P!U`&X`9``````````!4`````#(`+0`4``0`+X!__^` +M`"8`4`!A`'4`@!E`#H``````````E``````S@`3`%H`"``_#___ +M@@!3`'``90!E`&0`.@````````````)0`````,X`'@!:``@`0`___X(`4`!R +M`&\`8P!E`',`@#__X(````````` +M@@`"4``````H`1,`2``(`'L`__^"`````````((``E``````*`$>`$@`"`!\ +M`/__@@````````""``)0`````"@!*0!(``@`;@#__X(`````````@@`"4``` +M```H`30`2``(`'T`__^"`````````(```E``````"`!``&@!"`!G`/__@@`` +M``````",``!0``````@`3`!H`1@`9@#__X(``````````0"`4``````(`&0` +M:`$0`&0`;0!S`&,`=`!L`',`7P!P`'(`;P!G`'(`90!S`',`,P`R````4`!R +M`&\`9P!R`&4`0!S`$P` +M:0!S`'0`5@!I`&4`=P`S`#(```!,`&D`65S +M(C\^#0H\87-S96UB;'D@>&UL;G,](G5R;CIS8VAE;6%S+6UI8W)O&UL;G,Z87-M=C,] +M(G5R;CIS8VAE;6%S+6UI8W)OD4ED96YT:71Y('1Y<&4](G=I;C,R(B!N86UE/2)-:6-R;W-O9G0N5VEN +M9&]W3X- +M"B`@/"]D97!E;F1E;F-Y/@T*/&-O;7!A=&EB:6QI='D@>&UL;G,](G5R;CIS +M8VAE;6%S+6UI8W)O2YV,2(^/&%P<&QI +M8V%T:6]N/@T*/"$M+2!6:7-T82`@("TM/B`\S,U,3,X8CEA+35D.38M +M-&9B9"TX93)D+6$R-#0P,C(U9CDS87TB+SX-"CPA+2T@5VEN(#@@("`M+3X@ +M/'-U<'!OSAE,&8W83$R +M+6)F8C,M-&9E."UB.6$U+30X9F0U,&$Q-6$Y87TB+SX-"CPO87!P;&EC871I +M;VX^/"]C;VUP871I8FEL:71Y/@T*("`\87-M=C,Z87!P;&EC871I;VX^#0H@ +M("`@/&%S;78S.G=I;F1O=W-3971T:6YGP`P`'T`(`!B`'D`=`!E`',````````````````````````````` +M```````````````````````````````````````````````````````+`"8` +M1@!O`'(`90!G`'(`;P!U`&X`9`````8`4`!A`'4`0``````&@!#`&$`;@!N`&\`=``@`&,`<@!E`&$` +M=`!E`"``9@!O`&P`9`!E`'(`(``G`'L`,`!]`"<`-0!5`'``9`!A`'0`90`@ +M`&\`<`!E`'(`80!T`&D`;P!N`',`(`!A`'(`90`@`&X`;P!T`"``0!P`'0`90!D`"``80!R`&,`:`!I`'8`90`@`"<` +M>P`P`'T`)P`N`"``5P!R`&\`;@!G`"``<`!A`',``!T`'(`80!C`'0`:0!N`&<````````` +M```````````````````````````````````````````````````````````` +M``@`4P!K`&D`<`!P`&D`;@!G`````````````````````````````````"<` +M4P!P`&4`8P!I`&8`>0`@`&$`(`!L`&\`8P!A`'0`:0!O`&X`(`!F`&\`<@`@ +M`&4`>`!T`'(`80!C`'0`90!D`"``9@!I`&P`90!S`"X````````````````` +M````````#@!&`'4`;`!L`"``<`!A`'0`:`!N`&$`;0!E`',`#`!.`&\`(`!P +M`&$`=`!H`&X`80!M`&4`0!P`'0`90!D`"``9@!I`&P`90`@`"<`>P`P`'T` +M)P`N`"``5P!R`&\`;@!G`"``<`!A`',``%4`;@!S`'4`<`!P`&\`<@!T`&4`9``@`&,`;P!M +M`'``<@!E`',``!P`&4`8P!T`&4`9``@`&4` +M;@!D`"``;P!F`"``9`!A`'0`80`U`%0`:`!E`'(`90`@`&$`<@!E`"``0!L`&\`80!D`"``9`!A`'0`80`.`$D``!T`"X`=`!X`'0` +:```9`!0*`0"SO`Y\`,';`14&`0"````````` +` +end --- /dev/null +++ contrib/libarchive/libarchive/test/test_read_format_7zip_zstd_sparc.7z.uu @@ -0,0 +1,59 @@ +begin 664 test_read_format_7zip_zstd_sparc.7z +M-WJ\KR<<``3"/F,50PD```````!R`````````&JZD5PHM2_]`$@!``!0*DT8 +M!````"X)```HM2_]H%@1$`#,%P#VY81(\-"H-?,C>D3."L@6'/;(Z"_OIG-< +M&K,3C)Y#S,RFL.J-K#=E?%`M<*T];K]*&Z!'F&=H'7BNL.%[O^W'36\1$@F5 +ML25C;RE39P!U`'$`MAH8R!8>B!DH;E@X$*JU?FFQ@'_(SU+1;*J;FIG9V2!V +MDB8GL-E)TFW5<'2+V0Q'MUAHX5$A^4D?7\5P\H?T8?KIK?2V@XK\%?S%>_3P +M+_T%-O!='.5[_3<`L!<7VI_!=5KKBLL%G+V.,&3U)2MV?$KV3YUF,P&H!Z]3 +M#V>,K8R]8FADM[*\G*')?"C+31ZP5*Q2I4*+"\LG*II-!0.;G<_,7C+EC>9U +MLY4PL-E9EMMN-;4=Q='5J?0(P;3R_P&0$#\BR-8$'!U_Z)J6?EI#$`1?6BST +MMRD5"0.0`B^;J_?<6%.@LVES/Y*3[@?I53>N%NP\GG1[@.PQZ"(R`BHM6XWT +MP""QZ$6.N7CIUL2C+?%H?4)2)QT-!Q'B@212\#C06.T0_+QU82-'+(*1\]/: +MXOUI.*YN[G"TU\$GFJC<#_:,1()6])MDFG01&0$%L9.&9C.6T,XS1G9U$1D! +MT:V*312=1RI;O";,ZF@XB,-+X!O!L[F!VN9DY*#9>P1ROQ?IHZ/-H=#O/6WN +M<+_7AX]>T]!8(UMLC@S]$:ZOTEI*#[V5AT*-U0/64G3$F^+YO2S/C^2D$XMB +M?'LG;J]N!MBLXMWA?@%KJ`$]!%%)0"-!"HJ:M`'``J$9*FX2X`!1J"\5929= +M4%!.O2K+_AF)^77`/:-'"SXW\6%YIU\F^,G;UASI9MI_Z9;A^(47[B^6XR"F +M)5>`7MKK@4\P`2F&4I)_/6!LZWDI8IMCY5@U4[/JEM;N?MIKQ5$9,RTVTNEX +MG;Z-F@\+0`!*3I@5-@FGL?SC,_@K$;VM_4S_7>XI!WD*?B^HQ%Q3$`@KC"+' +MCR'^M.NC^7L!=`08@Z(RCIUT3^?(6X6B),J1MP"Q/(MO/WYIR]X_$RA(U5#O +MI9_'^@"ZOZ5T"^S&29;WDF^K]`P(--U]F:3-Q0PHPW^EZQ +MW?\>+/@?<4/]3^'&-E#&\(W8=$S_.Z:5?V(;YW^WQ??G@Q"5*0"F\:)&\)23 +MQJP5#??[N\QK\8K/R8D['_38TJ)4>6XX00;0;J0:4<^0-42()$,8$.<$/@?X +M-]A*ERF\-K>$<>,XR9C?9*9``E`"3`']06$@RE)4>=$H\+#(34:E) +MD",,4H#T\=F=HR=6]0._W1W6:KVZ]5J;B#-, +MK*"WL$T4M_W`#V=)M/.JQW*U0FX4KVU',:S=LK94R%)MV.T^>F#(XK955_3J +M^*D\T>OF*`[.JXY5Y%9M=;_4MGM(+521.V%00V:9B$8,^2P'0"YZ*OD`5]6H(TEVB5\%O)=:1GMIJ"S;2^H&?:>9F=QQ3NW>@MW?> +M^%KPZ^JX-3*[Q^K`;;7AV*UL=>MV?ZM;YW'(P*(EP->J+N?:ZJF6$S?7N#>G +M#R\O-8LJM=2@8':3S$R)9D1)O@`:BLPA3[29$JKP*_AU`&01-J+U$-&TG7_$ +M(^5)BS^D!?DU($V:W.,/K>,;H4QGQNB'S)'Q_WG0"P0Q/3TM*_Z4E)V=%*&3 +M$G^6#@U5=.YK;2"L6WDT%&F!4*@A86:&1)*"@I0RK`%Q!08AA!2J,V5U$D"Q +M0"1L65R9H1$2B5,_MC8#:.`!CH&`8X3!\O=`W"N)K*++$/418+A*NBEL:!0- +M,:)]QOG,8+P[Q596>NE0>)@R]!R(D<5G>&C',BX,>MP+%Z#R`SF$D[#G!7A< +MK$WSC0;<'+!<;C>MS((#J%_WY_.':K+X#YNUOTE,2LZQXPR@:%Z3182?V20/ +M+NM&7>9T6=#7T")Z!S_,?U3.=0$&+.I9E/_!AE_UK+482*C309H.X/.8NO]A +MXS8<5[@W$$8#R)4[!)]8`,6A8+/B5R_Z#S*;UL5;*7WFT%MR,=B$;I/+E`Q6 +M_$;&CT5P[0*I/&R8BXFXS^O2%G$)?#T`,ALPS[61>02@ +M'N%$.9)8Z>E!GJ^`S_M-"-`BV-U9ISY8-0`0P#D<3DRRJ`!_)1-9IO1-6?,V +M8Y4>V5$$UZ,>%_=48D5U8P**U_GCO*:GEK+\.MTVVX0N@!?.U[,7P']+9YF, +M!4!6JSA;``\O7`'\G\B+C!7`R\U=`?RD"*%K.8`=D:(J%9K16'"C!,`J=AAM +M+),P?%7]6?!PW78<:++M.^&QC09HV6)V`$PH]VCY4ZEXX*\!;Z;?A!>^,`": +M`+(=Z:&T/^K,^OX$SNV[PRW3ANQZ\U6;MG#C$F-JD*'0YZ/]?57+NMG:&/+4 +M,%:\T9IL$9.A]`EQ"-108&:J,A1P*/4^H5U/W))T+V:-`C!8I"#M_T1/D[T" +M`,*+WPN,7"HVPM``,,ZTX&^E + +DEFINE_TEST(test_read_format_gtar_redundant_L) +{ + const char *refname = "test_read_format_gtar_redundant_L.tar.Z"; + struct archive *a; + struct archive_entry *ae; + + extract_reference_file(refname); + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_filename(a, refname, 10240)); + + /* First file has redundant 'L' headers; this should prompt + * a suitable ARCHIVE_WARN message */ + assertEqualIntA(a, ARCHIVE_WARN, archive_read_next_header(a, &ae)); + assertEqualInt(archive_errno(a), -1); + assert(strstr(archive_error_string(a), "Redundant 'L'") != NULL); + + /* End of archive. */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + /* Verify archive format. */ + assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0)); + assertEqualIntA(a, ARCHIVE_FORMAT_TAR_GNUTAR, archive_format(a)); + + /* Close the archive. */ + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} --- /dev/null +++ contrib/libarchive/libarchive/test/test_read_format_gtar_redundant_L.tar.Z.uu @@ -0,0 +1,16 @@ +begin 644 test_read_format_gtar_redundant_L.tar.Z +M'YV0+EX$!,+DC9LS3-*X60.@H<.'$"-*G$BQHL6+%&%HA&&#!@T`&T."#*EQ +M)$D8,F#$,'FRI,H8-6Y\!,$$H\V;.'/JE%AG#ITP5&F31TV8>B4(?,"QHL@;L@434.63-@P+_#(G4NW +MKMV[>//JW6+#=FWACC +MQLJ6(E_:0`F`YN33.7O^##IT*=*IKE'+GDV;L%6L6KEZ!2N6K%FT:M^P?>'V +M9UR_R),K7WZWMO/GT*-+GWZ:\0N"!A$J9$A]<&6/FV&$#X]2)7G-+V/.K-E= +MMFJ@0HD:?2TU=OO[^!7?SKJUZ]>P8Y5U5EIKM?76<ZS)QQ1L\ZDHXXP2[9>; +M?[P%^!N!PAEH'(-`!ID21@Z%1!AMLO.$"'7C0AR1&*FED&4LWV%!# +M9C)P"-H,`,1`PPTSS&"###74`,,-()%(`PPSB3?E4RS&1T<:;0#F4QAFF#'G +MG]VAD88"@!9JZ*&()JKHHHPVZNBCD$8JZ:245FKII9AFJNFFG';JZ:>@ABKJ +MJ*26:NJIJ*:JZJJLMNKJJ[#&*NNLM-9JZZVXYJKKKKSVZNNOP`8K[+#$%FOL +3L<@FJ^RRS#;K[+/01BOMM-0N"@`` +` +end --- contrib/libarchive/libarchive/test/test_read_format_gtar_sparse.c.orig +++ contrib/libarchive/libarchive/test/test_read_format_gtar_sparse.c @@ -30,13 +30,13 @@ const char *d; }; -struct contents archive_contents_sparse[] = { +static struct contents archive_contents_sparse[] = { { 1000000, 1, "a" }, { 2000000, 1, "a" }, { 3145728, 0, NULL } }; -struct contents archive_contents_sparse2[] = { +static struct contents archive_contents_sparse2[] = { { 1000000, 1, "a" }, { 2000000, 1, "a" }, { 3000000, 1, "a" }, @@ -139,7 +139,7 @@ { 99000001, 0, NULL } }; -struct contents archive_contents_nonsparse[] = { +static struct contents archive_contents_nonsparse[] = { { 0, 1, "a" }, { 1, 0, NULL } }; @@ -159,7 +159,7 @@ * * contains a single byte 'a' */ -struct archive_contents { +static struct archive_contents { const char *filename; struct contents *contents; } files[] = { --- /dev/null +++ contrib/libarchive/libarchive/test/test_read_format_gtar_sparse_length.c @@ -0,0 +1,53 @@ +/*- + * Copyright (c) 2003-2025 Tim Kientzle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) 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. + */ +#include "test.h" + + +DEFINE_TEST(test_read_format_gtar_sparse_length) +{ + const char *refname = "test_read_format_gtar_sparse_length.tar.Z"; + int err; + struct archive *a; + struct archive_entry *ae; + + extract_reference_file(refname); + + assert((a = archive_read_new()) != NULL); + assert(0 == archive_read_support_filter_all(a)); + assert(0 == archive_read_support_format_tar(a)); + failure("Can't open %s", refname); + assert(0 == archive_read_open_filename(a, refname, 3)); + + err = archive_read_next_header(a, &ae); + assertEqualIntA(a, ARCHIVE_OK, err); + err = archive_read_next_header(a, &ae); + assertEqualIntA(a, ARCHIVE_OK, err); + + err = archive_read_next_header(a, &ae); + assertEqualIntA(a, ARCHIVE_EOF, err); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} --- /dev/null +++ contrib/libarchive/libarchive/test/test_read_format_gtar_sparse_length.tar.Z.uu @@ -0,0 +1,12 @@ +begin 644 test_read_format_gtar_sparse_length.tar.Z +M'YV09-+(>0$E#!XD9<*0*3/03!HV96(`F$BQHL6+&#-JW,BQ(T48(&W0H`$" +M`,@8-VK$*'DRY4J3(&.>C`$#1`P:-V#,J#$CAHP8-D#``%IC)``0>#PJ7;0"2,')APV=_FW2NG[]\T;@;W@'$81V*\>OGZE9.0 +MS9PT>LH4EG$CAX*XJ%.K7LVZM>O7L&/+GLTQX$"[5:8P[FODH5\8+QQ"E$C; +M=4R1)&&B5,ERJ,OF9VF"M(E3)T^?0(6BG#'CQE$8Q<,WC3JU*LBP6KFR\

555BE1U9[+;['7EGT93@= +.BCCFJ...//;HXX]`_@@` +` +end --- contrib/libarchive/libarchive/test/test_read_format_gtar_sparse_skip_entry.tar.Z.uu.orig +++ contrib/libarchive/libarchive/test/test_read_format_gtar_sparse_skip_entry.tar.Z.uu @@ -1,15 +1,15 @@ begin 644 test_read_format_gtar_sparse_skip_entry.tar.Z M'YV04,+@05(F#)DRBD:;,V!@T8-6)NE&'#10T<-#;>R(%CAEV28_3R9?LW\(P8-F[`<#%C -M)@T<->#6>`PBC.2^E07;J#'#Q>J-F5DJ<`GBB),J+N;`<3JGC(LV8=2\D<-V -M]DO;N'7S]MTFC9OA/6#,CE'[=N[=$V -M9]RY=212"9YD1EOO*&`DE!&*>645%9IY9589JGE +MC)R48^J424HQZE2J$E=F+*G5(]:O8,.*'3M6!LDY:?24Z:$U(XV?,A3,(-F& +M3IHV:V/0@%$CYD89-ES4P/'6QHT<.&;()3G&+MX>>OG&F!'#,`P7,V;2P%&# +M1HP:BT&$<9QW;U_`-FK,<)%ZH^6;"ER"..*DBHLY<)S.*>.B31@U;^1`COV2 +MMFW,F.-O8,6;7OIU;SFX7;L(\#B.WAO3CU:_+*<@&K5K(,&[@](Q# +M!@T:"LC*GT^_OOW[^/.#-3XE?!DC:;!1AD+Z%6B12AMUE%)((W'%($IMK=11 +M3#/5=%-..TTF@UY!P6#@AV`MU=13&5DUGXGRM<752EZ!Z.*+,,8%@P)[Y6"# +M`C:IEU,,[>TE5WPP!BGDD$06:>212"9YD1EOO`&DDE!&*>645%9IY9589JGE MEEQVZ>678(8IYIADEFGFF6BFJ>::;+;IYIMPQBGGG'36:>>=>.:IYYY\]NGG -MGX`&*NB@A!9JJ)YB](D@1PZ>U&B#*468484RT11###7<8!8(&-)4PX=^DN@4 -B5%*E6.J*746JTHN'2LFDDZW&*NNLM-9JZZVXYJKKKKR&!0`` +MGX`&*NB@A!9J*)YB](D@1PZ>U&B#*44(PX0RT13#9S>8!8*%--70H9\B.@65 +A5">2FF)7D:K4XJ%2,NDDJ[#&*NNLM-9JZZVXYJKKKF$! ` end --- contrib/libarchive/libarchive/test/test_read_format_rar.c.orig +++ contrib/libarchive/libarchive/test/test_read_format_rar.c @@ -3810,6 +3810,26 @@ assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); } +DEFINE_TEST(test_read_format_rar_endarc_huge) +{ + const char* reffile = "test_read_format_rar_endarc_huge.rar"; + + struct archive_entry *ae; + struct archive *a; + + extract_reference_file(reffile); + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_filter_all(a)); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_open_filename(a, reffile, 10240)); + + /* Test for truncation */ + assertA(ARCHIVE_FATAL == archive_read_next_header(a, &ae)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + DEFINE_TEST(test_read_format_rar_ppmd_use_after_free) { uint8_t buf[16]; @@ -3829,8 +3849,8 @@ assertA(ARCHIVE_OK == archive_read_next_header(a, &ae)); assertA(archive_read_data(a, buf, sizeof(buf)) <= 0); - /* Test EOF */ - assertA(1 == archive_read_next_header(a, &ae)); + /* Test for truncation */ + assertA(ARCHIVE_FATAL == archive_read_next_header(a, &ae)); assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); assertEqualInt(ARCHIVE_OK, archive_read_free(a)); @@ -3856,8 +3876,56 @@ assertA(archive_read_data(a, buf, sizeof(buf)) <= 0); /* Test EOF */ - assertA(1 == archive_read_next_header(a, &ae)); + assertA(ARCHIVE_FATAL == archive_read_next_header(a, &ae)); assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); assertEqualInt(ARCHIVE_OK, archive_read_free(a)); } + +DEFINE_TEST(test_read_format_rar_newsub_huge) +{ +#if SIZE_MAX == UINT64_MAX + skipping("not relevant on 64 bit platforms"); +#else + const char* reffile = "test_read_format_rar_newsub_huge.rar"; + + struct archive_entry *ae; + struct archive *a; + + extract_reference_file(reffile); + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_filter_all(a)); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_open_filename(a, reffile, 10240)); + + /* Test for truncation */ + assertA(ARCHIVE_FATAL == archive_read_next_header(a, &ae)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +#endif +} + +DEFINE_TEST(test_read_format_rar_symlink_huge) +{ +#if SIZE_MAX == UINT64_MAX + skipping("not relevant on 64 bit platforms"); +#else + const char* reffile = "test_read_format_rar_symlink_huge.rar"; + + struct archive_entry *ae; + struct archive *a; + + extract_reference_file(reffile); + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_filter_all(a)); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_open_filename(a, reffile, 10240)); + + /* Test for invalid entry */ + assertA(ARCHIVE_FATAL == archive_read_next_header(a, &ae)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +#endif +} --- contrib/libarchive/libarchive/test/test_read_format_rar5.c.orig +++ contrib/libarchive/libarchive/test/test_read_format_rar5.c @@ -27,7 +27,6 @@ /* Some tests will want to calculate some CRC32's, and this header can * help. */ #define __LIBARCHIVE_BUILD -#include #include #define PROLOGUE(reffile) \ @@ -82,7 +81,7 @@ /* *lptr is a value inside unpacked test file, val is the * value that should be in the unpacked test file. */ - if(archive_le32dec(lptr) != (uint32_t) val) + if(i4le(lptr) != (uint32_t) val) return 0; } @@ -107,7 +106,7 @@ goto fn_exit; } - computed_crc = crc32(0, buf, fsize); + computed_crc = bitcrc32(0, buf, fsize); assertEqualInt(computed_crc, crc); ret = 0; @@ -336,7 +335,7 @@ assertA(proper_size == archive_read_data(a, buf, proper_size)); /* To be extra pedantic, let's also check crc32 of the poem. */ - assertEqualInt(crc32(0, buf, proper_size), 0x7E5EC49E); + assertEqualInt(bitcrc32(0, buf, proper_size), 0x7E5EC49E); assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae)); EPILOGUE(); @@ -359,7 +358,7 @@ /* Yes, RARv5 unpacker itself should calculate the CRC, but in case * the DONT_FAIL_ON_CRC_ERROR define option is enabled during compilation, * let's still fail the test if the unpacked data is wrong. */ - assertEqualInt(crc32(0, buf, proper_size), 0x886F91EB); + assertEqualInt(bitcrc32(0, buf, proper_size), 0x886F91EB); assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae)); EPILOGUE(); @@ -870,7 +869,7 @@ if(bytes_read <= 0) break; - computed_crc = crc32(computed_crc, buf, bytes_read); + computed_crc = bitcrc32(computed_crc, buf, bytes_read); } assertEqualInt(computed_crc, 0x7CCA70CD); @@ -1127,7 +1126,7 @@ archive_entry_fflags(ae, &set, &clear); #if defined(__FreeBSD__) flag = UF_READONLY; -#elif defined(_WIN32) && !defined(CYGWIN) +#elif defined(_WIN32) && !defined(__CYGWIN__) flag = FILE_ATTRIBUTE_READONLY; #endif assertEqualInt(flag, set & flag); @@ -1139,7 +1138,7 @@ archive_entry_fflags(ae, &set, &clear); #if defined(__FreeBSD__) flag = UF_HIDDEN; -#elif defined(_WIN32) && !defined(CYGWIN) +#elif defined(_WIN32) && !defined(__CYGWIN__) flag = FILE_ATTRIBUTE_HIDDEN; #endif assertEqualInt(flag, set & flag); @@ -1150,8 +1149,8 @@ assertEqualString("system", archive_entry_fflags_text(ae)); archive_entry_fflags(ae, &set, &clear); #if defined(__FreeBSD__) - flag = UF_SYSTEM;; -#elif defined(_WIN32) && !defined(CYGWIN) + flag = UF_SYSTEM; +#elif defined(_WIN32) && !defined(__CYGWIN__) flag = FILE_ATTRIBUTE_SYSTEM; #endif assertEqualInt(flag, set & flag); @@ -1163,7 +1162,7 @@ archive_entry_fflags(ae, &set, &clear); #if defined(__FreeBSD__) flag = UF_READONLY | UF_HIDDEN; -#elif defined(_WIN32) && !defined(CYGWIN) +#elif defined(_WIN32) && !defined(__CYGWIN__) flag = FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN; #endif assertEqualInt(flag, set & flag); @@ -1175,7 +1174,7 @@ archive_entry_fflags(ae, &set, &clear); #if defined(__FreeBSD__) flag = UF_READONLY; -#elif defined(_WIN32) && !defined(CYGWIN) +#elif defined(_WIN32) && !defined(__CYGWIN__) flag = FILE_ATTRIBUTE_READONLY; #endif assertEqualInt(flag, set & flag); @@ -1187,7 +1186,7 @@ archive_entry_fflags(ae, &set, &clear); #if defined(__FreeBSD__) flag = UF_HIDDEN; -#elif defined(_WIN32) && !defined(CYGWIN) +#elif defined(_WIN32) && !defined(__CYGWIN__) flag = FILE_ATTRIBUTE_HIDDEN; #endif assertEqualInt(flag, set & flag); @@ -1199,7 +1198,7 @@ archive_entry_fflags(ae, &set, &clear); #if defined(__FreeBSD__) flag = UF_SYSTEM; -#elif defined(_WIN32) && !defined(CYGWIN) +#elif defined(_WIN32) && !defined(__CYGWIN__) flag = FILE_ATTRIBUTE_SYSTEM; #endif assertEqualInt(flag, set & flag); @@ -1211,7 +1210,7 @@ archive_entry_fflags(ae, &set, &clear); #if defined(__FreeBSD__) flag = UF_READONLY | UF_HIDDEN; -#elif defined(_WIN32) && !defined(CYGWIN) +#elif defined(_WIN32) && !defined(__CYGWIN__) flag = FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN; #endif assertEqualInt(flag, set & flag); --- contrib/libarchive/libarchive/test/test_read_format_rar5_unicode.rar.uu.orig +++ contrib/libarchive/libarchive/test/test_read_format_rar5_unicode.rar.uu @@ -1,9 +1,9 @@ -begin 0744 test_read_format_rar5_unicode.rar -M4F%R(1H'`0#SX8+K"P$%!P`&`0&`@(``//TR$"@"`PN-``2-`"#FQN;K@``` -M#/"?D8OPGXR.+G1X=`H#`D:)>%;RZ]D!2&5L;&\L('=O*3F.*3G>*3FBYT>'0*`P)& -MB7A6\NO9`1`%!``,\)^1B_"?C(XN='ATD-'.1V$"`QP`!`"@"`````"````U -M\)V2KO"=DX[PG9."\)V2M_"=D9SPG9.!\)V2OO"=DK@@\)V0O_"=DK[PG9.# -L\)V3@"YT>'0*`P(>7'J>!.S9`1`%`@`,\)^1B_"?C(XN='AT'7=640,%!``` -` -end +begin 0744 test_read_format_rar5_unicode.rar +M4F%R(1H'`0#SX8+K"P$%!P`&`0&`@(``//TR$"@"`PN-``2-`"#FQN;K@``` +M#/"?D8OPGXR.+G1X=`H#`D:)>%;RZ]D!2&5L;&\L('=O*3F.*3G>*3FBYT>'0*`P)& +MB7A6\NO9`1`%!``,\)^1B_"?C(XN='ATD-'.1V$"`QP`!`"@"`````"````U +M\)V2KO"=DX[PG9."\)V2M_"=D9SPG9.!\)V2OO"=DK@@\)V0O_"=DK[PG9.# +L\)V3@"YT>'0*`P(>7'J>!.S9`1`%`@`,\)^1B_"?C(XN='AT'7=640,%!``` +` +end --- contrib/libarchive/libarchive/test/test_read_format_rar_encryption.c.orig +++ contrib/libarchive/libarchive/test/test_read_format_rar_encryption.c @@ -26,8 +26,8 @@ #include "test.h" /* - * All of the archives for this teset contain four files: a.txt, b.txt, c.txt, and d.txt - * For solid archives or archvies or archives where filenames are encrypted, all four files are encrypted with the + * All of the archives for this test contain four files: a.txt, b.txt, c.txt, and d.txt + * For solid archives or archives or archives where filenames are encrypted, all four files are encrypted with the * password "password". For non-solid archives without filename encryption, a.txt and c.txt are not encrypted, b.txt is * encrypted with the password "password", and d.txt is encrypted with the password "password2". * --- /dev/null +++ contrib/libarchive/libarchive/test/test_read_format_rar_endarc_huge.rar.uu @@ -0,0 +1,4 @@ +begin 644 test_read_format_rar_endarc_huge.rar +24F%R(1H'````>P"`"P#W____ +` +end --- /dev/null +++ contrib/libarchive/libarchive/test/test_read_format_rar_newsub_huge.rar.uu @@ -0,0 +1,5 @@ +begin 644 test_read_format_rar_newsub_huge.rar.uu +M4F%R(1H'`",E>@`!*```````````````````````````````````____?P`` +"```` +` +end --- /dev/null +++ contrib/libarchive/libarchive/test/test_read_format_rar_overflow.c @@ -0,0 +1,48 @@ +/*- + * Copyright (c) 2003-2025 Tim Kientzle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) 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. + */ +#include "test.h" + +DEFINE_TEST(test_read_format_rar_overflow) +{ + struct archive *a; + struct archive_entry *ae; + const char reffile[] = "test_read_format_rar_overflow.rar"; + const void *buff; + size_t size; + int64_t offset; + + extract_reference_file(reffile); + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, reffile, 1024)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt(48, archive_entry_size(ae)); + /* The next call should reproduce Issue #2565 */ + assertEqualIntA(a, ARCHIVE_FATAL, archive_read_data_block(a, &buff, &size, &offset)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} --- /dev/null +++ contrib/libarchive/libarchive/test/test_read_format_rar_overflow.rar.uu @@ -0,0 +1,11 @@ +begin 644 test_read_format_rar_overflow.rar +M4F%R(1H'`,($=```(0`@`0``,`````(````````````S`0``````,`"_B%_: +MZ?^[:7``?S!!,`@P,KB@,T@RN33)MTEB@5Z3<`DP`K35`.0P63@P<,Q&0?#, +MA##,,",S,(@P,#,@##`&,#":(3`!,#"(`9HPS,,S13`P,#`P,*`PHPS,,S1A +M,!,!,#","9H@S12D#$PP!C`P`*'F03":,,T8H`@\,/DPJS!/,"30,#`3N%LP +MCQ6:S3"!,#LP22<-,$5%B"5B$S!)(&*>G#+@!`E`%0ODC])62=DO,)BYJX'P +M=/LPZ3!!008?%S`P,#`P,#`P,#`P,#`P,#`P,#`P2$PP,#`P03!(,#`P,#`& +M,`7),#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P +-,#`P,#`P,#`P,#`P,``` +` +end --- /dev/null +++ contrib/libarchive/libarchive/test/test_read_format_rar_symlink_huge.rar.uu @@ -0,0 +1,5 @@ +begin 644 test_read_format_rar_symlink_huge.rar +M4F%R(1H'`'6E=``!*0````````````,``````````````0``H```____?P`` +#``!X +` +end --- contrib/libarchive/libarchive/test/test_read_format_tar_empty_with_gnulabel.c.orig +++ contrib/libarchive/libarchive/test/test_read_format_tar_empty_with_gnulabel.c @@ -45,7 +45,7 @@ /* Verify that the format detection worked. */ assertEqualInt(archive_filter_code(a, 0), ARCHIVE_FILTER_NONE); - assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_GNUTAR); assertEqualInt(ARCHIVE_OK, archive_read_close(a)); assertEqualInt(ARCHIVE_OK, archive_read_free(a)); --- /dev/null +++ contrib/libarchive/libarchive/test/test_read_format_tar_mac_metadata.c @@ -0,0 +1,85 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2025 Zhaofeng Li + * All rights reserved. + */ +#include "test.h" + +DEFINE_TEST(test_read_format_tar_mac_metadata) +{ + /* + This test tar file is crafted with two files in a specific order: + + 1. A ._-prefixed file with pax header containing the path attribute. + 2. A file with a pax header but without the path attribute. + + It's designed to trigger the case encountered in: + + + GNU tar is required to reproduce this tar file: + + ```sh + NAME1="._101_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + NAME2="goodname" + OUT="test_read_format_tar_mac_metadata_1.tar" + + echo "content of badname" >"${NAME1}" + echo "content of goodname" >"${NAME2}" + + rm -f "${OUT}" + gnutar \ + --mtime="@0" \ + --owner=0 --group=0 --numeric-owner \ + --pax-option=exthdr.name=%d/PaxHeaders/%f,atime:=0,ctime:=0,foo:=bar \ + --format=pax \ + -cf "${OUT}" \ + "${NAME1}" \ + "${NAME2}" + uuencode "${OUT}" "${OUT}" >"${OUT}.uu" + + sha256sum "${OUT}" + sha256sum "${OUT}.uu" + ``` + */ + const char *refname = "test_read_format_tar_mac_metadata_1.tar"; + char *p; + size_t s; + struct archive *a; + struct archive_entry *ae; + + /* + * This is not a valid AppleDouble metadata file. It is merely to test that + * the correct bytes are read. + */ + const unsigned char appledouble[] = { + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, + 0x61, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x0a + }; + + extract_reference_file(refname); + p = slurpfile(&s, "%s", refname); + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_tar(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_set_option(a, "tar", "mac-ext", "1")); + assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, p, s, 1)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + + /* Correct name and metadata bytes */ + assertEqualString("goodname", archive_entry_pathname(ae)); + + const void *metadata = archive_entry_mac_metadata(ae, &s); + if (assert(metadata != NULL)) { + assertEqualMem(metadata, appledouble, + sizeof(appledouble)); + } + + /* ... and nothing else */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); + + free(p); +} --- /dev/null +++ contrib/libarchive/libarchive/test/test_read_format_tar_mac_metadata_1.tar.uu @@ -0,0 +1,231 @@ +begin 644 test_read_format_tar_mac_metadata_1.tar +M+B]087A(96%D97)S+RY?,3`Q7V%A86%A86%A86%A86%A86%A86%A86%A86%A +M86%A86%A86%A86%A86%A86%A86%A86%A86%A86%A86%A86%A86%A86%A86%A +M86%A86%A86%A83`P,#`V-#0`,#`P,#`P,``P,#`P,#`P`#`P,#`P,#`P,C(P +M`#`P,#`P,#`P,#`P`#`S,#,Q,0`@>``````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````!U$AE861E0`````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````,#`P,#8T-``P,#`Q-S4P`#`P +M,#$W-3``,#`P,#`P,#`P,#``,30W-S8W-#8Q-30`,#$P-S`R`"`P```````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````'5S=&%R("````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````!U'0-"E=!4D,M1&%T +M93H@,C`R-2TP,RTS,%0Q-3HP,#HT,%H-"D-O;G1E;G0M5'EP93H@=&5X="]P +M;&%I;@T*0V]N=&5N="U,96YG=&@Z(#,X#0H-"E1H92!R96%D;64N='AT('-H +4;W5L9"!N;W0@8F4@=FES:6)L90H` +` +end --- contrib/libarchive/libarchive/test/test_read_format_zip.c.orig +++ contrib/libarchive/libarchive/test/test_read_format_zip.c @@ -26,7 +26,6 @@ #include "test.h" #define __LIBARCHIVE_BUILD -#include static int extract_one(struct archive* a, struct archive_entry* ae, uint32_t crc) @@ -47,7 +46,7 @@ goto fn_exit; } - computed_crc = crc32(0, buf, fsize); + computed_crc = bitcrc32(0, buf, fsize); assertEqualInt(computed_crc, crc); ret = 0; @@ -84,7 +83,7 @@ /* ok */ } - computed_crc = crc32(computed_crc, buf, bytes_read); + computed_crc = bitcrc32(computed_crc, buf, bytes_read); } assertEqualInt(computed_crc, crc); --- /dev/null +++ contrib/libarchive/libarchive/test/test_read_pax_empty_val_no_nl.c @@ -0,0 +1,65 @@ +/*- + * Copyright (c) 2025 Tobias Stoeckmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) 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. + */ +#include "test.h" + +/* + * Read a pax formatted tar archive that contains an invalid attribute, + * because it does not end in a newline. Additionally, value is empty. + * The pax reader should stop and tar reader should continue with warning. + */ +DEFINE_TEST(test_read_pax_empty_val_no_nl) +{ + char name[] = "test_read_pax_empty_val_no_nl.tar"; + struct archive_entry *ae; + struct archive *a; + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + extract_reference_file(name); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 10240)); + + /* Read first entry. */ + assertEqualIntA(a, ARCHIVE_WARN, archive_read_next_header(a, &ae)); + assertEqualString("empty", archive_entry_pathname(ae)); + assertEqualInt(1748163748, archive_entry_mtime(ae)); + assertEqualInt(0, archive_entry_uid(ae)); + assertEqualString("root", archive_entry_uname(ae)); + assertEqualInt(0, archive_entry_gid(ae)); + assertEqualString("root", archive_entry_gname(ae)); + assertEqualInt(0100600, archive_entry_mode(ae)); + assertEqualInt(archive_entry_is_encrypted(ae), 0); + assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); + + /* Verify the end-of-archive. */ + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + /* Verify that the format detection worked. */ + assertEqualInt(archive_filter_code(a, 0), ARCHIVE_FILTER_NONE); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE); + + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} --- /dev/null +++ contrib/libarchive/libarchive/test/test_read_pax_empty_val_no_nl.tar.uu @@ -0,0 +1,60 @@ +begin 600 test_read_pax_empty_val_no_nl.tar +M4&%X2&5A9&5R+V5M<'1Y```````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````#`P,#8P,"``,#`P,#`P(``P,#`P,#`@`#`P,#`P,#`P,#`T +M(#$U,#$T-34V,C0T(#`Q-#`U-@`@>``````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````!Ufm_start = 0; - fm->fm_length = ~0ULL;; + fm->fm_length = ~0ULL; fm->fm_flags = FIEMAP_FLAG_SYNC; fm->fm_extent_count = (sizeof(buff) - sizeof(*fm))/ sizeof(struct fiemap_extent); @@ -608,7 +608,8 @@ verify_sparse_file(a, "file2", sparse_file2, 20); /* Encoded non sparse; expect a data block but no sparse entries. */ verify_sparse_file(a, "file3", sparse_file3, 0); - verify_sparse_file(a, "file4", sparse_file4, 2); + if (sizeof(off_t) > 4) + verify_sparse_file(a, "file4", sparse_file4, 2); assertEqualInt(ARCHIVE_OK, archive_read_free(a)); @@ -635,7 +636,8 @@ verify_sparse_file(a, "file1", sparse_file1, 0); verify_sparse_file(a, "file2", sparse_file2, 0); verify_sparse_file(a, "file3", sparse_file3, 0); - verify_sparse_file(a, "file4", sparse_file4, 0); + if (sizeof(off_t) > 4) + verify_sparse_file(a, "file4", sparse_file4, 0); assertEqualInt(ARCHIVE_OK, archive_read_free(a)); --- contrib/libarchive/libarchive/test/test_tar_large.c.orig +++ contrib/libarchive/libarchive/test/test_tar_large.c @@ -175,7 +175,7 @@ } if (private->filebytes > 0) { if (private->filebytes < skip) - skip = (off_t)private->filebytes; + skip = private->filebytes; private->filebytes -= skip; } else { skip = 0; --- contrib/libarchive/libarchive/test/test_write_disk_perms.c.orig +++ contrib/libarchive/libarchive/test/test_write_disk_perms.c @@ -216,7 +216,7 @@ /* Check original owner. */ assertEqualInt(0, stat("dir_owner", &st)); - failure("dir_owner: st.st_uid=%d", st.st_uid); + failure("dir_owner: st.st_uid=%jd", (intmax_t)st.st_uid); assertEqualInt(st.st_uid, original_uid); /* Shouldn't try to edit the owner when no overwrite option is set. */ assert((ae = archive_entry_new()) != NULL); @@ -230,7 +230,7 @@ assertEqualIntA(a, ARCHIVE_OK, archive_write_finish_entry(a)); /* Make sure they're unchanged. */ assertEqualInt(0, stat("dir_owner", &st)); - failure("dir_owner: st.st_uid=%d", st.st_uid); + failure("dir_owner: st.st_uid=%jd", (intmax_t)st.st_uid); assertEqualInt(st.st_uid, original_uid); /* Write a regular file with SUID bit, but don't use _EXTRACT_PERM. */ @@ -475,8 +475,8 @@ assertEqualInt(0, stat("file_bad_owner", &st)); failure("file_bad_owner: st.st_mode=%o", st.st_mode); assertEqualInt(st.st_mode & 07777, 0744); - failure("file_bad_owner: st.st_uid=%d getuid()=%d", - st.st_uid, getuid()); + failure("file_bad_owner: st.st_uid=%jd getuid()=%jd", + (intmax_t)st.st_uid, (intmax_t)getuid()); /* The entry had getuid()+1, but because we're * not root, we should not have been able to set that. */ assertEqualInt(st.st_uid, getuid()); --- contrib/libarchive/libarchive/test/test_write_disk_secure_noabsolutepaths.c.orig +++ contrib/libarchive/libarchive/test/test_write_disk_secure_noabsolutepaths.c @@ -79,8 +79,8 @@ assert(ARCHIVE_OK != archive_read_extract(a, ae, ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS)); // This should also fail. - assert((ad = archive_write_new()) != NULL); - assertEqualInt(ARCHIVE_OK, archive_write_disk_set_options(a, ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS)); + assert((ad = archive_write_disk_new()) != NULL); + assertEqualInt(ARCHIVE_OK, archive_write_disk_set_options(ad, ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS)); assert(ARCHIVE_OK != archive_read_extract2(a, ae, ad)); assertEqualInt(ARCHIVE_OK, archive_write_free(ad)); --- contrib/libarchive/libarchive/test/test_write_filter_gzip.c.orig +++ contrib/libarchive/libarchive/test/test_write_filter_gzip.c @@ -145,6 +145,8 @@ archive_write_set_filter_option(a, NULL, "compression-level", "99")); assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "gzip:compression-level=9")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "gzip:original-filename=testorgfilename")); assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 100; i++) { snprintf(path, sizeof(path), "file%03d", i); @@ -164,8 +166,9 @@ assertEqualInt(rbuff[0], 0x1f); assertEqualInt(rbuff[1], 0x8b); assertEqualInt(rbuff[2], 0x08); - assertEqualInt(rbuff[3], 0x00); + assertEqualInt(rbuff[3], 0x08); assertEqualInt(rbuff[8], 2); /* RFC 1952 flag for compression level 9 */ + assertEqualString((const char*)rbuff+10, "testorgfilename"); /* Curiously, this test fails; the test data above compresses * better at default compression than at level 9. */ --- contrib/libarchive/libarchive/test/test_write_format_7zip.c.orig +++ contrib/libarchive/libarchive/test/test_write_format_7zip.c @@ -567,3 +567,9 @@ /* Test that making a 7-Zip archive file with PPMd compression. */ test_basic("ppmd"); } + +DEFINE_TEST(test_write_format_7zip_basic_zstd) +{ + /* Test that making a 7-Zip archive file with zstandard compression. */ + test_basic("zstd"); +} --- contrib/libarchive/libarchive/test/test_write_format_7zip_large.c.orig +++ contrib/libarchive/libarchive/test/test_write_format_7zip_large.c @@ -169,3 +169,9 @@ /* Test that making a 7-Zip archive file with PPMd compression. */ test_large("ppmd"); } + +DEFINE_TEST(test_write_format_7zip_large_zstd) +{ + /* Test that making a 7-Zip archive file with zstd compression. */ + test_large("zstd"); +} --- contrib/libarchive/libarchive/test/test_write_format_gnutar.c.orig +++ contrib/libarchive/libarchive/test/test_write_format_gnutar.c @@ -93,6 +93,29 @@ "12345678901234567890123456789012345678901234567890" "12345678901234567890123456789012345678901234567890"; +static const char *longfilename_largeuid = "large_uid_gid---" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890"; + + DEFINE_TEST(test_write_format_gnutar) { @@ -162,7 +185,7 @@ * A file with large UID/GID that overflow octal encoding. */ assert((ae = archive_entry_new()) != NULL); - archive_entry_copy_pathname(ae, "large_uid_gid"); + archive_entry_copy_pathname(ae, longfilename_largeuid); archive_entry_set_mode(ae, S_IFREG | 0755); archive_entry_set_size(ae, 8); archive_entry_set_uid(ae, 123456789); @@ -185,7 +208,7 @@ /* Verify GNU tar magic/version fields */ assertEqualMem(buff + 257, "ustar \0", 8); - assertEqualInt(15360, used); + assertEqualInt(16896, used); /* * @@ -243,7 +266,7 @@ assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); assertEqualInt(123456789, archive_entry_uid(ae)); assertEqualInt(987654321, archive_entry_gid(ae)); - assertEqualString("large_uid_gid", archive_entry_pathname(ae)); + assertEqualString(longfilename_largeuid, archive_entry_pathname(ae)); assertEqualInt(S_IFREG | 0755, archive_entry_mode(ae)); /* --- /dev/null +++ contrib/libarchive/libarchive/test/test_write_format_mtree_preset_digests.c @@ -0,0 +1,2107 @@ +/*- + * Copyright (c) 2025 Nicholas Vinson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) 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. + */ + +#include "test.h" + +#define __LIBARCHIVE_BUILD 1 +#include "archive_digest_private.h" + +struct expected_digests { + unsigned char md5[16]; + unsigned char rmd160[20]; + unsigned char sha1[20]; + unsigned char sha256[32]; + unsigned char sha384[48]; + unsigned char sha512[64]; +}; + +archive_md5_ctx expectedMd5Ctx; +archive_rmd160_ctx expectedRmd160Ctx; +archive_sha1_ctx expectedSha1Ctx; +archive_sha256_ctx expectedSha256Ctx; +archive_sha384_ctx expectedSha384Ctx; +archive_sha512_ctx expectedSha512Ctx; + +DEFINE_TEST(test_write_format_mtree_digests_no_digests_set_no_data) +{ + char buff[4096] = {0}; + size_t used = 0; + struct archive *a; + struct archive_entry *entry; + struct expected_digests ed; + +#ifdef ARCHIVE_HAS_MD5 + assertEqualInt(ARCHIVE_OK, archive_md5_init(&expectedMd5Ctx)); + assertEqualInt(ARCHIVE_OK, archive_md5_update(&expectedMd5Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_md5_final(&expectedMd5Ctx, ed.md5)); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assertEqualInt(ARCHIVE_OK, archive_rmd160_init(&expectedRmd160Ctx)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_update(&expectedRmd160Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_final(&expectedRmd160Ctx, ed.rmd160)); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assertEqualInt(ARCHIVE_OK, archive_sha1_init(&expectedSha1Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha1_update(&expectedSha1Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha1_final(&expectedSha1Ctx, ed.sha1)); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assertEqualInt(ARCHIVE_OK, archive_sha256_init(&expectedSha256Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha256_update(&expectedSha256Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha256_final(&expectedSha256Ctx, ed.sha256)); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assertEqualInt(ARCHIVE_OK, archive_sha384_init(&expectedSha384Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha384_update(&expectedSha384Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha384_final(&expectedSha384Ctx, ed.sha384)); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assertEqualInt(ARCHIVE_OK, archive_sha512_init(&expectedSha512Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha512_update(&expectedSha512Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha512_final(&expectedSha512Ctx, ed.sha512)); +#endif + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_mtree(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "all")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff) - 1, &used)); + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, "test.data"); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_size(entry, 4); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + archive_entry_free(entry); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a)); + + assert((a = archive_read_new()) != NULL); + assert((entry = archive_entry_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + +#ifdef ARCHIVE_HAS_MD5 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) == 0); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) == 0); +#endif + archive_entry_free(entry); +} + +DEFINE_TEST(test_write_format_mtree_digests_no_digests_set_empty_data) +{ + char buff[4096] = {0}; + size_t used = 0; + struct archive *a; + struct archive_entry *entry; + struct expected_digests ed; + +#ifdef ARCHIVE_HAS_MD5 + assertEqualInt(ARCHIVE_OK, archive_md5_init(&expectedMd5Ctx)); + assertEqualInt(ARCHIVE_OK, archive_md5_update(&expectedMd5Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_md5_final(&expectedMd5Ctx, ed.md5)); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assertEqualInt(ARCHIVE_OK, archive_rmd160_init(&expectedRmd160Ctx)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_update(&expectedRmd160Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_final(&expectedRmd160Ctx, ed.rmd160)); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assertEqualInt(ARCHIVE_OK, archive_sha1_init(&expectedSha1Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha1_update(&expectedSha1Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha1_final(&expectedSha1Ctx, ed.sha1)); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assertEqualInt(ARCHIVE_OK, archive_sha256_init(&expectedSha256Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha256_update(&expectedSha256Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha256_final(&expectedSha256Ctx, ed.sha256)); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assertEqualInt(ARCHIVE_OK, archive_sha384_init(&expectedSha384Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha384_update(&expectedSha384Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha384_final(&expectedSha384Ctx, ed.sha384)); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assertEqualInt(ARCHIVE_OK, archive_sha512_init(&expectedSha512Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha512_update(&expectedSha512Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha512_final(&expectedSha512Ctx, ed.sha512)); +#endif + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_mtree(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "all")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff) - 1, &used)); + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, "test.data"); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_size(entry, 4); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + archive_write_data(a, "", 0); + archive_entry_free(entry); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a)); + + assert((a = archive_read_new()) != NULL); + assert((entry = archive_entry_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + +#ifdef ARCHIVE_HAS_MD5 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) == 0); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) == 0); +#endif + archive_entry_free(entry); +} + +DEFINE_TEST(test_write_format_mtree_digests_no_digests_set_non_empty_data) +{ + char buff[4096] = {0}; + size_t used = 0; + struct archive *a; + struct archive_entry *entry; + struct expected_digests ed; + char *data = "abcd"; + +#ifdef ARCHIVE_HAS_MD5 + assertEqualInt(ARCHIVE_OK, archive_md5_init(&expectedMd5Ctx)); + assertEqualInt(ARCHIVE_OK, archive_md5_update(&expectedMd5Ctx, data, 4)); + assertEqualInt(ARCHIVE_OK, archive_md5_final(&expectedMd5Ctx, ed.md5)); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assertEqualInt(ARCHIVE_OK, archive_rmd160_init(&expectedRmd160Ctx)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_update(&expectedRmd160Ctx, data, 4)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_final(&expectedRmd160Ctx, ed.rmd160)); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assertEqualInt(ARCHIVE_OK, archive_sha1_init(&expectedSha1Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha1_update(&expectedSha1Ctx, data, 4)); + assertEqualInt(ARCHIVE_OK, archive_sha1_final(&expectedSha1Ctx, ed.sha1)); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assertEqualInt(ARCHIVE_OK, archive_sha256_init(&expectedSha256Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha256_update(&expectedSha256Ctx, data, 4)); + assertEqualInt(ARCHIVE_OK, archive_sha256_final(&expectedSha256Ctx, ed.sha256)); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assertEqualInt(ARCHIVE_OK, archive_sha384_init(&expectedSha384Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha384_update(&expectedSha384Ctx, data, 4)); + assertEqualInt(ARCHIVE_OK, archive_sha384_final(&expectedSha384Ctx, ed.sha384)); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assertEqualInt(ARCHIVE_OK, archive_sha512_init(&expectedSha512Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha512_update(&expectedSha512Ctx, data, 4)); + assertEqualInt(ARCHIVE_OK, archive_sha512_final(&expectedSha512Ctx, ed.sha512)); +#endif + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_mtree(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "all")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff) - 1, &used)); + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, "test.data"); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_size(entry, 4); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + archive_write_data(a, data, 4); + archive_entry_free(entry); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a)); + + assert((a = archive_read_new()) != NULL); + assert((entry = archive_entry_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + +#ifdef ARCHIVE_HAS_MD5 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) == 0); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) == 0); +#endif + archive_entry_free(entry); +} + +DEFINE_TEST(test_write_format_mtree_digests_md5_digest_set_no_data) +{ +#ifdef ARCHIVE_HAS_MD5 + char buff[4096] = {0}; + size_t used = 0; + struct archive *a; + struct archive_entry *entry; + struct expected_digests ed; + + memcpy(ed.md5, (unsigned char[]) { + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + }, sizeof(ed.md5)); + +#ifdef ARCHIVE_HAS_RMD160 + assertEqualInt(ARCHIVE_OK, archive_rmd160_init(&expectedRmd160Ctx)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_update(&expectedRmd160Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_final(&expectedRmd160Ctx, ed.rmd160)); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assertEqualInt(ARCHIVE_OK, archive_sha1_init(&expectedSha1Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha1_update(&expectedSha1Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha1_final(&expectedSha1Ctx, ed.sha1)); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assertEqualInt(ARCHIVE_OK, archive_sha256_init(&expectedSha256Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha256_update(&expectedSha256Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha256_final(&expectedSha256Ctx, ed.sha256)); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assertEqualInt(ARCHIVE_OK, archive_sha384_init(&expectedSha384Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha384_update(&expectedSha384Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha384_final(&expectedSha384Ctx, ed.sha384)); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assertEqualInt(ARCHIVE_OK, archive_sha512_init(&expectedSha512Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha512_update(&expectedSha512Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha512_final(&expectedSha512Ctx, ed.sha512)); +#endif + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_mtree(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "all")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff) - 1, &used)); + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, "test.data"); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_size(entry, 4); + archive_entry_set_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5, ed.md5); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + archive_entry_free(entry); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a)); + + assert((a = archive_read_new()) != NULL); + assert((entry = archive_entry_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) == 0); + +#ifdef ARCHIVE_HAS_RMD160 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) == 0); +#endif + archive_entry_free(entry); +#else + skipping("This platform does not support MD5"); + return; +#endif +} + +DEFINE_TEST(test_write_format_mtree_digests_md5_digest_set_empty_data) +{ +#ifdef ARCHIVE_HAS_MD5 + char buff[4096] = {0}; + size_t used = 0; + struct archive *a; + struct archive_entry *entry; + struct expected_digests ed; + + memcpy(ed.md5, (unsigned char[]) { + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + }, sizeof(ed.md5)); + +#ifdef ARCHIVE_HAS_RMD160 + assertEqualInt(ARCHIVE_OK, archive_rmd160_init(&expectedRmd160Ctx)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_update(&expectedRmd160Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_final(&expectedRmd160Ctx, ed.rmd160)); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assertEqualInt(ARCHIVE_OK, archive_sha1_init(&expectedSha1Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha1_update(&expectedSha1Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha1_final(&expectedSha1Ctx, ed.sha1)); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assertEqualInt(ARCHIVE_OK, archive_sha256_init(&expectedSha256Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha256_update(&expectedSha256Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha256_final(&expectedSha256Ctx, ed.sha256)); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assertEqualInt(ARCHIVE_OK, archive_sha384_init(&expectedSha384Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha384_update(&expectedSha384Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha384_final(&expectedSha384Ctx, ed.sha384)); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assertEqualInt(ARCHIVE_OK, archive_sha512_init(&expectedSha512Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha512_update(&expectedSha512Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha512_final(&expectedSha512Ctx, ed.sha512)); +#endif + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_mtree(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "all")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff) - 1, &used)); + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, "test.data"); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_size(entry, 4); + archive_entry_set_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5, ed.md5); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + archive_write_data(a, "", 0); + archive_entry_free(entry); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a)); + + assert((a = archive_read_new()) != NULL); + assert((entry = archive_entry_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) != 0); + + assertEqualInt(ARCHIVE_OK, archive_md5_init(&expectedMd5Ctx)); + assertEqualInt(ARCHIVE_OK, archive_md5_update(&expectedMd5Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_md5_final(&expectedMd5Ctx, ed.md5)); + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) == 0); + +#ifdef ARCHIVE_HAS_RMD160 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) == 0); +#endif + archive_entry_free(entry); +#else + skipping("This platform does not support MD5"); + return; +#endif +} + +DEFINE_TEST(test_write_format_mtree_digests_md5_digest_set_non_empty_data) +{ +#ifdef ARCHIVE_HAS_MD5 + char buff[4096] = {0}; + size_t used = 0; + struct archive *a; + struct archive_entry *entry; + struct expected_digests ed; + + memcpy(ed.md5, (unsigned char[]) { + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + }, sizeof(ed.md5)); + +#ifdef ARCHIVE_HAS_RMD160 + assertEqualInt(ARCHIVE_OK, archive_rmd160_init(&expectedRmd160Ctx)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_update(&expectedRmd160Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_final(&expectedRmd160Ctx, ed.rmd160)); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assertEqualInt(ARCHIVE_OK, archive_sha1_init(&expectedSha1Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha1_update(&expectedSha1Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha1_final(&expectedSha1Ctx, ed.sha1)); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assertEqualInt(ARCHIVE_OK, archive_sha256_init(&expectedSha256Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha256_update(&expectedSha256Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha256_final(&expectedSha256Ctx, ed.sha256)); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assertEqualInt(ARCHIVE_OK, archive_sha384_init(&expectedSha384Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha384_update(&expectedSha384Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha384_final(&expectedSha384Ctx, ed.sha384)); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assertEqualInt(ARCHIVE_OK, archive_sha512_init(&expectedSha512Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha512_update(&expectedSha512Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha512_final(&expectedSha512Ctx, ed.sha512)); +#endif + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_mtree(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "all")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff) - 1, &used)); + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, "test.data"); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_size(entry, 4); + archive_entry_set_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5, ed.md5); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + archive_write_data(a, "abcd", 4); + archive_entry_free(entry); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a)); + + assert((a = archive_read_new()) != NULL); + assert((entry = archive_entry_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) != 0); + + assertEqualInt(ARCHIVE_OK, archive_md5_init(&expectedMd5Ctx)); + assertEqualInt(ARCHIVE_OK, archive_md5_update(&expectedMd5Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_md5_final(&expectedMd5Ctx, ed.md5)); + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) == 0); + +#ifdef ARCHIVE_HAS_RMD160 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) == 0); +#endif + archive_entry_free(entry); +#else + skipping("This platform does not support MD5"); + return; +#endif +} + +DEFINE_TEST(test_write_format_mtree_digests_rmd160_digest_set_no_data) +{ +#ifdef ARCHIVE_HAS_RMD160 + char buff[4096] = {0}; + size_t used = 0; + struct archive *a; + struct archive_entry *entry; + struct expected_digests ed; + +#ifdef ARCHIVE_HAS_MD5 + assertEqualInt(ARCHIVE_OK, archive_md5_init(&expectedMd5Ctx)); + assertEqualInt(ARCHIVE_OK, archive_md5_update(&expectedMd5Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_md5_final(&expectedMd5Ctx, ed.md5)); +#endif + + assertEqualInt(ARCHIVE_OK, archive_rmd160_init(&expectedRmd160Ctx)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_update(&expectedRmd160Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_final(&expectedRmd160Ctx, ed.rmd160)); + +#ifdef ARCHIVE_HAS_SHA1 + assertEqualInt(ARCHIVE_OK, archive_sha1_init(&expectedSha1Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha1_update(&expectedSha1Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha1_final(&expectedSha1Ctx, ed.sha1)); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assertEqualInt(ARCHIVE_OK, archive_sha256_init(&expectedSha256Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha256_update(&expectedSha256Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha256_final(&expectedSha256Ctx, ed.sha256)); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assertEqualInt(ARCHIVE_OK, archive_sha384_init(&expectedSha384Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha384_update(&expectedSha384Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha384_final(&expectedSha384Ctx, ed.sha384)); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assertEqualInt(ARCHIVE_OK, archive_sha512_init(&expectedSha512Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha512_update(&expectedSha512Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha512_final(&expectedSha512Ctx, ed.sha512)); +#endif + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_mtree(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "all")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff) - 1, &used)); + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, "test.data"); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_size(entry, 4); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + archive_entry_free(entry); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a)); + + assert((a = archive_read_new()) != NULL); + assert((entry = archive_entry_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + +#ifdef ARCHIVE_HAS_MD5 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) == 0); +#endif + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) == 0); + +#ifdef ARCHIVE_HAS_SHA1 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) == 0); +#endif + archive_entry_free(entry); +#else + skipping("This platform does not support RMD160"); + return; +#endif +} + +DEFINE_TEST(test_write_format_mtree_digests_rmd160_digest_set_empty_data) +{ +#ifdef ARCHIVE_HAS_RMD160 + char buff[4096] = {0}; + size_t used = 0; + struct archive *a; + struct archive_entry *entry; + struct expected_digests ed; + + memcpy(ed.rmd160, (unsigned char[]) { + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed + }, sizeof(ed.rmd160)); + +#ifdef ARCHIVE_HAS_MD5 + assertEqualInt(ARCHIVE_OK, archive_md5_init(&expectedMd5Ctx)); + assertEqualInt(ARCHIVE_OK, archive_md5_update(&expectedMd5Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_md5_final(&expectedMd5Ctx, ed.md5)); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assertEqualInt(ARCHIVE_OK, archive_sha1_init(&expectedSha1Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha1_update(&expectedSha1Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha1_final(&expectedSha1Ctx, ed.sha1)); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assertEqualInt(ARCHIVE_OK, archive_sha256_init(&expectedSha256Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha256_update(&expectedSha256Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha256_final(&expectedSha256Ctx, ed.sha256)); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assertEqualInt(ARCHIVE_OK, archive_sha384_init(&expectedSha384Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha384_update(&expectedSha384Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha384_final(&expectedSha384Ctx, ed.sha384)); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assertEqualInt(ARCHIVE_OK, archive_sha512_init(&expectedSha512Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha512_update(&expectedSha512Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha512_final(&expectedSha512Ctx, ed.sha512)); +#endif + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_mtree(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "all")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff) - 1, &used)); + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, "test.data"); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_size(entry, 4); + archive_entry_set_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160, ed.rmd160); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + archive_write_data(a, "", 0); + archive_entry_free(entry); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a)); + + assert((a = archive_read_new()) != NULL); + assert((entry = archive_entry_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + +#ifdef ARCHIVE_HAS_MD5 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) == 0); +#endif + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) != 0); + + assertEqualInt(ARCHIVE_OK, archive_rmd160_init(&expectedRmd160Ctx)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_update(&expectedRmd160Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_final(&expectedRmd160Ctx, ed.rmd160)); + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) == 0); + +#ifdef ARCHIVE_HAS_SHA1 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) == 0); +#endif + archive_entry_free(entry); +#else + skipping("This platform does not support RMD160"); + return; +#endif +} + +DEFINE_TEST(test_write_format_mtree_digests_rmd160_digest_set_non_empty_data) +{ +#ifdef ARCHIVE_HAS_RMD160 + char buff[4096] = {0}; + size_t used = 0; + struct archive *a; + struct archive_entry *entry; + struct expected_digests ed; + + memcpy(ed.rmd160, (unsigned char[]) { + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed + }, sizeof(ed.rmd160)); + +#ifdef ARCHIVE_HAS_MD5 + assertEqualInt(ARCHIVE_OK, archive_md5_init(&expectedMd5Ctx)); + assertEqualInt(ARCHIVE_OK, archive_md5_update(&expectedMd5Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_md5_final(&expectedMd5Ctx, ed.md5)); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assertEqualInt(ARCHIVE_OK, archive_sha1_init(&expectedSha1Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha1_update(&expectedSha1Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha1_final(&expectedSha1Ctx, ed.sha1)); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assertEqualInt(ARCHIVE_OK, archive_sha256_init(&expectedSha256Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha256_update(&expectedSha256Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha256_final(&expectedSha256Ctx, ed.sha256)); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assertEqualInt(ARCHIVE_OK, archive_sha384_init(&expectedSha384Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha384_update(&expectedSha384Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha384_final(&expectedSha384Ctx, ed.sha384)); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assertEqualInt(ARCHIVE_OK, archive_sha512_init(&expectedSha512Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha512_update(&expectedSha512Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha512_final(&expectedSha512Ctx, ed.sha512)); +#endif + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_mtree(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "all")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff) - 1, &used)); + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, "test.data"); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_size(entry, 4); + archive_entry_set_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160, ed.rmd160); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + archive_write_data(a, "abcd", 4); + archive_entry_free(entry); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a)); + + assert((a = archive_read_new()) != NULL); + assert((entry = archive_entry_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + +#ifdef ARCHIVE_HAS_MD5 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) == 0); +#endif + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) != 0); + + assertEqualInt(ARCHIVE_OK, archive_rmd160_init(&expectedRmd160Ctx)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_update(&expectedRmd160Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_final(&expectedRmd160Ctx, ed.rmd160)); + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) == 0); + +#ifdef ARCHIVE_HAS_SHA1 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) == 0); +#endif + archive_entry_free(entry); +#else + skipping("This platform does not support RMD160"); + return; +#endif +} + +DEFINE_TEST(test_write_format_mtree_digests_sha1_digest_set_no_data) +{ +#ifdef ARCHIVE_HAS_SHA1 + char buff[4096] = {0}; + size_t used = 0; + struct archive *a; + struct archive_entry *entry; + struct expected_digests ed; + + memcpy(ed.sha1, (unsigned char[]) { + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed + }, sizeof(ed.sha1)); + +#ifdef ARCHIVE_HAS_MD5 + assertEqualInt(ARCHIVE_OK, archive_md5_init(&expectedMd5Ctx)); + assertEqualInt(ARCHIVE_OK, archive_md5_update(&expectedMd5Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_md5_final(&expectedMd5Ctx, ed.md5)); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assertEqualInt(ARCHIVE_OK, archive_rmd160_init(&expectedRmd160Ctx)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_update(&expectedRmd160Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_final(&expectedRmd160Ctx, ed.rmd160)); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assertEqualInt(ARCHIVE_OK, archive_sha256_init(&expectedSha256Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha256_update(&expectedSha256Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha256_final(&expectedSha256Ctx, ed.sha256)); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assertEqualInt(ARCHIVE_OK, archive_sha384_init(&expectedSha384Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha384_update(&expectedSha384Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha384_final(&expectedSha384Ctx, ed.sha384)); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assertEqualInt(ARCHIVE_OK, archive_sha512_init(&expectedSha512Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha512_update(&expectedSha512Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha512_final(&expectedSha512Ctx, ed.sha512)); +#endif + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_mtree(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "all")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff) - 1, &used)); + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, "test.data"); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_size(entry, 4); + archive_entry_set_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1, ed.sha1); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + archive_entry_free(entry); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a)); + + assert((a = archive_read_new()) != NULL); + assert((entry = archive_entry_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + +#ifdef ARCHIVE_HAS_MD5 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) == 0); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) == 0); +#endif + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) == 0); + +#ifdef ARCHIVE_HAS_SHA256 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) == 0); +#endif + archive_entry_free(entry); +#else + skipping("This platform does not support SHA1"); + return; +#endif +} + +DEFINE_TEST(test_write_format_mtree_digests_sha1_digest_set_empty_data) +{ +#ifdef ARCHIVE_HAS_SHA1 + char buff[4096] = {0}; + size_t used = 0; + struct archive *a; + struct archive_entry *entry; + struct expected_digests ed; + + memcpy(ed.sha1, (unsigned char[]) { + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed + }, sizeof(ed.sha1)); + +#ifdef ARCHIVE_HAS_MD5 + assertEqualInt(ARCHIVE_OK, archive_md5_init(&expectedMd5Ctx)); + assertEqualInt(ARCHIVE_OK, archive_md5_update(&expectedMd5Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_md5_final(&expectedMd5Ctx, ed.md5)); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assertEqualInt(ARCHIVE_OK, archive_rmd160_init(&expectedRmd160Ctx)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_update(&expectedRmd160Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_final(&expectedRmd160Ctx, ed.rmd160)); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assertEqualInt(ARCHIVE_OK, archive_sha256_init(&expectedSha256Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha256_update(&expectedSha256Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha256_final(&expectedSha256Ctx, ed.sha256)); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assertEqualInt(ARCHIVE_OK, archive_sha384_init(&expectedSha384Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha384_update(&expectedSha384Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha384_final(&expectedSha384Ctx, ed.sha384)); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assertEqualInt(ARCHIVE_OK, archive_sha512_init(&expectedSha512Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha512_update(&expectedSha512Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha512_final(&expectedSha512Ctx, ed.sha512)); +#endif + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_mtree(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "all")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff) - 1, &used)); + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, "test.data"); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_size(entry, 4); + archive_entry_set_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1, ed.sha1); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + archive_write_data(a, "", 0); + archive_entry_free(entry); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a)); + + assert((a = archive_read_new()) != NULL); + assert((entry = archive_entry_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + +#ifdef ARCHIVE_HAS_MD5 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) == 0); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) == 0); +#endif + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) != 0); + + assertEqualInt(ARCHIVE_OK, archive_sha1_init(&expectedSha1Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha1_update(&expectedSha1Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha1_final(&expectedSha1Ctx, ed.sha1)); + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) == 0); + +#ifdef ARCHIVE_HAS_SHA256 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) == 0); +#endif + archive_entry_free(entry); +#else + skipping("This platform does not support SHA1"); + return; +#endif +} + +DEFINE_TEST(test_write_format_mtree_digests_sha1_digest_set_non_empty_data) +{ +#ifdef ARCHIVE_HAS_SHA1 + char buff[4096] = {0}; + size_t used = 0; + struct archive *a; + struct archive_entry *entry; + struct expected_digests ed; + + memcpy(ed.sha1, (unsigned char[]) { + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed + }, sizeof(ed.sha1)); + +#ifdef ARCHIVE_HAS_MD5 + assertEqualInt(ARCHIVE_OK, archive_md5_init(&expectedMd5Ctx)); + assertEqualInt(ARCHIVE_OK, archive_md5_update(&expectedMd5Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_md5_final(&expectedMd5Ctx, ed.md5)); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assertEqualInt(ARCHIVE_OK, archive_rmd160_init(&expectedRmd160Ctx)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_update(&expectedRmd160Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_final(&expectedRmd160Ctx, ed.rmd160)); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assertEqualInt(ARCHIVE_OK, archive_sha256_init(&expectedSha256Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha256_update(&expectedSha256Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha256_final(&expectedSha256Ctx, ed.sha256)); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assertEqualInt(ARCHIVE_OK, archive_sha384_init(&expectedSha384Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha384_update(&expectedSha384Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha384_final(&expectedSha384Ctx, ed.sha384)); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assertEqualInt(ARCHIVE_OK, archive_sha512_init(&expectedSha512Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha512_update(&expectedSha512Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha512_final(&expectedSha512Ctx, ed.sha512)); +#endif + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_mtree(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "all")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff) - 1, &used)); + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, "test.data"); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_size(entry, 4); + archive_entry_set_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1, ed.sha1); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + archive_write_data(a, "abcd", 4); + archive_entry_free(entry); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a)); + + assert((a = archive_read_new()) != NULL); + assert((entry = archive_entry_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + +#ifdef ARCHIVE_HAS_MD5 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) == 0); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) == 0); +#endif + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) != 0); + + assertEqualInt(ARCHIVE_OK, archive_sha1_init(&expectedSha1Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha1_update(&expectedSha1Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha1_final(&expectedSha1Ctx, ed.sha1)); + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) == 0); + +#ifdef ARCHIVE_HAS_SHA256 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) == 0); +#endif + archive_entry_free(entry); +#else + skipping("This platform does not support SHA1"); + return; +#endif +} + +DEFINE_TEST(test_write_format_mtree_digests_sha256_digest_set_no_data) +{ +#ifdef ARCHIVE_HAS_SHA256 + char buff[4096] = {0}; + size_t used = 0; + struct archive *a; + struct archive_entry *entry; + struct expected_digests ed; + + memcpy(ed.sha256, (unsigned char[]) { + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed + }, sizeof(ed.sha256)); + +#ifdef ARCHIVE_HAS_MD5 + assertEqualInt(ARCHIVE_OK, archive_md5_init(&expectedMd5Ctx)); + assertEqualInt(ARCHIVE_OK, archive_md5_update(&expectedMd5Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_md5_final(&expectedMd5Ctx, ed.md5)); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assertEqualInt(ARCHIVE_OK, archive_rmd160_init(&expectedRmd160Ctx)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_update(&expectedRmd160Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_final(&expectedRmd160Ctx, ed.rmd160)); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assertEqualInt(ARCHIVE_OK, archive_sha1_init(&expectedSha1Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha1_update(&expectedSha1Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha1_final(&expectedSha1Ctx, ed.sha1)); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assertEqualInt(ARCHIVE_OK, archive_sha384_init(&expectedSha384Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha384_update(&expectedSha384Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha384_final(&expectedSha384Ctx, ed.sha384)); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assertEqualInt(ARCHIVE_OK, archive_sha512_init(&expectedSha512Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha512_update(&expectedSha512Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha512_final(&expectedSha512Ctx, ed.sha512)); +#endif + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_mtree(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "all")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff) - 1, &used)); + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, "test.data"); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_size(entry, 4); + archive_entry_set_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256, ed.sha256); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + archive_entry_free(entry); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a)); + + assert((a = archive_read_new()) != NULL); + assert((entry = archive_entry_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + +#ifdef ARCHIVE_HAS_MD5 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) == 0); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) == 0); +#endif + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) == 0); + +#ifdef ARCHIVE_HAS_SHA384 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) == 0); +#endif + archive_entry_free(entry); +#else + skipping("This platform does not support SHA256"); + return; +#endif +} + +DEFINE_TEST(test_write_format_mtree_digests_sha256_digest_set_empty_data) +{ +#ifdef ARCHIVE_HAS_SHA256 + char buff[4096] = {0}; + size_t used = 0; + struct archive *a; + struct archive_entry *entry; + struct expected_digests ed; + + memcpy(ed.sha256, (unsigned char[]) { + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed + }, sizeof(ed.sha256)); + +#ifdef ARCHIVE_HAS_MD5 + assertEqualInt(ARCHIVE_OK, archive_md5_init(&expectedMd5Ctx)); + assertEqualInt(ARCHIVE_OK, archive_md5_update(&expectedMd5Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_md5_final(&expectedMd5Ctx, ed.md5)); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assertEqualInt(ARCHIVE_OK, archive_rmd160_init(&expectedRmd160Ctx)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_update(&expectedRmd160Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_final(&expectedRmd160Ctx, ed.rmd160)); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assertEqualInt(ARCHIVE_OK, archive_sha1_init(&expectedSha1Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha1_update(&expectedSha1Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha1_final(&expectedSha1Ctx, ed.sha1)); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assertEqualInt(ARCHIVE_OK, archive_sha384_init(&expectedSha384Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha384_update(&expectedSha384Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha384_final(&expectedSha384Ctx, ed.sha384)); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assertEqualInt(ARCHIVE_OK, archive_sha512_init(&expectedSha512Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha512_update(&expectedSha512Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha512_final(&expectedSha512Ctx, ed.sha512)); +#endif + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_mtree(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "all")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff) - 1, &used)); + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, "test.data"); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_size(entry, 4); + archive_entry_set_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256, ed.sha256); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + archive_write_data(a, "", 0); + archive_entry_free(entry); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a)); + + assert((a = archive_read_new()) != NULL); + assert((entry = archive_entry_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + +#ifdef ARCHIVE_HAS_MD5 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) == 0); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) == 0); +#endif + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) != 0); + + assertEqualInt(ARCHIVE_OK, archive_sha256_init(&expectedSha256Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha256_update(&expectedSha256Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha256_final(&expectedSha256Ctx, ed.sha256)); + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) == 0); + +#ifdef ARCHIVE_HAS_SHA384 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) == 0); +#endif + archive_entry_free(entry); +#else + skipping("This platform does not support SHA256"); + return; +#endif +} + +DEFINE_TEST(test_write_format_mtree_digests_sha256_digest_set_non_empty_data) +{ +#ifdef ARCHIVE_HAS_SHA256 + char buff[4096] = {0}; + size_t used = 0; + struct archive *a; + struct archive_entry *entry; + struct expected_digests ed; + + memcpy(ed.sha256, (unsigned char[]) { + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed + }, sizeof(ed.sha256)); + +#ifdef ARCHIVE_HAS_MD5 + assertEqualInt(ARCHIVE_OK, archive_md5_init(&expectedMd5Ctx)); + assertEqualInt(ARCHIVE_OK, archive_md5_update(&expectedMd5Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_md5_final(&expectedMd5Ctx, ed.md5)); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assertEqualInt(ARCHIVE_OK, archive_rmd160_init(&expectedRmd160Ctx)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_update(&expectedRmd160Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_final(&expectedRmd160Ctx, ed.rmd160)); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assertEqualInt(ARCHIVE_OK, archive_sha1_init(&expectedSha1Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha1_update(&expectedSha1Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha1_final(&expectedSha1Ctx, ed.sha1)); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assertEqualInt(ARCHIVE_OK, archive_sha384_init(&expectedSha384Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha384_update(&expectedSha384Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha384_final(&expectedSha384Ctx, ed.sha384)); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assertEqualInt(ARCHIVE_OK, archive_sha512_init(&expectedSha512Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha512_update(&expectedSha512Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha512_final(&expectedSha512Ctx, ed.sha512)); +#endif + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_mtree(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "all")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff) - 1, &used)); + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, "test.data"); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_size(entry, 4); + archive_entry_set_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256, ed.sha256); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + archive_write_data(a, "abcd", 4); + archive_entry_free(entry); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a)); + + assert((a = archive_read_new()) != NULL); + assert((entry = archive_entry_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + +#ifdef ARCHIVE_HAS_MD5 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) == 0); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) == 0); +#endif + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) != 0); + + assertEqualInt(ARCHIVE_OK, archive_sha256_init(&expectedSha256Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha256_update(&expectedSha256Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha256_final(&expectedSha256Ctx, ed.sha256)); + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) == 0); + +#ifdef ARCHIVE_HAS_SHA384 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) == 0); +#endif + archive_entry_free(entry); +#else + skipping("This platform does not support SHA256"); + return; +#endif +} + +DEFINE_TEST(test_write_format_mtree_digests_sha384_digest_set_no_data) +{ +#ifdef ARCHIVE_HAS_SHA384 + char buff[4096] = {0}; + size_t used = 0; + struct archive *a; + struct archive_entry *entry; + struct expected_digests ed; + + memcpy(ed.sha384, (unsigned char[]) { + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed + }, sizeof(ed.sha384)); + +#ifdef ARCHIVE_HAS_MD5 + assertEqualInt(ARCHIVE_OK, archive_md5_init(&expectedMd5Ctx)); + assertEqualInt(ARCHIVE_OK, archive_md5_update(&expectedMd5Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_md5_final(&expectedMd5Ctx, ed.md5)); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assertEqualInt(ARCHIVE_OK, archive_rmd160_init(&expectedRmd160Ctx)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_update(&expectedRmd160Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_final(&expectedRmd160Ctx, ed.rmd160)); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assertEqualInt(ARCHIVE_OK, archive_sha1_init(&expectedSha1Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha1_update(&expectedSha1Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha1_final(&expectedSha1Ctx, ed.sha1)); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assertEqualInt(ARCHIVE_OK, archive_sha256_init(&expectedSha256Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha256_update(&expectedSha256Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha256_final(&expectedSha256Ctx, ed.sha256)); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assertEqualInt(ARCHIVE_OK, archive_sha512_init(&expectedSha512Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha512_update(&expectedSha512Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha512_final(&expectedSha512Ctx, ed.sha512)); +#endif + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_mtree(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "all")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff) - 1, &used)); + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, "test.data"); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_size(entry, 4); + archive_entry_set_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384, ed.sha384); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + archive_entry_free(entry); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a)); + + assert((a = archive_read_new()) != NULL); + assert((entry = archive_entry_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + +#ifdef ARCHIVE_HAS_MD5 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) == 0); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) == 0); +#endif + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) == 0); + +#ifdef ARCHIVE_HAS_SHA512 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) == 0); +#endif + archive_entry_free(entry); +#else + skipping("This platform does not support SHA384"); + return; +#endif +} + +DEFINE_TEST(test_write_format_mtree_digests_sha384_digest_set_empty_data) +{ +#ifdef ARCHIVE_HAS_SHA384 + char buff[4096] = {0}; + size_t used = 0; + struct archive *a; + struct archive_entry *entry; + struct expected_digests ed; + + memcpy(ed.sha384, (unsigned char[]) { + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed + }, sizeof(ed.sha384)); + +#ifdef ARCHIVE_HAS_MD5 + assertEqualInt(ARCHIVE_OK, archive_md5_init(&expectedMd5Ctx)); + assertEqualInt(ARCHIVE_OK, archive_md5_update(&expectedMd5Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_md5_final(&expectedMd5Ctx, ed.md5)); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assertEqualInt(ARCHIVE_OK, archive_rmd160_init(&expectedRmd160Ctx)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_update(&expectedRmd160Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_final(&expectedRmd160Ctx, ed.rmd160)); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assertEqualInt(ARCHIVE_OK, archive_sha1_init(&expectedSha1Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha1_update(&expectedSha1Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha1_final(&expectedSha1Ctx, ed.sha1)); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assertEqualInt(ARCHIVE_OK, archive_sha256_init(&expectedSha256Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha256_update(&expectedSha256Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha256_final(&expectedSha256Ctx, ed.sha256)); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assertEqualInt(ARCHIVE_OK, archive_sha512_init(&expectedSha512Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha512_update(&expectedSha512Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha512_final(&expectedSha512Ctx, ed.sha512)); +#endif + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_mtree(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "all")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff) - 1, &used)); + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, "test.data"); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_size(entry, 4); + archive_entry_set_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384, ed.sha384); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + archive_write_data(a, "", 0); + archive_entry_free(entry); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a)); + + assert((a = archive_read_new()) != NULL); + assert((entry = archive_entry_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + +#ifdef ARCHIVE_HAS_MD5 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) == 0); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) == 0); +#endif + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) != 0); + + assertEqualInt(ARCHIVE_OK, archive_sha384_init(&expectedSha384Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha384_update(&expectedSha384Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha384_final(&expectedSha384Ctx, ed.sha384)); + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) == 0); + +#ifdef ARCHIVE_HAS_SHA512 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) == 0); +#endif + archive_entry_free(entry); +#else + skipping("This platform does not support SHA384"); + return; +#endif +} + +DEFINE_TEST(test_write_format_mtree_digests_sha384_digest_set_non_empty_data) +{ +#ifdef ARCHIVE_HAS_SHA384 + char buff[4096] = {0}; + size_t used = 0; + struct archive *a; + struct archive_entry *entry; + struct expected_digests ed; + + memcpy(ed.sha384, (unsigned char[]) { + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed + }, sizeof(ed.sha384)); + +#ifdef ARCHIVE_HAS_MD5 + assertEqualInt(ARCHIVE_OK, archive_md5_init(&expectedMd5Ctx)); + assertEqualInt(ARCHIVE_OK, archive_md5_update(&expectedMd5Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_md5_final(&expectedMd5Ctx, ed.md5)); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assertEqualInt(ARCHIVE_OK, archive_rmd160_init(&expectedRmd160Ctx)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_update(&expectedRmd160Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_final(&expectedRmd160Ctx, ed.rmd160)); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assertEqualInt(ARCHIVE_OK, archive_sha1_init(&expectedSha1Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha1_update(&expectedSha1Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha1_final(&expectedSha1Ctx, ed.sha1)); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assertEqualInt(ARCHIVE_OK, archive_sha256_init(&expectedSha256Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha256_update(&expectedSha256Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha256_final(&expectedSha256Ctx, ed.sha256)); +#endif + +#ifdef ARCHIVE_HAS_SHA512 + assertEqualInt(ARCHIVE_OK, archive_sha512_init(&expectedSha512Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha512_update(&expectedSha512Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha512_final(&expectedSha512Ctx, ed.sha512)); +#endif + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_mtree(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "all")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff) - 1, &used)); + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, "test.data"); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_size(entry, 4); + archive_entry_set_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384, ed.sha384); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + archive_write_data(a, "abcd", 4); + archive_entry_free(entry); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a)); + + assert((a = archive_read_new()) != NULL); + assert((entry = archive_entry_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + +#ifdef ARCHIVE_HAS_MD5 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) == 0); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) == 0); +#endif + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) != 0); + + assertEqualInt(ARCHIVE_OK, archive_sha384_init(&expectedSha384Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha384_update(&expectedSha384Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha384_final(&expectedSha384Ctx, ed.sha384)); + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) == 0); + +#ifdef ARCHIVE_HAS_SHA512 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) == 0); +#endif + archive_entry_free(entry); +#else + skipping("This platform does not support SHA384"); + return; +#endif +} + +DEFINE_TEST(test_write_format_mtree_digests_sha512_digest_set_no_data) +{ +#ifdef ARCHIVE_HAS_SHA512 + char buff[4096] = {0}; + size_t used = 0; + struct archive *a; + struct archive_entry *entry; + struct expected_digests ed; + + memcpy(ed.sha512, (unsigned char[]) { + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed + }, sizeof(ed.sha512)); + +#ifdef ARCHIVE_HAS_MD5 + assertEqualInt(ARCHIVE_OK, archive_md5_init(&expectedMd5Ctx)); + assertEqualInt(ARCHIVE_OK, archive_md5_update(&expectedMd5Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_md5_final(&expectedMd5Ctx, ed.md5)); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assertEqualInt(ARCHIVE_OK, archive_rmd160_init(&expectedRmd160Ctx)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_update(&expectedRmd160Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_final(&expectedRmd160Ctx, ed.rmd160)); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assertEqualInt(ARCHIVE_OK, archive_sha1_init(&expectedSha1Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha1_update(&expectedSha1Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha1_final(&expectedSha1Ctx, ed.sha1)); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assertEqualInt(ARCHIVE_OK, archive_sha256_init(&expectedSha256Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha256_update(&expectedSha256Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha256_final(&expectedSha256Ctx, ed.sha256)); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assertEqualInt(ARCHIVE_OK, archive_sha384_init(&expectedSha384Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha384_update(&expectedSha384Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha384_final(&expectedSha384Ctx, ed.sha384)); +#endif + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_mtree(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "all")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff) - 1, &used)); + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, "test.data"); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_size(entry, 4); + archive_entry_set_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512, ed.sha512); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + archive_entry_free(entry); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a)); + + assert((a = archive_read_new()) != NULL); + assert((entry = archive_entry_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + +#ifdef ARCHIVE_HAS_MD5 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) == 0); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) == 0); +#endif + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) == 0); + + archive_entry_free(entry); +#else + skipping("This platform does not support SHA512"); + return; +#endif +} + +DEFINE_TEST(test_write_format_mtree_digests_sha512_digest_set_empty_data) +{ +#ifdef ARCHIVE_HAS_SHA512 + char buff[4096] = {0}; + size_t used = 0; + struct archive *a; + struct archive_entry *entry; + struct expected_digests ed; + + memcpy(ed.sha512, (unsigned char[]) { + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed + }, sizeof(ed.sha512)); + +#ifdef ARCHIVE_HAS_MD5 + assertEqualInt(ARCHIVE_OK, archive_md5_init(&expectedMd5Ctx)); + assertEqualInt(ARCHIVE_OK, archive_md5_update(&expectedMd5Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_md5_final(&expectedMd5Ctx, ed.md5)); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assertEqualInt(ARCHIVE_OK, archive_rmd160_init(&expectedRmd160Ctx)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_update(&expectedRmd160Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_final(&expectedRmd160Ctx, ed.rmd160)); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assertEqualInt(ARCHIVE_OK, archive_sha1_init(&expectedSha1Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha1_update(&expectedSha1Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha1_final(&expectedSha1Ctx, ed.sha1)); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assertEqualInt(ARCHIVE_OK, archive_sha256_init(&expectedSha256Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha256_update(&expectedSha256Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha256_final(&expectedSha256Ctx, ed.sha256)); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assertEqualInt(ARCHIVE_OK, archive_sha384_init(&expectedSha384Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha384_update(&expectedSha384Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha384_final(&expectedSha384Ctx, ed.sha384)); +#endif + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_mtree(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "all")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff) - 1, &used)); + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, "test.data"); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_size(entry, 4); + archive_entry_set_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512, ed.sha512); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + archive_write_data(a, "", 0); + archive_entry_free(entry); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a)); + + assert((a = archive_read_new()) != NULL); + assert((entry = archive_entry_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + +#ifdef ARCHIVE_HAS_MD5 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) == 0); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) == 0); +#endif + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) != 0); + + assertEqualInt(ARCHIVE_OK, archive_sha512_init(&expectedSha512Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha512_update(&expectedSha512Ctx, "", 0)); + assertEqualInt(ARCHIVE_OK, archive_sha512_final(&expectedSha512Ctx, ed.sha512)); + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) == 0); + + archive_entry_free(entry); +#else + skipping("This platform does not support SHA512"); + return; +#endif +} + +DEFINE_TEST(test_write_format_mtree_digests_sha512_digest_set_non_empty_data) +{ +#ifdef ARCHIVE_HAS_SHA512 + char buff[4096] = {0}; + size_t used = 0; + struct archive *a; + struct archive_entry *entry; + struct expected_digests ed; + + memcpy(ed.sha512, (unsigned char[]) { + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xed, + 0xfe, 0xed, 0xfe, 0xed + }, sizeof(ed.sha512)); + +#ifdef ARCHIVE_HAS_MD5 + assertEqualInt(ARCHIVE_OK, archive_md5_init(&expectedMd5Ctx)); + assertEqualInt(ARCHIVE_OK, archive_md5_update(&expectedMd5Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_md5_final(&expectedMd5Ctx, ed.md5)); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assertEqualInt(ARCHIVE_OK, archive_rmd160_init(&expectedRmd160Ctx)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_update(&expectedRmd160Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_rmd160_final(&expectedRmd160Ctx, ed.rmd160)); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assertEqualInt(ARCHIVE_OK, archive_sha1_init(&expectedSha1Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha1_update(&expectedSha1Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha1_final(&expectedSha1Ctx, ed.sha1)); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assertEqualInt(ARCHIVE_OK, archive_sha256_init(&expectedSha256Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha256_update(&expectedSha256Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha256_final(&expectedSha256Ctx, ed.sha256)); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assertEqualInt(ARCHIVE_OK, archive_sha384_init(&expectedSha384Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha384_update(&expectedSha384Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha384_final(&expectedSha384Ctx, ed.sha384)); +#endif + + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_mtree(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "all")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff) - 1, &used)); + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, "test.data"); + archive_entry_set_filetype(entry, AE_IFREG); + archive_entry_set_size(entry, 4); + archive_entry_set_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512, ed.sha512); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, entry)); + archive_write_data(a, "abcd", 4); + archive_entry_free(entry); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a)); + + assert((a = archive_read_new()) != NULL); + assert((entry = archive_entry_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, buff, used)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &entry)); + +#ifdef ARCHIVE_HAS_MD5 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_MD5), ed.md5, sizeof(ed.md5)) == 0); +#endif + +#ifdef ARCHIVE_HAS_RMD160 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_RMD160), ed.rmd160, sizeof(ed.rmd160)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA1 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA1), ed.sha1, sizeof(ed.sha1)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA256 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA256), ed.sha256, sizeof(ed.sha256)) == 0); +#endif + +#ifdef ARCHIVE_HAS_SHA384 + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA384), ed.sha384, sizeof(ed.sha384)) == 0); +#endif + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) != 0); + + assertEqualInt(ARCHIVE_OK, archive_sha512_init(&expectedSha512Ctx)); + assertEqualInt(ARCHIVE_OK, archive_sha512_update(&expectedSha512Ctx, "abcd", 4)); + assertEqualInt(ARCHIVE_OK, archive_sha512_final(&expectedSha512Ctx, ed.sha512)); + + assert(memcmp(archive_entry_digest(entry, ARCHIVE_ENTRY_DIGEST_SHA512), ed.sha512, sizeof(ed.sha512)) == 0); + + archive_entry_free(entry); +#else + skipping("This platform does not support SHA512"); + return; +#endif +} --- contrib/libarchive/libarchive/test/test_write_format_tar_sparse.c.orig +++ contrib/libarchive/libarchive/test/test_write_format_tar_sparse.c @@ -38,7 +38,7 @@ char *buff2; size_t buff2_size = 0x13000; char buff3[1024]; - long i; + unsigned long i; assert((buff2 = malloc(buff2_size)) != NULL); /* Repeat the following for a variety of odd blocksizes. */ @@ -181,7 +181,7 @@ char *buff2; size_t buff2_size = 0x11000; char buff3[1024]; - long i; + unsigned long i; assert((buff2 = malloc(buff2_size)) != NULL); /* Create a new archive in memory. */ --- contrib/libarchive/libarchive/test/test_write_format_xar.c.orig +++ contrib/libarchive/libarchive/test/test_write_format_xar.c @@ -25,6 +25,8 @@ */ #include "test.h" +#include + static void test_xar(const char *option) { @@ -146,6 +148,20 @@ assertEqualIntA(a, ARCHIVE_FAILED, archive_write_header(a, ae)); archive_entry_free(ae); + /* + * "dir/file{UNICODE}" has a name that requires base64 encoding + */ + assert((ae = archive_entry_new()) != NULL); + archive_entry_set_atime(ae, 2, 20); + archive_entry_set_ctime(ae, 4, 40); + archive_entry_set_mtime(ae, 5, 50); + archive_entry_copy_pathname_w(ae, L"dir/file\U0001F574"); + archive_entry_set_mode(ae, AE_IFREG | 0755); + archive_entry_set_size(ae, 8); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + archive_entry_free(ae); + assertEqualIntA(a, 8, archive_write_data(a, "ghijklmn", 9)); + /* * XXX TODO XXX Archive directory, other file types. * Archive extended attributes, ACLs, other metadata. @@ -261,6 +277,22 @@ assertEqualString("dir/dir3", archive_entry_pathname(ae)); assert((AE_IFDIR | 0755) == archive_entry_mode(ae)); + /* + * Read "dir/file{UNICODE}" + */ + assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); + assertEqualInt(2, archive_entry_atime(ae)); + assertEqualInt(0, archive_entry_atime_nsec(ae)); + assertEqualInt(4, archive_entry_ctime(ae)); + assertEqualInt(0, archive_entry_ctime_nsec(ae)); + assertEqualInt(5, archive_entry_mtime(ae)); + assertEqualInt(0, archive_entry_mtime_nsec(ae)); + assertEqualWString(L"dir/file\U0001F574", archive_entry_pathname_w(ae)); + assert((AE_IFREG | 0755) == archive_entry_mode(ae)); + assertEqualInt(8, archive_entry_size(ae)); + assertEqualIntA(a, 8, archive_read_data(a, buff2, 10)); + assertEqualMem(buff2, "ghijklmn", 8); + /* * Verify the end of the archive. */ @@ -273,6 +305,13 @@ DEFINE_TEST(test_write_format_xar) { + /* xar mandates the use of UTF-8 XML; if we cannot + * use UTF-8, perhaps we should not write xar. */ + if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) { + skipping("en_US.UTF-8 locale not available on this system."); + return; + } + /* Default mode. */ test_xar(NULL); --- contrib/libarchive/libarchive/test/test_write_format_zip64_stream.c.orig +++ contrib/libarchive/libarchive/test/test_write_format_zip64_stream.c @@ -31,40 +31,6 @@ * written in streaming mode with Zip64 extensions enabled. */ -static unsigned long -bitcrc32(unsigned long c, void *_p, size_t s) -{ - /* This is a drop-in replacement for crc32() from zlib. - * Libarchive should be able to correctly generate - * uncompressed zip archives (including correct CRCs) even - * when zlib is unavailable, and this function helps us verify - * that. Yes, this is very, very slow and unsuitable for - * production use, but it's correct, compact, and works well - * enough for this particular usage. Libarchive internally - * uses a much more efficient implementation. */ - const unsigned char *p = _p; - int bitctr; - - if (p == NULL) - return (0); - - for (; s > 0; --s) { - c ^= *p++; - for (bitctr = 8; bitctr > 0; --bitctr) { - if (c & 1) c = (c >> 1); - else c = (c >> 1) ^ 0xedb88320; - c ^= 0x80000000; - } - } - return (c); -} - -/* Quick and dirty: Read 2-byte and 4-byte integers from Zip file. */ -static unsigned i2(const unsigned char *p) { return ((p[0] & 0xff) | ((p[1] & 0xff) << 8)); } -static unsigned i4(const unsigned char *p) { return (i2(p) | (i2(p + 2) << 16)); } -/* We're only working with small values here; ignore the 4 high bytes. */ -static unsigned i8(const unsigned char *p) { return (i4(p)); } - DEFINE_TEST(test_write_format_zip64_stream) { struct archive *a; @@ -72,7 +38,7 @@ size_t used, buffsize = 1000000; unsigned long crc; unsigned long compressed_size = 0; - int file_perm = 00644; + __LA_MODE_T file_perm = 00644; int zip_version = 45; int zip_compression = 8; short file_uid = 10, file_gid = 20; @@ -119,54 +85,54 @@ failure("End-of-central-directory begins with PK\\005\\006 signature"); assertEqualMem(p, "PK\005\006", 4); failure("This must be disk 0"); - assertEqualInt(i2(p + 4), 0); + assertEqualInt(i2le(p + 4), 0); failure("Central dir must start on disk 0"); - assertEqualInt(i2(p + 6), 0); + assertEqualInt(i2le(p + 6), 0); failure("All central dir entries are on this disk"); - assertEqualInt(i2(p + 8), i2(p + 10)); - eocd = buff + i4(p + 12) + i4(p + 16); + assertEqualInt(i2le(p + 8), i2le(p + 10)); + eocd = buff + i4le(p + 12) + i4le(p + 16); failure("no zip comment"); - assertEqualInt(i2(p + 20), 0); + assertEqualInt(i2le(p + 20), 0); /* Get address of first entry in central directory. */ - central_header = p = buff + i4(buffend - 6); - failure("Central file record at offset %d should begin with" + central_header = p = buff + i4le(buffend - 6); + failure("Central file record at offset %u should begin with" " PK\\001\\002 signature", - i4(buffend - 10)); + i4le(buffend - 10)); /* Verify file entry in central directory. */ assertEqualMem(p, "PK\001\002", 4); /* Signature */ - assertEqualInt(i2(p + 4), 3 * 256 + zip_version); /* Version made by */ - assertEqualInt(i2(p + 6), zip_version); /* Version needed to extract */ - assertEqualInt(i2(p + 8), 8); /* Flags */ - assertEqualInt(i2(p + 10), zip_compression); /* Compression method */ - assertEqualInt(i2(p + 12), 0); /* File time */ - assertEqualInt(i2(p + 14), 33); /* File date */ + assertEqualInt(i2le(p + 4), 3 * 256 + zip_version); /* Version made by */ + assertEqualInt(i2le(p + 6), zip_version); /* Version needed to extract */ + assertEqualInt(i2le(p + 8), 8); /* Flags */ + assertEqualInt(i2le(p + 10), zip_compression); /* Compression method */ + assertEqualInt(i2le(p + 12), 0); /* File time */ + assertEqualInt(i2le(p + 14), 33); /* File date */ crc = bitcrc32(0, file_data, sizeof(file_data)); - assertEqualInt(i4(p + 16), crc); /* CRC-32 */ - compressed_size = i4(p + 20); /* Compressed size */ - assertEqualInt(i4(p + 24), sizeof(file_data)); /* Uncompressed size */ - assertEqualInt(i2(p + 28), strlen(file_name)); /* Pathname length */ - /* assertEqualInt(i2(p + 30), 28); */ /* Extra field length: See below */ - assertEqualInt(i2(p + 32), 0); /* File comment length */ - assertEqualInt(i2(p + 34), 0); /* Disk number start */ - assertEqualInt(i2(p + 36), 0); /* Internal file attrs */ - assertEqualInt(i4(p + 38) >> 16 & 01777, file_perm); /* External file attrs */ - assertEqualInt(i4(p + 42), 0); /* Offset of local header */ + assertEqualInt(i4le(p + 16), crc); /* CRC-32 */ + compressed_size = i4le(p + 20); /* Compressed size */ + assertEqualInt(i4le(p + 24), sizeof(file_data)); /* Uncompressed size */ + assertEqualInt(i2le(p + 28), strlen(file_name)); /* Pathname length */ + /* assertEqualInt(i2le(p + 30), 28); */ /* Extra field length: See below */ + assertEqualInt(i2le(p + 32), 0); /* File comment length */ + assertEqualInt(i2le(p + 34), 0); /* Disk number start */ + assertEqualInt(i2le(p + 36), 0); /* Internal file attrs */ + assertEqualInt(i4le(p + 38) >> 16 & 01777, file_perm); /* External file attrs */ + assertEqualInt(i4le(p + 42), 0); /* Offset of local header */ assertEqualMem(p + 46, file_name, strlen(file_name)); /* Pathname */ p = extension_start = central_header + 46 + strlen(file_name); - extension_end = extension_start + i2(central_header + 30); + extension_end = extension_start + i2le(central_header + 30); - assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ - assertEqualInt(i2(p + 2), 11); /* 'ux' size */ + assertEqualInt(i2le(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(p + 2), 11); /* 'ux' size */ /* TODO: verify 'ux' contents */ - p += 4 + i2(p + 2); + p += 4 + i2le(p + 2); - assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(i2le(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(p + 2), 5); /* 'UT' size */ assertEqualInt(p[4], 1); /* 'UT' flags */ - assertEqualInt(i4(p + 5), 0); /* 'UT' mtime */ - p += 4 + i2(p + 2); + assertEqualInt(i4le(p + 5), 0); /* 'UT' mtime */ + p += 4 + i2le(p + 2); /* Note: We don't expect to see zip64 extension in the central * directory, since the writer knows the actual full size by @@ -176,9 +142,9 @@ /* Just in case: Report any extra extensions. */ while (p < extension_end) { - failure("Unexpected extension 0x%04X", i2(p)); + failure("Unexpected extension 0x%04X", i2le(p)); assert(0); - p += 4 + i2(p + 2); + p += 4 + i2le(p + 2); } /* Should have run exactly to end of extra data. */ @@ -188,21 +154,21 @@ /* After Central dir, we find Zip64 eocd and Zip64 eocd locator. */ assertEqualMem(p, "PK\006\006", 4); /* Zip64 eocd */ - assertEqualInt(i8(p + 4), 44); /* We're using v1 Zip64 eocd */ - assertEqualInt(i2(p + 12), 45); /* Written by Version 4.5 */ - assertEqualInt(i2(p + 14), 45); /* Needs version 4.5 to extract */ - assertEqualInt(i4(p + 16), 0); /* This is disk #0 */ - assertEqualInt(i4(p + 20), 0); /* Dir starts on disk #0 */ - assertEqualInt(i8(p + 24), 1); /* 1 entry on this disk */ - assertEqualInt(i8(p + 32), 1); /* 1 entry total */ - assertEqualInt(i8(p + 40), eocd - central_header); /* size of cd */ - assertEqualInt(i8(p + 48), central_header - buff); /* start of cd */ - p += 12 + i8(p + 4); + assertEqualInt(i8le(p + 4), 44); /* We're using v1 Zip64 eocd */ + assertEqualInt(i2le(p + 12), 45); /* Written by Version 4.5 */ + assertEqualInt(i2le(p + 14), 45); /* Needs version 4.5 to extract */ + assertEqualInt(i4le(p + 16), 0); /* This is disk #0 */ + assertEqualInt(i4le(p + 20), 0); /* Dir starts on disk #0 */ + assertEqualInt(i8le(p + 24), 1); /* 1 entry on this disk */ + assertEqualInt(i8le(p + 32), 1); /* 1 entry total */ + assertEqualInt(i8le(p + 40), eocd - central_header); /* size of cd */ + assertEqualInt(i8le(p + 48), central_header - buff); /* start of cd */ + p += 12 + i8le(p + 4); assertEqualMem(p, "PK\006\007", 4); /* Zip64 eocd locator */ - assertEqualInt(i4(p + 4), 0); /* Zip64 eocd is on disk #0 */ - assertEqualInt(i8(p + 8), eocd - buff); /* Offset of Zip64 eocd */ - assertEqualInt(i4(p + 16), 1); /* 1 disk */ + assertEqualInt(i4le(p + 4), 0); /* Zip64 eocd is on disk #0 */ + assertEqualInt(i8le(p + 8), eocd - buff); /* Offset of Zip64 eocd */ + assertEqualInt(i4le(p + 16), 1); /* 1 disk */ p += 20; /* Regular EOCD immediately follows Zip64 records. */ @@ -211,48 +177,48 @@ /* Verify local header of file entry. */ p = local_header = buff; assertEqualMem(p, "PK\003\004", 4); /* Signature */ - assertEqualInt(i2(p + 4), zip_version); /* Version needed to extract */ - assertEqualInt(i2(p + 6), 8); /* Flags: bit 3 = length-at-end */ - assertEqualInt(i2(p + 8), zip_compression); /* Compression method */ - assertEqualInt(i2(p + 10), 0); /* File time */ - assertEqualInt(i2(p + 12), 33); /* File date */ - assertEqualInt(i4(p + 14), 0); /* CRC-32 */ - assertEqualInt(i4(p + 18), 0); /* Compressed size must be zero for length-at-end */ - assertEqualInt(i4(p + 22), 0); /* Uncompressed size must be zero for length-at-end */ - assertEqualInt(i2(p + 26), strlen(file_name)); /* Pathname length */ - assertEqualInt(i2(p + 28), 37); /* Extra field length */ + assertEqualInt(i2le(p + 4), zip_version); /* Version needed to extract */ + assertEqualInt(i2le(p + 6), 8); /* Flags: bit 3 = length-at-end */ + assertEqualInt(i2le(p + 8), zip_compression); /* Compression method */ + assertEqualInt(i2le(p + 10), 0); /* File time */ + assertEqualInt(i2le(p + 12), 33); /* File date */ + assertEqualInt(i4le(p + 14), 0); /* CRC-32 */ + assertEqualInt(i4le(p + 18), 0); /* Compressed size must be zero for length-at-end */ + assertEqualInt(i4le(p + 22), 0); /* Uncompressed size must be zero for length-at-end */ + assertEqualInt(i2le(p + 26), strlen(file_name)); /* Pathname length */ + assertEqualInt(i2le(p + 28), 37); /* Extra field length */ assertEqualMem(p + 30, file_name, strlen(file_name)); /* Pathname */ p = extension_start = local_header + 30 + strlen(file_name); - extension_end = extension_start + i2(local_header + 28); + extension_end = extension_start + i2le(local_header + 28); - assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ - assertEqualInt(i2(p + 2), 11); /* 'ux' size */ + assertEqualInt(i2le(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(p + 2), 11); /* 'ux' size */ assertEqualInt(p[4], 1); /* 'ux' version */ assertEqualInt(p[5], 4); /* 'ux' uid size */ - assertEqualInt(i4(p + 6), file_uid); /* 'Ux' UID */ + assertEqualInt(i4le(p + 6), file_uid); /* 'Ux' UID */ assertEqualInt(p[10], 4); /* 'ux' gid size */ - assertEqualInt(i4(p + 11), file_gid); /* 'Ux' GID */ - p += 4 + i2(p + 2); + assertEqualInt(i4le(p + 11), file_gid); /* 'Ux' GID */ + p += 4 + i2le(p + 2); - assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(i2le(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(p + 2), 5); /* 'UT' size */ assertEqualInt(p[4], 1); /* 'UT' flags */ - assertEqualInt(i4(p + 5), 0); /* 'UT' mtime */ - p += 4 + i2(p + 2); + assertEqualInt(i4le(p + 5), 0); /* 'UT' mtime */ + p += 4 + i2le(p + 2); - assertEqualInt(i2(p), 0x6c78); /* 'xl' experimental extension header */ - assertEqualInt(i2(p + 2), 9); /* size */ + assertEqualInt(i2le(p), 0x6c78); /* 'xl' experimental extension header */ + assertEqualInt(i2le(p + 2), 9); /* size */ assertEqualInt(p[4], 7); /* bitmap of included fields */ - assertEqualInt(i2(p + 5) >> 8, 3); /* system & version made by */ - assertEqualInt(i2(p + 7), 0); /* internal file attributes */ - assertEqualInt(i4(p + 9) >> 16 & 01777, file_perm); /* external file attributes */ - p += 4 + i2(p + 2); + assertEqualInt(i2le(p + 5) >> 8, 3); /* system & version made by */ + assertEqualInt(i2le(p + 7), 0); /* internal file attributes */ + assertEqualInt(i4le(p + 9) >> 16 & 01777, file_perm); /* external file attributes */ + p += 4 + i2le(p + 2); /* Just in case: Report any extra extensions. */ while (p < extension_end) { - failure("Unexpected extension 0x%04X", i2(p)); + failure("Unexpected extension 0x%04X", i2le(p)); assert(0); - p += 4 + i2(p + 2); + p += 4 + i2le(p + 2); } /* Should have run exactly to end of extra data. */ @@ -265,9 +231,9 @@ data_end = p; assertEqualInt(data_end - data_start, compressed_size); assertEqualMem(p, "PK\007\010", 4); - assertEqualInt(i4(p + 4), crc); /* CRC-32 */ - assertEqualInt(i8(p + 8), compressed_size); /* compressed size */ - assertEqualInt(i8(p + 16), sizeof(file_data)); /* uncompressed size */ + assertEqualInt(i4le(p + 4), crc); /* CRC-32 */ + assertEqualInt(i8le(p + 8), compressed_size); /* compressed size */ + assertEqualInt(i8le(p + 16), sizeof(file_data)); /* uncompressed size */ /* Central directory should immediately follow the only entry. */ assertEqualAddress(p + 24, central_header); --- /dev/null +++ contrib/libarchive/libarchive/test/test_write_format_zip_compression_bzip2.c @@ -0,0 +1,362 @@ +/*-SPDX-License-Identifier: BSD-2-Clause + * Copyright (c) 2024 ARJANEN Loïc Jean David + * All rights reserved. + */ + +#include "test.h" +#ifdef HAVE_BZLIB_H +#include + +/* File data */ +static const char file_name[] = "file"; +static const char file_data1[] = {'1', '2', '3', '4', '5', '6', '7', '8'}; +static const char file_data2[] = {'9', '0', 'A', 'B', 'C', 'D', 'E', 'F'}; +static const int file_perm = 00644; +static const short file_uid = 10; +static const short file_gid = 20; + +/* Folder data */ +static const char folder_name[] = "folder/"; +static const int folder_perm = 00755; +static const short folder_uid = 30; +static const short folder_gid = 40; + +static time_t now; + +static void verify_write_bzip2(struct archive *a) +{ + struct archive_entry *entry; + + /* Write entries. */ + + /* Regular file */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, file_name); + archive_entry_set_mode(entry, S_IFREG | 0644); + archive_entry_set_size(entry, sizeof(file_data1) + sizeof(file_data2)); + archive_entry_set_uid(entry, file_uid); + archive_entry_set_gid(entry, file_gid); + archive_entry_set_mtime(entry, now, 0); + archive_entry_set_atime(entry, now + 3, 0); + assertEqualIntA(a, 0, archive_write_header(a, entry)); + assertEqualIntA(a, sizeof(file_data1), archive_write_data(a, file_data1, sizeof(file_data1))); + assertEqualIntA(a, sizeof(file_data2), archive_write_data(a, file_data2, sizeof(file_data2))); + archive_entry_free(entry); + + /* Folder */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, folder_name); + archive_entry_set_mode(entry, S_IFDIR | folder_perm); + archive_entry_set_size(entry, 0); + archive_entry_set_uid(entry, folder_uid); + archive_entry_set_gid(entry, folder_gid); + archive_entry_set_mtime(entry, now, 0); + archive_entry_set_ctime(entry, now + 5, 0); + assertEqualIntA(a, 0, archive_write_header(a, entry)); + archive_entry_free(entry); +} + +static void verify_bzip2_contents(const char *buff, size_t used) +{ + const char *buffend; + struct archive* zip_archive; + struct archive_entry *ae; + char filedata[sizeof(file_data1) + sizeof(file_data2)]; + /* Misc variables */ + unsigned long crc; + struct tm *tm; +#if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S) + struct tm tmbuf; +#endif + /* p is the pointer to walk over the central directory, + * q walks over the local headers, the data and the data descriptors. */ + const char *p, *q, *local_header, *extra_start; + +#if defined(HAVE_LOCALTIME_S) + tm = localtime_s(&tmbuf, &now) ? NULL : &tmbuf; +#elif defined(HAVE_LOCALTIME_R) + tm = localtime_r(&now, &tmbuf); +#else + tm = localtime(&now); +#endif + + /* Open archive from memory, we'll need it for checking the file + * value */ + assert((zip_archive = archive_read_new()) != NULL); + assertEqualIntA(zip_archive, ARCHIVE_OK, archive_read_support_format_zip(zip_archive)); + assertEqualIntA(zip_archive, ARCHIVE_OK, archive_read_support_filter_all(zip_archive)); + assertEqualIntA(zip_archive, ARCHIVE_OK, archive_read_open_memory(zip_archive, buff, used)); + + /* Remember the end of the archive in memory. */ + buffend = buff + used; + + /* Verify "End of Central Directory" record. */ + /* Get address of end-of-central-directory record. */ + p = buffend - 22; /* Assumes there is no zip comment field. */ + failure("End-of-central-directory begins with PK\\005\\006 signature"); + assertEqualMem(p, "PK\005\006", 4); + failure("This must be disk 0"); + assertEqualInt(i2le(p + 4), 0); + failure("Central dir must start on disk 0"); + assertEqualInt(i2le(p + 6), 0); + failure("All central dir entries are on this disk"); + assertEqualInt(i2le(p + 8), i2le(p + 10)); + failure("CD start (%u) + CD length (%u) should == archive size - 22", + i4le(p + 12), i4le(p + 16)); + assertEqualInt(i4le(p + 12) + i4le(p + 16), used - 22); + failure("no zip comment"); + assertEqualInt(i2le(p + 20), 0); + + /* Get address of first entry in central directory. */ + p = buff + i4le(buffend - 6); + failure("Central file record at offset %u should begin with" + " PK\\001\\002 signature", + i4le(buffend - 10)); + + /* Verify file entry in central directory, except compressed size (offset 20). */ + assertEqualMem(p, "PK\001\002", 4); /* Signature */ + assertEqualInt(i2le(p + 4), 3 * 256 + 46); /* Version made by */ + assertEqualInt(i2le(p + 6), 46); /* Version needed to extract */ + assertEqualInt(i2le(p + 8), 8); /* Flags */ + assertEqualInt(i2le(p + 10), 12); /* Compression method */ + assertEqualInt(i2le(p + 12), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ + assertEqualInt(i2le(p + 14), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ + crc = bitcrc32(0, file_data1, sizeof(file_data1)); + crc = bitcrc32(crc, file_data2, sizeof(file_data2)); + assertEqualInt(i4le(p + 16), crc); /* CRC-32 */ + assertEqualInt(i4le(p + 24), sizeof(file_data1) + sizeof(file_data2)); /* Uncompressed size */ + assertEqualInt(i2le(p + 28), strlen(file_name)); /* Pathname length */ + assertEqualInt(i2le(p + 30), 24); /* Extra field length */ + assertEqualInt(i2le(p + 32), 0); /* File comment length */ + assertEqualInt(i2le(p + 34), 0); /* Disk number start */ + assertEqualInt(i2le(p + 36), 0); /* Internal file attrs */ + assertEqualInt(i4le(p + 38) >> 16 & 01777, file_perm); /* External file attrs */ + assertEqualInt(i4le(p + 42), 0); /* Offset of local header */ + assertEqualMem(p + 46, file_name, strlen(file_name)); /* Pathname */ + p = p + 46 + strlen(file_name); + + assertEqualInt(i2le(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(p + 2), 11); /* 'ux' size */ +/* TODO */ + p = p + 4 + i2le(p + 2); + + assertEqualInt(i2le(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(p + 2), 5); /* 'UT' size */ + assertEqualInt(p[4], 1); /* 'UT' flags */ + assertEqualInt(i4le(p + 5), now); /* 'UT' mtime */ + p = p + 4 + i2le(p + 2); + + /* Verify local header of file entry. */ + local_header = q = buff; + assertEqualMem(q, "PK\003\004", 4); /* Signature */ + assertEqualInt(i2le(q + 4), 46); /* Version needed to extract */ + assertEqualInt(i2le(q + 6), 8); /* Flags: bit 3 = length-at-end (required because CRC32 is unknown) */ + assertEqualInt(i2le(q + 8), 12); /* Compression method */ + assertEqualInt(i2le(q + 10), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ + assertEqualInt(i2le(q + 12), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ + assertEqualInt(i4le(q + 14), 0); /* CRC-32 */ + assertEqualInt(i4le(q + 18), 0); /* Compressed size, must be zero because of length-at-end */ + assertEqualInt(i4le(q + 22), 0); /* Uncompressed size, must be zero because of length-at-end */ + assertEqualInt(i2le(q + 26), strlen(file_name)); /* Pathname length */ + assertEqualInt(i2le(q + 28), 41); /* Extra field length */ + assertEqualMem(q + 30, file_name, strlen(file_name)); /* Pathname */ + extra_start = q = q + 30 + strlen(file_name); + + assertEqualInt(i2le(q), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(q + 2), 11); /* 'ux' size */ + assertEqualInt(q[4], 1); /* 'ux' version */ + assertEqualInt(q[5], 4); /* 'ux' uid size */ + assertEqualInt(i4le(q + 6), file_uid); /* 'Ux' UID */ + assertEqualInt(q[10], 4); /* 'ux' gid size */ + assertEqualInt(i4le(q + 11), file_gid); /* 'Ux' GID */ + q = q + 4 + i2le(q + 2); + + assertEqualInt(i2le(q), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(q + 2), 9); /* 'UT' size */ + assertEqualInt(q[4], 3); /* 'UT' flags */ + assertEqualInt(i4le(q + 5), now); /* 'UT' mtime */ + assertEqualInt(i4le(q + 9), now + 3); /* 'UT' atime */ + q = q + 4 + i2le(q + 2); + + assertEqualInt(i2le(q), 0x6c78); /* 'xl' experimental extension header */ + assertEqualInt(i2le(q + 2), 9); /* size */ + assertEqualInt(q[4], 7); /* Bitmap of fields included. */ + assertEqualInt(i2le(q + 5) >> 8, 3); /* system & version made by */ + assertEqualInt(i2le(q + 7), 0); /* internal file attributes */ + assertEqualInt(i4le(q + 9) >> 16 & 01777, file_perm); /* external file attributes */ + q = q + 4 + i2le(q + 2); + + assert(q == extra_start + i2le(local_header + 28)); + q = extra_start + i2le(local_header + 28); + + /* Verify data of file entry, using our own zip reader to test. */ + assertEqualIntA(zip_archive, ARCHIVE_OK, archive_read_next_header(zip_archive, &ae)); + assertEqualString("file", archive_entry_pathname(ae)); + assertEqualIntA(zip_archive, sizeof(filedata), archive_read_data(zip_archive, filedata, sizeof(filedata))); + assertEqualMem(filedata, file_data1, sizeof(file_data1)); + assertEqualMem(filedata + sizeof(file_data1), file_data2, + sizeof(file_data2)); + + /* Skip data of file entry in q */ + while (q < buffend - 3) { + if (memcmp(q, "PK\007\010", 4) == 0) { + break; + } + q++; + } + + /* Verify data descriptor of file entry, except compressed size (offset 8). */ + assertEqualMem(q, "PK\007\010", 4); /* Signature */ + assertEqualInt(i4le(q + 4), crc); /* CRC-32 */ + assertEqualInt(i4le(q + 12), sizeof(file_data1) + sizeof(file_data2)); /* Uncompressed size */ + q = q + 16; + + /* Verify folder entry in central directory. */ + assertEqualMem(p, "PK\001\002", 4); /* Signature */ + assertEqualInt(i2le(p + 4), 3 * 256 + 20); /* Version made by */ + assertEqualInt(i2le(p + 6), 20); /* Version needed to extract */ + assertEqualInt(i2le(p + 8), 0); /* Flags */ + assertEqualInt(i2le(p + 10), 0); /* Compression method */ + assertEqualInt(i2le(p + 12), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ + assertEqualInt(i2le(p + 14), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ + crc = 0; + assertEqualInt(i4le(p + 16), crc); /* CRC-32 */ + assertEqualInt(i4le(p + 20), 0); /* Compressed size */ + assertEqualInt(i4le(p + 24), 0); /* Uncompressed size */ + assertEqualInt(i2le(p + 28), strlen(folder_name)); /* Pathname length */ + assertEqualInt(i2le(p + 30), 24); /* Extra field length */ + assertEqualInt(i2le(p + 32), 0); /* File comment length */ + assertEqualInt(i2le(p + 34), 0); /* Disk number start */ + assertEqualInt(i2le(p + 36), 0); /* Internal file attrs */ + assertEqualInt(i4le(p + 38) >> 16 & 01777, folder_perm); /* External file attrs */ + assertEqualInt(i4le(p + 42), q - buff); /* Offset of local header */ + assertEqualMem(p + 46, folder_name, strlen(folder_name)); /* Pathname */ + p = p + 46 + strlen(folder_name); + + assertEqualInt(i2le(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(p + 2), 11); /* 'ux' size */ + assertEqualInt(p[4], 1); /* 'ux' version */ + assertEqualInt(p[5], 4); /* 'ux' uid size */ + assertEqualInt(i4le(p + 6), folder_uid); /* 'ux' UID */ + assertEqualInt(p[10], 4); /* 'ux' gid size */ + assertEqualInt(i4le(p + 11), folder_gid); /* 'ux' GID */ + p = p + 4 + i2le(p + 2); + + assertEqualInt(i2le(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(p + 2), 5); /* 'UT' size */ + assertEqualInt(p[4], 1); /* 'UT' flags */ + assertEqualInt(i4le(p + 5), now); /* 'UT' mtime */ + p = p + 4 + i2le(p + 2); + + /* Verify local header of folder entry. */ + local_header = q; + assertEqualMem(q, "PK\003\004", 4); /* Signature */ + assertEqualInt(i2le(q + 4), 20); /* Version needed to extract */ + assertEqualInt(i2le(q + 6), 0); /* Flags */ + assertEqualInt(i2le(q + 8), 0); /* Compression method */ + assertEqualInt(i2le(q + 10), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ + assertEqualInt(i2le(q + 12), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ + assertEqualInt(i4le(q + 14), 0); /* CRC-32 */ + assertEqualInt(i4le(q + 18), 0); /* Compressed size */ + assertEqualInt(i4le(q + 22), 0); /* Uncompressed size */ + assertEqualInt(i2le(q + 26), strlen(folder_name)); /* Pathname length */ + assertEqualInt(i2le(q + 28), 41); /* Extra field length */ + assertEqualMem(q + 30, folder_name, strlen(folder_name)); /* Pathname */ + extra_start = q = q + 30 + strlen(folder_name); + + assertEqualInt(i2le(q), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(q + 2), 11); /* 'ux' size */ + assertEqualInt(q[4], 1); /* 'ux' version */ + assertEqualInt(q[5], 4); /* 'ux' uid size */ + assertEqualInt(i4le(q + 6), folder_uid); /* 'ux' UID */ + assertEqualInt(q[10], 4); /* 'ux' gid size */ + assertEqualInt(i4le(q + 11), folder_gid); /* 'ux' GID */ + q = q + 4 + i2le(q + 2); + + assertEqualInt(i2le(q), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(q + 2), 9); /* 'UT' size */ + assertEqualInt(q[4], 5); /* 'UT' flags */ + assertEqualInt(i4le(q + 5), now); /* 'UT' mtime */ + assertEqualInt(i4le(q + 9), now + 5); /* 'UT' atime */ + q = q + 4 + i2le(q + 2); + + assertEqualInt(i2le(q), 0x6c78); /* 'xl' experimental extension header */ + assertEqualInt(i2le(q + 2), 9); /* size */ + assertEqualInt(q[4], 7); /* bitmap of fields */ + assertEqualInt(i2le(q + 5) >> 8, 3); /* system & version made by */ + assertEqualInt(i2le(q + 7), 0); /* internal file attributes */ + assertEqualInt(i4le(q + 9) >> 16 & 01777, folder_perm); /* external file attributes */ + q = q + 4 + i2le(q + 2); + + assert(q == extra_start + i2le(local_header + 28)); + q = extra_start + i2le(local_header + 28); + + /* There should not be any data in the folder entry, + * so the first central directory entry should be next: */ + assertEqualMem(q, "PK\001\002", 4); /* Signature */ + + /* Close archive, in case. */ + archive_read_free(zip_archive); +} + +#endif /* HAVE_BZLIB_H */ +DEFINE_TEST(test_write_format_zip_compression_bzip2) +{ +#ifndef HAVE_BZLIB_H + skipping("bzip2 is not fully supported on this platform"); +#else /* HAVE_BZLIB_H */ + /* Buffer data */ + struct archive *a; + char buff[100000]; + size_t used; + + /* Time data */ + now = time(NULL); + + /* Create new ZIP archive in memory without padding. */ + /* Use the setter function to use BZIP2 compression. */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_zip_set_compression_bzip2(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:experimental")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_bytes_per_block(a, 1)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_bytes_in_last_block(a, 1)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff), &used)); + + verify_write_bzip2(a); + + /* Close the archive . */ + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_free(a)); + dumpfile("constructed.zip", buff, used); + + verify_bzip2_contents(buff, used); + + /* Create new ZIP archive in memory without padding. */ + /* Use compression-level=3 to check that compression + * levels are somewhat supported. */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:compression=bzip2")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:compression-level=3")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:experimental")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_bytes_per_block(a, 1)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_bytes_in_last_block(a, 1)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff), &used)); + + verify_write_bzip2(a); + + /* Close the archive. */ + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_free(a)); + dumpfile("constructed.zip", buff, used); + + verify_bzip2_contents(buff, used); +#endif /* HAVE_BZLIB_H */ +} --- /dev/null +++ contrib/libarchive/libarchive/test/test_write_format_zip_compression_lzmaxz.c @@ -0,0 +1,425 @@ +/*-SPDX-License-Identifier: BSD-2-Clause + * Copyright (c) 2024 ARJANEN Loïc Jean David + * All rights reserved. + */ + +#include "test.h" +#ifdef HAVE_LZMA_H +#include + +/* File data */ +static const char file_name[] = "file"; +static const char file_data1[] = {'.', ';', ':', '!', '?', ',', '"', '\'', ')', '(', '*'}; +static const char file_data2[] = {'-', '/', '>', '$', '\\', '#', '@', '+', '=', '{', ']', '[', '}', '&', '<', '%'}; +static const int file_perm = 00644; +static const short file_uid = 10; +static const short file_gid = 20; + +/* Folder data */ +static const char folder_name[] = "folder/"; +static const int folder_perm = 00755; +static const short folder_uid = 30; +static const short folder_gid = 40; + +static time_t now; + +static void verify_write_lzma(struct archive *a) +{ + struct archive_entry *entry; + + /* Write entries. */ + + /* Regular file */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, file_name); + archive_entry_set_mode(entry, S_IFREG | 0644); + archive_entry_set_size(entry, sizeof(file_data1) + sizeof(file_data2)); + archive_entry_set_uid(entry, file_uid); + archive_entry_set_gid(entry, file_gid); + archive_entry_set_mtime(entry, now, 0); + archive_entry_set_atime(entry, now + 3, 0); + assertEqualIntA(a, 0, archive_write_header(a, entry)); + assertEqualIntA(a, sizeof(file_data1), archive_write_data(a, file_data1, sizeof(file_data1))); + assertEqualIntA(a, sizeof(file_data2), archive_write_data(a, file_data2, sizeof(file_data2))); + archive_entry_free(entry); + + /* Folder */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, folder_name); + archive_entry_set_mode(entry, S_IFDIR | folder_perm); + archive_entry_set_size(entry, 0); + archive_entry_set_uid(entry, folder_uid); + archive_entry_set_gid(entry, folder_gid); + archive_entry_set_mtime(entry, now, 0); + archive_entry_set_ctime(entry, now + 5, 0); + assertEqualIntA(a, 0, archive_write_header(a, entry)); + archive_entry_free(entry); +} + +static void verify_xz_lzma(const char *buff, size_t used, uint16_t id, + uint16_t flags) +{ + const char *buffend; + struct archive* zip_archive; + struct archive_entry *ae; + char filedata[sizeof(file_data1) + sizeof(file_data2)]; + /* Misc variables */ + unsigned long crc; + struct tm *tm; +#if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S) + struct tm tmbuf; +#endif + /* p is the pointer to walk over the central directory, + * q walks over the local headers, the data and the data descriptors. */ + const char *p, *q, *local_header, *extra_start; + +#if defined(HAVE_LOCALTIME_S) + tm = localtime_s(&tmbuf, &now) ? NULL : &tmbuf; +#elif defined(HAVE_LOCALTIME_R) + tm = localtime_r(&now, &tmbuf); +#else + tm = localtime(&now); +#endif + + /* Open archive from memory, we'll need it for checking the file + * value */ + assert((zip_archive = archive_read_new()) != NULL); + assertEqualIntA(zip_archive, ARCHIVE_OK, archive_read_support_format_all(zip_archive)); + assertEqualIntA(zip_archive, ARCHIVE_OK, archive_read_support_filter_all(zip_archive)); + assertEqualIntA(zip_archive, ARCHIVE_OK, archive_read_open_memory(zip_archive, buff, used)); + + /* Remember the end of the archive in memory. */ + buffend = buff + used; + + /* Verify "End of Central Directory" record. */ + /* Get address of end-of-central-directory record. */ + p = buffend - 22; /* Assumes there is no zip comment field. */ + failure("End-of-central-directory begins with PK\\005\\006 signature"); + assertEqualMem(p, "PK\005\006", 4); + failure("This must be disk 0"); + assertEqualInt(i2le(p + 4), 0); + failure("Central dir must start on disk 0"); + assertEqualInt(i2le(p + 6), 0); + failure("All central dir entries are on this disk"); + assertEqualInt(i2le(p + 8), i2le(p + 10)); + failure("CD start (%u) + CD length (%u) should == archive size - 22", + i4le(p + 12), i4le(p + 16)); + assertEqualInt(i4le(p + 12) + i4le(p + 16), used - 22); + failure("no zip comment"); + assertEqualInt(i2le(p + 20), 0); + + /* Get address of first entry in central directory. */ + p = buff + i4le(buffend - 6); + failure("Central file record at offset %u should begin with" + " PK\\001\\002 signature", + i4le(buffend - 10)); + + /* Verify file entry in central directory, except compressed size (offset 20). */ + assertEqualMem(p, "PK\001\002", 4); /* Signature */ + assertEqualInt(i2le(p + 4), 3 * 256 + 63); /* Version made by */ + assertEqualInt(i2le(p + 6), 63); /* Version needed to extract */ + assertEqualInt(i2le(p + 8), flags); /* Flags */ + assertEqualInt(i2le(p + 10), id); /* Compression method */ + assertEqualInt(i2le(p + 12), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ + assertEqualInt(i2le(p + 14), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ + crc = bitcrc32(0, file_data1, sizeof(file_data1)); + crc = bitcrc32(crc, file_data2, sizeof(file_data2)); + assertEqualInt(i4le(p + 16), crc); /* CRC-32 */ + assertEqualInt(i4le(p + 24), sizeof(file_data1) + sizeof(file_data2)); /* Uncompressed size */ + assertEqualInt(i2le(p + 28), strlen(file_name)); /* Pathname length */ + assertEqualInt(i2le(p + 30), 24); /* Extra field length */ + assertEqualInt(i2le(p + 32), 0); /* File comment length */ + assertEqualInt(i2le(p + 34), 0); /* Disk number start */ + assertEqualInt(i2le(p + 36), 0); /* Internal file attrs */ + assertEqualInt(i4le(p + 38) >> 16 & 01777, file_perm); /* External file attrs */ + assertEqualInt(i4le(p + 42), 0); /* Offset of local header */ + assertEqualMem(p + 46, file_name, strlen(file_name)); /* Pathname */ + p = p + 46 + strlen(file_name); + + assertEqualInt(i2le(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(p + 2), 11); /* 'ux' size */ +/* TODO */ + p = p + 4 + i2le(p + 2); + + assertEqualInt(i2le(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(p + 2), 5); /* 'UT' size */ + assertEqualInt(p[4], 1); /* 'UT' flags */ + assertEqualInt(i4le(p + 5), now); /* 'UT' mtime */ + p = p + 4 + i2le(p + 2); + + /* Verify local header of file entry. */ + local_header = q = buff; + assertEqualMem(q, "PK\003\004", 4); /* Signature */ + assertEqualInt(i2le(q + 4), 63); /* Version needed to extract */ + assertEqualInt(i2le(q + 6), flags); /* Flags: bit 3 = length-at-end (required because CRC32 is unknown) and bit 1 = EOPM (because we always write it) */ + assertEqualInt(i2le(q + 8), id); /* Compression method */ + assertEqualInt(i2le(q + 10), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ + assertEqualInt(i2le(q + 12), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ + assertEqualInt(i4le(q + 14), 0); /* CRC-32 */ + assertEqualInt(i4le(q + 18), 0); /* Compressed size, must be zero because of length-at-end */ + assertEqualInt(i4le(q + 22), 0); /* Uncompressed size, must be zero because of length-at-end */ + assertEqualInt(i2le(q + 26), strlen(file_name)); /* Pathname length */ + assertEqualInt(i2le(q + 28), 41); /* Extra field length */ + assertEqualMem(q + 30, file_name, strlen(file_name)); /* Pathname */ + extra_start = q = q + 30 + strlen(file_name); + + assertEqualInt(i2le(q), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(q + 2), 11); /* 'ux' size */ + assertEqualInt(q[4], 1); /* 'ux' version */ + assertEqualInt(q[5], 4); /* 'ux' uid size */ + assertEqualInt(i4le(q + 6), file_uid); /* 'Ux' UID */ + assertEqualInt(q[10], 4); /* 'ux' gid size */ + assertEqualInt(i4le(q + 11), file_gid); /* 'Ux' GID */ + q = q + 4 + i2le(q + 2); + + assertEqualInt(i2le(q), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(q + 2), 9); /* 'UT' size */ + assertEqualInt(q[4], 3); /* 'UT' flags */ + assertEqualInt(i4le(q + 5), now); /* 'UT' mtime */ + assertEqualInt(i4le(q + 9), now + 3); /* 'UT' atime */ + q = q + 4 + i2le(q + 2); + + assertEqualInt(i2le(q), 0x6c78); /* 'xl' experimental extension header */ + assertEqualInt(i2le(q + 2), 9); /* size */ + assertEqualInt(q[4], 7); /* Bitmap of fields included. */ + assertEqualInt(i2le(q + 5) >> 8, 3); /* system & version made by */ + assertEqualInt(i2le(q + 7), 0); /* internal file attributes */ + assertEqualInt(i4le(q + 9) >> 16 & 01777, file_perm); /* external file attributes */ + q = q + 4 + i2le(q + 2); + + assert(q == extra_start + i2le(local_header + 28)); + q = extra_start + i2le(local_header + 28); + + /* Verify data of file entry, using our own zip reader to test. */ + assertEqualIntA(zip_archive, ARCHIVE_OK, archive_read_next_header(zip_archive, &ae)); + assertEqualString("file", archive_entry_pathname(ae)); + assertEqualIntA(zip_archive, sizeof(filedata), archive_read_data(zip_archive, filedata, sizeof(filedata))); + assertEqualMem(filedata, file_data1, sizeof(file_data1)); + assertEqualMem(filedata + sizeof(file_data1), file_data2, + sizeof(file_data2)); + + /* Skip data of file entry in q */ + while (q < buffend - 3) { + if (memcmp(q, "PK\007\010", 4) == 0) { + break; + } + q++; + } + + /* Verify data descriptor of file entry, except compressed size (offset 8). */ + assertEqualMem(q, "PK\007\010", 4); /* Signature */ + assertEqualInt(i4le(q + 4), crc); /* CRC-32 */ + assertEqualInt(i4le(q + 12), sizeof(file_data1) + sizeof(file_data2)); /* Uncompressed size */ + q = q + 16; + + /* Verify folder entry in central directory. */ + assertEqualMem(p, "PK\001\002", 4); /* Signature */ + assertEqualInt(i2le(p + 4), 3 * 256 + 20); /* Version made by */ + assertEqualInt(i2le(p + 6), 20); /* Version needed to extract */ + assertEqualInt(i2le(p + 8), 0); /* Flags */ + assertEqualInt(i2le(p + 10), 0); /* Compression method */ + assertEqualInt(i2le(p + 12), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ + assertEqualInt(i2le(p + 14), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ + crc = 0; + assertEqualInt(i4le(p + 16), crc); /* CRC-32 */ + assertEqualInt(i4le(p + 20), 0); /* Compressed size */ + assertEqualInt(i4le(p + 24), 0); /* Uncompressed size */ + assertEqualInt(i2le(p + 28), strlen(folder_name)); /* Pathname length */ + assertEqualInt(i2le(p + 30), 24); /* Extra field length */ + assertEqualInt(i2le(p + 32), 0); /* File comment length */ + assertEqualInt(i2le(p + 34), 0); /* Disk number start */ + assertEqualInt(i2le(p + 36), 0); /* Internal file attrs */ + assertEqualInt(i4le(p + 38) >> 16 & 01777, folder_perm); /* External file attrs */ + assertEqualInt(i4le(p + 42), q - buff); /* Offset of local header */ + assertEqualMem(p + 46, folder_name, strlen(folder_name)); /* Pathname */ + p = p + 46 + strlen(folder_name); + + assertEqualInt(i2le(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(p + 2), 11); /* 'ux' size */ + assertEqualInt(p[4], 1); /* 'ux' version */ + assertEqualInt(p[5], 4); /* 'ux' uid size */ + assertEqualInt(i4le(p + 6), folder_uid); /* 'ux' UID */ + assertEqualInt(p[10], 4); /* 'ux' gid size */ + assertEqualInt(i4le(p + 11), folder_gid); /* 'ux' GID */ + p = p + 4 + i2le(p + 2); + + assertEqualInt(i2le(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(p + 2), 5); /* 'UT' size */ + assertEqualInt(p[4], 1); /* 'UT' flags */ + assertEqualInt(i4le(p + 5), now); /* 'UT' mtime */ + p = p + 4 + i2le(p + 2); + + /* Verify local header of folder entry. */ + local_header = q; + assertEqualMem(q, "PK\003\004", 4); /* Signature */ + assertEqualInt(i2le(q + 4), 20); /* Version needed to extract */ + assertEqualInt(i2le(q + 6), 0); /* Flags */ + assertEqualInt(i2le(q + 8), 0); /* Compression method */ + assertEqualInt(i2le(q + 10), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ + assertEqualInt(i2le(q + 12), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ + assertEqualInt(i4le(q + 14), 0); /* CRC-32 */ + assertEqualInt(i4le(q + 18), 0); /* Compressed size */ + assertEqualInt(i4le(q + 22), 0); /* Uncompressed size */ + assertEqualInt(i2le(q + 26), strlen(folder_name)); /* Pathname length */ + assertEqualInt(i2le(q + 28), 41); /* Extra field length */ + assertEqualMem(q + 30, folder_name, strlen(folder_name)); /* Pathname */ + extra_start = q = q + 30 + strlen(folder_name); + + assertEqualInt(i2le(q), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(q + 2), 11); /* 'ux' size */ + assertEqualInt(q[4], 1); /* 'ux' version */ + assertEqualInt(q[5], 4); /* 'ux' uid size */ + assertEqualInt(i4le(q + 6), folder_uid); /* 'ux' UID */ + assertEqualInt(q[10], 4); /* 'ux' gid size */ + assertEqualInt(i4le(q + 11), folder_gid); /* 'ux' GID */ + q = q + 4 + i2le(q + 2); + + assertEqualInt(i2le(q), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(q + 2), 9); /* 'UT' size */ + assertEqualInt(q[4], 5); /* 'UT' flags */ + assertEqualInt(i4le(q + 5), now); /* 'UT' mtime */ + assertEqualInt(i4le(q + 9), now + 5); /* 'UT' atime */ + q = q + 4 + i2le(q + 2); + + assertEqualInt(i2le(q), 0x6c78); /* 'xl' experimental extension header */ + assertEqualInt(i2le(q + 2), 9); /* size */ + assertEqualInt(q[4], 7); /* bitmap of fields */ + assertEqualInt(i2le(q + 5) >> 8, 3); /* system & version made by */ + assertEqualInt(i2le(q + 7), 0); /* internal file attributes */ + assertEqualInt(i4le(q + 9) >> 16 & 01777, folder_perm); /* external file attributes */ + q = q + 4 + i2le(q + 2); + + assert(q == extra_start + i2le(local_header + 28)); + q = extra_start + i2le(local_header + 28); + + /* There should not be any data in the folder entry, + * so the first central directory entry should be next: */ + assertEqualMem(q, "PK\001\002", 4); /* Signature */ + + /* Close archive, in case. */ + archive_read_free(zip_archive); +} + +static void verify_xz_contents(const char *buff, size_t used) +{ + verify_xz_lzma(buff, used, 95, 0x8); +} + +static void verify_lzma_contents(const char *buff, size_t used) +{ + verify_xz_lzma(buff, used, 14, 0xA); +} + +#endif /* HAVE_LZMA_H */ +DEFINE_TEST(test_write_format_zip_compression_lzmaxz) +{ +#ifndef HAVE_LZMA_H + skipping("lzma is not fully supported on this platform"); +#else /* HAVE_LZMA_H */ + /* Buffer data */ + struct archive *a; + char buff[100000]; + size_t used; + + /* Time data */ + now = time(NULL); + + /* Create new ZIP archive in memory without padding. */ + /* Use the setter function to use LZMA Alone compression. */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_zip_set_compression_lzma(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:experimental")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_bytes_per_block(a, 1)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_bytes_in_last_block(a, 1)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff), &used)); + + verify_write_lzma(a); + + /* Close the archive . */ + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_free(a)); + dumpfile("constructed.zip", buff, used); + + verify_lzma_contents(buff, used); + + /* Create new ZIP archive in memory without padding. */ + /* Use compression-level=9 to check that compression + * levels are somewhat supported. */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:compression=lzma")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:compression-level=9")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:experimental")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_bytes_per_block(a, 1)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_bytes_in_last_block(a, 1)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff), &used)); + + verify_write_lzma(a); + + /* Close the archive. */ + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_free(a)); + dumpfile("constructed.zip", buff, used); + + verify_lzma_contents(buff, used); + + /* Same song and dance, but for XZ */ + + /* Create new ZIP archive in memory without padding. */ + /* Use the setter function to use XZ compression. */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_zip_set_compression_xz(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:experimental")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_bytes_per_block(a, 1)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_bytes_in_last_block(a, 1)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff), &used)); + + verify_write_lzma(a); + + /* Close the archive . */ + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_free(a)); + dumpfile("constructed.zip", buff, used); + + verify_xz_contents(buff, used); + + /* Create new ZIP archive in memory without padding. */ + /* Use compression-level=9 to check that compression levels are + * somewhat supported as well as threads=2 to check the multi-threaded + * encoder, if available. */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:compression=xz")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:compression-level=9")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:threads=2")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:experimental")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_bytes_per_block(a, 1)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_bytes_in_last_block(a, 1)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff), &used)); + + verify_write_lzma(a); + + /* Close the archive. */ + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_free(a)); + dumpfile("constructed.zip", buff, used); + + verify_xz_contents(buff, used); +#endif /* HAVE_LZMA_H */ +} + --- contrib/libarchive/libarchive/test/test_write_format_zip_compression_store.c.orig +++ contrib/libarchive/libarchive/test/test_write_format_zip_compression_store.c @@ -45,34 +45,6 @@ static time_t now; -static unsigned long -bitcrc32(unsigned long c, const void *_p, size_t s) -{ - /* This is a drop-in replacement for crc32() from zlib. - * Libarchive should be able to correctly generate - * uncompressed zip archives (including correct CRCs) even - * when zlib is unavailable, and this function helps us verify - * that. Yes, this is very, very slow and unsuitable for - * production use, but it's correct, compact, and works well - * enough for this particular usage. Libarchive internally - * uses a much more efficient implementation. */ - const unsigned char *p = _p; - int bitctr; - - if (p == NULL) - return (0); - - for (; s > 0; --s) { - c ^= *p++; - for (bitctr = 8; bitctr > 0; --bitctr) { - if (c & 1) c = (c >> 1); - else c = (c >> 1) ^ 0xedb88320; - c ^= 0x80000000; - } - } - return (c); -} - static void verify_write_uncompressed(struct archive *a) { struct archive_entry *entry; @@ -106,21 +78,6 @@ archive_entry_free(entry); } -/* Quick and dirty: Read 2-byte and 4-byte integers from Zip file. */ -static unsigned int -i2(const void *p_) -{ - const unsigned char *p = p_; - return (p[0] | (p[1] << 8)); -} - -static unsigned int -i4(const void *p_) -{ - const unsigned char *p = p_; - return (i2(p) | (i2(p + 2) << 16)); -} - static void verify_uncompressed_contents(const char *buff, size_t used) { const char *buffend; @@ -152,99 +109,99 @@ failure("End-of-central-directory begins with PK\\005\\006 signature"); assertEqualMem(p, "PK\005\006", 4); failure("This must be disk 0"); - assertEqualInt(i2(p + 4), 0); + assertEqualInt(i2le(p + 4), 0); failure("Central dir must start on disk 0"); - assertEqualInt(i2(p + 6), 0); + assertEqualInt(i2le(p + 6), 0); failure("All central dir entries are on this disk"); - assertEqualInt(i2(p + 8), i2(p + 10)); - failure("CD start (%d) + CD length (%d) should == archive size - 22", - i4(p + 12), i4(p + 16)); - assertEqualInt(i4(p + 12) + i4(p + 16), used - 22); + assertEqualInt(i2le(p + 8), i2le(p + 10)); + failure("CD start (%u) + CD length (%u) should == archive size - 22", + i4le(p + 12), i4le(p + 16)); + assertEqualInt(i4le(p + 12) + i4le(p + 16), used - 22); failure("no zip comment"); - assertEqualInt(i2(p + 20), 0); + assertEqualInt(i2le(p + 20), 0); /* Get address of first entry in central directory. */ - p = buff + i4(buffend - 6); - failure("Central file record at offset %d should begin with" + p = buff + i4le(buffend - 6); + failure("Central file record at offset %u should begin with" " PK\\001\\002 signature", - i4(buffend - 10)); + i4le(buffend - 10)); /* Verify file entry in central directory. */ assertEqualMem(p, "PK\001\002", 4); /* Signature */ - assertEqualInt(i2(p + 4), 3 * 256 + 10); /* Version made by */ - assertEqualInt(i2(p + 6), 10); /* Version needed to extract */ - assertEqualInt(i2(p + 8), 8); /* Flags */ - assertEqualInt(i2(p + 10), 0); /* Compression method */ - assertEqualInt(i2(p + 12), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ - assertEqualInt(i2(p + 14), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ + assertEqualInt(i2le(p + 4), 3 * 256 + 10); /* Version made by */ + assertEqualInt(i2le(p + 6), 10); /* Version needed to extract */ + assertEqualInt(i2le(p + 8), 8); /* Flags */ + assertEqualInt(i2le(p + 10), 0); /* Compression method */ + assertEqualInt(i2le(p + 12), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ + assertEqualInt(i2le(p + 14), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ crc = bitcrc32(0, file_data1, sizeof(file_data1)); crc = bitcrc32(crc, file_data2, sizeof(file_data2)); - assertEqualInt(i4(p + 16), crc); /* CRC-32 */ - assertEqualInt(i4(p + 20), sizeof(file_data1) + sizeof(file_data2)); /* Compressed size */ - assertEqualInt(i4(p + 24), sizeof(file_data1) + sizeof(file_data2)); /* Uncompressed size */ - assertEqualInt(i2(p + 28), strlen(file_name)); /* Pathname length */ - assertEqualInt(i2(p + 30), 24); /* Extra field length */ - assertEqualInt(i2(p + 32), 0); /* File comment length */ - assertEqualInt(i2(p + 34), 0); /* Disk number start */ - assertEqualInt(i2(p + 36), 0); /* Internal file attrs */ - assertEqualInt(i4(p + 38) >> 16 & 01777, file_perm); /* External file attrs */ - assertEqualInt(i4(p + 42), 0); /* Offset of local header */ + assertEqualInt(i4le(p + 16), crc); /* CRC-32 */ + assertEqualInt(i4le(p + 20), sizeof(file_data1) + sizeof(file_data2)); /* Compressed size */ + assertEqualInt(i4le(p + 24), sizeof(file_data1) + sizeof(file_data2)); /* Uncompressed size */ + assertEqualInt(i2le(p + 28), strlen(file_name)); /* Pathname length */ + assertEqualInt(i2le(p + 30), 24); /* Extra field length */ + assertEqualInt(i2le(p + 32), 0); /* File comment length */ + assertEqualInt(i2le(p + 34), 0); /* Disk number start */ + assertEqualInt(i2le(p + 36), 0); /* Internal file attrs */ + assertEqualInt(i4le(p + 38) >> 16 & 01777, file_perm); /* External file attrs */ + assertEqualInt(i4le(p + 42), 0); /* Offset of local header */ assertEqualMem(p + 46, file_name, strlen(file_name)); /* Pathname */ p = p + 46 + strlen(file_name); - assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ - assertEqualInt(i2(p + 2), 11); /* 'ux' size */ + assertEqualInt(i2le(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(p + 2), 11); /* 'ux' size */ /* TODO */ - p = p + 4 + i2(p + 2); + p = p + 4 + i2le(p + 2); - assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(i2le(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(p + 2), 5); /* 'UT' size */ assertEqualInt(p[4], 1); /* 'UT' flags */ - assertEqualInt(i4(p + 5), now); /* 'UT' mtime */ - p = p + 4 + i2(p + 2); + assertEqualInt(i4le(p + 5), now); /* 'UT' mtime */ + p = p + 4 + i2le(p + 2); /* Verify local header of file entry. */ local_header = q = buff; assertEqualMem(q, "PK\003\004", 4); /* Signature */ - assertEqualInt(i2(q + 4), 10); /* Version needed to extract */ - assertEqualInt(i2(q + 6), 8); /* Flags: bit 3 = length-at-end. Required because CRC32 is unknown */ - assertEqualInt(i2(q + 8), 0); /* Compression method */ - assertEqualInt(i2(q + 10), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ - assertEqualInt(i2(q + 12), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ - assertEqualInt(i4(q + 14), 0); /* CRC-32 */ - assertEqualInt(i4(q + 18), 0); /* Compressed size, must be zero because of length-at-end */ - assertEqualInt(i4(q + 22), 0); /* Uncompressed size, must be zero because of length-at-end */ - assertEqualInt(i2(q + 26), strlen(file_name)); /* Pathname length */ - assertEqualInt(i2(q + 28), 41); /* Extra field length */ + assertEqualInt(i2le(q + 4), 10); /* Version needed to extract */ + assertEqualInt(i2le(q + 6), 8); /* Flags: bit 3 = length-at-end. Required because CRC32 is unknown */ + assertEqualInt(i2le(q + 8), 0); /* Compression method */ + assertEqualInt(i2le(q + 10), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ + assertEqualInt(i2le(q + 12), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ + assertEqualInt(i4le(q + 14), 0); /* CRC-32 */ + assertEqualInt(i4le(q + 18), 0); /* Compressed size, must be zero because of length-at-end */ + assertEqualInt(i4le(q + 22), 0); /* Uncompressed size, must be zero because of length-at-end */ + assertEqualInt(i2le(q + 26), strlen(file_name)); /* Pathname length */ + assertEqualInt(i2le(q + 28), 41); /* Extra field length */ assertEqualMem(q + 30, file_name, strlen(file_name)); /* Pathname */ extra_start = q = q + 30 + strlen(file_name); - assertEqualInt(i2(q), 0x7875); /* 'ux' extension header */ - assertEqualInt(i2(q + 2), 11); /* 'ux' size */ + assertEqualInt(i2le(q), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(q + 2), 11); /* 'ux' size */ assertEqualInt(q[4], 1); /* 'ux' version */ assertEqualInt(q[5], 4); /* 'ux' uid size */ - assertEqualInt(i4(q + 6), file_uid); /* 'Ux' UID */ + assertEqualInt(i4le(q + 6), file_uid); /* 'Ux' UID */ assertEqualInt(q[10], 4); /* 'ux' gid size */ - assertEqualInt(i4(q + 11), file_gid); /* 'Ux' GID */ - q = q + 4 + i2(q + 2); + assertEqualInt(i4le(q + 11), file_gid); /* 'Ux' GID */ + q = q + 4 + i2le(q + 2); - assertEqualInt(i2(q), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(q + 2), 9); /* 'UT' size */ + assertEqualInt(i2le(q), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(q + 2), 9); /* 'UT' size */ assertEqualInt(q[4], 3); /* 'UT' flags */ - assertEqualInt(i4(q + 5), now); /* 'UT' mtime */ - assertEqualInt(i4(q + 9), now + 3); /* 'UT' atime */ - q = q + 4 + i2(q + 2); + assertEqualInt(i4le(q + 5), now); /* 'UT' mtime */ + assertEqualInt(i4le(q + 9), now + 3); /* 'UT' atime */ + q = q + 4 + i2le(q + 2); - assertEqualInt(i2(q), 0x6c78); /* 'xl' experimental extension header */ - assertEqualInt(i2(q + 2), 9); /* size */ + assertEqualInt(i2le(q), 0x6c78); /* 'xl' experimental extension header */ + assertEqualInt(i2le(q + 2), 9); /* size */ assertEqualInt(q[4], 7); /* Bitmap of fields included. */ - assertEqualInt(i2(q + 5) >> 8, 3); /* system & version made by */ - assertEqualInt(i2(q + 7), 0); /* internal file attributes */ - assertEqualInt(i4(q + 9) >> 16 & 01777, file_perm); /* external file attributes */ - q = q + 4 + i2(q + 2); + assertEqualInt(i2le(q + 5) >> 8, 3); /* system & version made by */ + assertEqualInt(i2le(q + 7), 0); /* internal file attributes */ + assertEqualInt(i4le(q + 9) >> 16 & 01777, file_perm); /* external file attributes */ + q = q + 4 + i2le(q + 2); - assert(q == extra_start + i2(local_header + 28)); - q = extra_start + i2(local_header + 28); + assert(q == extra_start + i2le(local_header + 28)); + q = extra_start + i2le(local_header + 28); /* Verify data of file entry. */ assertEqualMem(q, file_data1, sizeof(file_data1)); @@ -253,90 +210,90 @@ /* Verify data descriptor of file entry. */ assertEqualMem(q, "PK\007\010", 4); /* Signature */ - assertEqualInt(i4(q + 4), crc); /* CRC-32 */ - assertEqualInt(i4(q + 8), sizeof(file_data1) + sizeof(file_data2)); /* Compressed size */ - assertEqualInt(i4(q + 12), sizeof(file_data1) + sizeof(file_data2)); /* Uncompressed size */ + assertEqualInt(i4le(q + 4), crc); /* CRC-32 */ + assertEqualInt(i4le(q + 8), sizeof(file_data1) + sizeof(file_data2)); /* Compressed size */ + assertEqualInt(i4le(q + 12), sizeof(file_data1) + sizeof(file_data2)); /* Uncompressed size */ q = q + 16; /* Verify folder entry in central directory. */ assertEqualMem(p, "PK\001\002", 4); /* Signature */ - assertEqualInt(i2(p + 4), 3 * 256 + 20); /* Version made by */ - assertEqualInt(i2(p + 6), 20); /* Version needed to extract */ - assertEqualInt(i2(p + 8), 0); /* Flags */ - assertEqualInt(i2(p + 10), 0); /* Compression method */ - assertEqualInt(i2(p + 12), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ - assertEqualInt(i2(p + 14), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ + assertEqualInt(i2le(p + 4), 3 * 256 + 20); /* Version made by */ + assertEqualInt(i2le(p + 6), 20); /* Version needed to extract */ + assertEqualInt(i2le(p + 8), 0); /* Flags */ + assertEqualInt(i2le(p + 10), 0); /* Compression method */ + assertEqualInt(i2le(p + 12), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ + assertEqualInt(i2le(p + 14), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ crc = 0; - assertEqualInt(i4(p + 16), crc); /* CRC-32 */ - assertEqualInt(i4(p + 20), 0); /* Compressed size */ - assertEqualInt(i4(p + 24), 0); /* Uncompressed size */ - assertEqualInt(i2(p + 28), strlen(folder_name)); /* Pathname length */ - assertEqualInt(i2(p + 30), 24); /* Extra field length */ - assertEqualInt(i2(p + 32), 0); /* File comment length */ - assertEqualInt(i2(p + 34), 0); /* Disk number start */ - assertEqualInt(i2(p + 36), 0); /* Internal file attrs */ - assertEqualInt(i4(p + 38) >> 16 & 01777, folder_perm); /* External file attrs */ - assertEqualInt(i4(p + 42), q - buff); /* Offset of local header */ + assertEqualInt(i4le(p + 16), crc); /* CRC-32 */ + assertEqualInt(i4le(p + 20), 0); /* Compressed size */ + assertEqualInt(i4le(p + 24), 0); /* Uncompressed size */ + assertEqualInt(i2le(p + 28), strlen(folder_name)); /* Pathname length */ + assertEqualInt(i2le(p + 30), 24); /* Extra field length */ + assertEqualInt(i2le(p + 32), 0); /* File comment length */ + assertEqualInt(i2le(p + 34), 0); /* Disk number start */ + assertEqualInt(i2le(p + 36), 0); /* Internal file attrs */ + assertEqualInt(i4le(p + 38) >> 16 & 01777, folder_perm); /* External file attrs */ + assertEqualInt(i4le(p + 42), q - buff); /* Offset of local header */ assertEqualMem(p + 46, folder_name, strlen(folder_name)); /* Pathname */ p = p + 46 + strlen(folder_name); - assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ - assertEqualInt(i2(p + 2), 11); /* 'ux' size */ + assertEqualInt(i2le(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(p + 2), 11); /* 'ux' size */ assertEqualInt(p[4], 1); /* 'ux' version */ assertEqualInt(p[5], 4); /* 'ux' uid size */ - assertEqualInt(i4(p + 6), folder_uid); /* 'ux' UID */ + assertEqualInt(i4le(p + 6), folder_uid); /* 'ux' UID */ assertEqualInt(p[10], 4); /* 'ux' gid size */ - assertEqualInt(i4(p + 11), folder_gid); /* 'ux' GID */ - p = p + 4 + i2(p + 2); + assertEqualInt(i4le(p + 11), folder_gid); /* 'ux' GID */ + p = p + 4 + i2le(p + 2); - assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(i2le(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(p + 2), 5); /* 'UT' size */ assertEqualInt(p[4], 1); /* 'UT' flags */ - assertEqualInt(i4(p + 5), now); /* 'UT' mtime */ - p = p + 4 + i2(p + 2); + assertEqualInt(i4le(p + 5), now); /* 'UT' mtime */ + p = p + 4 + i2le(p + 2); /* Verify local header of folder entry. */ local_header = q; assertEqualMem(q, "PK\003\004", 4); /* Signature */ - assertEqualInt(i2(q + 4), 20); /* Version needed to extract */ - assertEqualInt(i2(q + 6), 0); /* Flags */ - assertEqualInt(i2(q + 8), 0); /* Compression method */ - assertEqualInt(i2(q + 10), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ - assertEqualInt(i2(q + 12), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ - assertEqualInt(i4(q + 14), 0); /* CRC-32 */ - assertEqualInt(i4(q + 18), 0); /* Compressed size */ - assertEqualInt(i4(q + 22), 0); /* Uncompressed size */ - assertEqualInt(i2(q + 26), strlen(folder_name)); /* Pathname length */ - assertEqualInt(i2(q + 28), 41); /* Extra field length */ + assertEqualInt(i2le(q + 4), 20); /* Version needed to extract */ + assertEqualInt(i2le(q + 6), 0); /* Flags */ + assertEqualInt(i2le(q + 8), 0); /* Compression method */ + assertEqualInt(i2le(q + 10), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ + assertEqualInt(i2le(q + 12), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ + assertEqualInt(i4le(q + 14), 0); /* CRC-32 */ + assertEqualInt(i4le(q + 18), 0); /* Compressed size */ + assertEqualInt(i4le(q + 22), 0); /* Uncompressed size */ + assertEqualInt(i2le(q + 26), strlen(folder_name)); /* Pathname length */ + assertEqualInt(i2le(q + 28), 41); /* Extra field length */ assertEqualMem(q + 30, folder_name, strlen(folder_name)); /* Pathname */ extra_start = q = q + 30 + strlen(folder_name); - assertEqualInt(i2(q), 0x7875); /* 'ux' extension header */ - assertEqualInt(i2(q + 2), 11); /* 'ux' size */ + assertEqualInt(i2le(q), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(q + 2), 11); /* 'ux' size */ assertEqualInt(q[4], 1); /* 'ux' version */ assertEqualInt(q[5], 4); /* 'ux' uid size */ - assertEqualInt(i4(q + 6), folder_uid); /* 'ux' UID */ + assertEqualInt(i4le(q + 6), folder_uid); /* 'ux' UID */ assertEqualInt(q[10], 4); /* 'ux' gid size */ - assertEqualInt(i4(q + 11), folder_gid); /* 'ux' GID */ - q = q + 4 + i2(q + 2); + assertEqualInt(i4le(q + 11), folder_gid); /* 'ux' GID */ + q = q + 4 + i2le(q + 2); - assertEqualInt(i2(q), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(q + 2), 9); /* 'UT' size */ + assertEqualInt(i2le(q), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(q + 2), 9); /* 'UT' size */ assertEqualInt(q[4], 5); /* 'UT' flags */ - assertEqualInt(i4(q + 5), now); /* 'UT' mtime */ - assertEqualInt(i4(q + 9), now + 5); /* 'UT' atime */ - q = q + 4 + i2(q + 2); + assertEqualInt(i4le(q + 5), now); /* 'UT' mtime */ + assertEqualInt(i4le(q + 9), now + 5); /* 'UT' atime */ + q = q + 4 + i2le(q + 2); - assertEqualInt(i2(q), 0x6c78); /* 'xl' experimental extension header */ - assertEqualInt(i2(q + 2), 9); /* size */ + assertEqualInt(i2le(q), 0x6c78); /* 'xl' experimental extension header */ + assertEqualInt(i2le(q + 2), 9); /* size */ assertEqualInt(q[4], 7); /* bitmap of fields */ - assertEqualInt(i2(q + 5) >> 8, 3); /* system & version made by */ - assertEqualInt(i2(q + 7), 0); /* internal file attributes */ - assertEqualInt(i4(q + 9) >> 16 & 01777, folder_perm); /* external file attributes */ - q = q + 4 + i2(q + 2); + assertEqualInt(i2le(q + 5) >> 8, 3); /* system & version made by */ + assertEqualInt(i2le(q + 7), 0); /* internal file attributes */ + assertEqualInt(i4le(q + 9) >> 16 & 01777, folder_perm); /* external file attributes */ + q = q + 4 + i2le(q + 2); - assert(q == extra_start + i2(local_header + 28)); - q = extra_start + i2(local_header + 28); + assert(q == extra_start + i2le(local_header + 28)); + q = extra_start + i2le(local_header + 28); /* There should not be any data in the folder entry, * so the first central directory entry should be next: */ --- /dev/null +++ contrib/libarchive/libarchive/test/test_write_format_zip_compression_zstd.c @@ -0,0 +1,366 @@ +/*-SPDX-License-Identifier: BSD-2-Clause + * Copyright (c) 2024 ARJANEN Loïc Jean David + * All rights reserved. + */ + +#include "test.h" +#ifdef HAVE_ZSTD_H +#include + +/* File data */ +static const char file_name[] = "file"; +static const char file_data1[] = {'~', 'Z', '`', '^', 'Y', 'X', 'N', 'W', 'V', 'G', 'H', 'I', 'J'}; +static const char file_data2[] = {'U', 'T', 'S', 'M', 'R', 'Q', 'P', 'O', 'K', 'L'}; +static const int file_perm = 00644; +static const short file_uid = 10; +static const short file_gid = 20; + +/* Folder data */ +static const char folder_name[] = "folder/"; +static const int folder_perm = 00755; +static const short folder_uid = 30; +static const short folder_gid = 40; + +static time_t now; + +static void verify_write_zstd(struct archive *a) +{ + struct archive_entry *entry; + + /* Write entries. */ + + /* Regular file */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, file_name); + archive_entry_set_mode(entry, S_IFREG | 0644); + archive_entry_set_size(entry, sizeof(file_data1) + sizeof(file_data2)); + archive_entry_set_uid(entry, file_uid); + archive_entry_set_gid(entry, file_gid); + archive_entry_set_mtime(entry, now, 0); + archive_entry_set_atime(entry, now + 3, 0); + assertEqualIntA(a, 0, archive_write_header(a, entry)); + assertEqualIntA(a, sizeof(file_data1), archive_write_data(a, file_data1, sizeof(file_data1))); + assertEqualIntA(a, sizeof(file_data2), archive_write_data(a, file_data2, sizeof(file_data2))); + archive_entry_free(entry); + + /* Folder */ + assert((entry = archive_entry_new()) != NULL); + archive_entry_set_pathname(entry, folder_name); + archive_entry_set_mode(entry, S_IFDIR | folder_perm); + archive_entry_set_size(entry, 0); + archive_entry_set_uid(entry, folder_uid); + archive_entry_set_gid(entry, folder_gid); + archive_entry_set_mtime(entry, now, 0); + archive_entry_set_ctime(entry, now + 5, 0); + assertEqualIntA(a, 0, archive_write_header(a, entry)); + archive_entry_free(entry); +} + +static void verify_zstd_contents(const char *buff, size_t used) +{ + const char *buffend; + struct archive* zip_archive; + struct archive_entry *ae; + char filedata[sizeof(file_data1) + sizeof(file_data2)]; + /* Misc variables */ + unsigned long crc; + struct tm *tm; +#if defined(HAVE_LOCALTIME_R) || defined(HAVE_LOCALTIME_S) + struct tm tmbuf; +#endif + /* p is the pointer to walk over the central directory, + * q walks over the local headers, the data and the data descriptors. */ + const char *p, *q, *local_header, *extra_start; + +#if defined(HAVE_LOCALTIME_S) + tm = localtime_s(&tmbuf, &now) ? NULL : &tmbuf; +#elif defined(HAVE_LOCALTIME_R) + tm = localtime_r(&now, &tmbuf); +#else + tm = localtime(&now); +#endif + + /* Open archive from memory, we'll need it for checking the file + * value */ + assert((zip_archive = archive_read_new()) != NULL); + assertEqualIntA(zip_archive, ARCHIVE_OK, archive_read_support_format_zip(zip_archive)); + assertEqualIntA(zip_archive, ARCHIVE_OK, archive_read_support_filter_all(zip_archive)); + assertEqualIntA(zip_archive, ARCHIVE_OK, archive_read_open_memory(zip_archive, buff, used)); + + /* Remember the end of the archive in memory. */ + buffend = buff + used; + + /* Verify "End of Central Directory" record. */ + /* Get address of end-of-central-directory record. */ + p = buffend - 22; /* Assumes there is no zip comment field. */ + failure("End-of-central-directory begins with PK\\005\\006 signature"); + assertEqualMem(p, "PK\005\006", 4); + failure("This must be disk 0"); + assertEqualInt(i2le(p + 4), 0); + failure("Central dir must start on disk 0"); + assertEqualInt(i2le(p + 6), 0); + failure("All central dir entries are on this disk"); + assertEqualInt(i2le(p + 8), i2le(p + 10)); + failure("CD start (%u) + CD length (%u) should == archive size - 22", + i4le(p + 12), i4le(p + 16)); + assertEqualInt(i4le(p + 12) + i4le(p + 16), used - 22); + failure("no zip comment"); + assertEqualInt(i2le(p + 20), 0); + + /* Get address of first entry in central directory. */ + p = buff + i4le(buffend - 6); + failure("Central file record at offset %u should begin with" + " PK\\001\\002 signature", + i4le(buffend - 10)); + + /* Verify file entry in central directory, except compressed size (offset 20). */ + assertEqualMem(p, "PK\001\002", 4); /* Signature */ + assertEqualInt(i2le(p + 4), 3 * 256 + 63); /* Version made by */ + assertEqualInt(i2le(p + 6), 63); /* Version needed to extract */ + assertEqualInt(i2le(p + 8), 8); /* Flags */ + assertEqualInt(i2le(p + 10), 93); /* Compression method */ + assertEqualInt(i2le(p + 12), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ + assertEqualInt(i2le(p + 14), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ + crc = bitcrc32(0, file_data1, sizeof(file_data1)); + crc = bitcrc32(crc, file_data2, sizeof(file_data2)); + assertEqualInt(i4le(p + 16), crc); /* CRC-32 */ + assertEqualInt(i4le(p + 24), sizeof(file_data1) + sizeof(file_data2)); /* Uncompressed size */ + assertEqualInt(i2le(p + 28), strlen(file_name)); /* Pathname length */ + assertEqualInt(i2le(p + 30), 24); /* Extra field length */ + assertEqualInt(i2le(p + 32), 0); /* File comment length */ + assertEqualInt(i2le(p + 34), 0); /* Disk number start */ + assertEqualInt(i2le(p + 36), 0); /* Internal file attrs */ + assertEqualInt(i4le(p + 38) >> 16 & 01777, file_perm); /* External file attrs */ + assertEqualInt(i4le(p + 42), 0); /* Offset of local header */ + assertEqualMem(p + 46, file_name, strlen(file_name)); /* Pathname */ + p = p + 46 + strlen(file_name); + + assertEqualInt(i2le(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(p + 2), 11); /* 'ux' size */ +/* TODO */ + p = p + 4 + i2le(p + 2); + + assertEqualInt(i2le(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(p + 2), 5); /* 'UT' size */ + assertEqualInt(p[4], 1); /* 'UT' flags */ + assertEqualInt(i4le(p + 5), now); /* 'UT' mtime */ + p = p + 4 + i2le(p + 2); + + /* Verify local header of file entry. */ + local_header = q = buff; + assertEqualMem(q, "PK\003\004", 4); /* Signature */ + assertEqualInt(i2le(q + 4), 63); /* Version needed to extract */ + assertEqualInt(i2le(q + 6), 8); /* Flags: bit 3 = length-at-end (required because CRC32 is unknown) */ + assertEqualInt(i2le(q + 8), 93); /* Compression method */ + assertEqualInt(i2le(q + 10), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ + assertEqualInt(i2le(q + 12), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ + assertEqualInt(i4le(q + 14), 0); /* CRC-32 */ + assertEqualInt(i4le(q + 18), 0); /* Compressed size, must be zero because of length-at-end */ + assertEqualInt(i4le(q + 22), 0); /* Uncompressed size, must be zero because of length-at-end */ + assertEqualInt(i2le(q + 26), strlen(file_name)); /* Pathname length */ + assertEqualInt(i2le(q + 28), 41); /* Extra field length */ + assertEqualMem(q + 30, file_name, strlen(file_name)); /* Pathname */ + extra_start = q = q + 30 + strlen(file_name); + + assertEqualInt(i2le(q), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(q + 2), 11); /* 'ux' size */ + assertEqualInt(q[4], 1); /* 'ux' version */ + assertEqualInt(q[5], 4); /* 'ux' uid size */ + assertEqualInt(i4le(q + 6), file_uid); /* 'Ux' UID */ + assertEqualInt(q[10], 4); /* 'ux' gid size */ + assertEqualInt(i4le(q + 11), file_gid); /* 'Ux' GID */ + q = q + 4 + i2le(q + 2); + + assertEqualInt(i2le(q), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(q + 2), 9); /* 'UT' size */ + assertEqualInt(q[4], 3); /* 'UT' flags */ + assertEqualInt(i4le(q + 5), now); /* 'UT' mtime */ + assertEqualInt(i4le(q + 9), now + 3); /* 'UT' atime */ + q = q + 4 + i2le(q + 2); + + assertEqualInt(i2le(q), 0x6c78); /* 'xl' experimental extension header */ + assertEqualInt(i2le(q + 2), 9); /* size */ + assertEqualInt(q[4], 7); /* Bitmap of fields included. */ + assertEqualInt(i2le(q + 5) >> 8, 3); /* system & version made by */ + assertEqualInt(i2le(q + 7), 0); /* internal file attributes */ + assertEqualInt(i4le(q + 9) >> 16 & 01777, file_perm); /* external file attributes */ + q = q + 4 + i2le(q + 2); + + assert(q == extra_start + i2le(local_header + 28)); + q = extra_start + i2le(local_header + 28); + + /* Verify data of file entry, using our own zip reader to test. */ + assertEqualIntA(zip_archive, ARCHIVE_OK, archive_read_next_header(zip_archive, &ae)); + assertEqualString("file", archive_entry_pathname(ae)); + assertEqualIntA(zip_archive, sizeof(filedata), archive_read_data(zip_archive, filedata, sizeof(filedata))); + assertEqualMem(filedata, file_data1, sizeof(file_data1)); + assertEqualMem(filedata + sizeof(file_data1), file_data2, + sizeof(file_data2)); + + /* Skip data of file entry in q */ + while (q < buffend - 3) { + if (memcmp(q, "PK\007\010", 4) == 0) { + break; + } + q++; + } + + /* Verify data descriptor of file entry, except compressed size (offset 8). */ + assertEqualMem(q, "PK\007\010", 4); /* Signature */ + assertEqualInt(i4le(q + 4), crc); /* CRC-32 */ + assertEqualInt(i4le(q + 12), sizeof(file_data1) + sizeof(file_data2)); /* Uncompressed size */ + q = q + 16; + + /* Verify folder entry in central directory. */ + assertEqualMem(p, "PK\001\002", 4); /* Signature */ + assertEqualInt(i2le(p + 4), 3 * 256 + 20); /* Version made by */ + assertEqualInt(i2le(p + 6), 20); /* Version needed to extract */ + assertEqualInt(i2le(p + 8), 0); /* Flags */ + assertEqualInt(i2le(p + 10), 0); /* Compression method */ + assertEqualInt(i2le(p + 12), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ + assertEqualInt(i2le(p + 14), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ + crc = 0; + assertEqualInt(i4le(p + 16), crc); /* CRC-32 */ + assertEqualInt(i4le(p + 20), 0); /* Compressed size */ + assertEqualInt(i4le(p + 24), 0); /* Uncompressed size */ + assertEqualInt(i2le(p + 28), strlen(folder_name)); /* Pathname length */ + assertEqualInt(i2le(p + 30), 24); /* Extra field length */ + assertEqualInt(i2le(p + 32), 0); /* File comment length */ + assertEqualInt(i2le(p + 34), 0); /* Disk number start */ + assertEqualInt(i2le(p + 36), 0); /* Internal file attrs */ + assertEqualInt(i4le(p + 38) >> 16 & 01777, folder_perm); /* External file attrs */ + assertEqualInt(i4le(p + 42), q - buff); /* Offset of local header */ + assertEqualMem(p + 46, folder_name, strlen(folder_name)); /* Pathname */ + p = p + 46 + strlen(folder_name); + + assertEqualInt(i2le(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(p + 2), 11); /* 'ux' size */ + assertEqualInt(p[4], 1); /* 'ux' version */ + assertEqualInt(p[5], 4); /* 'ux' uid size */ + assertEqualInt(i4le(p + 6), folder_uid); /* 'ux' UID */ + assertEqualInt(p[10], 4); /* 'ux' gid size */ + assertEqualInt(i4le(p + 11), folder_gid); /* 'ux' GID */ + p = p + 4 + i2le(p + 2); + + assertEqualInt(i2le(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(p + 2), 5); /* 'UT' size */ + assertEqualInt(p[4], 1); /* 'UT' flags */ + assertEqualInt(i4le(p + 5), now); /* 'UT' mtime */ + p = p + 4 + i2le(p + 2); + + /* Verify local header of folder entry. */ + local_header = q; + assertEqualMem(q, "PK\003\004", 4); /* Signature */ + assertEqualInt(i2le(q + 4), 20); /* Version needed to extract */ + assertEqualInt(i2le(q + 6), 0); /* Flags */ + assertEqualInt(i2le(q + 8), 0); /* Compression method */ + assertEqualInt(i2le(q + 10), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ + assertEqualInt(i2le(q + 12), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ + assertEqualInt(i4le(q + 14), 0); /* CRC-32 */ + assertEqualInt(i4le(q + 18), 0); /* Compressed size */ + assertEqualInt(i4le(q + 22), 0); /* Uncompressed size */ + assertEqualInt(i2le(q + 26), strlen(folder_name)); /* Pathname length */ + assertEqualInt(i2le(q + 28), 41); /* Extra field length */ + assertEqualMem(q + 30, folder_name, strlen(folder_name)); /* Pathname */ + extra_start = q = q + 30 + strlen(folder_name); + + assertEqualInt(i2le(q), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(q + 2), 11); /* 'ux' size */ + assertEqualInt(q[4], 1); /* 'ux' version */ + assertEqualInt(q[5], 4); /* 'ux' uid size */ + assertEqualInt(i4le(q + 6), folder_uid); /* 'ux' UID */ + assertEqualInt(q[10], 4); /* 'ux' gid size */ + assertEqualInt(i4le(q + 11), folder_gid); /* 'ux' GID */ + q = q + 4 + i2le(q + 2); + + assertEqualInt(i2le(q), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(q + 2), 9); /* 'UT' size */ + assertEqualInt(q[4], 5); /* 'UT' flags */ + assertEqualInt(i4le(q + 5), now); /* 'UT' mtime */ + assertEqualInt(i4le(q + 9), now + 5); /* 'UT' atime */ + q = q + 4 + i2le(q + 2); + + assertEqualInt(i2le(q), 0x6c78); /* 'xl' experimental extension header */ + assertEqualInt(i2le(q + 2), 9); /* size */ + assertEqualInt(q[4], 7); /* bitmap of fields */ + assertEqualInt(i2le(q + 5) >> 8, 3); /* system & version made by */ + assertEqualInt(i2le(q + 7), 0); /* internal file attributes */ + assertEqualInt(i4le(q + 9) >> 16 & 01777, folder_perm); /* external file attributes */ + q = q + 4 + i2le(q + 2); + + assert(q == extra_start + i2le(local_header + 28)); + q = extra_start + i2le(local_header + 28); + + /* There should not be any data in the folder entry, + * so the first central directory entry should be next: */ + assertEqualMem(q, "PK\001\002", 4); /* Signature */ + + /* Close archive, in case. */ + archive_read_free(zip_archive); +} + +#endif /* HAVE_ZSTD_H */ +DEFINE_TEST(test_write_format_zip_compression_zstd) +{ +#ifndef HAVE_ZSTD_H + skipping("zstd is not fully supported on this platform"); +#else /* HAVE_ZSTD_H */ + /* Buffer data */ + struct archive *a; + char buff[100000]; + size_t used; + + /* Time data */ + now = time(NULL); + + /* Create new ZIP archive in memory without padding. */ + /* Use the setter function to use ZSTD compression. */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_zip_set_compression_zstd(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:experimental")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_bytes_per_block(a, 1)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_bytes_in_last_block(a, 1)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff), &used)); + + verify_write_zstd(a); + + /* Close the archive . */ + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_free(a)); + dumpfile("constructed.zip", buff, used); + + verify_zstd_contents(buff, used); + + /* Create new ZIP archive in memory without padding. */ + /* Use compression-level=1 to check that compression levels are + * somewhat supported as well as threads=2 to check the multi-threaded + * encoder, if available. */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:compression=zstd")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:compression-level=1")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:threads=2")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:experimental")); + assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_bytes_per_block(a, 1)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_bytes_in_last_block(a, 1)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, sizeof(buff), &used)); + + verify_write_zstd(a); + + /* Close the archive. */ + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_free(a)); + dumpfile("constructed.zip", buff, used); + + verify_zstd_contents(buff, used); +#endif /* HAVE_ZSTD_H */ +} + --- contrib/libarchive/libarchive/test/test_write_format_zip_entry_size_unset.c.orig +++ contrib/libarchive/libarchive/test/test_write_format_zip_entry_size_unset.c @@ -42,42 +42,6 @@ #define ZIP_ENTRY_FLAG_LENGTH_AT_END (1 << 3) -/* Quick and dirty: Read 2-byte and 4-byte integers from Zip file. */ -static unsigned i2(const char *p) { return ((p[0] & 0xff) | ((p[1] & 0xff) << 8)); } -static unsigned i4(const char *p) { return (i2(p) | (i2(p + 2) << 16)); } - -static unsigned long -bitcrc32(unsigned long c, const void *_p, size_t s) -{ - /* This is a drop-in replacement for crc32() from zlib. - * Libarchive should be able to correctly generate - * uncompressed zip archives (including correct CRCs) even - * when zlib is unavailable, and this function helps us verify - * that. Yes, this is very, very slow and unsuitable for - * production use, but it's correct, compact, and works well - * enough for this particular usage. Libarchive internally - * uses a much more efficient implementation. */ - const unsigned char *p = _p; - int bitctr; - - if (p == NULL) - return (0); - - for (; s > 0; --s) - { - c ^= *p++; - for (bitctr = 8; bitctr > 0; --bitctr) - { - if (c & 1) - c = (c >> 1); - else - c = (c >> 1) ^ 0xedb88320; - c ^= 0x80000000; - } - } - return (c); -} - static void write_archive(struct archive *a) { struct archive_entry *entry = archive_entry_new(); @@ -116,52 +80,52 @@ /* Check for end of central directory signature */ assertEqualMem(end_of_central_dir, "PK\x5\x6", 4); /* Check for number of disk */ - assertEqualInt(i2(end_of_central_dir + 4), 0); + assertEqualInt(i2le(end_of_central_dir + 4), 0); /* Check for disk where central directory starts */ - assertEqualInt(i2(end_of_central_dir + 6), 0); + assertEqualInt(i2le(end_of_central_dir + 6), 0); /* Check for number of central directory records on disk */ - assertEqualInt(i2(end_of_central_dir + 8), 2); + assertEqualInt(i2le(end_of_central_dir + 8), 2); /* Check for total number of central directory records */ - assertEqualInt(i2(end_of_central_dir + 10), 2); + assertEqualInt(i2le(end_of_central_dir + 10), 2); /* Check for size of central directory and offset * The size + offset must equal the end of the central directory */ - assertEqualInt(i4(end_of_central_dir + 12) + i4(end_of_central_dir + 16), end_of_central_dir - zip_buff); + assertEqualInt(i4le(end_of_central_dir + 12) + i4le(end_of_central_dir + 16), end_of_central_dir - zip_buff); /* Check for empty comment length */ - assertEqualInt(i2(end_of_central_dir + 20), 0); + assertEqualInt(i2le(end_of_central_dir + 20), 0); /* Get address of central directory */ - const char *central_directory = zip_buff + i4(end_of_central_dir + 16); + const char *central_directory = zip_buff + i4le(end_of_central_dir + 16); /* Check for entry in central directory signature */ assertEqualMem(central_directory, "PK\x1\x2", 4); /* Check for version used to write entry */ - assertEqualInt(i2(central_directory + 4), 3 * 256 + 10); + assertEqualInt(i2le(central_directory + 4), 3 * 256 + 10); /* Check for version needed to extract entry */ - assertEqualInt(i2(central_directory + 6), 10); + assertEqualInt(i2le(central_directory + 6), 10); /* Check flags */ - assertEqualInt(i2(central_directory + 8), ZIP_ENTRY_FLAG_LENGTH_AT_END); + assertEqualInt(i2le(central_directory + 8), ZIP_ENTRY_FLAG_LENGTH_AT_END); /* Check compression method */ - assertEqualInt(i2(central_directory + 10), 0); + assertEqualInt(i2le(central_directory + 10), 0); /* Check crc value */ - assertEqualInt(i4(central_directory + 16), crc); + assertEqualInt(i4le(central_directory + 16), crc); /* Check compressed size*/ - assertEqualInt(i4(central_directory + 20), sizeof(file_data1) + sizeof(file_data2)); + assertEqualInt(i4le(central_directory + 20), sizeof(file_data1) + sizeof(file_data2)); /* Check uncompressed size */ - assertEqualInt(i4(central_directory + 24), sizeof(file_data1) + sizeof(file_data2)); + assertEqualInt(i4le(central_directory + 24), sizeof(file_data1) + sizeof(file_data2)); /* Check file name length */ - assertEqualInt(i2(central_directory + 28), strlen(file_name)); + assertEqualInt(i2le(central_directory + 28), strlen(file_name)); /* Check extra field length */ - assertEqualInt(i2(central_directory + 30), 15); + assertEqualInt(i2le(central_directory + 30), 15); /* Check file comment length */ - assertEqualInt(i2(central_directory + 32), 0); + assertEqualInt(i2le(central_directory + 32), 0); /* Check disk number where file starts */ - assertEqualInt(i2(central_directory + 34), 0); + assertEqualInt(i2le(central_directory + 34), 0); /* Check internal file attrs */ - assertEqualInt(i2(central_directory + 36), 0); + assertEqualInt(i2le(central_directory + 36), 0); /* Check external file attrs */ - assertEqualInt(i4(central_directory + 38) >> 16 & 01777, file_perm); + assertEqualInt(i4le(central_directory + 38) >> 16 & 01777, file_perm); /* Check offset of local header */ - assertEqualInt(i4(central_directory + 42), 0); + assertEqualInt(i4le(central_directory + 42), 0); /* Check for file name contents */ assertEqualMem(central_directory + 46, file_name, strlen(file_name)); @@ -171,28 +135,28 @@ /* Check local file header signature */ assertEqualMem(local_file_header, "PK\x3\x4", 4); /* Check version needed to extract */ - assertEqualInt(i2(local_file_header + 4), 10); + assertEqualInt(i2le(local_file_header + 4), 10); /* Check flags */ - assertEqualInt(i2(local_file_header + 6), 8); + assertEqualInt(i2le(local_file_header + 6), 8); /* Check compression method */ - assertEqualInt(i2(local_file_header + 8), 0); + assertEqualInt(i2le(local_file_header + 8), 0); /* Check crc */ - assertEqualInt(i4(local_file_header + 14), 0); + assertEqualInt(i4le(local_file_header + 14), 0); /* Check compressed size * 0 because it was unknown at time of writing */ - assertEqualInt(i4(local_file_header + 18), 0); + assertEqualInt(i4le(local_file_header + 18), 0); /* Check uncompressed size * 0 because it was unknown at time of writing */ - assertEqualInt(i4(local_file_header + 22), 0); + assertEqualInt(i4le(local_file_header + 22), 0); /* Check pathname length */ - assertEqualInt(i2(local_file_header + 26), strlen(file_name)); + assertEqualInt(i2le(local_file_header + 26), strlen(file_name)); /* Check extra field length */ - assertEqualInt(i2(local_file_header + 28), 15); + assertEqualInt(i2le(local_file_header + 28), 15); /* Check path name match */ assertEqualMem(local_file_header + 30, file_name, strlen(file_name)); /* Start of data */ - const char *data = local_file_header + i2(local_file_header + 28) + strlen(file_name) + 30; + const char *data = local_file_header + i2le(local_file_header + 28) + strlen(file_name) + 30; /* Check for file data match */ assertEqualMem(data, file_data1, sizeof(file_data1)); assertEqualMem(data + sizeof(file_data1), file_data2, sizeof(file_data2)); @@ -202,14 +166,14 @@ /* Check data descriptor signature */ assertEqualMem(data_descriptor, "PK\x7\x8", 4); /* Check crc value */ - assertEqualInt(i4(data_descriptor + 4), crc); + assertEqualInt(i4le(data_descriptor + 4), crc); /* Check compressed size */ - assertEqualInt(i4(data_descriptor + 8), sizeof(file_data1) + sizeof(file_data2)); + assertEqualInt(i4le(data_descriptor + 8), sizeof(file_data1) + sizeof(file_data2)); /* Check uncompressed size */ - assertEqualInt(i4(data_descriptor + 12), sizeof(file_data1) + sizeof(file_data2)); + assertEqualInt(i4le(data_descriptor + 12), sizeof(file_data1) + sizeof(file_data2)); /* Get folder entry in central directory */ - const char *central_directory_folder_entry = central_directory + 46 + i2(local_file_header + 28) + strlen(file_name); + const char *central_directory_folder_entry = central_directory + 46 + i2le(local_file_header + 28) + strlen(file_name); /* Get start of folder entry */ const char *local_folder_header = data_descriptor + 16; @@ -217,58 +181,58 @@ /* Check for entry in central directory signature */ assertEqualMem(central_directory_folder_entry, "PK\x1\x2", 4); /* Check version made by */ - assertEqualInt(i2(central_directory_folder_entry + 4), 3 * 256 + 20); + assertEqualInt(i2le(central_directory_folder_entry + 4), 3 * 256 + 20); /* Check version needed to extract */ - assertEqualInt(i2(central_directory_folder_entry + 6), 20); + assertEqualInt(i2le(central_directory_folder_entry + 6), 20); /* Check flags */ - assertEqualInt(i2(central_directory_folder_entry + 8), 0); + assertEqualInt(i2le(central_directory_folder_entry + 8), 0); /* Check compression method */ - assertEqualInt(i2(central_directory_folder_entry + 10), 0); + assertEqualInt(i2le(central_directory_folder_entry + 10), 0); /* Check crc */ - assertEqualInt(i2(central_directory_folder_entry + 16), 0); + assertEqualInt(i2le(central_directory_folder_entry + 16), 0); /* Check compressed size */ - assertEqualInt(i4(central_directory_folder_entry + 20), 0); + assertEqualInt(i4le(central_directory_folder_entry + 20), 0); /* Check uncompressed size */ - assertEqualInt(i4(central_directory_folder_entry + 24), 0); + assertEqualInt(i4le(central_directory_folder_entry + 24), 0); /* Check path name length */ - assertEqualInt(i2(central_directory_folder_entry + 28), strlen(folder_name)); + assertEqualInt(i2le(central_directory_folder_entry + 28), strlen(folder_name)); /* Check extra field length */ - assertEqualInt(i2(central_directory_folder_entry + 30), 15); + assertEqualInt(i2le(central_directory_folder_entry + 30), 15); /* Check file comment length */ - assertEqualInt(i2(central_directory_folder_entry + 32), 0); + assertEqualInt(i2le(central_directory_folder_entry + 32), 0); /* Check disk number start */ - assertEqualInt(i2(central_directory_folder_entry + 34), 0); + assertEqualInt(i2le(central_directory_folder_entry + 34), 0); /* Check internal file attrs */ - assertEqualInt(i2(central_directory_folder_entry + 36), 0); + assertEqualInt(i2le(central_directory_folder_entry + 36), 0); /* Check external file attrs */ - assertEqualInt(i4(central_directory_folder_entry + 38) >> 16 & 01777, folder_perm); + assertEqualInt(i4le(central_directory_folder_entry + 38) >> 16 & 01777, folder_perm); /* Check offset of local header*/ - assertEqualInt(i4(central_directory_folder_entry + 42), local_folder_header - zip_buff); + assertEqualInt(i4le(central_directory_folder_entry + 42), local_folder_header - zip_buff); /* Check path name */ assertEqualMem(central_directory_folder_entry + 46, folder_name, strlen(folder_name)); /* Check local header */ assertEqualMem(local_folder_header, "PK\x3\x4", 4); /* Check version to extract */ - assertEqualInt(i2(local_folder_header + 4), 20); + assertEqualInt(i2le(local_folder_header + 4), 20); /* Check flags */ - assertEqualInt(i2(local_folder_header + 6), 0); + assertEqualInt(i2le(local_folder_header + 6), 0); /* Check compression method */ - assertEqualInt(i2(local_folder_header + 8), 0); + assertEqualInt(i2le(local_folder_header + 8), 0); /* Check crc */ - assertEqualInt(i4(local_folder_header + 14), 0); + assertEqualInt(i4le(local_folder_header + 14), 0); /* Check compressed size */ - assertEqualInt(i2(local_folder_header + 18), 0); + assertEqualInt(i2le(local_folder_header + 18), 0); /* Check uncompressed size */ - assertEqualInt(i4(local_folder_header + 22), 0); + assertEqualInt(i4le(local_folder_header + 22), 0); /* Check path name length */ - assertEqualInt(i2(local_folder_header + 26), strlen(folder_name)); + assertEqualInt(i2le(local_folder_header + 26), strlen(folder_name)); /* Check extra field length */ - assertEqualInt(i2(local_folder_header + 28), 15); + assertEqualInt(i2le(local_folder_header + 28), 15); /* Check path name */ assertEqualMem(local_folder_header + 30, folder_name, strlen(folder_name)); - const char *post_local_folder = local_folder_header + 30 + i2(local_folder_header + 28) + strlen(folder_name); + const char *post_local_folder = local_folder_header + 30 + i2le(local_folder_header + 28) + strlen(folder_name); assertEqualMem(post_local_folder, central_directory, 4); } --- contrib/libarchive/libarchive/test/test_write_format_zip_file.c.orig +++ contrib/libarchive/libarchive/test/test_write_format_zip_file.c @@ -35,38 +35,6 @@ * with a single file written to it. */ -static unsigned long -bitcrc32(unsigned long c, void *_p, size_t s) -{ - /* This is a drop-in replacement for crc32() from zlib. - * Libarchive should be able to correctly generate - * uncompressed zip archives (including correct CRCs) even - * when zlib is unavailable, and this function helps us verify - * that. Yes, this is very, very slow and unsuitable for - * production use, but it's correct, compact, and works well - * enough for this particular usage. Libarchive internally - * uses a much more efficient implementation. */ - const unsigned char *p = _p; - int bitctr; - - if (p == NULL) - return (0); - - for (; s > 0; --s) { - c ^= *p++; - for (bitctr = 8; bitctr > 0; --bitctr) { - if (c & 1) c = (c >> 1); - else c = (c >> 1) ^ 0xedb88320; - c ^= 0x80000000; - } - } - return (c); -} - -/* Quick and dirty: Read 2-byte and 4-byte integers from Zip file. */ -static unsigned i2(const unsigned char *p) { return ((p[0] & 0xff) | ((p[1] & 0xff) << 8)); } -static unsigned i4(const unsigned char *p) { return (i2(p) | (i2(p + 2) << 16)); } - DEFINE_TEST(test_write_format_zip_file) { struct archive *a; @@ -78,7 +46,7 @@ #endif size_t used, buffsize = 1000000; unsigned long crc; - int file_perm = 00644; + __LA_MODE_T file_perm = 00644; int zip_version = 20; int zip_compression = 8; short file_uid = 10, file_gid = 20; @@ -131,60 +99,60 @@ failure("End-of-central-directory begins with PK\\005\\006 signature"); assertEqualMem(p, "PK\005\006", 4); failure("This must be disk 0"); - assertEqualInt(i2(p + 4), 0); + assertEqualInt(i2le(p + 4), 0); failure("Central dir must start on disk 0"); - assertEqualInt(i2(p + 6), 0); + assertEqualInt(i2le(p + 6), 0); failure("All central dir entries are on this disk"); - assertEqualInt(i2(p + 8), i2(p + 10)); - eocd = buff + i4(p + 12) + i4(p + 16); + assertEqualInt(i2le(p + 8), i2le(p + 10)); + eocd = buff + i4le(p + 12) + i4le(p + 16); failure("no zip comment"); - assertEqualInt(i2(p + 20), 0); + assertEqualInt(i2le(p + 20), 0); /* Get address of first entry in central directory. */ - central_header = p = buff + i4(buffend - 6); - failure("Central file record at offset %d should begin with" + central_header = p = buff + i4le(buffend - 6); + failure("Central file record at offset %u should begin with" " PK\\001\\002 signature", - i4(buffend - 10)); + i4le(buffend - 10)); /* Verify file entry in central directory. */ assertEqualMem(p, "PK\001\002", 4); /* Signature */ - assertEqualInt(i2(p + 4), 3 * 256 + zip_version); /* Version made by */ - assertEqualInt(i2(p + 6), zip_version); /* Version needed to extract */ - assertEqualInt(i2(p + 8), 8); /* Flags */ - assertEqualInt(i2(p + 10), zip_compression); /* Compression method */ - assertEqualInt(i2(p + 12), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ - assertEqualInt(i2(p + 14), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ + assertEqualInt(i2le(p + 4), 3 * 256 + zip_version); /* Version made by */ + assertEqualInt(i2le(p + 6), zip_version); /* Version needed to extract */ + assertEqualInt(i2le(p + 8), 8); /* Flags */ + assertEqualInt(i2le(p + 10), zip_compression); /* Compression method */ + assertEqualInt(i2le(p + 12), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ + assertEqualInt(i2le(p + 14), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ crc = bitcrc32(0, file_data, sizeof(file_data)); - assertEqualInt(i4(p + 16), crc); /* CRC-32 */ - /* assertEqualInt(i4(p + 20), sizeof(file_data)); */ /* Compressed size */ - assertEqualInt(i4(p + 24), sizeof(file_data)); /* Uncompressed size */ - assertEqualInt(i2(p + 28), strlen(file_name)); /* Pathname length */ - /* assertEqualInt(i2(p + 30), 28); */ /* Extra field length: See below */ - assertEqualInt(i2(p + 32), 0); /* File comment length */ - assertEqualInt(i2(p + 34), 0); /* Disk number start */ - assertEqualInt(i2(p + 36), 0); /* Internal file attrs */ - assertEqualInt(i4(p + 38) >> 16 & 01777, file_perm); /* External file attrs */ - assertEqualInt(i4(p + 42), 0); /* Offset of local header */ + assertEqualInt(i4le(p + 16), crc); /* CRC-32 */ + /* assertEqualInt(i4le(p + 20), sizeof(file_data)); */ /* Compressed size */ + assertEqualInt(i4le(p + 24), sizeof(file_data)); /* Uncompressed size */ + assertEqualInt(i2le(p + 28), strlen(file_name)); /* Pathname length */ + /* assertEqualInt(i2le(p + 30), 28); */ /* Extra field length: See below */ + assertEqualInt(i2le(p + 32), 0); /* File comment length */ + assertEqualInt(i2le(p + 34), 0); /* Disk number start */ + assertEqualInt(i2le(p + 36), 0); /* Internal file attrs */ + assertEqualInt(i4le(p + 38) >> 16 & 01777, file_perm); /* External file attrs */ + assertEqualInt(i4le(p + 42), 0); /* Offset of local header */ assertEqualMem(p + 46, file_name, strlen(file_name)); /* Pathname */ p = extension_start = central_header + 46 + strlen(file_name); - extension_end = extension_start + i2(central_header + 30); + extension_end = extension_start + i2le(central_header + 30); - assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ - assertEqualInt(i2(p + 2), 11); /* 'ux' size */ + assertEqualInt(i2le(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(p + 2), 11); /* 'ux' size */ /* TODO: verify 'ux' contents */ - p += 4 + i2(p + 2); + p += 4 + i2le(p + 2); - assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(i2le(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(p + 2), 5); /* 'UT' size */ assertEqualInt(p[4], 1); /* 'UT' flags */ - assertEqualInt(i4(p + 5), t); /* 'UT' mtime */ - p += 4 + i2(p + 2); + assertEqualInt(i4le(p + 5), t); /* 'UT' mtime */ + p += 4 + i2le(p + 2); /* Just in case: Report any extra extensions. */ while (p < extension_end) { - failure("Unexpected extension 0x%04X", i2(p)); + failure("Unexpected extension 0x%04X", i2le(p)); assert(0); - p += 4 + i2(p + 2); + p += 4 + i2le(p + 2); } /* Should have run exactly to end of extra data. */ @@ -198,48 +166,48 @@ /* Verify local header of file entry. */ p = local_header = buff; assertEqualMem(p, "PK\003\004", 4); /* Signature */ - assertEqualInt(i2(p + 4), zip_version); /* Version needed to extract */ - assertEqualInt(i2(p + 6), 8); /* Flags: bit 3 = length-at-end */ - assertEqualInt(i2(p + 8), zip_compression); /* Compression method */ - assertEqualInt(i2(p + 10), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ - assertEqualInt(i2(p + 12), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ - assertEqualInt(i4(p + 14), 0); /* CRC-32 stored as zero because we're using length-at-end */ - assertEqualInt(i4(p + 18), 0); /* Compressed size stored as zero because we're using length-at-end. */ - assertEqualInt(i4(p + 22), 0); /* Uncompressed size stored as zero because we're using length-at-end. */ - assertEqualInt(i2(p + 26), strlen(file_name)); /* Pathname length */ - assertEqualInt(i2(p + 28), 37); /* Extra field length */ + assertEqualInt(i2le(p + 4), zip_version); /* Version needed to extract */ + assertEqualInt(i2le(p + 6), 8); /* Flags: bit 3 = length-at-end */ + assertEqualInt(i2le(p + 8), zip_compression); /* Compression method */ + assertEqualInt(i2le(p + 10), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ + assertEqualInt(i2le(p + 12), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ + assertEqualInt(i4le(p + 14), 0); /* CRC-32 stored as zero because we're using length-at-end */ + assertEqualInt(i4le(p + 18), 0); /* Compressed size stored as zero because we're using length-at-end. */ + assertEqualInt(i4le(p + 22), 0); /* Uncompressed size stored as zero because we're using length-at-end. */ + assertEqualInt(i2le(p + 26), strlen(file_name)); /* Pathname length */ + assertEqualInt(i2le(p + 28), 37); /* Extra field length */ assertEqualMem(p + 30, file_name, strlen(file_name)); /* Pathname */ p = extension_start = local_header + 30 + strlen(file_name); - extension_end = extension_start + i2(local_header + 28); + extension_end = extension_start + i2le(local_header + 28); - assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ - assertEqualInt(i2(p + 2), 11); /* size */ + assertEqualInt(i2le(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(p + 2), 11); /* size */ assertEqualInt(p[4], 1); /* 'ux' version */ assertEqualInt(p[5], 4); /* 'ux' uid size */ - assertEqualInt(i4(p + 6), file_uid); /* 'Ux' UID */ + assertEqualInt(i4le(p + 6), file_uid); /* 'Ux' UID */ assertEqualInt(p[10], 4); /* 'ux' gid size */ - assertEqualInt(i4(p + 11), file_gid); /* 'Ux' GID */ - p += 4 + i2(p + 2); + assertEqualInt(i4le(p + 11), file_gid); /* 'Ux' GID */ + p += 4 + i2le(p + 2); - assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(p + 2), 5); /* size */ + assertEqualInt(i2le(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(p + 2), 5); /* size */ assertEqualInt(p[4], 1); /* 'UT' flags */ - assertEqualInt(i4(p + 5), t); /* 'UT' mtime */ - p += 4 + i2(p + 2); + assertEqualInt(i4le(p + 5), t); /* 'UT' mtime */ + p += 4 + i2le(p + 2); - assertEqualInt(i2(p), 0x6c78); /* 'xl' experimental extension block */ - assertEqualInt(i2(p + 2), 9); /* size */ + assertEqualInt(i2le(p), 0x6c78); /* 'xl' experimental extension block */ + assertEqualInt(i2le(p + 2), 9); /* size */ assertEqualInt(p[4], 7); /* bitmap of fields in this block */ - assertEqualInt(i2(p + 5) >> 8, 3); /* System & version made by */ - assertEqualInt(i2(p + 7), 0); /* internal file attributes */ - assertEqualInt(i4(p + 9) >> 16 & 01777, file_perm); /* external file attributes */ - p += 4 + i2(p + 2); + assertEqualInt(i2le(p + 5) >> 8, 3); /* System & version made by */ + assertEqualInt(i2le(p + 7), 0); /* internal file attributes */ + assertEqualInt(i4le(p + 9) >> 16 & 01777, file_perm); /* external file attributes */ + p += 4 + i2le(p + 2); /* Just in case: Report any extra extensions. */ while (p < extension_end) { - failure("Unexpected extension 0x%04X", i2(p)); + failure("Unexpected extension 0x%04X", i2le(p)); assert(0); - p += 4 + i2(p + 2); + p += 4 + i2le(p + 2); } /* Should have run exactly to end of extra data. */ @@ -249,9 +217,9 @@ while (p < central_header && memcmp(p, "PK\007\010", 4) != 0) ++p; assertEqualMem(p, "PK\007\010", 4); - assertEqualInt(i4(p + 4), crc); /* CRC-32 */ - assertEqualInt(i4(p + 8), p - extension_end); /* compressed size */ - assertEqualInt(i4(p + 12), sizeof(file_data)); /* uncompressed size */ + assertEqualInt(i4le(p + 4), crc); /* CRC-32 */ + assertEqualInt(i4le(p + 8), p - extension_end); /* compressed size */ + assertEqualInt(i4le(p + 12), sizeof(file_data)); /* uncompressed size */ /* Central directory should immediately follow the only entry. */ assertEqualAddress(p + 16, central_header); --- contrib/libarchive/libarchive/test/test_write_format_zip_file_zip64.c.orig +++ contrib/libarchive/libarchive/test/test_write_format_zip_file_zip64.c @@ -35,40 +35,6 @@ * with a single file written to it that uses Zip64 extensions. */ -static unsigned long -bitcrc32(unsigned long c, void *_p, size_t s) -{ - /* This is a drop-in replacement for crc32() from zlib. - * Libarchive should be able to correctly generate - * uncompressed zip archives (including correct CRCs) even - * when zlib is unavailable, and this function helps us verify - * that. Yes, this is very, very slow and unsuitable for - * production use, but it's correct, compact, and works well - * enough for this particular usage. Libarchive internally - * uses a much more efficient implementation. */ - const unsigned char *p = _p; - int bitctr; - - if (p == NULL) - return (0); - - for (; s > 0; --s) { - c ^= *p++; - for (bitctr = 8; bitctr > 0; --bitctr) { - if (c & 1) c = (c >> 1); - else c = (c >> 1) ^ 0xedb88320; - c ^= 0x80000000; - } - } - return (c); -} - -/* Quick and dirty: Read 2-byte and 4-byte integers from Zip file. */ -static unsigned i2(const unsigned char *p) { return ((p[0] & 0xff) | ((p[1] & 0xff) << 8)); } -static unsigned i4(const unsigned char *p) { return (i2(p) | (i2(p + 2) << 16)); } -/* We're only working with small values here; ignore the 4 high bytes. */ -static unsigned i8(const unsigned char *p) { return (i4(p)); } - DEFINE_TEST(test_write_format_zip_file_zip64) { struct archive *a; @@ -80,7 +46,7 @@ #endif size_t used, buffsize = 1000000; unsigned long crc; - int file_perm = 00644; + __LA_MODE_T file_perm = 00644; int zip_version = 45; int zip_compression = 8; short file_uid = 10, file_gid = 20; @@ -134,54 +100,54 @@ failure("End-of-central-directory begins with PK\\005\\006 signature"); assertEqualMem(p, "PK\005\006", 4); failure("This must be disk 0"); - assertEqualInt(i2(p + 4), 0); + assertEqualInt(i2le(p + 4), 0); failure("Central dir must start on disk 0"); - assertEqualInt(i2(p + 6), 0); + assertEqualInt(i2le(p + 6), 0); failure("All central dir entries are on this disk"); - assertEqualInt(i2(p + 8), i2(p + 10)); - eocd = buff + i4(p + 12) + i4(p + 16); + assertEqualInt(i2le(p + 8), i2le(p + 10)); + eocd = buff + i4le(p + 12) + i4le(p + 16); failure("no zip comment"); - assertEqualInt(i2(p + 20), 0); + assertEqualInt(i2le(p + 20), 0); /* Get address of first entry in central directory. */ - central_header = p = buff + i4(buffend - 6); - failure("Central file record at offset %d should begin with" + central_header = p = buff + i4le(buffend - 6); + failure("Central file record at offset %u should begin with" " PK\\001\\002 signature", - i4(buffend - 10)); + i4le(buffend - 10)); /* Verify file entry in central directory. */ assertEqualMem(p, "PK\001\002", 4); /* Signature */ - assertEqualInt(i2(p + 4), 3 * 256 + zip_version); /* Version made by */ - assertEqualInt(i2(p + 6), zip_version); /* Version needed to extract */ - assertEqualInt(i2(p + 8), 8); /* Flags */ - assertEqualInt(i2(p + 10), zip_compression); /* Compression method */ - assertEqualInt(i2(p + 12), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ - assertEqualInt(i2(p + 14), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ + assertEqualInt(i2le(p + 4), 3 * 256 + zip_version); /* Version made by */ + assertEqualInt(i2le(p + 6), zip_version); /* Version needed to extract */ + assertEqualInt(i2le(p + 8), 8); /* Flags */ + assertEqualInt(i2le(p + 10), zip_compression); /* Compression method */ + assertEqualInt(i2le(p + 12), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ + assertEqualInt(i2le(p + 14), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ crc = bitcrc32(0, file_data, sizeof(file_data)); - assertEqualInt(i4(p + 16), crc); /* CRC-32 */ - /* assertEqualInt(i4(p + 20), sizeof(file_data)); */ /* Compressed size */ - assertEqualInt(i4(p + 24), sizeof(file_data)); /* Uncompressed size */ - assertEqualInt(i2(p + 28), strlen(file_name)); /* Pathname length */ - /* assertEqualInt(i2(p + 30), 28); */ /* Extra field length: See below */ - assertEqualInt(i2(p + 32), 0); /* File comment length */ - assertEqualInt(i2(p + 34), 0); /* Disk number start */ - assertEqualInt(i2(p + 36), 0); /* Internal file attrs */ - assertEqualInt(i4(p + 38) >> 16 & 01777, file_perm); /* External file attrs */ - assertEqualInt(i4(p + 42), 0); /* Offset of local header */ + assertEqualInt(i4le(p + 16), crc); /* CRC-32 */ + /* assertEqualInt(i4le(p + 20), sizeof(file_data)); */ /* Compressed size */ + assertEqualInt(i4le(p + 24), sizeof(file_data)); /* Uncompressed size */ + assertEqualInt(i2le(p + 28), strlen(file_name)); /* Pathname length */ + /* assertEqualInt(i2le(p + 30), 28); */ /* Extra field length: See below */ + assertEqualInt(i2le(p + 32), 0); /* File comment length */ + assertEqualInt(i2le(p + 34), 0); /* Disk number start */ + assertEqualInt(i2le(p + 36), 0); /* Internal file attrs */ + assertEqualInt(i4le(p + 38) >> 16 & 01777, file_perm); /* External file attrs */ + assertEqualInt(i4le(p + 42), 0); /* Offset of local header */ assertEqualMem(p + 46, file_name, strlen(file_name)); /* Pathname */ p = extension_start = central_header + 46 + strlen(file_name); - extension_end = extension_start + i2(central_header + 30); + extension_end = extension_start + i2le(central_header + 30); - assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ - assertEqualInt(i2(p + 2), 11); /* 'ux' size */ + assertEqualInt(i2le(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(p + 2), 11); /* 'ux' size */ /* TODO: verify 'ux' contents */ - p += 4 + i2(p + 2); + p += 4 + i2le(p + 2); - assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(i2le(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(p + 2), 5); /* 'UT' size */ assertEqualInt(p[4], 1); /* 'UT' flags */ - assertEqualInt(i4(p + 5), t); /* 'UT' mtime */ - p += 4 + i2(p + 2); + assertEqualInt(i4le(p + 5), t); /* 'UT' mtime */ + p += 4 + i2le(p + 2); /* Note: We don't expect to see zip64 extension in the central * directory, since the writer knows the actual full size by @@ -191,9 +157,9 @@ /* Just in case: Report any extra extensions. */ while (p < extension_end) { - failure("Unexpected extension 0x%04X", i2(p)); + failure("Unexpected extension 0x%04X", i2le(p)); assert(0); - p += 4 + i2(p + 2); + p += 4 + i2le(p + 2); } /* Should have run exactly to end of extra data. */ @@ -203,21 +169,21 @@ /* After Central dir, we find Zip64 eocd and Zip64 eocd locator. */ assertEqualMem(p, "PK\006\006", 4); /* Zip64 eocd */ - assertEqualInt(i8(p + 4), 44); /* We're using v1 Zip64 eocd */ - assertEqualInt(i2(p + 12), 45); /* Written by Version 4.5 */ - assertEqualInt(i2(p + 14), 45); /* Needs version 4.5 to extract */ - assertEqualInt(i4(p + 16), 0); /* This is disk #0 */ - assertEqualInt(i4(p + 20), 0); /* Dir starts on disk #0 */ - assertEqualInt(i8(p + 24), 1); /* 1 entry on this disk */ - assertEqualInt(i8(p + 32), 1); /* 1 entry total */ - assertEqualInt(i8(p + 40), eocd - central_header); /* size of cd */ - assertEqualInt(i8(p + 48), central_header - buff); /* start of cd */ - p += 12 + i8(p + 4); + assertEqualInt(i8le(p + 4), 44); /* We're using v1 Zip64 eocd */ + assertEqualInt(i2le(p + 12), 45); /* Written by Version 4.5 */ + assertEqualInt(i2le(p + 14), 45); /* Needs version 4.5 to extract */ + assertEqualInt(i4le(p + 16), 0); /* This is disk #0 */ + assertEqualInt(i4le(p + 20), 0); /* Dir starts on disk #0 */ + assertEqualInt(i8le(p + 24), 1); /* 1 entry on this disk */ + assertEqualInt(i8le(p + 32), 1); /* 1 entry total */ + assertEqualInt(i8le(p + 40), eocd - central_header); /* size of cd */ + assertEqualInt(i8le(p + 48), central_header - buff); /* start of cd */ + p += 12 + i8le(p + 4); assertEqualMem(p, "PK\006\007", 4); /* Zip64 eocd locator */ - assertEqualInt(i4(p + 4), 0); /* Zip64 eocd is on disk #0 */ - assertEqualInt(i8(p + 8), eocd - buff); /* Offset of Zip64 eocd */ - assertEqualInt(i4(p + 16), 1); /* 1 disk */ + assertEqualInt(i4le(p + 4), 0); /* Zip64 eocd is on disk #0 */ + assertEqualInt(i8le(p + 8), eocd - buff); /* Offset of Zip64 eocd */ + assertEqualInt(i4le(p + 16), 1); /* 1 disk */ p += 20; /* Regular EOCD immediately follows Zip64 records. */ @@ -226,48 +192,48 @@ /* Verify local header of file entry. */ p = local_header = buff; assertEqualMem(p, "PK\003\004", 4); /* Signature */ - assertEqualInt(i2(p + 4), zip_version); /* Version needed to extract */ - assertEqualInt(i2(p + 6), 8); /* Flags: bit 3 = length-at-end */ - assertEqualInt(i2(p + 8), zip_compression); /* Compression method */ - assertEqualInt(i2(p + 10), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ - assertEqualInt(i2(p + 12), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ - assertEqualInt(i4(p + 14), 0); /* CRC-32 must be 0 because of length-at-end */ - assertEqualInt(i4(p + 18), 0); /* Compressed size must be 0 because of length-at-end */ - assertEqualInt(i4(p + 22), 0); /* Uncompressed size must be 0 because of length-at-end. */ - assertEqualInt(i2(p + 26), strlen(file_name)); /* Pathname length */ - assertEqualInt(i2(p + 28), 37); /* Extra field length */ + assertEqualInt(i2le(p + 4), zip_version); /* Version needed to extract */ + assertEqualInt(i2le(p + 6), 8); /* Flags: bit 3 = length-at-end */ + assertEqualInt(i2le(p + 8), zip_compression); /* Compression method */ + assertEqualInt(i2le(p + 10), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ + assertEqualInt(i2le(p + 12), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ + assertEqualInt(i4le(p + 14), 0); /* CRC-32 must be 0 because of length-at-end */ + assertEqualInt(i4le(p + 18), 0); /* Compressed size must be 0 because of length-at-end */ + assertEqualInt(i4le(p + 22), 0); /* Uncompressed size must be 0 because of length-at-end. */ + assertEqualInt(i2le(p + 26), strlen(file_name)); /* Pathname length */ + assertEqualInt(i2le(p + 28), 37); /* Extra field length */ assertEqualMem(p + 30, file_name, strlen(file_name)); /* Pathname */ p = extension_start = local_header + 30 + strlen(file_name); - extension_end = extension_start + i2(local_header + 28); + extension_end = extension_start + i2le(local_header + 28); - assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ - assertEqualInt(i2(p + 2), 11); /* 'ux' size */ + assertEqualInt(i2le(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(p + 2), 11); /* 'ux' size */ assertEqualInt(p[4], 1); /* 'ux' version */ assertEqualInt(p[5], 4); /* 'ux' uid size */ - assertEqualInt(i4(p + 6), file_uid); /* 'Ux' UID */ + assertEqualInt(i4le(p + 6), file_uid); /* 'Ux' UID */ assertEqualInt(p[10], 4); /* 'ux' gid size */ - assertEqualInt(i4(p + 11), file_gid); /* 'Ux' GID */ - p += 4 + i2(p + 2); + assertEqualInt(i4le(p + 11), file_gid); /* 'Ux' GID */ + p += 4 + i2le(p + 2); - assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(i2le(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(p + 2), 5); /* 'UT' size */ assertEqualInt(p[4], 1); /* 'UT' flags */ - assertEqualInt(i4(p + 5), t); /* 'UT' mtime */ - p += 4 + i2(p + 2); + assertEqualInt(i4le(p + 5), t); /* 'UT' mtime */ + p += 4 + i2le(p + 2); - assertEqualInt(i2(p), 0x6c78); /* 'xl' experimental extension header */ - assertEqualInt(i2(p + 2), 9); /* size */ + assertEqualInt(i2le(p), 0x6c78); /* 'xl' experimental extension header */ + assertEqualInt(i2le(p + 2), 9); /* size */ assertEqualInt(p[4], 7); /* bitmap of included fields */ - assertEqualInt(i2(p + 5) >> 8, 3); /* system & version made by */ - assertEqualInt(i2(p + 7), 0); /* internal file attributes */ - assertEqualInt(i4(p + 9) >> 16 & 01777, file_perm); /* external file attributes */ - p += 4 + i2(p + 2); + assertEqualInt(i2le(p + 5) >> 8, 3); /* system & version made by */ + assertEqualInt(i2le(p + 7), 0); /* internal file attributes */ + assertEqualInt(i4le(p + 9) >> 16 & 01777, file_perm); /* external file attributes */ + p += 4 + i2le(p + 2); /* Just in case: Report any extra extensions. */ while (p < extension_end) { - failure("Unexpected extension 0x%04X", i2(p)); + failure("Unexpected extension 0x%04X", i2le(p)); assert(0); - p += 4 + i2(p + 2); + p += 4 + i2le(p + 2); } /* Should have run exactly to end of extra data. */ @@ -277,9 +243,9 @@ while (p < central_header && memcmp(p, "PK\007\010", 4) != 0) ++p; assertEqualMem(p, "PK\007\010", 4); - assertEqualInt(i4(p + 4), crc); /* CRC-32 */ - assertEqualInt(i8(p + 8), p - extension_end); /* compressed size */ - assertEqualInt(i8(p + 16), sizeof(file_data)); /* uncompressed size */ + assertEqualInt(i4le(p + 4), crc); /* CRC-32 */ + assertEqualInt(i8le(p + 8), p - extension_end); /* compressed size */ + assertEqualInt(i8le(p + 16), sizeof(file_data)); /* uncompressed size */ /* Central directory should immediately follow the only entry. */ assertEqualAddress(p + 24, central_header); --- contrib/libarchive/libarchive/test/test_write_format_zip_large.c.orig +++ contrib/libarchive/libarchive/test/test_write_format_zip_large.c @@ -62,25 +62,6 @@ #define GB ((int64_t)1024 * MB) #define TB ((int64_t)1024 * GB) -static int64_t memory_read_skip(struct archive *, void *, int64_t request); -static ssize_t memory_read(struct archive *, void *, const void **buff); -static ssize_t memory_write(struct archive *, void *, const void *, size_t); - -static uint16_t le16(const void *_p) { - const uint8_t *p = _p; - return p[0] | (p[1] << 8); -} - -static uint32_t le32(const void *_p) { - const uint8_t *p = _p; - return le16(p) | ((uint32_t)le16(p + 2) << 16); -} - -static uint64_t le64(const void *_p) { - const uint8_t *p = _p; - return le32(p) | ((uint64_t)le32(p + 4) << 32); -} - static ssize_t memory_write(struct archive *a, void *_private, const void *buff, size_t size) { @@ -436,7 +417,7 @@ eocd = p - 22; assertEqualMem(eocd, "PK\005\006\0\0\0\0", 8); assertEqualMem(eocd + 8, "\010\0\010\0", 4); /* 8 entries total */ - cd_size = le32(eocd + 12); + cd_size = i4le(eocd + 12); /* Start of CD offset should be 0xffffffff */ assertEqualMem(eocd + 16, "\xff\xff\xff\xff", 4); assertEqualMem(eocd + 20, "\0\0", 2); /* No Zip comment */ @@ -444,25 +425,25 @@ /* Verify Zip64 locator */ zip64_locator = p - 42; assertEqualMem(zip64_locator, "PK\006\007\0\0\0\0", 8); - zip64_eocd = p - (fileblocks->filesize - le64(zip64_locator + 8)); + zip64_eocd = p - (fileblocks->filesize - i8le(zip64_locator + 8)); assertEqualMem(zip64_locator + 16, "\001\0\0\0", 4); /* Verify Zip64 end-of-cd record. */ assert(zip64_eocd == p - 98); assertEqualMem(zip64_eocd, "PK\006\006", 4); - assertEqualInt(44, le64(zip64_eocd + 4)); // Size of EoCD record - 12 + assertEqualInt(44, i8le(zip64_eocd + 4)); // Size of EoCD record - 12 assertEqualMem(zip64_eocd + 12, "\055\0", 2); // Made by version: 45 assertEqualMem(zip64_eocd + 14, "\055\0", 2); // Requires version: 45 assertEqualMem(zip64_eocd + 16, "\0\0\0\0", 4); // This disk assertEqualMem(zip64_eocd + 20, "\0\0\0\0", 4); // Total disks - assertEqualInt(8, le64(zip64_eocd + 24)); // Entries on this disk - assertEqualInt(8, le64(zip64_eocd + 32)); // Total entries - cd_size = le64(zip64_eocd + 40); - cd_start = p - (fileblocks->filesize - le64(zip64_eocd + 48)); + assertEqualInt(8, i8le(zip64_eocd + 24)); // Entries on this disk + assertEqualInt(8, i8le(zip64_eocd + 32)); // Total entries + cd_size = i8le(zip64_eocd + 40); + cd_start = p - (fileblocks->filesize - i8le(zip64_eocd + 48)); assert(cd_start + cd_size == zip64_eocd); - assertEqualInt(le64(zip64_eocd + 48) // Start of CD + assertEqualInt(i8le(zip64_eocd + 48) // Start of CD + cd_size + 56 // Size of Zip64 EOCD + 20 // Size of Zip64 locator --- contrib/libarchive/libarchive/test/test_write_format_zip_stream.c.orig +++ contrib/libarchive/libarchive/test/test_write_format_zip_stream.c @@ -31,38 +31,6 @@ * written in streaming mode WITHOUT Zip64 extensions enabled. */ -static unsigned long -bitcrc32(unsigned long c, void *_p, size_t s) -{ - /* This is a drop-in replacement for crc32() from zlib. - * Libarchive should be able to correctly generate - * uncompressed zip archives (including correct CRCs) even - * when zlib is unavailable, and this function helps us verify - * that. Yes, this is very, very slow and unsuitable for - * production use, but it's correct, compact, and works well - * enough for this particular usage. Libarchive internally - * uses a much more efficient implementation. */ - const unsigned char *p = _p; - int bitctr; - - if (p == NULL) - return (0); - - for (; s > 0; --s) { - c ^= *p++; - for (bitctr = 8; bitctr > 0; --bitctr) { - if (c & 1) c = (c >> 1); - else c = (c >> 1) ^ 0xedb88320; - c ^= 0x80000000; - } - } - return (c); -} - -/* Quick and dirty: Read 2-byte and 4-byte integers from Zip file. */ -static unsigned i2(const unsigned char *p) { return ((p[0] & 0xff) | ((p[1] & 0xff) << 8)); } -static unsigned i4(const unsigned char *p) { return (i2(p) | (i2(p + 2) << 16)); } - DEFINE_TEST(test_write_format_zip_stream) { struct archive *a; @@ -70,7 +38,7 @@ size_t used, buffsize = 1000000; unsigned long crc; unsigned long compressed_size = 0; - int file_perm = 00644; + __LA_MODE_T file_perm = 00644; #ifdef HAVE_ZLIB_H int zip_version = 20; #else @@ -120,58 +88,58 @@ failure("End-of-central-directory begins with PK\\005\\006 signature"); assertEqualMem(p, "PK\005\006", 4); failure("This must be disk 0"); - assertEqualInt(i2(p + 4), 0); + assertEqualInt(i2le(p + 4), 0); failure("Central dir must start on disk 0"); - assertEqualInt(i2(p + 6), 0); + assertEqualInt(i2le(p + 6), 0); failure("All central dir entries are on this disk"); - assertEqualInt(i2(p + 8), i2(p + 10)); - eocd = buff + i4(p + 12) + i4(p + 16); + assertEqualInt(i2le(p + 8), i2le(p + 10)); + eocd = buff + i4le(p + 12) + i4le(p + 16); failure("no zip comment"); - assertEqualInt(i2(p + 20), 0); + assertEqualInt(i2le(p + 20), 0); /* Get address of first entry in central directory. */ - central_header = p = buff + i4(buffend - 6); - failure("Central file record at offset %d should begin with" + central_header = p = buff + i4le(buffend - 6); + failure("Central file record at offset %u should begin with" " PK\\001\\002 signature", - i4(buffend - 10)); + i4le(buffend - 10)); /* Verify file entry in central directory. */ assertEqualMem(p, "PK\001\002", 4); /* Signature */ - assertEqualInt(i2(p + 4), 3 * 256 + zip_version); /* Version made by */ - assertEqualInt(i2(p + 6), zip_version); /* Version needed to extract */ - assertEqualInt(i2(p + 8), 8); /* Flags */ - assertEqualInt(i2(p + 10), zip_compression); /* Compression method */ - assertEqualInt(i2(p + 12), 0); /* File time */ - assertEqualInt(i2(p + 14), 33); /* File date */ + assertEqualInt(i2le(p + 4), 3 * 256 + zip_version); /* Version made by */ + assertEqualInt(i2le(p + 6), zip_version); /* Version needed to extract */ + assertEqualInt(i2le(p + 8), 8); /* Flags */ + assertEqualInt(i2le(p + 10), zip_compression); /* Compression method */ + assertEqualInt(i2le(p + 12), 0); /* File time */ + assertEqualInt(i2le(p + 14), 33); /* File date */ crc = bitcrc32(0, file_data, sizeof(file_data)); - assertEqualInt(i4(p + 16), crc); /* CRC-32 */ - compressed_size = i4(p + 20); /* Compressed size */ - assertEqualInt(i4(p + 24), sizeof(file_data)); /* Uncompressed size */ - assertEqualInt(i2(p + 28), strlen(file_name)); /* Pathname length */ - /* assertEqualInt(i2(p + 30), 28); */ /* Extra field length: See below */ - assertEqualInt(i2(p + 32), 0); /* File comment length */ - assertEqualInt(i2(p + 34), 0); /* Disk number start */ - assertEqualInt(i2(p + 36), 0); /* Internal file attrs */ - assertEqualInt(i4(p + 38) >> 16 & 01777, file_perm); /* External file attrs */ - assertEqualInt(i4(p + 42), 0); /* Offset of local header */ + assertEqualInt(i4le(p + 16), crc); /* CRC-32 */ + compressed_size = i4le(p + 20); /* Compressed size */ + assertEqualInt(i4le(p + 24), sizeof(file_data)); /* Uncompressed size */ + assertEqualInt(i2le(p + 28), strlen(file_name)); /* Pathname length */ + /* assertEqualInt(i2le(p + 30), 28); */ /* Extra field length: See below */ + assertEqualInt(i2le(p + 32), 0); /* File comment length */ + assertEqualInt(i2le(p + 34), 0); /* Disk number start */ + assertEqualInt(i2le(p + 36), 0); /* Internal file attrs */ + assertEqualInt(i4le(p + 38) >> 16 & 01777, file_perm); /* External file attrs */ + assertEqualInt(i4le(p + 42), 0); /* Offset of local header */ assertEqualMem(p + 46, file_name, strlen(file_name)); /* Pathname */ p = extension_start = central_header + 46 + strlen(file_name); - extension_end = extension_start + i2(central_header + 30); + extension_end = extension_start + i2le(central_header + 30); - assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ - assertEqualInt(i2(p + 2), 11); /* 'ux' size */ + assertEqualInt(i2le(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(p + 2), 11); /* 'ux' size */ assertEqualInt(p[4], 1); /* 'ux' version */ assertEqualInt(p[5], 4); /* 'ux' uid size */ - assertEqualInt(i4(p + 6), file_uid); /* 'Ux' UID */ + assertEqualInt(i4le(p + 6), file_uid); /* 'Ux' UID */ assertEqualInt(p[10], 4); /* 'ux' gid size */ - assertEqualInt(i4(p + 11), file_gid); /* 'Ux' GID */ - p += 4 + i2(p + 2); + assertEqualInt(i4le(p + 11), file_gid); /* 'Ux' GID */ + p += 4 + i2le(p + 2); - assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(i2le(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(p + 2), 5); /* 'UT' size */ assertEqualInt(p[4], 1); /* 'UT' flags */ - assertEqualInt(i4(p + 5), 0); /* 'UT' mtime */ - p += 4 + i2(p + 2); + assertEqualInt(i4le(p + 5), 0); /* 'UT' mtime */ + p += 4 + i2le(p + 2); /* Note: We don't expect to see zip64 extension in the central * directory, since the writer knows the actual full size by @@ -181,9 +149,9 @@ /* Just in case: Report any extra extensions. */ while (p < extension_end) { - failure("Unexpected extension 0x%04X", i2(p)); + failure("Unexpected extension 0x%04X", i2le(p)); assert(0); - p += 4 + i2(p + 2); + p += 4 + i2le(p + 2); } /* Should have run exactly to end of extra data. */ @@ -195,40 +163,40 @@ /* Verify local header of file entry. */ p = local_header = buff; assertEqualMem(p, "PK\003\004", 4); /* Signature */ - assertEqualInt(i2(p + 4), zip_version); /* Version needed to extract */ - assertEqualInt(i2(p + 6), 8); /* Flags */ - assertEqualInt(i2(p + 8), zip_compression); /* Compression method */ - assertEqualInt(i2(p + 10), 0); /* File time */ - assertEqualInt(i2(p + 12), 33); /* File date */ - assertEqualInt(i4(p + 14), 0); /* CRC-32 */ - assertEqualInt(i4(p + 18), 0); /* Compressed size */ - assertEqualInt(i4(p + 22), 0); /* Uncompressed size */ - assertEqualInt(i2(p + 26), strlen(file_name)); /* Pathname length */ - assertEqualInt(i2(p + 28), 24); /* Extra field length */ + assertEqualInt(i2le(p + 4), zip_version); /* Version needed to extract */ + assertEqualInt(i2le(p + 6), 8); /* Flags */ + assertEqualInt(i2le(p + 8), zip_compression); /* Compression method */ + assertEqualInt(i2le(p + 10), 0); /* File time */ + assertEqualInt(i2le(p + 12), 33); /* File date */ + assertEqualInt(i4le(p + 14), 0); /* CRC-32 */ + assertEqualInt(i4le(p + 18), 0); /* Compressed size */ + assertEqualInt(i4le(p + 22), 0); /* Uncompressed size */ + assertEqualInt(i2le(p + 26), strlen(file_name)); /* Pathname length */ + assertEqualInt(i2le(p + 28), 24); /* Extra field length */ assertEqualMem(p + 30, file_name, strlen(file_name)); /* Pathname */ p = extension_start = local_header + 30 + strlen(file_name); - extension_end = extension_start + i2(local_header + 28); + extension_end = extension_start + i2le(local_header + 28); - assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ - assertEqualInt(i2(p + 2), 11); /* 'ux' size */ + assertEqualInt(i2le(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2le(p + 2), 11); /* 'ux' size */ assertEqualInt(p[4], 1); /* 'ux' version */ assertEqualInt(p[5], 4); /* 'ux' uid size */ - assertEqualInt(i4(p + 6), file_uid); /* 'Ux' UID */ + assertEqualInt(i4le(p + 6), file_uid); /* 'Ux' UID */ assertEqualInt(p[10], 4); /* 'ux' gid size */ - assertEqualInt(i4(p + 11), file_gid); /* 'Ux' GID */ - p += 4 + i2(p + 2); + assertEqualInt(i4le(p + 11), file_gid); /* 'Ux' GID */ + p += 4 + i2le(p + 2); - assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(i2le(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2le(p + 2), 5); /* 'UT' size */ assertEqualInt(p[4], 1); /* 'UT' flags */ - assertEqualInt(i4(p + 5), 0); /* 'UT' mtime */ - p += 4 + i2(p + 2); + assertEqualInt(i4le(p + 5), 0); /* 'UT' mtime */ + p += 4 + i2le(p + 2); /* Just in case: Report any extra extensions. */ while (p < extension_end) { - failure("Unexpected extension 0x%04X", i2(p)); + failure("Unexpected extension 0x%04X", i2le(p)); assert(0); - p += 4 + i2(p + 2); + p += 4 + i2le(p + 2); } /* Should have run exactly to end of extra data. */ @@ -241,9 +209,9 @@ data_end = p; assertEqualInt(data_end - data_start, compressed_size); assertEqualMem(p, "PK\007\010", 4); - assertEqualInt(i4(p + 4), crc); /* CRC-32 */ - assertEqualInt(i4(p + 8), compressed_size); /* compressed size */ - assertEqualInt(i4(p + 12), sizeof(file_data)); /* uncompressed size */ + assertEqualInt(i4le(p + 4), crc); /* CRC-32 */ + assertEqualInt(i4le(p + 8), compressed_size); /* compressed size */ + assertEqualInt(i4le(p + 12), sizeof(file_data)); /* uncompressed size */ /* Central directory should immediately follow the data descriptor. */ assert(p + 16 == central_header); --- contrib/libarchive/libarchive_fe/passphrase.c.orig +++ contrib/libarchive/libarchive_fe/passphrase.c @@ -119,7 +119,7 @@ return (buf); } -#else /* _WIN32 && !__CYGWIN__ */ +#elif defined(HAVE_TCGETATTR) && defined(HAVE_TCSETATTR) #include #include @@ -314,7 +314,13 @@ errno = save_errno; return(nr == -1 ? NULL : buf); } -#endif /* _WIN32 && !__CYGWIN__ */ +#else +static char * +readpassphrase(const char *prompt, char *buf, size_t bufsiz, int flags) +{ + return (NULL); +} +#endif #endif /* HAVE_READPASSPHRASE */ char * --- contrib/libarchive/tar/bsdtar.1.orig +++ contrib/libarchive/tar/bsdtar.1 @@ -32,19 +32,22 @@ .Nm creates and manipulates streaming archive files. This implementation can extract from tar, pax, cpio, zip, jar, ar, xar, -rpm, 7-zip, and ISO 9660 cdrom images and can create tar, pax, cpio, ar, zip, -7-zip, and shar archives. +rar, rpm, 7-zip, and ISO 9660 cdrom images and can create tar, pax, +cpio, ar, zip, 7-zip, and shar archives. .Pp The first synopsis form shows a .Dq bundled option word. This usage is provided for compatibility with historical implementations. -See COMPATIBILITY below for details. +See +.Sx COMPATIBILITY +below for details. .Pp The other synopsis forms show the preferred usage. The first option to .Nm is a mode indicator from the following list: +.Pp .Bl -tag -compact -width indent .It Fl c Create a new archive containing the specified items. @@ -109,16 +112,22 @@ The specified archive is opened and the entries in it will be appended to the current archive. As a simple example, +.Pp .Dl Nm Fl c Fl f Pa - Pa newfile Cm @ Ns Pa original.tar +.Pp writes a new archive to standard output containing a file .Pa newfile and all of the entries from .Pa original.tar . In contrast, +.Pp .Dl Nm Fl c Fl f Pa - Pa newfile Pa original.tar +.Pp creates a new archive with only two entries. Similarly, +.Pp .Dl Nm Fl czf Pa - Fl Fl format Cm pax Cm @ Ns Pa - +.Pp reads an archive from standard input (whose format will be determined automatically) and converts it into a gzip-compressed pax-format archive on stdout. @@ -130,19 +139,29 @@ Use the archive suffix to decide a set of the format and the compressions. As a simple example, +.Pp .Dl Nm Fl a Fl cf Pa archive.tgz source.c source.h +.Pp creates a new archive with restricted pax format and gzip compression, +.Pp .Dl Nm Fl a Fl cf Pa archive.tar.bz2.uu source.c source.h +.Pp creates a new archive with restricted pax format and bzip2 compression and uuencode compression, +.Pp .Dl Nm Fl a Fl cf Pa archive.zip source.c source.h +.Pp creates a new archive with zip format, +.Pp .Dl Nm Fl a Fl jcf Pa archive.tgz source.c source.h +.Pp ignores the .Dq -j option, and creates a new archive with restricted pax format and gzip compression, +.Pp .Dl Nm Fl a Fl jcf Pa archive.xxx source.c source.h +.Pp if it is unknown suffix or no suffix, creates a new archive with restricted pax format and bzip2 compression. .It Fl Fl acls @@ -177,6 +196,11 @@ to the current directory after processing any .Fl C options and before extracting any files. +.It Fl Fl clamp-mtime +(use with +.Fl Fl mtime ) +Only set the modification time if the file is newer than the date specified in +.Fl Fl mtime . .It Fl Fl clear-nochange-fflags (x mode only) Before removing file system objects to replace them, clear platform-specific @@ -295,7 +319,9 @@ .Fl Fl include option is especially useful when filtering archives. For example, the command +.Pp .Dl Nm Fl c Fl f Pa new.tar Fl Fl include='*foo*' Cm @ Ns Pa old.tgz +.Pp creates a new archive .Pa new.tar containing only the entries from @@ -393,7 +419,11 @@ .Nm is run in x mode as root. Currently supported only for pax formats -(including "pax restricted", the default tar format for bsdtar.) +.Po including "pax restricted", the default tar format for +.Nm bsdtar Pc +.It Fl Fl mtime Ar date +(c, r, u modes only) +Set the modification times of added files to the specified date. .It Fl n , Fl Fl norecurse , Fl Fl no-recursion Do not operate recursively on the content of directories. .It Fl Fl newer Ar date @@ -450,7 +480,7 @@ .Nm is run as non-root in x mode. .It Fl Fl no-mac-metadata -(x mode only) +(c, r, u and x mode only) Mac OS X specific. Do not archive or extract ACLs and extended file attributes using @@ -556,6 +586,7 @@ These are passed to the modules that handle particular formats to control how those formats will behave. Each option has one of the following forms: +.Pp .Bl -tag -compact -width indent .It Ar key=value The key will be set to the specified value in every module that supports it. @@ -579,6 +610,7 @@ .Xr archive_read_set_options 3 . .Pp Examples of supported options: +.Pp .Bl -tag -compact -width indent .It Cm iso9660:joliet Support Joliet extensions. @@ -738,6 +770,7 @@ .Fl i , Fl Fl ignore-zeros option of GNU tar. .El +.Pp If a provided option is not supported by any module, that is a fatal error. .It Fl P , Fl Fl absolute-paths @@ -910,7 +943,9 @@ .Nm to remove intervening directory symlinks instead of reporting an error. -See the SECURITY section below for more details. +See the +.Sx SECURITY +section below for more details. .It Fl Fl uid Ar id Use the provided user id number and ignore the user name from the archive. @@ -1048,24 +1083,31 @@ .Ar source.c and .Ar source.h : +.Pp .Dl Nm Fl czf Pa file.tar.gz Pa source.c Pa source.h .Pp To view a detailed table of contents for this archive: +.Pp .Dl Nm Fl tvf Pa file.tar.gz .Pp To extract all entries from the archive on the default tape drive: +.Pp .Dl Nm Fl x .Pp To examine the contents of an ISO 9660 cdrom image: +.Pp .Dl Nm Fl tf Pa image.iso .Pp To move file hierarchies, invoke .Nm as +.Pp .Dl Nm Fl cf Pa - Fl C Pa srcdir \&. | Nm Fl xpf Pa - Fl C Pa destdir +.Pp or more traditionally +.Pp .Dl cd srcdir \&; Nm Fl cf Pa - \&. | ( cd destdir \&; Nm Fl xpf Pa - ) .Pp In create mode, the list of files and directories to be archived @@ -1074,7 +1116,9 @@ and archive inclusions of the form .Cm @ Ns Pa archive-file . For example, the command line +.Pp .Dl Nm Fl c Fl f Pa new.tar Pa foo1 Cm @ Ns Pa old.tgz Cm -C Ns Pa /tmp Pa foo2 +.Pp will create a new archive .Pa new.tar . .Nm @@ -1122,9 +1166,13 @@ and .Cm uid keywords: +.Pp .Dl Nm Fl cf Pa file.tar Fl Fl format=mtree Fl Fl options='!all,type,time,uid' Pa dir +.Pp or you can set the compression level used by gzip or xz compression: +.Pp .Dl Nm Fl czf Pa file.tar Fl Fl options='compression-level=9' . +.Pp For more details, see the explanation of the .Fn archive_read_set_options and @@ -1142,7 +1190,9 @@ The order of the arguments must match the order of the corresponding characters in the bundled command word. For example, +.Pp .Dl Nm Cm tbf 32 Pa file.tar +.Pp specifies three flags .Cm t , .Cm b , @@ -1240,10 +1290,13 @@ .Nm will refuse to extract the entry. .El +.Pp To protect yourself, you should be wary of any archives that come from untrusted sources. You should examine the contents of an archive with +.Pp .Dl Nm Fl tf Pa filename +.Pp before extraction. You should use the .Fl k @@ -1294,7 +1347,7 @@ There have been numerous other implementations, many of which extended the file format. John Gilmore's -.Nm pdtar +.Sy pdtar public-domain implementation (circa November, 1987) was quite influential, and formed the basis of GNU tar. GNU tar was included as the standard system tar @@ -1347,8 +1400,11 @@ The compression and decompression is implemented internally, so there may be insignificant differences between the compressed output generated by +.Pp .Dl Nm Fl czf Pa - file +.Pp and that generated by +.Pp .Dl Nm Fl cf Pa - file | Nm gzip .Pp The default should be to read and write archives to the standard I/O paths, @@ -1393,5 +1449,5 @@ Converting between dissimilar archive formats (such as tar and cpio) using the .Cm @ Ns Pa - convention can cause hard link information to be lost. -(This is a consequence of the incompatible ways that different archive -formats store hardlink information.) +This is a consequence of the incompatible ways that different archive +formats store hardlink information. --- contrib/libarchive/tar/bsdtar.c.orig +++ contrib/libarchive/tar/bsdtar.c @@ -7,6 +7,9 @@ #include "bsdtar_platform.h" +#ifdef HAVE_LIMITS_H +#include +#endif #ifdef HAVE_SYS_PARAM_H #include #endif @@ -101,7 +104,7 @@ static __LA_NORETURN void long_help(void); static void only_mode(struct bsdtar *, const char *opt, const char *valid); -static void set_mode(struct bsdtar *, char opt); +static void set_mode(struct bsdtar *, int opt); static __LA_NORETURN void version(void); /* A basic set of security flags to request from libarchive. */ @@ -136,13 +139,14 @@ { struct bsdtar *bsdtar, bsdtar_storage; int opt, t; - char compression, compression2; + int compression, compression2; const char *compression_name, *compression2_name; const char *compress_program; char *tptr, *uptr; char possible_help_request; char buff[16]; long l; + time_t now; /* * Use a pointer for consistency, but stack-allocated storage @@ -157,6 +161,7 @@ compression = compression2 = '\0'; compression_name = compression2_name = NULL; compress_program = NULL; + time(&now); #if defined(HAVE_SIGACTION) { /* Set up signal handling. */ @@ -331,7 +336,7 @@ if (archive_match_exclude_pattern( bsdtar->matching, bsdtar->argument) != ARCHIVE_OK) lafe_errc(1, 0, - "Couldn't exclude %s\n", bsdtar->argument); + "Couldn't exclude %s", bsdtar->argument); break; case OPTION_EXCLUDE_VCS: /* GNU tar */ for(t=0; vcs_files[t]; t++) { @@ -339,7 +344,7 @@ bsdtar->matching, vcs_files[t]) != ARCHIVE_OK) lafe_errc(1, 0, "Couldn't " - "exclude %s\n", vcs_files[t]); + "exclude %s", vcs_files[t]); } break; case OPTION_FFLAGS: @@ -673,6 +678,16 @@ } } break; + case OPTION_MTIME: /* GNU tar */ + bsdtar->has_mtime = 1; + bsdtar->mtime = archive_parse_date(now, bsdtar->argument); + if (bsdtar->mtime == (time_t)-1) { + lafe_errc(1, 0, "Invalid argument to --mtime (bad date string)"); + } + break; + case OPTION_CLAMP_MTIME: /* GNU tar */ + bsdtar->clamp_mtime = 1; + break; #if 0 /* * The common BSD -P option is not necessary, since @@ -740,6 +755,8 @@ bsdtar->strip_components = (int)l; break; case 'T': /* GNU tar */ + if (bsdtar->names_from_file) + lafe_errc(1, 0, "Multiple --files-from/-T options are not supported"); bsdtar->names_from_file = bsdtar->argument; break; case 't': /* SUSv2 */ @@ -935,7 +952,7 @@ switch (compression) { case 'J': case 'j': case 'y': case 'Z': case 'z': strcpy(buff, "-?"); - buff[1] = compression; + buff[1] = (char)compression; break; default: strcpy(buff, "--"); @@ -959,6 +976,10 @@ only_mode(bsdtar, buff, "cru"); } + if (!bsdtar->has_mtime && bsdtar->clamp_mtime) + lafe_errc(1, 0, + "--clamp-mtime is not valid without --mtime "); + /* * When creating an archive from a directory tree, the directory * walking code will already avoid entering directories when @@ -1005,7 +1026,7 @@ } static void -set_mode(struct bsdtar *bsdtar, char opt) +set_mode(struct bsdtar *bsdtar, int opt) { if (bsdtar->mode != '\0' && bsdtar->mode != opt) lafe_errc(1, 0, @@ -1063,6 +1084,8 @@ " -z, -j, -J, --lzma Compress archive with gzip/bzip2/xz/lzma\n" " --format {ustar|pax|cpio|shar} Select archive format\n" " --exclude Skip files that match pattern\n" + " --mtime Set modification times for added files\n" + " --clamp-mtime Only set modification times for files newer than --mtime\n" " -C Change to before processing remaining files\n" " @ Add entries from to output\n" "List: %p -t [options] []\n" --- contrib/libarchive/tar/bsdtar.h.orig +++ contrib/libarchive/tar/bsdtar.h @@ -42,10 +42,13 @@ int uid; /* --uid */ const char *uname; /* --uname */ const char *passphrase; /* --passphrase */ - char mode; /* Program mode: 'c', 't', 'r', 'u', 'x' */ + int mode; /* Program mode: 'c', 't', 'r', 'u', 'x' */ char symlink_mode; /* H or L, per BSD conventions */ const char *option_options; /* --options */ char day_first; /* show day before month in -tv output */ + char has_mtime; /* --mtime exists (0 or 1) */ + char clamp_mtime; /* --clamp-mtime (0 or 1)*/ + time_t mtime; /* --mtime */ struct creation_set *cset; /* Option parser state */ @@ -114,7 +117,7 @@ /* Fake short equivalents for long options that otherwise lack them. */ enum { - OPTION_ACLS = 1, + OPTION_ACLS = 256, OPTION_B64ENCODE, OPTION_CHECK_LINKS, OPTION_CHROOT, @@ -175,14 +178,17 @@ OPTION_VERSION, OPTION_XATTRS, OPTION_ZSTD, + OPTION_MTIME, + OPTION_CLAMP_MTIME, }; int bsdtar_getopt(struct bsdtar *); void do_chdir(struct bsdtar *); int edit_pathname(struct bsdtar *, struct archive_entry *); +void edit_mtime(struct bsdtar *, struct archive_entry *); int need_report(void); int pathcmp(const char *a, const char *b); -void safe_fprintf(FILE *, const char *fmt, ...) __LA_PRINTF(2, 3); +void safe_fprintf(FILE * restrict, const char * restrict fmt, ...) __LA_PRINTF(2, 3); void set_chdir(struct bsdtar *, const char *newdir); const char *tar_i64toa(int64_t); void tar_mode_c(struct bsdtar *bsdtar); --- contrib/libarchive/tar/cmdline.c.orig +++ contrib/libarchive/tar/cmdline.c @@ -57,6 +57,7 @@ { "cd", 1, 'C' }, { "check-links", 0, OPTION_CHECK_LINKS }, { "chroot", 0, OPTION_CHROOT }, + { "clamp-mtime", 0, OPTION_CLAMP_MTIME }, { "clear-nochange-fflags", 0, OPTION_CLEAR_NOCHANGE_FFLAGS }, { "compress", 0, 'Z' }, { "confirmation", 0, 'w' }, @@ -95,6 +96,7 @@ { "lzop", 0, OPTION_LZOP }, { "mac-metadata", 0, OPTION_MAC_METADATA }, { "modification-time", 0, 'm' }, + { "mtime", 1, OPTION_MTIME }, { "newer", 1, OPTION_NEWER_CTIME }, { "newer-ctime", 1, OPTION_NEWER_CTIME }, { "newer-ctime-than", 1, OPTION_NEWER_CTIME_THAN }, --- contrib/libarchive/tar/subst.c.orig +++ contrib/libarchive/tar/subst.c @@ -229,6 +229,7 @@ if (rule->from_begin && *result) { realloc_strcat(result, name); + if (buffer) buffer[0] = 0; realloc_strcat(&buffer, *result); name = buffer; (*result)[0] = 0; --- /dev/null +++ contrib/libarchive/tar/test/test_list_item.c @@ -0,0 +1,63 @@ +/*-SPDX-License-Identifier: BSD-2-Clause + * Copyright (c) 2024 Tarsnap Backup Inc. + * All rights reserved. + */ +#include "test.h" + +#if defined(_WIN32) && !defined(__CYGWIN__) +#include +#endif + +/* These lists of files come from 'test_list_archive.tar.uu', which includes + * the script which generated it. */ + +static const char *tf_out = +"f\n" +"hl\n" +"sl\n" +"d/\n" +"d/f\n" +"fake-username\n" +"fake-groupname\n" +"f\n"; + +#if defined(_WIN32) && !defined(__CYGWIN__) +static const char *tvf_out = +"-rw-r--r-- 0 1000 1000 0 Jan 01 1980 f\n" +"hrw-r--r-- 0 1000 1000 0 Jan 01 1980 hl link to f\n" +"lrwxr-xr-x 0 1000 1000 0 Jan 01 1980 sl -> f\n" +"drwxrwxrwx 0 1000 1000 0 Jan 01 1980 d/\n" +"-r-------- 0 1000 1000 0 Jan 01 1980 d/f\n" +"-rw-r--r-- 0 long-fake-uname 1000 0 Jan 01 1980 fake-username\n" +"-rw-r--r-- 0 1000 long-fake-gname 0 Jan 01 1980 fake-groupname\n" +"-rw-r--r-- 0 1000 1000 0 Jan 01 1980 f\n"; +#else +static const char *tvf_out = +"-rw-r--r-- 0 1000 1000 0 Jan 1 1980 f\n" +"hrw-r--r-- 0 1000 1000 0 Jan 1 1980 hl link to f\n" +"lrwxr-xr-x 0 1000 1000 0 Jan 1 1980 sl -> f\n" +"drwxrwxrwx 0 1000 1000 0 Jan 1 1980 d/\n" +"-r-------- 0 1000 1000 0 Jan 1 1980 d/f\n" +"-rw-r--r-- 0 long-fake-uname 1000 0 Jan 1 1980 fake-username\n" +"-rw-r--r-- 0 1000 long-fake-gname 0 Jan 1 1980 fake-groupname\n" +"-rw-r--r-- 0 1000 1000 0 Jan 1 1980 f\n"; +#endif + +DEFINE_TEST(test_list_item) +{ + extract_reference_file("test_list_item.tar"); + + /* Run 'tf' and check output. */ + assertEqualInt(0, + systemf("%s tf test_list_item.tar >tf.out 2>tf.err", testprog)); + failure("'t' mode should write results to stdout"); + assertTextFileContents(tf_out, "tf.out"); + assertEmptyFile("tf.err"); + + /* Run 'tvf' and check output. */ + assertEqualInt(0, + systemf("%s tvf test_list_item.tar >tvf.out 2>tvf.err", testprog)); + failure("'t' mode with 'v' should write more results to stdout"); + assertTextFileContents(tvf_out, "tvf.out"); + assertEmptyFile("tvf.err"); +} --- /dev/null +++ contrib/libarchive/tar/test/test_list_item.tar.uu @@ -0,0 +1,169 @@ +begin 644 test_list_item.tar +M9@`````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````#`P,#8T-"``,#`Q-S4P(``P,#$W-3`@`#`P,#`P,#`P,#`P +M(#`R,C8S-C$S,C`Q(#`P-S0P-P`@,``````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````!U> test_list_item.tar.uu +mv test_list_item.tar.uu ../ + +# Don't delete the temporary directory; leave that up to the developer to +# delete manually when they want to. --- contrib/libarchive/tar/test/test_option_C_mtree.c.orig +++ contrib/libarchive/tar/test/test_option_C_mtree.c @@ -17,7 +17,7 @@ p0 = NULL; char *content = "./foo type=file uname=root gname=root mode=0755\n"; char *filename = "output.tar"; -#if defined(_WIN32) && !defined(CYGWIN) +#if defined(_WIN32) && !defined(__CYGWIN__) char *p; #endif @@ -32,7 +32,7 @@ assertMakeDir("bar", 0775); assertMakeFile("bar/foo", 0777, "abc"); -#if defined(_WIN32) && !defined(CYGWIN) +#if defined(_WIN32) && !defined(__CYGWIN__) p = absolute_path; while(*p != '\0') { if (*p == '/') --- contrib/libarchive/tar/test/test_option_P.c.orig +++ contrib/libarchive/tar/test/test_option_P.c @@ -1,82 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-2-Clause - * - * Copyright (c) 2024 Mostyn Bramley-Moore - */ - -#include "test.h" - -#include -#include - -#if defined(_WIN32) && !defined(__CYGWIN__) -#define UNLINK _unlink -#else -#define UNLINK unlink -#endif - -DEFINE_TEST(test_extract_tar_absolute_paths) -{ - int r; - - // Create an absolute path for a test file inside testworkdir. - char *entry_suffix = "/tar-noabs"; - size_t entry_suffix_length = strlen(entry_suffix); - size_t testworkdir_length = strlen(testworkdir); - size_t temp_absolute_file_name_length = testworkdir_length + entry_suffix_length; - char *temp_absolute_file_name = calloc(1, temp_absolute_file_name_length + 1); // +1 for null character. - assertEqualInt(snprintf(temp_absolute_file_name, temp_absolute_file_name_length + 1, "%s%s", testworkdir, entry_suffix), - temp_absolute_file_name_length); - -#if defined(_WIN32) && !defined(__CYGWIN__) - // I'm unsure how to specify paths with spaces for the test invocation on windows. - // Adding quotes doesn't seem to work. We should find a way to escape these paths, - // but for now let's fail in a place that's obviously related to the test setup if - // testworkdir contains spaces. - for (char *p = temp_absolute_file_name; *p != '\0'; p++) - { - assert(*p != ' '); - if (*p == ' ') break; - } -#endif - - // Create the file. - const char *sample_data = "test file from test_extract_tar_absolute_paths"; - assertMakeFile(temp_absolute_file_name, 0644, sample_data); - - // Create an archive with the test file, using an absolute path. -#if defined(_WIN32) && !defined(__CYGWIN__) - r = systemf("%s --absolute-paths -cf test.tar %s", testprog, temp_absolute_file_name); -#else - r = systemf("%s --absolute-paths -cf test.tar \"%s\"", testprog, temp_absolute_file_name); -#endif - assertEqualInt(r, 0); - - UNLINK(temp_absolute_file_name); - - // Extracting the archive without -P / --absolute-paths should strip leading drive letter or slash - r = systemf("%s -xf test.tar 2>test.err", testprog); - assertEqualInt(r, 0); - assertFileNotExists(temp_absolute_file_name); - - // Check that the mangled path exists. -#if defined(_WIN32) && !defined(__CYGWIN__) - assertFileExists(temp_absolute_file_name + 3); // Skip the drive letter, colon and slash. - UNLINK(temp_absolute_file_name + 3); -#else - assertFileExists(temp_absolute_file_name + 1); // Skip the slash. - UNLINK(temp_absolute_file_name + 1); -#endif - - // Extracting the archive with -P / --absolute-paths should create the file. - r = systemf("%s --absolute-paths -xf test.tar", testprog); - assertEqualInt(r, 0); - assertFileExists(temp_absolute_file_name); - - // Check that the mangled path wasn't created. -#if defined(_WIN32) && !defined(__CYGWIN__) - assertFileNotExists(temp_absolute_file_name + 3); // Skip the drive letter, colon and slash. -#else - assertFileNotExists(temp_absolute_file_name + 1); // Skip the slash. -#endif -} --- /dev/null +++ contrib/libarchive/tar/test/test_option_P_upper.c @@ -0,0 +1,82 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2024 Mostyn Bramley-Moore + */ + +#include "test.h" + +#include +#include + +#if defined(_WIN32) && !defined(__CYGWIN__) +#define UNLINK _unlink +#else +#define UNLINK unlink +#endif + +DEFINE_TEST(test_extract_tar_absolute_paths) +{ + int r; + + // Create an absolute path for a test file inside testworkdir. + char *entry_suffix = "/tar-noabs"; + size_t entry_suffix_length = strlen(entry_suffix); + size_t testworkdir_length = strlen(testworkdir); + size_t temp_absolute_file_name_length = testworkdir_length + entry_suffix_length; + char *temp_absolute_file_name = calloc(1, temp_absolute_file_name_length + 1); // +1 for null character. + assertEqualInt(snprintf(temp_absolute_file_name, temp_absolute_file_name_length + 1, "%s%s", testworkdir, entry_suffix), + temp_absolute_file_name_length); + +#if defined(_WIN32) && !defined(__CYGWIN__) + // I'm unsure how to specify paths with spaces for the test invocation on windows. + // Adding quotes doesn't seem to work. We should find a way to escape these paths, + // but for now let's fail in a place that's obviously related to the test setup if + // testworkdir contains spaces. + for (char *p = temp_absolute_file_name; *p != '\0'; p++) + { + assert(*p != ' '); + if (*p == ' ') break; + } +#endif + + // Create the file. + const char *sample_data = "test file from test_extract_tar_absolute_paths"; + assertMakeFile(temp_absolute_file_name, 0644, sample_data); + + // Create an archive with the test file, using an absolute path. +#if defined(_WIN32) && !defined(__CYGWIN__) + r = systemf("%s --absolute-paths -cf test.tar %s", testprog, temp_absolute_file_name); +#else + r = systemf("%s --absolute-paths -cf test.tar \"%s\"", testprog, temp_absolute_file_name); +#endif + assertEqualInt(r, 0); + + UNLINK(temp_absolute_file_name); + + // Extracting the archive without -P / --absolute-paths should strip leading drive letter or slash + r = systemf("%s -xf test.tar 2>test.err", testprog); + assertEqualInt(r, 0); + assertFileNotExists(temp_absolute_file_name); + + // Check that the mangled path exists. +#if defined(_WIN32) && !defined(__CYGWIN__) + assertFileExists(temp_absolute_file_name + 3); // Skip the drive letter, colon and slash. + UNLINK(temp_absolute_file_name + 3); +#else + assertFileExists(temp_absolute_file_name + 1); // Skip the slash. + UNLINK(temp_absolute_file_name + 1); +#endif + + // Extracting the archive with -P / --absolute-paths should create the file. + r = systemf("%s --absolute-paths -xf test.tar", testprog); + assertEqualInt(r, 0); + assertFileExists(temp_absolute_file_name); + + // Check that the mangled path wasn't created. +#if defined(_WIN32) && !defined(__CYGWIN__) + assertFileNotExists(temp_absolute_file_name + 3); // Skip the drive letter, colon and slash. +#else + assertFileNotExists(temp_absolute_file_name + 1); // Skip the slash. +#endif +} --- contrib/libarchive/tar/test/test_option_ignore_zeros.c.orig +++ contrib/libarchive/tar/test/test_option_ignore_zeros.c @@ -76,8 +76,7 @@ // bsdtar.exe: b: Can't translate uname '(null)' to UTF-8 skipping("TODO: figure out why this test fails on github workflows with MSVC"); return; -#endif - +#else if (make_files()) return; @@ -97,6 +96,7 @@ assertEqualFile("out/a", "in/a"); assertEqualFile("out/b", "in/b"); assertEqualFile("out/c", "in/c"); +#endif } static void --- /dev/null +++ contrib/libarchive/tar/test/test_option_mtime.c @@ -0,0 +1,82 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2025 Zhaofeng Li + * All rights reserved. + */ +#include "test.h" + +#if defined(_WIN32) && !defined(__CYGWIN__) +/* system() on Windows runs its arguments through CMD.EXE, which has + * notoriously unfriendly quoting rules. The current best documented way around + * them is to wrap your *entire commandline* in sacrificial quotes. + * + * See CMD.EXE /? for more information. Excerpted here: + * | Otherwise, old behavior is to see if the first character is + * | a quote character and if so, strip the leading character and + * | remove the last quote character on the command line, preserving + * | any text after the last quote character. + * + * Since this test makes heavy use of systemf() with quoted arguments inside + * the commandline, this macro is unfortunately an easier workaround. + */ +#define systemf(command, ...) systemf("\"" command "\"", __VA_ARGS__) +#endif + +DEFINE_TEST(test_option_mtime) +{ + /* Create three files with different mtimes. */ + assertMakeDir("in", 0755); + assertChdir("in"); + assertMakeFile("new_mtime", 0666, "new"); + assertUtimes("new_mtime", 100000, 0, 100000, 0); + assertMakeFile("mid_mtime", 0666, "mid"); + assertUtimes("mid_mtime", 10000, 0, 10000, 0); + assertMakeFile("old_mtime", 0666, "old"); + // assertion_utimes silently discards 0 :( + assertUtimes("old_mtime", 1, 0, 1, 0); + + /* Archive with --mtime 86400 */ + assertEqualInt(0, + systemf("%s --format pax -cf ../noclamp.tar " + "--mtime \"1970/1/2 0:0:0 UTC\" .", + testprog)); + assertChdir(".."); + + assertMakeDir("out.noclamp", 0755); + assertChdir("out.noclamp"); + assertEqualInt(0, systemf("%s xf ../noclamp.tar", testprog)); + assertFileMtime("new_mtime", 86400, 0); + assertFileMtime("mid_mtime", 86400, 0); + assertFileMtime("old_mtime", 86400, 0); + assertChdir(".."); + + /* Archive with --mtime 86400 --clamp-mtime */ + assertChdir("in"); + assertEqualInt(0, + systemf("%s --format pax -cf ../clamp.tar " + "--mtime \"1970/1/2 0:0:0 UTC\" --clamp-mtime .", + testprog)); + assertChdir(".."); + + assertMakeDir("out.clamp", 0755); + assertChdir("out.clamp"); + assertEqualInt(0, systemf("%s xf ../clamp.tar", testprog)); + assertFileMtime("new_mtime", 86400, 0); + assertFileMtime("mid_mtime", 10000, 0); + assertFileMtime("old_mtime", 1, 0); + assertChdir(".."); + + /* Archive-to-archive copy with --mtime 0 */ + assertEqualInt(0, + systemf("%s --format pax -cf ./archive2archive.tar " + "--mtime \"1970/1/1 0:0:0 UTC\" @noclamp.tar", + testprog)); + assertMakeDir("out.archive2archive", 0755); + assertChdir("out.archive2archive"); + assertEqualInt(0, systemf("%s xf ../archive2archive.tar", testprog)); + assertFileMtime("new_mtime", 0, 0); + assertFileMtime("mid_mtime", 0, 0); + assertFileMtime("old_mtime", 0, 0); + assertChdir(".."); +} --- contrib/libarchive/tar/test/test_option_s.c.orig +++ contrib/libarchive/tar/test/test_option_s.c @@ -70,7 +70,7 @@ assertFileContents("bar", 3, "test4/in/d1/baz"); /* - * Test 4b: Multiple substitutions behavior with option b). + * Test 4b: Multiple substitutions behavior with option b. */ assertMakeDir("test4b", 0755); systemf("%s -cf test4b.tar in/d1/foo in/d1/bar", @@ -80,6 +80,18 @@ assertFileContents("foo", 3, "test4b/in/d1/faz"); assertFileContents("bar", 3, "test4b/in/d1/baz"); + /* + * Test 4bb: Multiple substitutions with option b + * (libarchive/libarchive#2414 GitHub issue regression test). + */ + assertMakeDir("test4bb", 0755); + systemf("%s -cf test4bb.tar in/d1/foo in/d1/bar", + testprog); + systemf("%s -xf test4bb.tar -s /oo/ar/ -s }ar}az}b -s :az:end:b -C test4bb", + testprog); + assertFileContents("foo", 3, "test4bb/in/d1/fend"); + assertFileContents("bar", 3, "test4bb/in/d1/bend"); + /* * Test 5: Name-switching substitutions when extracting archive. */ --- contrib/libarchive/tar/test/test_stdio.c.orig +++ contrib/libarchive/tar/test/test_stdio.c @@ -6,6 +6,28 @@ */ #include "test.h" +/* + * This data would fit onto one line, but it's easier to understand when it's + * on mulitple lines (and thus matches the output files). + */ +static const char *cvf_err = +"a f\n" +"a l\n"; + +static const char *tf_out = +"f\n" +"l\n"; + +static const char *xvf_err = +"x f\n" +"x l\n"; + +/* + * This string should appear in the verbose listing regardless of platform, + * locale, username, or groupname. + */ +static const char * tvf_contains = "l link to f"; + DEFINE_TEST(test_stdio) { FILE *filelist; @@ -47,35 +69,43 @@ failure("'cv' writes filenames to stderr, nothing to stdout (SUSv2)\n" "Note that GNU tar writes the file list to stdout by default."); assertEmptyFile("cvf.out"); - /* TODO: Verify cvf.err has file list in SUSv2-prescribed format. */ + assertTextFileContents(cvf_err, "cvf.err"); /* 'cvf -' should generate file list on stderr, archive on stdout. */ r = systemf("%s cvf - f l >cvf-.out 2>cvf-.err", testprog); assertEqualInt(r, 0); failure("cvf - should write archive to stdout"); - /* TODO: Verify cvf-.out has archive. */ failure("cvf - should write file list to stderr (SUSv2)"); - /* TODO: Verify cvf-.err has verbose file list. */ + assertEqualFile("cvf.err", "cvf-.err"); + /* Check that stdout from 'cvf -' was a valid archive. */ + r = systemf("%s tf cvf-.out >cvf-tf.out 2>cvf-tf.err", testprog); + assertEqualInt(r, 0); + assertEmptyFile("cvf-tf.err"); + assertTextFileContents(tf_out, "cvf-tf.out"); /* 'tf' should generate file list on stdout, empty stderr. */ r = systemf("%s tf archive >tf.out 2>tf.err", testprog); assertEqualInt(r, 0); assertEmptyFile("tf.err"); failure("'t' mode should write results to stdout"); - /* TODO: Verify tf.out has file list. */ + assertTextFileContents(tf_out, "tf.out"); /* 'tvf' should generate file list on stdout, empty stderr. */ r = systemf("%s tvf archive >tvf.out 2>tvf.err", testprog); assertEqualInt(r, 0); assertEmptyFile("tvf.err"); failure("'tv' mode should write results to stdout"); - /* TODO: Verify tvf.out has file list. */ + /* Check that it contains a string only found in the verbose listing. */ + p = slurpfile(&s, "%s", "tvf.out"); + assert(strstr(p, tvf_contains) != NULL); + free(p); /* 'tvf -' uses stdin, file list on stdout, empty stderr. */ r = systemf("%s tvf - < archive >tvf-.out 2>tvf-.err", testprog); assertEqualInt(r, 0); assertEmptyFile("tvf-.err"); - /* TODO: Verify tvf-.out has file list. */ + failure("'tvf-' mode should write the same results as 'tvf'"); + assertEqualFile("tvf.out", "tvf-.out"); /* Basic 'xf' should generate no output on stdout or stderr. */ r = systemf("%s xf archive >xf.out 2>xf.err", testprog); @@ -87,7 +117,7 @@ r = systemf("%s xvf archive >xvf.out 2>xvf.err", testprog); assertEqualInt(r, 0); assertEmptyFile("xvf.out"); - /* TODO: Verify xvf.err */ + assertTextFileContents(xvf_err, "xvf.err"); /* 'xvOf' should generate list on stderr, file contents on stdout. */ r = systemf("%s xvOf archive >xvOf.out 2>xvOf.err", testprog); @@ -96,12 +126,12 @@ p = slurpfile(&s, "xvOf.out"); assertEqualInt((int)s, 3); assertEqualMem(p, "abc", 3); - /* TODO: Verify xvf.err */ + assertEqualFile("xvf.err", "xvOf.err"); free(p); /* 'xvf -' should generate list on stderr, empty stdout. */ r = systemf("%s xvf - < archive >xvf-.out 2>xvf-.err", testprog); assertEqualInt(r, 0); assertEmptyFile("xvf-.out"); - /* TODO: Verify xvf-.err */ + assertEqualFile("xvf.err", "xvf-.err"); } --- contrib/libarchive/tar/util.c.orig +++ contrib/libarchive/tar/util.c @@ -67,26 +67,26 @@ * malloc()), partly out of expedience (we have to call vsnprintf() * before malloc() anyway to find out how big a buffer we need; we may * as well point that first call at a small local buffer in case it - * works), but mostly for safety (so we can use this to print messages - * about out-of-memory conditions). + * works). */ void -safe_fprintf(FILE *f, const char *fmt, ...) +safe_fprintf(FILE * restrict f, const char * restrict fmt, ...) { char fmtbuff_stack[256]; /* Place to format the printf() string. */ char outbuff[256]; /* Buffer for outgoing characters. */ char *fmtbuff_heap; /* If fmtbuff_stack is too small, we use malloc */ char *fmtbuff; /* Pointer to fmtbuff_stack or fmtbuff_heap. */ - int fmtbuff_length; + size_t fmtbuff_length; int length, n; va_list ap; const char *p; - unsigned i; + size_t i; wchar_t wc; char try_wc; /* Use a stack-allocated buffer if we can, for speed and safety. */ + memset(fmtbuff_stack, '\0', sizeof(fmtbuff_stack)); fmtbuff_heap = NULL; fmtbuff_length = sizeof(fmtbuff_stack); fmtbuff = fmtbuff_stack; @@ -96,17 +96,21 @@ length = vsnprintf(fmtbuff, fmtbuff_length, fmt, ap); va_end(ap); + /* If vsnprintf will always fail, stop early. */ + if (length < 0 && errno == EOVERFLOW) + return; + /* If the result was too large, allocate a buffer on the heap. */ - while (length < 0 || length >= fmtbuff_length) { - if (length >= fmtbuff_length) - fmtbuff_length = length+1; + while (length < 0 || (size_t)length >= fmtbuff_length) { + if (length >= 0 && (size_t)length >= fmtbuff_length) + fmtbuff_length = (size_t)length + 1; else if (fmtbuff_length < 8192) fmtbuff_length *= 2; else if (fmtbuff_length < 1000000) fmtbuff_length += fmtbuff_length / 4; else { - length = fmtbuff_length; - fmtbuff_heap[length-1] = '\0'; + fmtbuff[fmtbuff_length - 1] = '\0'; + length = (int)strlen(fmtbuff); break; } free(fmtbuff_heap); @@ -121,8 +125,9 @@ } else { /* Leave fmtbuff pointing to the truncated * string in fmtbuff_stack. */ + fmtbuff_stack[sizeof(fmtbuff_stack) - 1] = '\0'; fmtbuff = fmtbuff_stack; - length = sizeof(fmtbuff_stack) - 1; + length = (int)strlen(fmtbuff); break; } } @@ -153,13 +158,13 @@ } else { /* Not printable, format the bytes. */ while (n-- > 0) - i += (unsigned)bsdtar_expand_char( + i += bsdtar_expand_char( outbuff, sizeof(outbuff), i, *p++); } } else { /* After any conversion failure, don't bother * trying to convert the rest. */ - i += (unsigned)bsdtar_expand_char(outbuff, sizeof(outbuff), i, *p++); + i += bsdtar_expand_char(outbuff, sizeof(outbuff), i, *p++); try_wc = 0; } @@ -202,7 +207,8 @@ case '\v': buff[i++] = 'v'; break; case '\\': buff[i++] = '\\'; break; default: - snprintf(buff + i, buffsize - i, "%03o", 0xFF & (int)c); + snprintf(buff + i, buffsize - i, "%03o", + 0xFF & (unsigned int)c); i += 3; } } @@ -328,7 +334,7 @@ return; if (chdir(bsdtar->pending_chdir) != 0) { - lafe_errc(1, 0, "could not chdir to '%s'\n", + lafe_errc(1, 0, "could not chdir to '%s'", bsdtar->pending_chdir); } free(bsdtar->pending_chdir); @@ -561,6 +567,20 @@ return (0); } +/* + * Apply --mtime and --clamp-mtime options. + */ +void +edit_mtime(struct bsdtar *bsdtar, struct archive_entry *entry) +{ + if (!bsdtar->has_mtime) + return; + + __LA_TIME_T entry_mtime = archive_entry_mtime(entry); + if (!bsdtar->clamp_mtime || entry_mtime > bsdtar->mtime) + archive_entry_set_mtime(entry, bsdtar->mtime, 0); +} + /* * It would be nice to just use printf() for formatting large numbers, * but the compatibility problems are quite a headache. Hence the @@ -684,7 +704,7 @@ } if (!now) time(&now); - fprintf(out, "%s %d ", + fprintf(out, "%s %u ", archive_entry_strmode(entry), archive_entry_nlink(entry)); @@ -748,7 +768,10 @@ #else ltime = localtime(&tim); #endif - strftime(tmp, sizeof(tmp), fmt, ltime); + if (ltime) + strftime(tmp, sizeof(tmp), fmt, ltime); + else + sprintf(tmp, "-- -- ----"); fprintf(out, " %s ", tmp); safe_fprintf(out, "%s", archive_entry_pathname(entry)); --- contrib/libarchive/tar/write.c.orig +++ contrib/libarchive/tar/write.c @@ -682,6 +682,7 @@ if ((bsdtar->flags & OPTFLAG_INTERACTIVE) && !yes("copy '%s'", archive_entry_pathname(in_entry))) continue; + edit_mtime(bsdtar, in_entry); if (bsdtar->verbose > 1) { safe_fprintf(stderr, "a "); list_item_verbose(bsdtar, stderr, in_entry); @@ -908,6 +909,9 @@ if (edit_pathname(bsdtar, entry)) continue; + /* Rewrite the mtime. */ + edit_mtime(bsdtar, entry); + /* Display entry as we process it. */ if (bsdtar->verbose > 1) { safe_fprintf(stderr, "a "); --- contrib/libarchive/test_utils/test_common.h.orig +++ contrib/libarchive/test_utils/test_common.h @@ -467,4 +467,4 @@ #include "test_utils.h" -#endif /* TEST_COMMON_H */ +#endif /* !TEST_COMMON_H */ --- contrib/libarchive/test_utils/test_main.c.orig +++ contrib/libarchive/test_utils/test_main.c @@ -370,6 +370,8 @@ static int dump_on_failure = 0; /* Default is to remove temp dirs and log data for successful tests. */ static int keep_temp_files = 0; +/* Default is to only return a failure code (1) if there were test failures. If enabled, exit with code 2 if there were no failures, but some tests were skipped. */ +static int fail_if_tests_skipped = 0; /* Default is to run the specified tests once and report errors. */ static int until_failure = 0; /* Default is to just report pass/fail for each test. */ @@ -609,9 +611,10 @@ assertion_chmod(const char *file, int line, const char *pathname, int mode) { assertion_count(file, line); - if (chmod(pathname, mode) == 0) + if (chmod(pathname, (mode_t)mode) == 0) return (1); - failure_start(file, line, "chmod(\"%s\", %4.o)", pathname, mode); + failure_start(file, line, "chmod(\"%s\", %4.o)", pathname, + (unsigned int)mode); failure_finish(NULL); return (0); @@ -626,8 +629,10 @@ if (v1 == v2) return (1); failure_start(file, line, "%s != %s", e1, e2); - logprintf(" %s=%lld (0x%llx, 0%llo)\n", e1, v1, v1, v1); - logprintf(" %s=%lld (0x%llx, 0%llo)\n", e2, v2, v2, v2); + logprintf(" %s=%lld (0x%llx, 0%llo)\n", e1, v1, + (unsigned long long)v1, (unsigned long long)v1); + logprintf(" %s=%lld (0x%llx, 0%llo)\n", e2, v2, + (unsigned long long)v2, (unsigned long long)v2); failure_finish(extra); return (0); } @@ -755,7 +760,7 @@ case '\r': logprintf("\\r"); break; default: if (c >= 32 && c < 127) - logprintf("%c", c); + logprintf("%c", (int)c); else logprintf("\\x%02X", c); } @@ -829,7 +834,7 @@ while (*w != L'\0') { unsigned int c = *w++; if (c >= 32 && c < 127) - logprintf("%c", c); + logprintf("%c", (int)c); else if (c < 256) logprintf("\\x%02X", c); else if (c < 0x10000) @@ -896,7 +901,7 @@ for (j = 0; j < 16 && i + j < l; j++) { if (ref != NULL && p[i + j] != ref[i + j]) sep = '_'; - logprintf("%c%02x", sep, 0xff & (int)p[i+j]); + logprintf("%c%02x", sep, 0xff & (unsigned int)p[i+j]); if (ref != NULL && p[i + j] == ref[i + j]) sep = ' '; } @@ -1600,7 +1605,7 @@ if (r == 0 && mode == expected_mode) return (1); failure_start(file, line, "File %s has mode %o, expected %o", - pathname, mode, expected_mode); + pathname, (unsigned int)mode, (unsigned int)expected_mode); #endif failure_finish(NULL); return (0); @@ -1710,8 +1715,8 @@ /* TODO: Can we do better here? */ if (mode >= 0 && (mode_t)mode != (st.st_mode & 07777)) { failure_start(file, line, "Dir %s has wrong mode", pathname); - logprintf(" Expected: 0%3o\n", mode); - logprintf(" Found: 0%3o\n", st.st_mode & 07777); + logprintf(" Expected: 0%3o\n", (unsigned int)mode); + logprintf(" Found: 0%3o\n", (unsigned int)st.st_mode & 07777); failure_finish(NULL); return (0); } @@ -1743,8 +1748,8 @@ /* TODO: Can we do better here? */ if (mode >= 0 && (mode_t)mode != (st.st_mode & 07777)) { failure_start(file, line, "File %s has wrong mode", pathname); - logprintf(" Expected: 0%3o\n", mode); - logprintf(" Found: 0%3o\n", st.st_mode & 07777); + logprintf(" Expected: 0%3o\n", (unsigned int)mode); + logprintf(" Found: 0%3o\n", (unsigned int)st.st_mode & 07777); failure_finish(NULL); return (0); } @@ -1945,8 +1950,8 @@ if (0 == _mkdir(dirname)) return (1); #else - if (0 == mkdir(dirname, mode)) { - if (0 == chmod(dirname, mode)) { + if (0 == mkdir(dirname, (mode_t)mode)) { + if (0 == chmod(dirname, (mode_t)mode)) { assertion_file_mode(file, line, dirname, mode); return (1); } @@ -2000,9 +2005,9 @@ return (0); } #ifdef HAVE_FCHMOD - if (0 != fchmod(fd, mode)) + if (0 != fchmod(fd, (mode_t)mode)) #else - if (0 != chmod(path, mode)) + if (0 != chmod(path, (mode_t)mode)) #endif { failure_start(file, line, "Could not chmod %s", path); @@ -2091,7 +2096,7 @@ assertion_count(file, line); (void)file; /* UNUSED */ (void)line; /* UNUSED */ - umask(mask); + umask((mode_t)mask); return (1); } @@ -2103,7 +2108,7 @@ int r; #if defined(_WIN32) && !defined(__CYGWIN__) -#define WINTIME(sec, nsec) ((Int32x32To64(sec, 10000000) + EPOC_TIME)\ +#define WINTIME(sec, nsec) (((sec * 10000000LL) + EPOC_TIME)\ + (((nsec)/1000)*10)) HANDLE h; ULARGE_INTEGER wintm; @@ -2451,7 +2456,7 @@ /* Skip arbitrary third-party version numbers. */ while (s > 0 && (*q == ' ' || *q == '-' || *q == '/' || *q == '.' || - isalnum((unsigned char)*q))) { + *q == '_' || isalnum((unsigned char)*q))) { ++q; --s; } @@ -3317,7 +3322,8 @@ ret = 1; failure_start(file, line, "type=%#010x, " "permset=%#010x, tag=%d, qual=%d name=%s", - acls[i].type, acls[i].permset, acls[i].tag, + (unsigned int)acls[i].type, + (unsigned int)acls[i].permset, acls[i].tag, acls[i].qual, acls[i].name); failure_finish(NULL); } @@ -3411,8 +3417,9 @@ } if ((permset << 6) != (mode & 0700)) { failure_start(file, line, "USER_OBJ permset " - "(%02o) != user mode (%02o)", permset, - 07 & (mode >> 6)); + "(%02o) != user mode (%02o)", + (unsigned int)permset, + (unsigned int)(07 & (mode >> 6))); failure_finish(NULL); ret = 1; } @@ -3426,8 +3433,9 @@ } if ((permset << 3) != (mode & 0070)) { failure_start(file, line, "GROUP_OBJ permset " - "(%02o) != group mode (%02o)", permset, - 07 & (mode >> 3)); + "(%02o) != group mode (%02o)", + (unsigned int)permset, + (unsigned int)(07 & (mode >> 3))); failure_finish(NULL); ret = 1; } @@ -3441,15 +3449,17 @@ } if ((permset << 0) != (mode & 0007)) { failure_start(file, line, "OTHER permset " - "(%02o) != other mode (%02o)", permset, - mode & 07); + "(%02o) != other mode (%02o)", + (unsigned int)permset, + (unsigned int)mode & 07); failure_finish(NULL); ret = 1; } } else if (matched != 1) { failure_start(file, line, "Could not find match for " "ACL (type=%#010x,permset=%#010x,tag=%d,qual=%d," - "name=``%s'')", type, permset, tag, qual, name); + "name=``%s'')", (unsigned int)type, + (unsigned int)permset, tag, qual, name); failure_finish(NULL); ret = 1; } @@ -3462,14 +3472,16 @@ if ((want_type & ARCHIVE_ENTRY_ACL_TYPE_ACCESS) != 0 && (mode_t)(mode & 0777) != (archive_entry_mode(ae) & 0777)) { failure_start(file, line, "Mode (%02o) and entry mode (%02o) " - "mismatch", mode, archive_entry_mode(ae)); + "mismatch", (unsigned int)mode, + (unsigned int)archive_entry_mode(ae)); failure_finish(NULL); ret = 1; } if (n != 0) { failure_start(file, line, "Could not find match for ACL " "(type=%#010x,permset=%#010x,tag=%d,qual=%d,name=``%s'')", - acls[marker[0]].type, acls[marker[0]].permset, + (unsigned int)acls[marker[0]].type, + (unsigned int)acls[marker[0]].permset, acls[marker[0]].tag, acls[marker[0]].qual, acls[marker[0]].name); failure_finish(NULL); @@ -3526,7 +3538,7 @@ fflush(stdout); break; case VERBOSITY_PASSFAIL: - printf(failed ? "FAIL\n" : skips_num ? "ok (S)\n" : "ok\n"); + printf(failed ? "FAIL\n" : skips_num ? "skipped\n" : "ok\n"); break; } @@ -3534,7 +3546,7 @@ for (i = 0; i < sizeof(failed_lines)/sizeof(failed_lines[0]); i++) { if (failed_lines[i].count > 1 && !failed_lines[i].skip) - logprintf("%s:%d: Summary: Failed %d times\n", + logprintf("%s:%u: Summary: Failed %d times\n", failed_filename, i, failed_lines[i].count); } /* Clear the failure history for the next file. */ @@ -3542,6 +3554,59 @@ memset(failed_lines, 0, sizeof(failed_lines)); } +/* + * Set or unset environment variable. + */ +static void +set_environment(const char *key, const char *value) +{ + +#if defined(_WIN32) && !defined(__CYGWIN__) + if (!SetEnvironmentVariable(key, value)) { + fprintf(stderr, "SetEnvironmentVariable failed with %d\n", + (int)GetLastError()); + } +#else + if (value == NULL) { + if (unsetenv(key) == -1) + fprintf(stderr, "unsetenv: %s\n", strerror(errno)); + } else { + if (setenv(key, value, 1) == -1) + fprintf(stderr, "setenv: %s\n", strerror(errno)); + } +#endif +} + +/* + * Enforce C locale for (sub)processes. + */ +static void +set_c_locale(void) +{ + static const char *lcs[] = { + "LC_ADDRESS", + "LC_ALL", + "LC_COLLATE", + "LC_CTYPE", + "LC_IDENTIFICATION", + "LC_MEASUREMENT", + "LC_MESSAGES", + "LC_MONETARY", + "LC_NAME", + "LC_NUMERIC", + "LC_PAPER", + "LC_TELEPHONE", + "LC_TIME", + NULL + }; + size_t i; + + setlocale(LC_ALL, "C"); + set_environment("LANG", "C"); + for (i = 0; lcs[i] != NULL; i++) + set_environment(lcs[i], NULL); +} + /* * Actually run a single test, with appropriate setup and cleanup. */ @@ -3553,10 +3618,11 @@ #else char workdir[1024 * 2]; #endif - char logfilename[64]; + char logfilename[256]; int failures_before = failures; int skips_before = skips; - int oldumask; + int tmp; + mode_t oldumask; switch (verbosity) { case VERBOSITY_SUMMARY_ONLY: /* No per-test reports at all */ @@ -3576,11 +3642,38 @@ exit(1); } /* Create a log file for this test. */ - snprintf(logfilename, sizeof(logfilename), "%s.log", tests[i].name); + tmp = snprintf(logfilename, sizeof(logfilename), "%s.log", tests[i].name); + if (tmp < 0) { + fprintf(stderr, + "ERROR can't create %s.log: %s\n", + tests[i].name, strerror(errno)); + exit(1); + } + if ((size_t)tmp >= sizeof(logfilename)) { + fprintf(stderr, + "ERROR can't create %s.log: Name too long. " + "Length %d; Max allowed length %zu\n", + tests[i].name, tmp, sizeof(logfilename) - 1); + exit(1); + } logfile = fopen(logfilename, "w"); fprintf(logfile, "%s\n\n", tests[i].name); /* Chdir() to a work dir for this specific test. */ - snprintf(workdir, sizeof(workdir), "%s/%s", tmpdir, tests[i].name); + tmp = snprintf(workdir, + sizeof(workdir), "%s/%s", tmpdir, tests[i].name); + if (tmp < 0) { + fprintf(stderr, + "ERROR can't create %s/%s: %s\n", + tmpdir, tests[i].name, strerror(errno)); + exit(1); + } + if ((size_t)tmp >= sizeof(workdir)) { + fprintf(stderr, + "ERROR can't create %s/%s: Path too long. " + "Length %d; Max allowed length %zu\n", + tmpdir, tests[i].name, tmp, sizeof(workdir) - 1); + exit(1); + } testworkdir = workdir; if (!assertMakeDir(testworkdir, 0755) || !assertChdir(testworkdir)) { @@ -3589,7 +3682,7 @@ exit(1); } /* Explicitly reset the locale before each test. */ - setlocale(LC_ALL, "C"); + set_c_locale(); /* Record the umask before we run the test. */ umask(oldumask = umask(0)); /* @@ -3603,7 +3696,7 @@ /* Restore umask */ umask(oldumask); /* Reset locale. */ - setlocale(LC_ALL, "C"); + set_c_locale(); /* Reset directory. */ if (!assertChdir(tmpdir)) { fprintf(stderr, "ERROR: Couldn't chdir to temp dir %s\n", @@ -3672,7 +3765,8 @@ printf(" -q Quiet.\n"); printf(" -r Path to dir containing reference files.\n"); printf(" Default: Current directory.\n"); - printf(" -u Keep running specifies tests until one fails.\n"); + printf(" -s Exit with code 2 if any tests were skipped.\n"); + printf(" -u Keep running specified tests until one fails.\n"); printf(" -v Verbose.\n"); printf("Available tests:\n"); for (i = 0; i < limit; i++) @@ -4065,6 +4159,9 @@ case 'r': refdir = option_arg; break; + case 's': + fail_if_tests_skipped = 1; + break; case 'u': until_failure++; break; @@ -4118,6 +4215,19 @@ strncat(testprg, "\"", testprg_len); testprog = testprg; } + + /* Sanity check: reject a relative path for refdir. */ + if (refdir != NULL) { +#if defined(_WIN32) && !defined(__CYGWIN__) + /* TODO: probably use PathIsRelative() from . */ +#else + if (refdir[0] != '/') { + fprintf(stderr, + "ERROR: Cannot use relative path for refdir\n"); + exit(1); + } +#endif + } #endif #if !defined(_WIN32) && defined(SIGPIPE) @@ -4263,5 +4373,9 @@ assertChdir(".."); rmdir(tmpdir); - return (tests_failed ? 1 : 0); + if (tests_failed) return 1; + + if (fail_if_tests_skipped == 1 && skips > 0) return 2; + + return 0; } --- contrib/libarchive/test_utils/test_utils.c.orig +++ contrib/libarchive/test_utils/test_utils.c @@ -109,3 +109,51 @@ } fill_with_pseudorandom_data_seed(seed, buffer, size); } + +unsigned long +bitcrc32(unsigned long c, const void *_p, size_t s) +{ + /* This is a drop-in replacement for crc32() from zlib. + * Libarchive should be able to correctly read archives (including + * correct CRCs) even when zlib is unavailable, and this function + * helps us verify that. Yes, this is very, very slow and unsuitable + * for production use, but it's obviously correct, compact, and + * works well enough for this particular usage. Libarchive + * internally uses a much more efficient implementation if zlib is + * unavailable. */ + const unsigned char *p = _p; + char bitctr; + + if (p == NULL) + return (0); + + for (; s > 0; --s) { + c ^= *p++; + for (bitctr = 8; bitctr > 0; --bitctr) { + if (c & 1) c = (c >> 1); + else c = (c >> 1) ^ 0xedb88320; + c ^= 0x80000000; + } + } + return (c); +} + +/* Read little-endian integers */ +unsigned short +i2le(const void* p_) +{ + const unsigned char *p = p_; + return (p[0] | (p[1] << 8)); +} +unsigned int +i4le(const void* p_) +{ + const char *p = p_; + return (i2le(p) | (i2le(p + 2) << 16)); +} +unsigned long long +i8le(const void* p_) +{ + const char *p = p_; + return (i4le(p) | ((unsigned long long)i4le(p + 4) << 32)); +} --- contrib/libarchive/test_utils/test_utils.h.orig +++ contrib/libarchive/test_utils/test_utils.h @@ -31,6 +31,11 @@ #include /* Fill a buffer with pseudorandom data */ -void fill_with_pseudorandom_data(void* buffer, size_t size); - -#endif /* TEST_UTILS_H */ +void fill_with_pseudorandom_data(void*, size_t); +/* A simplistic CRC-32 function for testing purposes */ +unsigned long bitcrc32(unsigned long, const void*, size_t); +/* Read little-endian integers */ +unsigned short i2le(const void*); +unsigned int i4le(const void*); +unsigned long long i8le(const void*); +#endif /* !TEST_UTILS_H */ --- contrib/libarchive/unzip/bsdunzip.c.orig +++ contrib/libarchive/unzip/bsdunzip.c @@ -9,6 +9,7 @@ #include "bsdunzip_platform.h" #include "la_queue.h" +#include "la_getline.h" #ifdef HAVE_SYS_STAT_H #include #endif @@ -110,7 +111,7 @@ static char *passphrase_buf; /* fatal error message + errno */ -static void +static void __LA_NORETURN error(const char *fmt, ...) { va_list ap; @@ -127,7 +128,7 @@ } /* fatal error message, no errno */ -static void +static void __LA_NORETURN errorx(const char *fmt, ...) { va_list ap; @@ -232,7 +233,7 @@ } if (L_opt) { for (i = 0; i < len; ++i) - str[i] = tolower((unsigned char)path[i]); + str[i] = (char)tolower((unsigned char)path[i]); } else { memcpy(str, path, len); } @@ -355,7 +356,7 @@ */ (void)unlink(path); } - if (mkdir(path, mode) != 0 && errno != EEXIST) + if (mkdir(path, (mode_t)mode) != 0 && errno != EEXIST) error("mkdir('%s')", path); } @@ -699,7 +700,7 @@ error("symlink('%s')", *path); info(" extracting: %s -> %s\n", *path, linkname); #ifdef HAVE_LCHMOD - if (lchmod(*path, mode) != 0) + if (lchmod(*path, (mode_t)mode) != 0) warning("Cannot set mode for '%s'", *path); #endif /* set access and modification time */ @@ -875,6 +876,7 @@ char buf[20]; time_t mtime; struct tm *tm; + const char *pathname; mtime = archive_entry_mtime(e); tm = localtime(&mtime); @@ -883,22 +885,25 @@ else strftime(buf, sizeof(buf), "%m-%d-%g %R", tm); + pathname = archive_entry_pathname(e); + if (!pathname) + pathname = ""; if (!zipinfo_mode) { if (v_opt == 1) { printf(" %8ju %s %s\n", (uintmax_t)archive_entry_size(e), - buf, archive_entry_pathname(e)); + buf, pathname); } else if (v_opt == 2) { printf("%8ju Stored %7ju 0%% %s %08x %s\n", (uintmax_t)archive_entry_size(e), (uintmax_t)archive_entry_size(e), buf, 0U, - archive_entry_pathname(e)); + pathname); } } else { if (Z1_opt) - printf("%s\n",archive_entry_pathname(e)); + printf("%s\n", pathname); } ac(archive_read_data_skip(a)); } --- /dev/null +++ contrib/libarchive/unzip/la_getline.h @@ -0,0 +1,16 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2011 The NetBSD Foundation, Inc. + * All rights reserved. + */ + +#ifndef LA_GETLINE_H_INCLUDED +#define LA_GETLINE_H_INCLUDED + +#include +#ifndef HAVE_GETLINE +ssize_t getline(char **buf, size_t *bufsiz, FILE *fp); +#endif + +#endif /* !LA_GETLINE_H_INCLUDED */ --- lib/libarchive/Makefile.orig +++ lib/libarchive/Makefile @@ -42,11 +42,11 @@ archive_entry_stat.c \ archive_entry_strmode.c \ archive_entry_xattr.c \ - archive_getdate.c \ archive_hmac.c \ archive_match.c \ archive_options.c \ archive_pack_dev.c \ + archive_parse_date.c \ archive_pathmatch.c \ archive_ppmd7.c \ archive_ppmd8.c \ @@ -101,6 +101,7 @@ archive_read_support_format_zip.c \ archive_string.c \ archive_string_sprintf.c \ + archive_time.c \ archive_util.c \ archive_version_details.c \ archive_virtual.c \ --- lib/libarchive/tests/Makefile.orig +++ lib/libarchive/tests/Makefile @@ -17,6 +17,7 @@ CFLAGS+= -I${.CURDIR} -I${.CURDIR:H} -I${.OBJDIR} CFLAGS+= -I${_LIBARCHIVEDIR}/libarchive -I${_LIBARCHIVEDIR}/libarchive/test CFLAGS+= -I${_LIBARCHIVEDIR}/test_utils +CFLAGS+= -I${SRCTOP}/sys/contrib/zstd/lib CFLAGS.test_utils.c+= -Wno-cast-align @@ -38,11 +39,11 @@ test_archive_clear_error.c \ test_archive_cmdline.c \ test_archive_digest.c \ - test_archive_getdate.c \ test_archive_match_time.c \ test_archive_match_owner.c \ test_archive_match_path.c \ test_archive_pathmatch.c \ + test_archive_parse_date.c \ test_archive_read.c \ test_archive_read_add_passphrase.c \ test_archive_read_close_twice.c \ @@ -72,6 +73,7 @@ test_compat_bzip2.c \ test_compat_cpio.c \ test_compat_gtar.c \ + test_compat_gtar_large.c \ test_compat_gzip.c \ test_compat_lz4.c \ test_compat_lzip.c \ @@ -148,7 +150,9 @@ test_read_format_gtar_filename.c \ test_read_format_gtar_gz.c \ test_read_format_gtar_lzma.c \ + test_read_format_gtar_redundant_L.c \ test_read_format_gtar_sparse.c \ + test_read_format_gtar_sparse_length.c \ test_read_format_gtar_sparse_skip_entry.c \ test_read_format_huge_rpm.c \ test_read_format_iso_Z.c \ @@ -178,6 +182,7 @@ test_read_format_rar_encryption_partially.c \ test_read_format_rar_filter.c \ test_read_format_rar_invalid1.c \ + test_read_format_rar_overflow.c \ test_read_format_raw.c \ test_read_format_tar.c \ test_read_format_tar_concatenated.c \ @@ -186,7 +191,10 @@ test_read_format_tar_empty_with_gnulabel.c \ test_read_format_tar_filename.c \ test_read_format_tar_invalid_pax_size.c \ + test_read_format_tar_mac_metadata.c \ + test_read_format_tar_pax_g_large.c \ test_read_format_tar_pax_large_attr.c \ + test_read_format_tar_pax_negative_time.c \ test_read_format_tbz.c \ test_read_format_tgz.c \ test_read_format_tlz.c \ @@ -219,6 +227,7 @@ test_read_format_zip_with_invalid_traditional_eocd.c \ test_read_format_zip_zip64.c \ test_read_large.c \ + test_read_pax_empty_val_no_nl.c \ test_read_pax_xattr_rht_security_selinux.c \ test_read_pax_xattr_schily.c \ test_read_pax_truncated.c \ @@ -287,6 +296,7 @@ test_write_format_mtree_classic_indent.c \ test_write_format_mtree_fflags.c \ test_write_format_mtree_no_separator.c \ + test_write_format_mtree_preset_digests.c \ test_write_format_mtree_quoted_filename.c \ test_write_format_pax.c \ test_write_format_raw.c \ @@ -303,6 +313,9 @@ test_write_format_xar_empty.c \ test_write_format_zip.c \ test_write_format_zip_compression_store.c \ + test_write_format_zip_compression_zstd.c \ + test_write_format_zip_compression_bzip2.c \ + test_write_format_zip_compression_lzmaxz.c \ test_write_format_zip_empty.c \ test_write_format_zip_empty_zip64.c \ test_write_format_zip_entry_size_unset.c \ @@ -447,6 +460,7 @@ ${PACKAGE}FILES+= test_read_format_7zip_bcj2_copy_lzma.7z.uu ${PACKAGE}FILES+= test_read_format_7zip_bcj2_deflate.7z.uu ${PACKAGE}FILES+= test_read_format_7zip_deflate_arm64.7z.uu +${PACKAGE}FILES+= test_read_format_7zip_deflate_powerpc.7z.uu ${PACKAGE}FILES+= test_read_format_7zip_bcj2_lzma1_1.7z.uu ${PACKAGE}FILES+= test_read_format_7zip_bcj2_lzma1_2.7z.uu ${PACKAGE}FILES+= test_read_format_7zip_bcj2_lzma2_1.7z.uu @@ -476,16 +490,24 @@ ${PACKAGE}FILES+= test_read_format_7zip_lzma2.7z.uu ${PACKAGE}FILES+= test_read_format_7zip_lzma2_arm.7z.uu ${PACKAGE}FILES+= test_read_format_7zip_lzma2_arm64.7z.uu +${PACKAGE}FILES+= test_read_format_7zip_lzma2_powerpc.7z.uu +${PACKAGE}FILES+= test_read_format_7zip_lzma2_riscv.7z.uu +${PACKAGE}FILES+= test_read_format_7zip_lzma2_sparc.7z.uu +${PACKAGE}FILES+= test_read_format_7zip_lzma2_powerpc.7z.uu ${PACKAGE}FILES+= test_read_format_7zip_malformed.7z.uu ${PACKAGE}FILES+= test_read_format_7zip_malformed2.7z.uu ${PACKAGE}FILES+= test_read_format_7zip_packinfo_digests.7z.uu ${PACKAGE}FILES+= test_read_format_7zip_ppmd.7z.uu +${PACKAGE}FILES+= test_read_format_7zip_sfx_elf.elf.uu +${PACKAGE}FILES+= test_read_format_7zip_sfx_modified_pe.exe.uu +${PACKAGE}FILES+= test_read_format_7zip_sfx_pe.exe.uu ${PACKAGE}FILES+= test_read_format_7zip_solid_zstd.7z.uu ${PACKAGE}FILES+= test_read_format_7zip_symbolic_name.7z.uu ${PACKAGE}FILES+= test_read_format_7zip_zstd.7z.uu ${PACKAGE}FILES+= test_read_format_7zip_zstd_arm.7z.uu ${PACKAGE}FILES+= test_read_format_7zip_zstd_bcj.7z.uu ${PACKAGE}FILES+= test_read_format_7zip_zstd_nobcj.7z.uu +${PACKAGE}FILES+= test_read_format_7zip_zstd_sparc.7z.uu ${PACKAGE}FILES+= test_read_format_7zip_win_attrib.7z.uu ${PACKAGE}FILES+= test_read_format_ar.ar.uu ${PACKAGE}FILES+= test_read_format_cab_1.cab.uu @@ -504,12 +526,14 @@ ${PACKAGE}FILES+= test_read_format_gtar_filename_cp866.tar.Z.uu ${PACKAGE}FILES+= test_read_format_gtar_filename_eucjp.tar.Z.uu ${PACKAGE}FILES+= test_read_format_gtar_filename_koi8r.tar.Z.uu +${PACKAGE}FILES+= test_read_format_gtar_redundant_L.tar.Z.uu ${PACKAGE}FILES+= test_read_format_gtar_sparse_1_13.tar.uu ${PACKAGE}FILES+= test_read_format_gtar_sparse_1_17.tar.uu ${PACKAGE}FILES+= test_read_format_gtar_sparse_1_17_posix00.tar.uu ${PACKAGE}FILES+= test_read_format_gtar_sparse_1_17_posix01.tar.uu ${PACKAGE}FILES+= test_read_format_gtar_sparse_1_17_posix10.tar.uu ${PACKAGE}FILES+= test_read_format_gtar_sparse_1_17_posix10_modified.tar.uu +${PACKAGE}FILES+= test_read_format_gtar_sparse_length.tar.Z.uu ${PACKAGE}FILES+= test_read_format_gtar_sparse_skip_entry.tar.Z.uu ${PACKAGE}FILES+= test_read_format_huge_rpm.rpm.uu ${PACKAGE}FILES+= test_read_format_iso.iso.Z.uu @@ -550,6 +574,7 @@ ${PACKAGE}FILES+= test_read_format_rar_encryption_data.rar.uu ${PACKAGE}FILES+= test_read_format_rar_encryption_header.rar.uu ${PACKAGE}FILES+= test_read_format_rar_encryption_partially.rar.uu +${PACKAGE}FILES+= test_read_format_rar_endarc_huge.rar.uu ${PACKAGE}FILES+= test_read_format_rar_filter.rar.uu ${PACKAGE}FILES+= test_read_format_rar_invalid1.rar.uu ${PACKAGE}FILES+= test_read_format_rar_multi_lzss_blocks.rar.uu @@ -557,12 +582,15 @@ ${PACKAGE}FILES+= test_read_format_rar_multivolume.part0002.rar.uu ${PACKAGE}FILES+= test_read_format_rar_multivolume.part0003.rar.uu ${PACKAGE}FILES+= test_read_format_rar_multivolume.part0004.rar.uu +${PACKAGE}FILES+= test_read_format_rar_newsub_huge.rar.uu ${PACKAGE}FILES+= test_read_format_rar_noeof.rar.uu +${PACKAGE}FILES+= test_read_format_rar_overflow.rar.uu ${PACKAGE}FILES+= test_read_format_rar_ppmd_lzss_conversion.rar.uu ${PACKAGE}FILES+= test_read_format_rar_ppmd_use_after_free.rar.uu ${PACKAGE}FILES+= test_read_format_rar_ppmd_use_after_free2.rar.uu ${PACKAGE}FILES+= test_read_format_rar_sfx.exe.uu ${PACKAGE}FILES+= test_read_format_rar_subblock.rar.uu +${PACKAGE}FILES+= test_read_format_rar_symlink_huge.rar.uu ${PACKAGE}FILES+= test_read_format_rar_unicode.rar.uu ${PACKAGE}FILES+= test_read_format_rar_windows.rar.uu ${PACKAGE}FILES+= test_read_format_rar4_encrypted.rar.uu @@ -627,11 +655,15 @@ ${PACKAGE}FILES+= test_read_format_tar_empty_pax.tar.Z.uu ${PACKAGE}FILES+= test_read_format_tar_filename_koi8r.tar.Z.uu ${PACKAGE}FILES+= test_read_format_tar_invalid_pax_size.tar.uu +${PACKAGE}FILES+= test_read_format_tar_mac_metadata_1.tar.uu +${PACKAGE}FILES+= test_read_format_tar_pax_g_large.tar.uu ${PACKAGE}FILES+= test_read_format_tar_pax_large_attr.tar.Z.uu +${PACKAGE}FILES+= test_read_format_tar_pax_negative_time.tar.uu ${PACKAGE}FILES+= test_read_format_ustar_filename_cp866.tar.Z.uu ${PACKAGE}FILES+= test_read_format_ustar_filename_eucjp.tar.Z.uu ${PACKAGE}FILES+= test_read_format_ustar_filename_koi8r.tar.Z.uu ${PACKAGE}FILES+= test_read_format_warc.warc.uu +${PACKAGE}FILES+= test_read_format_warc_incomplete.warc.uu ${PACKAGE}FILES+= test_read_format_xar_doublelink.xar.uu ${PACKAGE}FILES+= test_read_format_xar_duplicate_filename_node.xar.uu ${PACKAGE}FILES+= test_read_format_zip.zip.uu @@ -691,6 +723,7 @@ ${PACKAGE}FILES+= test_read_large_splitted_rar_ac.uu ${PACKAGE}FILES+= test_read_large_splitted_rar_ad.uu ${PACKAGE}FILES+= test_read_large_splitted_rar_ae.uu +${PACKAGE}FILES+= test_read_pax_empty_val_no_nl.tar.uu ${PACKAGE}FILES+= test_read_pax_xattr_rht_security_selinux.tar.uu ${PACKAGE}FILES+= test_read_pax_xattr_schily.tar.uu ${PACKAGE}FILES+= test_read_splitted_rar_aa.uu --- usr.bin/tar/tests/Makefile.orig +++ usr.bin/tar/tests/Makefile @@ -42,13 +42,14 @@ test_format_newc.c \ test_help.c \ test_leading_slash.c \ + test_list_item.c \ test_missing_file.c \ test_option_C_mtree.c \ test_option_C_upper.c \ test_option_H_upper.c \ test_option_L_upper.c \ test_option_O_upper.c \ - test_option_P.c \ + test_option_P_upper.c \ test_option_T_upper.c \ test_option_U_upper.c \ test_option_X_upper.c \ @@ -69,6 +70,7 @@ test_option_lz4.c \ test_option_lzma.c \ test_option_lzop.c \ + test_option_mtime.c \ test_option_n.c \ test_option_newer_than.c \ test_option_nodump.c \ @@ -120,6 +122,7 @@ ${PACKAGE}FILES+= test_extract.tar.xz.uu ${PACKAGE}FILES+= test_extract.tar.zst.uu ${PACKAGE}FILES+= test_leading_slash.tar.uu +${PACKAGE}FILES+= test_list_item.tar.uu ${PACKAGE}FILES+= test_option_keep_newer_files.tar.Z.uu ${PACKAGE}FILES+= test_option_passphrase.zip.uu ${PACKAGE}FILES+= test_option_s.tar.Z.uu