From 1c34ccec44ea0519087d70bcff81ddac6dd465ac Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 14 Apr 2010 18:40:08 -0400 Subject: [PATCH] improve regexp support (PR 10855, halfway) --- collects/scheme/private/string.ss | 173 ++- collects/scribblings/reference/regexps.scrbl | 165 +- collects/tests/mzscheme/basic.ss | 12 +- collects/tests/mzscheme/rx.ss | 50 +- collects/tests/mzscheme/string.ss | 16 + doc/release-notes/mzscheme/HISTORY.txt | 4 + src/mzscheme/src/cstartup.inc | 1454 +++++++++--------- src/mzscheme/src/mzmark.c | 2 + src/mzscheme/src/mzmarksrc.c | 1 + src/mzscheme/src/regexp.c | 558 ++++--- src/mzscheme/src/schminc.h | 2 +- src/mzscheme/src/schrx.h | 18 +- src/mzscheme/src/schvers.h | 4 +- 13 files changed, 1433 insertions(+), 1026 deletions(-) diff --git a/collects/scheme/private/string.ss b/collects/scheme/private/string.ss index 789b4f9b56..5a141395a3 100644 --- a/collects/scheme/private/string.ss +++ b/collects/scheme/private/string.ss @@ -108,25 +108,29 @@ ;; Helper macro for the regexp functions below, with some utilities. (define (bstring-length s) (if (bytes? s) (bytes-length s) (string-length s))) - (define no-empty-edge-matches + (define (no-empty-edge-matches n) (make-regexp-tweaker (lambda (rx) (if (bytes? rx) - (bytes-append #"(?=.)(?:" rx #")(?<=.)") - (format "(?=.)(?:~a)(?<=.)" rx))))) - (define (bstring->no-edge-regexp name pattern) - (if (or (regexp? pattern) (byte-regexp? pattern) - (string? pattern) (bytes? pattern)) - (no-empty-edge-matches pattern) - (raise-type-error - name "regexp, byte regexp, string, or byte string" pattern))) + (bytes-append #"(?=.)(?:" rx #")(?<=" (make-bytes n (char->integer #\.)) #")") + (format "(?=.)(?:~a)(?<=~a)" rx (make-bytes n (char->integer #\.))))))) (define-syntax-rule (regexp-loop - name loop start end rx string + name loop start end pattern string + ipre success-choose failure-k port-success-k port-success-choose port-failure-k need-leftover? peek?) - (let ([len (cond [(string? string) (string-length string)] - [(bytes? string) (bytes-length string)] - [else #f])]) + (let* ([len (cond [(string? string) (string-length string)] + [(bytes? string) (bytes-length string)] + [else #f])] + [orig-rx (cond [(bytes? pattern) (byte-regexp pattern)] + [(string? pattern) (regexp pattern)] + [(regexp? pattern) pattern] + [(byte-regexp? pattern) pattern] + [else + (raise-type-error 'name + "regexp, byte regexp, string, or byte string" + pattern)])] + [max-lookbehind (regexp-max-lookbehind orig-rx)]) (if peek? (unless (input-port? string) (raise-type-error 'name "input port" string)) @@ -140,6 +144,8 @@ (and (number? end) (exact? end) (integer? end) (end . >= . 0))) (raise-type-error 'name "non-negative exact integer or false" end)) + (unless (bytes? ipre) + (raise-type-error 'name "byte string" ipre)) (unless (or (input-port? string) (and len (start . <= . len))) (raise-mismatch-error 'name @@ -153,66 +159,76 @@ (format "ending offset index out of range [~a,~a]: " start len) end)) (reverse - (let loop ([acc '()] [start start] [end end]) + (let loop ([acc '()] [start start] [end end] [ipre ipre] [rx #f] [rx-lb 0]) + (let* ([new-rx-lb (add1 (bytes-length ipre))] + [rx (if (= rx-lb new-rx-lb) + rx + ((no-empty-edge-matches new-rx-lb) orig-rx))]) + (if (and port-success-choose (input-port? string)) - (if (and port-success-choose (input-port? string)) - - ;; Input port match, get string - (let* ([_ (when (positive? start) - ;; Skip start chars: - (let ([s (make-bytes 4096)]) - (let loop ([n 0]) - (unless (= n start) - (let ([m (read-bytes-avail! - s string 0 (min (- start n) 4096))]) - (unless (eof-object? m) (loop (+ n m))))))))] - [discarded/leftovers (if need-leftover? #f 0)] - [spitout (if need-leftover? - (open-output-bytes) - (make-output-port - 'counter always-evt - (lambda (s start end flush? breakable?) - (let ([c (- end start)]) - (set! discarded/leftovers - (+ c discarded/leftovers)) - c)) - void))] - [end (and end (- end start))] - [m (regexp-match rx string 0 end spitout)] - [m (and m (car m))] - [discarded/leftovers (if need-leftover? - (get-output-bytes spitout) - discarded/leftovers)] - [end (and end m - (- end (if need-leftover? - (bstring-length discarded/leftovers) - discarded/leftovers) - (bstring-length m)))]) - (if m - (loop (cons (port-success-choose m discarded/leftovers) acc) - 0 end) - (port-failure-k acc discarded/leftovers))) - - ;; String/port match, get positions - (let ([m (if peek? - (regexp-match-peek-positions rx string start end) - (regexp-match-positions rx string start end))]) - (if (not m) - (failure-k acc start end) - (let ([mstart (caar m)] [mend (cdar m)]) - (if port-success-k - (port-success-k - (lambda (acc new-start new-end) - (loop acc new-start new-end)) - acc start end mstart mend) - (loop (cons (success-choose start mstart mend) acc) - mend end)))))))))) + ;; Input port match, get string + (let* ([_ (when (positive? start) + ;; Skip start chars: + (let ([s (make-bytes 4096)]) + (let loop ([n 0]) + (unless (= n start) + (let ([m (read-bytes-avail! + s string 0 (min (- start n) 4096))]) + (unless (eof-object? m) (loop (+ n m))))))))] + [discarded/leftovers (if need-leftover? #f 0)] + [spitout (if need-leftover? + (open-output-bytes) + (make-output-port + 'counter always-evt + (lambda (s start end flush? breakable?) + (let ([c (- end start)]) + (set! discarded/leftovers + (+ c discarded/leftovers)) + c)) + void))] + [end (and end (- end start))]) + (let-values ([(m ipre) (regexp-match/end rx string 0 end spitout ipre + max-lookbehind)]) + (let* ([m (and m (car m))] + [discarded/leftovers (if need-leftover? + (get-output-bytes spitout) + discarded/leftovers)] + [end (and end m + (- end (if need-leftover? + (bstring-length discarded/leftovers) + discarded/leftovers) + (bstring-length m)))]) + (if m + (loop (cons (port-success-choose m discarded/leftovers) acc) + 0 end ipre + rx new-rx-lb) + (port-failure-k acc discarded/leftovers))))) + + ;; String/port match, get positions + (let-values ([(m ipre) + (if peek? + (regexp-match-peek-positions/end rx string start end #f ipre + max-lookbehind) + (regexp-match-positions/end rx string start end #f ipre + max-lookbehind))]) + + (if (not m) + (failure-k acc start end) + (let ([mstart (caar m)] [mend (cdar m)]) + (if port-success-k + (port-success-k + (lambda (acc new-start new-end) + (loop acc new-start new-end ipre rx new-rx-lb)) + acc start end mstart mend) + (loop (cons (success-choose start mstart mend) acc) + mend end ipre rx new-rx-lb))))))))))) ;; Returns all the positions at which the pattern matched. - (define (regexp-match-positions* pattern string [start 0] [end #f]) + (define (regexp-match-positions* pattern string [start 0] [end #f] [ipre #""]) (regexp-loop regexp-match-positions* loop start end - (bstring->no-edge-regexp 'regexp-match-positions* pattern) string + pattern string + ipre ;; success-choose: (lambda (start mstart mend) (cons mstart mend)) ;; failure-k: @@ -233,10 +249,11 @@ #f)) ;; Returns all the positions at which the pattern matched. - (define (regexp-match-peek-positions* pattern string [start 0] [end #f]) + (define (regexp-match-peek-positions* pattern string [start 0] [end #f] [ipre #""]) (regexp-loop regexp-match-peek-positions* loop start end - (bstring->no-edge-regexp 'regexp-match-peek-positions* pattern) string + pattern string + ipre ;; success-choose: (lambda (start mstart mend) (cons mstart mend)) ;; failure-k: @@ -250,13 +267,13 @@ ;; Splits a string into a list by removing any piece which matches ;; the pattern. - (define (regexp-split pattern string [start 0] [end #f]) - (define rx (bstring->no-edge-regexp 'regexp-split pattern)) - (define buf (if (and (string? string) (byte-regexp? rx)) + (define (regexp-split pattern string [start 0] [end #f] [ipre #""]) + (define buf (if (and (string? string) (or (byte-regexp? pattern) + (bytes? pattern))) (string->bytes/utf-8 string (char->integer #\?)) string)) (define sub (if (bytes? buf) subbytes substring)) - (regexp-loop regexp-split loop start end rx buf + (regexp-loop regexp-split loop start end pattern buf ipre ;; success-choose: (lambda (start mstart mend) (sub buf start mstart)) ;; failure-k: @@ -272,13 +289,13 @@ #f)) ;; Returns all the matches for the pattern in the string. - (define (regexp-match* pattern string [start 0] [end #f]) - (define rx (bstring->no-edge-regexp 'regexp-match* pattern)) - (define buf (if (and (string? string) (byte-regexp? rx)) + (define (regexp-match* pattern string [start 0] [end #f] [ipre #""]) + (define buf (if (and (string? string) (or (byte-regexp? pattern) + (bytes? pattern))) (string->bytes/utf-8 string (char->integer #\?)) string)) (define sub (if (bytes? buf) subbytes substring)) - (regexp-loop regexp-match* loop start end rx buf + (regexp-loop regexp-match* loop start end pattern buf ipre ;; success-choose: (lambda (start mstart mend) (sub buf mstart mend)) ;; failure-k: diff --git a/collects/scribblings/reference/regexps.scrbl b/collects/scribblings/reference/regexps.scrbl index cff6153a3d..3aa1b5a1a8 100644 --- a/collects/scribblings/reference/regexps.scrbl +++ b/collects/scribblings/reference/regexps.scrbl @@ -195,6 +195,16 @@ case-sensitively. (regexp-match (regexp-quote ".") "apple.scm") ]} +@defproc[(regexp-max-lookbehind [pattern (or/c regexp? byte-regexp?)]) + exact-nonnegative-integer?]{ + +Returns the maximum number of bytes that @scheme[pattern] may consult +before the starting position of a match to determine the match. For +example, the pattern @litchar{(?<=abc)d} consults three bytes +preceding a matching @litchar{d}, while @litchar{e(?<=a..)d} consults +two bytes before a matching @litchar{ed}. A @litchar{^} pattern may +consult a preceding byte to determine whether the current position is +the start of the input or of a line.} @;------------------------------------------------------------------------ @section{Regexp Matching} @@ -203,7 +213,8 @@ case-sensitively. [input (or/c string? bytes? input-port?)] [start-pos exact-nonnegative-integer? 0] [end-pos (or/c exact-nonnegative-integer? #f) #f] - [output-port (or/c output-port? #f) #f]) + [output-port (or/c output-port? #f) #f] + [input-prefix bytes? #""]) (if (and (or (string? pattern) (regexp? pattern)) (string? input)) (or/c #f (cons/c string? (listof (or/c string? #f)))) @@ -228,9 +239,18 @@ is an input port, and if the end-of-file is reached before @scheme[start-pos] bytes are skipped, then the match fails. In @scheme[pattern], a start-of-string @litchar{^} refers to the first -position of @scheme[input] after @scheme[start-pos], and the -end-of-input @litchar{$} refers to the @scheme[end-pos]th position or -(in the case of an input port) the end of file, whichever comes first. +position of @scheme[input] after @scheme[start-pos], assuming that +@scheme[input-prefix] is @scheme[#""]. The end-of-input @litchar{$} +refers to the @scheme[end-pos]th position or (in the case of an input +port) the end of file, whichever comes first, assuming that +@scheme[output-prefix] is @scheme[#f]. + +The @scheme[input-prefix] specifies bytes that effectively precede +@scheme[input] for the purposes of @litchar{^} and other look-behind +matching. For example, a @scheme[#""] prefix means that @litchar{^} +matches at the beginning of the stream, while a @scheme[#"\n"] +@scheme[input-prefix] means that a start-of-line @litchar{^} can match +the beginning of the input, while a start-of-file @litchar{^} cannot. If the match fails, @scheme[#f] is returned. If the match succeeds, a list containing strings or byte string, and possibly @scheme[#f], is @@ -302,7 +322,8 @@ bytes. To avoid such interleaving, use @scheme[regexp-match-peek] @defproc[(regexp-match* [pattern (or/c string? bytes? regexp? byte-regexp?)] [input (or/c string? bytes? input-port?)] [start-pos exact-nonnegative-integer? 0] - [end-pos (or/c exact-nonnegative-integer? #f) #f]) + [end-pos (or/c exact-nonnegative-integer? #f) #f] + [input-prefix bytes? #""]) (if (and (or (string? pattern) (regexp? pattern)) (string? input)) (listof string?) @@ -315,12 +336,14 @@ results for parenthesized sub-patterns in @scheme[pattern] are not returned.) The @scheme[pattern] is used in order to find matches, where each -match attempt starts at the end of the last match. Empty matches are -handled like any matches, returning a zero-length string or byte -sequence (they are more useful in the complementing -@scheme[regexp-split] function). However, the @scheme[pattern] is -restricted from matching an empty string at the beginning (or right -after a previous match) or at the end. +match attempt starts at the end of the last match, and @litchar{$} is +allowed to match the beginning of the input (if @scheme[input-prefix] +is @scheme[#""]) only for the first match. Empty matches are handled +like other matches, returning a zero-length string or byte sequence +(they are more useful in the complementing @scheme[regexp-split] +function), but @scheme[pattern] is restricted from matching an empty +string at the beginning (or right after a previous match) or at the +end. If @scheme[input] contains no matches (in the range @scheme[start-pos] to @scheme[end-pos]), @scheme[null] is returned. Otherwise, each item @@ -339,7 +362,8 @@ port). [input input-port?] [start-pos exact-nonnegative-integer? 0] [end-pos (or/c exact-nonnegative-integer? #f) #f] - [output-port (or/c output-port? #f) #f]) + [output-port (or/c output-port? #f) #f] + [input-prefix bytes? #""]) (if (and (or (string? pattern) (regexp? pattern)) (string? input)) (or/c #f (cons/c string? (listof (or/c string? #f)))) @@ -360,7 +384,8 @@ fails.} [input (or/c string? bytes? input-port?)] [start-pos exact-nonnegative-integer? 0] [end-pos (or/c exact-nonnegative-integer? #f) #f] - [output-port (or/c output-port? #f) #f]) + [output-port (or/c output-port? #f) #f] + [input-prefix bytes? #""]) (or/c (cons/c (cons/c exact-nonnegative-integer? exact-nonnegative-integer?) (listof (or/c (cons/c exact-nonnegative-integer? @@ -388,11 +413,11 @@ positions indicate the number of bytes that were read, including (regexp-match-positions #rx"(-[0-9]*)+" "a-12--345b") ]} - @defproc[(regexp-match-positions* [pattern (or/c string? bytes? regexp? byte-regexp?)] [input (or/c string? bytes? input-port?)] [start-pos exact-nonnegative-integer? 0] - [end-pos (or/c exact-nonnegative-integer? #f) #f]) + [end-pos (or/c exact-nonnegative-integer? #f) #f] + [input-prefix bytes? #""]) (listof (cons/c exact-nonnegative-integer? exact-nonnegative-integer?))]{ @@ -408,7 +433,8 @@ like @scheme[regexp-match*]. [input (or/c string? bytes? input-port?)] [start-pos exact-nonnegative-integer? 0] [end-pos (or/c exact-nonnegative-integer? #f) #f] - [output-port (or/c output-port? #f) #f]) + [output-port (or/c output-port? #f) #f] + [input-prefix bytes? #""]) boolean?]{ Like @scheme[regexp-match], but returns merely @scheme[#t] when the @@ -437,19 +463,20 @@ entire content of @scheme[input] matches @scheme[pattern]. [input input-port?] [start-pos exact-nonnegative-integer? 0] [end-pos (or/c exact-nonnegative-integer? #f) #f] - [progress (or/c evt #f) #f]) + [progress (or/c evt #f) #f] + [input-prefix bytes? #""]) (or/c (cons/c bytes? (listof (or/c bytes? #f))) #f)]{ Like @scheme[regexp-match] on input ports, but only peeks bytes from -@scheme[input-port] instead of reading them. Furthermore, instead of +@scheme[input] instead of reading them. Furthermore, instead of an output port, the last optional argument is a progress event for -@scheme[input-port] (see @scheme[port-progress-evt]). If @scheme[progress] -becomes ready, then the match stops peeking from @scheme[input-port] +@scheme[input] (see @scheme[port-progress-evt]). If @scheme[progress] +becomes ready, then the match stops peeking from @scheme[input] and returns @scheme[#f]. The @scheme[progress] argument can be @scheme[#f], in which case the peek may continue with inconsistent information if another process meanwhile reads from -@scheme[input-port]. +@scheme[input]. @examples[ (define p (open-input-string "a abcd")) @@ -466,7 +493,8 @@ information if another process meanwhile reads from [input input-port?] [start-pos exact-nonnegative-integer? 0] [end-pos (or/c exact-nonnegative-integer? #f) #f] - [progress (or/c evt #f) #f]) + [progress (or/c evt #f) #f] + [input-prefix bytes? #""]) (or/c (cons/c (cons/c exact-nonnegative-integer? exact-nonnegative-integer?) (listof (or/c (cons/c exact-nonnegative-integer? @@ -475,7 +503,7 @@ information if another process meanwhile reads from #f)]{ Like @scheme[regexp-match-positions] on input ports, but only peeks -bytes from @scheme[input-port] instead of reading them, and with a +bytes from @scheme[input] instead of reading them, and with a @scheme[progress] argument like @scheme[regexp-match-peek].} @@ -483,12 +511,13 @@ bytes from @scheme[input-port] instead of reading them, and with a [input input-port?] [start-pos exact-nonnegative-integer? 0] [end-pos (or/c exact-nonnegative-integer? #f) #f] - [progress (or/c evt #f) #f]) + [progress (or/c evt #f) #f] + [input-prefix bytes? #""]) (or/c (cons/c bytes? (listof (or/c bytes? #f))) #f)]{ Like @scheme[regexp-match-peek], but it attempts to match only bytes -that are available from @scheme[input-port] without blocking. The +that are available from @scheme[input] without blocking. The match fails if not-yet-available characters might be used to match @scheme[pattern].} @@ -497,7 +526,8 @@ match fails if not-yet-available characters might be used to match [input input-port?] [start-pos exact-nonnegative-integer? 0] [end-pos (or/c exact-nonnegative-integer? #f) #f] - [progress (or/c evt #f) #f]) + [progress (or/c evt #f) #f] + [input-prefix bytes? #""]) (or/c (cons/c (cons/c exact-nonnegative-integer? exact-nonnegative-integer?) (listof (or/c (cons/c exact-nonnegative-integer? @@ -506,7 +536,7 @@ match fails if not-yet-available characters might be used to match #f)]{ Like @scheme[regexp-match-peek-positions], but it attempts to match -only bytes that are available from @scheme[input-port] without +only bytes that are available from @scheme[input] without blocking. The match fails if not-yet-available characters might be used to match @scheme[pattern].} @@ -514,20 +544,91 @@ used to match @scheme[pattern].} @defproc[(regexp-match-peek-positions* [pattern (or/c string? bytes? regexp? byte-regexp?)] [input input-port?] [start-pos exact-nonnegative-integer? 0] - [end-pos (or/c exact-nonnegative-integer? #f) #f]) + [end-pos (or/c exact-nonnegative-integer? #f) #f] + [input-prefix bytes? #""]) (listof (cons/c exact-nonnegative-integer? exact-nonnegative-integer?))]{ Like @scheme[regexp-match-peek-positions], but returns multiple matches like @scheme[regexp-match*].} +@defproc[(regexp-match/end [pattern (or/c string? bytes? regexp? byte-regexp?)] + [input (or/c string? bytes? input-port?)] + [start-pos exact-nonnegative-integer? 0] + [end-pos (or/c exact-nonnegative-integer? #f) #f] + [output-port (or/c output-port? #f) #f] + [input-prefix bytes? #""] + [count nonnegative-exact-integer? 1]) + (values + (if (and (or (string? pattern) (regexp? pattern)) + (string? input)) + (or/c #f (cons/c string? (listof (or/c string? #f)))) + (or/c #f (cons/c bytes? (listof (or/c bytes? #f))))) + (or/c #f bytes?))]{ + +Like @scheme[regexp-match], but with a second result: a byte +string of up to @scheme[count] bytes that correspond to the input +(possibly including the @scheme[input-prefix]) leading to the end of +the match; the second result is @scheme[#f] if no match is found. + +The second result can be useful as an @scheme[input-prefix] for +attempting a second match on @scheme[input] starting from the end of +the first match. In that case, use @scheme[regexp-max-lookbehind] +to determine an appropriate value for @scheme[count].} + +@deftogether[( +@defproc[(regexp-match-positions/end [pattern (or/c string? bytes? regexp? byte-regexp?)] + [input (or/c string? bytes? input-port?)] + [start-pos exact-nonnegative-integer? 0] + [end-pos (or/c exact-nonnegative-integer? #f) #f] + [input-prefix bytes? #""] + [count exact-nonnegative-integer? 1]) + (values (listof (cons/c exact-nonnegative-integer? + exact-nonnegative-integer?)) + (or/c #f bytes?))] +@defproc[(regexp-match-peek-positions/end [pattern (or/c string? bytes? regexp? byte-regexp?)] + [input input-port?] + [start-pos exact-nonnegative-integer? 0] + [end-pos (or/c exact-nonnegative-integer? #f) #f] + [progress (or/c evt #f) #f] + [input-prefix bytes? #""] + [count exact-nonnegative-integer? 1]) + (values + (or/c (cons/c (cons/c exact-nonnegative-integer? + exact-nonnegative-integer?) + (listof (or/c (cons/c exact-nonnegative-integer? + exact-nonnegative-integer?) + #f))) + #f) + (or/c #f bytes?))] +@defproc[(regexp-match-peek-positions-immediate/end [pattern (or/c string? bytes? regexp? byte-regexp?)] + [input input-port?] + [start-pos exact-nonnegative-integer? 0] + [end-pos (or/c exact-nonnegative-integer? #f) #f] + [progress (or/c evt #f) #f] + [input-prefix bytes? #""] + [count exact-nonnegative-integer? 1]) + (values + (or/c (cons/c (cons/c exact-nonnegative-integer? + exact-nonnegative-integer?) + (listof (or/c (cons/c exact-nonnegative-integer? + exact-nonnegative-integer?) + #f))) + #f) + (or/c #f bytes?))] +)]{ + +Like @scheme[regexp-match-positions], etc., but with a second result +like @scheme[regexp-match/end].} + @;------------------------------------------------------------------------ @section{Regexp Splitting} @defproc[(regexp-split [pattern (or/c string? bytes? regexp? byte-regexp?)] [input (or/c string? bytes? input-port?)] [start-pos exact-nonnegative-integer? 0] - [end-pos (or/c exact-nonnegative-integer? #f) #f]) + [end-pos (or/c exact-nonnegative-integer? #f) #f] + [input-prefix bytes? #""]) (if (and (or (string? pattern) (regexp? pattern)) (string? input)) (cons/c string? (listof string?)) @@ -567,7 +668,8 @@ an end-of-file if @scheme[input] is an input port). [input (or/c string? bytes?)] [insert (or/c string? bytes? ((string?) () #:rest (listof string?) . ->* . string?) - ((bytes?) () #:rest (listof bytes?) . ->* . bytes?))]) + ((bytes?) () #:rest (listof bytes?) . ->* . bytes?))] + [input-prefix bytes? #""]) (if (and (or (string? pattern) (regexp? pattern)) (string? input)) string? @@ -634,7 +736,8 @@ before the @litchar{\}. For example, the Scheme constant [input (or/c string? bytes?)] [insert (or/c string? bytes? (string? . -> . string?) - (bytes? . -> . bytes?))]) + (bytes? . -> . bytes?))] + [input-prefix bytes? #""]) (or/c string? bytes?)]{ Like @scheme[regexp-replace], except that every instance of diff --git a/collects/tests/mzscheme/basic.ss b/collects/tests/mzscheme/basic.ss index c465b489e9..b619613f0e 100644 --- a/collects/tests/mzscheme/basic.ss +++ b/collects/tests/mzscheme/basic.ss @@ -1266,12 +1266,12 @@ (arity-test regexp 1 1) (arity-test regexp? 1 1) -(arity-test regexp-match 2 5) -(arity-test regexp-match-positions 2 5) -(arity-test regexp-match-peek 2 5) -(arity-test regexp-match-peek-positions 2 5) -(arity-test regexp-replace 3 3) -(arity-test regexp-replace* 3 3) +(arity-test regexp-match 2 6) +(arity-test regexp-match-positions 2 6) +(arity-test regexp-match-peek 2 6) +(arity-test regexp-match-peek-positions 2 6) +(arity-test regexp-replace 3 4) +(arity-test regexp-replace* 3 4) (test #t procedure? car) (test #f procedure? 'car) diff --git a/collects/tests/mzscheme/rx.ss b/collects/tests/mzscheme/rx.ss index 839fbb8824..da23b0c4a3 100644 --- a/collects/tests/mzscheme/rx.ss +++ b/collects/tests/mzscheme/rx.ss @@ -1435,7 +1435,7 @@ #"^(?:a?b?)*$" (#"(?=(a+?))(\\1ab)" #"aaab" (#"aab" #"a" #"aab")) (#"(\\w+:)+" #"one:" (#"one:" #"one:")) - (#"$(?<=^(a))" #"a" #f) + (#"$(?<=^(a))" #"a" (#"" #"a")) (#"(?=(a+?))(\\1ab)" #"aaab" (#"aab" #"a" #"aab")) (#"^(?=(a+?))\\1ab" #"aaab" #f) (#"^(?=(a+?))\\1ab" #"aaab" #f) @@ -1710,4 +1710,52 @@ ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Check prefixes and suffixes that disallow matches at ^ at start or $ at end: +(let ([try + (lambda (regexp-match input output [output2 output]) + (let ([try-succeed + (lambda (output i s e) + (test (output (list "a")) regexp-match #rx"^a" (i) s e #f #"") + (test (output (list "a")) regexp-match #rx"(?m:^a)" (i) s e #f #"\n") + (test (output (list "a")) regexp-match #rx"(?m:^a)" (i) s e #f #"x\n"))]) + (try-succeed output (lambda () (input "a")) 0 #f) + (try-succeed output2 (lambda () (input "xay")) 1 2)) + (let ([try-fail + (lambda (i s e) + (test #f regexp-match #rx"^a" (i) s e #f #"\n") + (test #f regexp-match #rx"^a" (i) s e #f #"x\n") + (let ([try-always-fail + (lambda (m) + (test #f regexp-match (m #rx"^a") (i) s e #f #"x") + (test #f regexp-match (m #rx"^a") (i) s e #f #"\nx"))]) + (try-always-fail values) + (try-always-fail (lambda (rx) (regexp (format "(?m:~a)" (object-name rx)))))))]) + (try-fail (lambda () (input "a")) 0 #f) + (try-fail (lambda () (input "xay")) 1 2)))]) + (try regexp-match values values) + (try regexp-match? values (lambda (a) (and a #t))) + (try regexp-match string->bytes/utf-8 (lambda (l) (map string->bytes/utf-8 l))) + (try regexp-match open-input-string (lambda (l) (map string->bytes/utf-8 l))) + (try regexp-match-positions values + (lambda (s) (and s '((0 . 1)))) + (lambda (s) (and s '((1 . 2)))))) + +;; regexp-replace* disallows start matching after the first match: +(test "baa" regexp-replace* #rx"^a" "aaa" "b") + +;; regexp-replace* disallows start matching after the first match: +(test "bbb" regexp-replace* #rx"(?m:^a\n)" "a\na\na\n" "b") +(test "bba\n" regexp-replace* #rx"(?m:^a[z\n])" "a\naza\n" "b") + +(test-values `(("abc") #"c") + (lambda () (regexp-match/end #rx".*" "abc"))) +(test-values `(((0 . 3)) #"c") + (lambda () (regexp-match-positions/end #rx".*" "abc"))) +(test-values `(((0 . 3)) #"c") + (lambda () (regexp-match-peek-positions/end #rx".*" (open-input-string "abc")))) +(test-values `(((0 . 3)) #"c") + (lambda () (regexp-match-peek-positions-immediate/end #rx".*" (open-input-string "abc")))) + +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (report-errs) diff --git a/collects/tests/mzscheme/string.ss b/collects/tests/mzscheme/string.ss index 7da4645772..4e900328ea 100644 --- a/collects/tests/mzscheme/string.ss +++ b/collects/tests/mzscheme/string.ss @@ -75,6 +75,10 @@ (t '("a" "b" "c") eof "[abc]" "a b c" 0) (t '("a" "b" "c") eof "[abc]" "a b c" 0 #f) (t '("a" "b" "c") eof "[abc]" "a b c" 0 5) + (t '("a") eof "^." "a b c" 0 5 #"") + (t '() eof "^." "a b c" 0 5 #"x") + (t '("a\n" "b\n" "c\n") eof "(?m:^.\n)" "a\nb\nc\n" 0 6) + (t '("b\n" "c\n") eof "(?m:^.\n)" "a\nb\nc\n" 0 6 #"x") (for-each (lambda (cvt) (test '(#"\x80" #"\x80") regexp-match* (cvt #"\x80") #"a\x80z\x80q")) (list values byte-regexp byte-pregexp)) @@ -95,6 +99,10 @@ (t '((0 . 1) (2 . 3) (4 . 5)) eof "[abc]" "a b c" 0) (t '((0 . 1) (2 . 3) (4 . 5)) eof "[abc]" "a b c" 0 #f) (t '((0 . 1) (2 . 3) (4 . 5)) eof "[abc]" "a b c" 0 5) + (t '((0 . 1)) eof "^." "a b c" 0 5 #"") + (t '() eof "^." "a b c" 0 5 #"x") + (t '((0 . 2) (2 . 4) (4 . 6)) eof "(?m:^.\n)" "a\nb\nc\n" 0 6) + (t '((2 . 4) (4 . 6)) eof "(?m:^.\n)" "a\nb\nc\n" 0 6 #"x") (for-each (lambda (cvt) (test '((1 . 2) (3 . 4)) regexp-match-positions* (cvt #"\x80") #"a\x80z\x80q")) (list values byte-regexp byte-pregexp)) @@ -115,6 +123,10 @@ (t '("" "1" "2" "") eof "[abc]" "a1b2c" 0) (t '("" "1" "2" "") eof "[abc]" "a1b2c" 0 #f) (t '("" "1" "2" "") eof "[abc]" "a1b2c" 0 5) + (t '("" " b c") eof "^." "a b c" 0 5 #"") + (t '("a b c") eof "^." "a b c" 0 5 #"x") + (t '("" "" "" "") eof "(?m:^.\n)" "a\nb\nc\n" 0 6) + (t '("a\n" "" "") eof "(?m:^.\n)" "a\nb\nc\n" 0 6 #"x") (for-each (lambda (cvt) (test '(#"" #"a" #"z" #"q" #"") regexp-split (cvt #"\x80") #"\x80a\x80z\x80q\x80")) (list values byte-regexp byte-pregexp)) @@ -135,6 +147,10 @@ (t '((0 . 1)) "a b c" "[abc]" "a b c" 0 2) (t '((0 . 1) (2 . 3) (4 . 5)) "a b c" "[abc]" "a b c" 0 #f) (t '((0 . 1) (2 . 3) (4 . 5)) "a b c" "[abc]" "a b c" 0 5) + (t '((0 . 1)) "a b c" "^." "a b c" 0 5 #"") + (t '() "a b c" "^." "a b c" 0 5 #"x") + (t '((0 . 2) (2 . 4) (4 . 6)) "a\nb\nc\n" "(?m:^.\n)" "a\nb\nc\n" 0 6) + (t '((2 . 4) (4 . 6)) "a\nb\nc\n" "(?m:^.\n)" "a\nb\nc\n" 0 6 #"x") ;; ---------- tests with zero-length matches ---------- ;; Many of these tests can be repeated with Perl. To try something in Perl, ;; put this code in a file: diff --git a/doc/release-notes/mzscheme/HISTORY.txt b/doc/release-notes/mzscheme/HISTORY.txt index 784b23e895..cfffd59212 100644 --- a/doc/release-notes/mzscheme/HISTORY.txt +++ b/doc/release-notes/mzscheme/HISTORY.txt @@ -1,3 +1,7 @@ +Version 4.2.5.9 +regexp-match* et al. now disable ^ matching on all but the first + match + Version 4.2.5.3 Added chaperones diff --git a/src/mzscheme/src/cstartup.inc b/src/mzscheme/src/cstartup.inc index c8eed3a4f6..bf363c0509 100644 --- a/src/mzscheme/src/cstartup.inc +++ b/src/mzscheme/src/cstartup.inc @@ -1,754 +1,754 @@ { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,53,46,57,51,0,0,0,1,0,0,10,0,13,0, -22,0,26,0,31,0,38,0,51,0,58,0,63,0,68,0,72,0,79,0,82, -0,88,0,102,0,116,0,119,0,125,0,129,0,131,0,142,0,144,0,158,0, -165,0,187,0,189,0,203,0,14,1,43,1,54,1,65,1,75,1,111,1,144, -1,177,1,236,1,46,2,124,2,190,2,195,2,215,2,106,3,126,3,177,3, -243,3,128,4,14,5,66,5,89,5,168,5,0,0,109,7,0,0,69,35,37, -109,105,110,45,115,116,120,29,11,11,68,104,101,114,101,45,115,116,120,63,108, -101,116,64,99,111,110,100,66,117,110,108,101,115,115,72,112,97,114,97,109,101, -116,101,114,105,122,101,66,100,101,102,105,110,101,64,119,104,101,110,64,108,101, -116,42,63,97,110,100,66,108,101,116,114,101,99,62,111,114,65,113,117,111,116, -101,29,94,2,14,68,35,37,107,101,114,110,101,108,11,29,94,2,14,68,35, -37,112,97,114,97,109,122,11,62,105,102,65,98,101,103,105,110,63,115,116,120, -61,115,70,108,101,116,45,118,97,108,117,101,115,61,120,73,108,101,116,114,101, -99,45,118,97,108,117,101,115,66,108,97,109,98,100,97,1,20,112,97,114,97, -109,101,116,101,114,105,122,97,116,105,111,110,45,107,101,121,61,118,73,100,101, -102,105,110,101,45,118,97,108,117,101,115,97,36,11,8,240,126,76,0,0,95, -159,2,16,36,36,159,2,15,36,36,159,2,15,36,36,16,20,2,4,2,2, -2,6,2,2,2,8,2,2,2,7,2,2,2,9,2,2,2,10,2,2,2, -11,2,2,2,5,2,2,2,12,2,2,2,13,2,2,97,37,11,8,240,126, -76,0,0,93,159,2,15,36,37,16,2,2,3,161,2,2,37,2,3,2,2, -2,3,96,11,11,8,240,126,76,0,0,16,0,96,38,11,8,240,126,76,0, -0,16,0,13,16,4,36,29,11,11,2,2,11,18,16,2,99,64,104,101,114, -101,8,32,8,31,8,30,8,29,8,28,93,8,224,133,76,0,0,95,9,8, -224,133,76,0,0,2,2,27,248,22,143,4,195,249,22,136,4,80,158,39,36, -251,22,81,2,17,248,22,96,199,12,249,22,71,2,18,248,22,98,201,27,248, -22,143,4,195,249,22,136,4,80,158,39,36,251,22,81,2,17,248,22,96,199, -249,22,71,2,18,248,22,98,201,12,27,248,22,73,248,22,143,4,196,28,248, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,52,46,50,46,53,46,49,48,51,0,0,0,1,0,0,10,0,13, +0,22,0,26,0,31,0,38,0,51,0,58,0,63,0,68,0,72,0,79,0, +82,0,88,0,102,0,116,0,119,0,125,0,129,0,131,0,142,0,144,0,158, +0,165,0,187,0,189,0,203,0,14,1,43,1,54,1,65,1,75,1,111,1, +144,1,177,1,236,1,46,2,124,2,190,2,195,2,215,2,106,3,126,3,177, +3,243,3,128,4,14,5,66,5,89,5,168,5,0,0,109,7,0,0,69,35, +37,109,105,110,45,115,116,120,29,11,11,68,104,101,114,101,45,115,116,120,63, +108,101,116,64,99,111,110,100,66,117,110,108,101,115,115,72,112,97,114,97,109, +101,116,101,114,105,122,101,66,100,101,102,105,110,101,64,119,104,101,110,64,108, +101,116,42,63,97,110,100,66,108,101,116,114,101,99,62,111,114,65,113,117,111, +116,101,29,94,2,14,68,35,37,107,101,114,110,101,108,11,29,94,2,14,68, +35,37,112,97,114,97,109,122,11,62,105,102,65,98,101,103,105,110,63,115,116, +120,61,115,70,108,101,116,45,118,97,108,117,101,115,61,120,73,108,101,116,114, +101,99,45,118,97,108,117,101,115,66,108,97,109,98,100,97,1,20,112,97,114, +97,109,101,116,101,114,105,122,97,116,105,111,110,45,107,101,121,61,118,73,100, +101,102,105,110,101,45,118,97,108,117,101,115,97,36,11,8,240,81,77,0,0, +95,159,2,16,36,36,159,2,15,36,36,159,2,15,36,36,16,20,2,4,2, +2,2,6,2,2,2,8,2,2,2,7,2,2,2,9,2,2,2,10,2,2, +2,11,2,2,2,5,2,2,2,12,2,2,2,13,2,2,97,37,11,8,240, +81,77,0,0,93,159,2,15,36,37,16,2,2,3,161,2,2,37,2,3,2, +2,2,3,96,11,11,8,240,81,77,0,0,16,0,96,38,11,8,240,81,77, +0,0,16,0,13,16,4,36,29,11,11,2,2,11,18,16,2,99,64,104,101, +114,101,8,32,8,31,8,30,8,29,8,28,93,8,224,88,77,0,0,95,9, +8,224,88,77,0,0,2,2,27,248,22,143,4,195,249,22,136,4,80,158,39, +36,251,22,81,2,17,248,22,96,199,12,249,22,71,2,18,248,22,98,201,27, +248,22,143,4,195,249,22,136,4,80,158,39,36,251,22,81,2,17,248,22,96, +199,249,22,71,2,18,248,22,98,201,12,27,248,22,73,248,22,143,4,196,28, +248,22,79,193,20,15,159,37,36,37,28,248,22,79,248,22,73,194,248,22,72, +193,249,22,136,4,80,158,39,36,251,22,81,2,17,248,22,72,199,249,22,71, +2,11,248,22,73,201,11,18,16,2,101,10,8,32,8,31,8,30,8,29,8, +28,16,4,11,11,2,19,3,1,8,101,110,118,49,50,55,57,51,16,4,11, +11,2,20,3,1,8,101,110,118,49,50,55,57,52,93,8,224,89,77,0,0, +95,9,8,224,89,77,0,0,2,2,27,248,22,73,248,22,143,4,196,28,248, 22,79,193,20,15,159,37,36,37,28,248,22,79,248,22,73,194,248,22,72,193, -249,22,136,4,80,158,39,36,251,22,81,2,17,248,22,72,199,249,22,71,2, -11,248,22,73,201,11,18,16,2,101,10,8,32,8,31,8,30,8,29,8,28, -16,4,11,11,2,19,3,1,8,101,110,118,49,50,55,52,57,16,4,11,11, -2,20,3,1,8,101,110,118,49,50,55,53,48,93,8,224,134,76,0,0,95, -9,8,224,134,76,0,0,2,2,27,248,22,73,248,22,143,4,196,28,248,22, -79,193,20,15,159,37,36,37,28,248,22,79,248,22,73,194,248,22,72,193,249, -22,136,4,80,158,39,36,250,22,81,2,21,248,22,81,249,22,81,248,22,81, -2,22,248,22,72,201,251,22,81,2,17,2,22,2,22,249,22,71,2,13,248, -22,73,204,18,16,2,101,11,8,32,8,31,8,30,8,29,8,28,16,4,11, -11,2,19,3,1,8,101,110,118,49,50,55,53,50,16,4,11,11,2,20,3, -1,8,101,110,118,49,50,55,53,51,93,8,224,135,76,0,0,95,9,8,224, -135,76,0,0,2,2,248,22,143,4,193,27,248,22,143,4,194,249,22,71,248, +249,22,136,4,80,158,39,36,250,22,81,2,21,248,22,81,249,22,81,248,22, +81,2,22,248,22,72,201,251,22,81,2,17,2,22,2,22,249,22,71,2,13, +248,22,73,204,18,16,2,101,11,8,32,8,31,8,30,8,29,8,28,16,4, +11,11,2,19,3,1,8,101,110,118,49,50,55,57,54,16,4,11,11,2,20, +3,1,8,101,110,118,49,50,55,57,55,93,8,224,90,77,0,0,95,9,8, +224,90,77,0,0,2,2,248,22,143,4,193,27,248,22,143,4,194,249,22,71, +248,22,81,248,22,72,196,248,22,73,195,27,248,22,73,248,22,143,4,23,197, +1,249,22,136,4,80,158,39,36,28,248,22,56,248,22,137,4,248,22,72,23, +198,2,27,249,22,2,32,0,89,162,8,44,37,43,9,222,33,40,248,22,143, +4,248,22,96,23,200,2,250,22,81,2,23,248,22,81,249,22,81,248,22,81, +248,22,72,23,204,2,250,22,82,2,24,249,22,2,22,72,23,204,2,248,22, +98,23,206,2,249,22,71,248,22,72,23,202,1,249,22,2,22,96,23,200,1, +250,22,82,2,21,249,22,2,32,0,89,162,8,44,37,47,9,222,33,41,248, +22,143,4,248,22,72,201,248,22,73,198,27,248,22,143,4,194,249,22,71,248, 22,81,248,22,72,196,248,22,73,195,27,248,22,73,248,22,143,4,23,197,1, -249,22,136,4,80,158,39,36,28,248,22,56,248,22,137,4,248,22,72,23,198, -2,27,249,22,2,32,0,89,162,8,44,37,43,9,222,33,40,248,22,143,4, -248,22,96,23,200,2,250,22,81,2,23,248,22,81,249,22,81,248,22,81,248, -22,72,23,204,2,250,22,82,2,24,249,22,2,22,72,23,204,2,248,22,98, -23,206,2,249,22,71,248,22,72,23,202,1,249,22,2,22,96,23,200,1,250, -22,82,2,21,249,22,2,32,0,89,162,8,44,37,47,9,222,33,41,248,22, -143,4,248,22,72,201,248,22,73,198,27,248,22,143,4,194,249,22,71,248,22, -81,248,22,72,196,248,22,73,195,27,248,22,73,248,22,143,4,23,197,1,249, -22,136,4,80,158,39,36,250,22,82,2,23,249,22,2,32,0,89,162,8,44, -37,47,9,222,33,43,248,22,143,4,248,22,72,201,248,22,73,198,27,248,22, -73,248,22,143,4,196,27,248,22,143,4,248,22,72,195,249,22,136,4,80,158, -40,36,28,248,22,79,195,250,22,82,2,21,9,248,22,73,199,250,22,81,2, -4,248,22,81,248,22,72,199,250,22,82,2,10,248,22,73,201,248,22,73,202, -27,248,22,73,248,22,143,4,23,197,1,27,249,22,1,22,85,249,22,2,22, -143,4,248,22,143,4,248,22,72,199,249,22,136,4,80,158,40,36,251,22,81, -1,22,119,105,116,104,45,99,111,110,116,105,110,117,97,116,105,111,110,45,109, -97,114,107,2,25,250,22,82,1,23,101,120,116,101,110,100,45,112,97,114,97, -109,101,116,101,114,105,122,97,116,105,111,110,21,95,1,27,99,111,110,116,105, -110,117,97,116,105,111,110,45,109,97,114,107,45,115,101,116,45,102,105,114,115, -116,11,2,25,201,250,22,82,2,21,9,248,22,73,203,27,248,22,73,248,22, -143,4,196,28,248,22,79,193,20,15,159,37,36,37,249,22,136,4,80,158,39, -36,27,248,22,143,4,248,22,72,197,28,249,22,177,8,62,61,62,248,22,137, -4,248,22,96,196,250,22,81,2,21,248,22,81,249,22,81,21,93,2,26,248, -22,72,199,250,22,82,2,5,249,22,81,2,26,249,22,81,248,22,105,203,2, -26,248,22,73,202,251,22,81,2,17,28,249,22,177,8,248,22,137,4,248,22, -72,200,64,101,108,115,101,10,248,22,72,197,250,22,82,2,21,9,248,22,73, -200,249,22,71,2,5,248,22,73,202,100,8,32,8,31,8,30,8,29,8,28, -16,4,11,11,2,19,3,1,8,101,110,118,49,50,55,55,53,16,4,11,11, -2,20,3,1,8,101,110,118,49,50,55,55,54,93,8,224,136,76,0,0,18, -16,2,158,94,10,64,118,111,105,100,8,48,95,9,8,224,136,76,0,0,2, -2,27,248,22,73,248,22,143,4,196,249,22,136,4,80,158,39,36,28,248,22, -56,248,22,137,4,248,22,72,197,250,22,81,2,27,248,22,81,248,22,72,199, -248,22,96,198,27,248,22,137,4,248,22,72,197,250,22,81,2,27,248,22,81, -248,22,72,197,250,22,82,2,24,248,22,73,199,248,22,73,202,159,36,20,105, -159,36,16,1,11,16,0,83,158,42,20,103,145,2,1,2,1,2,2,11,11, -11,10,36,80,158,36,36,20,105,159,36,16,0,16,0,16,1,2,3,37,16, -0,36,16,0,36,11,11,39,36,11,11,11,16,10,2,4,2,5,2,6,2, -7,2,8,2,9,2,10,2,11,2,12,2,13,16,10,11,11,11,11,11,11, -11,11,11,11,16,10,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2, -11,2,12,2,13,36,46,37,11,11,11,16,0,16,0,16,0,36,36,11,11, -11,11,16,0,16,0,16,0,36,36,16,11,16,5,2,3,20,15,159,36,36, -36,36,20,105,159,36,16,0,16,1,33,33,10,16,5,2,6,89,162,8,44, -37,53,9,223,0,33,34,36,20,105,159,36,16,1,2,3,16,0,11,16,5, -2,9,89,162,8,44,37,53,9,223,0,33,35,36,20,105,159,36,16,1,2, -3,16,0,11,16,5,2,11,89,162,8,44,37,53,9,223,0,33,36,36,20, -105,159,36,16,1,2,3,16,1,33,37,11,16,5,2,13,89,162,8,44,37, -56,9,223,0,33,38,36,20,105,159,36,16,1,2,3,16,1,33,39,11,16, -5,2,4,89,162,8,44,37,58,9,223,0,33,42,36,20,105,159,36,16,1, -2,3,16,0,11,16,5,2,12,89,162,8,44,37,53,9,223,0,33,44,36, -20,105,159,36,16,1,2,3,16,0,11,16,5,2,10,89,162,8,44,37,54, -9,223,0,33,45,36,20,105,159,36,16,1,2,3,16,0,11,16,5,2,7, -89,162,8,44,37,55,9,223,0,33,46,36,20,105,159,36,16,1,2,3,16, -0,11,16,5,2,5,89,162,8,44,37,58,9,223,0,33,47,36,20,105,159, -36,16,1,2,3,16,1,33,49,11,16,5,2,8,89,162,8,44,37,54,9, -223,0,33,50,36,20,105,159,36,16,1,2,3,16,0,11,16,0,94,2,15, -2,16,93,2,15,9,9,36,0}; - EVAL_ONE_SIZED_STR((char *)expr, 2024); +249,22,136,4,80,158,39,36,250,22,82,2,23,249,22,2,32,0,89,162,8, +44,37,47,9,222,33,43,248,22,143,4,248,22,72,201,248,22,73,198,27,248, +22,73,248,22,143,4,196,27,248,22,143,4,248,22,72,195,249,22,136,4,80, +158,40,36,28,248,22,79,195,250,22,82,2,21,9,248,22,73,199,250,22,81, +2,4,248,22,81,248,22,72,199,250,22,82,2,10,248,22,73,201,248,22,73, +202,27,248,22,73,248,22,143,4,23,197,1,27,249,22,1,22,85,249,22,2, +22,143,4,248,22,143,4,248,22,72,199,249,22,136,4,80,158,40,36,251,22, +81,1,22,119,105,116,104,45,99,111,110,116,105,110,117,97,116,105,111,110,45, +109,97,114,107,2,25,250,22,82,1,23,101,120,116,101,110,100,45,112,97,114, +97,109,101,116,101,114,105,122,97,116,105,111,110,21,95,1,27,99,111,110,116, +105,110,117,97,116,105,111,110,45,109,97,114,107,45,115,101,116,45,102,105,114, +115,116,11,2,25,201,250,22,82,2,21,9,248,22,73,203,27,248,22,73,248, +22,143,4,196,28,248,22,79,193,20,15,159,37,36,37,249,22,136,4,80,158, +39,36,27,248,22,143,4,248,22,72,197,28,249,22,177,8,62,61,62,248,22, +137,4,248,22,96,196,250,22,81,2,21,248,22,81,249,22,81,21,93,2,26, +248,22,72,199,250,22,82,2,5,249,22,81,2,26,249,22,81,248,22,105,203, +2,26,248,22,73,202,251,22,81,2,17,28,249,22,177,8,248,22,137,4,248, +22,72,200,64,101,108,115,101,10,248,22,72,197,250,22,82,2,21,9,248,22, +73,200,249,22,71,2,5,248,22,73,202,100,8,32,8,31,8,30,8,29,8, +28,16,4,11,11,2,19,3,1,8,101,110,118,49,50,56,49,57,16,4,11, +11,2,20,3,1,8,101,110,118,49,50,56,50,48,93,8,224,91,77,0,0, +18,16,2,158,94,10,64,118,111,105,100,8,48,95,9,8,224,91,77,0,0, +2,2,27,248,22,73,248,22,143,4,196,249,22,136,4,80,158,39,36,28,248, +22,56,248,22,137,4,248,22,72,197,250,22,81,2,27,248,22,81,248,22,72, +199,248,22,96,198,27,248,22,137,4,248,22,72,197,250,22,81,2,27,248,22, +81,248,22,72,197,250,22,82,2,24,248,22,73,199,248,22,73,202,159,36,20, +105,159,36,16,1,11,16,0,83,158,42,20,103,145,2,1,2,1,2,2,11, +11,11,10,36,80,158,36,36,20,105,159,36,16,0,16,0,16,1,2,3,37, +16,0,36,16,0,36,11,11,39,36,11,11,11,16,10,2,4,2,5,2,6, +2,7,2,8,2,9,2,10,2,11,2,12,2,13,16,10,11,11,11,11,11, +11,11,11,11,11,16,10,2,4,2,5,2,6,2,7,2,8,2,9,2,10, +2,11,2,12,2,13,36,46,37,11,11,11,16,0,16,0,16,0,36,36,11, +11,11,11,16,0,16,0,16,0,36,36,16,11,16,5,2,3,20,15,159,36, +36,36,36,20,105,159,36,16,0,16,1,33,33,10,16,5,2,6,89,162,8, +44,37,53,9,223,0,33,34,36,20,105,159,36,16,1,2,3,16,0,11,16, +5,2,9,89,162,8,44,37,53,9,223,0,33,35,36,20,105,159,36,16,1, +2,3,16,0,11,16,5,2,11,89,162,8,44,37,53,9,223,0,33,36,36, +20,105,159,36,16,1,2,3,16,1,33,37,11,16,5,2,13,89,162,8,44, +37,56,9,223,0,33,38,36,20,105,159,36,16,1,2,3,16,1,33,39,11, +16,5,2,4,89,162,8,44,37,58,9,223,0,33,42,36,20,105,159,36,16, +1,2,3,16,0,11,16,5,2,12,89,162,8,44,37,53,9,223,0,33,44, +36,20,105,159,36,16,1,2,3,16,0,11,16,5,2,10,89,162,8,44,37, +54,9,223,0,33,45,36,20,105,159,36,16,1,2,3,16,0,11,16,5,2, +7,89,162,8,44,37,55,9,223,0,33,46,36,20,105,159,36,16,1,2,3, +16,0,11,16,5,2,5,89,162,8,44,37,58,9,223,0,33,47,36,20,105, +159,36,16,1,2,3,16,1,33,49,11,16,5,2,8,89,162,8,44,37,54, +9,223,0,33,50,36,20,105,159,36,16,1,2,3,16,0,11,16,0,94,2, +15,2,16,93,2,15,9,9,36,0}; + EVAL_ONE_SIZED_STR((char *)expr, 2025); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,53,46,57,65,0,0,0,1,0,0,8,0,21,0, -26,0,43,0,58,0,76,0,92,0,102,0,120,0,140,0,156,0,174,0,205, -0,234,0,0,1,14,1,20,1,34,1,39,1,49,1,57,1,85,1,117,1, -123,1,168,1,213,1,237,1,20,2,22,2,188,2,22,4,63,4,136,5,222, -5,52,6,151,6,235,6,248,6,113,7,215,7,227,7,77,9,91,9,236,9, -221,10,203,11,210,11,218,11,226,11,95,12,109,12,94,14,196,14,218,14,234, -14,182,16,29,17,43,17,125,18,62,20,71,20,80,20,106,20,217,20,0,0, -206,23,0,0,67,35,37,117,116,105,108,115,72,112,97,116,104,45,115,116,114, -105,110,103,63,64,98,115,98,115,76,110,111,114,109,97,108,45,99,97,115,101, -45,112,97,116,104,74,45,99,104,101,99,107,45,114,101,108,112,97,116,104,77, -45,99,104,101,99,107,45,99,111,108,108,101,99,116,105,111,110,75,99,111,108, -108,101,99,116,105,111,110,45,112,97,116,104,69,45,102,105,110,100,45,99,111, -108,77,99,104,101,99,107,45,115,117,102,102,105,120,45,99,97,108,108,79,112, -97,116,104,45,114,101,112,108,97,99,101,45,115,117,102,102,105,120,75,112,97, -116,104,45,97,100,100,45,115,117,102,102,105,120,77,108,111,97,100,47,117,115, -101,45,99,111,109,112,105,108,101,100,1,29,102,105,110,100,45,108,105,98,114, -97,114,121,45,99,111,108,108,101,99,116,105,111,110,45,112,97,116,104,115,1, -27,112,97,116,104,45,108,105,115,116,45,115,116,114,105,110,103,45,62,112,97, -116,104,45,108,105,115,116,1,20,102,105,110,100,45,101,120,101,99,117,116,97, -98,108,101,45,112,97,116,104,73,101,109,98,101,100,100,101,100,45,108,111,97, -100,65,113,117,111,116,101,29,94,2,17,68,35,37,112,97,114,97,109,122,11, -64,108,111,111,112,69,101,120,101,99,45,102,105,108,101,67,119,105,110,100,111, -119,115,6,25,25,112,97,116,104,32,111,114,32,118,97,108,105,100,45,112,97, -116,104,32,115,116,114,105,110,103,6,29,29,126,97,58,32,105,110,118,97,108, -105,100,32,114,101,108,97,116,105,118,101,32,112,97,116,104,58,32,126,115,65, -99,108,111,111,112,6,42,42,126,97,58,32,99,111,108,108,101,99,116,105,111, -110,32,110,111,116,32,102,111,117,110,100,58,32,126,115,32,105,110,32,97,110, -121,32,111,102,58,32,126,115,6,42,42,112,97,116,104,32,40,102,111,114,32, -97,110,121,32,115,121,115,116,101,109,41,32,111,114,32,118,97,108,105,100,45, -112,97,116,104,32,115,116,114,105,110,103,6,21,21,115,116,114,105,110,103,32, -111,114,32,98,121,116,101,32,115,116,114,105,110,103,6,36,36,99,97,110,110, -111,116,32,97,100,100,32,97,32,115,117,102,102,105,120,32,116,111,32,97,32, -114,111,111,116,32,112,97,116,104,58,32,5,0,27,20,14,159,80,159,37,51, -38,250,80,159,40,52,38,249,22,27,11,80,159,42,51,38,22,146,13,10,248, -22,169,5,23,196,2,28,248,22,166,6,23,194,2,12,87,94,248,22,183,8, -23,194,1,27,20,14,159,80,159,38,51,38,250,80,159,41,52,38,249,22,27, -11,80,159,43,51,38,22,146,13,10,248,22,169,5,23,197,2,28,248,22,166, -6,23,194,2,12,87,94,248,22,183,8,23,194,1,27,20,14,159,80,159,39, -51,38,250,80,159,42,52,38,249,22,27,11,80,159,44,51,38,22,146,13,10, -248,22,169,5,23,198,2,28,248,22,166,6,23,194,2,12,87,94,248,22,183, -8,23,194,1,248,80,159,40,54,37,197,28,248,22,79,23,195,2,9,27,248, -22,72,23,196,2,27,28,248,22,130,14,23,195,2,23,194,1,28,248,22,129, -14,23,195,2,249,22,131,14,23,196,1,250,80,158,43,49,248,22,146,14,2, -20,11,10,250,80,158,41,49,248,22,146,14,2,20,23,197,1,10,28,23,193, -2,249,22,71,248,22,133,14,249,22,131,14,23,198,1,247,22,147,14,27,248, -22,73,23,200,1,28,248,22,79,23,194,2,9,27,248,22,72,23,195,2,27, -28,248,22,130,14,23,195,2,23,194,1,28,248,22,129,14,23,195,2,249,22, -131,14,23,196,1,250,80,158,48,49,248,22,146,14,2,20,11,10,250,80,158, -46,49,248,22,146,14,2,20,23,197,1,10,28,23,193,2,249,22,71,248,22, -133,14,249,22,131,14,23,198,1,247,22,147,14,248,80,159,46,53,37,248,22, -73,23,199,1,87,94,23,193,1,248,80,159,44,53,37,248,22,73,23,197,1, -87,94,23,193,1,27,248,22,73,23,198,1,28,248,22,79,23,194,2,9,27, -248,22,72,23,195,2,27,28,248,22,130,14,23,195,2,23,194,1,28,248,22, -129,14,23,195,2,249,22,131,14,23,196,1,250,80,158,46,49,248,22,146,14, -2,20,11,10,250,80,158,44,49,248,22,146,14,2,20,23,197,1,10,28,23, -193,2,249,22,71,248,22,133,14,249,22,131,14,23,198,1,247,22,147,14,248, -80,159,44,53,37,248,22,73,23,199,1,248,80,159,42,53,37,248,22,73,196, -27,248,22,170,13,23,195,2,28,23,193,2,192,87,94,23,193,1,28,248,22, -171,6,23,195,2,27,248,22,128,14,195,28,192,192,248,22,129,14,195,11,87, -94,28,28,248,22,171,13,23,195,2,10,28,248,22,170,13,23,195,2,10,28, -248,22,171,6,23,195,2,28,248,22,128,14,23,195,2,10,248,22,129,14,23, -195,2,11,12,250,22,147,9,76,110,111,114,109,97,108,45,112,97,116,104,45, -99,97,115,101,6,42,42,112,97,116,104,32,40,102,111,114,32,97,110,121,32, -115,121,115,116,101,109,41,32,111,114,32,118,97,108,105,100,45,112,97,116,104, -32,115,116,114,105,110,103,23,197,2,28,28,248,22,171,13,23,195,2,249,22, -177,8,248,22,172,13,23,197,2,2,21,249,22,177,8,247,22,190,7,2,21, -27,28,248,22,171,6,23,196,2,23,195,2,248,22,180,7,248,22,175,13,23, -197,2,28,249,22,159,14,0,21,35,114,120,34,94,91,92,92,93,91,92,92, -93,91,63,93,91,92,92,93,34,23,195,2,28,248,22,171,6,195,248,22,178, -13,195,194,27,248,22,146,7,23,195,1,249,22,179,13,248,22,183,7,250,22, -165,14,0,6,35,114,120,34,47,34,28,249,22,159,14,0,22,35,114,120,34, -91,47,92,92,93,91,46,32,93,43,91,47,92,92,93,42,36,34,23,201,2, -23,199,1,250,22,165,14,0,19,35,114,120,34,91,32,46,93,43,40,91,47, -92,92,93,42,41,36,34,23,202,1,6,2,2,92,49,80,159,44,37,38,2, -21,28,248,22,171,6,194,248,22,178,13,194,193,87,94,28,28,248,22,170,13, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,52,46,50,46,53,46,49,48,65,0,0,0,1,0,0,8,0,21, +0,26,0,43,0,58,0,76,0,92,0,102,0,120,0,140,0,156,0,174,0, +205,0,234,0,0,1,14,1,20,1,34,1,39,1,49,1,57,1,85,1,117, +1,123,1,168,1,213,1,237,1,20,2,22,2,188,2,22,4,63,4,136,5, +222,5,52,6,151,6,235,6,248,6,113,7,215,7,227,7,77,9,91,9,236, +9,221,10,203,11,210,11,218,11,226,11,95,12,109,12,94,14,196,14,218,14, +234,14,182,16,29,17,43,17,125,18,62,20,71,20,80,20,106,20,217,20,0, +0,206,23,0,0,67,35,37,117,116,105,108,115,72,112,97,116,104,45,115,116, +114,105,110,103,63,64,98,115,98,115,76,110,111,114,109,97,108,45,99,97,115, +101,45,112,97,116,104,74,45,99,104,101,99,107,45,114,101,108,112,97,116,104, +77,45,99,104,101,99,107,45,99,111,108,108,101,99,116,105,111,110,75,99,111, +108,108,101,99,116,105,111,110,45,112,97,116,104,69,45,102,105,110,100,45,99, +111,108,77,99,104,101,99,107,45,115,117,102,102,105,120,45,99,97,108,108,79, +112,97,116,104,45,114,101,112,108,97,99,101,45,115,117,102,102,105,120,75,112, +97,116,104,45,97,100,100,45,115,117,102,102,105,120,77,108,111,97,100,47,117, +115,101,45,99,111,109,112,105,108,101,100,1,29,102,105,110,100,45,108,105,98, +114,97,114,121,45,99,111,108,108,101,99,116,105,111,110,45,112,97,116,104,115, +1,27,112,97,116,104,45,108,105,115,116,45,115,116,114,105,110,103,45,62,112, +97,116,104,45,108,105,115,116,1,20,102,105,110,100,45,101,120,101,99,117,116, +97,98,108,101,45,112,97,116,104,73,101,109,98,101,100,100,101,100,45,108,111, +97,100,65,113,117,111,116,101,29,94,2,17,68,35,37,112,97,114,97,109,122, +11,64,108,111,111,112,69,101,120,101,99,45,102,105,108,101,67,119,105,110,100, +111,119,115,6,25,25,112,97,116,104,32,111,114,32,118,97,108,105,100,45,112, +97,116,104,32,115,116,114,105,110,103,6,29,29,126,97,58,32,105,110,118,97, +108,105,100,32,114,101,108,97,116,105,118,101,32,112,97,116,104,58,32,126,115, +65,99,108,111,111,112,6,42,42,126,97,58,32,99,111,108,108,101,99,116,105, +111,110,32,110,111,116,32,102,111,117,110,100,58,32,126,115,32,105,110,32,97, +110,121,32,111,102,58,32,126,115,6,42,42,112,97,116,104,32,40,102,111,114, +32,97,110,121,32,115,121,115,116,101,109,41,32,111,114,32,118,97,108,105,100, +45,112,97,116,104,32,115,116,114,105,110,103,6,21,21,115,116,114,105,110,103, +32,111,114,32,98,121,116,101,32,115,116,114,105,110,103,6,36,36,99,97,110, +110,111,116,32,97,100,100,32,97,32,115,117,102,102,105,120,32,116,111,32,97, +32,114,111,111,116,32,112,97,116,104,58,32,5,0,27,20,14,159,80,159,37, +51,38,250,80,159,40,52,38,249,22,27,11,80,159,42,51,38,22,146,13,10, +248,22,169,5,23,196,2,28,248,22,166,6,23,194,2,12,87,94,248,22,183, +8,23,194,1,27,20,14,159,80,159,38,51,38,250,80,159,41,52,38,249,22, +27,11,80,159,43,51,38,22,146,13,10,248,22,169,5,23,197,2,28,248,22, +166,6,23,194,2,12,87,94,248,22,183,8,23,194,1,27,20,14,159,80,159, +39,51,38,250,80,159,42,52,38,249,22,27,11,80,159,44,51,38,22,146,13, +10,248,22,169,5,23,198,2,28,248,22,166,6,23,194,2,12,87,94,248,22, +183,8,23,194,1,248,80,159,40,54,37,197,28,248,22,79,23,195,2,9,27, +248,22,72,23,196,2,27,28,248,22,130,14,23,195,2,23,194,1,28,248,22, +129,14,23,195,2,249,22,131,14,23,196,1,250,80,158,43,49,248,22,146,14, +2,20,11,10,250,80,158,41,49,248,22,146,14,2,20,23,197,1,10,28,23, +193,2,249,22,71,248,22,133,14,249,22,131,14,23,198,1,247,22,147,14,27, +248,22,73,23,200,1,28,248,22,79,23,194,2,9,27,248,22,72,23,195,2, +27,28,248,22,130,14,23,195,2,23,194,1,28,248,22,129,14,23,195,2,249, +22,131,14,23,196,1,250,80,158,48,49,248,22,146,14,2,20,11,10,250,80, +158,46,49,248,22,146,14,2,20,23,197,1,10,28,23,193,2,249,22,71,248, +22,133,14,249,22,131,14,23,198,1,247,22,147,14,248,80,159,46,53,37,248, +22,73,23,199,1,87,94,23,193,1,248,80,159,44,53,37,248,22,73,23,197, +1,87,94,23,193,1,27,248,22,73,23,198,1,28,248,22,79,23,194,2,9, +27,248,22,72,23,195,2,27,28,248,22,130,14,23,195,2,23,194,1,28,248, +22,129,14,23,195,2,249,22,131,14,23,196,1,250,80,158,46,49,248,22,146, +14,2,20,11,10,250,80,158,44,49,248,22,146,14,2,20,23,197,1,10,28, +23,193,2,249,22,71,248,22,133,14,249,22,131,14,23,198,1,247,22,147,14, +248,80,159,44,53,37,248,22,73,23,199,1,248,80,159,42,53,37,248,22,73, +196,27,248,22,170,13,23,195,2,28,23,193,2,192,87,94,23,193,1,28,248, +22,171,6,23,195,2,27,248,22,128,14,195,28,192,192,248,22,129,14,195,11, +87,94,28,28,248,22,171,13,23,195,2,10,28,248,22,170,13,23,195,2,10, +28,248,22,171,6,23,195,2,28,248,22,128,14,23,195,2,10,248,22,129,14, +23,195,2,11,12,250,22,147,9,76,110,111,114,109,97,108,45,112,97,116,104, +45,99,97,115,101,6,42,42,112,97,116,104,32,40,102,111,114,32,97,110,121, +32,115,121,115,116,101,109,41,32,111,114,32,118,97,108,105,100,45,112,97,116, +104,32,115,116,114,105,110,103,23,197,2,28,28,248,22,171,13,23,195,2,249, +22,177,8,248,22,172,13,23,197,2,2,21,249,22,177,8,247,22,190,7,2, +21,27,28,248,22,171,6,23,196,2,23,195,2,248,22,180,7,248,22,175,13, +23,197,2,28,249,22,161,14,0,21,35,114,120,34,94,91,92,92,93,91,92, +92,93,91,63,93,91,92,92,93,34,23,195,2,28,248,22,171,6,195,248,22, +178,13,195,194,27,248,22,146,7,23,195,1,249,22,179,13,248,22,183,7,250, +22,169,14,0,6,35,114,120,34,47,34,28,249,22,161,14,0,22,35,114,120, +34,91,47,92,92,93,91,46,32,93,43,91,47,92,92,93,42,36,34,23,201, +2,23,199,1,250,22,169,14,0,19,35,114,120,34,91,32,46,93,43,40,91, +47,92,92,93,42,41,36,34,23,202,1,6,2,2,92,49,80,159,44,37,38, +2,21,28,248,22,171,6,194,248,22,178,13,194,193,87,94,28,28,248,22,170, +13,23,195,2,10,28,248,22,171,6,23,195,2,28,248,22,128,14,23,195,2, +10,248,22,129,14,23,195,2,11,12,250,22,147,9,23,196,2,2,22,23,197, +2,28,248,22,128,14,23,195,2,12,248,22,186,11,249,22,128,11,248,22,136, +7,250,22,155,7,2,23,23,200,1,23,201,1,247,22,23,87,94,28,28,248, +22,170,13,23,195,2,10,28,248,22,171,6,23,195,2,28,248,22,128,14,23, +195,2,10,248,22,129,14,23,195,2,11,12,250,22,147,9,23,196,2,2,22, +23,197,2,28,248,22,128,14,23,195,2,12,248,22,186,11,249,22,128,11,248, +22,136,7,250,22,155,7,2,23,23,200,1,23,201,1,247,22,23,87,94,87, +94,28,28,248,22,170,13,23,195,2,10,28,248,22,171,6,23,195,2,28,248, +22,128,14,23,195,2,10,248,22,129,14,23,195,2,11,12,250,22,147,9,195, +2,22,23,197,2,28,248,22,128,14,23,195,2,12,248,22,186,11,249,22,128, +11,248,22,136,7,250,22,155,7,2,23,199,23,201,1,247,22,23,249,22,3, +89,162,8,44,37,50,9,223,2,33,35,196,87,94,28,28,248,22,170,13,23, +194,2,10,28,248,22,171,6,23,194,2,28,248,22,128,14,23,194,2,10,248, +22,129,14,23,194,2,11,12,250,22,147,9,2,7,2,22,23,196,2,28,248, +22,128,14,23,194,2,12,248,22,186,11,249,22,128,11,248,22,136,7,250,22, +155,7,2,23,2,7,23,200,1,247,22,23,32,38,89,162,8,44,40,55,2, +24,222,33,39,28,248,22,79,23,197,2,87,94,23,196,1,248,22,186,11,249, +22,161,11,251,22,155,7,2,25,2,7,28,248,22,79,23,203,2,87,94,23, +202,1,23,201,1,250,22,1,22,188,13,23,204,1,23,205,1,23,200,1,247, +22,23,27,249,22,188,13,248,22,72,23,200,2,23,197,2,28,248,22,183,13, +23,194,2,27,250,22,1,22,188,13,23,197,1,199,28,248,22,183,13,193,192, +251,2,38,198,199,200,248,22,73,202,251,2,38,197,198,199,248,22,73,201,87, +94,87,94,87,94,28,28,248,22,170,13,193,10,28,248,22,171,6,193,28,248, +22,128,14,193,10,248,22,129,14,193,11,12,250,22,147,9,2,7,2,22,195, +28,248,22,128,14,193,12,248,22,186,11,249,22,128,11,248,22,136,7,250,22, +155,7,2,23,2,7,199,247,22,23,249,22,3,32,0,89,162,8,44,37,49, +9,222,33,37,195,27,247,22,148,14,251,2,38,196,197,198,196,32,41,89,162, +44,42,59,2,24,222,33,42,28,248,22,79,23,199,2,87,94,23,198,1,248, +23,196,1,251,22,155,7,2,25,23,199,1,28,248,22,79,23,203,2,87,94, +23,202,1,23,201,1,250,22,1,22,188,13,23,204,1,23,205,1,23,198,1, +27,249,22,188,13,248,22,72,23,202,2,23,199,2,28,248,22,183,13,23,194, +2,27,250,22,1,22,188,13,23,197,1,23,202,2,28,248,22,183,13,23,194, +2,192,87,94,23,193,1,27,248,22,73,23,202,1,28,248,22,79,23,194,2, +87,94,23,193,1,248,23,199,1,251,22,155,7,2,25,23,202,1,28,248,22, +79,23,206,2,87,94,23,205,1,23,204,1,250,22,1,22,188,13,23,207,1, +23,208,1,23,201,1,27,249,22,188,13,248,22,72,23,197,2,23,202,2,28, +248,22,183,13,23,194,2,27,250,22,1,22,188,13,23,197,1,204,28,248,22, +183,13,193,192,253,2,41,203,204,205,206,23,15,248,22,73,201,253,2,41,202, +203,204,205,206,248,22,73,200,87,94,23,193,1,27,248,22,73,23,201,1,28, +248,22,79,23,194,2,87,94,23,193,1,248,23,198,1,251,22,155,7,2,25, +23,201,1,28,248,22,79,23,205,2,87,94,23,204,1,23,203,1,250,22,1, +22,188,13,23,206,1,23,207,1,23,200,1,27,249,22,188,13,248,22,72,23, +197,2,23,201,2,28,248,22,183,13,23,194,2,27,250,22,1,22,188,13,23, +197,1,203,28,248,22,183,13,193,192,253,2,41,202,203,204,205,206,248,22,73, +201,253,2,41,201,202,203,204,205,248,22,73,200,27,247,22,148,14,253,2,41, +198,199,200,201,202,198,87,95,28,28,248,22,171,13,23,194,2,10,28,248,22, +170,13,23,194,2,10,28,248,22,171,6,23,194,2,28,248,22,128,14,23,194, +2,10,248,22,129,14,23,194,2,11,12,252,22,147,9,23,200,2,2,26,36, +23,198,2,23,199,2,28,28,248,22,171,6,23,195,2,10,248,22,159,7,23, +195,2,87,94,23,194,1,12,252,22,147,9,23,200,2,2,27,37,23,198,2, +23,199,1,91,159,39,11,90,161,39,36,11,248,22,191,13,23,197,2,87,94, +23,195,1,87,94,28,192,12,250,22,148,9,23,201,1,2,28,23,199,1,249, +22,7,194,195,91,159,38,11,90,161,38,36,11,87,95,28,28,248,22,171,13, +23,196,2,10,28,248,22,170,13,23,196,2,10,28,248,22,171,6,23,196,2, +28,248,22,128,14,23,196,2,10,248,22,129,14,23,196,2,11,12,252,22,147, +9,2,10,2,26,36,23,200,2,23,201,2,28,28,248,22,171,6,23,197,2, +10,248,22,159,7,23,197,2,12,252,22,147,9,2,10,2,27,37,23,200,2, +23,201,2,91,159,39,11,90,161,39,36,11,248,22,191,13,23,199,2,87,94, +23,195,1,87,94,28,192,12,250,22,148,9,2,10,2,28,23,201,2,249,22, +7,194,195,27,249,22,180,13,250,22,168,14,0,20,35,114,120,35,34,40,63, +58,91,46,93,91,94,46,93,42,124,41,36,34,248,22,176,13,23,201,1,28, +248,22,171,6,23,203,2,249,22,183,7,23,204,1,8,63,23,202,1,28,248, +22,171,13,23,199,2,248,22,172,13,23,199,1,87,94,23,198,1,247,22,173, +13,28,248,22,170,13,194,249,22,188,13,195,194,192,91,159,38,11,90,161,38, +36,11,87,95,28,28,248,22,171,13,23,196,2,10,28,248,22,170,13,23,196, +2,10,28,248,22,171,6,23,196,2,28,248,22,128,14,23,196,2,10,248,22, +129,14,23,196,2,11,12,252,22,147,9,2,11,2,26,36,23,200,2,23,201, +2,28,28,248,22,171,6,23,197,2,10,248,22,159,7,23,197,2,12,252,22, +147,9,2,11,2,27,37,23,200,2,23,201,2,91,159,39,11,90,161,39,36, +11,248,22,191,13,23,199,2,87,94,23,195,1,87,94,28,192,12,250,22,148, +9,2,11,2,28,23,201,2,249,22,7,194,195,27,249,22,180,13,249,22,169, +7,250,22,169,14,0,9,35,114,120,35,34,91,46,93,34,248,22,176,13,23, +203,1,6,1,1,95,28,248,22,171,6,23,202,2,249,22,183,7,23,203,1, +8,63,23,201,1,28,248,22,171,13,23,199,2,248,22,172,13,23,199,1,87, +94,23,198,1,247,22,173,13,28,248,22,170,13,194,249,22,188,13,195,194,192, +249,247,22,138,5,194,11,249,80,159,38,47,37,9,9,249,80,159,38,47,37, +195,9,27,247,22,150,14,249,80,158,39,48,28,23,195,2,27,248,22,188,7, +6,11,11,80,76,84,67,79,76,76,69,67,84,83,28,192,192,6,0,0,6, +0,0,27,28,23,196,1,250,22,188,13,248,22,146,14,69,97,100,100,111,110, +45,100,105,114,247,22,186,7,6,8,8,99,111,108,108,101,99,116,115,11,27, +248,80,159,42,53,37,250,22,85,23,203,1,248,22,81,248,22,146,14,72,99, +111,108,108,101,99,116,115,45,100,105,114,23,204,1,28,193,249,22,71,195,194, +192,32,51,89,162,8,44,39,8,31,2,19,222,33,52,27,249,22,157,14,23, +197,2,23,198,2,28,23,193,2,87,94,23,196,1,27,248,22,96,23,195,2, +27,27,248,22,105,23,197,1,27,249,22,157,14,23,201,2,23,196,2,28,23, +193,2,87,94,23,194,1,27,248,22,96,23,195,2,27,27,248,22,105,23,197, +1,27,249,22,157,14,23,205,2,23,196,2,28,23,193,2,87,94,23,194,1, +27,248,22,96,23,195,2,27,27,248,22,105,23,197,1,27,249,22,157,14,23, +209,2,23,196,2,28,23,193,2,87,94,23,194,1,27,248,22,96,23,195,2, +27,27,248,22,105,23,197,1,27,249,22,157,14,23,213,2,23,196,2,28,23, +193,2,87,94,23,194,1,27,248,22,96,23,195,2,27,250,2,51,23,215,2, +23,216,1,248,22,105,23,199,1,28,249,22,165,7,23,196,2,2,29,249,22, +85,23,214,2,194,249,22,71,248,22,179,13,23,197,1,194,87,95,23,211,1, +23,193,1,28,249,22,165,7,23,196,2,2,29,249,22,85,23,212,2,9,249, +22,71,248,22,179,13,23,197,1,9,28,249,22,165,7,23,196,2,2,29,249, +22,85,23,210,2,194,249,22,71,248,22,179,13,23,197,1,194,87,94,23,193, +1,28,249,22,165,7,23,196,2,2,29,249,22,85,23,208,2,9,249,22,71, +248,22,179,13,23,197,1,9,28,249,22,165,7,23,196,2,2,29,249,22,85, +23,206,2,194,249,22,71,248,22,179,13,23,197,1,194,87,94,23,193,1,28, +249,22,165,7,23,196,2,2,29,249,22,85,23,204,2,9,249,22,71,248,22, +179,13,23,197,1,9,28,249,22,165,7,23,196,2,2,29,249,22,85,23,202, +2,194,249,22,71,248,22,179,13,23,197,1,194,87,94,23,193,1,28,249,22, +165,7,23,196,2,2,29,249,22,85,23,200,2,9,249,22,71,248,22,179,13, +23,197,1,9,28,249,22,165,7,23,196,2,2,29,249,22,85,197,194,87,94, +23,196,1,249,22,71,248,22,179,13,23,197,1,194,87,94,23,193,1,28,249, +22,165,7,23,198,2,2,29,249,22,85,195,9,87,94,23,194,1,249,22,71, +248,22,179,13,23,199,1,9,87,95,28,28,248,22,159,7,194,10,248,22,171, +6,194,12,250,22,147,9,2,14,6,21,21,98,121,116,101,32,115,116,114,105, +110,103,32,111,114,32,115,116,114,105,110,103,196,28,28,248,22,80,195,249,22, +4,22,170,13,196,11,12,250,22,147,9,2,14,6,13,13,108,105,115,116,32, +111,102,32,112,97,116,104,115,197,250,2,51,197,195,28,248,22,171,6,197,248, +22,182,7,197,196,32,54,89,162,8,44,39,53,70,102,111,117,110,100,45,101, +120,101,99,222,33,57,32,55,89,162,8,44,40,58,64,110,101,120,116,222,33, +56,27,248,22,132,14,23,196,2,28,249,22,179,8,23,195,2,23,197,1,11, +28,248,22,128,14,23,194,2,27,249,22,188,13,23,197,1,23,196,1,28,23, +197,2,91,159,39,11,90,161,39,36,11,248,22,191,13,23,197,2,87,95,23, +195,1,23,194,1,27,28,23,202,2,27,248,22,132,14,23,199,2,28,249,22, +179,8,23,195,2,23,200,2,11,28,248,22,128,14,23,194,2,250,2,54,23, +205,2,23,206,2,249,22,188,13,23,200,2,23,198,1,250,2,54,23,205,2, +23,206,2,23,196,1,11,28,23,193,2,192,87,94,23,193,1,27,28,248,22, +170,13,23,196,2,27,249,22,188,13,23,198,2,23,205,2,28,28,248,22,183, +13,193,10,248,22,182,13,193,192,11,11,28,23,193,2,192,87,94,23,193,1, +28,23,203,2,11,27,248,22,132,14,23,200,2,28,249,22,179,8,23,195,2, +23,201,1,11,28,248,22,128,14,23,194,2,250,2,54,23,206,1,23,207,1, +249,22,188,13,23,201,1,23,198,1,250,2,54,205,206,195,192,87,94,23,194, +1,28,23,196,2,91,159,39,11,90,161,39,36,11,248,22,191,13,23,197,2, +87,95,23,195,1,23,194,1,27,28,23,201,2,27,248,22,132,14,23,199,2, +28,249,22,179,8,23,195,2,23,200,2,11,28,248,22,128,14,23,194,2,250, +2,54,23,204,2,23,205,2,249,22,188,13,23,200,2,23,198,1,250,2,54, +23,204,2,23,205,2,23,196,1,11,28,23,193,2,192,87,94,23,193,1,27, +28,248,22,170,13,23,196,2,27,249,22,188,13,23,198,2,23,204,2,28,28, +248,22,183,13,193,10,248,22,182,13,193,192,11,11,28,23,193,2,192,87,94, +23,193,1,28,23,202,2,11,27,248,22,132,14,23,200,2,28,249,22,179,8, +23,195,2,23,201,1,11,28,248,22,128,14,23,194,2,250,2,54,23,205,1, +23,206,1,249,22,188,13,23,201,1,23,198,1,250,2,54,204,205,195,192,28, +23,193,2,91,159,39,11,90,161,39,36,11,248,22,191,13,23,199,2,87,95, +23,195,1,23,194,1,27,28,23,198,2,251,2,55,23,198,2,23,203,2,23, +201,2,23,202,2,11,28,23,193,2,192,87,94,23,193,1,27,28,248,22,170, +13,195,27,249,22,188,13,197,200,28,28,248,22,183,13,193,10,248,22,182,13, +193,192,11,11,28,192,192,28,198,11,251,2,55,198,203,201,202,194,32,58,89, +162,8,44,40,8,31,2,19,222,33,59,28,248,22,79,23,197,2,11,27,248, +22,131,14,248,22,72,23,199,2,27,249,22,188,13,23,196,1,23,197,2,28, +248,22,182,13,23,194,2,250,2,54,198,199,195,87,94,23,193,1,27,248,22, +73,23,200,1,28,248,22,79,23,194,2,11,27,248,22,131,14,248,22,72,23, +196,2,27,249,22,188,13,23,196,1,23,200,2,28,248,22,182,13,23,194,2, +250,2,54,201,202,195,87,94,23,193,1,27,248,22,73,23,197,1,28,248,22, +79,23,194,2,11,27,248,22,131,14,248,22,72,23,196,2,27,249,22,188,13, +23,196,1,23,203,2,28,248,22,182,13,23,194,2,250,2,54,204,205,195,87, +94,23,193,1,27,248,22,73,23,197,1,28,248,22,79,23,194,2,11,27,248, +22,131,14,248,22,72,23,196,2,27,249,22,188,13,23,196,1,23,206,2,28, +248,22,182,13,23,194,2,250,2,54,23,15,23,16,195,87,94,23,193,1,27, +248,22,73,23,197,1,28,248,22,79,23,194,2,11,27,248,22,131,14,248,22, +72,23,196,2,27,249,22,188,13,23,196,1,23,209,2,28,248,22,182,13,23, +194,2,250,2,54,23,18,23,19,195,87,94,23,193,1,27,248,22,73,23,197, +1,28,248,22,79,23,194,2,11,27,248,22,131,14,248,22,72,195,27,249,22, +188,13,23,196,1,23,19,28,248,22,182,13,193,250,2,54,23,21,23,22,195, +251,2,58,23,21,23,22,23,23,248,22,73,199,87,95,28,28,248,22,170,13, 23,195,2,10,28,248,22,171,6,23,195,2,28,248,22,128,14,23,195,2,10, -248,22,129,14,23,195,2,11,12,250,22,147,9,23,196,2,2,22,23,197,2, -28,248,22,128,14,23,195,2,12,248,22,186,11,249,22,128,11,248,22,136,7, -250,22,155,7,2,23,23,200,1,23,201,1,247,22,23,87,94,28,28,248,22, -170,13,23,195,2,10,28,248,22,171,6,23,195,2,28,248,22,128,14,23,195, -2,10,248,22,129,14,23,195,2,11,12,250,22,147,9,23,196,2,2,22,23, -197,2,28,248,22,128,14,23,195,2,12,248,22,186,11,249,22,128,11,248,22, -136,7,250,22,155,7,2,23,23,200,1,23,201,1,247,22,23,87,94,87,94, -28,28,248,22,170,13,23,195,2,10,28,248,22,171,6,23,195,2,28,248,22, -128,14,23,195,2,10,248,22,129,14,23,195,2,11,12,250,22,147,9,195,2, -22,23,197,2,28,248,22,128,14,23,195,2,12,248,22,186,11,249,22,128,11, -248,22,136,7,250,22,155,7,2,23,199,23,201,1,247,22,23,249,22,3,89, -162,8,44,37,50,9,223,2,33,35,196,87,94,28,28,248,22,170,13,23,194, -2,10,28,248,22,171,6,23,194,2,28,248,22,128,14,23,194,2,10,248,22, -129,14,23,194,2,11,12,250,22,147,9,2,7,2,22,23,196,2,28,248,22, -128,14,23,194,2,12,248,22,186,11,249,22,128,11,248,22,136,7,250,22,155, -7,2,23,2,7,23,200,1,247,22,23,32,38,89,162,8,44,40,55,2,24, -222,33,39,28,248,22,79,23,197,2,87,94,23,196,1,248,22,186,11,249,22, -161,11,251,22,155,7,2,25,2,7,28,248,22,79,23,203,2,87,94,23,202, -1,23,201,1,250,22,1,22,188,13,23,204,1,23,205,1,23,200,1,247,22, -23,27,249,22,188,13,248,22,72,23,200,2,23,197,2,28,248,22,183,13,23, -194,2,27,250,22,1,22,188,13,23,197,1,199,28,248,22,183,13,193,192,251, -2,38,198,199,200,248,22,73,202,251,2,38,197,198,199,248,22,73,201,87,94, -87,94,87,94,28,28,248,22,170,13,193,10,28,248,22,171,6,193,28,248,22, -128,14,193,10,248,22,129,14,193,11,12,250,22,147,9,2,7,2,22,195,28, -248,22,128,14,193,12,248,22,186,11,249,22,128,11,248,22,136,7,250,22,155, -7,2,23,2,7,199,247,22,23,249,22,3,32,0,89,162,8,44,37,49,9, -222,33,37,195,27,247,22,148,14,251,2,38,196,197,198,196,32,41,89,162,44, -42,59,2,24,222,33,42,28,248,22,79,23,199,2,87,94,23,198,1,248,23, -196,1,251,22,155,7,2,25,23,199,1,28,248,22,79,23,203,2,87,94,23, -202,1,23,201,1,250,22,1,22,188,13,23,204,1,23,205,1,23,198,1,27, -249,22,188,13,248,22,72,23,202,2,23,199,2,28,248,22,183,13,23,194,2, -27,250,22,1,22,188,13,23,197,1,23,202,2,28,248,22,183,13,23,194,2, -192,87,94,23,193,1,27,248,22,73,23,202,1,28,248,22,79,23,194,2,87, -94,23,193,1,248,23,199,1,251,22,155,7,2,25,23,202,1,28,248,22,79, -23,206,2,87,94,23,205,1,23,204,1,250,22,1,22,188,13,23,207,1,23, -208,1,23,201,1,27,249,22,188,13,248,22,72,23,197,2,23,202,2,28,248, -22,183,13,23,194,2,27,250,22,1,22,188,13,23,197,1,204,28,248,22,183, -13,193,192,253,2,41,203,204,205,206,23,15,248,22,73,201,253,2,41,202,203, -204,205,206,248,22,73,200,87,94,23,193,1,27,248,22,73,23,201,1,28,248, -22,79,23,194,2,87,94,23,193,1,248,23,198,1,251,22,155,7,2,25,23, -201,1,28,248,22,79,23,205,2,87,94,23,204,1,23,203,1,250,22,1,22, -188,13,23,206,1,23,207,1,23,200,1,27,249,22,188,13,248,22,72,23,197, -2,23,201,2,28,248,22,183,13,23,194,2,27,250,22,1,22,188,13,23,197, -1,203,28,248,22,183,13,193,192,253,2,41,202,203,204,205,206,248,22,73,201, -253,2,41,201,202,203,204,205,248,22,73,200,27,247,22,148,14,253,2,41,198, -199,200,201,202,198,87,95,28,28,248,22,171,13,23,194,2,10,28,248,22,170, -13,23,194,2,10,28,248,22,171,6,23,194,2,28,248,22,128,14,23,194,2, -10,248,22,129,14,23,194,2,11,12,252,22,147,9,23,200,2,2,26,36,23, -198,2,23,199,2,28,28,248,22,171,6,23,195,2,10,248,22,159,7,23,195, -2,87,94,23,194,1,12,252,22,147,9,23,200,2,2,27,37,23,198,2,23, -199,1,91,159,39,11,90,161,39,36,11,248,22,191,13,23,197,2,87,94,23, -195,1,87,94,28,192,12,250,22,148,9,23,201,1,2,28,23,199,1,249,22, -7,194,195,91,159,38,11,90,161,38,36,11,87,95,28,28,248,22,171,13,23, -196,2,10,28,248,22,170,13,23,196,2,10,28,248,22,171,6,23,196,2,28, -248,22,128,14,23,196,2,10,248,22,129,14,23,196,2,11,12,252,22,147,9, -2,10,2,26,36,23,200,2,23,201,2,28,28,248,22,171,6,23,197,2,10, -248,22,159,7,23,197,2,12,252,22,147,9,2,10,2,27,37,23,200,2,23, -201,2,91,159,39,11,90,161,39,36,11,248,22,191,13,23,199,2,87,94,23, -195,1,87,94,28,192,12,250,22,148,9,2,10,2,28,23,201,2,249,22,7, -194,195,27,249,22,180,13,250,22,164,14,0,20,35,114,120,35,34,40,63,58, -91,46,93,91,94,46,93,42,124,41,36,34,248,22,176,13,23,201,1,28,248, -22,171,6,23,203,2,249,22,183,7,23,204,1,8,63,23,202,1,28,248,22, -171,13,23,199,2,248,22,172,13,23,199,1,87,94,23,198,1,247,22,173,13, -28,248,22,170,13,194,249,22,188,13,195,194,192,91,159,38,11,90,161,38,36, -11,87,95,28,28,248,22,171,13,23,196,2,10,28,248,22,170,13,23,196,2, -10,28,248,22,171,6,23,196,2,28,248,22,128,14,23,196,2,10,248,22,129, -14,23,196,2,11,12,252,22,147,9,2,11,2,26,36,23,200,2,23,201,2, -28,28,248,22,171,6,23,197,2,10,248,22,159,7,23,197,2,12,252,22,147, -9,2,11,2,27,37,23,200,2,23,201,2,91,159,39,11,90,161,39,36,11, -248,22,191,13,23,199,2,87,94,23,195,1,87,94,28,192,12,250,22,148,9, -2,11,2,28,23,201,2,249,22,7,194,195,27,249,22,180,13,249,22,169,7, -250,22,165,14,0,9,35,114,120,35,34,91,46,93,34,248,22,176,13,23,203, -1,6,1,1,95,28,248,22,171,6,23,202,2,249,22,183,7,23,203,1,8, -63,23,201,1,28,248,22,171,13,23,199,2,248,22,172,13,23,199,1,87,94, -23,198,1,247,22,173,13,28,248,22,170,13,194,249,22,188,13,195,194,192,249, -247,22,138,5,194,11,249,80,159,38,47,37,9,9,249,80,159,38,47,37,195, -9,27,247,22,150,14,249,80,158,39,48,28,23,195,2,27,248,22,188,7,6, -11,11,80,76,84,67,79,76,76,69,67,84,83,28,192,192,6,0,0,6,0, -0,27,28,23,196,1,250,22,188,13,248,22,146,14,69,97,100,100,111,110,45, -100,105,114,247,22,186,7,6,8,8,99,111,108,108,101,99,116,115,11,27,248, -80,159,42,53,37,250,22,85,23,203,1,248,22,81,248,22,146,14,72,99,111, -108,108,101,99,116,115,45,100,105,114,23,204,1,28,193,249,22,71,195,194,192, -32,51,89,162,8,44,39,8,31,2,19,222,33,52,27,249,22,157,14,23,197, -2,23,198,2,28,23,193,2,87,94,23,196,1,27,248,22,96,23,195,2,27, -27,248,22,105,23,197,1,27,249,22,157,14,23,201,2,23,196,2,28,23,193, -2,87,94,23,194,1,27,248,22,96,23,195,2,27,27,248,22,105,23,197,1, -27,249,22,157,14,23,205,2,23,196,2,28,23,193,2,87,94,23,194,1,27, -248,22,96,23,195,2,27,27,248,22,105,23,197,1,27,249,22,157,14,23,209, -2,23,196,2,28,23,193,2,87,94,23,194,1,27,248,22,96,23,195,2,27, -27,248,22,105,23,197,1,27,249,22,157,14,23,213,2,23,196,2,28,23,193, -2,87,94,23,194,1,27,248,22,96,23,195,2,27,250,2,51,23,215,2,23, -216,1,248,22,105,23,199,1,28,249,22,165,7,23,196,2,2,29,249,22,85, -23,214,2,194,249,22,71,248,22,179,13,23,197,1,194,87,95,23,211,1,23, -193,1,28,249,22,165,7,23,196,2,2,29,249,22,85,23,212,2,9,249,22, -71,248,22,179,13,23,197,1,9,28,249,22,165,7,23,196,2,2,29,249,22, -85,23,210,2,194,249,22,71,248,22,179,13,23,197,1,194,87,94,23,193,1, -28,249,22,165,7,23,196,2,2,29,249,22,85,23,208,2,9,249,22,71,248, -22,179,13,23,197,1,9,28,249,22,165,7,23,196,2,2,29,249,22,85,23, -206,2,194,249,22,71,248,22,179,13,23,197,1,194,87,94,23,193,1,28,249, -22,165,7,23,196,2,2,29,249,22,85,23,204,2,9,249,22,71,248,22,179, -13,23,197,1,9,28,249,22,165,7,23,196,2,2,29,249,22,85,23,202,2, -194,249,22,71,248,22,179,13,23,197,1,194,87,94,23,193,1,28,249,22,165, -7,23,196,2,2,29,249,22,85,23,200,2,9,249,22,71,248,22,179,13,23, -197,1,9,28,249,22,165,7,23,196,2,2,29,249,22,85,197,194,87,94,23, -196,1,249,22,71,248,22,179,13,23,197,1,194,87,94,23,193,1,28,249,22, -165,7,23,198,2,2,29,249,22,85,195,9,87,94,23,194,1,249,22,71,248, -22,179,13,23,199,1,9,87,95,28,28,248,22,159,7,194,10,248,22,171,6, -194,12,250,22,147,9,2,14,6,21,21,98,121,116,101,32,115,116,114,105,110, -103,32,111,114,32,115,116,114,105,110,103,196,28,28,248,22,80,195,249,22,4, -22,170,13,196,11,12,250,22,147,9,2,14,6,13,13,108,105,115,116,32,111, -102,32,112,97,116,104,115,197,250,2,51,197,195,28,248,22,171,6,197,248,22, -182,7,197,196,32,54,89,162,8,44,39,53,70,102,111,117,110,100,45,101,120, -101,99,222,33,57,32,55,89,162,8,44,40,58,64,110,101,120,116,222,33,56, -27,248,22,132,14,23,196,2,28,249,22,179,8,23,195,2,23,197,1,11,28, -248,22,128,14,23,194,2,27,249,22,188,13,23,197,1,23,196,1,28,23,197, -2,91,159,39,11,90,161,39,36,11,248,22,191,13,23,197,2,87,95,23,195, -1,23,194,1,27,28,23,202,2,27,248,22,132,14,23,199,2,28,249,22,179, -8,23,195,2,23,200,2,11,28,248,22,128,14,23,194,2,250,2,54,23,205, -2,23,206,2,249,22,188,13,23,200,2,23,198,1,250,2,54,23,205,2,23, -206,2,23,196,1,11,28,23,193,2,192,87,94,23,193,1,27,28,248,22,170, -13,23,196,2,27,249,22,188,13,23,198,2,23,205,2,28,28,248,22,183,13, -193,10,248,22,182,13,193,192,11,11,28,23,193,2,192,87,94,23,193,1,28, -23,203,2,11,27,248,22,132,14,23,200,2,28,249,22,179,8,23,195,2,23, -201,1,11,28,248,22,128,14,23,194,2,250,2,54,23,206,1,23,207,1,249, -22,188,13,23,201,1,23,198,1,250,2,54,205,206,195,192,87,94,23,194,1, -28,23,196,2,91,159,39,11,90,161,39,36,11,248,22,191,13,23,197,2,87, -95,23,195,1,23,194,1,27,28,23,201,2,27,248,22,132,14,23,199,2,28, -249,22,179,8,23,195,2,23,200,2,11,28,248,22,128,14,23,194,2,250,2, -54,23,204,2,23,205,2,249,22,188,13,23,200,2,23,198,1,250,2,54,23, -204,2,23,205,2,23,196,1,11,28,23,193,2,192,87,94,23,193,1,27,28, -248,22,170,13,23,196,2,27,249,22,188,13,23,198,2,23,204,2,28,28,248, -22,183,13,193,10,248,22,182,13,193,192,11,11,28,23,193,2,192,87,94,23, -193,1,28,23,202,2,11,27,248,22,132,14,23,200,2,28,249,22,179,8,23, -195,2,23,201,1,11,28,248,22,128,14,23,194,2,250,2,54,23,205,1,23, -206,1,249,22,188,13,23,201,1,23,198,1,250,2,54,204,205,195,192,28,23, -193,2,91,159,39,11,90,161,39,36,11,248,22,191,13,23,199,2,87,95,23, -195,1,23,194,1,27,28,23,198,2,251,2,55,23,198,2,23,203,2,23,201, -2,23,202,2,11,28,23,193,2,192,87,94,23,193,1,27,28,248,22,170,13, -195,27,249,22,188,13,197,200,28,28,248,22,183,13,193,10,248,22,182,13,193, -192,11,11,28,192,192,28,198,11,251,2,55,198,203,201,202,194,32,58,89,162, -8,44,40,8,31,2,19,222,33,59,28,248,22,79,23,197,2,11,27,248,22, -131,14,248,22,72,23,199,2,27,249,22,188,13,23,196,1,23,197,2,28,248, -22,182,13,23,194,2,250,2,54,198,199,195,87,94,23,193,1,27,248,22,73, -23,200,1,28,248,22,79,23,194,2,11,27,248,22,131,14,248,22,72,23,196, +248,22,129,14,23,195,2,11,12,250,22,147,9,2,15,6,25,25,112,97,116, +104,32,111,114,32,115,116,114,105,110,103,32,40,115,97,110,115,32,110,117,108, +41,23,197,2,28,28,23,195,2,28,28,248,22,170,13,23,196,2,10,28,248, +22,171,6,23,196,2,28,248,22,128,14,23,196,2,10,248,22,129,14,23,196, +2,11,248,22,128,14,23,196,2,11,10,12,250,22,147,9,2,15,6,29,29, +35,102,32,111,114,32,114,101,108,97,116,105,118,101,32,112,97,116,104,32,111, +114,32,115,116,114,105,110,103,23,198,2,28,28,248,22,128,14,23,195,2,91, +159,39,11,90,161,39,36,11,248,22,191,13,23,198,2,249,22,177,8,194,68, +114,101,108,97,116,105,118,101,11,27,248,22,188,7,6,4,4,80,65,84,72, +27,28,23,194,2,27,249,80,159,41,48,38,23,197,1,9,28,249,22,177,8, +247,22,190,7,2,21,249,22,71,248,22,179,13,5,1,46,194,192,87,94,23, +194,1,9,28,248,22,79,23,194,2,11,27,248,22,131,14,248,22,72,23,196, 2,27,249,22,188,13,23,196,1,23,200,2,28,248,22,182,13,23,194,2,250, 2,54,201,202,195,87,94,23,193,1,27,248,22,73,23,197,1,28,248,22,79, 23,194,2,11,27,248,22,131,14,248,22,72,23,196,2,27,249,22,188,13,23, 196,1,23,203,2,28,248,22,182,13,23,194,2,250,2,54,204,205,195,87,94, 23,193,1,27,248,22,73,23,197,1,28,248,22,79,23,194,2,11,27,248,22, -131,14,248,22,72,23,196,2,27,249,22,188,13,23,196,1,23,206,2,28,248, -22,182,13,23,194,2,250,2,54,23,15,23,16,195,87,94,23,193,1,27,248, -22,73,23,197,1,28,248,22,79,23,194,2,11,27,248,22,131,14,248,22,72, -23,196,2,27,249,22,188,13,23,196,1,23,209,2,28,248,22,182,13,23,194, -2,250,2,54,23,18,23,19,195,87,94,23,193,1,27,248,22,73,23,197,1, -28,248,22,79,23,194,2,11,27,248,22,131,14,248,22,72,195,27,249,22,188, -13,23,196,1,23,19,28,248,22,182,13,193,250,2,54,23,21,23,22,195,251, -2,58,23,21,23,22,23,23,248,22,73,199,87,95,28,28,248,22,170,13,23, -195,2,10,28,248,22,171,6,23,195,2,28,248,22,128,14,23,195,2,10,248, -22,129,14,23,195,2,11,12,250,22,147,9,2,15,6,25,25,112,97,116,104, -32,111,114,32,115,116,114,105,110,103,32,40,115,97,110,115,32,110,117,108,41, -23,197,2,28,28,23,195,2,28,28,248,22,170,13,23,196,2,10,28,248,22, -171,6,23,196,2,28,248,22,128,14,23,196,2,10,248,22,129,14,23,196,2, -11,248,22,128,14,23,196,2,11,10,12,250,22,147,9,2,15,6,29,29,35, -102,32,111,114,32,114,101,108,97,116,105,118,101,32,112,97,116,104,32,111,114, -32,115,116,114,105,110,103,23,198,2,28,28,248,22,128,14,23,195,2,91,159, -39,11,90,161,39,36,11,248,22,191,13,23,198,2,249,22,177,8,194,68,114, -101,108,97,116,105,118,101,11,27,248,22,188,7,6,4,4,80,65,84,72,27, -28,23,194,2,27,249,80,159,41,48,38,23,197,1,9,28,249,22,177,8,247, -22,190,7,2,21,249,22,71,248,22,179,13,5,1,46,194,192,87,94,23,194, -1,9,28,248,22,79,23,194,2,11,27,248,22,131,14,248,22,72,23,196,2, -27,249,22,188,13,23,196,1,23,200,2,28,248,22,182,13,23,194,2,250,2, -54,201,202,195,87,94,23,193,1,27,248,22,73,23,197,1,28,248,22,79,23, -194,2,11,27,248,22,131,14,248,22,72,23,196,2,27,249,22,188,13,23,196, -1,23,203,2,28,248,22,182,13,23,194,2,250,2,54,204,205,195,87,94,23, -193,1,27,248,22,73,23,197,1,28,248,22,79,23,194,2,11,27,248,22,131, -14,248,22,72,195,27,249,22,188,13,23,196,1,205,28,248,22,182,13,193,250, -2,54,23,15,23,16,195,251,2,58,23,15,23,16,23,17,248,22,73,199,27, -248,22,131,14,23,196,1,28,248,22,182,13,193,250,2,54,198,199,195,11,250, -80,159,39,49,37,196,197,11,250,80,159,39,49,37,196,11,11,87,94,249,22, -162,6,247,22,134,5,195,248,22,188,5,249,22,180,3,36,249,22,164,3,197, -198,27,28,23,197,2,87,95,23,196,1,23,195,1,23,197,1,87,94,23,197, -1,27,248,22,146,14,2,20,27,249,80,159,41,49,37,23,196,1,11,27,27, -248,22,183,3,23,200,1,28,192,192,36,27,27,248,22,183,3,23,202,1,28, -192,192,36,249,22,165,5,23,197,1,83,158,40,20,100,95,89,162,8,44,36, -48,9,224,3,2,33,63,23,195,1,23,196,1,27,248,22,150,5,23,195,1, -248,80,159,39,54,37,193,159,36,20,105,159,36,16,1,11,16,0,83,158,42, -20,103,145,2,1,2,1,29,11,11,11,11,11,10,43,80,158,36,36,20,105, -159,38,16,17,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2, -10,2,11,2,12,2,13,2,14,2,15,2,16,30,2,18,1,20,112,97,114, -97,109,101,116,101,114,105,122,97,116,105,111,110,45,107,101,121,4,30,2,18, -1,23,101,120,116,101,110,100,45,112,97,114,97,109,101,116,101,114,105,122,97, -116,105,111,110,3,16,0,16,0,36,16,0,36,16,4,2,6,2,5,2,3, -2,9,40,11,11,39,36,11,11,11,16,11,2,8,2,7,2,16,2,15,2, -13,2,12,2,4,2,11,2,14,2,10,2,2,16,11,11,11,11,11,11,11, -11,11,11,11,11,16,11,2,8,2,7,2,16,2,15,2,13,2,12,2,4, -2,11,2,14,2,10,2,2,47,47,37,11,11,11,16,0,16,0,16,0,36, -36,11,11,11,11,16,0,16,0,16,0,36,36,16,0,16,17,83,158,36,16, -2,89,162,8,44,37,51,2,19,223,0,33,30,80,159,36,54,37,83,158,36, -16,2,89,162,8,44,37,56,2,19,223,0,33,31,80,159,36,53,37,83,158, -36,16,2,32,0,89,162,44,37,45,2,2,222,33,32,80,159,36,36,37,83, -158,36,16,2,249,22,173,6,7,92,7,92,80,159,36,37,37,83,158,36,16, -2,89,162,44,37,54,2,4,223,0,33,33,80,159,36,38,37,83,158,36,16, -2,32,0,89,162,8,44,38,50,2,5,222,33,34,80,159,36,39,37,83,158, -36,16,2,32,0,89,162,8,44,39,51,2,6,222,33,36,80,159,36,40,37, -83,158,36,16,2,32,0,89,162,8,45,38,50,2,7,222,33,40,80,159,36, -41,37,83,158,36,16,2,32,0,89,162,44,40,52,2,8,222,33,43,80,159, -36,42,37,83,158,36,16,2,32,0,89,162,44,39,50,2,9,222,33,44,80, -159,36,43,37,83,158,36,16,2,32,0,89,162,44,38,53,2,10,222,33,45, -80,159,36,44,37,83,158,36,16,2,32,0,89,162,44,38,54,2,11,222,33, -46,80,159,36,45,37,83,158,36,16,2,32,0,89,162,44,37,44,2,12,222, -33,47,80,159,36,46,37,83,158,36,16,2,83,158,39,20,99,96,2,13,89, -162,44,36,44,9,223,0,33,48,89,162,44,37,45,9,223,0,33,49,89,162, -44,38,55,9,223,0,33,50,80,159,36,47,37,83,158,36,16,2,27,248,22, -153,14,248,22,182,7,27,28,249,22,177,8,247,22,190,7,2,21,6,1,1, -59,6,1,1,58,250,22,155,7,6,14,14,40,91,94,126,97,93,42,41,126, -97,40,46,42,41,23,196,2,23,196,1,89,162,8,44,38,48,2,14,223,0, -33,53,80,159,36,48,37,83,158,36,16,2,83,158,39,20,99,96,2,15,89, -162,8,44,39,8,24,9,223,0,33,60,89,162,44,38,47,9,223,0,33,61, -89,162,44,37,46,9,223,0,33,62,80,159,36,49,37,83,158,36,16,2,89, -162,8,44,39,52,2,16,223,0,33,64,80,159,36,50,37,94,29,94,2,17, -68,35,37,107,101,114,110,101,108,11,29,94,2,17,69,35,37,109,105,110,45, -115,116,120,11,9,9,9,36,0}; - EVAL_ONE_SIZED_STR((char *)expr, 6245); +131,14,248,22,72,195,27,249,22,188,13,23,196,1,205,28,248,22,182,13,193, +250,2,54,23,15,23,16,195,251,2,58,23,15,23,16,23,17,248,22,73,199, +27,248,22,131,14,23,196,1,28,248,22,182,13,193,250,2,54,198,199,195,11, +250,80,159,39,49,37,196,197,11,250,80,159,39,49,37,196,11,11,87,94,249, +22,162,6,247,22,134,5,195,248,22,188,5,249,22,180,3,36,249,22,164,3, +197,198,27,28,23,197,2,87,95,23,196,1,23,195,1,23,197,1,87,94,23, +197,1,27,248,22,146,14,2,20,27,249,80,159,41,49,37,23,196,1,11,27, +27,248,22,183,3,23,200,1,28,192,192,36,27,27,248,22,183,3,23,202,1, +28,192,192,36,249,22,165,5,23,197,1,83,158,40,20,100,95,89,162,8,44, +36,48,9,224,3,2,33,63,23,195,1,23,196,1,27,248,22,150,5,23,195, +1,248,80,159,39,54,37,193,159,36,20,105,159,36,16,1,11,16,0,83,158, +42,20,103,145,2,1,2,1,29,11,11,11,11,11,10,43,80,158,36,36,20, +105,159,38,16,17,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9, +2,10,2,11,2,12,2,13,2,14,2,15,2,16,30,2,18,1,20,112,97, +114,97,109,101,116,101,114,105,122,97,116,105,111,110,45,107,101,121,4,30,2, +18,1,23,101,120,116,101,110,100,45,112,97,114,97,109,101,116,101,114,105,122, +97,116,105,111,110,3,16,0,16,0,36,16,0,36,16,4,2,6,2,5,2, +3,2,9,40,11,11,39,36,11,11,11,16,11,2,8,2,7,2,16,2,15, +2,13,2,12,2,4,2,11,2,14,2,10,2,2,16,11,11,11,11,11,11, +11,11,11,11,11,11,16,11,2,8,2,7,2,16,2,15,2,13,2,12,2, +4,2,11,2,14,2,10,2,2,47,47,37,11,11,11,16,0,16,0,16,0, +36,36,11,11,11,11,16,0,16,0,16,0,36,36,16,0,16,17,83,158,36, +16,2,89,162,8,44,37,51,2,19,223,0,33,30,80,159,36,54,37,83,158, +36,16,2,89,162,8,44,37,56,2,19,223,0,33,31,80,159,36,53,37,83, +158,36,16,2,32,0,89,162,44,37,45,2,2,222,33,32,80,159,36,36,37, +83,158,36,16,2,249,22,173,6,7,92,7,92,80,159,36,37,37,83,158,36, +16,2,89,162,44,37,54,2,4,223,0,33,33,80,159,36,38,37,83,158,36, +16,2,32,0,89,162,8,44,38,50,2,5,222,33,34,80,159,36,39,37,83, +158,36,16,2,32,0,89,162,8,44,39,51,2,6,222,33,36,80,159,36,40, +37,83,158,36,16,2,32,0,89,162,8,45,38,50,2,7,222,33,40,80,159, +36,41,37,83,158,36,16,2,32,0,89,162,44,40,52,2,8,222,33,43,80, +159,36,42,37,83,158,36,16,2,32,0,89,162,44,39,50,2,9,222,33,44, +80,159,36,43,37,83,158,36,16,2,32,0,89,162,44,38,53,2,10,222,33, +45,80,159,36,44,37,83,158,36,16,2,32,0,89,162,44,38,54,2,11,222, +33,46,80,159,36,45,37,83,158,36,16,2,32,0,89,162,44,37,44,2,12, +222,33,47,80,159,36,46,37,83,158,36,16,2,83,158,39,20,99,96,2,13, +89,162,44,36,44,9,223,0,33,48,89,162,44,37,45,9,223,0,33,49,89, +162,44,38,55,9,223,0,33,50,80,159,36,47,37,83,158,36,16,2,27,248, +22,153,14,248,22,182,7,27,28,249,22,177,8,247,22,190,7,2,21,6,1, +1,59,6,1,1,58,250,22,155,7,6,14,14,40,91,94,126,97,93,42,41, +126,97,40,46,42,41,23,196,2,23,196,1,89,162,8,44,38,48,2,14,223, +0,33,53,80,159,36,48,37,83,158,36,16,2,83,158,39,20,99,96,2,15, +89,162,8,44,39,8,24,9,223,0,33,60,89,162,44,38,47,9,223,0,33, +61,89,162,44,37,46,9,223,0,33,62,80,159,36,49,37,83,158,36,16,2, +89,162,8,44,39,52,2,16,223,0,33,64,80,159,36,50,37,94,29,94,2, +17,68,35,37,107,101,114,110,101,108,11,29,94,2,17,69,35,37,109,105,110, +45,115,116,120,11,9,9,9,36,0}; + EVAL_ONE_SIZED_STR((char *)expr, 6246); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,53,46,57,9,0,0,0,1,0,0,10,0,16,0, -29,0,44,0,58,0,72,0,86,0,128,0,0,0,57,1,0,0,69,35,37, -98,117,105,108,116,105,110,65,113,117,111,116,101,29,94,2,2,67,35,37,117, -116,105,108,115,11,29,94,2,2,69,35,37,110,101,116,119,111,114,107,11,29, -94,2,2,68,35,37,112,97,114,97,109,122,11,29,94,2,2,68,35,37,101, -120,112,111,98,115,11,29,94,2,2,68,35,37,107,101,114,110,101,108,11,97, -36,11,8,240,4,77,0,0,98,159,2,3,36,36,159,2,4,36,36,159,2, -5,36,36,159,2,6,36,36,159,2,7,36,36,159,2,7,36,36,16,0,159, -36,20,105,159,36,16,1,11,16,0,83,158,42,20,103,145,2,1,2,1,29, -11,11,11,11,11,18,96,11,44,44,44,36,80,158,36,36,20,105,159,36,16, -0,16,0,16,0,36,16,0,36,16,0,36,11,11,39,36,11,11,11,16,0, -16,0,16,0,36,36,37,11,11,11,16,0,16,0,16,0,36,36,11,11,11, -11,16,0,16,0,16,0,36,36,16,0,16,0,102,2,7,2,6,29,94,2, -2,69,35,37,102,111,114,101,105,103,110,11,29,94,2,2,68,35,37,117,110, -115,97,102,101,11,29,94,2,2,69,35,37,102,108,102,120,110,117,109,11,2, -5,2,4,2,3,29,94,2,2,67,35,37,112,108,97,99,101,11,29,94,2, -2,69,35,37,102,117,116,117,114,101,115,11,9,9,9,36,0}; - EVAL_ONE_SIZED_STR((char *)expr, 352); + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,52,46,50,46,53,46,49,48,9,0,0,0,1,0,0,10,0,16, +0,29,0,44,0,58,0,72,0,86,0,128,0,0,0,57,1,0,0,69,35, +37,98,117,105,108,116,105,110,65,113,117,111,116,101,29,94,2,2,67,35,37, +117,116,105,108,115,11,29,94,2,2,69,35,37,110,101,116,119,111,114,107,11, +29,94,2,2,68,35,37,112,97,114,97,109,122,11,29,94,2,2,68,35,37, +101,120,112,111,98,115,11,29,94,2,2,68,35,37,107,101,114,110,101,108,11, +97,36,11,8,240,215,77,0,0,98,159,2,3,36,36,159,2,4,36,36,159, +2,5,36,36,159,2,6,36,36,159,2,7,36,36,159,2,7,36,36,16,0, +159,36,20,105,159,36,16,1,11,16,0,83,158,42,20,103,145,2,1,2,1, +29,11,11,11,11,11,18,96,11,44,44,44,36,80,158,36,36,20,105,159,36, +16,0,16,0,16,0,36,16,0,36,16,0,36,11,11,39,36,11,11,11,16, +0,16,0,16,0,36,36,37,11,11,11,16,0,16,0,16,0,36,36,11,11, +11,11,16,0,16,0,16,0,36,36,16,0,16,0,102,2,7,2,6,29,94, +2,2,69,35,37,102,111,114,101,105,103,110,11,29,94,2,2,68,35,37,117, +110,115,97,102,101,11,29,94,2,2,69,35,37,102,108,102,120,110,117,109,11, +2,5,2,4,2,3,29,94,2,2,67,35,37,112,108,97,99,101,11,29,94, +2,2,69,35,37,102,117,116,117,114,101,115,11,9,9,9,36,0}; + EVAL_ONE_SIZED_STR((char *)expr, 353); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,53,46,57,74,0,0,0,1,0,0,7,0,18,0, -45,0,51,0,64,0,73,0,80,0,102,0,124,0,150,0,162,0,180,0,200, -0,212,0,228,0,251,0,7,1,38,1,45,1,50,1,55,1,60,1,65,1, -70,1,79,1,84,1,88,1,94,1,101,1,107,1,115,1,124,1,145,1,166, -1,196,1,226,1,27,2,84,2,132,2,180,2,97,8,116,8,129,8,31,9, -43,9,177,9,219,10,86,11,92,11,106,11,118,11,208,11,221,11,84,12,96, -12,186,12,199,12,62,13,89,13,102,13,114,13,204,13,217,13,80,14,93,14, -212,14,220,14,49,15,51,15,120,15,114,23,166,23,189,23,0,0,91,26,0, -0,66,35,37,98,111,111,116,70,100,108,108,45,115,117,102,102,105,120,1,25, -100,101,102,97,117,108,116,45,108,111,97,100,47,117,115,101,45,99,111,109,112, -105,108,101,100,65,113,117,111,116,101,29,94,2,4,67,35,37,117,116,105,108, -115,11,68,35,37,112,97,114,97,109,122,29,94,2,4,2,6,11,1,20,112, -97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,45,107,101,121,1,20, -100,101,102,97,117,108,116,45,114,101,97,100,101,114,45,103,117,97,114,100,1, -24,45,109,111,100,117,108,101,45,104,97,115,104,45,116,97,98,108,101,45,116, -97,98,108,101,71,45,112,97,116,104,45,99,97,99,104,101,77,45,108,111,97, -100,105,110,103,45,102,105,108,101,110,97,109,101,79,45,108,111,97,100,105,110, -103,45,112,114,111,109,112,116,45,116,97,103,71,45,112,114,101,118,45,114,101, -108,116,111,75,45,112,114,101,118,45,114,101,108,116,111,45,100,105,114,1,21, -115,112,108,105,116,45,114,101,108,97,116,105,118,101,45,115,116,114,105,110,103, -71,111,114,105,103,45,112,97,114,97,109,122,1,29,115,116,97,110,100,97,114, -100,45,109,111,100,117,108,101,45,110,97,109,101,45,114,101,115,111,108,118,101, -114,29,94,2,4,2,6,11,64,98,111,111,116,64,115,101,97,108,64,115,97, -109,101,5,3,46,122,111,5,3,46,122,111,6,6,6,110,97,116,105,118,101, -64,108,111,111,112,63,108,105,98,6,3,3,46,115,115,6,4,4,46,114,107, -116,5,4,46,114,107,116,67,105,103,110,111,114,101,100,249,22,14,195,80,159, -38,46,38,250,22,188,13,23,197,1,23,199,1,249,80,159,43,39,38,23,198, -1,2,23,250,22,188,13,23,197,1,23,199,1,249,80,159,43,39,38,23,198, -1,2,24,252,22,188,13,23,199,1,23,201,1,2,25,247,22,191,7,249,80, -159,45,39,38,23,200,1,80,159,45,36,38,252,22,188,13,23,199,1,23,201, -1,2,25,247,22,191,7,249,80,159,45,39,38,23,200,1,80,159,45,36,38, -27,252,22,188,13,23,200,1,23,202,1,2,25,247,22,191,7,249,80,159,46, -39,38,23,201,1,80,159,46,36,38,27,250,22,141,14,196,11,32,0,89,162, -8,44,36,41,9,222,11,28,192,249,22,71,195,194,11,27,252,22,188,13,23, -200,1,23,202,1,2,25,247,22,191,7,249,80,159,46,39,38,23,201,1,80, -159,46,36,38,27,250,22,141,14,196,11,32,0,89,162,8,44,36,41,9,222, -11,28,192,249,22,71,195,194,11,27,250,22,188,13,23,198,1,23,200,1,249, -80,159,44,39,38,23,199,1,2,23,27,250,22,141,14,196,11,32,0,89,162, -8,44,36,41,9,222,11,28,192,249,22,71,195,194,11,27,250,22,188,13,23, -198,1,23,200,1,249,80,159,44,39,38,23,199,1,2,24,27,250,22,141,14, -196,11,32,0,89,162,8,44,36,41,9,222,11,28,192,249,22,71,195,194,11, -87,94,28,248,80,159,37,38,38,23,195,2,12,250,22,147,9,77,108,111,97, -100,47,117,115,101,45,99,111,109,112,105,108,101,100,6,25,25,112,97,116,104, -32,111,114,32,118,97,108,105,100,45,112,97,116,104,32,115,116,114,105,110,103, -23,197,2,91,159,46,11,90,161,37,36,11,28,248,22,130,14,23,205,2,23, -204,2,27,247,22,139,5,28,23,193,2,249,22,131,14,23,207,2,23,195,1, -23,205,2,90,161,39,37,11,248,22,191,13,23,205,1,87,94,23,196,1,90, -161,38,40,11,28,23,205,2,27,248,22,175,13,23,197,2,27,248,22,162,7, -23,195,2,28,28,249,22,176,3,23,195,2,40,249,22,165,7,5,4,46,114, -107,116,249,22,168,7,23,198,2,249,22,164,3,23,199,2,40,11,249,22,7, -23,199,2,248,22,179,13,249,22,169,7,250,22,168,7,23,202,1,36,249,22, -164,3,23,203,1,40,5,3,46,115,115,249,22,7,23,199,2,11,249,22,7, -23,197,2,11,90,161,37,42,11,28,249,22,177,8,23,199,2,23,197,2,23, -193,2,249,22,188,13,23,196,2,23,199,2,90,161,37,43,11,28,23,198,2, -28,249,22,177,8,23,200,2,23,197,1,23,193,1,87,94,23,193,1,249,22, -188,13,23,196,2,23,200,2,87,94,23,195,1,11,90,161,37,44,11,28,249, -22,177,8,23,196,2,68,114,101,108,97,116,105,118,101,87,94,23,194,1,2, -22,23,194,1,90,161,37,45,11,247,22,149,14,27,27,250,22,141,14,23,204, -2,11,32,0,89,162,8,44,36,41,9,222,11,28,192,249,22,71,23,203,2, -194,11,27,28,23,202,2,28,23,194,2,11,27,250,22,141,14,23,206,2,11, -32,0,89,162,8,44,36,41,9,222,11,28,192,249,22,71,23,205,2,194,11, -11,27,28,23,195,2,23,195,2,23,194,2,27,89,162,44,37,50,62,122,111, -225,14,12,8,33,33,27,89,162,44,37,50,66,97,108,116,45,122,111,225,15, -13,10,33,34,27,89,162,44,37,52,9,225,16,14,10,33,35,27,89,162,44, -37,52,9,225,17,15,12,33,36,27,28,23,200,2,23,200,2,248,22,175,8, -23,200,2,27,28,23,207,2,28,23,200,2,87,94,23,201,1,23,200,2,248, -22,175,8,23,202,1,11,27,28,23,195,2,28,23,197,1,27,249,22,5,89, -162,8,44,37,53,9,225,23,21,17,33,37,23,215,2,27,28,23,202,2,11, -193,28,192,192,28,193,28,23,202,2,28,249,22,176,3,248,22,73,196,248,22, -73,23,205,2,193,11,11,11,11,87,94,23,197,1,11,28,23,193,2,87,105, -23,212,1,23,210,1,23,209,1,23,208,1,23,207,1,23,201,1,23,200,1, -23,199,1,23,198,1,23,196,1,23,195,1,23,194,1,20,14,159,80,159,56, -40,38,250,80,159,59,41,38,249,22,27,11,80,159,8,25,40,38,22,163,4, -11,20,14,159,80,159,56,40,38,250,80,159,59,41,38,249,22,27,11,80,159, -8,25,40,38,22,139,5,28,248,22,170,13,23,215,2,23,214,1,87,94,23, -214,1,247,22,147,14,249,247,22,152,14,248,22,72,195,23,24,87,94,23,193, -1,27,28,23,195,2,28,23,197,1,27,249,22,5,89,162,8,44,37,53,9, -225,24,22,19,33,38,23,216,2,27,28,23,204,2,11,193,28,192,192,28,193, -28,203,28,249,22,176,3,248,22,73,196,248,22,73,206,193,11,11,11,11,87, -94,23,197,1,11,28,23,193,2,87,102,23,213,1,23,210,1,23,209,1,23, -208,1,23,201,1,23,200,1,23,199,1,23,196,1,23,195,1,20,14,159,80, -159,57,40,38,250,80,159,8,24,41,38,249,22,27,11,80,159,8,26,40,38, -22,163,4,23,214,1,20,14,159,80,159,57,40,38,250,80,159,8,24,41,38, -249,22,27,11,80,159,8,26,40,38,22,139,5,28,248,22,170,13,23,216,2, -23,215,1,87,94,23,215,1,247,22,147,14,249,247,22,152,14,248,22,72,195, -23,25,87,94,23,193,1,27,28,23,197,2,28,23,201,1,27,249,22,5,83, -158,40,20,100,94,89,162,8,44,37,51,9,225,25,23,19,33,39,23,212,1, -23,217,2,27,28,23,204,2,11,193,28,192,192,28,193,28,23,204,2,28,249, -22,176,3,248,22,73,196,248,22,73,23,207,2,193,11,11,11,87,94,23,209, -1,11,87,94,23,201,1,11,28,23,193,2,87,101,23,214,1,23,212,1,23, -211,1,23,210,1,23,202,1,23,200,1,23,197,1,23,196,1,20,14,159,80, -159,58,40,38,250,80,159,8,25,41,38,249,22,27,11,80,159,8,27,40,38, -22,163,4,11,20,14,159,80,159,58,40,38,250,80,159,8,25,41,38,249,22, -27,11,80,159,8,27,40,38,22,139,5,28,248,22,170,13,23,217,2,23,216, -1,87,94,23,216,1,247,22,147,14,249,247,22,137,5,248,22,72,195,23,26, -87,94,23,193,1,27,28,23,197,1,28,23,201,1,27,249,22,5,83,158,40, -20,100,94,89,162,8,44,37,51,9,225,26,24,21,33,40,23,214,1,23,218, -1,27,28,23,205,2,11,193,28,192,192,28,193,28,204,28,249,22,176,3,248, -22,73,196,248,22,73,23,15,193,11,11,11,87,95,23,215,1,23,211,1,11, -87,94,23,201,1,11,28,23,193,2,87,95,23,212,1,23,198,1,20,14,159, -80,159,59,40,38,250,80,159,8,26,41,38,249,22,27,11,80,159,8,28,40, -38,22,163,4,23,216,1,20,14,159,80,159,59,40,38,250,80,159,8,26,41, -38,249,22,27,11,80,159,8,28,40,38,22,139,5,28,248,22,170,13,23,218, -2,23,217,1,87,94,23,217,1,247,22,147,14,249,247,22,137,5,248,22,72, -195,23,27,87,94,23,193,1,27,28,23,199,2,87,94,23,214,1,23,213,1, -87,94,23,213,1,23,214,1,20,14,159,80,159,8,24,40,38,250,80,159,8, -27,41,38,249,22,27,11,80,159,8,29,40,38,22,163,4,28,23,29,28,23, -202,1,11,195,87,94,23,202,1,11,20,14,159,80,159,8,24,40,38,250,80, -159,8,27,41,38,249,22,27,11,80,159,8,29,40,38,22,139,5,28,248,22, -170,13,23,219,2,23,218,1,87,94,23,218,1,247,22,147,14,249,247,22,137, -5,194,23,28,0,17,35,114,120,34,94,40,46,42,63,41,47,40,46,42,41, -36,34,32,43,89,162,8,44,37,59,2,26,222,33,44,27,249,22,157,14,2, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,52,46,50,46,53,46,49,48,74,0,0,0,1,0,0,7,0,18, +0,45,0,51,0,64,0,73,0,80,0,102,0,124,0,150,0,162,0,180,0, +200,0,212,0,228,0,251,0,7,1,38,1,45,1,50,1,55,1,60,1,65, +1,70,1,79,1,84,1,88,1,94,1,101,1,107,1,115,1,124,1,145,1, +166,1,196,1,226,1,27,2,84,2,132,2,180,2,97,8,116,8,129,8,31, +9,43,9,177,9,219,10,86,11,92,11,106,11,118,11,208,11,221,11,84,12, +96,12,186,12,199,12,62,13,89,13,102,13,114,13,204,13,217,13,80,14,93, +14,212,14,220,14,49,15,51,15,120,15,114,23,166,23,189,23,0,0,91,26, +0,0,66,35,37,98,111,111,116,70,100,108,108,45,115,117,102,102,105,120,1, +25,100,101,102,97,117,108,116,45,108,111,97,100,47,117,115,101,45,99,111,109, +112,105,108,101,100,65,113,117,111,116,101,29,94,2,4,67,35,37,117,116,105, +108,115,11,68,35,37,112,97,114,97,109,122,29,94,2,4,2,6,11,1,20, +112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,45,107,101,121,1, +20,100,101,102,97,117,108,116,45,114,101,97,100,101,114,45,103,117,97,114,100, +1,24,45,109,111,100,117,108,101,45,104,97,115,104,45,116,97,98,108,101,45, +116,97,98,108,101,71,45,112,97,116,104,45,99,97,99,104,101,77,45,108,111, +97,100,105,110,103,45,102,105,108,101,110,97,109,101,79,45,108,111,97,100,105, +110,103,45,112,114,111,109,112,116,45,116,97,103,71,45,112,114,101,118,45,114, +101,108,116,111,75,45,112,114,101,118,45,114,101,108,116,111,45,100,105,114,1, +21,115,112,108,105,116,45,114,101,108,97,116,105,118,101,45,115,116,114,105,110, +103,71,111,114,105,103,45,112,97,114,97,109,122,1,29,115,116,97,110,100,97, +114,100,45,109,111,100,117,108,101,45,110,97,109,101,45,114,101,115,111,108,118, +101,114,29,94,2,4,2,6,11,64,98,111,111,116,64,115,101,97,108,64,115, +97,109,101,5,3,46,122,111,5,3,46,122,111,6,6,6,110,97,116,105,118, +101,64,108,111,111,112,63,108,105,98,6,3,3,46,115,115,6,4,4,46,114, +107,116,5,4,46,114,107,116,67,105,103,110,111,114,101,100,249,22,14,195,80, +159,38,46,38,250,22,188,13,23,197,1,23,199,1,249,80,159,43,39,38,23, +198,1,2,23,250,22,188,13,23,197,1,23,199,1,249,80,159,43,39,38,23, +198,1,2,24,252,22,188,13,23,199,1,23,201,1,2,25,247,22,191,7,249, +80,159,45,39,38,23,200,1,80,159,45,36,38,252,22,188,13,23,199,1,23, +201,1,2,25,247,22,191,7,249,80,159,45,39,38,23,200,1,80,159,45,36, +38,27,252,22,188,13,23,200,1,23,202,1,2,25,247,22,191,7,249,80,159, +46,39,38,23,201,1,80,159,46,36,38,27,250,22,141,14,196,11,32,0,89, +162,8,44,36,41,9,222,11,28,192,249,22,71,195,194,11,27,252,22,188,13, +23,200,1,23,202,1,2,25,247,22,191,7,249,80,159,46,39,38,23,201,1, +80,159,46,36,38,27,250,22,141,14,196,11,32,0,89,162,8,44,36,41,9, +222,11,28,192,249,22,71,195,194,11,27,250,22,188,13,23,198,1,23,200,1, +249,80,159,44,39,38,23,199,1,2,23,27,250,22,141,14,196,11,32,0,89, +162,8,44,36,41,9,222,11,28,192,249,22,71,195,194,11,27,250,22,188,13, +23,198,1,23,200,1,249,80,159,44,39,38,23,199,1,2,24,27,250,22,141, +14,196,11,32,0,89,162,8,44,36,41,9,222,11,28,192,249,22,71,195,194, +11,87,94,28,248,80,159,37,38,38,23,195,2,12,250,22,147,9,77,108,111, +97,100,47,117,115,101,45,99,111,109,112,105,108,101,100,6,25,25,112,97,116, +104,32,111,114,32,118,97,108,105,100,45,112,97,116,104,32,115,116,114,105,110, +103,23,197,2,91,159,46,11,90,161,37,36,11,28,248,22,130,14,23,205,2, +23,204,2,27,247,22,139,5,28,23,193,2,249,22,131,14,23,207,2,23,195, +1,23,205,2,90,161,39,37,11,248,22,191,13,23,205,1,87,94,23,196,1, +90,161,38,40,11,28,23,205,2,27,248,22,175,13,23,197,2,27,248,22,162, +7,23,195,2,28,28,249,22,176,3,23,195,2,40,249,22,165,7,5,4,46, +114,107,116,249,22,168,7,23,198,2,249,22,164,3,23,199,2,40,11,249,22, +7,23,199,2,248,22,179,13,249,22,169,7,250,22,168,7,23,202,1,36,249, +22,164,3,23,203,1,40,5,3,46,115,115,249,22,7,23,199,2,11,249,22, +7,23,197,2,11,90,161,37,42,11,28,249,22,177,8,23,199,2,23,197,2, +23,193,2,249,22,188,13,23,196,2,23,199,2,90,161,37,43,11,28,23,198, +2,28,249,22,177,8,23,200,2,23,197,1,23,193,1,87,94,23,193,1,249, +22,188,13,23,196,2,23,200,2,87,94,23,195,1,11,90,161,37,44,11,28, +249,22,177,8,23,196,2,68,114,101,108,97,116,105,118,101,87,94,23,194,1, +2,22,23,194,1,90,161,37,45,11,247,22,149,14,27,27,250,22,141,14,23, +204,2,11,32,0,89,162,8,44,36,41,9,222,11,28,192,249,22,71,23,203, +2,194,11,27,28,23,202,2,28,23,194,2,11,27,250,22,141,14,23,206,2, +11,32,0,89,162,8,44,36,41,9,222,11,28,192,249,22,71,23,205,2,194, +11,11,27,28,23,195,2,23,195,2,23,194,2,27,89,162,44,37,50,62,122, +111,225,14,12,8,33,33,27,89,162,44,37,50,66,97,108,116,45,122,111,225, +15,13,10,33,34,27,89,162,44,37,52,9,225,16,14,10,33,35,27,89,162, +44,37,52,9,225,17,15,12,33,36,27,28,23,200,2,23,200,2,248,22,175, +8,23,200,2,27,28,23,207,2,28,23,200,2,87,94,23,201,1,23,200,2, +248,22,175,8,23,202,1,11,27,28,23,195,2,28,23,197,1,27,249,22,5, +89,162,8,44,37,53,9,225,23,21,17,33,37,23,215,2,27,28,23,202,2, +11,193,28,192,192,28,193,28,23,202,2,28,249,22,176,3,248,22,73,196,248, +22,73,23,205,2,193,11,11,11,11,87,94,23,197,1,11,28,23,193,2,87, +105,23,212,1,23,210,1,23,209,1,23,208,1,23,207,1,23,201,1,23,200, +1,23,199,1,23,198,1,23,196,1,23,195,1,23,194,1,20,14,159,80,159, +56,40,38,250,80,159,59,41,38,249,22,27,11,80,159,8,25,40,38,22,163, +4,11,20,14,159,80,159,56,40,38,250,80,159,59,41,38,249,22,27,11,80, +159,8,25,40,38,22,139,5,28,248,22,170,13,23,215,2,23,214,1,87,94, +23,214,1,247,22,147,14,249,247,22,152,14,248,22,72,195,23,24,87,94,23, +193,1,27,28,23,195,2,28,23,197,1,27,249,22,5,89,162,8,44,37,53, +9,225,24,22,19,33,38,23,216,2,27,28,23,204,2,11,193,28,192,192,28, +193,28,203,28,249,22,176,3,248,22,73,196,248,22,73,206,193,11,11,11,11, +87,94,23,197,1,11,28,23,193,2,87,102,23,213,1,23,210,1,23,209,1, +23,208,1,23,201,1,23,200,1,23,199,1,23,196,1,23,195,1,20,14,159, +80,159,57,40,38,250,80,159,8,24,41,38,249,22,27,11,80,159,8,26,40, +38,22,163,4,23,214,1,20,14,159,80,159,57,40,38,250,80,159,8,24,41, +38,249,22,27,11,80,159,8,26,40,38,22,139,5,28,248,22,170,13,23,216, +2,23,215,1,87,94,23,215,1,247,22,147,14,249,247,22,152,14,248,22,72, +195,23,25,87,94,23,193,1,27,28,23,197,2,28,23,201,1,27,249,22,5, +83,158,40,20,100,94,89,162,8,44,37,51,9,225,25,23,19,33,39,23,212, +1,23,217,2,27,28,23,204,2,11,193,28,192,192,28,193,28,23,204,2,28, +249,22,176,3,248,22,73,196,248,22,73,23,207,2,193,11,11,11,87,94,23, +209,1,11,87,94,23,201,1,11,28,23,193,2,87,101,23,214,1,23,212,1, +23,211,1,23,210,1,23,202,1,23,200,1,23,197,1,23,196,1,20,14,159, +80,159,58,40,38,250,80,159,8,25,41,38,249,22,27,11,80,159,8,27,40, +38,22,163,4,11,20,14,159,80,159,58,40,38,250,80,159,8,25,41,38,249, +22,27,11,80,159,8,27,40,38,22,139,5,28,248,22,170,13,23,217,2,23, +216,1,87,94,23,216,1,247,22,147,14,249,247,22,137,5,248,22,72,195,23, +26,87,94,23,193,1,27,28,23,197,1,28,23,201,1,27,249,22,5,83,158, +40,20,100,94,89,162,8,44,37,51,9,225,26,24,21,33,40,23,214,1,23, +218,1,27,28,23,205,2,11,193,28,192,192,28,193,28,204,28,249,22,176,3, +248,22,73,196,248,22,73,23,15,193,11,11,11,87,95,23,215,1,23,211,1, +11,87,94,23,201,1,11,28,23,193,2,87,95,23,212,1,23,198,1,20,14, +159,80,159,59,40,38,250,80,159,8,26,41,38,249,22,27,11,80,159,8,28, +40,38,22,163,4,23,216,1,20,14,159,80,159,59,40,38,250,80,159,8,26, +41,38,249,22,27,11,80,159,8,28,40,38,22,139,5,28,248,22,170,13,23, +218,2,23,217,1,87,94,23,217,1,247,22,147,14,249,247,22,137,5,248,22, +72,195,23,27,87,94,23,193,1,27,28,23,199,2,87,94,23,214,1,23,213, +1,87,94,23,213,1,23,214,1,20,14,159,80,159,8,24,40,38,250,80,159, +8,27,41,38,249,22,27,11,80,159,8,29,40,38,22,163,4,28,23,29,28, +23,202,1,11,195,87,94,23,202,1,11,20,14,159,80,159,8,24,40,38,250, +80,159,8,27,41,38,249,22,27,11,80,159,8,29,40,38,22,139,5,28,248, +22,170,13,23,219,2,23,218,1,87,94,23,218,1,247,22,147,14,249,247,22, +137,5,194,23,28,0,17,35,114,120,34,94,40,46,42,63,41,47,40,46,42, +41,36,34,32,43,89,162,8,44,37,59,2,26,222,33,44,27,249,22,157,14, +2,42,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23, +196,2,27,248,22,105,23,197,1,27,249,22,157,14,2,42,23,196,2,28,23, +193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,27,248,22,105,23, +197,1,27,249,22,157,14,2,42,23,196,2,28,23,193,2,87,94,23,194,1, +249,22,71,248,22,96,23,196,2,27,248,22,105,23,197,1,27,249,22,157,14, +2,42,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23, +196,2,248,2,43,248,22,105,23,197,1,248,22,81,194,248,22,81,194,248,22, +81,194,248,22,81,194,32,45,89,162,44,37,55,2,26,222,33,46,28,248,22, +79,248,22,73,23,195,2,249,22,7,9,248,22,72,195,91,159,38,11,90,161, +38,36,11,27,248,22,73,196,28,248,22,79,248,22,73,23,195,2,249,22,7, +9,248,22,72,195,91,159,38,11,90,161,38,36,11,27,248,22,73,196,28,248, +22,79,248,22,73,23,195,2,249,22,7,9,248,22,72,195,91,159,38,11,90, +161,38,36,11,248,2,45,248,22,73,196,249,22,7,249,22,71,248,22,72,199, +196,195,249,22,7,249,22,71,248,22,72,199,196,195,249,22,7,249,22,71,248, +22,72,199,196,195,27,27,249,22,157,14,2,42,23,197,2,28,23,193,2,87, +94,23,195,1,249,22,71,248,22,96,23,196,2,27,248,22,105,23,197,1,27, +249,22,157,14,2,42,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71, +248,22,96,23,196,2,27,248,22,105,23,197,1,27,249,22,157,14,2,42,23, +196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,27, +248,22,105,23,197,1,27,249,22,157,14,2,42,23,196,2,28,23,193,2,87, +94,23,194,1,249,22,71,248,22,96,23,196,2,248,2,43,248,22,105,23,197, +1,248,22,81,194,248,22,81,194,248,22,81,194,248,22,81,195,28,23,195,1, +192,28,248,22,79,248,22,73,23,195,2,249,22,7,9,248,22,72,195,91,159, +38,11,90,161,38,36,11,27,248,22,73,196,28,248,22,79,248,22,73,23,195, +2,249,22,7,9,248,22,72,195,91,159,38,11,90,161,38,36,11,27,248,22, +73,196,28,248,22,79,248,22,73,23,195,2,249,22,7,9,248,22,72,195,91, +159,38,11,90,161,38,36,11,248,2,45,248,22,73,196,249,22,7,249,22,71, +248,22,72,199,196,195,249,22,7,249,22,71,248,22,72,199,196,195,249,22,7, +249,22,71,248,22,72,199,196,195,87,95,28,248,22,181,4,195,12,250,22,147, +9,2,18,6,20,20,114,101,115,111,108,118,101,100,45,109,111,100,117,108,101, +45,112,97,116,104,197,28,24,193,2,248,24,194,1,195,87,94,23,193,1,12, +27,27,250,22,146,2,80,159,42,43,38,248,22,182,14,247,22,150,12,11,28, +23,193,2,192,87,94,23,193,1,27,247,22,130,2,87,94,250,22,144,2,80, +159,43,43,38,248,22,182,14,247,22,150,12,195,192,250,22,144,2,195,198,66, +97,116,116,97,99,104,251,211,197,198,199,10,28,192,250,22,146,9,11,196,195, +248,22,144,9,194,32,51,89,162,44,37,52,2,26,222,33,52,28,248,22,79, +248,22,73,23,195,2,249,22,7,9,248,22,72,195,91,159,38,11,90,161,38, +36,11,27,248,22,73,196,28,248,22,79,248,22,73,23,195,2,249,22,7,9, +248,22,72,195,91,159,38,11,90,161,38,36,11,248,2,51,248,22,73,196,249, +22,7,249,22,71,248,22,72,199,196,195,249,22,7,249,22,71,248,22,72,199, +196,195,32,53,89,162,8,44,37,55,2,26,222,33,54,27,249,22,157,14,2, 42,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196, 2,27,248,22,105,23,197,1,27,249,22,157,14,2,42,23,196,2,28,23,193, 2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,27,248,22,105,23,197, 1,27,249,22,157,14,2,42,23,196,2,28,23,193,2,87,94,23,194,1,249, -22,71,248,22,96,23,196,2,27,248,22,105,23,197,1,27,249,22,157,14,2, -42,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196, -2,248,2,43,248,22,105,23,197,1,248,22,81,194,248,22,81,194,248,22,81, -194,248,22,81,194,32,45,89,162,44,37,55,2,26,222,33,46,28,248,22,79, -248,22,73,23,195,2,249,22,7,9,248,22,72,195,91,159,38,11,90,161,38, -36,11,27,248,22,73,196,28,248,22,79,248,22,73,23,195,2,249,22,7,9, -248,22,72,195,91,159,38,11,90,161,38,36,11,27,248,22,73,196,28,248,22, -79,248,22,73,23,195,2,249,22,7,9,248,22,72,195,91,159,38,11,90,161, -38,36,11,248,2,45,248,22,73,196,249,22,7,249,22,71,248,22,72,199,196, -195,249,22,7,249,22,71,248,22,72,199,196,195,249,22,7,249,22,71,248,22, -72,199,196,195,27,27,249,22,157,14,2,42,23,197,2,28,23,193,2,87,94, -23,195,1,249,22,71,248,22,96,23,196,2,27,248,22,105,23,197,1,27,249, -22,157,14,2,42,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248, -22,96,23,196,2,27,248,22,105,23,197,1,27,249,22,157,14,2,42,23,196, -2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,27,248, -22,105,23,197,1,27,249,22,157,14,2,42,23,196,2,28,23,193,2,87,94, -23,194,1,249,22,71,248,22,96,23,196,2,248,2,43,248,22,105,23,197,1, -248,22,81,194,248,22,81,194,248,22,81,194,248,22,81,195,28,23,195,1,192, -28,248,22,79,248,22,73,23,195,2,249,22,7,9,248,22,72,195,91,159,38, -11,90,161,38,36,11,27,248,22,73,196,28,248,22,79,248,22,73,23,195,2, -249,22,7,9,248,22,72,195,91,159,38,11,90,161,38,36,11,27,248,22,73, -196,28,248,22,79,248,22,73,23,195,2,249,22,7,9,248,22,72,195,91,159, -38,11,90,161,38,36,11,248,2,45,248,22,73,196,249,22,7,249,22,71,248, -22,72,199,196,195,249,22,7,249,22,71,248,22,72,199,196,195,249,22,7,249, -22,71,248,22,72,199,196,195,87,95,28,248,22,181,4,195,12,250,22,147,9, -2,18,6,20,20,114,101,115,111,108,118,101,100,45,109,111,100,117,108,101,45, -112,97,116,104,197,28,24,193,2,248,24,194,1,195,87,94,23,193,1,12,27, -27,250,22,146,2,80,159,42,43,38,248,22,177,14,247,22,150,12,11,28,23, -193,2,192,87,94,23,193,1,27,247,22,130,2,87,94,250,22,144,2,80,159, -43,43,38,248,22,177,14,247,22,150,12,195,192,250,22,144,2,195,198,66,97, -116,116,97,99,104,251,211,197,198,199,10,28,192,250,22,146,9,11,196,195,248, -22,144,9,194,32,51,89,162,44,37,52,2,26,222,33,52,28,248,22,79,248, -22,73,23,195,2,249,22,7,9,248,22,72,195,91,159,38,11,90,161,38,36, -11,27,248,22,73,196,28,248,22,79,248,22,73,23,195,2,249,22,7,9,248, -22,72,195,91,159,38,11,90,161,38,36,11,248,2,51,248,22,73,196,249,22, -7,249,22,71,248,22,72,199,196,195,249,22,7,249,22,71,248,22,72,199,196, -195,32,53,89,162,8,44,37,55,2,26,222,33,54,27,249,22,157,14,2,42, -23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2, -27,248,22,105,23,197,1,27,249,22,157,14,2,42,23,196,2,28,23,193,2, -87,94,23,194,1,249,22,71,248,22,96,23,196,2,27,248,22,105,23,197,1, -27,249,22,157,14,2,42,23,196,2,28,23,193,2,87,94,23,194,1,249,22, -71,248,22,96,23,196,2,248,2,53,248,22,105,23,197,1,248,22,81,194,248, -22,81,194,248,22,81,194,32,55,89,162,44,37,52,2,26,222,33,56,28,248, -22,79,248,22,73,23,195,2,249,22,7,9,248,22,72,195,91,159,38,11,90, -161,38,36,11,27,248,22,73,196,28,248,22,79,248,22,73,23,195,2,249,22, -7,9,248,22,72,195,91,159,38,11,90,161,38,36,11,248,2,55,248,22,73, -196,249,22,7,249,22,71,248,22,72,199,196,195,249,22,7,249,22,71,248,22, -72,199,196,195,32,57,89,162,8,44,37,55,2,26,222,33,58,27,249,22,157, -14,2,42,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96, -23,196,2,27,248,22,105,23,197,1,27,249,22,157,14,2,42,23,196,2,28, -23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,27,248,22,105, -23,197,1,27,249,22,157,14,2,42,23,196,2,28,23,193,2,87,94,23,194, -1,249,22,71,248,22,96,23,196,2,248,2,57,248,22,105,23,197,1,248,22, -81,194,248,22,81,194,248,22,81,194,28,249,22,177,6,194,6,1,1,46,2, -22,28,249,22,177,6,194,6,2,2,46,46,62,117,112,192,0,11,35,114,120, -34,91,46,93,115,115,36,34,32,61,89,162,44,37,52,2,26,222,33,62,28, +22,71,248,22,96,23,196,2,248,2,53,248,22,105,23,197,1,248,22,81,194, +248,22,81,194,248,22,81,194,32,55,89,162,44,37,52,2,26,222,33,56,28, 248,22,79,248,22,73,23,195,2,249,22,7,9,248,22,72,195,91,159,38,11, 90,161,38,36,11,27,248,22,73,196,28,248,22,79,248,22,73,23,195,2,249, -22,7,9,248,22,72,195,91,159,38,11,90,161,38,36,11,248,2,61,248,22, +22,7,9,248,22,72,195,91,159,38,11,90,161,38,36,11,248,2,55,248,22, 73,196,249,22,7,249,22,71,248,22,72,199,196,195,249,22,7,249,22,71,248, -22,72,199,196,195,32,63,89,162,8,44,37,55,2,26,222,33,64,27,249,22, +22,72,199,196,195,32,57,89,162,8,44,37,55,2,26,222,33,58,27,249,22, 157,14,2,42,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22, 96,23,196,2,27,248,22,105,23,197,1,27,249,22,157,14,2,42,23,196,2, 28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,27,248,22, 105,23,197,1,27,249,22,157,14,2,42,23,196,2,28,23,193,2,87,94,23, -194,1,249,22,71,248,22,96,23,196,2,248,2,63,248,22,105,23,197,1,248, -22,81,194,248,22,81,194,248,22,81,194,32,65,89,162,8,44,37,55,2,26, -222,33,66,27,249,22,157,14,2,42,23,196,2,28,23,193,2,87,94,23,194, -1,249,22,71,248,22,96,23,196,2,27,248,22,105,23,197,1,27,249,22,157, -14,2,42,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96, -23,196,2,27,248,22,105,23,197,1,27,249,22,157,14,2,42,23,196,2,28, -23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,248,2,65,248, -22,105,23,197,1,248,22,81,194,248,22,81,194,248,22,81,194,27,248,2,65, -23,195,1,192,28,249,22,179,8,248,22,73,23,200,2,23,197,1,28,249,22, -177,8,248,22,72,23,200,2,23,196,1,251,22,144,9,2,18,6,26,26,99, -121,99,108,101,32,105,110,32,108,111,97,100,105,110,103,32,97,116,32,126,101, -58,32,126,101,23,200,1,249,22,2,22,73,248,22,86,249,22,71,23,206,1, -23,202,1,12,12,247,192,20,14,159,80,159,40,45,38,249,22,71,248,22,177, -14,247,22,150,12,23,197,1,20,14,159,80,159,40,40,38,250,80,159,43,41, -38,249,22,27,11,80,159,45,40,38,22,162,4,23,196,1,249,247,22,138,5, -23,198,1,248,22,59,248,22,174,13,23,198,1,87,94,28,28,248,22,170,13, -23,196,2,10,248,22,189,4,23,196,2,12,28,23,197,2,250,22,146,9,11, -6,15,15,98,97,100,32,109,111,100,117,108,101,32,112,97,116,104,23,200,2, -250,22,147,9,2,18,6,19,19,109,111,100,117,108,101,45,112,97,116,104,32, -111,114,32,112,97,116,104,23,198,2,28,28,248,22,69,23,196,2,249,22,177, -8,248,22,72,23,198,2,2,4,11,248,22,182,4,248,22,96,196,28,28,248, -22,69,23,196,2,249,22,177,8,248,22,72,23,198,2,66,112,108,97,110,101, -116,11,87,94,28,207,12,20,14,159,80,159,37,52,38,80,158,37,50,90,161, -37,36,10,249,22,164,4,21,94,2,27,6,19,19,112,108,97,110,101,116,47, -114,101,115,111,108,118,101,114,46,114,107,116,1,27,112,108,97,110,101,116,45, -109,111,100,117,108,101,45,110,97,109,101,45,114,101,115,111,108,118,101,114,12, -252,212,199,200,201,202,80,158,42,50,87,94,23,193,1,27,89,162,8,44,37, -46,79,115,104,111,119,45,99,111,108,108,101,99,116,105,111,110,45,101,114,114, -223,5,33,50,27,28,248,22,56,23,198,2,27,250,22,146,2,80,159,43,44, -38,249,22,71,23,203,2,247,22,148,14,11,28,23,193,2,192,87,94,23,193, -1,91,159,38,11,90,161,38,36,11,27,248,22,62,23,202,2,248,2,51,248, -2,53,23,195,1,27,251,80,159,47,54,38,2,18,23,202,1,28,248,22,79, -23,199,2,23,199,2,248,22,72,23,199,2,28,248,22,79,23,199,2,9,248, -22,73,23,199,2,249,22,188,13,23,195,1,28,248,22,79,23,197,1,87,94, -23,197,1,6,8,8,109,97,105,110,46,114,107,116,249,22,130,7,23,199,1, -6,4,4,46,114,107,116,28,248,22,171,6,23,198,2,87,94,23,194,1,27, -27,28,23,200,2,28,249,22,177,8,23,202,2,80,158,43,47,80,158,41,48, -27,248,22,183,4,23,202,2,28,248,22,170,13,23,194,2,91,159,39,11,90, -161,39,36,11,248,22,191,13,23,197,1,87,95,83,160,38,11,80,158,45,47, -23,204,2,83,160,38,11,80,158,45,48,192,192,11,11,28,23,193,2,192,87, -94,23,193,1,27,247,22,139,5,28,23,193,2,192,87,94,23,193,1,247,22, -147,14,27,250,22,146,2,80,159,44,44,38,249,22,71,23,204,2,23,199,2, -11,28,23,193,2,192,87,94,23,193,1,91,159,38,11,90,161,38,36,11,248, -2,55,248,2,57,23,203,2,250,22,1,22,188,13,23,199,1,249,22,85,249, -22,2,32,0,89,162,8,44,37,44,9,222,33,59,23,200,1,248,22,81,27, -248,22,174,6,23,202,2,28,249,22,176,3,194,39,28,249,22,177,6,2,28, -249,22,129,7,204,249,22,164,3,198,39,249,22,130,7,250,22,129,7,205,36, -249,22,164,3,199,39,2,29,200,200,28,248,22,170,13,23,198,2,87,94,23, -194,1,28,248,22,129,14,23,198,2,91,159,39,11,90,161,39,36,11,248,22, -191,13,23,201,2,87,95,23,195,1,23,193,1,28,249,22,157,14,2,60,248, -22,175,13,23,197,1,249,80,159,44,53,38,23,202,2,2,30,23,200,2,248, -22,81,6,26,26,32,40,97,32,112,97,116,104,32,109,117,115,116,32,98,101, -32,97,98,115,111,108,117,116,101,41,28,249,22,177,8,248,22,72,23,200,2, -2,27,27,250,22,146,2,80,159,43,44,38,249,22,71,23,203,2,247,22,148, -14,11,28,23,193,2,192,87,94,23,193,1,91,159,39,11,90,161,38,36,11, -27,248,22,96,23,203,2,248,2,61,248,2,63,23,195,1,90,161,37,38,11, -28,248,22,79,248,22,98,23,203,2,28,248,22,79,23,194,2,249,22,159,14, -0,8,35,114,120,34,91,46,93,34,23,196,2,11,10,27,27,28,23,197,2, -249,22,85,28,248,22,79,248,22,98,23,207,2,21,93,6,5,5,109,122,108, -105,98,249,22,1,22,85,249,22,2,32,0,89,162,8,44,37,44,9,222,33, -67,248,22,98,23,210,2,23,197,2,28,248,22,79,23,196,2,248,22,81,23, -197,2,23,195,2,251,80,159,49,54,38,2,18,23,204,1,248,22,72,23,198, -2,248,22,73,23,198,1,249,22,188,13,23,195,1,28,23,198,1,87,94,23, -196,1,27,248,22,174,6,23,199,2,28,249,22,176,3,194,39,28,249,22,177, -6,2,28,249,22,129,7,201,249,22,164,3,198,39,249,22,130,7,250,22,129, -7,202,36,249,22,164,3,199,39,2,29,197,197,28,248,22,79,23,197,1,87, -94,23,197,1,6,8,8,109,97,105,110,46,114,107,116,28,249,22,159,14,0, -8,35,114,120,34,91,46,93,34,23,199,2,27,248,22,174,6,23,199,2,28, -249,22,176,3,194,39,28,249,22,177,6,2,28,249,22,129,7,201,249,22,164, -3,198,39,249,22,130,7,250,22,129,7,202,36,249,22,164,3,199,39,2,29, -197,197,249,22,130,7,23,199,1,6,4,4,46,114,107,116,28,249,22,177,8, -248,22,72,23,200,2,64,102,105,108,101,27,249,22,131,14,248,22,135,14,248, -22,96,23,202,2,27,28,23,202,2,28,249,22,177,8,23,204,2,80,158,45, -47,80,158,43,48,27,248,22,183,4,23,204,2,28,248,22,170,13,23,194,2, -91,159,39,11,90,161,39,36,11,248,22,191,13,23,197,1,87,95,83,160,38, -11,80,158,47,47,23,206,2,83,160,38,11,80,158,47,48,192,192,11,11,28, -23,193,2,192,87,94,23,193,1,27,247,22,139,5,28,23,193,2,192,87,94, -23,193,1,247,22,147,14,91,159,39,11,90,161,39,36,11,248,22,191,13,23, -197,2,87,95,23,195,1,23,193,1,28,249,22,157,14,2,60,248,22,175,13, -23,197,1,249,80,159,45,53,38,23,198,1,2,30,195,12,87,94,28,28,248, -22,170,13,23,194,2,10,248,22,129,8,23,194,2,87,94,23,199,1,12,28, -23,199,2,250,22,146,9,67,114,101,113,117,105,114,101,249,22,155,7,6,17, -17,98,97,100,32,109,111,100,117,108,101,32,112,97,116,104,126,97,28,23,198, -2,248,22,72,23,199,2,6,0,0,23,202,1,87,94,23,199,1,250,22,147, -9,2,18,249,22,155,7,6,13,13,109,111,100,117,108,101,32,112,97,116,104, -126,97,28,23,198,2,248,22,72,23,199,2,6,0,0,23,200,2,27,28,248, -22,129,8,23,195,2,249,22,134,8,23,196,2,36,249,22,133,14,248,22,134, -14,23,197,2,11,27,28,248,22,129,8,23,196,2,249,22,134,8,23,197,2, -37,248,80,159,42,55,38,23,195,2,91,159,39,11,90,161,39,36,11,28,248, -22,129,8,23,199,2,250,22,7,2,31,249,22,134,8,23,203,2,38,2,31, -248,22,191,13,23,198,2,87,95,23,195,1,23,193,1,27,28,248,22,129,8, -23,200,2,249,22,134,8,23,201,2,39,249,80,159,47,53,38,23,197,2,5, -0,27,28,248,22,129,8,23,201,2,249,22,134,8,23,202,2,40,248,22,182, -4,23,200,2,27,27,250,22,146,2,80,159,51,43,38,248,22,177,14,247,22, -150,12,11,28,23,193,2,192,87,94,23,193,1,27,247,22,130,2,87,94,250, -22,144,2,80,159,52,43,38,248,22,177,14,247,22,150,12,195,192,87,95,28, -23,208,1,27,250,22,146,2,23,197,2,197,11,28,23,193,1,12,87,95,27, -27,28,248,22,17,80,159,51,46,38,80,159,50,46,38,247,22,19,250,22,25, -248,22,23,23,197,2,80,159,53,45,38,23,196,1,27,248,22,177,14,247,22, -150,12,249,22,3,83,158,40,20,100,94,89,162,8,44,37,55,9,226,12,11, -2,3,33,68,23,195,1,23,196,1,248,28,248,22,17,80,159,50,46,38,32, -0,89,162,44,37,42,9,222,33,69,80,159,49,59,37,89,162,44,36,51,9, -227,13,9,8,4,3,33,70,250,22,144,2,23,197,1,197,10,12,28,28,248, -22,129,8,23,202,1,11,28,248,22,171,6,23,206,2,10,28,248,22,56,23, -206,2,10,28,248,22,69,23,206,2,249,22,177,8,248,22,72,23,208,2,2, -27,11,250,22,144,2,80,159,50,44,38,28,248,22,171,6,23,209,2,249,22, -71,23,210,1,27,28,23,212,2,28,249,22,177,8,23,214,2,80,158,55,47, -87,94,23,212,1,80,158,53,48,27,248,22,183,4,23,214,2,28,248,22,170, -13,23,194,2,91,159,39,11,90,161,39,36,11,248,22,191,13,23,197,1,87, -95,83,160,38,11,80,158,57,47,23,23,83,160,38,11,80,158,57,48,192,192, -11,11,28,23,193,2,192,87,94,23,193,1,27,247,22,139,5,28,23,193,2, -192,87,94,23,193,1,247,22,147,14,249,22,71,23,210,1,247,22,148,14,252, -22,131,8,23,208,1,23,207,1,23,205,1,23,203,1,201,12,193,87,96,83, -160,38,11,80,158,36,50,248,80,159,37,58,38,249,22,27,11,80,159,39,52, -38,248,22,161,4,80,159,37,51,38,248,22,138,5,80,159,37,37,37,248,22, -141,13,80,159,37,42,37,83,160,38,11,80,158,36,50,248,80,159,37,58,38, -249,22,27,11,80,159,39,52,38,159,36,20,105,159,36,16,1,11,16,0,83, -158,42,20,103,145,2,1,2,1,29,11,11,11,11,11,10,38,80,158,36,36, -20,105,159,37,16,23,2,2,2,3,30,2,5,72,112,97,116,104,45,115,116, -114,105,110,103,63,10,30,2,5,75,112,97,116,104,45,97,100,100,45,115,117, -102,102,105,120,7,30,2,7,2,8,4,30,2,7,1,23,101,120,116,101,110, -100,45,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,3,2,9, -2,10,2,11,2,12,2,13,2,14,2,15,2,16,2,17,2,18,30,2,19, -2,8,4,30,2,5,79,112,97,116,104,45,114,101,112,108,97,99,101,45,115, -117,102,102,105,120,9,30,2,5,69,45,102,105,110,100,45,99,111,108,0,30, -2,5,76,110,111,114,109,97,108,45,99,97,115,101,45,112,97,116,104,6,2, -20,2,21,30,2,19,74,114,101,112,97,114,97,109,101,116,101,114,105,122,101, -5,16,0,16,0,36,16,0,36,16,12,2,12,2,13,2,10,2,11,2,14, -2,15,2,3,2,9,2,2,2,17,2,16,2,18,48,11,11,39,36,11,11, -11,16,2,2,20,2,21,16,2,11,11,16,2,2,20,2,21,38,38,37,11, -11,11,16,0,16,0,16,0,36,36,11,11,11,11,16,0,16,0,16,0,36, -36,16,0,16,15,83,158,36,16,2,89,162,44,37,45,9,223,0,33,32,80, -159,36,59,37,83,158,36,16,2,248,22,190,7,69,115,111,45,115,117,102,102, -105,120,80,159,36,36,37,83,158,36,16,2,89,162,44,38,8,37,2,3,223, -0,33,41,80,159,36,37,37,83,158,36,16,2,32,0,89,162,8,44,37,42, -2,9,222,192,80,159,36,42,37,83,158,36,16,2,247,22,133,2,80,159,36, -43,37,83,158,36,16,2,247,22,132,2,80,159,36,44,37,83,158,36,16,2, -247,22,67,80,159,36,45,37,83,158,36,16,2,248,22,18,74,109,111,100,117, -108,101,45,108,111,97,100,105,110,103,80,159,36,46,37,83,158,36,16,2,11, -80,158,36,47,83,158,36,16,2,11,80,158,36,48,83,158,36,16,2,32,0, -89,162,44,38,8,25,2,16,222,33,47,80,159,36,49,37,83,158,36,16,2, -11,80,158,36,50,83,158,36,16,2,91,159,38,10,90,161,37,36,10,11,90, -161,37,37,10,83,158,39,20,99,96,2,18,89,162,8,44,37,51,9,224,2, -0,33,48,89,162,44,39,49,9,223,1,33,49,89,162,44,40,8,32,9,224, -2,0,33,71,208,80,159,36,51,37,83,158,36,16,2,89,162,44,36,45,2, -20,223,0,33,72,80,159,36,56,37,83,158,36,16,2,89,162,8,44,36,45, -2,21,223,0,33,73,80,159,36,57,37,96,29,94,2,4,68,35,37,107,101, -114,110,101,108,11,29,94,2,4,69,35,37,109,105,110,45,115,116,120,11,2, -5,2,19,9,9,9,36,0}; - EVAL_ONE_SIZED_STR((char *)expr, 6916); +194,1,249,22,71,248,22,96,23,196,2,248,2,57,248,22,105,23,197,1,248, +22,81,194,248,22,81,194,248,22,81,194,28,249,22,177,6,194,6,1,1,46, +2,22,28,249,22,177,6,194,6,2,2,46,46,62,117,112,192,0,11,35,114, +120,34,91,46,93,115,115,36,34,32,61,89,162,44,37,52,2,26,222,33,62, +28,248,22,79,248,22,73,23,195,2,249,22,7,9,248,22,72,195,91,159,38, +11,90,161,38,36,11,27,248,22,73,196,28,248,22,79,248,22,73,23,195,2, +249,22,7,9,248,22,72,195,91,159,38,11,90,161,38,36,11,248,2,61,248, +22,73,196,249,22,7,249,22,71,248,22,72,199,196,195,249,22,7,249,22,71, +248,22,72,199,196,195,32,63,89,162,8,44,37,55,2,26,222,33,64,27,249, +22,157,14,2,42,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248, +22,96,23,196,2,27,248,22,105,23,197,1,27,249,22,157,14,2,42,23,196, +2,28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,27,248, +22,105,23,197,1,27,249,22,157,14,2,42,23,196,2,28,23,193,2,87,94, +23,194,1,249,22,71,248,22,96,23,196,2,248,2,63,248,22,105,23,197,1, +248,22,81,194,248,22,81,194,248,22,81,194,32,65,89,162,8,44,37,55,2, +26,222,33,66,27,249,22,157,14,2,42,23,196,2,28,23,193,2,87,94,23, +194,1,249,22,71,248,22,96,23,196,2,27,248,22,105,23,197,1,27,249,22, +157,14,2,42,23,196,2,28,23,193,2,87,94,23,194,1,249,22,71,248,22, +96,23,196,2,27,248,22,105,23,197,1,27,249,22,157,14,2,42,23,196,2, +28,23,193,2,87,94,23,194,1,249,22,71,248,22,96,23,196,2,248,2,65, +248,22,105,23,197,1,248,22,81,194,248,22,81,194,248,22,81,194,27,248,2, +65,23,195,1,192,28,249,22,179,8,248,22,73,23,200,2,23,197,1,28,249, +22,177,8,248,22,72,23,200,2,23,196,1,251,22,144,9,2,18,6,26,26, +99,121,99,108,101,32,105,110,32,108,111,97,100,105,110,103,32,97,116,32,126, +101,58,32,126,101,23,200,1,249,22,2,22,73,248,22,86,249,22,71,23,206, +1,23,202,1,12,12,247,192,20,14,159,80,159,40,45,38,249,22,71,248,22, +182,14,247,22,150,12,23,197,1,20,14,159,80,159,40,40,38,250,80,159,43, +41,38,249,22,27,11,80,159,45,40,38,22,162,4,23,196,1,249,247,22,138, +5,23,198,1,248,22,59,248,22,174,13,23,198,1,87,94,28,28,248,22,170, +13,23,196,2,10,248,22,189,4,23,196,2,12,28,23,197,2,250,22,146,9, +11,6,15,15,98,97,100,32,109,111,100,117,108,101,32,112,97,116,104,23,200, +2,250,22,147,9,2,18,6,19,19,109,111,100,117,108,101,45,112,97,116,104, +32,111,114,32,112,97,116,104,23,198,2,28,28,248,22,69,23,196,2,249,22, +177,8,248,22,72,23,198,2,2,4,11,248,22,182,4,248,22,96,196,28,28, +248,22,69,23,196,2,249,22,177,8,248,22,72,23,198,2,66,112,108,97,110, +101,116,11,87,94,28,207,12,20,14,159,80,159,37,52,38,80,158,37,50,90, +161,37,36,10,249,22,164,4,21,94,2,27,6,19,19,112,108,97,110,101,116, +47,114,101,115,111,108,118,101,114,46,114,107,116,1,27,112,108,97,110,101,116, +45,109,111,100,117,108,101,45,110,97,109,101,45,114,101,115,111,108,118,101,114, +12,252,212,199,200,201,202,80,158,42,50,87,94,23,193,1,27,89,162,8,44, +37,46,79,115,104,111,119,45,99,111,108,108,101,99,116,105,111,110,45,101,114, +114,223,5,33,50,27,28,248,22,56,23,198,2,27,250,22,146,2,80,159,43, +44,38,249,22,71,23,203,2,247,22,148,14,11,28,23,193,2,192,87,94,23, +193,1,91,159,38,11,90,161,38,36,11,27,248,22,62,23,202,2,248,2,51, +248,2,53,23,195,1,27,251,80,159,47,54,38,2,18,23,202,1,28,248,22, +79,23,199,2,23,199,2,248,22,72,23,199,2,28,248,22,79,23,199,2,9, +248,22,73,23,199,2,249,22,188,13,23,195,1,28,248,22,79,23,197,1,87, +94,23,197,1,6,8,8,109,97,105,110,46,114,107,116,249,22,130,7,23,199, +1,6,4,4,46,114,107,116,28,248,22,171,6,23,198,2,87,94,23,194,1, +27,27,28,23,200,2,28,249,22,177,8,23,202,2,80,158,43,47,80,158,41, +48,27,248,22,183,4,23,202,2,28,248,22,170,13,23,194,2,91,159,39,11, +90,161,39,36,11,248,22,191,13,23,197,1,87,95,83,160,38,11,80,158,45, +47,23,204,2,83,160,38,11,80,158,45,48,192,192,11,11,28,23,193,2,192, +87,94,23,193,1,27,247,22,139,5,28,23,193,2,192,87,94,23,193,1,247, +22,147,14,27,250,22,146,2,80,159,44,44,38,249,22,71,23,204,2,23,199, +2,11,28,23,193,2,192,87,94,23,193,1,91,159,38,11,90,161,38,36,11, +248,2,55,248,2,57,23,203,2,250,22,1,22,188,13,23,199,1,249,22,85, +249,22,2,32,0,89,162,8,44,37,44,9,222,33,59,23,200,1,248,22,81, +27,248,22,174,6,23,202,2,28,249,22,176,3,194,39,28,249,22,177,6,2, +28,249,22,129,7,204,249,22,164,3,198,39,249,22,130,7,250,22,129,7,205, +36,249,22,164,3,199,39,2,29,200,200,28,248,22,170,13,23,198,2,87,94, +23,194,1,28,248,22,129,14,23,198,2,91,159,39,11,90,161,39,36,11,248, +22,191,13,23,201,2,87,95,23,195,1,23,193,1,28,249,22,157,14,2,60, +248,22,175,13,23,197,1,249,80,159,44,53,38,23,202,2,2,30,23,200,2, +248,22,81,6,26,26,32,40,97,32,112,97,116,104,32,109,117,115,116,32,98, +101,32,97,98,115,111,108,117,116,101,41,28,249,22,177,8,248,22,72,23,200, +2,2,27,27,250,22,146,2,80,159,43,44,38,249,22,71,23,203,2,247,22, +148,14,11,28,23,193,2,192,87,94,23,193,1,91,159,39,11,90,161,38,36, +11,27,248,22,96,23,203,2,248,2,61,248,2,63,23,195,1,90,161,37,38, +11,28,248,22,79,248,22,98,23,203,2,28,248,22,79,23,194,2,249,22,161, +14,0,8,35,114,120,34,91,46,93,34,23,196,2,11,10,27,27,28,23,197, +2,249,22,85,28,248,22,79,248,22,98,23,207,2,21,93,6,5,5,109,122, +108,105,98,249,22,1,22,85,249,22,2,32,0,89,162,8,44,37,44,9,222, +33,67,248,22,98,23,210,2,23,197,2,28,248,22,79,23,196,2,248,22,81, +23,197,2,23,195,2,251,80,159,49,54,38,2,18,23,204,1,248,22,72,23, +198,2,248,22,73,23,198,1,249,22,188,13,23,195,1,28,23,198,1,87,94, +23,196,1,27,248,22,174,6,23,199,2,28,249,22,176,3,194,39,28,249,22, +177,6,2,28,249,22,129,7,201,249,22,164,3,198,39,249,22,130,7,250,22, +129,7,202,36,249,22,164,3,199,39,2,29,197,197,28,248,22,79,23,197,1, +87,94,23,197,1,6,8,8,109,97,105,110,46,114,107,116,28,249,22,161,14, +0,8,35,114,120,34,91,46,93,34,23,199,2,27,248,22,174,6,23,199,2, +28,249,22,176,3,194,39,28,249,22,177,6,2,28,249,22,129,7,201,249,22, +164,3,198,39,249,22,130,7,250,22,129,7,202,36,249,22,164,3,199,39,2, +29,197,197,249,22,130,7,23,199,1,6,4,4,46,114,107,116,28,249,22,177, +8,248,22,72,23,200,2,64,102,105,108,101,27,249,22,131,14,248,22,135,14, +248,22,96,23,202,2,27,28,23,202,2,28,249,22,177,8,23,204,2,80,158, +45,47,80,158,43,48,27,248,22,183,4,23,204,2,28,248,22,170,13,23,194, +2,91,159,39,11,90,161,39,36,11,248,22,191,13,23,197,1,87,95,83,160, +38,11,80,158,47,47,23,206,2,83,160,38,11,80,158,47,48,192,192,11,11, +28,23,193,2,192,87,94,23,193,1,27,247,22,139,5,28,23,193,2,192,87, +94,23,193,1,247,22,147,14,91,159,39,11,90,161,39,36,11,248,22,191,13, +23,197,2,87,95,23,195,1,23,193,1,28,249,22,157,14,2,60,248,22,175, +13,23,197,1,249,80,159,45,53,38,23,198,1,2,30,195,12,87,94,28,28, +248,22,170,13,23,194,2,10,248,22,129,8,23,194,2,87,94,23,199,1,12, +28,23,199,2,250,22,146,9,67,114,101,113,117,105,114,101,249,22,155,7,6, +17,17,98,97,100,32,109,111,100,117,108,101,32,112,97,116,104,126,97,28,23, +198,2,248,22,72,23,199,2,6,0,0,23,202,1,87,94,23,199,1,250,22, +147,9,2,18,249,22,155,7,6,13,13,109,111,100,117,108,101,32,112,97,116, +104,126,97,28,23,198,2,248,22,72,23,199,2,6,0,0,23,200,2,27,28, +248,22,129,8,23,195,2,249,22,134,8,23,196,2,36,249,22,133,14,248,22, +134,14,23,197,2,11,27,28,248,22,129,8,23,196,2,249,22,134,8,23,197, +2,37,248,80,159,42,55,38,23,195,2,91,159,39,11,90,161,39,36,11,28, +248,22,129,8,23,199,2,250,22,7,2,31,249,22,134,8,23,203,2,38,2, +31,248,22,191,13,23,198,2,87,95,23,195,1,23,193,1,27,28,248,22,129, +8,23,200,2,249,22,134,8,23,201,2,39,249,80,159,47,53,38,23,197,2, +5,0,27,28,248,22,129,8,23,201,2,249,22,134,8,23,202,2,40,248,22, +182,4,23,200,2,27,27,250,22,146,2,80,159,51,43,38,248,22,182,14,247, +22,150,12,11,28,23,193,2,192,87,94,23,193,1,27,247,22,130,2,87,94, +250,22,144,2,80,159,52,43,38,248,22,182,14,247,22,150,12,195,192,87,95, +28,23,208,1,27,250,22,146,2,23,197,2,197,11,28,23,193,1,12,87,95, +27,27,28,248,22,17,80,159,51,46,38,80,159,50,46,38,247,22,19,250,22, +25,248,22,23,23,197,2,80,159,53,45,38,23,196,1,27,248,22,182,14,247, +22,150,12,249,22,3,83,158,40,20,100,94,89,162,8,44,37,55,9,226,12, +11,2,3,33,68,23,195,1,23,196,1,248,28,248,22,17,80,159,50,46,38, +32,0,89,162,44,37,42,9,222,33,69,80,159,49,59,37,89,162,44,36,51, +9,227,13,9,8,4,3,33,70,250,22,144,2,23,197,1,197,10,12,28,28, +248,22,129,8,23,202,1,11,28,248,22,171,6,23,206,2,10,28,248,22,56, +23,206,2,10,28,248,22,69,23,206,2,249,22,177,8,248,22,72,23,208,2, +2,27,11,250,22,144,2,80,159,50,44,38,28,248,22,171,6,23,209,2,249, +22,71,23,210,1,27,28,23,212,2,28,249,22,177,8,23,214,2,80,158,55, +47,87,94,23,212,1,80,158,53,48,27,248,22,183,4,23,214,2,28,248,22, +170,13,23,194,2,91,159,39,11,90,161,39,36,11,248,22,191,13,23,197,1, +87,95,83,160,38,11,80,158,57,47,23,23,83,160,38,11,80,158,57,48,192, +192,11,11,28,23,193,2,192,87,94,23,193,1,27,247,22,139,5,28,23,193, +2,192,87,94,23,193,1,247,22,147,14,249,22,71,23,210,1,247,22,148,14, +252,22,131,8,23,208,1,23,207,1,23,205,1,23,203,1,201,12,193,87,96, +83,160,38,11,80,158,36,50,248,80,159,37,58,38,249,22,27,11,80,159,39, +52,38,248,22,161,4,80,159,37,51,38,248,22,138,5,80,159,37,37,37,248, +22,141,13,80,159,37,42,37,83,160,38,11,80,158,36,50,248,80,159,37,58, +38,249,22,27,11,80,159,39,52,38,159,36,20,105,159,36,16,1,11,16,0, +83,158,42,20,103,145,2,1,2,1,29,11,11,11,11,11,10,38,80,158,36, +36,20,105,159,37,16,23,2,2,2,3,30,2,5,72,112,97,116,104,45,115, +116,114,105,110,103,63,10,30,2,5,75,112,97,116,104,45,97,100,100,45,115, +117,102,102,105,120,7,30,2,7,2,8,4,30,2,7,1,23,101,120,116,101, +110,100,45,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,3,2, +9,2,10,2,11,2,12,2,13,2,14,2,15,2,16,2,17,2,18,30,2, +19,2,8,4,30,2,5,79,112,97,116,104,45,114,101,112,108,97,99,101,45, +115,117,102,102,105,120,9,30,2,5,69,45,102,105,110,100,45,99,111,108,0, +30,2,5,76,110,111,114,109,97,108,45,99,97,115,101,45,112,97,116,104,6, +2,20,2,21,30,2,19,74,114,101,112,97,114,97,109,101,116,101,114,105,122, +101,5,16,0,16,0,36,16,0,36,16,12,2,12,2,13,2,10,2,11,2, +14,2,15,2,3,2,9,2,2,2,17,2,16,2,18,48,11,11,39,36,11, +11,11,16,2,2,20,2,21,16,2,11,11,16,2,2,20,2,21,38,38,37, +11,11,11,16,0,16,0,16,0,36,36,11,11,11,11,16,0,16,0,16,0, +36,36,16,0,16,15,83,158,36,16,2,89,162,44,37,45,9,223,0,33,32, +80,159,36,59,37,83,158,36,16,2,248,22,190,7,69,115,111,45,115,117,102, +102,105,120,80,159,36,36,37,83,158,36,16,2,89,162,44,38,8,37,2,3, +223,0,33,41,80,159,36,37,37,83,158,36,16,2,32,0,89,162,8,44,37, +42,2,9,222,192,80,159,36,42,37,83,158,36,16,2,247,22,133,2,80,159, +36,43,37,83,158,36,16,2,247,22,132,2,80,159,36,44,37,83,158,36,16, +2,247,22,67,80,159,36,45,37,83,158,36,16,2,248,22,18,74,109,111,100, +117,108,101,45,108,111,97,100,105,110,103,80,159,36,46,37,83,158,36,16,2, +11,80,158,36,47,83,158,36,16,2,11,80,158,36,48,83,158,36,16,2,32, +0,89,162,44,38,8,25,2,16,222,33,47,80,159,36,49,37,83,158,36,16, +2,11,80,158,36,50,83,158,36,16,2,91,159,38,10,90,161,37,36,10,11, +90,161,37,37,10,83,158,39,20,99,96,2,18,89,162,8,44,37,51,9,224, +2,0,33,48,89,162,44,39,49,9,223,1,33,49,89,162,44,40,8,32,9, +224,2,0,33,71,208,80,159,36,51,37,83,158,36,16,2,89,162,44,36,45, +2,20,223,0,33,72,80,159,36,56,37,83,158,36,16,2,89,162,8,44,36, +45,2,21,223,0,33,73,80,159,36,57,37,96,29,94,2,4,68,35,37,107, +101,114,110,101,108,11,29,94,2,4,69,35,37,109,105,110,45,115,116,120,11, +2,5,2,19,9,9,9,36,0}; + EVAL_ONE_SIZED_STR((char *)expr, 6917); } diff --git a/src/mzscheme/src/mzmark.c b/src/mzscheme/src/mzmark.c index 94783888fd..62c5bc76d0 100644 --- a/src/mzscheme/src/mzmark.c +++ b/src/mzscheme/src/mzmark.c @@ -5130,6 +5130,7 @@ static int mark_regwork_MARK(void *p, struct NewGC *gc) { gcMARK2(r->endp, gc); gcMARK2(r->counters, gc); gcMARK2(r->peekskip, gc); + gcMARK2(r->prefix, gc); return gcBYTES_TO_WORDS(sizeof(Regwork)); } @@ -5145,6 +5146,7 @@ static int mark_regwork_FIXUP(void *p, struct NewGC *gc) { gcFIXUP2(r->endp, gc); gcFIXUP2(r->counters, gc); gcFIXUP2(r->peekskip, gc); + gcFIXUP2(r->prefix, gc); return gcBYTES_TO_WORDS(sizeof(Regwork)); } diff --git a/src/mzscheme/src/mzmarksrc.c b/src/mzscheme/src/mzmarksrc.c index 88304881b8..d7e8bce23f 100644 --- a/src/mzscheme/src/mzmarksrc.c +++ b/src/mzscheme/src/mzmarksrc.c @@ -2101,6 +2101,7 @@ mark_regwork { gcMARK2(r->endp, gc); gcMARK2(r->counters, gc); gcMARK2(r->peekskip, gc); + gcMARK2(r->prefix, gc); size: gcBYTES_TO_WORDS(sizeof(Regwork)); } diff --git a/src/mzscheme/src/regexp.c b/src/mzscheme/src/regexp.c index 56d50cad81..1fff57d150 100644 --- a/src/mzscheme/src/regexp.c +++ b/src/mzscheme/src/regexp.c @@ -84,6 +84,7 @@ THREAD_LOCAL_DECL(static rxpos regcode) ; /* Code-emit pointer, if less than THREAD_LOCAL_DECL(static rxpos regcodesize); THREAD_LOCAL_DECL(static rxpos regcodemax); THREAD_LOCAL_DECL(static long regmaxlookback); +static int reghasgenlookback; /* FIXME: make this thread local */ /* caches to avoid gc */ THREAD_LOCAL_DECL(static long rx_buffer_size); @@ -169,6 +170,7 @@ regcomp(char *expstr, rxpos exp, int explen, int pcre) regnpar = 1; regncounter = 0; regmaxlookback = 0; + reghasgenlookback = 0; regcode = 1; regcodesize = 0; regcodemax = 0; @@ -200,6 +202,8 @@ regcomp(char *expstr, rxpos exp, int explen, int pcre) r->nsubexp = regnpar; r->ncounter = regncounter; r->maxlookback = regmaxlookback; + if (reghasgenlookback) + r->flags |= REGEXP_LOOKBEHIND; /* Second pass: emit code. */ regparse = exp; @@ -239,7 +243,6 @@ regcomp(char *expstr, rxpos exp, int explen, int pcre) r->regstart = rs; if (anch) r->flags |= REGEXP_ANCH; - } next = regnext(scan); if (rOP(next) == END) { /* Only one top-level choice. */ @@ -495,7 +498,7 @@ reg(int paren, int *flagp, int paren_set, int lookahead, int parse_flags) rxpos br; rxpos ender; int parno = 0; - int flags, matchmin, matchmax, brcount; + int flags, matchmin, matchmax, maxlookback, brcount, hasgenlookback; Scheme_Hash_Table *backdepends; #ifdef DO_STACK_CHECK @@ -560,6 +563,8 @@ reg(int paren, int *flagp, int paren_set, int lookahead, int parse_flags) *flagp |= flags&(SPSTART|SPFIXED); matchmin = regmatchmin; matchmax = regmatchmax; + maxlookback = regmaxlookback; + hasgenlookback = reghasgenlookback; brcount = 1; while (regparsestr[regparse] == '|') { brcount++; @@ -588,11 +593,17 @@ reg(int paren, int *flagp, int paren_set, int lookahead, int parse_flags) matchmin = regmatchmin; if (regmatchmax > matchmax) matchmax = regmatchmax; + if (regmaxlookback > maxlookback) + maxlookback = regmaxlookback; + if (reghasgenlookback) + hasgenlookback = 1; } } regbackdepends = backdepends; regmatchmin = matchmin; regmatchmax = matchmax; + regmaxlookback = maxlookback; + reghasgenlookback = hasgenlookback; if (paren && paren_set) { Scheme_Object *assumed; @@ -648,8 +659,8 @@ reg(int paren, int *flagp, int paren_set, int lookahead, int parse_flags) FAIL("lookbehind pattern does not match a bounded byte width"); if (matchmax > 0x7FFF) FAIL("lookbehind match is potentially too long (more than 32767 bytes)"); - if (matchmax > regmaxlookback) - regmaxlookback = matchmax; + regmaxlookback = matchmax + maxlookback; + reghasgenlookback = 1; if (ret + 8 < regcodesize) { regstr[ret + 5] = (matchmin >> 8); regstr[ret + 6] = (matchmin & 255); @@ -715,7 +726,7 @@ regbranch(int *flagp, int parse_flags, int without_branch_node) { rxpos ret; rxpos chain, latest; - int flags = 0, matchmin = 0, matchmax = 0, pcount = 0, save_flags; + int flags = 0, matchmin = 0, matchmax = 0, maxlookback = 0, hasgenlookback = 0, pcount = 0, save_flags; *flagp = (WORST|SPFIXED); /* Tentatively. */ @@ -746,6 +757,10 @@ regbranch(int *flagp, int parse_flags, int without_branch_node) regtail(chain, latest); if (!(flags&SPFIXED)) *flagp &= ~SPFIXED; + if (reghasgenlookback && (regmaxlookback > matchmin)) + hasgenlookback = 1; + if ((regmaxlookback - matchmin) > maxlookback) + maxlookback = regmaxlookback - matchmin; matchmin += regmatchmin; matchmax += regmatchmax; if (matchmax > 0x7FFF) @@ -755,6 +770,8 @@ regbranch(int *flagp, int parse_flags, int without_branch_node) } regmatchmin = matchmin; regmatchmax = matchmax; + regmaxlookback = maxlookback; + reghasgenlookback = hasgenlookback; if (chain == 0) { /* Loop ran zero times. */ latest = regnode(NOTHING); if (without_branch_node) @@ -882,8 +899,11 @@ regpiece(int *flagp, int parse_flags, int at_start) regmatchmax = 0x10000; *flagp |= SPFIXED; } - } else + } else { *flagp = (op != '+') ? WORST : HASWIDTH; + if ((op == '*') || (op == '?')) + regmatchmin = 0; + } *flagp |= SPSTART; if ((op == '?') && (flags & SPFIXED)) { *flagp |= SPFIXED; @@ -1064,6 +1084,8 @@ regatom(int *flagp, int parse_flags, int at_start) *flagp = (WORST|SPFIXED); /* Tentatively. */ regmatchmin = regmatchmax = 1; + regmaxlookback = 0; + reghasgenlookback = 0; switch (regparsestr[regparse++]) { case '^': @@ -1071,6 +1093,7 @@ regatom(int *flagp, int parse_flags, int at_start) ret = regnode(BOI); else ret = regnode(BOL); + regmaxlookback = 1; regmatchmin = regmatchmax = 0; break; case '$': @@ -1307,13 +1330,13 @@ regatom(int *flagp, int parse_flags, int at_start) if ((parse_flags & PARSE_PCRE) && (c == 'b')) { ret = regnode(WORDBOUND); regmatchmin = regmatchmax = 0; - if (!regmaxlookback) - regmaxlookback = 1; + regmaxlookback = 1; + reghasgenlookback = 1; } else if ((parse_flags & PARSE_PCRE) && (c == 'B')) { ret = regnode(NOTWORDBOUND); regmatchmin = regmatchmax = 0; - if (!regmaxlookback) - regmaxlookback = 1; + regmaxlookback = 1; + reghasgenlookback = 1; } else if ((parse_flags & PARSE_PCRE) && (c == 'p')) { ret = regunicode(0); regmatchmax = MAX_UTF8_CHAR_BYTES; @@ -2376,11 +2399,13 @@ static MZ_INLINE int in_ranges_ci(char *str, rxpos a, int l, int c) /* * Forwards. */ -static int regtry(regexp *, char *, int, int, rxpos *, rxpos *, rxpos *, int *, Regwork *rw, rxpos, int, int, int); +static int regtry(regexp *, char *, int, int, rxpos *, rxpos *, rxpos *, int *, Regwork *rw, rxpos, + char *, rxpos, rxpos, int); static int regtry_port(regexp *, Scheme_Object *, Scheme_Object *, int nonblock, rxpos *, rxpos *, rxpos *, int *, - char **, rxpos *, rxpos *, rxpos, Scheme_Object*, Scheme_Object*, rxpos, int, int, - int); + char **, rxpos *, rxpos *, rxpos, Scheme_Object*, Scheme_Object*, rxpos, + char*, rxpos, rxpos, + int, int *); static int regmatch(Regwork *rw, rxpos); static int regrepeat(Regwork *rw, rxpos, int); @@ -2399,14 +2424,15 @@ static int regexec(const char *who, regexp *prog, char *string, /* used only for strings: */ - int stringpos, int stringlen, + int stringpos, int stringlen, int stringorigin, /* Always used: */ rxpos *startp, rxpos *maybep, rxpos *endp, Scheme_Object *port, Scheme_Object *unless_evt, int nonblock, /* Used only when port is non-NULL: */ - char **stringp, int peek, int get_offsets, + char **stringp, int peek, int get_offsets, long save_prior, Scheme_Object *discard_oport, - Scheme_Object *portstart, Scheme_Object *portend, Scheme_Object **_dropped) + Scheme_Object *portstart, Scheme_Object *portend, Scheme_Object **_dropped, + char *prefix, rxpos prefix_len, rxpos prefix_offset) { int spos; int *counters; @@ -2525,11 +2551,13 @@ regexec(const char *who, if (prog->flags & REGEXP_ANCH) { if (port) { rxpos len = 0, space = 0; + int aborted = 0; *stringp = NULL; if (regtry_port(prog, port, unless_evt, nonblock, startp, maybep, endp, counters, stringp, &len, &space, 0, - portend, peekskip, 0, 1, 1, 0)) { + portend, peekskip, 0, prefix, prefix_len, prefix_offset, 0, + &aborted)) { if (!peek) { /* Need to consume matched chars: */ char *drain; @@ -2583,18 +2611,21 @@ regexec(const char *who, } } else return regtry(prog, string, stringpos, stringlen, startp, maybep, endp, counters, 0, - stringpos, 1, 1, 0); + stringorigin, prefix, prefix_len, prefix_offset, 0); } /* Messy cases: unanchored match. */ - spos = stringpos; if (port) { - int at_line_start = 1; rxpos len = 0, skip = 0, space = 0; *stringp = NULL; do { int discard = skip - prog->maxlookback; + int aborted = 0; + + if (discard > skip - save_prior) + discard = skip - save_prior; + if (discard >= REGPORT_FLUSH_THRESHOLD) { if (!peek) { if (discard_oport) @@ -2613,11 +2644,15 @@ regexec(const char *who, len -= discard; skip -= discard; memmove(*stringp, *stringp + discard, len); + + prefix = NULL; + prefix_len = 0; } if (regtry_port(prog, port, unless_evt, nonblock, startp, maybep, endp, counters, stringp, &len, &space, skip, - portend, peekskip, 0, !space, at_line_start, 1)) { + portend, peekskip, 0, prefix, prefix_len, prefix_offset, 1, + &aborted)) { if (!peek) { char *drain; @@ -2636,8 +2671,8 @@ regexec(const char *who, *_dropped = dropped; return 1; - } - at_line_start = ((skip < len) && ((*stringp)[skip] == '\n')); + } else if (aborted) + return 0; skip++; } while (len >= skip); @@ -2651,9 +2686,9 @@ regexec(const char *who, } } } else { - if (regtry(prog, string, spos, stringlen - (spos - stringpos), + if (regtry(prog, string, stringpos, stringlen, startp, maybep, endp, counters, - 0, stringpos, 1, 1, 1)) + 0, stringorigin, prefix, prefix_len, prefix_offset, 1)) return 1; } @@ -2667,8 +2702,13 @@ regexec(const char *who, static int /* 0 failure, 1 success */ regtry(regexp *prog, char *string, int stringpos, int stringlen, rxpos *startp, rxpos *maybep, rxpos *endp, int *counters, - Regwork *rw, rxpos stringorigin, int atstart, int atlinestart, + Regwork *rw, rxpos stringorigin, + char *prefix, rxpos prefix_len, rxpos prefix_offset, int unanchored) +/* stringpos: where to start looking; + stringlen: available bytes, counting from stringpos; + stringorigin: start of input, after prefix + prefix: bytes to appear before the origin to count as input */ { int i; Regwork _rw; @@ -2681,22 +2721,19 @@ regtry(regexp *prog, char *string, int stringpos, int stringlen, rw->input = stringpos; rw->input_end = stringpos + stringlen; rw->input_start = stringorigin; + rw->input_min = stringorigin - prefix_len; rw->startp = startp; rw->maybep = maybep; rw->endp = endp; rw->counters = counters; - if (atstart) - rw->boi = stringpos; - else - rw->boi = -1; - if (atlinestart) - rw->bol = stringpos; - else - rw->bol = -1; + rw->prefix = prefix; + rw->prefix_len = prefix_len; + rw->prefix_delta = prefix_len + prefix_offset - stringorigin; + rw->boi = stringorigin - prefix_len; for (i = prog->nsubexp; i--; ) { - startp[i] = -1; - endp[i] = -1; + startp[i] = rw->input_min - 1; + endp[i] = rw->input_min - 1; } #ifdef INDIRECT_TO_PROGRAM @@ -2732,15 +2769,10 @@ regtry(regexp *prog, char *string, int stringpos, int stringlen, --stringlen; } } - if (string[stringpos - 1] == '\n') - rw->bol = stringpos; - else - rw->bol = -1; - rw->boi = -1; rw->input = stringpos; for (i = prog->nsubexp; i--; ) { - startp[i] = -1; - endp[i] = -1; + startp[i] = rw->input_min - 1; + endp[i] = rw->input_min - 1; } /* try again... */ } else @@ -2815,30 +2847,33 @@ static void read_more_from_regport(Regwork *rw, rxpos need_total) rw->input_end += got; /* Non-blocking read got enough? If not, try again in blocking mode: */ - if (need_total > rw->input_end) { - if (rw->nonblock) { - rw->port = NULL; /* turn off further port reading */ - rw->unless_evt = NULL; - rw->aborted = 1; - } else { - if (rw->peekskip) - peekskip = scheme_bin_plus(scheme_make_integer(rw->input_end), rw->peekskip); - else - peekskip = scheme_make_integer(rw->input_end); - - rw->str = regstr; /* get_string can swap threads */ - got = scheme_get_byte_string_unless("regexp-match", rw->port, - rw->instr, rw->input_end, need_total - rw->input_end, - 0, /* blocking mode */ - 1, peekskip, - rw->unless_evt); - regstr = rw->str; + while (need_total > rw->input_end) { + if (rw->peekskip) + peekskip = scheme_bin_plus(scheme_make_integer(rw->input_end), rw->peekskip); + else + peekskip = scheme_make_integer(rw->input_end); - if (got == EOF) { - rw->port = NULL; /* turn off further port reading */ - rw->unless_evt = NULL; - } else - rw->input_end += got; + rw->str = regstr; /* get_string can swap threads */ + got = scheme_get_byte_string_unless("regexp-match", rw->port, + rw->instr, rw->input_end, need_total - rw->input_end, + (rw->nonblock ? 2 : 0), /* blocking mode */ + 1, peekskip, + rw->unless_evt); + regstr = rw->str; + + if (!got && rw->nonblock) { + rw->port = NULL; /* turn off further port reading */ + rw->unless_evt = NULL; + rw->aborted = 1; + break; + } else if (got == EOF) { + rw->port = NULL; /* turn off further port reading */ + rw->unless_evt = NULL; + break; + } else { + rw->input_end += got; + if (!rw->nonblock) + break; } } } @@ -2852,8 +2887,8 @@ regtry_port(regexp *prog, Scheme_Object *port, Scheme_Object *unless_evt, int no rxpos *startp, rxpos *maybep, rxpos *endp, int *counters, char **work_string, rxpos *len, rxpos *size, rxpos skip, Scheme_Object *maxlen, Scheme_Object *peekskip, - rxpos origin, int atstart, int atlinestart, - int read_at_least_one) + rxpos origin, char *prefix, rxpos prefix_len, rxpos prefix_offset, + int read_at_least_one, int *_aborted) { int m; Regwork rw; @@ -2871,7 +2906,7 @@ regtry_port(regexp *prog, Scheme_Object *port, Scheme_Object *unless_evt, int no m = regtry(prog, *work_string, skip, (*len) - skip, startp, maybep, endp, counters, - &rw, origin, atstart, atlinestart, 0); + &rw, origin, prefix, prefix_len, prefix_offset, 0); if (read_at_least_one && !rw.aborted @@ -2884,9 +2919,10 @@ regtry_port(regexp *prog, Scheme_Object *port, Scheme_Object *unless_evt, int no *len = rw.input_end; *size = rw.instr_size; - if (rw.aborted) + if (rw.aborted) { + *_aborted = 1; return 0; - else + } else return m; } @@ -2909,6 +2945,19 @@ static Scheme_Object *regmatch_k(void) #endif +XFORM_NONGCING static MZ_INLINE char INPUT_REF_S(Regwork *rw, rxpos c, rxpos input_start) +{ + if (c < input_start) + return rw->prefix[rw->prefix_delta + c]; + else + return rw->instr[c]; +} + +XFORM_NONGCING static MZ_INLINE char INPUT_REF(Regwork *rw, int c) +{ + return INPUT_REF_S(rw, c, rw->input_start); +} + /* - regmatch - main matching routine * @@ -2978,16 +3027,16 @@ regmatch(Regwork *rw, rxpos prog) scan = NEXT_OP(scan); break; case BOL: - if ((is != rw->bol) - && ((is <= rw->input_start) - || (rw->instr[is - 1] != '\n'))) + if ((is != rw->boi) + && ((is <= rw->input_min) + || (INPUT_REF(rw, is - 1) != '\n'))) return(0); scan = NEXT_OP(scan); break; case EOL: NEED_INPUT(rw, is, 1); if (is != rw->input_end) { - if (rw->instr[is] != '\n') + if (INPUT_REF(rw, is) != '\n') return(0); } scan = NEXT_OP(scan); @@ -3003,7 +3052,7 @@ regmatch(Regwork *rw, rxpos prog) NEED_INPUT(rw, is, 1); if (is == rw->input_end) return(0); - if (rw->instr[is] == '\n') + if (INPUT_REF(rw, is) == '\n') return 0; is++; scan = NEXT_OP(scan); @@ -3018,18 +3067,21 @@ regmatch(Regwork *rw, rxpos prog) if (rw->port) { /* Like the other branch, but demand chars one at a time, as we need them */ + rxpos input_start = rw->input_start; for (i = 0; i < len; i++) { NEED_INPUT(rw, is + i, 1); if (is + i >= rw->input_end) return 0; - if (regstr[opnd+i] != rw->instr[is+i]) + if (regstr[opnd+i] != INPUT_REF_S(rw, is+i, input_start)) return 0; } } else { + rxpos input_start; if (len > rw->input_end - is) return 0; + input_start = rw->input_start; for (i = 0; i < len; i++) { - if (regstr[opnd+i] != rw->instr[is+i]) + if (regstr[opnd+i] != INPUT_REF_S(rw, is+i, input_start)) return 0; } } @@ -3052,16 +3104,18 @@ regmatch(Regwork *rw, rxpos prog) NEED_INPUT(rw, is + i, 1); if (is + i >= rw->input_end) return 0; - c = rw->instr[is+i]; + c = INPUT_REF(rw, is+i); c = rx_tolower(c); if (regstr[opnd+i] != c) return 0; } } else { + rxpos input_start; if (len > rw->input_end - is) return 0; + input_start = rw->input_start; for (i = 0; i < len; i++) { - c = rw->instr[is+i]; + c = INPUT_REF_S(rw, is+i, input_start); c = rx_tolower(c); if (regstr[opnd+i] != c) return 0; @@ -3077,7 +3131,7 @@ regmatch(Regwork *rw, rxpos prog) NEED_INPUT(rw, is, 1); if (is == rw->input_end) return 0; - c = UCHAR(rw->instr[is]); + c = UCHAR(INPUT_REF(rw, is)); if (!(regstr[OPERAND(scan) + (c >> 3)] & (1 << (c & 0x7)))) return(0); is++; @@ -3088,7 +3142,7 @@ regmatch(Regwork *rw, rxpos prog) NEED_INPUT(rw, is, 1); if (is == rw->input_end) return 0; - if (rw->instr[is] != regstr[OPERAND(scan)]) + if (INPUT_REF(rw, is) != regstr[OPERAND(scan)]) return 0; is++; scan = NEXT_OP(scan); @@ -3097,8 +3151,8 @@ regmatch(Regwork *rw, rxpos prog) NEED_INPUT(rw, is, 1); if (is == rw->input_end) return 0; - if (rw->instr[is] != regstr[OPERAND(scan)]) - if (rw->instr[is] != regstr[OPERAND(scan)+1]) + if (INPUT_REF(rw, is) != regstr[OPERAND(scan)]) + if (INPUT_REF(rw, is) != regstr[OPERAND(scan)+1]) return 0; is++; scan = NEXT_OP(scan); @@ -3109,7 +3163,7 @@ regmatch(Regwork *rw, rxpos prog) NEED_INPUT(rw, is, 1); if (is == rw->input_end) return 0; - c = UCHAR(rw->instr[is]); + c = UCHAR(INPUT_REF(rw, is)); if ((c < UCHAR(regstr[OPERAND(scan)])) || (c > UCHAR(regstr[OPERAND(scan)+1]))) return(0); @@ -3123,7 +3177,7 @@ regmatch(Regwork *rw, rxpos prog) NEED_INPUT(rw, is, 1); if (is == rw->input_end) return 0; - c = UCHAR(rw->instr[is]); + c = UCHAR(INPUT_REF(rw, is)); if ((c >= UCHAR(regstr[OPERAND(scan)])) && (c <= UCHAR(regstr[OPERAND(scan)+1]))) return(0); @@ -3214,7 +3268,7 @@ regmatch(Regwork *rw, rxpos prog) while (no >= min) { /* If it could work, try it. */ if (nextch == '\0' || ((save + no < rw->input_end) - && (rw->instr[save + no] == nextch))) { + && (INPUT_REF(rw, save + no) == nextch))) { rw->input = is + no; if (regmatch(rw, next)) return(1); @@ -3229,7 +3283,7 @@ regmatch(Regwork *rw, rxpos prog) if (nextch) NEED_INPUT(rw, save + i, 1); if (nextch == '\0' || ((save+i < rw->input_end) - && (rw->instr[save+i] == nextch))) { + && (INPUT_REF(rw, save+i) == nextch))) { rw->input = save + i; if (regmatch(rw, next)) { return(1); @@ -3271,7 +3325,7 @@ regmatch(Regwork *rw, rxpos prog) { int no, len, start, i; no = rOPLEN(OPERAND(scan)); - if (rw->endp[no] == -1) + if (rw->endp[no] < rw->input_min) return 0; start = rw->startp[no]; @@ -3280,18 +3334,20 @@ regmatch(Regwork *rw, rxpos prog) if (rw->port) { /* Like the other branch, but demand chars one at a time, as we need them */ + rxpos input_start = rw->input_start; for (i = 0; i < len; i++) { NEED_INPUT(rw, is + i, 1); if (is + i >= rw->input_end) return 0; - if (rw->instr[start+i] != rw->instr[is+i]) + if (INPUT_REF_S(rw, start+i, input_start) != INPUT_REF_S(rw, is+i, input_start)) return 0; } } else { + rxpos input_start = rw->input_start; if (len > rw->input_end - is) return 0; for (i = 0; i < len; i++) { - if (rw->instr[start+i] != rw->instr[is+i]) + if (INPUT_REF_S(rw, start+i, input_start) != INPUT_REF_S(rw, is+i, input_start)) return 0; } } @@ -3303,7 +3359,7 @@ regmatch(Regwork *rw, rxpos prog) { int no, len, start, i, c1, c2; no = rOPLEN(OPERAND(scan)); - if (rw->endp[no] == -1) + if (rw->endp[no] < rw->input_min) return 0; start = rw->startp[no]; @@ -3312,24 +3368,26 @@ regmatch(Regwork *rw, rxpos prog) if (rw->port) { /* Like the other branch, but demand chars one at a time, as we need them */ + rxpos input_start = rw->input_start; for (i = 0; i < len; i++) { NEED_INPUT(rw, is + i, 1); if (is + i >= rw->input_end) return 0; - c1 = rw->instr[start+i]; + c1 = INPUT_REF_S(rw, start+i, input_start); c1 = rx_tolower(c1); - c2 = rw->instr[is+i]; + c2 = INPUT_REF_S(rw, is+i, input_start); c2 = rx_tolower(c2); if (c1 != c2) return 0; } } else { + rxpos input_start = rw->input_start; if (len > rw->input_end - is) return 0; for (i = 0; i < len; i++) { - c1 = rw->instr[start+i]; + c1 = INPUT_REF_S(rw, start+i, input_start); c1 = rx_tolower(c1); - c2 = rw->instr[is+i]; + c2 = INPUT_REF_S(rw, is+i, input_start); c2 = rx_tolower(c2); if (c1 != c2) return 0; @@ -3356,9 +3414,10 @@ regmatch(Regwork *rw, rxpos prog) no_start = no_end = 0; save = is; if (no_end) { + /* lookbehind */ int found = 0; for (no = no_start; no <= no_end; no++) { - if (is - rw->input_start >= no) { + if (is - rw->input_min >= no) { rw->input = save - no; if (regmatch(rw, next)) { if (is == save) { @@ -3368,15 +3427,15 @@ regmatch(Regwork *rw, rxpos prog) break; } } - } else { + } else break; - } } if (!found) { /* No matches */ if (t) return 0; } } else { + /* lookahead */ rw->input = is; if (regmatch(rw, next)) { if (!t) return 0; @@ -3445,8 +3504,8 @@ regmatch(Regwork *rw, rxpos prog) rw->startp[no] = is - len; rw->endp[no] = is; } else { - rw->startp[no] = -1; - rw->endp[no] = -1; + rw->startp[no] = rw->input_min - 1; + rw->endp[no] = rw->input_min - 1; } scan = NEXT_OP(scan); } @@ -3463,13 +3522,13 @@ regmatch(Regwork *rw, rxpos prog) { int c, w1, w2; NEED_INPUT(rw, is, 1); - if (is > rw->input_start) { - c = rw->instr[is - 1]; + if (is > rw->input_min) { + c = INPUT_REF(rw, is - 1); w1 = rx_isword(c); } else w1 = 0; if (is < rw->input_end) { - c = rw->instr[is]; + c = INPUT_REF(rw, is); w2 = rx_isword(c); } else w2 = 0; @@ -3481,13 +3540,13 @@ regmatch(Regwork *rw, rxpos prog) { int c, w1, w2; NEED_INPUT(rw, is, 1); - if (is > rw->input_start) { - c = rw->instr[is - 1]; + if (is > rw->input_min) { + c = INPUT_REF(rw, is - 1); w1 = rx_isword(c); } else w1 = 0; if (is < rw->input_end) { - c = rw->instr[is]; + c = INPUT_REF(rw, is); w2 = rx_isword(c); } else w2 = 0; @@ -3511,7 +3570,7 @@ regmatch(Regwork *rw, rxpos prog) NEED_INPUT(rw, is, 1); if (is < rw->input_end) { - c = UCHAR(rw->instr[is]); + c = UCHAR(INPUT_REF(rw, is)); if (c < 128) { v = c; pos = 1; @@ -3527,7 +3586,7 @@ regmatch(Regwork *rw, rxpos prog) return 0; NEED_INPUT(rw, is, pos+1); if (is + pos < rw->input_end) { - buf[pos] = rw->instr[is + pos]; + buf[pos] = INPUT_REF(rw, is + pos); pos++; } else return 0; @@ -3559,7 +3618,7 @@ regmatch(Regwork *rw, rxpos prog) if (rOP(test) == BACKREF) { int no; no = rOPLEN(OPERAND(test)); - t = (rw->endp[no] > -1); + t = (rw->endp[no] > rw->input_min); } else { rw->input = is; t = regmatch(rw, test); @@ -3681,9 +3740,10 @@ regrepeat(Regwork *rw, rxpos p, int maxc) break; case ANYL: { + rxpos input_start = rw->input_start; NEED_INPUT(rw, scan, 1); while (scan != rw->input_end - && (rw->instr[scan] != '\n')) { + && (INPUT_REF_S(rw, scan, input_start) != '\n')) { count++; scan++; if (maxc) { maxc--; if (!maxc) break; } @@ -3693,10 +3753,11 @@ regrepeat(Regwork *rw, rxpos p, int maxc) break; case EXACTLY: { + rxpos input_start = rw->input_start; rxpos opnd2 = OPSTR(opnd); NEED_INPUT(rw, scan, 1); while (scan != rw->input_end - && (regstr[opnd2] == rw->instr[scan])) { + && (regstr[opnd2] == INPUT_REF_S(rw, scan, input_start))) { count++; scan++; if (maxc) { maxc--; if (!maxc) break; } @@ -3707,10 +3768,11 @@ regrepeat(Regwork *rw, rxpos p, int maxc) case EXACTLY_CI: { char c; + rxpos input_start = rw->input_start; rxpos opnd2 = OPSTR(opnd); NEED_INPUT(rw, scan, 1); while (scan != rw->input_end) { - c = rw->instr[scan]; + c = INPUT_REF_S(rw, scan, input_start); c = rx_tolower(c); if (regstr[opnd2] != c) break; @@ -3724,12 +3786,13 @@ regrepeat(Regwork *rw, rxpos p, int maxc) case ANYOF: { int c; + rxpos input_start = rw->input_start; rxpos init = scan; if (rw->port || maxc) { /* Slow but general version */ NEED_INPUT(rw, scan, 1); while (scan != rw->input_end) { - c = UCHAR(rw->instr[scan]); + c = UCHAR(INPUT_REF_S(rw, scan, input_start)); if (!(regstr[opnd + (c >> 3)] & (1 << (c & 0x7)))) break; scan++; @@ -3740,7 +3803,7 @@ regrepeat(Regwork *rw, rxpos p, int maxc) /* Fast version */ int e = rw->input_end; while (scan != e) { - c = UCHAR(rw->instr[scan]); + c = UCHAR(INPUT_REF_S(rw, scan, input_start)); if (!(regstr[opnd + (c >> 3)] & (1 << (c & 0x7)))) break; scan++; @@ -3752,13 +3815,14 @@ regrepeat(Regwork *rw, rxpos p, int maxc) case EXACTLY1: { rxpos init = scan; + rxpos input_start = rw->input_start; char c; c = regstr[opnd]; if (rw->port || maxc) { /* Slow but general version */ NEED_INPUT(rw, scan, 1); while ((scan != rw->input_end) - && (rw->instr[scan] == c)) { + && (INPUT_REF_S(rw, scan, input_start) == c)) { scan++; if (maxc) { maxc--; if (!maxc) break; } NEED_INPUT(rw, scan, 1); @@ -3767,7 +3831,7 @@ regrepeat(Regwork *rw, rxpos p, int maxc) /* Fast version */ int e = rw->input_end; while ((scan != e) - && (rw->instr[scan] == c)) { + && (INPUT_REF(rw, scan) == c)) { scan++; } } @@ -3777,6 +3841,7 @@ regrepeat(Regwork *rw, rxpos p, int maxc) case EXACTLY2: { rxpos init = scan; + rxpos input_start = rw->input_start; char c1, c2; c1 = regstr[opnd]; c2 = regstr[opnd+1]; @@ -3784,8 +3849,8 @@ regrepeat(Regwork *rw, rxpos p, int maxc) /* Slow but general version */ NEED_INPUT(rw, scan, 1); while ((scan != rw->input_end) - && ((rw->instr[scan] == c1) - || (rw->instr[scan] == c2))) { + && ((INPUT_REF_S(rw, scan, input_start) == c1) + || (INPUT_REF_S(rw, scan, input_start) == c2))) { scan++; if (maxc) { maxc--; if (!maxc) break; } NEED_INPUT(rw, scan, 1); @@ -3794,8 +3859,8 @@ regrepeat(Regwork *rw, rxpos p, int maxc) /* Fast version */ int e = rw->input_end; while ((scan != e) - && ((rw->instr[scan] == c1) - || (rw->instr[scan] == c2))) { + && ((INPUT_REF(rw, scan) == c1) + || (INPUT_REF(rw, scan) == c2))) { scan++; } } @@ -3805,6 +3870,7 @@ regrepeat(Regwork *rw, rxpos p, int maxc) case RANGE: { rxpos init = scan; + rxpos input_start = rw->input_start; int c, sr, er; NEED_INPUT(rw, scan, 1); sr = UCHAR(regstr[opnd]); @@ -3812,7 +3878,7 @@ regrepeat(Regwork *rw, rxpos p, int maxc) if (rw->port || maxc) { /* Slow but general version */ while (scan != rw->input_end) { - c = UCHAR(rw->instr[scan]); + c = UCHAR(INPUT_REF_S(rw, scan, input_start)); if ((c < sr) || (c > er)) break; scan++; @@ -3823,7 +3889,7 @@ regrepeat(Regwork *rw, rxpos p, int maxc) /* Fast version */ int e = rw->input_end; while (scan != e) { - c = UCHAR(rw->instr[scan]); + c = UCHAR(INPUT_REF(rw, scan)); if ((c < sr) || (c > er)) break; scan++; @@ -3834,6 +3900,7 @@ regrepeat(Regwork *rw, rxpos p, int maxc) break; case NOTRANGE: { + rxpos input_start = rw->input_start; rxpos init = scan; int c, sr, er; NEED_INPUT(rw, scan, 1); @@ -3842,7 +3909,7 @@ regrepeat(Regwork *rw, rxpos p, int maxc) if (rw->port || maxc) { /* Slow but general version */ while (scan != rw->input_end) { - c = UCHAR(rw->instr[scan]); + c = UCHAR(INPUT_REF_S(rw, scan, input_start)); if ((c >= sr) && (c <= er)) break; scan++; @@ -3853,7 +3920,7 @@ regrepeat(Regwork *rw, rxpos p, int maxc) /* Fast version */ int e = rw->input_end; while (scan != e) { - c = UCHAR(rw->instr[scan]); + c = UCHAR(INPUT_REF_S(rw, scan, input_start)); if ((c >= sr) && (c <= er)) break; scan++; @@ -3925,7 +3992,8 @@ regstrcspn(char *s1, char *e1, char *s2) */ static char *regsub(regexp *prog, char *src, int sourcelen, long *lenout, char *insrc, - rxpos *startp, rxpos *endp) + rxpos *startp, rxpos *endp, rxpos minpos, + char *prefix, rxpos prefix_offset) { char *dest; char c; @@ -3970,7 +4038,7 @@ char *regsub(regexp *prog, char *src, int sourcelen, long *lenout, char *insrc, dest[destlen++] = c; } else if (no >= prog->nsubexp) { /* Number too big; prentend it's the empty string */ - } else if (startp[no] != -1 && endp[no] != -1) { + } else if ((startp[no] >= minpos) && (endp[no] >= minpos)) { len = endp[no] - startp[no]; if (len + destlen >= destalloc) { char *old = dest; @@ -3978,7 +4046,10 @@ char *regsub(regexp *prog, char *src, int sourcelen, long *lenout, char *insrc, dest = (char *)scheme_malloc_atomic(destalloc + 1); memcpy(dest, old, destlen); } - memcpy(dest + destlen, insrc + startp[no], len); + if (startp[no] >= 0) + memcpy(dest + destlen, insrc + startp[no], len); + else + memcpy(dest + destlen, prefix + prefix_offset + (startp[no] - minpos), len); destlen += len; } } @@ -4935,13 +5006,14 @@ void scheme_clear_rx_buffers(void) static Scheme_Object *gen_compare(char *name, int pos, int argc, Scheme_Object *argv[], - int peek, int nonblock) + int peek, int nonblock, int last_bytes) { regexp *r; - char *full_s; - rxpos *startp, *maybep, *endp; - int offset = 0, orig_offset, endset, m, was_non_byte; + char *full_s, *prefix = NULL; + rxpos *startp, *maybep, *endp, prefix_len = 0, prefix_offset = 0, minpos; + int offset = 0, orig_offset, endset, m, was_non_byte, last_bytes_count = last_bytes; Scheme_Object *iport, *oport = NULL, *startv = NULL, *endv = NULL, *dropped, *unless_evt = NULL; + Scheme_Object *last_bytes_str = scheme_false; if (SCHEME_TYPE(argv[0]) != scheme_regexp_type && !SCHEME_BYTE_STRINGP(argv[0]) @@ -5026,6 +5098,23 @@ static Scheme_Object *gen_compare(char *name, int pos, } } } + + if (argc > 5) { + if (!SCHEME_BYTE_STRINGP(argv[5])) + scheme_wrong_type(name, "byte string", 5, argc, argv); + prefix = SCHEME_BYTE_STR_VAL(argv[5]); + prefix_len = SCHEME_BYTE_STRLEN_VAL(argv[5]); + prefix_offset = 0; + + if (argc > 6) { + if (!scheme_nonneg_exact_p(argv[6])) + scheme_wrong_type(name, "exact nonnegative integer", 6, argc, argv); + if (SCHEME_INTP(argv[6])) + last_bytes_count = SCHEME_INT_VAL(argv[6]); + else + last_bytes_count = -1; /* => as many as available */ + } + } } } @@ -5083,10 +5172,17 @@ static Scheme_Object *gen_compare(char *name, int pos, dropped = scheme_make_integer(0); - m = regexec(name, r, full_s, offset, endset - offset, startp, maybep, endp, + m = regexec(name, r, full_s, offset, endset - offset, offset, startp, maybep, endp, iport, unless_evt, nonblock, - &full_s, peek, pos, oport, - startv, endv, &dropped); + &full_s, peek, pos, last_bytes_count, oport, + startv, endv, &dropped, + prefix, prefix_len, prefix_offset); + + if (iport) { + minpos = -prefix_len; + offset = 0; + } else + minpos = offset - prefix_len; if (m) { int i; @@ -5095,12 +5191,40 @@ static Scheme_Object *gen_compare(char *name, int pos, if (oport && !iport) scheme_put_byte_string(name, oport, full_s, 0, *startp, 0); + if (last_bytes) { + rxpos frompos, tooffset; + + if ((last_bytes_count < 0) + || (endp[0] - minpos < last_bytes_count)) + last_bytes_count = endp[0] - minpos; + + frompos = endp[0] - last_bytes_count; + tooffset = 0; + + last_bytes_str = scheme_alloc_byte_string(last_bytes_count, 0); + if (frompos < offset) { + /* draw from prefix: */ + rxpos amt = last_bytes_count; + if (frompos + last_bytes_count > offset) + amt = offset - frompos; + memcpy(SCHEME_BYTE_STR_VAL(last_bytes_str) XFORM_OK_PLUS tooffset, + prefix + prefix_offset + prefix_len - (offset - frompos), + amt); + frompos += amt; + tooffset += amt; + last_bytes_count -= amt; + } + memcpy(SCHEME_BYTE_STR_VAL(last_bytes_str) XFORM_OK_PLUS tooffset, + full_s + frompos, + last_bytes_count); + } + if (pos > 1) { /* pos == 2 => just get true or false */ dropped = scheme_true; } else { for (i = r->nsubexp; i--; ) { - if (startp[i] != -1) { + if (startp[i] >= minpos) { if (pos) { Scheme_Object *startpd, *endpd; @@ -5110,15 +5234,37 @@ static Scheme_Object *gen_compare(char *name, int pos, unicode chars, so the start and end points can't be in the middle of encoded characters. */ int uspd, uepd; - uspd = scheme_utf8_decode((const unsigned char *)full_s, offset, startp[i], - NULL, 0, -1, - NULL, 0, 0); + if (startp[i] >= offset) + uspd = scheme_utf8_decode((const unsigned char *)full_s, offset, startp[i], + NULL, 0, -1, + NULL, 0, 0); + else { + uspd = scheme_utf8_decode((const unsigned char *)prefix, + prefix_offset + prefix_len + (startp[i] - offset), + prefix_offset + prefix_len, + NULL, 0, -1, + NULL, 0, 0); + uspd = offset - uspd; + } uspd += orig_offset; startpd = scheme_make_integer(uspd); - uepd = scheme_utf8_decode((const unsigned char *)full_s, startp[i], endp[i], - NULL, 0, -1, - NULL, 0, 0); - uepd += uspd; + if (startp[i] >= offset) { + uepd = scheme_utf8_decode((const unsigned char *)full_s, startp[i], endp[i], + NULL, 0, -1, + NULL, 0, 0); + uepd += uspd; + } else if (endp[i] < offset) { + uepd = scheme_utf8_decode((const unsigned char *)prefix, + prefix_offset + prefix_len + (endp[i] - offset), + prefix_offset + prefix_len, + NULL, 0, -1, + NULL, 0, 0); + uepd = offset - uepd; + uepd += orig_offset; + } else { + scheme_signal_error("internal error: how can a match span both prefix and input?"); + uepd = 0; + } endpd = scheme_make_integer(uepd); } else { int v; @@ -5139,11 +5285,25 @@ static Scheme_Object *gen_compare(char *name, int pos, } else { long len; len = endp[i] - startp[i]; - if (was_non_byte) { - rs = scheme_make_sized_offset_utf8_string(full_s, startp[i], len); - } else { - rs = scheme_make_sized_offset_byte_string(full_s, startp[i], len, 1); - } + if (startp[i] >= offset) { + if (was_non_byte) { + rs = scheme_make_sized_offset_utf8_string(full_s, startp[i], len); + } else { + rs = scheme_make_sized_offset_byte_string(full_s, startp[i], len, 1); + } + } else if (endp[i] <= offset) { + /* all in prefix */ + rs = scheme_make_sized_offset_byte_string(prefix, + prefix_offset + (startp[i] - minpos), + endp[i] - startp[i], + 1); + if (was_non_byte) + rs = scheme_byte_string_to_char_string(rs); + } else { + /* span both */ + scheme_signal_error("internal error: how can a match span both prefix and input?"); + rs = NULL; + } l = scheme_make_pair(rs, l); } } else @@ -5156,6 +5316,7 @@ static Scheme_Object *gen_compare(char *name, int pos, scheme_put_byte_string(name, oport, full_s, 0, endset, 0); dropped = scheme_false; + last_bytes_str = scheme_false; } if (!startp_buffer_cache || (r->nsubexp > rx_buffer_size)) { @@ -5166,43 +5327,69 @@ static Scheme_Object *gen_compare(char *name, int pos, } else if (maybep && !maybep_buffer_cache && (r->nsubexp == rx_buffer_size)) { maybep_buffer_cache = maybep; } - - return dropped; + + if (last_bytes) { + Scheme_Object *a[2]; + a[0] = dropped; + a[1] = last_bytes_str; + return scheme_values(2, a); + } else + return dropped; } static Scheme_Object *compare(int argc, Scheme_Object *argv[]) { - return gen_compare("regexp-match", 0, argc, argv, 0, 0); + return gen_compare("regexp-match", 0, argc, argv, 0, 0, 0); +} + +static Scheme_Object *compare_end(int argc, Scheme_Object *argv[]) +{ + return gen_compare("regexp-match/end", 0, argc, argv, 0, 0, 1); } static Scheme_Object *positions(int argc, Scheme_Object *argv[]) { - return gen_compare("regexp-match-positions", 1, argc, argv, 0, 0); + return gen_compare("regexp-match-positions", 1, argc, argv, 0, 0, 0); +} + +static Scheme_Object *positions_end(int argc, Scheme_Object *argv[]) +{ + return gen_compare("regexp-match-positions/end", 1, argc, argv, 0, 0, 1); } static Scheme_Object *compare_bool(int argc, Scheme_Object *argv[]) { - return gen_compare("regexp-match?", 2, argc, argv, 0, 0); + return gen_compare("regexp-match?", 2, argc, argv, 0, 0, 0); } static Scheme_Object *compare_peek(int argc, Scheme_Object *argv[]) { - return gen_compare("regexp-match-peek", 0, argc, argv, 1, 0); + return gen_compare("regexp-match-peek", 0, argc, argv, 1, 0, 0); } static Scheme_Object *positions_peek(int argc, Scheme_Object *argv[]) { - return gen_compare("regexp-match-peek-positions", 1, argc, argv, 1, 0); + return gen_compare("regexp-match-peek-positions", 1, argc, argv, 1, 0, 0); +} + +static Scheme_Object *positions_peek_end(int argc, Scheme_Object *argv[]) +{ + return gen_compare("regexp-match-peek-positions/end", 1, argc, argv, 1, 0, 1); } static Scheme_Object *compare_peek_nonblock(int argc, Scheme_Object *argv[]) { - return gen_compare("regexp-match-peek-immediate", 0, argc, argv, 1, 1); + return gen_compare("regexp-match-peek-immediate", 0, argc, argv, 1, 1, 0); } static Scheme_Object *positions_peek_nonblock(int argc, Scheme_Object *argv[]) { - return gen_compare("regexp-match-peek-positions-immediate", 1, argc, argv, 1, 1); + return gen_compare("regexp-match-peek-positions-immediate", 1, argc, argv, 1, 1, 0); +} + +static Scheme_Object *positions_peek_nonblock_end(int argc, Scheme_Object *argv[]) +{ + return gen_compare("regexp-match-peek-positions-immediate/end", 1, argc, argv, 1, 1, 1); } static char *build_call_name(const char *n) @@ -5234,8 +5421,8 @@ static Scheme_Object *gen_replace(const char *name, int argc, Scheme_Object *arg Scheme_Object *orig; regexp *r; char *source, *prefix = NULL, *deststr; - rxpos *startp, *maybep, *endp; - int prefix_len = 0, sourcelen, srcoffset = 0, was_non_byte, destlen; + rxpos *startp, *maybep, *endp, minpos; + int prefix_len = 0, prefix_offset = 0, sourcelen, srcoffset = 0, was_non_byte, destlen; if (SCHEME_TYPE(argv[0]) != scheme_regexp_type && !SCHEME_BYTE_STRINGP(argv[0]) @@ -5276,6 +5463,14 @@ static Scheme_Object *gen_replace(const char *name, int argc, Scheme_Object *arg } } + if (argc > 3) { + if (!SCHEME_BYTE_STRINGP(argv[3])) + scheme_wrong_type(name, "byte string", 3, argc, argv); + prefix = SCHEME_BYTE_STR_VAL(argv[3]); + prefix_len = SCHEME_BYTE_STRLEN_VAL(argv[3]); + prefix_offset = 0; + } + if (SCHEME_CHAR_STRINGP(argv[1])) { orig = scheme_char_string_to_byte_string(argv[1]); if (r->flags & REGEXP_IS_UTF8) @@ -5298,13 +5493,16 @@ static Scheme_Object *gen_replace(const char *name, int argc, Scheme_Object *arg maybep = NULL; endp = MALLOC_N_ATOMIC(rxpos, r->nsubexp); + minpos = -prefix_len; + while (1) { int m; do { - m = regexec(name, r, source, srcoffset, sourcelen - srcoffset, startp, maybep, endp, + m = regexec(name, r, source, srcoffset, sourcelen - srcoffset, 0, startp, maybep, endp, NULL, NULL, 0, - NULL, 0, 0, NULL, NULL, NULL, NULL); + NULL, 0, 0, 0, NULL, NULL, NULL, NULL, + prefix, prefix_len, prefix_offset); if (m && all && (startp[0] == endp[0])) { if (!startp[0] && sourcelen) { @@ -5345,7 +5543,7 @@ static Scheme_Object *gen_replace(const char *name, int argc, Scheme_Object *arg } for (i = r->nsubexp; i--; ) { - if (startp[i] == -1) { + if (startp[i] < minpos) { args[i] = scheme_false; } else { long len; @@ -5394,7 +5592,8 @@ static Scheme_Object *gen_replace(const char *name, int argc, Scheme_Object *arg destlen = SCHEME_BYTE_STRTAG_VAL(argv[2]); } } - insert = regsub(r, deststr, destlen, &len, source, startp, endp); + insert = regsub(r, deststr, destlen, &len, source, startp, endp, + minpos, prefix, prefix_offset); } end = sourcelen; @@ -5449,7 +5648,7 @@ static Scheme_Object *gen_replace(const char *name, int argc, Scheme_Object *arg prefix = naya; prefix_len = total; - srcoffset = endpd + more; + srcoffset = endpd + more; } } else if (!prefix) { if (was_non_byte) @@ -5522,6 +5721,13 @@ static Scheme_Object *byte_pregexp_p(int argc, Scheme_Object *argv[]) : scheme_false); } +Scheme_Object *regexp_lookbehind(int argc, Scheme_Object *argv[]) +{ + if (!SAME_TYPE(SCHEME_TYPE(argv[0]), scheme_regexp_type)) + scheme_wrong_type("regexp-max-lookbehind", "regexp or byte-regexp", 0, argc, argv); + return scheme_make_integer(((regexp *)argv[0])->maxlookback); +} + Scheme_Object *scheme_regexp_source(Scheme_Object *re) { return ((regexp *)re)->source; @@ -5550,20 +5756,26 @@ void scheme_regexp_initialize(Scheme_Env *env) GLOBAL_PRIM_W_ARITY("regexp", make_utf8_regexp, 1, 1, env); GLOBAL_PRIM_W_ARITY("byte-pregexp", make_pregexp, 1, 1, env); GLOBAL_PRIM_W_ARITY("pregexp", make_utf8_pregexp, 1, 1, env); - GLOBAL_PRIM_W_ARITY("regexp-match", compare, 2, 5, env); - GLOBAL_PRIM_W_ARITY("regexp-match-positions", positions, 2, 5, env); - GLOBAL_PRIM_W_ARITY("regexp-match?", compare_bool, 2, 5, env); - GLOBAL_PRIM_W_ARITY("regexp-match-peek", compare_peek, 2, 5, env); - GLOBAL_PRIM_W_ARITY("regexp-match-peek-positions", positions_peek, 2, 5, env); - GLOBAL_PRIM_W_ARITY("regexp-match-peek-immediate", compare_peek_nonblock, 2, 5, env); - GLOBAL_PRIM_W_ARITY("regexp-match-peek-positions-immediate", positions_peek_nonblock, 2, 5, env); - GLOBAL_PRIM_W_ARITY("regexp-replace", replace, 3, 3, env); - GLOBAL_PRIM_W_ARITY("regexp-replace*", replace_star, 3, 3, env); + GLOBAL_PRIM_W_ARITY("regexp-match", compare, 2, 6, env); + GLOBAL_PRIM_W_ARITY("regexp-match/end", compare_end, 2, 7, env); + GLOBAL_PRIM_W_ARITY("regexp-match-positions", positions, 2, 6, env); + GLOBAL_PRIM_W_ARITY("regexp-match-positions/end", positions_end, 2, 7, env); + GLOBAL_PRIM_W_ARITY("regexp-match?", compare_bool, 2, 6, env); + GLOBAL_PRIM_W_ARITY("regexp-match-peek", compare_peek, 2, 6, env); + GLOBAL_PRIM_W_ARITY("regexp-match-peek-positions", positions_peek, 2, 6, env); + GLOBAL_PRIM_W_ARITY("regexp-match-peek-positions/end", positions_peek_end, 2, 7, env); + GLOBAL_PRIM_W_ARITY("regexp-match-peek-immediate", compare_peek_nonblock, 2, 6, env); + GLOBAL_PRIM_W_ARITY("regexp-match-peek-positions-immediate", positions_peek_nonblock, 2, 6, env); + GLOBAL_PRIM_W_ARITY("regexp-match-peek-positions-immediate/end", positions_peek_nonblock_end, 2, 7, env); + GLOBAL_PRIM_W_ARITY("regexp-replace", replace, 3, 4, env); + GLOBAL_PRIM_W_ARITY("regexp-replace*", replace_star, 3, 4, env); GLOBAL_FOLDING_PRIM("regexp?", regexp_p, 1, 1, 1, env); GLOBAL_FOLDING_PRIM("byte-regexp?", byte_regexp_p, 1, 1, 1, env); GLOBAL_FOLDING_PRIM("pregexp?", pregexp_p, 1, 1, 1, env); GLOBAL_FOLDING_PRIM("byte-pregexp?", byte_pregexp_p, 1, 1, 1, env); + + GLOBAL_FOLDING_PRIM("regexp-max-lookbehind", regexp_lookbehind, 1, 1, 1, env); } void scheme_init_regexp_places() diff --git a/src/mzscheme/src/schminc.h b/src/mzscheme/src/schminc.h index 0ccfef266b..32f1adcd73 100644 --- a/src/mzscheme/src/schminc.h +++ b/src/mzscheme/src/schminc.h @@ -13,7 +13,7 @@ #define USE_COMPILED_STARTUP 1 -#define EXPECTED_PRIM_COUNT 983 +#define EXPECTED_PRIM_COUNT 988 #define EXPECTED_UNSAFE_COUNT 65 #define EXPECTED_FLFXNUM_COUNT 53 diff --git a/src/mzscheme/src/schrx.h b/src/mzscheme/src/schrx.h index 1c08f83dc6..3e6daae50f 100644 --- a/src/mzscheme/src/schrx.h +++ b/src/mzscheme/src/schrx.h @@ -26,11 +26,12 @@ typedef struct regexp { #endif } regexp; -#define REGEXP_IS_UTF8 0x01 -#define REGEXP_IS_PCRE 0x02 -#define REGEXP_ANCH 0x04 -#define REGEXP_MUST_CI 0x08 -#define REGEXP_JIT 0x10 +#define REGEXP_IS_UTF8 0x01 +#define REGEXP_IS_PCRE 0x02 +#define REGEXP_ANCH 0x04 +#define REGEXP_MUST_CI 0x08 +#define REGEXP_JIT 0x10 +#define REGEXP_LOOKBEHIND 0x20 #ifdef INDIRECT_TO_PROGRAM # define N_ITO_DELTA(prog, extra, re) extra @@ -217,14 +218,17 @@ typedef struct Regwork { char *instr; Scheme_Object *port; Scheme_Object *unless_evt; - short nonblock, aborted; + char nonblock, aborted; rxpos instr_size; /* For port reads */ rxpos input_maxend; /* For port reads */ rxpos input, input_end, input_start; /* String-input pointer. */ - rxpos boi, bol; /* Beginning of input/line, for ^ check. */ + rxpos input_min; /* input_start minus prefix_size */ + rxpos boi; /* Beginning of input, for ^ check. */ rxpos *startp; /* Pointer to startp array. */ rxpos *maybep; /* Pointer to tentative startp array. */ rxpos *endp; /* Ditto for endp. */ int *counters; /* For {} counters */ Scheme_Object *peekskip; + char *prefix; + rxpos prefix_len, prefix_delta; } Regwork; diff --git a/src/mzscheme/src/schvers.h b/src/mzscheme/src/schvers.h index d09f60cb7d..ce19dbda3f 100644 --- a/src/mzscheme/src/schvers.h +++ b/src/mzscheme/src/schvers.h @@ -13,12 +13,12 @@ consistently.) */ -#define MZSCHEME_VERSION "4.2.5.9" +#define MZSCHEME_VERSION "4.2.5.10" #define MZSCHEME_VERSION_X 4 #define MZSCHEME_VERSION_Y 2 #define MZSCHEME_VERSION_Z 5 -#define MZSCHEME_VERSION_W 9 +#define MZSCHEME_VERSION_W 10 #define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y) #define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W)