Hi all, the attached patch removes all references to xmalloc-trace and sbrk. The former is very rarely used, valgrind is preferred to trace allocations. The latter is basically useless to detect memory usage on modern OSes which use other means than brk(2) to obtain memory pages for the heap; it is actually deprecated on some OSes such as Darwin.
Farm-build-tested. -- Francesco
# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: kin...@squid-cache.org-20140316124459-igg4zpgg98ppddpz # target_branch: ../trunk # testament_sha1: 2d2e28d22c9b8f832ccb6c128be66bfd754be08a # timestamp: 2014-03-16 19:16:45 +0100 # base_revision_id: squ...@treenet.co.nz-20140316035245-\ # 4z0y12zr92i337y6 # # Begin patch === modified file 'compat/xalloc.cc' --- compat/xalloc.cc 2012-07-02 12:14:07 +0000 +++ compat/xalloc.cc 2014-03-16 12:44:59 +0000 @@ -92,9 +92,6 @@ #if XMALLOC_STATISTICS malloc_stat(sz * n); #endif -#if XMALLOC_TRACE - xmalloc_show_trace(p, 1); -#endif #if MEM_GEN_TRACE if (tracefp) fprintf(tracefp, "c:%u:%u:%p\n", (unsigned int) n, (unsigned int) sz, p); @@ -133,9 +130,6 @@ #if XMALLOC_STATISTICS malloc_stat(sz); #endif -#if XMALLOC_TRACE - xmalloc_show_trace(p, 1); -#endif #if MEM_GEN_TRACE if (tracefp) fprintf(tracefp, "m:%d:%p\n", sz, p); @@ -149,9 +143,6 @@ xrealloc(void *s, size_t sz) { PROF_start(xrealloc); -#if XMALLOC_TRACE - xmalloc_show_trace(s, -1); -#endif if (sz < 1) sz = 1; @@ -182,9 +173,6 @@ #if XMALLOC_STATISTICS malloc_stat(sz); #endif -#if XMALLOC_TRACE - xmalloc_show_trace(p, 1); -#endif #if MEM_GEN_TRACE if (tracefp) /* new ptr, old ptr, new size */ fprintf(tracefp, "r:%p:%p:%d\n", p, s, sz); @@ -199,9 +187,6 @@ void *s = const_cast<void *>(s_const); PROF_start(free_const); -#if XMALLOC_TRACE - xmalloc_show_trace(s, -1); -#endif #if XMALLOC_DEBUG check_free(s); === modified file 'configure.ac' --- configure.ac 2014-03-16 03:08:55 +0000 +++ configure.ac 2014-03-16 12:44:59 +0000 @@ -459,18 +459,6 @@ dnl fi dnl ]) -dnl This is a developer only option.. developers know how to set defines -dnl -dnl AC_ARG_ENABLE(xmalloc-debug-trace, -dnl [ --enable-xmalloc-debug-trace -dnl Detailed trace of memory allocations], -dnl [ if test "$enableval" = "yes" ; then -dnl AC_MSG_NOTICE([malloc debug trace enabled]) -dnl AC_DEFINE(XMALLOC_TRACE,1,[Define to have a detailed trace of memory allocations]) -dnl AC_DEFINE(XMALLOC_DEBUG,1) -dnl fi -dnl ]) - AH_TEMPLATE(XMALLOC_STATISTICS,[Define to have malloc statistics]) AC_ARG_ENABLE(xmalloc-statistics, AS_HELP_STRING([--enable-xmalloc-statistics], @@ -3055,7 +3043,6 @@ res_init \ __res_init \ rint \ - sbrk \ sched_getaffinity \ sched_setaffinity \ select \ === modified file 'include/squid.h' --- include/squid.h 2012-10-11 07:19:02 +0000 +++ include/squid.h 2014-03-16 12:44:59 +0000 @@ -103,11 +103,7 @@ /* * Determine if this is a leak check build or standard */ -#if PURIFY -#define LEAK_CHECK_MODE 1 -#elif WITH_VALGRIND -#define LEAK_CHECK_MODE 1 -#elif XMALLOC_TRACE +#if PURIFY || WITH_VALGRIND #define LEAK_CHECK_MODE 1 #endif === modified file 'include/util.h' --- include/util.h 2014-02-21 10:46:19 +0000 +++ include/util.h 2014-03-16 12:44:59 +0000 @@ -60,20 +60,6 @@ #include "SquidNew.h" #endif -#if XMALLOC_TRACE -#define xmalloc(size) (xmalloc_func="xmalloc",xmalloc_line=__LINE__,xmalloc_file=__FILE__,xmalloc(size)) -#define xfree(ptr) (xmalloc_func="xfree",xmalloc_line=__LINE__,xmalloc_file=__FILE__,xfree(ptr)) -#define xrealloc(ptr,size) (xmalloc_func="xrealloc",xmalloc_line=__LINE__,xmalloc_file=__FILE__,xrealloc(ptr,size)) -#define xcalloc(n,size) (xmalloc_func="xcalloc",xmalloc_line=__LINE__,xmalloc_file=__FILE__,xcalloc(n,size)) -#define xstrdup(ptr) (xmalloc_func="xstrdup",xmalloc_line=__LINE__,xmalloc_file=__FILE__,xstrdup(ptr)) -extern int xmalloc_line; -extern char *xmalloc_file; -extern char *xmalloc_func; -extern int xmalloc_trace; -extern size_t xmalloc_total; -extern void xmalloc_find_leaks(void); -#endif - SQUIDCEXTERN time_t parse_iso3307_time(const char *buf); SQUIDCEXTERN double xpercent(double part, double whole); === modified file 'lib/malloc_trace.cc' --- lib/malloc_trace.cc 2014-02-21 10:46:19 +0000 +++ lib/malloc_trace.cc 2014-03-16 12:44:59 +0000 @@ -74,30 +74,11 @@ #endif -#if XMALLOC_TRACE -char *xmalloc_file = ""; -int xmalloc_line = 0; -char *xmalloc_func = ""; -static int xmalloc_count = 0; -int xmalloc_trace = 0; /* Enable with -m option */ -size_t xmalloc_total = 0; -#undef xmalloc -#undef xfree -#undef xrealloc -#undef xcalloc -#undef xstrdup -#endif - #if XMALLOC_DEBUG #define DBG_ARRY_SZ (1<<11) #define DBG_ARRY_BKTS (1<<8) static void *(*malloc_ptrs)[DBG_ARRY_SZ]; static int malloc_size[DBG_ARRY_BKTS][DBG_ARRY_SZ]; -#if XMALLOC_TRACE -static char *malloc_file[DBG_ARRY_BKTS][DBG_ARRY_SZ]; -static short malloc_line[DBG_ARRY_BKTS][DBG_ARRY_SZ]; -static int malloc_count[DBG_ARRY_BKTS][DBG_ARRY_SZ]; -#endif static int dbg_initd = 0; #define DBG_HASH_BUCKET(ptr) (((((int)ptr)>>4)+(((int)ptr)>>12)+(((int)ptr)>>20))&0xFF) @@ -113,13 +94,6 @@ for (I = 0; I < DBG_ARRY_SZ; ++I) { malloc_ptrs[B][I] = NULL; malloc_size[B][I] = 0; -#if XMALLOC_TRACE - - malloc_file[B][I] = NULL; - malloc_line[B][I] = 0; - malloc_count[B][I] = 0; -#endif - } } @@ -137,19 +111,7 @@ continue; malloc_ptrs[B][I] = NULL; - malloc_size[B][I] = 0; - -#if XMALLOC_TRACE - - malloc_file[B][I] = NULL; - - malloc_line[B][I] = 0; - - malloc_count[B][I] = 0; - -#endif - break; } @@ -196,19 +158,7 @@ continue; malloc_ptrs[B][I] = p; - malloc_size[B][I] = (int) sz; - -#if XMALLOC_TRACE - - malloc_file[B][I] = xmalloc_file; - - malloc_line[B][I] = xmalloc_line; - - malloc_count[B][I] = xmalloc_count; - -#endif - break; } @@ -222,189 +172,3 @@ #endif -#if XMALLOC_TRACE && !HAVE_MALLOCBLKSIZE -size_t -xmallocblksize(void *p) -{ - int B, I; - B = DBG_HASH_BUCKET(p); - - for (I = 0; I < DBG_ARRY_SZ; ++I) { - if (malloc_ptrs[B][I] == p) - return malloc_size[B][I]; - } - - return 0; -} - -#endif - -#ifdef XMALLOC_TRACE -static char * -malloc_file_name(void *p) -{ - int B, I; - B = DBG_HASH_BUCKET(p); - - for (I = 0; I < DBG_ARRY_SZ; ++I) { - if (malloc_ptrs[B][I] == p) - return malloc_file[B][I]; - } - - return 0; -} - -int -malloc_line_number(void *p) -{ - int B, I; - B = DBG_HASH_BUCKET(p); - - for (I = 0; I < DBG_ARRY_SZ; ++I) { - if (malloc_ptrs[B][I] == p) - return malloc_line[B][I]; - } - - return 0; -} - -int -malloc_number(void *p) -{ - int B, I; - B = DBG_HASH_BUCKET(p); - - for (I = 0; I < DBG_ARRY_SZ; ++I) { - if (malloc_ptrs[B][I] == p) - return malloc_count[B][I]; - } - - return 0; -} - -static void -xmalloc_show_trace(void *p, int sign) -{ - int statMemoryAccounted(); - static size_t last_total = 0, last_accounted = 0, last_mallinfo = 0; - size_t accounted = statMemoryAccounted(); - size_t mi = 0; - size_t sz; -#if HAVE_MALLINFO - - struct mallinfo mp = mallinfo(); - mi = mp.uordblks + mp.usmblks + mp.hblkhd; -#endif - - sz = xmallocblksize(p) * sign; - xmalloc_total += sz; - xmalloc_count += sign > 0; - - if (xmalloc_trace) { - fprintf(stderr, "%c%8p size=%5d/%d acc=%5d/%d mallinfo=%5d/%d %s:%d %s", - sign > 0 ? '+' : '-', p, - (int) xmalloc_total - last_total, (int) xmalloc_total, - (int) accounted - last_accounted, (int) accounted, - (int) mi - last_mallinfo, (int) mi, - xmalloc_file, xmalloc_line, xmalloc_func); - - if (sign < 0) - fprintf(stderr, " (%d %s:%d)\n", malloc_number(p), malloc_file_name(p), malloc_line_number(p)); - else - fprintf(stderr, " %d\n", xmalloc_count); - } - - last_total = xmalloc_total; - last_accounted = accounted; - last_mallinfo = mi; -} - -short malloc_refs[DBG_ARRY_BKTS][DBG_ARRY_SZ]; -#define XMALLOC_LEAK_ALIGN (4) -static void -xmalloc_scan_region(void *start, int size, int depth) -{ - int B, I; - char *ptr = start; - char *end = ptr + size - XMALLOC_LEAK_ALIGN; - static int sum = 0; - - while (ptr <= end) { - void *p = *(void **) ptr; - - if (p && p != start) { - B = DBG_HASH_BUCKET(p); - - for (I = 0; I < DBG_ARRY_SZ; ++I) { - if (malloc_ptrs[B][I] == p) { - if (!malloc_refs[B][I]++) { - /* A new reference */ - fprintf(stderr, "%*s%p %s:%d size %d allocation %d\n", - depth, "", - malloc_ptrs[B][I], malloc_file[B][I], - malloc_line[B][I], malloc_size[B][I], - malloc_count[B][I]); - sum += malloc_size[B][I]; - xmalloc_scan_region(malloc_ptrs[B][I], malloc_size[B][I], depth + 1); - - if (depth == 0) { - if (sum != malloc_size[B][I]) - fprintf(stderr, "=== %d bytes\n", sum); - - sum = 0; - } - -#if XMALLOC_SHOW_ALL_REFERENCES - - } else { - /* We have already scanned this pointer... */ - fprintf(stderr, "%*s%p %s:%d size %d allocation %d ... (%d)\n", - depth * 2, "", - malloc_ptrs[B][I], malloc_file[B][I], - malloc_line[B][I], malloc_size[B][I], - malloc_count[B][I], malloc_refs[B][I]); -#endif - - } - } - } - } - - ptr += XMALLOC_LEAK_ALIGN; - } -} - -void -xmalloc_find_leaks(void) -{ - int B, I; - int leak_sum = 0; - - extern void _etext; - fprintf(stderr, "----- Memory map ----\n"); - xmalloc_scan_region(&_etext, (void *) sbrk(0) - (void *) &_etext, 0); - - for (B = 0; B < DBG_ARRY_BKTS; ++B) { - for (I = 0; I < DBG_ARRY_SZ; ++I) { - if (malloc_ptrs[B][I] && malloc_refs[B][I] == 0) { - /* Found a leak... */ - fprintf(stderr, "Leak found: %p", malloc_ptrs[B][I]); - fprintf(stderr, " %s", malloc_file[B][I]); - fprintf(stderr, ":%d", malloc_line[B][I]); - fprintf(stderr, " size %d", malloc_size[B][I]); - fprintf(stderr, " allocation %d\n", malloc_count[B][I]); - leak_sum += malloc_size[B][I]; - } - } - } - - if (leak_sum) { - fprintf(stderr, "Total leaked memory: %d\n", leak_sum); - } else { - fprintf(stderr, "No memory leaks detected\n"); - } - - fprintf(stderr, "----------------------\n"); -} - -#endif /* XMALLOC_TRACE */ === modified file 'src/globals.h' --- src/globals.h 2014-02-21 10:46:19 +0000 +++ src/globals.h 2014-03-16 12:44:59 +0000 @@ -122,9 +122,6 @@ extern char *WIN32_Service_Command_Line; /* NULL */ extern unsigned int WIN32_run_mode; /* _WIN_SQUID_RUN_MODE_INTERACTIVE */ #endif -#if HAVE_SBRK -extern void *sbrk_start; /* 0 */ -#endif extern int ssl_ex_index_server; /* -1 */ extern int ssl_ctx_ex_index_dont_verify_domain; /* -1 */ === modified file 'src/main.cc' --- src/main.cc 2014-02-21 16:14:05 +0000 +++ src/main.cc 2014-03-16 12:44:59 +0000 @@ -501,13 +501,7 @@ fatal("Need to add -DMALLOC_DBG when compiling to use -mX option"); #endif - } else { -#if XMALLOC_TRACE - xmalloc_trace = !xmalloc_trace; -#else - fatal("Need to configure --enable-xmalloc-debug-trace to use -m option"); -#endif - } + } break; case 'n': @@ -1300,10 +1294,6 @@ { ConfigureCurrentKid(argv[0]); -#if HAVE_SBRK - sbrk_start = sbrk(0); -#endif - Debug::parseOptions(NULL); debug_log = stderr; @@ -1922,15 +1912,6 @@ mimeFreeMemory(); errorClean(); #endif -#if !XMALLOC_TRACE - - if (opt_no_daemon) { - file_close(0); - file_close(1); - file_close(2); - } - -#endif // clear StoreController Store::Root(NULL); @@ -1942,13 +1923,6 @@ RunRegisteredHere(RegisteredRunner::finishShutdown); -#if XMALLOC_TRACE - - xmalloc_find_leaks(); - - debugs(1, DBG_CRITICAL, "Memory used after shutdown: " << xmalloc_total); - -#endif #if MEM_GEN_TRACE log_trace_done(); === modified file 'src/mgr/InfoAction.cc' --- src/mgr/InfoAction.cc 2013-10-25 00:13:46 +0000 +++ src/mgr/InfoAction.cc 2014-03-16 12:44:59 +0000 @@ -81,9 +81,6 @@ cpu_usage += stats.cpu_usage; cpu_usage5 += stats.cpu_usage5; cpu_usage60 += stats.cpu_usage60; -#if HAVE_SBRK - proc_data_seg += stats.proc_data_seg; -#endif maxrss += stats.maxrss; page_faults += stats.page_faults; #if HAVE_MSTATS && HAVE_GNUMALLOC_H @@ -106,8 +103,8 @@ mp_uordbytes += stats.mp_uordbytes; mp_allocated += stats.mp_allocated; mp_treeoverhead += stats.mp_treeoverhead; -#endif -#endif +#endif /* HAVE_STRUCT_MALLINFO_MXFAST */ +#endif /* HAVE_MALLINFO && HAVE_STRUCT_MALLINFO */ total_accounted += stats.total_accounted; #if !(HAVE_MSTATS && HAVE_GNUMALLOC_H) && HAVE_MALLINFO && HAVE_STRUCT_MALLINFO mem_pool_allocated += stats.mem_pool_allocated; === modified file 'src/mgr/InfoAction.h' --- src/mgr/InfoAction.h 2013-09-27 16:06:15 +0000 +++ src/mgr/InfoAction.h 2014-03-16 12:44:59 +0000 @@ -68,9 +68,6 @@ double cpu_usage; double cpu_usage5; double cpu_usage60; -#if HAVE_SBRK - double proc_data_seg; -#endif double maxrss; double page_faults; #if HAVE_MSTATS && HAVE_GNUMALLOC_H @@ -93,8 +90,8 @@ double mp_uordbytes; double mp_allocated; double mp_treeoverhead; -#endif -#endif +#endif /* HAVE_STRUCT_MALLINFO_MXFAST */ +#endif /* HAVE_MALLINFO && HAVE_STRUCT_MALLINFO */ double total_accounted; #if !(HAVE_MSTATS && HAVE_GNUMALLOC_H) && HAVE_MALLINFO && HAVE_STRUCT_MALLINFO double mem_pool_allocated; === modified file 'src/stat.cc' --- src/stat.cc 2014-01-24 01:57:15 +0000 +++ src/stat.cc 2014-03-16 12:44:59 +0000 @@ -588,12 +588,6 @@ stats.cpu_usage5 = statCPUUsage(5); stats.cpu_usage60 = statCPUUsage(60); -#if HAVE_SBRK - - stats.proc_data_seg = ((char *) sbrk(0) - (char *) sbrk_start); - -#endif - stats.maxrss = rusage_maxrss(&rusage); stats.page_faults = rusage_pagefaults(&rusage); @@ -814,13 +808,6 @@ storeAppendPrintf(sentry, "\tCPU Usage, 60 minute avg:\t%.2f%%\n", stats.cpu_usage60); -#if HAVE_SBRK - - storeAppendPrintf(sentry, "\tProcess Data Segment Size via sbrk(): %.0f KB\n", - stats.proc_data_seg / 1024); - -#endif - storeAppendPrintf(sentry, "\tMaximum Resident Size: %.0f KB\n", stats.maxrss); @@ -1461,18 +1448,12 @@ if (Config.warnings.high_memory) { size_t i = 0; #if HAVE_MSTATS && HAVE_GNUMALLOC_H - struct mstats ms = mstats(); i = ms.bytes_total; #elif HAVE_MALLINFO && HAVE_STRUCT_MALLINFO - struct mallinfo mp = mallinfo(); i = mp.arena; -#elif HAVE_SBRK - - i = (size_t) ((char *) sbrk(0) - (char *) sbrk_start); #endif - if (Config.warnings.high_memory < i) debugs(18, DBG_CRITICAL, "WARNING: Memory usage at " << ((unsigned long int)(i >> 20)) << " MB"); } # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWb2ZzjoAB3RfgABQWXP/93/n 3+C////2YArfc9oj60AfQUHoAHHb32BTpyu1jVY0JKUaPSaMp5TGmmpjIepGgB6g0AAANBKQRoxT TySeoBpoAAAAAADIDRGmJKfqR6QY1GQAAaADEAAAEmpJomkjQyPQhpoADQAANNNGTQaCKU9Uwp6F Npppo01MaT1PQxT9RNAA0AAASRCYgJhGink0BU9PSmQ00D1GmgAGI9+oxmcdn6HfRwowP/TYtbny r948WjhChEcGq4SWQSJ2VGdyeaRBzI6Miu6TEHJFglbwM4yMjY2VFMESFA5GRynF2jC2s5wChovX /GI74cxhGMC6IfAhpIMWLCCqqiiixTi4JDpc+/+2uY4MtWT5ubM8ow2arTIVjENpuThB4UKvSDme eVjBNaYF7FJhfG2kqs8sUtk44VLtKrg0rTghe1OdF0vovYuZUZ7m8dgTY5uDg36IcXNhtkOVIcbI c5CH74dvVs0bm1hq3LDiUWxt1zjFRZdJUg794Qj8RHHU/vdbf0rD6wCrCSPVHgex1advuEAeh5Xj u3X8TnYf5yXxGDY6B+TmzOfHzLCAwf6xGYP+MDgLBdjRxd0xew68EhXvk8UJQY9xcOa8ar5QVUY8 UW2wwQSSSJXlwVaZIMRJWahGSF7h1EtkStkIgjXHf2+HJ213jFLu2AIqwaBLJIY5arBdBSWdKBYM yqKL0BctogOIsHUYFIORZICECMikQcSi5sUjAEpg6ctCEal1FuJNOhSTFzyjExsItbefYxG4iwVY tIp2IX0EzCgoEx4EyYxU9itk7i0lE2TGPPRfYjVIyYsbTg498b4ReaXkSULI++h+6mgiDH64HG1O m2J2Hgc98sDMtwq46roMQuGeN5DgZmGLkiedo9bS1Q0ATxG4xlHvfg3vDXo79VcZNcNaJaQiPHf1 H4ykBCxAGdLwUChZoNNB/3k5XW6yKvtuDUj0CjuAqOZrQn6RLLQmQyYzI494jjHtOCwciwwb5DnU AiYiMC86nbQiGnC55OKNapd99DIGBr0pY0rcqXRRIe5KRARgsGLJkh1CIQyKQEpXjFg2D4EgoDCW IOJQKEGHEuZyqrgYBXK3UvqXl8mGiXWFtYsWGKqWTL8BKkitcydhtHEQyFqXXGR1qQqfhqTyXBRL gpo9NJw0sysIM0sWiJUCdGgM4JcVebEdSQOJd7ylxbdupHSmOg+BerRKpfI2HeBdEMiYNIzSwqcR L0NG0fcWkSopoHyMGMe4RKjFeKSRsSmWlx01PFWHoq9eDx6wthbdDXG+dhKFa0nIRNgsGBJxshkL Y3qQDla7PzIGlR+zgKJaRuykoxgMsQFxMMGKKRiXYkJcHepMSvUllyuKGBnySJFpsaGgdND8O3uJ ep8jkvcBZ7tvqYG+Ywz0HCNljOWEWmR12N5y2KHUoQN17CJOJQJQEmoGvI7KGsMSk7zCKo3Ft0UV V0FQoACUXhIe60+BQpkXEA0IGfp5CWJ8S988MuOEC15mE4jPo30FvjSmxUSgF41jMyBXbMQTlpEj gSlvqXsTvLLcaHEsHGVX39r48gVN7jQiaF7D+Rvs1FU2IVzPkaUIYEN2hGmBGx+5HYaAxyGyGNSO V0bDMgUIkC0hZPkWl5YyGak1BTJh4lhQszONwK4kWGw5gMcSA+p4d8uAlJRrCD4ua8SY5O9RnLgM dDpYVLTArUvLJcQb4iW5qQ4MzjGNT1JzO0tjG7EtIHIcwkRV7HA5EyMHfeBaMSuKFpxOgxkTvGJa lpQiOZGq3uAVLytcqWERKQCirTiSiaXlZwmOP4D1TDYX43Sqq+y43ErxjAZWEVOJCOco4WiXTpiW GMhs96Fta/ABX37VgAeHQhxzTl94xn0OhYczWynEUmRg0mri1i2dIi4Rxw0WqQohdhMcnfkNWtrh pYKxNVAlNVUO2QSlYsVV2vIQ2t2+8wJskOPl/MnCcRN8yhsAKJFfbw8ofHVyfjRr65mh/DEnJ4f1 pJ9KxgmPPJMEUiKyCQUPRLgbVNhCBb+VsCyIwMhW+GMQ2DAPvlQWHQbLiYhgOi3p6HNMMebuMiAD r9kgna82wuopBuOk45E7Ss83j7Li4gkg9JTBXfITj5CRrdVjw1KykLr5A6YJCeWYbPAhVLm7NHan lReQjyoWT63JIwq8054n8PgU/eegxDcfYO3byNzxKD8CB4FpA87DwW1TEIjFSm9/U+fqfNIFdNFv j2UBGKhnLM7wOmxuVGND+JZ4/byOnKRgZFwehUzUfgkJjI8fVJeBMidDmtSBqxZ2LLX70BJnJ+Fy Rrt9rDN1/RaMypVcueOAJZnfKUt5jHM+goVETJl8iMT8S8F1UzgYgmORJqIRAaRctNrCEjNACujS MsYDWRA1IisSYQFHjtbZppEZWjp0x6pCkIzqdactqjEDkdiJqdj5PRsXdunrT4+x0LByZiYmxy84 GIiAjoIV6NGWLJ+QjJC3m0iXzTLmjRZtfVJMktUcsQqFWGK2LlR+1jR0ldKvvCQjSCR4pgXCnHHf 0xOdpmIa1C+lVQiEkYHHUNjI8uZA8yw8jQOH9bPq9SPmWnlRIcyiMcEjgT+ibBOwTVeWg2bxHGI2 GEBxQAz1bguaoB74Dx7bopKXrBy8WfDOgU6TBKjveTa5DhFnqeZ6Hou2XPwo/b6hIO3zQh39RCuv D3ZI9SQDDulLQKwc+c53mLUcmiYiRH66c9XLfGAdaL2dzjwjDvmeqVOxlAlcr57ZZN2kQqUK7MTJ DBD8ssDT3LvM0PkcfGxewUQtZQD2kJLxuJZwPD0cUVo0ponk6tOVFRsqCESpH4sLBjKFiMsQjXJj v22b1pO+XYu13G/Nql4tZIYHghTYJrssKjQUUIyFUCQlHvIDLAjWXFSswDD4hPBg2wJjeRvDvoZt OgsK7G1Q20JWUo31G16JDHJTitX1nK3m4hgUbQEyRW8BV+jzs+sBZ1yJALEzaSjIgk6jiJjvNjuo +3qqcL11CZJ5LcCpi11KL0hS+q8grYbU9Z2ePuOEPJYnO7TG6ZNybCMBGhGBK7EM0PL0qPRYpJZL fyxRrioXhcZDSI4WmMjLFkRUCIwf4K8d4EXn5c0K2BwmzEKFEPMjJlgEV4GApbhknJ72a6Ws6SBh ooJHJlxxkoZLkIhLM1XlQhcd/S55NHk8YqyJaS2EWwzPwq2hGAKLVYoDxHPUj1OiFr3G4iICPpUj wNe9BFnyKzxG+AplMQK0fjtf+LuSKcKEhezOcdA=