From cbea9a7c9dce7ed3f45be8a63ea471499cd914df Mon Sep 17 00:00:00 2001 From: Matt Heffron Date: Wed, 29 Apr 2026 11:45:47 -0700 Subject: [PATCH 1/2] HCFILES added filtering and logging details (#2567) * Add reporting of filtering "Why?" Add reporting of the actual error Condition on files that FAIL. Change extraction of the "hcfiles-fails.txt" to a perl program since the Condition reporting sometimes is multiple lines. * Change running of the getFails.pl that extracts FAIL information. Also check if perl is installed, and report it if not into the fails file. --- internal/MEDLEY-UTILS | 233 +++++++++++++++++++++++------------- internal/MEDLEY-UTILS.DFASL | Bin 17115 -> 19875 bytes scripts/do_hcfiles.sh | 7 +- scripts/getFails.pl | 31 +++++ 4 files changed, 186 insertions(+), 85 deletions(-) create mode 100644 scripts/getFails.pl diff --git a/internal/MEDLEY-UTILS b/internal/MEDLEY-UTILS index 8f32114e..143d15c3 100644 --- a/internal/MEDLEY-UTILS +++ b/internal/MEDLEY-UTILS @@ -1,27 +1,29 @@ -(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) +(DEFINE-FILE-INFO :PACKAGE "INTERLISP" :READTABLE "INTERLISP" :BASE 10) -(FILECREATED "28-Jan-2026 11:03:17" {DSK}larry>il>medley>internal>MEDLEY-UTILS.;3 26880 +(FILECREATED "16-Apr-2026 22:42:51" {DSK}matt>Interlisp>medley>internal>MEDLEY-UTILS.;2 30564 - :EDIT-BY "lmm" + :EDIT-BY "mth" - :CHANGES-TO (FNS MAKE-INDEX-HTMLS GATHER-INFO MAKE-FULLER-DB MEDLEY-FIX-LINKS MEDLEY-FIX-DATES - MAKE-EXPORTS-ALL MAKE-WHEREIS-HASH MAKE-WHEREIS-LOOPS HCFILES RECOMPILE-ONE - RECMPL COMPILE-SETUP REMAKEFILES) + :CHANGES-TO (FNS HCFILES MAKE-EXPORTS-ALL MAKE-INDEX-HTMLS) + (FUNCTIONS REPORT-AND-GO) + (VARS MEDLEY-UTILSCOMS HC-SKIP-EXTENSIONS) (ADVICE TEDIT.PROMPTPRINT) - :PREVIOUS-DATE "28-Jan-2026 10:46:02" {DSK}larry>il>medley>internal>MEDLEY-UTILS.;1) + :PREVIOUS-DATE "16-Apr-2026 22:27:40" {DSK}matt>Interlisp>medley>internal>MEDLEY-UTILS.;1 +) (PRETTYCOMPRINT MEDLEY-UTILSCOMS) (RPAQQ MEDLEY-UTILSCOMS [(FNS GATHER-INFO MAKE-FULLER-DB MEDLEY-FIX-LINKS MEDLEY-FIX-DATES) - (VARS MEDLEY-FIX-DIRS OKSOURCES OKLIBRARY OKLISPUSERS OKINTERNAL) + (VARS HC-SKIP-EXTENSIONS MEDLEY-FIX-DIRS OKSOURCES OKLIBRARY OKLISPUSERS OKINTERNAL) (FNS MAKE-EXPORTS-ALL MAKE-WHEREIS-HASH MAKE-WHEREIS-LOOPS) (FNS HCFILES MAKE-INDEX-HTMLS) (PROP FILETYPE MEDLEY-UTILS) (ADVISE TEDIT.PROMPTPRINT) (FNS RECOMPILE-ONE RECMPL COMPILE-SETUP REMAKEFILES) + (FUNCTIONS REPORT-AND-GO) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA]) @@ -140,6 +142,12 @@ (for X in (OR DIRS MEDLEY-FIX-DIRS) join (FIX-DIRECTORY-DATES (MEDLEYDIR (PRINT X T]) ) +(RPAQQ HC-SKIP-EXTENSIONS + (PDF SKIP HTML LCOM DFASL SH SYSOUT DRIBBLE IMPTR DISPLAYFONT WD WIDTHS MEDLEYDISPLAYFONT + PSCFONT ALL DATABASE 1 MD GZ PRESS IP BITMAP EL ELC XFORMS BUGREPORTS SUITE LISTING AWK + DINFOGRAPH HASHFILE BLTCHAR DOC DOCPOINTERS STATUS NOTEFILE ICO ISS BMP PNG PS1 + VENUESYSOUT ACE FMC HKB LGC CMD COMMAND HTM SVG XML EXE)) + (RPAQQ MEDLEY-FIX-DIRS ("sources" "library" "lispusers" "internal" "greetfiles" "doctools")) (RPAQQ OKSOURCES (RENAMEFNS VMEM READSYS CASH-FILE HASH-FILE MEDLEYDIR MAKEINIT)) @@ -162,15 +170,18 @@ (DEFINEQ (MAKE-EXPORTS-ALL - [LAMBDA (OUTFILE) (* ; "Edited 3-Aug-2023 18:34 by frank") + [LAMBDA (OUTFILE) (* ; "Edited 15-Apr-2026 16:42 by mth") + (* ; "Edited 3-Aug-2023 18:34 by frank") (* ; "Edited 9-Mar-2021 16:11 by larry") - (* "Edited May 3, 2018 by Ron Kaplan--relative to MEDLEYDIR/lispcore/. Don't know why it does the CORE/RENAME") - (* - "Edited Aug 17 94 by Sybalsky -- point it to /king/export/lispcore as the truth directory.") - (* - "Edited July 5, 1990 by Sybalsky -- point it to Pele as the truth directory.") - (* - "Edited September 29, 1986 by van Melle") + + (* ;; "Edited May 3, 2018 by Ron Kaplan--relative to MEDLEYDIR/lispcore/. Don't know why it does the CORE/RENAME") + + (* ;; "Edited Aug 17 94 by Sybalsky -- point it to /king/export/lispcore as the truth directory.") + + (* ;; "Edited July 5, 1990 by Sybalsky -- point it to Pele as the truth directory.") + + (* ;; "Edited September 29, 1986 by van Melle") + (CNDIR (MEDLEYDIR "sources")) (LOAD 'FILESETS) (GATHEREXPORTS EXPORTFILES (OR OUTFILE "exports.all"]) @@ -204,7 +215,8 @@ (DEFINEQ (HCFILES - [LAMBDA (BASE REDO SUBSETS) (* ; "Edited 30-Jun-2024 08:27 by lmm") + [LAMBDA (BASE REDO SUBSETS) (* ; "Edited 16-Apr-2026 22:42 by mth") + (* ; "Edited 30-Jun-2024 08:27 by lmm") (* ; "Edited 23-Apr-2024 23:15 by lmm") (* ; "Edited 22-Apr-2024 13:22 by lmm") (* ; "Edited 5-Feb-2024 12:16 by lmm") @@ -213,74 +225,116 @@ (* ;;;; "BASE is the root directory. Doesn't replace PDF files except when REDO") -(* ;;; " SUBSETS is some combinsyion og (:YRDY :HYML :PRETTY and INDEX") +(* ;;; " SUBSETS is some combination of (:YRDY :HYML :PRETTY and INDEX") - (LET - [[DIRLIST (LIST (OR BASE (PSEUDOFILENAME (MEDLEYDIR] - (PHASES (OR SUBSETS '(TEDIT PRETTY INDEX HRULE] - (FILESLOAD PDFSTREAM SKETCH) - (FONTSET 'STANDARD) - (while DIRLIST - do - (SETQ BASE (pop DIRLIST)) - (for SRCPATH in (DIRECTORY (CONCAT BASE "*.*;")) - do (PROG* [(SRC (UNPACKFILENAME SRCPATH)) - [EXT (U-CASE (LISTGET SRC 'EXTENSION] - (DIR (LISTGET SRC 'DIRECTORY)) - FRDY LDGP DEST (NOV (PACKFILENAME `(VERSION NIL ,@SRC] - (CL:FORMAT T "Starting on ~a :~%%" SRCPATH) - (CL:WHEN (DIRECTORYNAMEP SRCPATH) + (LET* ([DIRLIST (LIST (OR BASE (PSEUDOFILENAME (MEDLEYDIR] + [PHASES (OR SUBSETS '(TEDIT PRETTY INDEX HRULE] + (DOTEDIT (MEMB 'TEDIT PHASES)) + (DOPRETTY (MEMB 'PRETTY PHASES))) + (FILESLOAD PDFSTREAM SKETCH) + (FONTSET 'STANDARD) + (while DIRLIST + do (SETQ BASE (pop DIRLIST)) - (* ;; "any directory names, push them off and do them in another phase") + (* ;; "Breadth-first processing") - (CL:UNLESS (OR (STRPOS ">." NOV) - (INFILEP (CONCAT NOV ".skip"))) - (SETQ DIRLIST (NCONC1 DIRLIST SRCPATH))) - (RETURN)) - (CL:WHEN - (MEMB EXT - '(PDF SKIP HTML LCOM DFASL SH SYSOUT DRIBBLE IMPTR DISPLAYFONT ALL - DATABASE)) + (for SRCPATH in (DIRECTORY (CONCAT BASE "*.*;")) + do (PROG* ((SRC (UNPACKFILENAME SRCPATH)) + [EXT (U-CASE (LISTGET SRC 'EXTENSION] + (DIR (LISTGET SRC 'DIRECTORY)) + [NAME (U-CASE (LISTGET SRC 'NAME] + [NOV (PACKFILENAME.STRING `(VERSION NIL ,@SRC] + LSFP DEST) + (CL:WHEN (DIRECTORYNAMEP SRCPATH) - (* ;; "ignore any of these extensions") + (* ;; + "any directory names, push them off and do them in another phase") - (RETURN)) + (if [NOT (OR (STRPOS "<." NOV) + (CL:SEARCH "" NOV :TEST #'CL:CHAR-EQUAL) + (STRPOS ">." NOV) + (INFILEP (CONCAT NOV ".skip"] + then (SETQ DIRLIST (NCONC1 DIRLIST SRCPATH)) + (CL:FORMAT T "~&Deferring to later ~a~%%" SRCPATH) + else (CL:FORMAT T "~&Skipping ~a~%%" SRCPATH)) + (RETURN)) - (* ;; - " doesnt (yet) implement / to - translattion. .readme should show up as -.readme.") + (* ;; "Fixup files that start with . and have no other extension") - (SETQ DEST (CONCAT NOV ".pdf")) - (CL:WHEN (AND (NOT REDO) - (INFILEP DEST)) - (CL:FORMAT T "~a already there~%%" DEST) - (RETURN)) - (CL:WHEN (INFILEP (CONCAT DEST ".skip")) - (PRINTOUT T "Explicit .skip " DEST T) - (RETURN)) - (if (MEMB 'TEDIT PHASES) - then (CL:WHEN [OR (MEMB EXT '(TEDIT TED SKETCH BRAVO)) - (CAR (NLSETQ (TEDIT.FORMATTEDFILEP SRCPATH] - (if (EQ REDO 'TEST) - then (CL:FORMAT T "Testing open ~a..." SRCPATH) - (CLOSEF? (OPENTEXTSTREAM SRCPATH)) - else (OR [NLSETQ (CL:WITH-OPEN-STREAM (S (OPENTEXTSTREAM SRCPATH) - ) - (TEDIT.FORMAT.HARDCOPY S DEST T NIL NIL - NIL 'PDF] - (PRINT 'FAIL T))) - (CL:FORMAT T "DONE"))) - (CL:WHEN (AND (MEMB 'PRETTY PHASES) - (MEMB EXT '(NIL IL)) - [SETQ LSFP (CAR (NLSETQ (LISPSOURCEFILEP SRCPATH] - (NEQ LSFP *COMMON-LISP-READ-ENVIRONMENT*)) - (PRINTOUT T "PDF printing " " to " DEST "...") - (OR (NLSETQ (CL:WITH-OPEN-STREAM (STR (OPEN-PDF-STREAM DEST)) - (PRETTYFILEINDEX SRCPATH NIL STR))) - (PRINT 'FAIL T)) - (PRINTOUT T "DONE" T))]) + (CL:WHEN (AND (NULL EXT) + (EQ (CHCON1 NAME) + (CHARCODE %.))) + (SETQ EXT (SUBATOM NAME 2))) + (CL:WHEN (MEMB EXT HC-SKIP-EXTENSIONS) + + (* ;; "ignore any of these extensions") + + (CL:FORMAT T "~&Ignoring (on extension): ~a~%%" SRCPATH) + (RETURN)) + + (* ;; + " doesn't (yet) implement / to - translation. .readme should show up as -.readme.") + + (SETQ DEST (CONCAT NOV ".pdf")) + (CL:WHEN (AND (NOT REDO) + (INFILEP DEST)) + (CL:FORMAT T "~a is already there~%%" DEST) + (RETURN)) + (CL:WHEN (INFILEP (CONCAT DEST ".skip")) + (CL:FORMAT T "Explicit .skip ~a~%%" DEST) + (RETURN)) + (CL:FORMAT T "~&Starting on ~a:~%%" SRCPATH) + (CL:WHEN [AND DOTEDIT (OR (MEMB EXT '(TEDIT TED SKETCH BRAVO)) + (CAR (REPORT-AND-GO (TEDIT.FORMATTEDFILEP + SRCPATH) + (CL:FORMAT NIL + "~~%%~S TEDIT.FORMATTEDFILEP of ~A -- Condition: ~~A" + 'FAIL SRCPATH] + (if (EQ REDO 'TEST) + then (CL:FORMAT T "Testing open ~a..." SRCPATH) + (CLOSEF? (OPENTEXTSTREAM SRCPATH)) + else (REPORT-AND-GO (CL:WITH-OPEN-STREAM (S (OPENTEXTSTREAM + SRCPATH)) + (TEDIT.FORMAT.HARDCOPY S DEST T NIL NIL + NIL 'PDF)) + (CL:FORMAT NIL + "~~%%~S TEDIT.FORMAT.HARDCOPY of ~A -- Condition: ~~A" + 'FAIL SRCPATH))) + (PRIN3 " DONE" T) + (TERPRI T) + (RETURN)) + (CL:WHEN (AND DOPRETTY (OR (NULL EXT) + (EQ EXT 'IL)) + [SETQ LSFP (CAR (REPORT-AND-GO (LISPSOURCEFILEP SRCPATH) + (CL:FORMAT NIL + "~~%%~S LISPSOURCEFILEP of ~A -- Condition: ~~A" + 'FAIL SRCPATH] + (NEQ LSFP *COMMON-LISP-READ-ENVIRONMENT*)) + + (* ;; "Why the check for NEQ *COMMON-LISP-READ-ENVIRONMENT* ??") + + (PRIN3 "PDF printing " T) + (PRIN3 SRCPATH T) + (PRIN3 " to " T) + (PRIN3 DEST T) + (PRIN3 " ..." T) + (REPORT-AND-GO (CL:WITH-OPEN-STREAM (STR (OPEN-PDF-STREAM DEST)) + (PRETTYFILEINDEX SRCPATH NIL STR)) + (CL:FORMAT NIL + "~~%%~S PRETTYFILEINDEX of ~A -- Condition: ~~A" + 'FAIL SRCPATH)) + (PRIN3 " DONE" T) + (TERPRI T) + (RETURN)) + + (* ;; "Everything else") + + (PRIN3 "No processing." T) + (TERPRI T]) (MAKE-INDEX-HTMLS - [LAMBDA (BASE TOP LEVEL ROOT.NAME) (* ; "Edited 28-Jan-2026 11:01 by lmm") + [LAMBDA (BASE TOP LEVEL ROOT.NAME) (* ; "Edited 15-Apr-2026 16:33 by mth") + (* ; "Edited 28-Jan-2026 11:01 by lmm") (* ; "Edited 27-Jan-2026 10:50 by lmm") (* ; "Edited 23-Jan-2026 11:59 by lmm") (* ; "Edited 29-Apr-2024 14:18 by lmm") @@ -339,8 +393,8 @@ then 2 else 1)) -2))) - (CL:UNLESS (OR (MEMB SHORTNAME '(.git)) - (MEMB SHORTNAME '(.GIT)) + (CL:UNLESS (OR (EQ SHORTNAME '.git) + (EQ SHORTNAME '.GIT) [AND (STRPOS ".git" (L-CASE FULLNAME)) (NOT (STRPOS ".github" (L-CASE FULLNAME] (INFILEP (CONCAT FULLNAME ".skip"))) @@ -372,7 +426,8 @@ (PUTPROPS MEDLEY-UTILS FILETYPE :COMPILE-FILE) -[XCL:REINSTALL-ADVICE 'TEDIT.PROMPTPRINT :BEFORE '((:LAST (PRIN1 MSG T))) +[XCL:REINSTALL-ADVICE 'TEDIT.PROMPTPRINT :BEFORE '[(:LAST (PROGN (PRIN3 " " T) + (PRIN3 MSG T] :AFTER '((:LAST (AND (STRPOS "GETFN" MSG) (HELP MSG] @@ -463,6 +518,15 @@ (SETQ DIFF (COMPARESOURCES X DESTFILE NIL)) (TERPRI]) ) + +(DEFMACRO REPORT-AND-GO (FORM REPORT-FORMAT) (* ; "Edited 16-Apr-2026 16:02 by mth") + `[CL:MULTIPLE-VALUE-BIND (FORM-RESULT ERROR-CONDITION) + (IGNORE-ERRORS (CL:VALUES ,FORM)) (* ; "Only the first value") + (COND + (ERROR-CONDITION (PRIN3 (CL:FORMAT NIL ,REPORT-FORMAT ERROR-CONDITION) + T) + NIL) + (T (LIST FORM-RESULT]) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA ) @@ -472,9 +536,10 @@ (ADDTOVAR LAMA ) ) (DECLARE%: DONTCOPY - (FILEMAP (NIL (1312 8246 (GATHER-INFO 1322 . 6704) (MAKE-FULLER-DB 6706 . 7615) (MEDLEY-FIX-LINKS 7617 - . 8010) (MEDLEY-FIX-DATES 8012 . 8244)) (9425 12213 (MAKE-EXPORTS-ALL 9435 . 10494) ( -MAKE-WHEREIS-HASH 10496 . 11685) (MAKE-WHEREIS-LOOPS 11687 . 12211)) (12214 21862 (HCFILES 12224 . -16487) (MAKE-INDEX-HTMLS 16489 . 21860)) (22112 26724 (RECOMPILE-ONE 22122 . 24019) (RECMPL 24021 . -24624) (COMPILE-SETUP 24626 . 25250) (REMAKEFILES 25252 . 26722))))) + (FILEMAP (NIL (1289 8223 (GATHER-INFO 1299 . 6681) (MAKE-FULLER-DB 6683 . 7592) (MEDLEY-FIX-LINKS 7594 + . 7987) (MEDLEY-FIX-DATES 7989 . 8221)) (9795 12371 (MAKE-EXPORTS-ALL 9805 . 10652) ( +MAKE-WHEREIS-HASH 10654 . 11843) (MAKE-WHEREIS-LOOPS 11845 . 12369)) (12372 24990 (HCFILES 12382 . +19514) (MAKE-INDEX-HTMLS 19516 . 24988)) (25324 29936 (RECOMPILE-ONE 25334 . 27231) (RECMPL 27233 . +27836) (COMPILE-SETUP 27838 . 28462) (REMAKEFILES 28464 . 29934)) (29938 30408 (REPORT-AND-GO 29938 . +30408))))) STOP diff --git a/internal/MEDLEY-UTILS.DFASL b/internal/MEDLEY-UTILS.DFASL index 00401e75e14ee85dc9a197e6d8d94c9f3466971a..d375d4f36c9864dbe49b3c2f7584b9e9da84e570 100644 GIT binary patch delta 9471 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 diff --git a/scripts/do_hcfiles.sh b/scripts/do_hcfiles.sh index 0246a0db..f32f61de 100755 --- a/scripts/do_hcfiles.sh +++ b/scripts/do_hcfiles.sh @@ -57,7 +57,12 @@ main() { # save dribble file to loadups; extract and save fails "${MEDLEYDIR}"/scripts/cpv ${logindir}/HCFILES.DRIBBLE "${MEDLEYDIR}"/loadups/hcfiles.dribble - grep "IL:FAIL" < "${MEDLEYDIR}"/loadups/hcfiles.dribble > ${logindir}/fails + if [ -f "$(command -v perl)" ] && [ -x "$(command -v perl)" ] + then + perl "${MEDLEYDIR}"/scripts/getFails.pl '^[^\n]*IL:FAIL' 'DONE' "${MEDLEYDIR}"/loadups/hcfiles.dribble > ${logindir}/fails + else + echo Unable to extract FAIL information from "${MEDLEYDIR}"/loadups/hcfiles.dribble > ${logindir}/fails + fi "${MEDLEYDIR}"/scripts/cpv ${logindir}/fails "${MEDLEYDIR}"/loadups/hcfiles-fails.txt # cleanup diff --git a/scripts/getFails.pl b/scripts/getFails.pl new file mode 100644 index 00000000..4c1fea8d --- /dev/null +++ b/scripts/getFails.pl @@ -0,0 +1,31 @@ +#!/usr/bin/env perl +use strict; +use warnings; + +die "Usage: $0 [file...]\n" unless @ARGV >= 2; + +my $pat1 = shift; +my $pat2 = shift; +my $regex1line = qr/${pat1}.*?${pat2}/; # all on 1 line +my $regexStart = qr/${pat1}/; # the line has the start pattern +my $regexEnd = qr/${pat2}/; # the line has the end pattern + +my $flag = 0; + +while (<>) { + if ($flag) { # we're in a multi-line block + print; + if (/$regexEnd/) { # does this line end the multi-line block? + $flag = 0; + print "\n"; # separator + }; + } + elsif (/$regex1line/) { # all on 1 line + print; + print "\n"; # separator + } + elsif (/$regexStart/) { # begin a multi-line block + print; + $flag = 1; + } +} \ No newline at end of file From 4e761298eaccca904b0dd16682f84930b273a651 Mon Sep 17 00:00:00 2001 From: rmkaplan <69548581+rmkaplan@users.noreply.github.com> Date: Wed, 29 Apr 2026 11:59:27 -0700 Subject: [PATCH 2/2] This was well-formed, but had a bogus slug character showing as a black box (#2584) Fix typo --- lispusers/BITMAP-GALLERY.TEDIT | Bin 84639 -> 84776 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/lispusers/BITMAP-GALLERY.TEDIT b/lispusers/BITMAP-GALLERY.TEDIT index aa14181ed8b085855ade87b6c3dc10f51792e103..ab88e8cd1d483b591a9f104786e0b27dba4bb0fe 100644 GIT binary patch delta 6107 zcma)AeQXow8Gm2j*-kDjgp9P|GY83YQd$-7QZLd6bKIXssq8n;l8GT-_zYc*z0mBN@f}DN-HD&P;f+1 zMxx2YW2!Ha+?z;FMW$kjNo6P!PpF>wR6-3!Q_)Cr=N{D;ot%m$l{PrQ_CR7Ps`ka= zaW#~Pj1}xxslG@&wkwgGj78MW_O|AB#T%QNi0p0bjl|>8#Y9#X>y`L(X zI@?V+*Gl&+QNnv7W6_inPE15qZzL7lspcd~CMMnGRLGZzi_pwD=|bjJscvCQQ?rWy z_#<;t{$PHQBJ&OVdzD2p@X0*t_+64Q4689?7U|v2fDnx6+kzacTiC-$LC+;Y>!mbE>?OH zDO|9gWMV??O-6U`R&x^Vj}@Ogi;JXPtUgl8K}1(JLbw-KUY9G1S!yrVe`dEzk2U^7 z;s6e|xB=jGI73;lweE8&n-j_Ll#+?JEds@JZQr#C645$3-m+P^**mY=IOuEZS^%M; z>!z)$m>XL&t@Fzl`O;N*?oyP^v7O^PqRHJ#W`m~++_!ly*p-62*3o-O=I^Tm=VdPD zheI{siYi6%MUrFs(ub$^!JdRW?ef!8Ci2@3e`@1_ zhn_#oFW}$4c`rm?eDtz?L7_}4iIF}`G216)9?qWP{pt5c_=;^k(FOj;PxP2l{N&_D zxs1cp*8k`J%URvsMF+e*hCoSwMcakWn%S6W11+6Hc&k+nPOEQx# z%wBTSvM&T9VHr}ZVShONsb%BsWWt;9&2t%^J?xaid zNPVP_b~A>y979CXrD()Ub*LfuBTJH=W90^2$j%fqCs}VNZOH5$b5we)x_@<2mqkYq zjbs%==jHr}jydh7O=(>$lTxypID$jN{R1AxoRB3AzCKTAC=?tDs|~(jAQ)1cRByoJ zyPqvmGjaL?o^ZI|H#hqN{5%#@hfmLlU$C#_?B`(4!;8&rB%f@0F4@w8y@!;{g-s)o z1Hs-PslJ_Y4Ew#1YWeN#_3Z&I1RI2q`DhO8;INS|z?li`IRO@e?Fc7atjhjk9j$fY zWhq+Y1^(CxJama6Hk|Q>HG~15_hH;29t!H=M+^aEM`ggB=N$-oH#YV9 zhkFLspaJU?wE9S-g-EbFP<>gXW|I%Ke->#OU5)^8gC!W^VI#Og=S6O8{n1U=ri%!( zx}y59$k`IJ9W42n^oYo90a_vGO^X(%158e)7CT#Fvf0SxN!MFY0WV*?&qdliXpK>< zIwWDB7J4H4S}(0m!*+(2609%w3T9UNf=HW>Vgza8g8-=fUy&PYd;qoI$Z6B2o-)+Z zry^%d%ymUE_0GkPHR=uqdc*8TQ(Pw$U=7$lq}Ze=LCs>kG&TlgV0&3a!YID&HzKW3 zG~0EN){;Ogc?4n_O9L?_hsY0y6H=rfh_n{edNemcF(Ed8X!c=`zTWmrA{dCyg2-29 z)&4=GwNOwI%%FhX(35jBuXjGCTZC$89j8Uw+s1Uld#+_{rD3t*z!oeKsPkIKMv?Zm zF(vC5fM`ZY=P$`4R!Vub5R{^_HIy;ToiD|DH`N zeM_XZ)S;6_#1mu#$o7wOZszqywpjbw%OsD^Ddv3$X4C;=4hq}~>n(=_YPRw5B%hs4 z3xV`8Vv31nX7M=^B}Gk_)*qHev6T(8g>iI=w3cG~iV~Oa5V`5K#)t6a%xXw{o=9tn zX?ik2HnUgLQE7mt`Bw&=5;*_RQ1e<#%#NZwr5}sj3{Xk9d&Ug4ynj|_;YhSF^6-ps zr|C}-_9XRSRc=2Wu@m59tI)X!!=8II|3EGm_JNU!{fsCR6ITpkdVfJ~!lG9o6+pJv z^BdX0&Hg*byA{ivHZJ5k8^}>S7L-AeMKD22sYCBvQ$DuzA)nRD&tnny6zz zW}emHW}o>jkq2d;2suFnCm%V6v{=G$ivspu!3&r2M@z!?37r%S_&8NOjXxp1~#lfHdA1valg8%>k delta 6148 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