From 048c4b4a7338027994d81dd77785b44fb8bceaa2 Mon Sep 17 00:00:00 2001 From: Stephen Chang Date: Fri, 29 Jan 2016 11:26:05 -0500 Subject: [PATCH] add unsafe-hash-iterate ops; add specific hash table sequences - refactor for.rkt: abstract in-hash- definitions - refactor hash_table_next in hash.c - move hash fn headers to schpriv.h closes #1229 --- pkgs/base/info.rkt | 2 +- .../scribblings/reference/sequences.scrbl | 47 + .../scribblings/reference/unsafe.scrbl | 88 + pkgs/racket-test-core/tests/racket/hash.rktl | 362 ++-- .../tests/racket/testing.rktl | 1 - .../racket-test-core/tests/racket/unsafe.rktl | 100 + racket/collects/racket/private/for.rkt | 278 +-- racket/src/racket/src/cstartup.inc | 1812 ++++++++--------- racket/src/racket/src/env.c | 1 + racket/src/racket/src/hash.c | 136 +- racket/src/racket/src/list.c | 550 ++++- racket/src/racket/src/schemef.h | 40 - racket/src/racket/src/schminc.h | 2 +- racket/src/racket/src/schpriv.h | 112 +- racket/src/racket/src/schvers.h | 4 +- 15 files changed, 2211 insertions(+), 1324 deletions(-) diff --git a/pkgs/base/info.rkt b/pkgs/base/info.rkt index a86eca1ac0..4e6d31b048 100644 --- a/pkgs/base/info.rkt +++ b/pkgs/base/info.rkt @@ -12,7 +12,7 @@ (define collection 'multi) -(define version "6.4.0.5") +(define version "6.4.0.6") (define deps `("racket-lib" ["racket" #:version ,version])) diff --git a/pkgs/racket-doc/scribblings/reference/sequences.scrbl b/pkgs/racket-doc/scribblings/reference/sequences.scrbl index f6aea18d0d..aae3358a58 100644 --- a/pkgs/racket-doc/scribblings/reference/sequences.scrbl +++ b/pkgs/racket-doc/scribblings/reference/sequences.scrbl @@ -378,6 +378,53 @@ each element in the sequence. (printf "key and value: ~a\n" key+value))] } +@deftogether[( +@defproc[(in-mutable-hash + [hash (and/c hash? (not/c immutable?) (not/c hash-weak?))]) + sequence?] +@defproc[(in-mutable-hash-keys + [hash (and/c hash? (not/c immutable?) (not/c hash-weak?))]) + sequence?] +@defproc[(in-mutable-hash-values + [hash (and/c hash? (not/c immutable?) (not/c hash-weak?))]) + sequence?] +@defproc[(in-mutable-hash-pairs + [hash (and/c hash? (not/c immutable?) (not/c hash-weak?))]) + sequence?] +@defproc[(in-immutable-hash + [hash (and/c hash? immutable?)]) + sequence?] +@defproc[(in-immutable-hash-keys + [hash (and/c hash? immutable?)]) + sequence?] +@defproc[(in-immutable-hash-values + [hash (and/c hash? immutable?)]) + sequence?] +@defproc[(in-immutable-hash-pairs + [hash (and/c hash? immutable?)]) + sequence?] +@defproc[(in-weak-hash + [hash (and/c hash? hash-weak?)]) + sequence?] +@defproc[(in-weak-hash-keys + [hash (and/c hash? hash-weak?)]) + sequence?] +@defproc[(in-weak-hash-values + [hash (and/c hash? hash-weak?)]) + sequence?] +@defproc[(in-weak-hash-pairs + [hash (and/c hash? hash-weak?)]) + sequence?] +)]{ + Sequence constructors for specific kinds of hash tables. + + These may be more performant than the analogous @racket[in-hash] + forms. However, they may consume more space to help with iteration. + + @history[#:added "6.4.0.6"] +} + + @defproc[(in-directory [dir (or/c #f path-string?) #f] [use-dir? ((and/c path? complete-path?) . -> . any/c) (lambda (dir-path) #t)]) diff --git a/pkgs/racket-doc/scribblings/reference/unsafe.scrbl b/pkgs/racket-doc/scribblings/reference/unsafe.scrbl index 42fb0f25d5..588d806846 100644 --- a/pkgs/racket-doc/scribblings/reference/unsafe.scrbl +++ b/pkgs/racket-doc/scribblings/reference/unsafe.scrbl @@ -347,6 +347,94 @@ The index @racket[k] must be between @racket[0] (inclusive) and the number of fields in the structure (exclusive). In the case of @racket[unsafe-struct-set!], the field must be mutable.} +@deftogether[( +@defproc[(unsafe-mutable-hash-iterate-first + [h (and/c hash? (not/c immutable?) (not/c hash-weak?))]) + (or/c #f any/c)] +@defproc[(unsafe-mutable-hash-iterate-next + [h (and/c hash? (not/c immutable?) (not/c hash-weak?))] + [i any/c]) + (or/c #f any/c)] +@defproc[(unsafe-mutable-hash-iterate-key + [h (and/c hash? (not/c immutable?) (not/c hash-weak?))] + [i any/c]) + any/c] +@defproc[(unsafe-mutable-hash-iterate-value + [h (and/c hash? (not/c immutable?) (not/c hash-weak?))] + [i any/c]) + any/c] +@defproc[(unsafe-mutable-hash-iterate-key+value + [h (and/c hash? (not/c immutable?) (not/c hash-weak?))] + [i any/c]) + (values any/c any/c)] +@defproc[(unsafe-mutable-hash-iterate-pair + [h (and/c hash? (not/c immutable?) (not/c hash-weak?))] + [i any/c]) + pair?] +@defproc[(unsafe-immutable-hash-iterate-first + [h (and/c hash? immutable?)]) + (or/c #f any/c)] +@defproc[(unsafe-immutable-hash-iterate-next + [h (and/c hash? immutable?)] + [i any/c]) + (or/c #f any/c)] +@defproc[(unsafe-immutable-hash-iterate-key + [h (and/c hash? immutable?)] + [i any/c]) + any/c] +@defproc[(unsafe-immutable-hash-iterate-value + [h (and/c hash? immutable?)] + [i any/c]) + any/c] +@defproc[(unsafe-immutable-hash-iterate-key+value + [h (and/c hash? immutable?)] + [i any/c]) + (values any/c any/c)] +@defproc[(unsafe-immutable-hash-iterate-pair + [h (and/c hash? immutable?)] + [i any/c]) + pair?] +@defproc[(unsafe-weak-hash-iterate-first + [h (and/c hash? hash-weak?)]) + (or/c #f any/c)] +@defproc[(unsafe-weak-hash-iterate-next + [h (and/c hash? hash-weak?)] + [i any/c]) + (or/c #f any/c)] +@defproc[(unsafe-weak-hash-iterate-key + [h (and/c hash? hash-weak?)] + [i any/c]) + any/c] +@defproc[(unsafe-weak-hash-iterate-value + [h (and/c hash? hash-weak?)] + [i any/c]) + any/c] +@defproc[(unsafe-weak-hash-iterate-key+value + [h (and/c hash? hash-weak?)] + [i any/c]) + (values any/c any/c)] +@defproc[(unsafe-weak-hash-iterate-pair + [h (and/c hash? hash-weak?)] + [i any/c]) + pair?] +)]{ +Unsafe versions of @racket[hash-iterate-key] and similar ops. These operations +support @tech{chaperones} and @tech{impersonators}. + +Each unsafe @code{-first} and @code{-next} operation may not return a number +index but rather an internal representation of a view into the hash structure, +enabling faster iteration. + +The result of these @code{-first} and @code{-next}] functions should be given +to the corresponding unsafe accessor functions. + +If the key or value at the position returned by the @code{-first} and +@code{-next} ops becomes invalid (e.g., because of mutation or garbage +collection), then the operations @exnraise[exn:fail:contract]. + +@history[#:added "6.4.0.6"] +} + @; ------------------------------------------------------------------------ @section[#:tag "unsafeextfl"]{Unsafe Extflonum Operations} diff --git a/pkgs/racket-test-core/tests/racket/hash.rktl b/pkgs/racket-test-core/tests/racket/hash.rktl index 420df4b83a..e9943a9505 100644 --- a/pkgs/racket-test-core/tests/racket/hash.rktl +++ b/pkgs/racket-test-core/tests/racket/hash.rktl @@ -36,144 +36,240 @@ h)) (let () + (define (test-hash-iterations lst1 lst2) + (define ht/immut (make-immutable-hash (map cons lst1 lst2))) + (define ht/mut (make-hash (map cons lst1 lst2))) + (define ht/weak (make-weak-hash (map cons lst1 lst2))) + + (define fake-ht/immut + (chaperone-hash + ht/immut + (lambda (h k) (values k (lambda (h k v) v))) ; ref-proc + (lambda (h k v) values k v) ; set-proc + (lambda (h k) k) ; remove-proc + (lambda (h k) k))) ; key-proc + (define fake-ht/mut + (impersonate-hash + ht/mut + (lambda (h k) (values k (lambda (h k v) v))) ; ref-proc + (lambda (h k v) values k v) ; set-proc + (lambda (h k) k) ; remove-proc + (lambda (h k) k))) ; key-proc + (define fake-ht/weak + (impersonate-hash + ht/weak + (lambda (h k) (values k (lambda (h k v) v))) ; ref-proc + (lambda (h k v) values k v) ; set-proc + (lambda (h k) k) ; remove-proc + (lambda (h k) k))) ; key-proc + + (define ht/immut/seq (in-hash ht/immut)) + (define ht/mut/seq (in-hash ht/mut)) + (define ht/weak/seq (in-hash ht/weak)) + (define ht/immut-pair/seq (in-hash-pairs ht/immut)) + (define ht/mut-pair/seq (in-hash-pairs ht/mut)) + (define ht/weak-pair/seq (in-hash-pairs ht/weak)) + (define ht/immut-keys/seq (in-hash-keys ht/immut)) + (define ht/mut-keys/seq (in-hash-keys ht/mut)) + (define ht/weak-keys/seq (in-hash-keys ht/weak)) + (define ht/immut-vals/seq (in-hash-values ht/immut)) + (define ht/mut-vals/seq (in-hash-values ht/mut)) + (define ht/weak-vals/seq (in-hash-values ht/weak)) + + (test #t + = + (for/sum ([(k v) (in-hash ht/immut)]) (+ k v)) + (for/sum ([(k v) (in-hash ht/mut)]) (+ k v)) + (for/sum ([(k v) (in-hash ht/weak)]) (+ k v)) + (for/sum ([(k v) (in-hash fake-ht/immut)]) (+ k v)) + (for/sum ([(k v) (in-hash fake-ht/mut)]) (+ k v)) + (for/sum ([(k v) (in-hash fake-ht/weak)]) (+ k v)) + (for/sum ([(k v) ht/immut/seq]) (+ k v)) + (for/sum ([(k v) ht/mut/seq]) (+ k v)) + (for/sum ([(k v) ht/weak/seq]) (+ k v)) + (for/sum ([k+v (in-hash-pairs ht/immut)]) (+ (car k+v) (cdr k+v))) + (for/sum ([k+v (in-hash-pairs ht/mut)]) (+ (car k+v) (cdr k+v))) + (for/sum ([k+v (in-hash-pairs ht/weak)]) (+ (car k+v) (cdr k+v))) + (for/sum ([k+v (in-hash-pairs fake-ht/immut)]) + (+ (car k+v) (cdr k+v))) + (for/sum ([k+v (in-hash-pairs fake-ht/mut)]) + (+ (car k+v) (cdr k+v))) + (for/sum ([k+v (in-hash-pairs fake-ht/weak)]) + (+ (car k+v) (cdr k+v))) + (for/sum ([k+v ht/immut-pair/seq]) (+ (car k+v) (cdr k+v))) + (for/sum ([k+v ht/mut-pair/seq]) (+ (car k+v) (cdr k+v))) + (for/sum ([k+v ht/weak-pair/seq]) (+ (car k+v) (cdr k+v))) + (+ (for/sum ([k (in-hash-keys ht/immut)]) k) + (for/sum ([v (in-hash-values ht/immut)]) v)) + (+ (for/sum ([k (in-hash-keys ht/mut)]) k) + (for/sum ([v (in-hash-values ht/mut)]) v)) + (+ (for/sum ([k (in-hash-keys ht/weak)]) k) + (for/sum ([v (in-hash-values ht/weak)]) v)) + (+ (for/sum ([k (in-hash-keys fake-ht/immut)]) k) + (for/sum ([v (in-hash-values fake-ht/immut)]) v)) + (+ (for/sum ([k (in-hash-keys fake-ht/mut)]) k) + (for/sum ([v (in-hash-values fake-ht/mut)]) v)) + (+ (for/sum ([k (in-hash-keys fake-ht/weak)]) k) + (for/sum ([v (in-hash-values fake-ht/weak)]) v)) + (+ (for/sum ([k ht/immut-keys/seq]) k) + (for/sum ([v ht/immut-vals/seq]) v)) + (+ (for/sum ([k ht/mut-keys/seq]) k) + (for/sum ([v ht/mut-vals/seq]) v)) + (+ (for/sum ([k ht/weak-keys/seq]) k) + (for/sum ([v ht/weak-vals/seq]) v))) + + (test #t + = + (for/sum ([(k v) (in-hash ht/immut)]) k) + (for/sum ([(k v) (in-hash ht/mut)]) k) + (for/sum ([(k v) (in-hash ht/weak)]) k) + (for/sum ([(k v) (in-hash fake-ht/immut)]) k) + (for/sum ([(k v) (in-hash fake-ht/mut)]) k) + (for/sum ([(k v) (in-hash fake-ht/weak)]) k) + (for/sum ([(k v) ht/immut/seq]) k) + (for/sum ([(k v) ht/mut/seq]) k) + (for/sum ([(k v) ht/weak/seq]) k) + (for/sum ([k+v (in-hash-pairs ht/immut)]) (car k+v)) + (for/sum ([k+v (in-hash-pairs ht/mut)]) (car k+v)) + (for/sum ([k+v (in-hash-pairs ht/weak)]) (car k+v)) + (for/sum ([k+v (in-hash-pairs fake-ht/immut)]) (car k+v)) + (for/sum ([k+v (in-hash-pairs fake-ht/mut)]) (car k+v)) + (for/sum ([k+v (in-hash-pairs fake-ht/weak)]) (car k+v)) + (for/sum ([k+v ht/immut-pair/seq]) (car k+v)) + (for/sum ([k+v ht/mut-pair/seq]) (car k+v)) + (for/sum ([k+v ht/weak-pair/seq]) (car k+v)) + (for/sum ([k (in-hash-keys ht/immut)]) k) + (for/sum ([k (in-hash-keys ht/mut)]) k) + (for/sum ([k (in-hash-keys ht/weak)]) k) + (for/sum ([k (in-hash-keys fake-ht/immut)]) k) + (for/sum ([k (in-hash-keys fake-ht/mut)]) k) + (for/sum ([k (in-hash-keys fake-ht/weak)]) k) + (for/sum ([k ht/immut-keys/seq]) k) + (for/sum ([k ht/mut-keys/seq]) k) + (for/sum ([k ht/weak-keys/seq]) k)) + + (test #t + = + (for/sum ([(k v) (in-hash ht/immut)]) v) + (for/sum ([(k v) (in-hash ht/mut)]) v) + (for/sum ([(k v) (in-hash ht/weak)]) v) + (for/sum ([(k v) (in-hash fake-ht/immut)]) v) + (for/sum ([(k v) (in-hash fake-ht/mut)]) v) + (for/sum ([(k v) (in-hash fake-ht/weak)]) v) + (for/sum ([(k v) ht/immut/seq]) v) + (for/sum ([(k v) ht/mut/seq]) v) + (for/sum ([(k v) ht/weak/seq]) v) + (for/sum ([k+v (in-hash-pairs ht/immut)]) (cdr k+v)) + (for/sum ([k+v (in-hash-pairs ht/mut)]) (cdr k+v)) + (for/sum ([k+v (in-hash-pairs ht/weak)]) (cdr k+v)) + (for/sum ([k+v (in-hash-pairs fake-ht/immut)]) (cdr k+v)) + (for/sum ([k+v (in-hash-pairs fake-ht/mut)]) (cdr k+v)) + (for/sum ([k+v (in-hash-pairs fake-ht/weak)]) (cdr k+v)) + (for/sum ([k+v ht/immut-pair/seq]) (cdr k+v)) + (for/sum ([k+v ht/mut-pair/seq]) (cdr k+v)) + (for/sum ([k+v ht/weak-pair/seq]) (cdr k+v)) + (for/sum ([v (in-hash-values ht/immut)]) v) + (for/sum ([v (in-hash-values ht/mut)]) v) + (for/sum ([v (in-hash-values ht/weak)]) v) + (for/sum ([v (in-hash-values fake-ht/immut)]) v) + (for/sum ([v (in-hash-values fake-ht/mut)]) v) + (for/sum ([v (in-hash-values fake-ht/weak)]) v) + (for/sum ([v ht/immut-vals/seq]) v) + (for/sum ([v ht/mut-vals/seq]) v) + (for/sum ([v ht/weak-vals/seq]) v))) + (define lst1 (build-list 10 values)) (define lst2 (build-list 10 add1)) + (test-hash-iterations lst1 lst2) + (define lst3 (build-list 100000 values)) + (define lst4 (build-list 100000 add1)) + (test-hash-iterations lst3 lst4)) - (define ht/immut (make-immutable-hash (map cons lst1 lst2))) - (define ht/mut (make-hash (map cons lst1 lst2))) - (define ht/weak (make-weak-hash (map cons lst1 lst2))) - -(define fake-ht/immut - (chaperone-hash - ht/immut - (lambda (h k) (values k (lambda (h k v) v))) ; ref-proc - (lambda (h k v) values k v) ; set-proc - (lambda (h k) k) ; remove-proc - (lambda (h k) k))) ; key-proc -(define fake-ht/mut - (impersonate-hash - ht/mut - (lambda (h k) (values k (lambda (h k v) v))) ; ref-proc - (lambda (h k v) values k v) ; set-proc - (lambda (h k) k) ; remove-proc - (lambda (h k) k))) ; key-proc -(define fake-ht/weak - (impersonate-hash - ht/weak - (lambda (h k) (values k (lambda (h k v) v))) ; ref-proc - (lambda (h k v) values k v) ; set-proc - (lambda (h k) k) ; remove-proc - (lambda (h k) k))) ; key-proc +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - (define ht/immut/seq (in-hash ht/immut)) - (define ht/mut/seq (in-hash ht/mut)) - (define ht/weak/seq (in-hash ht/weak)) - (define ht/immut-pair/seq (in-hash-pairs ht/immut)) - (define ht/mut-pair/seq (in-hash-pairs ht/mut)) - (define ht/weak-pair/seq (in-hash-pairs ht/weak)) - (define ht/immut-keys/seq (in-hash-keys ht/immut)) - (define ht/mut-keys/seq (in-hash-keys ht/mut)) - (define ht/weak-keys/seq (in-hash-keys ht/weak)) - (define ht/immut-vals/seq (in-hash-values ht/immut)) - (define ht/mut-vals/seq (in-hash-values ht/mut)) - (define ht/weak-vals/seq (in-hash-values ht/weak)) +(let () + (define err-msg "no element at index") +;; Check that unsafe-weak-hash-iterate- ops do not segfault +;; when a key is collected before access; throw exception instead. +;; They are used for safe iteration in in-weak-hash- sequence forms + (let () + (define ht #f) - (test #t - = - (for/sum ([(k v) (in-hash ht/immut)]) (+ k v)) - (for/sum ([(k v) (in-hash ht/mut)]) (+ k v)) - (for/sum ([(k v) (in-hash ht/weak)]) (+ k v)) - (for/sum ([(k v) (in-hash fake-ht/immut)]) (+ k v)) - (for/sum ([(k v) (in-hash fake-ht/mut)]) (+ k v)) - (for/sum ([(k v) (in-hash fake-ht/weak)]) (+ k v)) - (for/sum ([(k v) ht/immut/seq]) (+ k v)) - (for/sum ([(k v) ht/mut/seq]) (+ k v)) - (for/sum ([(k v) ht/weak/seq]) (+ k v)) - (for/sum ([k+v (in-hash-pairs ht/immut)]) (+ (car k+v) (cdr k+v))) - (for/sum ([k+v (in-hash-pairs ht/mut)]) (+ (car k+v) (cdr k+v))) - (for/sum ([k+v (in-hash-pairs ht/weak)]) (+ (car k+v) (cdr k+v))) - (for/sum ([k+v (in-hash-pairs fake-ht/immut)]) (+ (car k+v) (cdr k+v))) - (for/sum ([k+v (in-hash-pairs fake-ht/mut)]) (+ (car k+v) (cdr k+v))) - (for/sum ([k+v (in-hash-pairs fake-ht/weak)]) (+ (car k+v) (cdr k+v))) - (for/sum ([k+v ht/immut-pair/seq]) (+ (car k+v) (cdr k+v))) - (for/sum ([k+v ht/mut-pair/seq]) (+ (car k+v) (cdr k+v))) - (for/sum ([k+v ht/weak-pair/seq]) (+ (car k+v) (cdr k+v))) - (+ (for/sum ([k (in-hash-keys ht/immut)]) k) - (for/sum ([v (in-hash-values ht/immut)]) v)) - (+ (for/sum ([k (in-hash-keys ht/mut)]) k) - (for/sum ([v (in-hash-values ht/mut)]) v)) - (+ (for/sum ([k (in-hash-keys ht/weak)]) k) - (for/sum ([v (in-hash-values ht/weak)]) v)) - (+ (for/sum ([k (in-hash-keys fake-ht/immut)]) k) - (for/sum ([v (in-hash-values fake-ht/immut)]) v)) - (+ (for/sum ([k (in-hash-keys fake-ht/mut)]) k) - (for/sum ([v (in-hash-values fake-ht/mut)]) v)) - (+ (for/sum ([k (in-hash-keys fake-ht/weak)]) k) - (for/sum ([v (in-hash-values fake-ht/weak)]) v)) - (+ (for/sum ([k ht/immut-keys/seq]) k) - (for/sum ([v ht/immut-vals/seq]) v)) - (+ (for/sum ([k ht/mut-keys/seq]) k) - (for/sum ([v ht/mut-vals/seq]) v)) - (+ (for/sum ([k ht/weak-keys/seq]) k) - (for/sum ([v ht/weak-vals/seq]) v))) + (let ([lst (build-list 10 add1)]) + (set! ht (make-weak-hash `((,lst . val))))) + + (define i (hash-iterate-first ht)) + + ;; everything ok + (test #t number? i) + (test #t list? (hash-iterate-key ht i)) + (test #t equal? (hash-iterate-value ht i) 'val) + (test #t equal? (cdr (hash-iterate-pair ht i)) 'val) + (test #t equal? + (call-with-values (lambda () (hash-iterate-key+value ht i)) cons) + '((1 2 3 4 5 6 7 8 9 10) . val)) + (test #t boolean? (hash-iterate-next ht i)) - (test #t - = - (for/sum ([(k v) (in-hash ht/immut)]) k) - (for/sum ([(k v) (in-hash ht/mut)]) k) - (for/sum ([(k v) (in-hash ht/weak)]) k) - (for/sum ([(k v) (in-hash fake-ht/immut)]) k) - (for/sum ([(k v) (in-hash fake-ht/mut)]) k) - (for/sum ([(k v) (in-hash fake-ht/weak)]) k) - (for/sum ([(k v) ht/immut/seq]) k) - (for/sum ([(k v) ht/mut/seq]) k) - (for/sum ([(k v) ht/weak/seq]) k) - (for/sum ([k+v (in-hash-pairs ht/immut)]) (car k+v)) - (for/sum ([k+v (in-hash-pairs ht/mut)]) (car k+v)) - (for/sum ([k+v (in-hash-pairs ht/weak)]) (car k+v)) - (for/sum ([k+v (in-hash-pairs fake-ht/immut)]) (car k+v)) - (for/sum ([k+v (in-hash-pairs fake-ht/mut)]) (car k+v)) - (for/sum ([k+v (in-hash-pairs fake-ht/weak)]) (car k+v)) - (for/sum ([k+v ht/immut-pair/seq]) (car k+v)) - (for/sum ([k+v ht/mut-pair/seq]) (car k+v)) - (for/sum ([k+v ht/weak-pair/seq]) (car k+v)) - (for/sum ([k (in-hash-keys ht/immut)]) k) - (for/sum ([k (in-hash-keys ht/mut)]) k) - (for/sum ([k (in-hash-keys ht/weak)]) k) - (for/sum ([k (in-hash-keys fake-ht/immut)]) k) - (for/sum ([k (in-hash-keys fake-ht/mut)]) k) - (for/sum ([k (in-hash-keys fake-ht/weak)]) k) - (for/sum ([k ht/immut-keys/seq]) k) - (for/sum ([k ht/mut-keys/seq]) k) - (for/sum ([k ht/weak-keys/seq]) k)) + ;; collect key, everything should error + (collect-garbage)(collect-garbage)(collect-garbage) + (test #t boolean? (hash-iterate-first ht)) + (err/rt-test (hash-iterate-key ht i) exn:fail:contract? err-msg) + (err/rt-test (hash-iterate-value ht i) exn:fail:contract? err-msg) + (err/rt-test (hash-iterate-pair ht i) exn:fail:contract? err-msg) + (err/rt-test (hash-iterate-key+value ht i) exn:fail:contract? err-msg) + (err/rt-test (hash-iterate-next ht i) exn:fail:contract? err-msg)) - (test #t - = - (for/sum ([(k v) (in-hash ht/immut)]) v) - (for/sum ([(k v) (in-hash ht/mut)]) v) - (for/sum ([(k v) (in-hash ht/weak)]) v) - (for/sum ([(k v) (in-hash fake-ht/immut)]) v) - (for/sum ([(k v) (in-hash fake-ht/mut)]) v) - (for/sum ([(k v) (in-hash fake-ht/weak)]) v) - (for/sum ([(k v) ht/immut/seq]) v) - (for/sum ([(k v) ht/mut/seq]) v) - (for/sum ([(k v) ht/weak/seq]) v) - (for/sum ([k+v (in-hash-pairs ht/immut)]) (cdr k+v)) - (for/sum ([k+v (in-hash-pairs ht/mut)]) (cdr k+v)) - (for/sum ([k+v (in-hash-pairs ht/weak)]) (cdr k+v)) - (for/sum ([k+v (in-hash-pairs fake-ht/immut)]) (cdr k+v)) - (for/sum ([k+v (in-hash-pairs fake-ht/mut)]) (cdr k+v)) - (for/sum ([k+v (in-hash-pairs fake-ht/weak)]) (cdr k+v)) - (for/sum ([k+v ht/immut-pair/seq]) (cdr k+v)) - (for/sum ([k+v ht/mut-pair/seq]) (cdr k+v)) - (for/sum ([k+v ht/weak-pair/seq]) (cdr k+v)) - (for/sum ([v (in-hash-values ht/immut)]) v) - (for/sum ([v (in-hash-values ht/mut)]) v) - (for/sum ([v (in-hash-values ht/weak)]) v) - (for/sum ([v (in-hash-values fake-ht/immut)]) v) - (for/sum ([v (in-hash-values fake-ht/mut)]) v) - (for/sum ([v (in-hash-values fake-ht/weak)]) v) - (for/sum ([v ht/immut-vals/seq]) v) - (for/sum ([v ht/mut-vals/seq]) v) - (for/sum ([v ht/weak-vals/seq]) v))) +;; Check that unsafe mutable hash table operations do not segfault +;; after getting valid index from unsafe-mutable-hash-iterate-first and -next. +;; Throw exception instead since they're used for safe iteration + (let () + (define ht (make-hash '((a . b)))) + + (define i (hash-iterate-first ht)) + + ;; everything ok + (test #t number? i) + (test #t equal? (hash-iterate-key ht i) 'a) + (test #t equal? (hash-iterate-value ht i) 'b) + (test #t equal? (hash-iterate-pair ht i) '(a . b)) + (test #t equal? + (call-with-values (lambda () (hash-iterate-key+value ht i)) cons) + '(a . b)) + (test #t boolean? (hash-iterate-next ht i)) + + ;; remove element, everything should error + (hash-remove! ht 'a) + (test #t boolean? (hash-iterate-first ht)) + (err/rt-test (hash-iterate-key ht i) exn:fail:contract? err-msg) + (err/rt-test (hash-iterate-value ht i) exn:fail:contract? err-msg) + (err/rt-test (hash-iterate-pair ht i) exn:fail:contract? err-msg) + (err/rt-test (hash-iterate-key+value ht i) exn:fail:contract? err-msg) + (err/rt-test (hash-iterate-next ht i) exn:fail:contract? err-msg)) + + + (let () + (define ht (make-weak-hash '((a . b)))) + + (define i (hash-iterate-first ht)) + + ;; everything ok + (test #t number? i) + (test #t equal? (hash-iterate-key ht i) 'a) + (test #t equal? (hash-iterate-value ht i) 'b) + (test #t equal? (hash-iterate-pair ht i) '(a . b)) + (test #t equal? (call-with-values + (lambda () (hash-iterate-key+value ht i)) cons) + '(a . b)) + (test #t boolean? (hash-iterate-next ht i)) + + ;; remove element, everything should error + (hash-remove! ht 'a) + (test #t boolean? (hash-iterate-first ht)) + (err/rt-test (hash-iterate-key ht i) exn:fail:contract?) + (err/rt-test (hash-iterate-value ht i) exn:fail:contract?) + (err/rt-test (hash-iterate-pair ht i) exn:fail:contract?) + (err/rt-test (hash-iterate-key+value ht i) exn:fail:contract?) + (err/rt-test (hash-iterate-next ht i) exn:fail:contract?))) + +(report-errs) diff --git a/pkgs/racket-test-core/tests/racket/testing.rktl b/pkgs/racket-test-core/tests/racket/testing.rktl index 58f02464f9..a04c9cdc90 100644 --- a/pkgs/racket-test-core/tests/racket/testing.rktl +++ b/pkgs/racket-test-core/tests/racket/testing.rktl @@ -217,7 +217,6 @@ transcript. (syntax (thunk-error-test (err:mz:lambda () e) (quote-syntax e) exn?))] [(_ e exn? msg-rx) - (regexp? (syntax-e #'msg-rx)) #'(thunk-error-test (err:mz:lambda () e) (quote-syntax e) diff --git a/pkgs/racket-test-core/tests/racket/unsafe.rktl b/pkgs/racket-test-core/tests/racket/unsafe.rktl index 024318dde1..4238692bbc 100644 --- a/pkgs/racket-test-core/tests/racket/unsafe.rktl +++ b/pkgs/racket-test-core/tests/racket/unsafe.rktl @@ -579,4 +579,104 @@ ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(let () + (define err-msg "no element at index") + +;; Check that unsafe-weak-hash-iterate- ops do not segfault +;; when a key is collected before access; throw exception instead. +;; They are used for safe iteration in in-weak-hash- sequence forms + (let () + (define ht #f) + + (let ([lst (build-list 10 add1)]) + (set! ht (make-weak-hash `((,lst . val))))) + + (define i (unsafe-weak-hash-iterate-first ht)) + + ;; everything ok + (test #t number? i) + (test #t list? (unsafe-weak-hash-iterate-key ht i)) + (test #t equal? (unsafe-weak-hash-iterate-value ht i) 'val) + (test #t equal? (cdr (unsafe-weak-hash-iterate-pair ht i)) 'val) + (test #t equal? + (call-with-values + (lambda () (unsafe-weak-hash-iterate-key+value ht i)) cons) + '((1 2 3 4 5 6 7 8 9 10) . val)) + (test #t boolean? (unsafe-weak-hash-iterate-next ht i)) + + ;; collect key, everything should error (but not segfault) + (collect-garbage)(collect-garbage)(collect-garbage) + (test #t boolean? (unsafe-weak-hash-iterate-first ht)) + (err/rt-test + (unsafe-weak-hash-iterate-key ht i) exn:fail:contract? err-msg) + (err/rt-test + (unsafe-weak-hash-iterate-value ht i) exn:fail:contract? err-msg) + (err/rt-test + (unsafe-weak-hash-iterate-pair ht i) exn:fail:contract? err-msg) + (err/rt-test + (unsafe-weak-hash-iterate-key+value ht i) exn:fail:contract? err-msg) + (err/rt-test + (unsafe-weak-hash-iterate-next ht i) exn:fail:contract? err-msg)) + +;; Check that unsafe mutable hash table operations do not segfault +;; after getting valid index from unsafe-mutable-hash-iterate-first and -next. +;; Throw exception instead since they're used for safe iteration + (let () + (define ht (make-hash '((a . b)))) + (define i (unsafe-mutable-hash-iterate-first ht)) + + ;; everything ok + (test #t number? i) + (test #t equal? (unsafe-mutable-hash-iterate-key ht i) 'a) + (test #t equal? (unsafe-mutable-hash-iterate-value ht i) 'b) + (test #t equal? (unsafe-mutable-hash-iterate-pair ht i) '(a . b)) + (test #t equal? + (call-with-values + (lambda () (unsafe-mutable-hash-iterate-key+value ht i)) cons) + '(a . b)) + (test #t boolean? (unsafe-mutable-hash-iterate-next ht i)) + + ;; remove element, everything should error (but not segfault) + (hash-remove! ht 'a) + (test #t boolean? (unsafe-mutable-hash-iterate-first ht)) + (err/rt-test + (unsafe-mutable-hash-iterate-key ht i) exn:fail:contract? err-msg) + (err/rt-test + (unsafe-mutable-hash-iterate-value ht i) exn:fail:contract? err-msg) + (err/rt-test + (unsafe-mutable-hash-iterate-pair ht i) exn:fail:contract? err-msg) + (err/rt-test + (unsafe-mutable-hash-iterate-key+value ht i) exn:fail:contract? err-msg) + (err/rt-test + (unsafe-mutable-hash-iterate-next ht i) exn:fail:contract? err-msg)) + + (let () + (define ht (make-weak-hash '((a . b)))) + (define i (unsafe-weak-hash-iterate-first ht)) + + ;; everything ok + (test #t number? i) + (test #t equal? (unsafe-weak-hash-iterate-key ht i) 'a) + (test #t equal? (unsafe-weak-hash-iterate-value ht i) 'b) + (test #t equal? (unsafe-weak-hash-iterate-pair ht i) '(a . b)) + (test #t equal? + (call-with-values + (lambda () (unsafe-weak-hash-iterate-key+value ht i)) cons) + '(a . b)) + (test #t boolean? (unsafe-weak-hash-iterate-next ht i)) + + ;; remove element, everything should error (but not segfault) + (hash-remove! ht 'a) + (test #t boolean? (unsafe-weak-hash-iterate-first ht)) + (err/rt-test + (unsafe-weak-hash-iterate-key ht i) exn:fail:contract? err-msg) + (err/rt-test + (unsafe-weak-hash-iterate-value ht i) exn:fail:contract? err-msg) + (err/rt-test + (unsafe-weak-hash-iterate-pair ht i) exn:fail:contract? err-msg) + (err/rt-test + (unsafe-weak-hash-iterate-key+value ht i) exn:fail:contract? err-msg) + (err/rt-test + (unsafe-weak-hash-iterate-next ht i) exn:fail:contract? err-msg))) + (report-errs) diff --git a/racket/collects/racket/private/for.rkt b/racket/collects/racket/private/for.rkt index 381d525b44..205e9cefa5 100644 --- a/racket/collects/racket/private/for.rkt +++ b/racket/collects/racket/private/for.rkt @@ -48,10 +48,24 @@ (rename *in-port in-port) (rename *in-lines in-lines) (rename *in-bytes-lines in-bytes-lines) - (rename *in-hash in-hash) - (rename *in-hash-keys in-hash-keys) - (rename *in-hash-values in-hash-values) - (rename *in-hash-pairs in-hash-pairs) + + (rename in-hash-key+values in-hash) + in-hash-keys + in-hash-values + in-hash-pairs + (rename in-mutable-hash-key+values in-mutable-hash) + in-mutable-hash-keys + in-mutable-hash-values + in-mutable-hash-pairs + (rename in-immutable-hash-key+values in-immutable-hash) + in-immutable-hash-keys + in-immutable-hash-values + in-immutable-hash-pairs + (rename in-weak-hash-key+values in-weak-hash) + in-weak-hash-keys + in-weak-hash-values + in-weak-hash-pairs + in-directory in-sequences @@ -88,6 +102,17 @@ (for-syntax make-in-vector-like for-clause-syntax-protect)) + ;; redefininition of functions not in #%kernel + (begin-for-syntax + (define (format-id ctx str . args) + (define datum + (string->symbol (apply format str (map syntax->datum args)))) + (datum->syntax ctx datum)) + (define (init-list n val) + (if (zero? n) + null + (cons val (init-list (sub1 n) val))))) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; sequence transformers: @@ -171,7 +196,7 @@ (define (for-clause-syntax-protect clause) ;; This is slightly painful. The expansion into `:do-in' involves a lot - ;; of pieces that are no treated as sub-expressions. We have to push the + ;; of pieces that are not treated as sub-expressions. We have to push the ;; taints down to all the relevant identifiers and expressions: (arm-for-clause clause syntax-arm)) @@ -492,7 +517,7 @@ [(string? v) (:string-gen v 0 (string-length v) 1)] [(bytes? v) (:bytes-gen v 0 (bytes-length v) 1)] [(input-port? v) (:input-port-gen v)] - [(hash? v) (:hash-key+val-gen v)] + [(hash? v) (:hash-gen v hash-iterate-key+value)] [(sequence-via-prop? v) ((sequence-ref v) v)] [(:sequence? v) (make-sequence who ((:sequence-ref v) v))] [(stream? v) (:stream-gen v)] @@ -656,128 +681,20 @@ (check-in-bytes-lines p mode) (in-producer (lambda () (read-bytes-line p mode)) eof)])) - (define (in-hash ht) - (unless (hash? ht) (raise-argument-error 'in-hash "hash?" ht)) - (make-do-sequence (lambda () (:hash-key+val-gen ht)))) + (define (in-stream l) + (unless (stream? l) (raise-argument-error 'in-stream "stream?" l)) + (make-do-sequence (lambda () (:stream-gen l)))) + + (define (:stream-gen l) + (values + unsafe-stream-first unsafe-stream-rest l unsafe-stream-not-empty? #f #f)) - (define (:hash-key+val-gen ht) (:hash-gen ht hash-iterate-key+value)) - - (define-sequence-syntax *in-hash - (lambda () #'in-hash) - (lambda (stx) - (syntax-case stx () - [[(k v) (_ ht-expr)] - (for-clause-syntax-protect - #'[(k v) - (:do-in - ;;outer bindings - ([(ht) ht-expr]) - ;; outer check - (unless (hash? ht) (in-hash ht)) - ;; loop bindings - ([i (hash-iterate-first ht)]) - ;; pos check - i - ;; inner bindings - ([(k v) (hash-iterate-key+value ht i)]) - ;; pre guard - #t - ;; post guard - #t - ;; loop args - ((hash-iterate-next ht i)))])] - [_ #f]))) - - (define (in-hash-keys ht) - (unless (hash? ht) (raise-argument-error 'in-hash-keys "hash?" ht)) - (make-do-sequence (lambda () (:hash-gen ht hash-iterate-key)))) - - (define-sequence-syntax *in-hash-keys - (lambda () #'in-hash-keys) - (lambda (stx) - (syntax-case stx () - [[(id) (_ ht-expr)] - (for-clause-syntax-protect - #'[(id) - (:do-in - ;;outer bindings - ([(ht) ht-expr]) - ;; outer check - (unless (hash? ht) (in-hash-keys ht)) - ;; loop bindings - ([i (hash-iterate-first ht)]) - ;; pos check - i - ;; inner bindings - ([(id) (hash-iterate-key ht i)]) - ;; pre guard - #t - ;; post guard - #t - ;; loop args - ((hash-iterate-next ht i)))])] - [_ #f]))) - - (define (in-hash-values ht) - (unless (hash? ht) (raise-argument-error 'in-hash-values "hash?" ht)) - (make-do-sequence (lambda () (:hash-gen ht hash-iterate-value)))) - - (define-sequence-syntax *in-hash-values - (lambda () #'in-hash-values) - (lambda (stx) - (syntax-case stx () - [[(id) (_ ht-expr)] - (for-clause-syntax-protect - #'[(id) - (:do-in - ;;outer bindings - ([(ht) ht-expr]) - ;; outer check - (unless (hash? ht) (in-hash-values ht)) - ;; loop bindings - ([i (hash-iterate-first ht)]) - ;; pos check - i - ;; inner bindings - ([(id) (hash-iterate-value ht i)]) - ;; pre guard - #t - ;; post guard - #t - ;; loop args - ((hash-iterate-next ht i)))])] - [_ #f]))) - - (define (in-hash-pairs ht) - (unless (hash? ht) (raise-argument-error 'in-hash-values "hash?" ht)) - (make-do-sequence (lambda () (:hash-gen ht hash-iterate-pair)))) - - (define-sequence-syntax *in-hash-pairs - (lambda () #'in-hash-pairs) - (lambda (stx) - (syntax-case stx () - [[(id) (_ ht-expr)] - (for-clause-syntax-protect - #'[(id) - (:do-in - ;;outer bindings - ([(ht) ht-expr]) - ;; outer check - (unless (hash? ht) (in-hash-pairs ht)) - ;; loop bindings - ([i (hash-iterate-first ht)]) - ;; pos check - i - ;; inner bindings - ([(id) (hash-iterate-pair ht i)]) - ;; pre guard - #t - ;; post guard - #t - ;; loop args - ((hash-iterate-next ht i)))])] - [_ #f]))) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; hash sequences + + ;; assembles hash iterator functions to give to make-do-sequence (define (:hash-gen ht sel) (values (lambda (pos) (sel ht pos)) (lambda (pos) (hash-iterate-next ht pos)) @@ -786,12 +703,109 @@ #f #f)) - (define (in-stream l) - (unless (stream? l) (raise-argument-error 'in-stream "stream?" l)) - (make-do-sequence (lambda () (:stream-gen l)))) - - (define (:stream-gen l) - (values unsafe-stream-first unsafe-stream-rest l unsafe-stream-not-empty? #f #f)) + ;; each call defines 4 in-hash- sequences for a kind of VAL + ;; - one generic + ;; - one for each hash table type: immutable, mutable, weak + ;; where VAL = key, value, pair, etc + (define-syntax (define-in-hash-sequences stx) + (syntax-case stx (element-type: num-vals:) + [(_ element-type: VAL) ; eg, VAL = key, value, pair + #'(define-in-hash-sequences element-type: VAL num-vals: 1)] + [(_ element-type: VAL num-vals: n) + (with-syntax + ([IN-HASH-SEQUENCE-DEFINER-NAME + (format-id #'VAL "define-in-hash-~as-sequence" #'VAL)] + [FALLBACK-SEQUENCE-NAME (format-id #'VAL "default-in-hash-~as" #'VAL)] + [-fallback-accessor (format-id #'VAL "hash-iterate-~a" #'VAL)] + [IDs (generate-temporaries (init-list (syntax-e #'n) 'x))]) + #'(begin + ;; 1) define fallback sequence constructor function for VAL type + ;; (using make-do-sequence) + (define (FALLBACK-SEQUENCE-NAME ht) + (unless (hash? ht) + (raise-argument-error 'FALLBACK-SEQUENCE-NAME "hash?" ht)) + (make-do-sequence (lambda () (:hash-gen ht -fallback-accessor)))) + ;; 2) define sequence syntax definer + ;; defines sequences in-HASHTYPE-hash-VALs, eg: + ;; - in-mutable-hash-keys + ;; - in-immutable-hash-pairs, etc + (define-syntax (IN-HASH-SEQUENCE-DEFINER-NAME stx) + (syntax-case stx (hash-type: outer-check: => :generic) + ;; defines generic in-hash-VALs sequence + [(def :generic) + (with-syntax + ([_generic-sequence-name (format-id #'def "in-hash-~as" #'VAL)] + [_safe-iterate-fn-prefix (format-id #'def "hash-iterate")]) + #'(IN-HASH-SEQUENCE-DEFINER-NAME + _generic-sequence-name + _safe-iterate-fn-prefix + outer-check: (ht) => (hash? ht)))] + ;; defines in-hash-VALs sequence for a specific kind of hash table + ;; eg, HASHTYPE = mutable, immutable, weak + [(def hash-type: HASHTYPE outer-check: . test-clause) + (with-syntax + ([_sequence-name + (format-id #'def "in-~a-hash-~as" #'HASHTYPE #'VAL)] + [_unsafe-iterate-fn-prefix + (format-id #'def "unsafe-~a-hash-iterate" #'HASHTYPE)]) + #'(IN-HASH-SEQUENCE-DEFINER-NAME + _sequence-name + _unsafe-iterate-fn-prefix + outer-check: . test-clause))] + ;; main (internal) clause + [(_ IN-HASH-SEQUENCE-NAME PREFIX outer-check: (HT) => TEST-EXPR) + (with-syntax + ([-iterate-first (format-id #'PREFIX "~a-first" #'PREFIX)] + [-iterate-next (format-id #'PREFIX "~a-next" #'PREFIX)] + [-iterate-VAL (format-id #'PREFIX "~a-~a" #'PREFIX #'VAL)]) + #'(define-sequence-syntax IN-HASH-SEQUENCE-NAME + (lambda () #'FALLBACK-SEQUENCE-NAME) + (lambda (stx) + (syntax-case stx () + [[IDs (_ ht-expr)] + (for-clause-syntax-protect + #'[IDs + (:do-in + ;;outer bindings + ([(HT) ht-expr]) + ;; outer check + (unless TEST-EXPR (FALLBACK-SEQUENCE-NAME HT)) + ;; loop bindings + ([i (-iterate-first HT)]) + ;; pos check + i + ;; inner bindings + ([IDs (-iterate-VAL HT i)]) + ;; pre guard + #t + ;; post guard + #t + ;; loop args + ((-iterate-next HT i)))])] + [_ #f]))))])) + ;; 3) define sequence syntaxes (using definer): + ;; - in-hash-VALs, works for any hash table + ;; - one in-HASHTYPE-hash-VALs for each kind of hash table: + ;; - immutable, mutable, and weak + ;; - enables faster iteration using unsafe functions + (IN-HASH-SEQUENCE-DEFINER-NAME :generic) + (IN-HASH-SEQUENCE-DEFINER-NAME + hash-type: mutable + outer-check: (ht) => (and (hash? ht) + (not (immutable? ht)) + (not (hash-weak? ht)))) + (IN-HASH-SEQUENCE-DEFINER-NAME + hash-type: immutable + outer-check: (ht) => (and (hash? ht) (immutable? ht))) + (IN-HASH-SEQUENCE-DEFINER-NAME + hash-type: weak + outer-check: (ht) => (and (hash? ht) (hash-weak? ht))) + ))])) + + (define-in-hash-sequences element-type: key+value num-vals: 2) + (define-in-hash-sequences element-type: key) + (define-in-hash-sequences element-type: value) + (define-in-hash-sequences element-type: pair) ;; Vector-like sequences -------------------------------------------------- diff --git a/racket/src/racket/src/cstartup.inc b/racket/src/racket/src/cstartup.inc index 8e3f24f570..fff472d4f6 100644 --- a/racket/src/racket/src/cstartup.inc +++ b/racket/src/racket/src/cstartup.inc @@ -1,5 +1,5 @@ { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,52,46,48,46,53,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,52,46,48,46,54,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,54,0,0,0,1,0,0,8,0,18,0, 22,0,26,0,31,0,38,0,42,0,47,0,59,0,66,0,69,0,82,0,89, 0,94,0,103,0,109,0,123,0,137,0,140,0,146,0,157,0,159,0,173,0, @@ -102,8 +102,8 @@ EVAL_ONE_SIZED_STR((char *)expr, 2090); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,52,46,48,46,53,84,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,192,0,0,0,1,0,0,8,0,16,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,52,46,48,46,54,84,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,194,0,0,0,1,0,0,8,0,16,0, 29,0,34,0,51,0,63,0,85,0,114,0,158,0,164,0,178,0,193,0,211, 0,223,0,239,0,253,0,19,1,39,1,73,1,90,1,107,1,130,1,145,1, 184,1,202,1,233,1,245,1,6,2,18,2,33,2,57,2,89,2,118,2,134, @@ -118,350 +118,353 @@ 22,104,23,182,25,206,25,68,26,150,27,157,27,209,27,222,27,212,28,228,28, 83,29,242,29,249,29,126,31,203,31,220,31,120,32,140,32,200,32,207,32,67, 33,121,33,140,33,91,34,107,34,68,35,69,36,106,36,115,36,202,37,47,40, -63,40,130,40,151,40,171,40,191,40,248,40,221,43,187,44,203,44,174,45,232, -45,9,46,141,46,44,47,60,47,157,47,174,47,252,49,47,52,63,52,37,54, -225,54,227,54,254,54,14,55,30,55,127,55,194,56,126,57,142,57,151,57,158, -57,224,58,34,60,152,60,198,63,72,64,204,64,149,66,99,67,141,67,249,67, -0,0,197,75,0,0,3,1,5,105,110,115,112,48,69,35,37,117,116,105,108, -115,74,112,97,116,104,45,115,116,114,105,110,103,63,66,98,115,98,115,78,110, -111,114,109,97,108,45,99,97,115,101,45,112,97,116,104,73,114,101,114,111,111, -116,45,112,97,116,104,1,20,102,105,110,100,45,101,120,101,99,117,116,97,98, -108,101,45,112,97,116,104,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,42,99,97,108,108, -45,119,105,116,104,45,100,101,102,97,117,108,116,45,114,101,97,100,105,110,103, -45,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,67,113,117,111, -116,101,29,94,2,10,70,35,37,112,97,114,97,109,122,11,76,45,99,104,101, -99,107,45,114,101,108,112,97,116,104,79,45,99,104,101,99,107,45,99,111,108, -108,101,99,116,105,111,110,73,45,99,104,101,99,107,45,102,97,105,108,77,99, -111,108,108,101,99,116,105,111,110,45,112,97,116,104,75,102,105,110,100,45,99, -111,108,45,102,105,108,101,1,20,99,111,108,108,101,99,116,105,111,110,45,102, -105,108,101,45,112,97,116,104,1,18,102,105,110,100,45,109,97,105,110,45,99, -111,108,108,101,99,116,115,1,32,101,120,101,45,114,101,108,97,116,105,118,101, -45,112,97,116,104,45,62,99,111,109,112,108,101,116,101,45,112,97,116,104,78, -102,105,110,100,45,109,97,105,110,45,99,111,110,102,105,103,78,103,101,116,45, -99,111,110,102,105,103,45,116,97,98,108,101,1,21,103,101,116,45,105,110,115, -116,97,108,108,97,116,105,111,110,45,110,97,109,101,76,99,111,101,114,99,101, -45,116,111,45,112,97,116,104,1,37,99,111,108,108,101,99,116,115,45,114,101, -108,97,116,105,118,101,45,112,97,116,104,45,62,99,111,109,112,108,101,116,101, -45,112,97,116,104,79,97,100,100,45,99,111,110,102,105,103,45,115,101,97,114, -99,104,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,108,105,110,107,115,73,108,105,110,107,115,45,99,97, -99,104,101,78,115,116,97,109,112,45,112,114,111,109,112,116,45,116,97,103,73, -102,105,108,101,45,62,115,116,97,109,112,76,110,111,45,102,105,108,101,45,115, -116,97,109,112,63,1,22,103,101,116,45,108,105,110,107,101,100,45,99,111,108, -108,101,99,116,105,111,110,115,1,30,110,111,114,109,97,108,105,122,101,45,99, -111,108,108,101,99,116,105,111,110,45,114,101,102,101,114,101,110,99,101,1,27, -102,105,108,101,45,101,120,105,115,116,115,63,47,109,97,121,98,101,45,99,111, -109,112,105,108,101,100,77,112,97,116,104,45,97,100,100,45,115,117,102,102,105, -120,79,99,104,101,99,107,45,115,117,102,102,105,120,45,99,97,108,108,1,18, -112,97,116,104,45,97,100,106,117,115,116,45,115,117,102,102,105,120,1,19,112, -97,116,104,45,114,101,112,108,97,99,101,45,115,117,102,102,105,120,79,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,75,101,109,98,101,100,100,101,100,45,108,111,97,100,78,110,111, -114,109,97,108,45,112,97,116,104,45,99,97,115,101,6,41,41,40,111,114,47, -99,32,112,97,116,104,45,102,111,114,45,115,111,109,101,45,115,121,115,116,101, -109,63,32,112,97,116,104,45,115,116,114,105,110,103,63,41,69,119,105,110,100, -111,119,115,6,2,2,92,49,6,41,41,40,111,114,47,99,32,112,97,116,104, -45,115,116,114,105,110,103,63,32,112,97,116,104,45,102,111,114,45,115,111,109, -101,45,115,121,115,116,101,109,63,41,6,4,4,112,97,116,104,5,8,92,92, -63,92,82,69,76,92,6,12,12,112,97,116,104,45,115,116,114,105,110,103,63, -70,114,101,108,97,116,105,118,101,66,108,111,111,112,5,0,6,30,30,40,112, -114,111,99,101,100,117,114,101,45,97,114,105,116,121,45,105,110,99,108,117,100, -101,115,47,99,32,48,41,6,21,21,105,110,118,97,108,105,100,32,114,101,108, -97,116,105,118,101,32,112,97,116,104,6,18,18,40,97,110,121,47,99,32,46, -32,45,62,32,46,32,97,110,121,41,74,99,111,108,108,101,99,116,115,45,100, -105,114,71,101,120,101,99,45,102,105,108,101,70,111,114,105,103,45,100,105,114, -72,99,111,110,102,105,103,45,100,105,114,79,105,110,115,116,97,108,108,97,116, -105,111,110,45,110,97,109,101,6,10,10,108,105,110,107,115,46,114,107,116,100, -71,97,100,100,111,110,45,100,105,114,71,102,115,45,99,104,97,110,103,101,67, -101,114,114,111,114,66,114,111,111,116,73,115,116,97,116,105,99,45,114,111,111, -116,6,0,0,6,1,1,47,5,3,46,122,111,6,40,40,114,101,109,111,118, -105,110,103,32,115,117,102,102,105,120,32,109,97,107,101,115,32,112,97,116,104, -32,101,108,101,109,101,110,116,32,101,109,112,116,121,6,10,10,103,105,118,101, -110,32,112,97,116,104,5,1,95,6,21,21,40,111,114,47,99,32,115,116,114, -105,110,103,63,32,98,121,116,101,115,63,41,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,68,102,105,110,105,115,104,5,11,80,76,84, -67,79,76,76,69,67,84,83,1,20,99,111,108,108,101,99,116,115,45,115,101, -97,114,99,104,45,100,105,114,115,6,8,8,99,111,108,108,101,99,116,115,27, -248,22,182,15,194,28,192,192,28,248,22,157,7,194,27,248,22,141,16,195,28, -192,192,248,22,142,16,195,11,0,21,35,114,120,34,94,91,92,92,93,91,92, -92,93,91,63,93,91,92,92,93,34,0,6,35,114,120,34,47,34,0,22,35, -114,120,34,91,47,92,92,93,91,46,32,93,43,91,47,92,92,93,42,36,34, -0,19,35,114,120,34,91,32,46,93,43,40,91,47,92,92,93,42,41,36,34, -86,94,28,28,248,22,183,15,23,195,2,10,28,248,22,182,15,23,195,2,10, +63,40,130,40,151,40,171,40,191,40,248,40,221,43,187,44,203,44,176,45,234, +45,11,46,143,46,46,47,62,47,160,47,177,47,3,50,57,52,73,52,89,52, +184,52,236,53,168,54,170,54,197,54,213,54,229,54,71,55,140,56,72,57,88, +57,97,57,104,57,170,58,236,59,98,60,144,63,18,64,150,64,95,66,45,67, +87,67,195,67,0,0,143,75,0,0,3,1,5,105,110,115,112,48,69,35,37, +117,116,105,108,115,74,112,97,116,104,45,115,116,114,105,110,103,63,66,98,115, +98,115,78,110,111,114,109,97,108,45,99,97,115,101,45,112,97,116,104,73,114, +101,114,111,111,116,45,112,97,116,104,1,20,102,105,110,100,45,101,120,101,99, +117,116,97,98,108,101,45,112,97,116,104,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,42, +99,97,108,108,45,119,105,116,104,45,100,101,102,97,117,108,116,45,114,101,97, +100,105,110,103,45,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110, +67,113,117,111,116,101,29,94,2,10,70,35,37,112,97,114,97,109,122,11,76, +45,99,104,101,99,107,45,114,101,108,112,97,116,104,79,45,99,104,101,99,107, +45,99,111,108,108,101,99,116,105,111,110,73,45,99,104,101,99,107,45,102,97, +105,108,77,99,111,108,108,101,99,116,105,111,110,45,112,97,116,104,75,102,105, +110,100,45,99,111,108,45,102,105,108,101,1,20,99,111,108,108,101,99,116,105, +111,110,45,102,105,108,101,45,112,97,116,104,1,18,102,105,110,100,45,109,97, +105,110,45,99,111,108,108,101,99,116,115,1,32,101,120,101,45,114,101,108,97, +116,105,118,101,45,112,97,116,104,45,62,99,111,109,112,108,101,116,101,45,112, +97,116,104,78,102,105,110,100,45,109,97,105,110,45,99,111,110,102,105,103,78, +103,101,116,45,99,111,110,102,105,103,45,116,97,98,108,101,1,21,103,101,116, +45,105,110,115,116,97,108,108,97,116,105,111,110,45,110,97,109,101,76,99,111, +101,114,99,101,45,116,111,45,112,97,116,104,1,37,99,111,108,108,101,99,116, +115,45,114,101,108,97,116,105,118,101,45,112,97,116,104,45,62,99,111,109,112, +108,101,116,101,45,112,97,116,104,79,97,100,100,45,99,111,110,102,105,103,45, +115,101,97,114,99,104,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,108,105,110,107,115,73,108,105,110,107, +115,45,99,97,99,104,101,78,115,116,97,109,112,45,112,114,111,109,112,116,45, +116,97,103,73,102,105,108,101,45,62,115,116,97,109,112,76,110,111,45,102,105, +108,101,45,115,116,97,109,112,63,1,22,103,101,116,45,108,105,110,107,101,100, +45,99,111,108,108,101,99,116,105,111,110,115,1,30,110,111,114,109,97,108,105, +122,101,45,99,111,108,108,101,99,116,105,111,110,45,114,101,102,101,114,101,110, +99,101,1,27,102,105,108,101,45,101,120,105,115,116,115,63,47,109,97,121,98, +101,45,99,111,109,112,105,108,101,100,77,112,97,116,104,45,97,100,100,45,115, +117,102,102,105,120,79,99,104,101,99,107,45,115,117,102,102,105,120,45,99,97, +108,108,1,18,112,97,116,104,45,97,100,106,117,115,116,45,115,117,102,102,105, +120,1,19,112,97,116,104,45,114,101,112,108,97,99,101,45,115,117,102,102,105, +120,79,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,75,101,109,98,101,100,100,101,100,45,108,111,97, +100,78,110,111,114,109,97,108,45,112,97,116,104,45,99,97,115,101,6,41,41, +40,111,114,47,99,32,112,97,116,104,45,102,111,114,45,115,111,109,101,45,115, +121,115,116,101,109,63,32,112,97,116,104,45,115,116,114,105,110,103,63,41,69, +119,105,110,100,111,119,115,6,2,2,92,49,6,41,41,40,111,114,47,99,32, +112,97,116,104,45,115,116,114,105,110,103,63,32,112,97,116,104,45,102,111,114, +45,115,111,109,101,45,115,121,115,116,101,109,63,41,6,4,4,112,97,116,104, +5,8,92,92,63,92,82,69,76,92,6,12,12,112,97,116,104,45,115,116,114, +105,110,103,63,70,114,101,108,97,116,105,118,101,66,108,111,111,112,5,0,6, +30,30,40,112,114,111,99,101,100,117,114,101,45,97,114,105,116,121,45,105,110, +99,108,117,100,101,115,47,99,32,48,41,6,21,21,105,110,118,97,108,105,100, +32,114,101,108,97,116,105,118,101,32,112,97,116,104,6,18,18,40,97,110,121, +47,99,32,46,32,45,62,32,46,32,97,110,121,41,74,99,111,108,108,101,99, +116,115,45,100,105,114,71,101,120,101,99,45,102,105,108,101,70,111,114,105,103, +45,100,105,114,72,99,111,110,102,105,103,45,100,105,114,79,105,110,115,116,97, +108,108,97,116,105,111,110,45,110,97,109,101,6,10,10,108,105,110,107,115,46, +114,107,116,100,71,97,100,100,111,110,45,100,105,114,71,102,115,45,99,104,97, +110,103,101,67,101,114,114,111,114,66,114,111,111,116,73,115,116,97,116,105,99, +45,114,111,111,116,6,0,0,6,1,1,47,5,3,46,122,111,6,40,40,114, +101,109,111,118,105,110,103,32,115,117,102,102,105,120,32,109,97,107,101,115,32, +112,97,116,104,32,101,108,101,109,101,110,116,32,101,109,112,116,121,6,10,10, +103,105,118,101,110,32,112,97,116,104,5,1,95,6,21,21,40,111,114,47,99, +32,115,116,114,105,110,103,63,32,98,121,116,101,115,63,41,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,68,102,105,110,105,115,104,5, +11,80,76,84,67,79,76,76,69,67,84,83,1,20,99,111,108,108,101,99,116, +115,45,115,101,97,114,99,104,45,100,105,114,115,6,8,8,99,111,108,108,101, +99,116,115,27,248,22,182,15,194,28,192,192,28,248,22,157,7,194,27,248,22, +141,16,195,28,192,192,248,22,142,16,195,11,0,21,35,114,120,34,94,91,92, +92,93,91,92,92,93,91,63,93,91,92,92,93,34,0,6,35,114,120,34,47, +34,0,22,35,114,120,34,91,47,92,92,93,91,46,32,93,43,91,47,92,92, +93,42,36,34,0,19,35,114,120,34,91,32,46,93,43,40,91,47,92,92,93, +42,41,36,34,86,94,28,28,248,22,183,15,23,195,2,10,28,248,22,182,15, +23,195,2,10,28,248,22,157,7,23,195,2,28,248,22,141,16,23,195,2,10, +248,22,142,16,23,195,2,11,12,250,22,186,11,2,41,2,42,23,197,2,28, +28,248,22,183,15,23,195,2,249,22,173,9,248,22,184,15,23,197,2,2,43, +249,22,173,9,247,22,184,8,2,43,27,28,248,22,157,7,23,196,2,23,195, +2,248,22,169,8,248,22,187,15,23,197,2,28,249,22,179,16,2,79,23,195, +2,28,248,22,157,7,195,248,22,190,15,195,194,86,94,23,195,1,27,248,22, +132,8,23,195,1,249,22,191,15,248,22,172,8,250,22,187,16,2,80,28,249, +22,179,16,2,81,23,201,2,23,199,1,250,22,187,16,2,82,23,202,1,2, +44,80,144,47,40,41,2,43,28,248,22,157,7,194,248,22,190,15,194,193,0, +28,35,114,120,34,94,92,92,92,92,92,92,92,92,91,63,93,92,92,92,92, +85,78,67,92,92,92,92,34,86,95,28,28,28,248,22,182,15,23,195,2,10, 28,248,22,157,7,23,195,2,28,248,22,141,16,23,195,2,10,248,22,142,16, -23,195,2,11,12,250,22,186,11,2,41,2,42,23,197,2,28,28,248,22,183, -15,23,195,2,249,22,173,9,248,22,184,15,23,197,2,2,43,249,22,173,9, -247,22,184,8,2,43,27,28,248,22,157,7,23,196,2,23,195,2,248,22,169, -8,248,22,187,15,23,197,2,28,249,22,179,16,2,79,23,195,2,28,248,22, -157,7,195,248,22,190,15,195,194,86,94,23,195,1,27,248,22,132,8,23,195, -1,249,22,191,15,248,22,172,8,250,22,187,16,2,80,28,249,22,179,16,2, -81,23,201,2,23,199,1,250,22,187,16,2,82,23,202,1,2,44,80,144,47, -40,41,2,43,28,248,22,157,7,194,248,22,190,15,194,193,0,28,35,114,120, -34,94,92,92,92,92,92,92,92,92,91,63,93,92,92,92,92,85,78,67,92, -92,92,92,34,86,95,28,28,28,248,22,182,15,23,195,2,10,28,248,22,157, +23,195,2,11,10,248,22,183,15,23,195,2,12,252,22,186,11,2,6,2,45, +39,23,199,2,23,200,2,28,28,28,248,22,182,15,23,196,2,10,28,248,22, +157,7,23,196,2,28,248,22,141,16,23,196,2,10,248,22,142,16,23,196,2, +11,10,248,22,183,15,23,196,2,12,252,22,186,11,2,6,2,45,40,23,199, +2,23,200,2,27,28,248,22,183,15,23,196,2,248,22,184,15,23,196,2,247, +22,185,15,86,95,28,28,248,22,143,16,23,196,2,10,249,22,173,9,247,22, +185,15,23,195,2,12,253,22,188,11,2,6,6,54,54,112,97,116,104,32,105, +115,32,110,111,116,32,99,111,109,112,108,101,116,101,32,97,110,100,32,110,111, +116,32,116,104,101,32,112,108,97,116,102,111,114,109,39,115,32,99,111,110,118, +101,110,116,105,111,110,2,46,23,201,2,6,24,24,112,108,97,116,102,111,114, +109,32,99,111,110,118,101,110,116,105,111,110,32,116,121,112,101,247,22,185,15, +28,249,22,173,9,28,248,22,183,15,23,199,2,248,22,184,15,23,199,2,247, +22,185,15,23,195,2,12,253,22,188,11,2,6,6,37,37,103,105,118,101,110, +32,112,97,116,104,115,32,117,115,101,32,100,105,102,102,101,114,101,110,116,32, +99,111,110,118,101,110,116,105,111,110,115,2,46,23,201,2,6,9,9,114,111, +111,116,32,112,97,116,104,23,202,2,27,27,248,22,147,16,28,248,22,143,16, +23,199,2,23,198,1,248,22,144,16,23,199,1,86,94,28,28,248,22,183,15, +23,194,2,10,28,248,22,182,15,23,194,2,10,28,248,22,157,7,23,194,2, +28,248,22,141,16,23,194,2,10,248,22,142,16,23,194,2,11,12,250,22,186, +11,2,41,2,42,23,196,2,28,28,248,22,183,15,23,194,2,249,22,173,9, +248,22,184,15,23,196,2,2,43,249,22,173,9,247,22,184,8,2,43,27,28, +248,22,157,7,23,195,2,23,194,2,248,22,169,8,248,22,187,15,23,196,2, +28,249,22,179,16,2,79,23,195,2,28,248,22,157,7,194,248,22,190,15,194, +193,86,94,23,194,1,27,248,22,132,8,23,195,1,249,22,191,15,248,22,172, +8,250,22,187,16,2,80,28,249,22,179,16,2,81,23,201,2,23,199,1,250, +22,187,16,2,82,23,202,1,2,44,80,144,50,40,41,2,43,28,248,22,157, +7,193,248,22,190,15,193,192,27,248,22,187,15,23,195,2,28,249,22,173,9, +23,197,2,66,117,110,105,120,28,249,22,154,8,194,5,1,47,28,248,22,183, +15,198,197,248,22,190,15,198,249,22,136,16,199,249,22,191,15,249,22,157,8, +248,22,187,15,200,40,198,86,94,23,194,1,28,249,22,173,9,23,197,2,2, +43,249,22,136,16,23,200,1,249,22,191,15,28,249,22,179,16,0,27,35,114, +120,34,94,92,92,92,92,92,92,92,92,91,63,93,92,92,92,92,91,97,45, +122,93,58,34,23,199,2,251,22,158,8,2,47,250,22,157,8,203,43,44,5, +1,92,249,22,157,8,202,45,28,249,22,179,16,2,84,23,199,2,249,22,158, +8,2,47,249,22,157,8,200,43,28,249,22,179,16,2,84,23,199,2,249,22, +158,8,2,47,249,22,157,8,200,43,28,249,22,179,16,0,14,35,114,120,34, +94,92,92,92,92,92,92,92,92,34,23,199,2,249,22,158,8,5,4,85,78, +67,92,249,22,157,8,200,41,28,249,22,179,16,0,12,35,114,120,34,94,91, +97,45,122,93,58,34,198,249,22,158,8,250,22,157,8,201,39,40,249,22,157, +8,200,41,12,198,12,32,86,88,148,8,36,42,56,11,72,102,111,117,110,100, +45,101,120,101,99,222,33,89,32,87,88,148,8,36,43,61,11,66,110,101,120, +116,222,33,88,27,248,22,145,16,23,196,2,28,249,22,175,9,23,195,2,23, +197,1,11,28,248,22,141,16,23,194,2,27,249,22,136,16,23,197,1,23,196, +1,28,23,197,2,90,144,42,11,89,146,42,39,11,248,22,139,16,23,197,2, +86,95,23,195,1,23,194,1,27,28,23,202,2,27,248,22,145,16,23,199,2, +28,249,22,175,9,23,195,2,23,200,2,11,28,248,22,141,16,23,194,2,250, +2,86,23,205,2,23,206,2,249,22,136,16,23,200,2,23,198,1,250,2,86, +23,205,2,23,206,2,23,196,1,11,28,23,193,2,192,86,94,23,193,1,27, +28,248,22,182,15,23,196,2,27,249,22,136,16,23,198,2,23,205,2,28,28, +248,22,131,16,193,10,248,22,130,16,193,192,11,11,28,23,193,2,192,86,94, +23,193,1,28,23,203,2,11,27,248,22,145,16,23,200,2,28,249,22,175,9, +194,23,201,1,11,28,248,22,141,16,193,250,2,86,205,206,249,22,136,16,200, +197,250,2,86,205,206,195,192,86,94,23,194,1,28,23,196,2,90,144,42,11, +89,146,42,39,11,248,22,139,16,23,197,2,86,95,23,195,1,23,194,1,27, +28,23,201,2,27,248,22,145,16,23,199,2,28,249,22,175,9,23,195,2,23, +200,2,11,28,248,22,141,16,23,194,2,250,2,86,23,204,2,23,205,2,249, +22,136,16,23,200,2,23,198,1,250,2,86,23,204,2,23,205,2,23,196,1, +11,28,23,193,2,192,86,94,23,193,1,27,28,248,22,182,15,23,196,2,27, +249,22,136,16,23,198,2,23,204,2,28,28,248,22,131,16,193,10,248,22,130, +16,193,192,11,11,28,23,193,2,192,86,94,23,193,1,28,23,202,2,11,27, +248,22,145,16,23,200,2,28,249,22,175,9,194,23,201,1,11,28,248,22,141, +16,193,250,2,86,204,205,249,22,136,16,200,197,250,2,86,204,205,195,192,28, +23,193,2,90,144,42,11,89,146,42,39,11,248,22,139,16,23,199,2,86,95, +23,195,1,23,194,1,27,28,23,198,2,251,2,87,23,198,2,23,203,2,23, +201,2,23,202,2,11,28,23,193,2,192,86,94,23,193,1,27,28,248,22,182, +15,195,27,249,22,136,16,197,200,28,28,248,22,131,16,193,10,248,22,130,16, +193,192,11,11,28,192,192,28,198,11,251,2,87,198,203,201,202,194,32,90,88, +148,8,36,43,60,11,2,50,222,33,91,28,248,22,90,23,197,2,11,27,249, +22,136,16,248,22,144,16,248,22,83,23,201,2,23,196,2,28,248,22,130,16, +23,194,2,250,2,86,197,198,195,86,94,23,193,1,27,248,22,174,20,23,199, +1,28,248,22,90,23,194,2,11,27,249,22,136,16,248,22,144,16,248,22,83, +23,198,2,23,198,2,28,248,22,130,16,23,194,2,250,2,86,199,200,195,86, +94,23,193,1,27,248,22,174,20,23,196,1,28,248,22,90,23,194,2,11,27, +249,22,136,16,248,22,144,16,248,22,83,23,198,2,23,200,2,28,248,22,130, +16,23,194,2,250,2,86,201,202,195,86,94,23,193,1,27,248,22,174,20,23, +196,1,28,248,22,90,23,194,2,11,27,249,22,136,16,248,22,144,16,248,22, +83,197,201,28,248,22,130,16,193,250,2,86,203,204,195,251,2,90,203,204,205, +248,22,174,20,198,86,95,28,28,248,22,182,15,23,195,2,10,28,248,22,157, 7,23,195,2,28,248,22,141,16,23,195,2,10,248,22,142,16,23,195,2,11, -10,248,22,183,15,23,195,2,12,252,22,186,11,2,6,2,45,39,23,199,2, -23,200,2,28,28,28,248,22,182,15,23,196,2,10,28,248,22,157,7,23,196, -2,28,248,22,141,16,23,196,2,10,248,22,142,16,23,196,2,11,10,248,22, -183,15,23,196,2,12,252,22,186,11,2,6,2,45,40,23,199,2,23,200,2, -27,28,248,22,183,15,23,196,2,248,22,184,15,23,196,2,247,22,185,15,86, -95,28,28,248,22,143,16,23,196,2,10,249,22,173,9,247,22,185,15,23,195, -2,12,253,22,188,11,2,6,6,54,54,112,97,116,104,32,105,115,32,110,111, -116,32,99,111,109,112,108,101,116,101,32,97,110,100,32,110,111,116,32,116,104, -101,32,112,108,97,116,102,111,114,109,39,115,32,99,111,110,118,101,110,116,105, -111,110,2,46,23,201,2,6,24,24,112,108,97,116,102,111,114,109,32,99,111, -110,118,101,110,116,105,111,110,32,116,121,112,101,247,22,185,15,28,249,22,173, -9,28,248,22,183,15,23,199,2,248,22,184,15,23,199,2,247,22,185,15,23, -195,2,12,253,22,188,11,2,6,6,37,37,103,105,118,101,110,32,112,97,116, -104,115,32,117,115,101,32,100,105,102,102,101,114,101,110,116,32,99,111,110,118, -101,110,116,105,111,110,115,2,46,23,201,2,6,9,9,114,111,111,116,32,112, -97,116,104,23,202,2,27,27,248,22,147,16,28,248,22,143,16,23,199,2,23, -198,1,248,22,144,16,23,199,1,86,94,28,28,248,22,183,15,23,194,2,10, -28,248,22,182,15,23,194,2,10,28,248,22,157,7,23,194,2,28,248,22,141, -16,23,194,2,10,248,22,142,16,23,194,2,11,12,250,22,186,11,2,41,2, -42,23,196,2,28,28,248,22,183,15,23,194,2,249,22,173,9,248,22,184,15, -23,196,2,2,43,249,22,173,9,247,22,184,8,2,43,27,28,248,22,157,7, -23,195,2,23,194,2,248,22,169,8,248,22,187,15,23,196,2,28,249,22,179, -16,2,79,23,195,2,28,248,22,157,7,194,248,22,190,15,194,193,86,94,23, -194,1,27,248,22,132,8,23,195,1,249,22,191,15,248,22,172,8,250,22,187, -16,2,80,28,249,22,179,16,2,81,23,201,2,23,199,1,250,22,187,16,2, -82,23,202,1,2,44,80,144,50,40,41,2,43,28,248,22,157,7,193,248,22, -190,15,193,192,27,248,22,187,15,23,195,2,28,249,22,173,9,23,197,2,66, -117,110,105,120,28,249,22,154,8,194,5,1,47,28,248,22,183,15,198,197,248, -22,190,15,198,249,22,136,16,199,249,22,191,15,249,22,157,8,248,22,187,15, -200,40,198,86,94,23,194,1,28,249,22,173,9,23,197,2,2,43,249,22,136, -16,23,200,1,249,22,191,15,28,249,22,179,16,0,27,35,114,120,34,94,92, -92,92,92,92,92,92,92,91,63,93,92,92,92,92,91,97,45,122,93,58,34, -23,199,2,251,22,158,8,2,47,250,22,157,8,203,43,44,5,1,92,249,22, -157,8,202,45,28,249,22,179,16,2,84,23,199,2,249,22,158,8,2,47,249, -22,157,8,200,43,28,249,22,179,16,2,84,23,199,2,249,22,158,8,2,47, -249,22,157,8,200,43,28,249,22,179,16,0,14,35,114,120,34,94,92,92,92, -92,92,92,92,92,34,23,199,2,249,22,158,8,5,4,85,78,67,92,249,22, -157,8,200,41,28,249,22,179,16,0,12,35,114,120,34,94,91,97,45,122,93, -58,34,198,249,22,158,8,250,22,157,8,201,39,40,249,22,157,8,200,41,12, -198,12,32,86,88,148,8,36,42,56,11,72,102,111,117,110,100,45,101,120,101, -99,222,33,89,32,87,88,148,8,36,43,61,11,66,110,101,120,116,222,33,88, -27,248,22,145,16,23,196,2,28,249,22,175,9,23,195,2,23,197,1,11,28, -248,22,141,16,23,194,2,27,249,22,136,16,23,197,1,23,196,1,28,23,197, -2,90,144,42,11,89,146,42,39,11,248,22,139,16,23,197,2,86,95,23,195, -1,23,194,1,27,28,23,202,2,27,248,22,145,16,23,199,2,28,249,22,175, -9,23,195,2,23,200,2,11,28,248,22,141,16,23,194,2,250,2,86,23,205, -2,23,206,2,249,22,136,16,23,200,2,23,198,1,250,2,86,23,205,2,23, -206,2,23,196,1,11,28,23,193,2,192,86,94,23,193,1,27,28,248,22,182, -15,23,196,2,27,249,22,136,16,23,198,2,23,205,2,28,28,248,22,131,16, -193,10,248,22,130,16,193,192,11,11,28,23,193,2,192,86,94,23,193,1,28, -23,203,2,11,27,248,22,145,16,23,200,2,28,249,22,175,9,194,23,201,1, -11,28,248,22,141,16,193,250,2,86,205,206,249,22,136,16,200,197,250,2,86, -205,206,195,192,86,94,23,194,1,28,23,196,2,90,144,42,11,89,146,42,39, -11,248,22,139,16,23,197,2,86,95,23,195,1,23,194,1,27,28,23,201,2, -27,248,22,145,16,23,199,2,28,249,22,175,9,23,195,2,23,200,2,11,28, -248,22,141,16,23,194,2,250,2,86,23,204,2,23,205,2,249,22,136,16,23, -200,2,23,198,1,250,2,86,23,204,2,23,205,2,23,196,1,11,28,23,193, -2,192,86,94,23,193,1,27,28,248,22,182,15,23,196,2,27,249,22,136,16, -23,198,2,23,204,2,28,28,248,22,131,16,193,10,248,22,130,16,193,192,11, -11,28,23,193,2,192,86,94,23,193,1,28,23,202,2,11,27,248,22,145,16, -23,200,2,28,249,22,175,9,194,23,201,1,11,28,248,22,141,16,193,250,2, -86,204,205,249,22,136,16,200,197,250,2,86,204,205,195,192,28,23,193,2,90, -144,42,11,89,146,42,39,11,248,22,139,16,23,199,2,86,95,23,195,1,23, -194,1,27,28,23,198,2,251,2,87,23,198,2,23,203,2,23,201,2,23,202, -2,11,28,23,193,2,192,86,94,23,193,1,27,28,248,22,182,15,195,27,249, -22,136,16,197,200,28,28,248,22,131,16,193,10,248,22,130,16,193,192,11,11, -28,192,192,28,198,11,251,2,87,198,203,201,202,194,32,90,88,148,8,36,43, -60,11,2,50,222,33,91,28,248,22,90,23,197,2,11,27,249,22,136,16,248, -22,144,16,248,22,83,23,201,2,23,196,2,28,248,22,130,16,23,194,2,250, -2,86,197,198,195,86,94,23,193,1,27,248,22,174,20,23,199,1,28,248,22, -90,23,194,2,11,27,249,22,136,16,248,22,144,16,248,22,83,23,198,2,23, -198,2,28,248,22,130,16,23,194,2,250,2,86,199,200,195,86,94,23,193,1, -27,248,22,174,20,23,196,1,28,248,22,90,23,194,2,11,27,249,22,136,16, -248,22,144,16,248,22,83,23,198,2,23,200,2,28,248,22,130,16,23,194,2, -250,2,86,201,202,195,86,94,23,193,1,27,248,22,174,20,23,196,1,28,248, -22,90,23,194,2,11,27,249,22,136,16,248,22,144,16,248,22,83,197,201,28, -248,22,130,16,193,250,2,86,203,204,195,251,2,90,203,204,205,248,22,174,20, -198,86,95,28,28,248,22,182,15,23,195,2,10,28,248,22,157,7,23,195,2, -28,248,22,141,16,23,195,2,10,248,22,142,16,23,195,2,11,12,250,22,186, -11,2,7,2,48,23,197,2,28,28,23,195,2,28,28,248,22,182,15,23,196, -2,10,28,248,22,157,7,23,196,2,28,248,22,141,16,23,196,2,10,248,22, -142,16,23,196,2,11,248,22,141,16,23,196,2,11,10,12,250,22,186,11,2, -7,6,45,45,40,111,114,47,99,32,35,102,32,40,97,110,100,47,99,32,112, -97,116,104,45,115,116,114,105,110,103,63,32,114,101,108,97,116,105,118,101,45, -112,97,116,104,63,41,41,23,198,2,28,28,248,22,141,16,23,195,2,90,144, -42,11,89,146,42,39,11,248,22,139,16,23,198,2,249,22,173,9,194,2,49, -11,27,249,22,179,8,247,22,178,8,5,4,80,65,84,72,27,28,23,194,2, -249,80,143,43,44,249,22,169,8,23,198,1,7,63,9,86,94,23,194,1,9, -27,28,249,22,173,9,247,22,184,8,2,43,249,22,82,248,22,191,15,5,1, -46,23,196,1,23,194,1,28,248,22,90,23,194,2,11,27,249,22,136,16,248, -22,144,16,248,22,83,23,198,2,23,200,2,28,248,22,130,16,23,194,2,250, -2,86,201,202,195,86,94,23,193,1,27,248,22,174,20,23,196,1,28,248,22, -90,23,194,2,11,27,249,22,136,16,248,22,144,16,248,22,83,23,198,2,23, -202,2,28,248,22,130,16,23,194,2,250,2,86,203,204,195,86,94,23,193,1, -27,248,22,174,20,23,196,1,28,248,22,90,23,194,2,11,27,249,22,136,16, -248,22,144,16,248,22,83,23,198,2,23,204,2,28,248,22,130,16,23,194,2, -250,2,86,205,206,195,86,94,23,193,1,27,248,22,174,20,23,196,1,28,248, -22,90,23,194,2,11,27,249,22,136,16,248,22,144,16,248,22,83,197,205,28, -248,22,130,16,193,250,2,86,23,15,23,16,195,251,2,90,23,15,23,16,23, -17,248,22,174,20,198,27,248,22,144,16,23,196,1,28,248,22,130,16,193,250, -2,86,198,199,195,11,250,80,144,42,43,42,196,197,11,250,80,144,42,43,42, -196,11,11,32,95,88,148,8,36,42,58,11,2,50,222,33,97,0,8,35,114, -120,35,34,92,34,34,27,249,22,175,16,23,197,2,23,198,2,28,23,193,2, -86,94,23,196,1,27,248,22,104,23,195,2,27,27,248,22,113,23,197,1,27, -249,22,175,16,23,201,2,23,196,2,28,23,193,2,86,94,23,194,1,27,248, -22,104,23,195,2,27,250,2,95,202,23,204,1,248,22,113,23,199,1,27,28, -249,22,173,9,247,22,184,8,2,43,250,22,187,16,2,96,23,198,1,2,51, -194,28,249,22,154,8,194,2,51,249,22,96,202,195,249,22,82,248,22,191,15, -195,195,86,95,23,199,1,23,193,1,27,28,249,22,173,9,247,22,184,8,2, -43,250,22,187,16,2,96,23,198,1,2,51,194,28,249,22,154,8,194,2,51, -249,22,96,200,9,249,22,82,248,22,191,15,195,9,27,28,249,22,173,9,247, +12,250,22,186,11,2,7,2,48,23,197,2,28,28,23,195,2,28,28,248,22, +182,15,23,196,2,10,28,248,22,157,7,23,196,2,28,248,22,141,16,23,196, +2,10,248,22,142,16,23,196,2,11,248,22,141,16,23,196,2,11,10,12,250, +22,186,11,2,7,6,45,45,40,111,114,47,99,32,35,102,32,40,97,110,100, +47,99,32,112,97,116,104,45,115,116,114,105,110,103,63,32,114,101,108,97,116, +105,118,101,45,112,97,116,104,63,41,41,23,198,2,28,28,248,22,141,16,23, +195,2,90,144,42,11,89,146,42,39,11,248,22,139,16,23,198,2,249,22,173, +9,194,2,49,11,27,249,22,179,8,247,22,178,8,5,4,80,65,84,72,27, +28,23,194,2,249,80,143,43,44,249,22,169,8,23,198,1,7,63,9,86,94, +23,194,1,9,27,28,249,22,173,9,247,22,184,8,2,43,249,22,82,248,22, +191,15,5,1,46,23,196,1,23,194,1,28,248,22,90,23,194,2,11,27,249, +22,136,16,248,22,144,16,248,22,83,23,198,2,23,200,2,28,248,22,130,16, +23,194,2,250,2,86,201,202,195,86,94,23,193,1,27,248,22,174,20,23,196, +1,28,248,22,90,23,194,2,11,27,249,22,136,16,248,22,144,16,248,22,83, +23,198,2,23,202,2,28,248,22,130,16,23,194,2,250,2,86,203,204,195,86, +94,23,193,1,27,248,22,174,20,23,196,1,28,248,22,90,23,194,2,11,27, +249,22,136,16,248,22,144,16,248,22,83,23,198,2,23,204,2,28,248,22,130, +16,23,194,2,250,2,86,205,206,195,86,94,23,193,1,27,248,22,174,20,23, +196,1,28,248,22,90,23,194,2,11,27,249,22,136,16,248,22,144,16,248,22, +83,197,205,28,248,22,130,16,193,250,2,86,23,15,23,16,195,251,2,90,23, +15,23,16,23,17,248,22,174,20,198,27,248,22,144,16,23,196,1,28,248,22, +130,16,193,250,2,86,198,199,195,11,250,80,144,42,43,42,196,197,11,250,80, +144,42,43,42,196,11,11,32,95,88,148,8,36,42,58,11,2,50,222,33,97, +0,8,35,114,120,35,34,92,34,34,27,249,22,175,16,23,197,2,23,198,2, +28,23,193,2,86,94,23,196,1,27,248,22,104,23,195,2,27,27,248,22,113, +23,197,1,27,249,22,175,16,23,201,2,23,196,2,28,23,193,2,86,94,23, +194,1,27,248,22,104,23,195,2,27,250,2,95,202,23,204,1,248,22,113,23, +199,1,27,28,249,22,173,9,247,22,184,8,2,43,250,22,187,16,2,96,23, +198,1,2,51,194,28,249,22,154,8,194,2,51,249,22,96,202,195,249,22,82, +248,22,191,15,195,195,86,95,23,199,1,23,193,1,27,28,249,22,173,9,247, 22,184,8,2,43,250,22,187,16,2,96,23,198,1,2,51,194,28,249,22,154, -8,194,2,51,249,22,96,198,195,249,22,82,248,22,191,15,195,195,86,95,23, -195,1,23,193,1,27,28,249,22,173,9,247,22,184,8,2,43,250,22,187,16, -2,96,23,200,1,2,51,196,28,249,22,154,8,194,2,51,249,22,96,196,9, -249,22,82,248,22,191,15,195,9,86,95,28,28,248,22,146,8,194,10,248,22, -157,7,194,12,250,22,186,11,2,8,6,21,21,40,111,114,47,99,32,98,121, -116,101,115,63,32,115,116,114,105,110,103,63,41,196,28,28,248,22,91,195,249, -22,4,22,182,15,196,11,12,250,22,186,11,2,8,6,14,14,40,108,105,115, -116,111,102,32,112,97,116,104,63,41,197,250,2,95,197,195,28,248,22,157,7, -197,248,22,171,8,197,196,28,28,248,22,0,23,195,2,249,22,48,23,196,2, -39,11,20,13,144,80,144,39,46,40,26,35,80,144,8,35,47,40,249,22,31, -11,80,144,8,37,46,40,22,149,15,10,22,150,15,10,22,151,15,10,22,152, -15,11,22,153,15,11,22,157,15,10,22,156,15,11,22,158,15,10,22,155,15, -10,22,159,15,10,22,154,15,11,22,160,15,10,22,161,15,10,22,162,15,10, -22,163,15,11,22,164,15,10,22,147,15,11,247,23,194,1,250,22,186,11,2, -9,2,52,23,197,1,86,94,28,28,248,22,182,15,23,195,2,10,28,248,22, -157,7,23,195,2,28,248,22,141,16,23,195,2,10,248,22,142,16,23,195,2, -11,12,250,22,186,11,23,196,2,2,48,23,197,2,28,248,22,141,16,23,195, -2,12,251,22,188,11,23,197,1,2,53,2,46,23,198,1,86,94,28,28,248, -22,182,15,23,195,2,10,28,248,22,157,7,23,195,2,28,248,22,141,16,23, -195,2,10,248,22,142,16,23,195,2,11,12,250,22,186,11,23,196,2,2,48, -23,197,2,28,248,22,141,16,23,195,2,12,251,22,188,11,23,197,1,2,53, -2,46,23,198,1,86,95,28,28,248,22,182,15,23,195,2,10,28,248,22,157, -7,23,195,2,28,248,22,141,16,23,195,2,10,248,22,142,16,23,195,2,11, -12,250,22,186,11,23,196,2,2,48,23,197,2,28,248,22,141,16,23,195,2, -86,94,23,194,1,12,251,22,188,11,23,197,2,2,53,2,46,23,198,1,249, -22,3,20,20,94,88,148,8,36,40,50,11,9,223,2,33,101,23,195,1,23, -197,1,28,28,248,22,0,23,195,2,249,22,48,23,196,2,40,11,12,250,22, -186,11,23,196,1,2,54,23,197,1,86,94,28,28,248,22,182,15,23,194,2, -10,28,248,22,157,7,23,194,2,28,248,22,141,16,23,194,2,10,248,22,142, -16,23,194,2,11,12,250,22,186,11,2,15,2,48,23,196,2,28,248,22,141, -16,23,194,2,12,251,22,188,11,2,15,2,53,2,46,23,197,1,86,97,28, -28,248,22,182,15,23,196,2,10,28,248,22,157,7,23,196,2,28,248,22,141, -16,23,196,2,10,248,22,142,16,23,196,2,11,12,250,22,186,11,2,15,2, -48,23,198,2,28,248,22,141,16,23,196,2,12,251,22,188,11,2,15,2,53, -2,46,23,199,2,249,22,3,32,0,88,148,8,36,40,49,11,9,222,33,104, -23,198,2,28,28,248,22,0,23,195,2,249,22,48,23,196,2,40,11,12,250, -22,186,11,2,15,2,54,23,197,2,252,80,143,44,52,23,199,1,23,200,1, -23,201,1,11,11,86,94,28,28,248,22,182,15,23,194,2,10,28,248,22,157, -7,23,194,2,28,248,22,141,16,23,194,2,10,248,22,142,16,23,194,2,11, -12,250,22,186,11,2,17,2,48,23,196,2,28,248,22,141,16,23,194,2,12, -251,22,188,11,2,17,2,53,2,46,23,197,1,86,99,28,28,248,22,182,15, -23,197,2,10,28,248,22,157,7,23,197,2,28,248,22,141,16,23,197,2,10, -248,22,142,16,23,197,2,11,12,250,22,186,11,2,17,2,48,23,199,2,28, -248,22,141,16,23,197,2,12,251,22,188,11,2,17,2,53,2,46,23,200,2, -28,28,248,22,182,15,23,198,2,10,28,248,22,157,7,23,198,2,28,248,22, -141,16,23,198,2,10,248,22,142,16,23,198,2,11,12,250,22,186,11,2,17, -2,48,23,200,2,28,248,22,141,16,23,198,2,12,251,22,188,11,2,17,2, -53,2,46,23,201,2,249,22,3,32,0,88,148,8,36,40,49,11,9,222,33, -106,23,200,2,28,28,248,22,0,23,195,2,249,22,48,23,196,2,40,11,12, -250,22,186,11,2,17,2,54,23,197,2,252,80,143,44,52,23,199,1,23,202, -1,23,203,1,23,201,1,23,200,1,27,248,22,159,16,2,55,28,248,22,143, -16,23,194,2,248,22,146,16,23,194,1,28,248,22,142,16,23,194,2,90,144, -42,11,89,146,42,39,11,248,22,139,16,249,22,144,16,250,80,144,49,43,42, -248,22,159,16,2,56,11,11,248,22,159,16,2,57,86,95,23,195,1,23,194, -1,248,22,146,16,249,22,144,16,23,199,1,23,196,1,27,250,80,144,44,43, -42,248,22,159,16,2,56,23,197,1,10,28,23,193,2,248,22,146,16,23,194, -1,11,249,80,144,41,55,40,39,80,144,41,8,40,42,27,248,22,159,16,2, -58,28,248,22,143,16,23,194,2,248,22,146,16,23,194,1,28,248,22,142,16, -23,194,2,90,144,42,11,89,146,42,39,11,248,22,139,16,249,22,144,16,250, -80,144,49,43,42,248,22,159,16,2,56,11,11,248,22,159,16,2,57,86,95, -23,195,1,23,194,1,248,22,146,16,249,22,144,16,23,199,1,23,196,1,27, -250,80,144,44,43,42,248,22,159,16,2,56,23,197,1,10,28,23,193,2,248, -22,146,16,23,194,1,11,249,80,144,41,55,40,40,80,144,41,8,41,42,27, -20,13,144,80,144,40,46,40,26,35,80,144,8,36,47,40,249,22,31,11,80, -144,8,38,46,40,22,149,15,10,22,150,15,10,22,151,15,10,22,152,15,11, -22,153,15,11,22,157,15,10,22,156,15,11,22,158,15,10,22,155,15,10,22, -159,15,10,22,154,15,11,22,160,15,10,22,161,15,10,22,162,15,10,22,163, -15,11,22,164,15,10,22,147,15,11,247,22,152,6,28,248,22,151,2,193,192, -11,27,28,23,195,2,249,22,136,16,23,197,1,6,11,11,99,111,110,102,105, -103,46,114,107,116,100,86,94,23,195,1,11,27,28,23,194,2,28,248,22,130, -16,23,195,2,249,22,144,6,23,196,1,80,144,43,8,42,42,11,11,28,192, -192,21,17,1,0,250,22,160,2,23,196,1,2,59,247,22,175,8,250,22,160, -2,195,2,59,247,22,175,8,28,248,22,157,7,23,195,2,27,248,22,190,15, -23,196,1,28,248,22,143,16,23,194,2,192,249,22,144,16,23,195,1,27,247, -80,144,43,54,42,28,23,193,2,192,86,94,23,193,1,247,22,160,16,28,248, -22,146,8,23,195,2,27,248,22,191,15,23,196,1,28,248,22,143,16,23,194, -2,192,249,22,144,16,23,195,1,27,247,80,144,43,54,42,28,23,193,2,192, -86,94,23,193,1,247,22,160,16,28,248,22,182,15,23,195,2,28,248,22,143, -16,23,195,2,193,249,22,144,16,23,196,1,27,247,80,144,42,54,42,28,23, -193,2,192,86,94,23,193,1,247,22,160,16,193,27,248,22,159,16,2,55,28, -248,22,143,16,23,194,2,248,22,146,16,23,194,1,28,248,22,142,16,23,194, -2,90,144,42,11,89,146,42,39,11,248,22,139,16,249,22,144,16,250,80,144, -49,43,42,248,22,159,16,2,56,11,11,248,22,159,16,2,57,86,95,23,195, -1,23,194,1,248,22,146,16,249,22,144,16,23,199,1,23,196,1,27,250,80, -144,44,43,42,248,22,159,16,2,56,23,197,1,10,28,23,193,2,248,22,146, -16,23,194,1,11,28,248,22,143,16,23,195,2,193,249,22,144,16,23,196,1, -27,249,80,144,44,55,40,39,80,144,44,8,43,42,28,23,193,2,192,86,94, -23,193,1,247,22,160,16,28,248,22,143,16,23,195,2,248,22,146,16,23,195, -1,28,248,22,142,16,23,195,2,90,144,42,11,89,146,42,39,11,248,22,139, -16,249,22,144,16,250,80,144,48,43,42,248,22,159,16,2,56,11,11,248,22, -159,16,2,57,86,95,23,195,1,23,194,1,248,22,146,16,249,22,144,16,23, -200,1,23,196,1,27,250,80,144,43,43,42,248,22,159,16,2,56,23,198,1, -10,28,23,193,2,248,22,146,16,23,194,1,11,28,248,22,90,23,196,2,9, -28,248,22,83,23,196,2,249,22,82,27,248,22,173,20,23,199,2,28,248,22, -157,7,23,194,2,27,248,22,190,15,23,195,1,28,248,22,143,16,23,194,2, -192,249,22,144,16,23,195,1,27,247,80,144,46,54,42,28,23,193,2,192,86, -94,23,193,1,247,22,160,16,28,248,22,146,8,23,194,2,27,248,22,191,15, -23,195,1,28,248,22,143,16,23,194,2,192,249,22,144,16,23,195,1,27,247, -80,144,46,54,42,28,23,193,2,192,86,94,23,193,1,247,22,160,16,28,248, -22,182,15,23,194,2,28,248,22,143,16,23,194,2,192,249,22,144,16,23,195, -1,27,247,80,144,45,54,42,28,23,193,2,192,86,94,23,193,1,247,22,160, -16,192,27,248,22,174,20,23,199,1,28,248,22,90,23,194,2,9,28,248,22, -83,23,194,2,249,22,82,248,80,144,45,60,42,248,22,173,20,23,197,2,27, -248,22,174,20,23,197,1,28,248,22,90,23,194,2,9,28,248,22,83,23,194, -2,249,22,82,248,80,144,48,60,42,248,22,173,20,23,197,2,249,80,144,49, -8,44,42,23,204,1,248,22,174,20,23,198,1,249,22,96,23,202,2,249,80, -144,49,8,44,42,23,204,1,248,22,174,20,23,198,1,249,22,96,23,199,2, -27,248,22,174,20,23,197,1,28,248,22,90,23,194,2,9,28,248,22,83,23, -194,2,249,22,82,248,80,144,48,60,42,248,22,173,20,23,197,2,249,80,144, -49,8,44,42,23,204,1,248,22,174,20,23,198,1,249,22,96,23,202,2,249, -80,144,49,8,44,42,23,204,1,248,22,174,20,23,198,1,249,22,96,23,196, -2,27,248,22,174,20,23,199,1,28,248,22,90,23,194,2,9,28,248,22,83, -23,194,2,249,22,82,248,80,144,45,60,42,248,22,173,20,23,197,2,27,248, -22,174,20,23,197,1,28,248,22,90,23,194,2,9,28,248,22,83,23,194,2, -249,22,82,248,80,144,48,60,42,248,22,173,20,23,197,2,249,80,144,49,8, -44,42,23,204,1,248,22,174,20,23,198,1,249,22,96,23,202,2,249,80,144, -49,8,44,42,23,204,1,248,22,174,20,23,198,1,249,22,96,23,199,2,27, -248,22,174,20,23,197,1,28,248,22,90,23,194,2,9,28,248,22,83,23,194, -2,249,22,82,248,80,144,48,60,42,248,22,173,20,23,197,2,249,80,144,49, -8,44,42,23,204,1,248,22,174,20,23,198,1,249,22,96,23,202,2,249,80, -144,49,8,44,42,23,204,1,248,22,174,20,23,198,1,27,250,22,160,2,23, -198,1,23,199,1,11,28,192,249,80,144,42,8,44,42,198,194,196,27,248,22, -159,16,2,58,28,248,22,143,16,23,194,2,248,22,146,16,23,194,1,28,248, -22,142,16,23,194,2,90,144,42,11,89,146,42,39,11,248,22,139,16,249,22, -144,16,250,80,144,49,43,42,248,22,159,16,2,56,11,11,248,22,159,16,2, -57,86,95,23,195,1,23,194,1,248,22,146,16,249,22,144,16,23,199,1,23, -196,1,27,250,80,144,44,43,42,248,22,159,16,2,56,23,197,1,10,28,23, -193,2,248,22,146,16,23,194,1,11,27,248,80,144,41,58,42,249,80,144,43, -55,40,40,80,144,43,8,45,42,27,27,250,22,160,2,23,198,2,72,108,105, -110,107,115,45,102,105,108,101,11,27,28,23,194,2,23,194,1,86,94,23,194, -1,249,22,136,16,27,250,22,160,2,23,202,2,71,115,104,97,114,101,45,100, -105,114,11,28,192,192,249,22,136,16,64,117,112,6,5,5,115,104,97,114,101, -2,60,28,248,22,157,7,23,194,2,27,248,22,190,15,23,195,1,28,248,22, -143,16,23,194,2,192,249,22,144,16,23,195,1,27,247,80,144,47,54,42,28, -23,193,2,192,86,94,23,193,1,247,22,160,16,28,248,22,146,8,23,194,2, -27,248,22,191,15,23,195,1,28,248,22,143,16,23,194,2,192,249,22,144,16, -23,195,1,27,247,80,144,47,54,42,28,23,193,2,192,86,94,23,193,1,247, -22,160,16,28,248,22,182,15,23,194,2,28,248,22,143,16,23,194,2,192,249, -22,144,16,23,195,1,27,247,80,144,46,54,42,28,23,193,2,192,86,94,23, -193,1,247,22,160,16,192,250,22,96,248,22,92,11,28,247,22,167,16,28,247, -22,168,16,248,22,92,250,22,136,16,248,22,159,16,2,61,250,22,160,2,23, -204,2,2,59,247,22,175,8,2,60,9,9,28,247,22,168,16,250,80,144,47, -8,23,42,23,200,1,1,18,108,105,110,107,115,45,115,101,97,114,99,104,45, -102,105,108,101,115,248,22,92,23,200,1,9,248,22,178,13,23,194,1,249,22, -14,80,144,41,8,26,41,28,248,22,134,13,23,197,2,86,94,23,196,1,32, -0,88,148,8,36,39,44,11,9,222,11,20,20,94,88,148,8,36,39,46,11, -9,223,3,33,124,23,196,1,32,126,88,148,39,40,59,11,2,50,222,33,127, +8,194,2,51,249,22,96,200,9,249,22,82,248,22,191,15,195,9,27,28,249, +22,173,9,247,22,184,8,2,43,250,22,187,16,2,96,23,198,1,2,51,194, +28,249,22,154,8,194,2,51,249,22,96,198,195,249,22,82,248,22,191,15,195, +195,86,95,23,195,1,23,193,1,27,28,249,22,173,9,247,22,184,8,2,43, +250,22,187,16,2,96,23,200,1,2,51,196,28,249,22,154,8,194,2,51,249, +22,96,196,9,249,22,82,248,22,191,15,195,9,86,95,28,28,248,22,146,8, +194,10,248,22,157,7,194,12,250,22,186,11,2,8,6,21,21,40,111,114,47, +99,32,98,121,116,101,115,63,32,115,116,114,105,110,103,63,41,196,28,28,248, +22,91,195,249,22,4,22,182,15,196,11,12,250,22,186,11,2,8,6,14,14, +40,108,105,115,116,111,102,32,112,97,116,104,63,41,197,250,2,95,197,195,28, +248,22,157,7,197,248,22,171,8,197,196,28,28,248,22,0,23,195,2,249,22, +48,23,196,2,39,11,20,13,144,80,144,39,46,40,26,35,80,144,8,35,47, +40,249,22,31,11,80,144,8,37,46,40,22,149,15,10,22,150,15,10,22,151, +15,10,22,152,15,11,22,153,15,11,22,157,15,10,22,156,15,11,22,158,15, +10,22,155,15,10,22,159,15,10,22,154,15,11,22,160,15,10,22,161,15,10, +22,162,15,10,22,163,15,11,22,164,15,10,22,147,15,11,247,23,194,1,250, +22,186,11,2,9,2,52,23,197,1,86,94,28,28,248,22,182,15,23,195,2, +10,28,248,22,157,7,23,195,2,28,248,22,141,16,23,195,2,10,248,22,142, +16,23,195,2,11,12,250,22,186,11,23,196,2,2,48,23,197,2,28,248,22, +141,16,23,195,2,12,251,22,188,11,23,197,1,2,53,2,46,23,198,1,86, +94,28,28,248,22,182,15,23,195,2,10,28,248,22,157,7,23,195,2,28,248, +22,141,16,23,195,2,10,248,22,142,16,23,195,2,11,12,250,22,186,11,23, +196,2,2,48,23,197,2,28,248,22,141,16,23,195,2,12,251,22,188,11,23, +197,1,2,53,2,46,23,198,1,86,95,28,28,248,22,182,15,23,195,2,10, +28,248,22,157,7,23,195,2,28,248,22,141,16,23,195,2,10,248,22,142,16, +23,195,2,11,12,250,22,186,11,23,196,2,2,48,23,197,2,28,248,22,141, +16,23,195,2,86,94,23,194,1,12,251,22,188,11,23,197,2,2,53,2,46, +23,198,1,249,22,3,20,20,94,88,148,8,36,40,50,11,9,223,2,33,101, +23,195,1,23,197,1,28,28,248,22,0,23,195,2,249,22,48,23,196,2,40, +11,12,250,22,186,11,23,196,1,2,54,23,197,1,86,94,28,28,248,22,182, +15,23,194,2,10,28,248,22,157,7,23,194,2,28,248,22,141,16,23,194,2, +10,248,22,142,16,23,194,2,11,12,250,22,186,11,2,15,2,48,23,196,2, +28,248,22,141,16,23,194,2,12,251,22,188,11,2,15,2,53,2,46,23,197, +1,86,97,28,28,248,22,182,15,23,196,2,10,28,248,22,157,7,23,196,2, +28,248,22,141,16,23,196,2,10,248,22,142,16,23,196,2,11,12,250,22,186, +11,2,15,2,48,23,198,2,28,248,22,141,16,23,196,2,12,251,22,188,11, +2,15,2,53,2,46,23,199,2,249,22,3,32,0,88,148,8,36,40,49,11, +9,222,33,104,23,198,2,28,28,248,22,0,23,195,2,249,22,48,23,196,2, +40,11,12,250,22,186,11,2,15,2,54,23,197,2,252,80,143,44,52,23,199, +1,23,200,1,23,201,1,11,11,86,94,28,28,248,22,182,15,23,194,2,10, +28,248,22,157,7,23,194,2,28,248,22,141,16,23,194,2,10,248,22,142,16, +23,194,2,11,12,250,22,186,11,2,17,2,48,23,196,2,28,248,22,141,16, +23,194,2,12,251,22,188,11,2,17,2,53,2,46,23,197,1,86,99,28,28, +248,22,182,15,23,197,2,10,28,248,22,157,7,23,197,2,28,248,22,141,16, +23,197,2,10,248,22,142,16,23,197,2,11,12,250,22,186,11,2,17,2,48, +23,199,2,28,248,22,141,16,23,197,2,12,251,22,188,11,2,17,2,53,2, +46,23,200,2,28,28,248,22,182,15,23,198,2,10,28,248,22,157,7,23,198, +2,28,248,22,141,16,23,198,2,10,248,22,142,16,23,198,2,11,12,250,22, +186,11,2,17,2,48,23,200,2,28,248,22,141,16,23,198,2,12,251,22,188, +11,2,17,2,53,2,46,23,201,2,249,22,3,32,0,88,148,8,36,40,49, +11,9,222,33,106,23,200,2,28,28,248,22,0,23,195,2,249,22,48,23,196, +2,40,11,12,250,22,186,11,2,17,2,54,23,197,2,252,80,143,44,52,23, +199,1,23,202,1,23,203,1,23,201,1,23,200,1,27,248,22,159,16,2,55, +28,248,22,143,16,23,194,2,248,22,146,16,23,194,1,28,248,22,142,16,23, +194,2,90,144,42,11,89,146,42,39,11,248,22,139,16,249,22,144,16,250,80, +144,49,43,42,248,22,159,16,2,56,11,11,248,22,159,16,2,57,86,95,23, +195,1,23,194,1,248,22,146,16,249,22,144,16,23,199,1,23,196,1,27,250, +80,144,44,43,42,248,22,159,16,2,56,23,197,1,10,28,23,193,2,248,22, +146,16,23,194,1,11,249,80,144,41,55,40,39,80,144,41,8,40,42,27,248, +22,159,16,2,58,28,248,22,143,16,23,194,2,248,22,146,16,23,194,1,28, +248,22,142,16,23,194,2,90,144,42,11,89,146,42,39,11,248,22,139,16,249, +22,144,16,250,80,144,49,43,42,248,22,159,16,2,56,11,11,248,22,159,16, +2,57,86,95,23,195,1,23,194,1,248,22,146,16,249,22,144,16,23,199,1, +23,196,1,27,250,80,144,44,43,42,248,22,159,16,2,56,23,197,1,10,28, +23,193,2,248,22,146,16,23,194,1,11,249,80,144,41,55,40,40,80,144,41, +8,41,42,27,20,13,144,80,144,40,46,40,26,35,80,144,8,36,47,40,249, +22,31,11,80,144,8,38,46,40,22,149,15,10,22,150,15,10,22,151,15,10, +22,152,15,11,22,153,15,11,22,157,15,10,22,156,15,11,22,158,15,10,22, +155,15,10,22,159,15,10,22,154,15,11,22,160,15,10,22,161,15,10,22,162, +15,10,22,163,15,11,22,164,15,10,22,147,15,11,247,22,152,6,28,248,22, +151,2,193,192,11,27,28,23,195,2,249,22,136,16,23,197,1,6,11,11,99, +111,110,102,105,103,46,114,107,116,100,86,94,23,195,1,11,27,28,23,194,2, +28,248,22,130,16,23,195,2,249,22,144,6,23,196,1,80,144,43,8,42,42, +11,11,28,192,192,21,17,1,0,250,22,160,2,23,196,1,2,59,247,22,175, +8,250,22,160,2,195,2,59,247,22,175,8,28,248,22,157,7,23,195,2,27, +248,22,190,15,23,196,1,28,248,22,143,16,23,194,2,192,249,22,144,16,23, +195,1,27,247,80,144,43,54,42,28,23,193,2,192,86,94,23,193,1,247,22, +160,16,28,248,22,146,8,23,195,2,27,248,22,191,15,23,196,1,28,248,22, +143,16,23,194,2,192,249,22,144,16,23,195,1,27,247,80,144,43,54,42,28, +23,193,2,192,86,94,23,193,1,247,22,160,16,28,248,22,182,15,23,195,2, +28,248,22,143,16,23,195,2,193,249,22,144,16,23,196,1,27,247,80,144,42, +54,42,28,23,193,2,192,86,94,23,193,1,247,22,160,16,193,27,248,22,159, +16,2,55,28,248,22,143,16,23,194,2,248,22,146,16,23,194,1,28,248,22, +142,16,23,194,2,90,144,42,11,89,146,42,39,11,248,22,139,16,249,22,144, +16,250,80,144,49,43,42,248,22,159,16,2,56,11,11,248,22,159,16,2,57, +86,95,23,195,1,23,194,1,248,22,146,16,249,22,144,16,23,199,1,23,196, +1,27,250,80,144,44,43,42,248,22,159,16,2,56,23,197,1,10,28,23,193, +2,248,22,146,16,23,194,1,11,28,248,22,143,16,23,195,2,193,249,22,144, +16,23,196,1,27,249,80,144,44,55,40,39,80,144,44,8,43,42,28,23,193, +2,192,86,94,23,193,1,247,22,160,16,28,248,22,143,16,23,195,2,248,22, +146,16,23,195,1,28,248,22,142,16,23,195,2,90,144,42,11,89,146,42,39, +11,248,22,139,16,249,22,144,16,250,80,144,48,43,42,248,22,159,16,2,56, +11,11,248,22,159,16,2,57,86,95,23,195,1,23,194,1,248,22,146,16,249, +22,144,16,23,200,1,23,196,1,27,250,80,144,43,43,42,248,22,159,16,2, +56,23,198,1,10,28,23,193,2,248,22,146,16,23,194,1,11,28,248,22,90, +23,196,2,9,28,248,22,83,23,196,2,249,22,82,27,248,22,173,20,23,199, +2,28,248,22,157,7,23,194,2,27,248,22,190,15,23,195,1,28,248,22,143, +16,23,194,2,192,249,22,144,16,23,195,1,27,247,80,144,46,54,42,28,23, +193,2,192,86,94,23,193,1,247,22,160,16,28,248,22,146,8,23,194,2,27, +248,22,191,15,23,195,1,28,248,22,143,16,23,194,2,192,249,22,144,16,23, +195,1,27,247,80,144,46,54,42,28,23,193,2,192,86,94,23,193,1,247,22, +160,16,28,248,22,182,15,23,194,2,28,248,22,143,16,23,194,2,192,249,22, +144,16,23,195,1,27,247,80,144,45,54,42,28,23,193,2,192,86,94,23,193, +1,247,22,160,16,192,27,248,22,174,20,23,199,1,28,248,22,90,23,194,2, +9,28,248,22,83,23,194,2,249,22,82,248,80,144,45,60,42,248,22,173,20, +23,197,2,27,248,22,174,20,23,197,1,28,248,22,90,23,194,2,9,28,248, +22,83,23,194,2,249,22,82,248,80,144,48,60,42,248,22,173,20,23,197,2, +249,80,144,49,8,44,42,23,204,1,248,22,174,20,23,198,1,249,22,96,23, +202,2,249,80,144,49,8,44,42,23,204,1,248,22,174,20,23,198,1,249,22, +96,23,199,2,27,248,22,174,20,23,197,1,28,248,22,90,23,194,2,9,28, +248,22,83,23,194,2,249,22,82,248,80,144,48,60,42,248,22,173,20,23,197, +2,249,80,144,49,8,44,42,23,204,1,248,22,174,20,23,198,1,249,22,96, +23,202,2,249,80,144,49,8,44,42,23,204,1,248,22,174,20,23,198,1,249, +22,96,23,196,2,27,248,22,174,20,23,199,1,28,248,22,90,23,194,2,9, +28,248,22,83,23,194,2,249,22,82,248,80,144,45,60,42,248,22,173,20,23, +197,2,27,248,22,174,20,23,197,1,28,248,22,90,23,194,2,9,28,248,22, +83,23,194,2,249,22,82,248,80,144,48,60,42,248,22,173,20,23,197,2,249, +80,144,49,8,44,42,23,204,1,248,22,174,20,23,198,1,249,22,96,23,202, +2,249,80,144,49,8,44,42,23,204,1,248,22,174,20,23,198,1,249,22,96, +23,199,2,27,248,22,174,20,23,197,1,28,248,22,90,23,194,2,9,28,248, +22,83,23,194,2,249,22,82,248,80,144,48,60,42,248,22,173,20,23,197,2, +249,80,144,49,8,44,42,23,204,1,248,22,174,20,23,198,1,249,22,96,23, +202,2,249,80,144,49,8,44,42,23,204,1,248,22,174,20,23,198,1,27,250, +22,160,2,23,198,1,23,199,1,11,28,192,249,80,144,42,8,44,42,198,194, +196,27,248,22,159,16,2,58,28,248,22,143,16,23,194,2,248,22,146,16,23, +194,1,28,248,22,142,16,23,194,2,90,144,42,11,89,146,42,39,11,248,22, +139,16,249,22,144,16,250,80,144,49,43,42,248,22,159,16,2,56,11,11,248, +22,159,16,2,57,86,95,23,195,1,23,194,1,248,22,146,16,249,22,144,16, +23,199,1,23,196,1,27,250,80,144,44,43,42,248,22,159,16,2,56,23,197, +1,10,28,23,193,2,248,22,146,16,23,194,1,11,27,248,80,144,41,58,42, +249,80,144,43,55,40,40,80,144,43,8,45,42,27,27,250,22,160,2,23,198, +2,72,108,105,110,107,115,45,102,105,108,101,11,27,28,23,194,2,23,194,1, +86,94,23,194,1,249,22,136,16,27,250,22,160,2,23,202,2,71,115,104,97, +114,101,45,100,105,114,11,28,192,192,249,22,136,16,64,117,112,6,5,5,115, +104,97,114,101,2,60,28,248,22,157,7,23,194,2,27,248,22,190,15,23,195, +1,28,248,22,143,16,23,194,2,192,249,22,144,16,23,195,1,27,247,80,144, +47,54,42,28,23,193,2,192,86,94,23,193,1,247,22,160,16,28,248,22,146, +8,23,194,2,27,248,22,191,15,23,195,1,28,248,22,143,16,23,194,2,192, +249,22,144,16,23,195,1,27,247,80,144,47,54,42,28,23,193,2,192,86,94, +23,193,1,247,22,160,16,28,248,22,182,15,23,194,2,28,248,22,143,16,23, +194,2,192,249,22,144,16,23,195,1,27,247,80,144,46,54,42,28,23,193,2, +192,86,94,23,193,1,247,22,160,16,192,250,22,96,248,22,92,11,28,247,22, +167,16,28,247,22,168,16,248,22,92,250,22,136,16,248,22,159,16,2,61,250, +22,160,2,23,204,2,2,59,247,22,175,8,2,60,9,9,28,247,22,168,16, +250,80,144,47,8,23,42,23,200,1,1,18,108,105,110,107,115,45,115,101,97, +114,99,104,45,102,105,108,101,115,248,22,92,23,200,1,9,248,22,178,13,23, +194,1,249,22,14,80,144,41,8,26,41,28,248,22,134,13,23,197,2,86,94, +23,196,1,32,0,88,148,8,36,39,44,11,9,222,11,20,20,94,88,148,8, +36,39,46,11,9,223,3,33,124,23,196,1,32,126,88,148,39,40,59,11,2, +50,222,33,127,90,144,42,11,89,146,42,39,11,248,22,139,16,23,197,1,86, +95,23,195,1,23,194,1,28,248,22,182,15,23,194,2,28,248,22,131,16,23, +194,2,249,22,149,6,23,195,1,32,0,88,148,8,36,39,44,11,9,222,11, 90,144,42,11,89,146,42,39,11,248,22,139,16,23,197,1,86,95,23,195,1, 23,194,1,28,248,22,182,15,23,194,2,28,248,22,131,16,23,194,2,249,22, 149,6,23,195,1,32,0,88,148,8,36,39,44,11,9,222,11,90,144,42,11, @@ -470,26 +473,26 @@ 1,32,0,88,148,8,36,39,44,11,9,222,11,90,144,42,11,89,146,42,39, 11,248,22,139,16,23,197,1,86,95,23,195,1,23,194,1,28,248,22,182,15, 23,194,2,28,248,22,131,16,23,194,2,249,22,149,6,23,195,1,32,0,88, -148,8,36,39,44,11,9,222,11,90,144,42,11,89,146,42,39,11,248,22,139, -16,23,197,1,86,95,23,195,1,23,194,1,28,248,22,182,15,23,194,2,28, -248,22,131,16,23,194,2,249,22,149,6,23,195,1,32,0,88,148,8,36,39, -44,11,9,222,11,248,2,126,23,194,1,11,11,11,11,32,128,2,88,148,8, -36,40,58,11,2,50,222,33,129,2,27,249,22,167,6,8,128,128,23,196,2, -28,248,22,152,7,23,194,2,9,249,22,82,23,195,1,27,249,22,167,6,8, -128,128,23,199,2,28,248,22,152,7,23,194,2,9,249,22,82,23,195,1,27, -249,22,167,6,8,128,128,23,202,2,28,248,22,152,7,23,194,2,9,249,22, -82,23,195,1,27,249,22,167,6,8,128,128,23,205,2,28,248,22,152,7,23, -194,2,9,249,22,82,23,195,1,248,2,128,2,23,206,1,27,249,22,167,6, -8,128,128,23,196,2,28,248,22,146,8,23,194,2,28,249,22,136,4,248,22, -151,8,23,196,2,8,128,128,249,22,1,22,158,8,249,22,82,23,197,1,27, -249,22,167,6,8,128,128,23,201,2,28,248,22,152,7,23,194,2,9,249,22, -82,23,195,1,27,249,22,167,6,8,128,128,23,204,2,28,248,22,152,7,23, -194,2,9,249,22,82,23,195,1,27,249,22,167,6,8,128,128,23,207,2,28, -248,22,152,7,23,194,2,9,249,22,82,23,195,1,27,249,22,167,6,8,128, -128,23,210,2,28,248,22,152,7,23,194,2,9,249,22,82,23,195,1,248,2, -128,2,23,211,1,192,192,248,22,137,6,23,194,1,20,13,144,80,144,40,8, -28,40,80,144,40,8,46,42,27,28,249,22,129,9,248,22,184,8,2,62,41, -90,144,42,11,89,146,42,39,11,248,22,139,16,23,198,2,86,95,23,195,1, +148,8,36,39,44,11,9,222,11,248,2,126,23,194,1,11,11,11,11,32,128, +2,88,148,8,36,40,58,11,2,50,222,33,129,2,27,249,22,167,6,8,128, +128,23,196,2,28,248,22,152,7,23,194,2,9,249,22,82,23,195,1,27,249, +22,167,6,8,128,128,23,199,2,28,248,22,152,7,23,194,2,9,249,22,82, +23,195,1,27,249,22,167,6,8,128,128,23,202,2,28,248,22,152,7,23,194, +2,9,249,22,82,23,195,1,27,249,22,167,6,8,128,128,23,205,2,28,248, +22,152,7,23,194,2,9,249,22,82,23,195,1,248,2,128,2,23,206,1,27, +249,22,167,6,8,128,128,23,196,2,28,248,22,146,8,23,194,2,28,249,22, +162,20,248,22,151,8,23,196,2,8,128,128,249,22,1,22,158,8,249,22,82, +23,197,1,27,249,22,167,6,8,128,128,23,201,2,28,248,22,152,7,23,194, +2,9,249,22,82,23,195,1,27,249,22,167,6,8,128,128,23,204,2,28,248, +22,152,7,23,194,2,9,249,22,82,23,195,1,27,249,22,167,6,8,128,128, +23,207,2,28,248,22,152,7,23,194,2,9,249,22,82,23,195,1,27,249,22, +167,6,8,128,128,23,210,2,28,248,22,152,7,23,194,2,9,249,22,82,23, +195,1,248,2,128,2,23,211,1,192,192,248,22,137,6,23,194,1,20,13,144, +80,144,40,8,28,40,80,144,40,8,46,42,27,28,249,22,129,9,248,22,184, +8,2,62,41,90,144,42,11,89,146,42,39,11,248,22,139,16,23,198,2,86, +95,23,195,1,23,194,1,28,248,22,182,15,23,194,2,28,248,22,131,16,23, +194,2,249,22,149,6,23,195,1,32,0,88,148,8,36,39,44,11,9,222,11, +90,144,42,11,89,146,42,39,11,248,22,139,16,23,197,1,86,95,23,195,1, 23,194,1,28,248,22,182,15,23,194,2,28,248,22,131,16,23,194,2,249,22, 149,6,23,195,1,32,0,88,148,8,36,39,44,11,9,222,11,90,144,42,11, 89,146,42,39,11,248,22,139,16,23,197,1,86,95,23,195,1,23,194,1,28, @@ -497,559 +500,554 @@ 1,32,0,88,148,8,36,39,44,11,9,222,11,90,144,42,11,89,146,42,39, 11,248,22,139,16,23,197,1,86,95,23,195,1,23,194,1,28,248,22,182,15, 23,194,2,28,248,22,131,16,23,194,2,249,22,149,6,23,195,1,32,0,88, -148,8,36,39,44,11,9,222,11,90,144,42,11,89,146,42,39,11,248,22,139, -16,23,197,1,86,95,23,195,1,23,194,1,28,248,22,182,15,23,194,2,28, -248,22,131,16,23,194,2,249,22,149,6,23,195,1,32,0,88,148,8,36,39, -44,11,9,222,11,248,2,126,23,194,1,11,11,11,11,11,28,248,22,130,16, -23,195,2,27,28,249,22,129,9,248,22,184,8,2,62,41,249,22,149,6,23, -197,2,32,0,88,148,8,36,39,44,11,9,222,11,11,86,94,28,23,194,2, -248,22,151,6,23,195,1,86,94,23,194,1,12,249,22,82,27,248,22,128,6, -23,199,1,250,22,44,22,35,88,148,39,39,8,24,11,9,223,3,33,130,2, -20,20,94,88,148,8,36,39,46,11,9,223,3,33,131,2,23,196,1,194,249, -22,82,11,194,28,28,23,195,2,28,248,22,84,23,196,2,248,22,171,9,249, -22,180,14,39,248,22,174,20,23,199,2,11,11,194,86,94,23,195,1,249,22, -12,20,20,94,88,148,8,32,39,61,16,4,39,8,128,80,8,240,0,64,0, -0,39,9,224,2,3,33,132,2,23,196,1,80,144,41,8,26,41,27,248,22, -171,9,194,28,192,192,248,22,171,9,248,22,83,195,86,95,28,248,22,155,12, -23,198,2,27,247,22,147,12,28,249,22,137,12,23,195,2,2,63,251,22,143, -12,23,197,1,2,63,250,22,141,8,6,42,42,101,114,114,111,114,32,114,101, -97,100,105,110,103,32,99,111,108,108,101,99,116,105,111,110,32,108,105,110,107, -115,32,102,105,108,101,32,126,115,58,32,126,97,23,203,2,248,22,151,12,23, -206,2,247,22,27,12,12,28,23,193,2,250,22,158,2,80,144,45,8,25,41, -23,198,1,249,22,82,23,198,1,21,17,0,0,86,95,23,195,1,23,193,1, -12,28,248,22,155,12,23,198,2,86,94,23,197,1,248,23,195,1,247,22,140, -2,196,88,148,39,40,58,8,240,0,0,0,2,9,226,0,2,1,3,33,135, -2,20,20,94,248,22,152,6,23,194,2,28,248,22,152,7,248,22,152,6,23, -195,1,12,248,22,182,11,6,30,30,101,120,112,101,99,116,101,100,32,97,32, -115,105,110,103,108,101,32,83,45,101,120,112,114,101,115,115,105,111,110,248,22, -137,6,23,194,1,28,248,22,91,193,28,28,249,22,132,4,41,248,22,95,195, -10,249,22,132,4,42,248,22,95,195,28,28,248,22,157,7,248,22,83,194,10, -28,249,22,173,9,2,64,248,22,173,20,195,10,249,22,173,9,2,65,248,22, -173,20,195,28,27,248,22,104,194,28,248,22,182,15,193,10,28,248,22,157,7, -193,28,248,22,141,16,193,10,248,22,142,16,193,11,27,248,22,90,248,22,106, -195,28,192,192,248,22,188,16,248,22,113,195,11,11,11,11,28,248,22,131,16, -249,22,136,16,23,196,2,23,198,2,27,248,22,70,248,22,186,15,23,198,1, -250,22,158,2,23,198,2,23,196,2,249,22,82,23,199,1,250,22,160,2,23, -203,1,23,201,1,9,12,250,22,158,2,23,197,1,23,198,1,249,22,82,23, -198,1,23,201,1,28,28,248,22,90,248,22,106,23,197,2,10,249,22,179,16, -248,22,113,23,198,2,247,22,175,8,27,248,22,146,16,249,22,144,16,248,22, -104,23,200,2,23,198,1,28,249,22,173,9,248,22,173,20,23,199,2,2,65, -86,94,23,196,1,249,22,3,20,20,94,88,148,8,36,40,56,11,9,224,3, -2,33,140,2,23,196,1,248,22,149,16,23,196,1,28,249,22,173,9,248,22, -173,20,23,199,2,2,64,86,94,23,196,1,86,94,28,250,22,160,2,23,197, -2,11,11,12,250,22,158,2,23,197,2,11,9,249,22,166,2,23,196,2,20, -20,95,88,148,8,36,41,53,11,9,224,3,2,33,141,2,23,195,1,23,196, -1,27,248,22,70,248,22,173,20,23,199,1,250,22,158,2,23,198,2,23,196, -2,249,22,82,248,22,131,2,23,200,1,250,22,160,2,23,203,1,23,201,1, -9,12,250,22,158,2,23,196,1,23,197,1,248,22,97,23,199,1,27,28,28, -23,194,2,248,22,171,9,248,22,83,23,196,2,10,9,27,249,22,128,6,23, -198,2,68,98,105,110,97,114,121,250,22,44,22,35,88,148,8,36,39,47,11, -9,223,3,33,137,2,20,20,94,88,148,8,36,39,46,11,9,223,3,33,138, -2,23,196,1,86,94,28,28,248,22,91,23,194,2,249,22,4,32,0,88,148, -8,36,40,48,11,9,222,33,139,2,23,195,2,11,12,248,22,182,11,6,18, -18,105,108,108,45,102,111,114,109,101,100,32,99,111,110,116,101,110,116,27,247, -22,140,2,27,90,144,42,11,89,146,42,39,11,248,22,139,16,23,201,2,192, -86,96,249,22,3,20,20,94,88,148,8,36,40,57,11,9,224,2,3,33,142, -2,23,195,1,23,197,1,249,22,166,2,195,88,148,8,36,41,51,11,9,223, -3,33,143,2,250,22,158,2,80,144,47,8,25,41,23,200,1,249,22,82,23, -201,1,198,193,20,13,144,80,144,40,8,28,40,250,80,144,43,8,47,42,23, -198,2,23,196,2,11,27,250,22,160,2,80,144,44,8,25,41,23,197,2,21, -143,11,17,0,0,27,248,22,83,23,195,2,27,249,80,144,45,8,27,42,23, -198,2,23,196,2,28,249,22,175,9,23,195,2,23,196,1,248,22,174,20,195, -86,94,23,195,1,20,13,144,80,144,43,8,28,40,250,80,144,46,8,47,42, -23,201,1,23,199,2,23,196,2,27,20,20,95,88,148,8,36,39,55,8,240, -0,0,0,2,9,225,5,4,1,33,144,2,23,194,1,23,197,1,28,249,22, -48,23,195,2,39,20,13,144,80,144,44,46,40,26,35,80,144,8,40,47,40, -249,22,31,11,80,144,8,42,46,40,22,149,15,10,22,150,15,10,22,151,15, -10,22,152,15,11,22,153,15,11,22,157,15,10,22,156,15,11,22,158,15,10, -22,155,15,10,22,159,15,10,22,154,15,11,22,160,15,10,22,161,15,10,22, -162,15,10,22,163,15,11,22,164,15,10,22,147,15,11,247,23,193,1,250,22, -186,11,2,9,2,52,23,196,1,248,22,8,20,20,94,88,148,39,40,8,49, -16,4,8,128,6,8,128,104,8,240,0,128,0,0,39,9,224,1,2,33,145, -2,23,195,1,0,7,35,114,120,34,47,43,34,28,248,22,157,7,23,195,2, -27,249,22,177,16,2,147,2,23,197,2,28,23,193,2,28,249,22,132,4,248, -22,103,23,196,2,248,22,186,3,248,22,160,7,23,199,2,249,22,7,250,22, -179,7,23,200,1,39,248,22,103,23,199,1,23,198,1,249,22,7,250,22,179, -7,23,200,2,39,248,22,103,23,199,2,249,22,82,249,22,179,7,23,201,1, -248,22,105,23,200,1,23,200,1,86,94,23,193,1,249,22,7,23,197,1,23, -198,1,90,144,42,11,89,146,42,39,11,248,22,139,16,23,198,1,86,94,23, -195,1,28,249,22,173,9,23,195,2,2,49,86,94,23,193,1,249,22,7,23, -196,1,23,200,1,27,249,22,82,23,197,1,23,201,1,28,248,22,157,7,23, -195,2,27,249,22,177,16,2,147,2,23,197,2,28,23,193,2,28,249,22,132, -4,248,22,103,23,196,2,248,22,186,3,248,22,160,7,23,199,2,249,22,7, -250,22,179,7,23,200,1,39,248,22,103,23,199,1,23,196,1,249,22,7,250, -22,179,7,23,200,2,39,248,22,103,23,199,2,249,22,82,249,22,179,7,23, -201,1,248,22,105,23,200,1,23,198,1,86,94,23,193,1,249,22,7,23,197, -1,23,196,1,90,144,42,11,89,146,42,39,11,248,22,139,16,23,198,1,86, -94,23,195,1,28,249,22,173,9,23,195,2,2,49,86,94,23,193,1,249,22, -7,23,196,1,23,198,1,249,80,144,48,8,31,42,194,249,22,82,197,199,28, -248,22,90,23,196,2,9,28,248,22,83,23,196,2,28,248,22,151,2,248,22, -173,20,23,197,2,250,22,96,249,22,2,22,131,2,250,22,160,2,248,22,173, -20,23,204,2,23,202,2,9,250,22,160,2,248,22,173,20,23,202,2,11,9, -27,248,22,174,20,23,200,1,28,248,22,90,23,194,2,9,28,248,22,83,23, +148,8,36,39,44,11,9,222,11,248,2,126,23,194,1,11,11,11,11,11,28, +248,22,130,16,23,195,2,27,28,249,22,129,9,248,22,184,8,2,62,41,249, +22,149,6,23,197,2,32,0,88,148,8,36,39,44,11,9,222,11,11,86,94, +28,23,194,2,248,22,151,6,23,195,1,86,94,23,194,1,12,249,22,82,27, +248,22,128,6,23,199,1,250,22,44,22,35,88,148,39,39,8,24,11,9,223, +3,33,130,2,20,20,94,88,148,8,36,39,46,11,9,223,3,33,131,2,23, +196,1,194,249,22,82,11,194,28,28,23,195,2,28,248,22,84,23,196,2,248, +22,171,9,249,22,180,14,39,248,22,174,20,23,199,2,11,11,194,86,94,23, +195,1,249,22,12,20,20,94,88,148,8,32,39,61,16,4,39,8,128,80,8, +240,0,64,0,0,39,9,224,2,3,33,132,2,23,196,1,80,144,41,8,26, +41,27,248,22,171,9,194,28,192,192,248,22,171,9,248,22,83,195,86,95,28, +248,22,155,12,23,198,2,27,247,22,147,12,28,249,22,137,12,23,195,2,2, +63,251,22,143,12,23,197,1,2,63,250,22,141,8,6,42,42,101,114,114,111, +114,32,114,101,97,100,105,110,103,32,99,111,108,108,101,99,116,105,111,110,32, +108,105,110,107,115,32,102,105,108,101,32,126,115,58,32,126,97,23,203,2,248, +22,151,12,23,206,2,247,22,27,12,12,28,23,193,2,250,22,158,2,80,144, +45,8,25,41,23,198,1,249,22,82,23,198,1,21,17,0,0,86,95,23,195, +1,23,193,1,12,28,248,22,155,12,23,198,2,86,94,23,197,1,248,23,195, +1,247,22,140,2,196,88,148,39,40,58,8,240,0,0,0,2,9,226,0,2, +1,3,33,135,2,20,20,94,248,22,152,6,23,194,2,28,248,22,152,7,248, +22,152,6,23,195,1,12,248,22,182,11,6,30,30,101,120,112,101,99,116,101, +100,32,97,32,115,105,110,103,108,101,32,83,45,101,120,112,114,101,115,115,105, +111,110,248,22,137,6,23,194,1,28,248,22,91,193,28,28,249,22,132,4,41, +248,22,95,195,10,249,22,132,4,42,248,22,95,195,28,28,248,22,157,7,248, +22,83,194,10,28,249,22,173,9,2,64,248,22,173,20,195,10,249,22,173,9, +2,65,248,22,173,20,195,28,27,248,22,104,194,28,248,22,182,15,193,10,28, +248,22,157,7,193,28,248,22,141,16,193,10,248,22,142,16,193,11,27,248,22, +90,248,22,106,195,28,192,192,248,22,188,16,248,22,113,195,11,11,11,11,28, +248,22,131,16,249,22,136,16,23,196,2,23,198,2,27,248,22,70,248,22,186, +15,23,198,1,250,22,158,2,23,198,2,23,196,2,249,22,82,23,199,1,250, +22,160,2,23,203,1,23,201,1,9,12,250,22,158,2,23,197,1,23,198,1, +249,22,82,23,198,1,23,201,1,28,28,248,22,90,248,22,106,23,197,2,10, +249,22,179,16,248,22,113,23,198,2,247,22,175,8,27,248,22,146,16,249,22, +144,16,248,22,104,23,200,2,23,198,1,28,249,22,173,9,248,22,173,20,23, +199,2,2,65,86,94,23,196,1,249,22,3,20,20,94,88,148,8,36,40,56, +11,9,224,3,2,33,140,2,23,196,1,248,22,149,16,23,196,1,28,249,22, +173,9,248,22,173,20,23,199,2,2,64,86,94,23,196,1,86,94,28,250,22, +160,2,23,197,2,11,11,12,250,22,158,2,23,197,2,11,9,249,22,166,2, +23,196,2,20,20,95,88,148,8,36,41,53,11,9,224,3,2,33,141,2,23, +195,1,23,196,1,27,248,22,70,248,22,173,20,23,199,1,250,22,158,2,23, +198,2,23,196,2,249,22,82,248,22,131,2,23,200,1,250,22,160,2,23,203, +1,23,201,1,9,12,250,22,158,2,23,196,1,23,197,1,248,22,97,23,199, +1,27,28,28,23,194,2,248,22,171,9,248,22,83,23,196,2,10,9,27,249, +22,128,6,23,198,2,68,98,105,110,97,114,121,250,22,44,22,35,88,148,8, +36,39,47,11,9,223,3,33,137,2,20,20,94,88,148,8,36,39,46,11,9, +223,3,33,138,2,23,196,1,86,94,28,28,248,22,91,23,194,2,249,22,4, +32,0,88,148,8,36,40,48,11,9,222,33,139,2,23,195,2,11,12,248,22, +182,11,6,18,18,105,108,108,45,102,111,114,109,101,100,32,99,111,110,116,101, +110,116,27,247,22,140,2,27,90,144,42,11,89,146,42,39,11,248,22,139,16, +23,201,2,192,86,96,249,22,3,20,20,94,88,148,8,36,40,57,11,9,224, +2,3,33,142,2,23,195,1,23,197,1,249,22,166,2,195,88,148,8,36,41, +51,11,9,223,3,33,143,2,250,22,158,2,80,144,47,8,25,41,23,200,1, +249,22,82,23,201,1,198,193,20,13,144,80,144,40,8,28,40,250,80,144,43, +8,47,42,23,198,2,23,196,2,11,27,250,22,160,2,80,144,44,8,25,41, +23,197,2,21,143,11,17,0,0,27,248,22,83,23,195,2,27,249,80,144,45, +8,27,42,23,198,2,23,196,2,28,249,22,175,9,23,195,2,23,196,1,248, +22,174,20,195,86,94,23,195,1,20,13,144,80,144,43,8,28,40,250,80,144, +46,8,47,42,23,201,1,23,199,2,23,196,2,27,20,20,95,88,148,8,36, +39,55,8,240,0,0,0,2,9,225,5,4,1,33,144,2,23,194,1,23,197, +1,28,249,22,48,23,195,2,39,20,13,144,80,144,44,46,40,26,35,80,144, +8,40,47,40,249,22,31,11,80,144,8,42,46,40,22,149,15,10,22,150,15, +10,22,151,15,10,22,152,15,11,22,153,15,11,22,157,15,10,22,156,15,11, +22,158,15,10,22,155,15,10,22,159,15,10,22,154,15,11,22,160,15,10,22, +161,15,10,22,162,15,10,22,163,15,11,22,164,15,10,22,147,15,11,247,23, +193,1,250,22,186,11,2,9,2,52,23,196,1,248,22,8,20,20,94,88,148, +39,40,8,49,16,4,8,128,6,8,128,104,8,240,0,128,0,0,39,9,224, +1,2,33,145,2,23,195,1,0,7,35,114,120,34,47,43,34,28,248,22,157, +7,23,195,2,27,249,22,177,16,2,147,2,23,197,2,28,23,193,2,28,249, +22,132,4,248,22,103,23,196,2,248,22,186,3,248,22,160,7,23,199,2,249, +22,7,250,22,179,7,23,200,1,39,248,22,103,23,199,1,23,198,1,249,22, +7,250,22,179,7,23,200,2,39,248,22,103,23,199,2,249,22,82,249,22,179, +7,23,201,1,248,22,105,23,200,1,23,200,1,86,94,23,193,1,249,22,7, +23,197,1,23,198,1,90,144,42,11,89,146,42,39,11,248,22,139,16,23,198, +1,86,94,23,195,1,28,249,22,173,9,23,195,2,2,49,86,94,23,193,1, +249,22,7,23,196,1,23,200,1,27,249,22,82,23,197,1,23,201,1,28,248, +22,157,7,23,195,2,27,249,22,177,16,2,147,2,23,197,2,28,23,193,2, +28,249,22,132,4,248,22,103,23,196,2,248,22,186,3,248,22,160,7,23,199, +2,249,22,7,250,22,179,7,23,200,1,39,248,22,103,23,199,1,23,196,1, +249,22,7,250,22,179,7,23,200,2,39,248,22,103,23,199,2,249,22,82,249, +22,179,7,23,201,1,248,22,105,23,200,1,23,198,1,86,94,23,193,1,249, +22,7,23,197,1,23,196,1,90,144,42,11,89,146,42,39,11,248,22,139,16, +23,198,1,86,94,23,195,1,28,249,22,173,9,23,195,2,2,49,86,94,23, +193,1,249,22,7,23,196,1,23,198,1,249,80,144,48,8,31,42,194,249,22, +82,197,199,28,248,22,90,23,196,2,9,28,248,22,83,23,196,2,28,248,22, +151,2,248,22,173,20,23,197,2,250,22,96,249,22,2,22,131,2,250,22,160, +2,248,22,173,20,23,204,2,23,202,2,9,250,22,160,2,248,22,173,20,23, +202,2,11,9,27,248,22,174,20,23,200,1,28,248,22,90,23,194,2,9,28, +248,22,83,23,194,2,28,248,22,151,2,248,22,173,20,23,195,2,250,22,96, +249,22,2,22,131,2,250,22,160,2,248,22,173,20,23,202,2,23,206,2,9, +250,22,160,2,248,22,173,20,23,200,2,11,9,249,80,144,48,8,48,42,23, +203,1,248,22,174,20,23,199,1,27,248,80,144,45,8,30,42,248,22,173,20, +23,196,2,250,22,96,250,22,160,2,23,199,2,23,205,2,9,250,22,160,2, +23,199,1,11,9,249,80,144,49,8,48,42,23,204,1,248,22,174,20,23,200, +1,249,22,96,247,22,163,16,249,80,144,47,8,48,42,23,202,1,248,22,174, +20,23,198,1,27,248,80,144,41,8,30,42,248,22,173,20,23,198,2,250,22, +96,250,22,160,2,23,199,2,23,201,2,9,250,22,160,2,23,199,1,11,9, +27,248,22,174,20,23,201,1,28,248,22,90,23,194,2,9,28,248,22,83,23, 194,2,28,248,22,151,2,248,22,173,20,23,195,2,250,22,96,249,22,2,22, -131,2,250,22,160,2,248,22,173,20,23,202,2,23,206,2,9,250,22,160,2, -248,22,173,20,23,200,2,11,9,249,80,144,48,8,48,42,23,203,1,248,22, -174,20,23,199,1,27,248,80,144,45,8,30,42,248,22,173,20,23,196,2,250, -22,96,250,22,160,2,23,199,2,23,205,2,9,250,22,160,2,23,199,1,11, -9,249,80,144,49,8,48,42,23,204,1,248,22,174,20,23,200,1,249,22,96, -247,22,163,16,249,80,144,47,8,48,42,23,202,1,248,22,174,20,23,198,1, -27,248,80,144,41,8,30,42,248,22,173,20,23,198,2,250,22,96,250,22,160, -2,23,199,2,23,201,2,9,250,22,160,2,23,199,1,11,9,27,248,22,174, -20,23,201,1,28,248,22,90,23,194,2,9,28,248,22,83,23,194,2,28,248, -22,151,2,248,22,173,20,23,195,2,250,22,96,249,22,2,22,131,2,250,22, -160,2,248,22,173,20,23,202,2,23,207,2,9,250,22,160,2,248,22,173,20, -23,200,2,11,9,249,80,144,49,8,48,42,23,204,1,248,22,174,20,23,199, -1,27,248,80,144,46,8,30,42,248,22,173,20,23,196,2,250,22,96,250,22, -160,2,23,199,2,23,206,2,9,250,22,160,2,23,199,1,11,9,249,80,144, -50,8,48,42,23,205,1,248,22,174,20,23,200,1,249,22,96,247,22,163,16, -249,80,144,48,8,48,42,23,203,1,248,22,174,20,23,198,1,249,22,96,247, -22,163,16,27,248,22,174,20,23,199,1,28,248,22,90,23,194,2,9,28,248, -22,83,23,194,2,28,248,22,151,2,248,22,173,20,23,195,2,250,22,96,249, -22,2,22,131,2,250,22,160,2,248,22,173,20,23,202,2,23,205,2,9,250, -22,160,2,248,22,173,20,23,200,2,11,9,249,80,144,47,8,48,42,23,202, -1,248,22,174,20,23,199,1,27,248,80,144,44,8,30,42,248,22,173,20,23, -196,2,250,22,96,250,22,160,2,23,199,2,23,204,2,9,250,22,160,2,23, -199,1,11,9,249,80,144,48,8,48,42,23,203,1,248,22,174,20,23,200,1, -249,22,96,247,22,163,16,249,80,144,46,8,48,42,23,201,1,248,22,174,20, -23,198,1,32,150,2,88,148,8,36,40,50,11,2,50,222,33,151,2,28,248, -22,90,248,22,84,23,195,2,248,22,92,27,248,22,173,20,195,28,248,22,182, -15,193,248,22,186,15,193,192,250,22,93,27,248,22,173,20,23,198,2,28,248, -22,182,15,193,248,22,186,15,193,192,2,67,248,2,150,2,248,22,174,20,23, -198,1,250,22,141,8,6,7,7,10,32,126,97,32,126,97,6,1,1,32,23, -196,1,249,22,141,8,6,6,6,10,32,32,32,126,97,248,22,134,2,23,196, -1,32,154,2,88,148,39,41,51,11,68,102,105,108,116,101,114,222,33,155,2, -28,248,22,90,23,195,2,9,28,248,23,194,2,248,22,83,23,196,2,249,22, -82,248,22,173,20,23,197,2,249,2,154,2,23,197,1,248,22,174,20,23,199, -1,249,2,154,2,23,195,1,248,22,174,20,23,197,1,28,248,22,90,23,201, -2,86,95,23,200,1,23,199,1,28,23,201,2,28,197,249,22,136,16,202,199, -200,86,95,23,201,1,23,198,1,27,28,248,22,90,23,198,2,2,66,249,22, -1,22,180,7,248,2,150,2,23,200,2,248,23,199,1,251,22,141,8,6,70, -70,99,111,108,108,101,99,116,105,111,110,32,110,111,116,32,102,111,117,110,100, -10,32,32,99,111,108,108,101,99,116,105,111,110,58,32,126,115,10,32,32,105, -110,32,99,111,108,108,101,99,116,105,111,110,32,100,105,114,101,99,116,111,114, -105,101,115,58,126,97,126,97,28,248,22,90,23,203,1,28,248,22,182,15,23, -202,2,248,22,186,15,23,202,1,23,201,1,250,22,180,7,28,248,22,182,15, -23,205,2,248,22,186,15,23,205,1,23,204,1,2,67,23,201,2,249,22,1, -22,180,7,249,22,2,32,0,88,148,8,36,40,48,11,9,222,33,152,2,27, -248,22,95,23,206,2,27,248,22,95,247,22,163,16,28,249,22,133,4,249,22, -188,3,23,198,2,23,197,2,44,23,206,2,249,22,96,247,22,163,16,248,22, -92,249,22,141,8,6,50,50,46,46,46,32,91,126,97,32,97,100,100,105,116, -105,111,110,97,108,32,108,105,110,107,101,100,32,97,110,100,32,112,97,99,107, -97,103,101,32,100,105,114,101,99,116,111,114,105,101,115,93,249,22,188,3,23, -201,1,23,200,1,28,249,22,5,22,133,2,23,202,2,250,22,141,8,6,49, -49,10,32,32,32,115,117,98,45,99,111,108,108,101,99,116,105,111,110,58,32, -126,115,10,32,32,105,110,32,112,97,114,101,110,116,32,100,105,114,101,99,116, -111,114,105,101,115,58,126,97,23,201,1,249,22,1,22,180,7,249,22,2,32, -0,88,148,8,36,40,48,11,9,222,33,153,2,249,2,154,2,22,133,2,23, -209,1,86,95,23,200,1,23,198,1,2,66,27,248,22,83,23,202,2,27,28, -248,22,182,15,23,195,2,249,22,136,16,23,196,1,23,199,2,248,22,134,2, -23,195,1,28,28,248,22,182,15,248,22,173,20,23,204,2,248,22,131,16,23, -194,2,10,27,250,22,1,22,136,16,23,197,1,23,202,2,28,28,248,22,90, -23,200,2,10,248,22,131,16,23,194,2,28,23,201,2,28,28,250,80,144,45, -8,32,42,195,203,204,10,27,28,248,22,182,15,202,248,22,186,15,202,201,19, -248,22,160,7,23,195,2,27,28,249,22,136,4,23,196,4,43,28,249,22,163, -7,6,4,4,46,114,107,116,249,22,179,7,23,199,2,249,22,188,3,23,200, -4,43,249,22,180,7,250,22,179,7,23,200,1,39,249,22,188,3,23,201,4, -43,6,3,3,46,115,115,86,94,23,195,1,11,86,94,23,195,1,11,28,23, -193,2,250,80,144,48,8,32,42,198,23,196,1,23,15,11,2,28,200,249,22, -136,16,194,202,192,26,8,80,144,50,8,49,42,204,205,206,23,15,23,16,23, -17,248,22,174,20,23,19,28,23,19,23,19,200,192,26,8,80,144,50,8,49, -42,204,205,206,23,15,23,16,23,17,248,22,174,20,23,19,23,19,26,8,80, -144,49,8,49,42,203,204,205,206,23,15,23,16,248,22,174,20,23,18,23,18, -90,144,41,11,89,146,41,39,11,249,80,144,43,8,31,42,23,199,1,23,200, -1,27,248,22,70,28,248,22,182,15,195,248,22,186,15,195,194,27,27,247,22, -164,16,28,248,22,90,23,194,2,9,28,248,22,83,23,194,2,28,248,22,151, -2,248,22,173,20,23,195,2,250,22,96,249,22,2,22,131,2,250,22,160,2, -248,22,173,20,23,202,2,23,203,2,9,250,22,160,2,248,22,173,20,23,200, -2,11,9,249,80,144,49,8,48,42,23,200,1,248,22,174,20,23,199,1,27, -248,80,144,46,8,30,42,248,22,173,20,23,196,2,250,22,96,250,22,160,2, -23,199,2,23,202,2,9,250,22,160,2,23,199,1,11,9,249,80,144,50,8, -48,42,23,201,1,248,22,174,20,23,200,1,249,22,96,247,22,163,16,249,80, -144,48,8,48,42,23,199,1,248,22,174,20,23,198,1,26,8,80,144,51,8, -49,42,200,202,203,205,23,16,23,17,200,11,32,158,2,88,148,8,36,42,59, -11,2,50,222,33,159,2,28,248,22,137,4,23,196,2,86,94,23,195,1,19, -248,22,151,8,23,195,2,19,248,22,151,8,23,196,2,249,22,128,16,27,251, -22,158,8,250,22,157,8,23,205,2,39,23,204,4,2,51,249,22,157,8,23, -204,1,23,202,4,2,68,28,248,22,137,4,248,22,151,8,23,195,2,86,94, -23,193,1,251,22,188,11,2,37,2,69,2,70,202,192,28,248,22,183,15,198, -248,22,184,15,198,247,22,185,15,2,2,27,248,22,186,3,23,197,1,28,249, -22,173,9,8,46,249,22,152,8,23,198,2,23,197,2,27,248,22,185,3,23, -195,2,249,22,128,16,27,251,22,158,8,250,22,157,8,23,205,2,39,23,204, -1,2,71,249,22,157,8,23,204,1,23,202,1,2,68,28,248,22,137,4,248, -22,151,8,23,195,2,86,94,23,193,1,251,22,188,11,2,37,2,69,2,70, -202,192,28,248,22,183,15,198,248,22,184,15,198,247,22,185,15,250,2,158,2, -196,197,195,248,22,130,16,27,250,22,136,16,23,200,1,23,202,1,23,199,1, -28,249,22,173,9,23,197,2,66,115,97,109,101,192,28,248,22,141,16,23,196, -2,249,22,136,16,194,196,249,80,144,46,42,42,23,195,1,23,197,1,249,22, -5,20,20,96,88,148,39,40,54,47,9,226,5,4,2,6,33,160,2,23,199, -1,23,195,1,23,197,1,23,196,1,27,248,22,130,16,249,22,136,16,23,198, -2,23,199,2,28,23,193,2,192,86,94,23,193,1,28,23,197,1,27,90,144, -41,11,89,146,41,39,11,250,80,144,46,8,34,42,23,202,2,2,68,2,37, -27,248,22,188,15,23,196,1,27,250,2,158,2,23,197,2,23,204,1,248,22, -151,8,23,198,1,28,248,22,183,15,195,249,22,136,16,196,194,192,27,247,22, -165,16,249,22,5,20,20,96,88,148,39,40,51,47,9,226,5,6,2,3,33, -161,2,23,196,1,23,195,1,23,199,1,247,22,166,16,11,86,95,28,28,248, -22,183,15,23,194,2,10,28,248,22,182,15,23,194,2,10,28,248,22,157,7, -23,194,2,28,248,22,141,16,23,194,2,10,248,22,142,16,23,194,2,11,12, -252,22,186,11,23,200,2,2,42,39,23,198,2,23,199,2,28,28,248,22,157, -7,23,195,2,10,248,22,146,8,23,195,2,86,94,23,194,1,12,252,22,186, -11,23,200,2,2,72,40,23,198,2,23,199,1,90,144,42,11,89,146,42,39, -11,248,22,139,16,23,197,2,86,94,23,195,1,86,94,28,23,193,2,86,95, -23,198,1,23,196,1,12,250,22,189,11,23,201,1,2,73,23,199,1,249,22, -7,23,195,1,23,196,1,32,164,2,88,148,8,36,46,61,11,2,74,222,33, -165,2,249,22,128,16,27,251,22,158,8,250,22,157,8,23,203,2,39,23,207, -1,23,205,1,249,23,203,1,23,202,1,23,208,1,28,248,22,157,7,23,204, -2,249,22,172,8,23,205,1,8,63,23,203,1,28,248,22,137,4,248,22,151, -8,23,195,2,86,94,23,193,1,251,22,188,11,2,37,2,69,2,70,201,192, -28,248,22,183,15,197,248,22,184,15,197,247,22,185,15,32,166,2,88,148,8, -36,45,8,24,11,2,50,222,33,167,2,28,248,22,137,4,23,199,2,86,95, -23,198,1,23,194,1,19,248,22,151,8,23,195,2,19,248,22,151,8,23,196, -2,249,22,128,16,27,251,22,158,8,250,22,157,8,23,205,2,39,23,204,4, -2,51,249,23,206,1,23,204,1,23,202,4,28,248,22,157,7,23,207,2,249, -22,172,8,23,208,1,8,63,23,206,1,28,248,22,137,4,248,22,151,8,23, -195,2,86,94,23,193,1,251,22,188,11,2,37,2,69,2,70,204,192,28,248, -22,183,15,200,248,22,184,15,200,247,22,185,15,2,2,27,248,22,186,3,23, -200,1,28,249,22,173,9,8,46,249,22,152,8,23,198,2,23,197,2,27,248, -22,185,3,23,195,2,249,22,128,16,27,251,22,158,8,250,22,157,8,23,205, -2,39,23,204,1,23,203,1,249,23,206,1,23,204,1,23,202,1,28,248,22, -157,7,23,207,2,249,22,172,8,23,208,1,8,63,23,206,1,28,248,22,137, -4,248,22,151,8,23,195,2,86,94,23,193,1,251,22,188,11,2,37,2,69, -2,70,204,192,28,248,22,183,15,200,248,22,184,15,200,247,22,185,15,28,248, -22,137,4,23,194,2,86,95,23,195,1,23,193,1,19,248,22,151,8,23,196, -2,19,248,22,151,8,23,197,2,249,22,128,16,27,251,22,158,8,250,22,157, -8,23,206,2,39,23,204,4,2,51,249,23,207,1,23,205,1,23,202,4,28, -248,22,157,7,23,208,2,249,22,172,8,23,209,1,8,63,23,207,1,28,248, -22,137,4,248,22,151,8,23,195,2,86,94,23,193,1,251,22,188,11,2,37, -2,69,2,70,205,192,28,248,22,183,15,201,248,22,184,15,201,247,22,185,15, -2,2,27,248,22,186,3,23,195,1,28,249,22,173,9,8,46,249,22,152,8, -23,199,2,23,197,2,27,248,22,185,3,23,195,2,249,22,128,16,27,251,22, -158,8,250,22,157,8,23,206,2,39,23,204,1,23,204,1,249,23,207,1,23, -205,1,23,202,1,28,248,22,157,7,23,208,2,249,22,172,8,23,209,1,8, -63,23,207,1,28,248,22,137,4,248,22,151,8,23,195,2,86,94,23,193,1, -251,22,188,11,2,37,2,69,2,70,205,192,28,248,22,183,15,201,248,22,184, -15,201,247,22,185,15,28,248,22,137,4,193,254,2,164,2,201,203,204,205,248, -22,151,8,202,2,51,248,22,151,8,202,27,248,22,186,3,194,28,249,22,173, -9,8,46,249,22,152,8,199,196,254,2,164,2,202,204,205,206,199,203,248,22, -185,3,200,253,2,166,2,201,202,203,204,205,198,90,144,41,11,89,146,41,39, -11,86,95,28,28,248,22,183,15,23,199,2,10,28,248,22,182,15,23,199,2, -10,28,248,22,157,7,23,199,2,28,248,22,141,16,23,199,2,10,248,22,142, -16,23,199,2,11,12,252,22,186,11,23,200,2,2,42,39,23,203,2,23,204, -2,28,28,248,22,157,7,23,200,2,10,248,22,146,8,23,200,2,12,252,22, -186,11,23,200,2,2,72,40,23,203,2,23,204,2,90,144,42,11,89,146,42, -39,11,248,22,139,16,23,202,2,86,94,23,195,1,86,94,28,192,12,250,22, -189,11,23,201,1,2,73,23,204,2,249,22,7,194,195,27,248,22,188,15,23, -196,1,27,19,248,22,151,8,23,196,2,28,248,22,137,4,23,194,4,86,94, -23,199,1,19,248,22,151,8,23,197,2,19,248,22,151,8,23,198,2,249,22, -128,16,27,251,22,158,8,250,22,157,8,23,207,2,39,23,204,4,2,51,249, -23,211,1,23,206,1,23,202,4,28,248,22,157,7,23,212,2,249,22,172,8, -23,213,1,8,63,23,211,1,28,248,22,137,4,248,22,151,8,23,195,2,86, +131,2,250,22,160,2,248,22,173,20,23,202,2,23,207,2,9,250,22,160,2, +248,22,173,20,23,200,2,11,9,249,80,144,49,8,48,42,23,204,1,248,22, +174,20,23,199,1,27,248,80,144,46,8,30,42,248,22,173,20,23,196,2,250, +22,96,250,22,160,2,23,199,2,23,206,2,9,250,22,160,2,23,199,1,11, +9,249,80,144,50,8,48,42,23,205,1,248,22,174,20,23,200,1,249,22,96, +247,22,163,16,249,80,144,48,8,48,42,23,203,1,248,22,174,20,23,198,1, +249,22,96,247,22,163,16,27,248,22,174,20,23,199,1,28,248,22,90,23,194, +2,9,28,248,22,83,23,194,2,28,248,22,151,2,248,22,173,20,23,195,2, +250,22,96,249,22,2,22,131,2,250,22,160,2,248,22,173,20,23,202,2,23, +205,2,9,250,22,160,2,248,22,173,20,23,200,2,11,9,249,80,144,47,8, +48,42,23,202,1,248,22,174,20,23,199,1,27,248,80,144,44,8,30,42,248, +22,173,20,23,196,2,250,22,96,250,22,160,2,23,199,2,23,204,2,9,250, +22,160,2,23,199,1,11,9,249,80,144,48,8,48,42,23,203,1,248,22,174, +20,23,200,1,249,22,96,247,22,163,16,249,80,144,46,8,48,42,23,201,1, +248,22,174,20,23,198,1,32,150,2,88,148,8,36,40,50,11,2,50,222,33, +151,2,28,248,22,90,248,22,84,23,195,2,248,22,92,27,248,22,173,20,195, +28,248,22,182,15,193,248,22,186,15,193,192,250,22,93,27,248,22,173,20,23, +198,2,28,248,22,182,15,193,248,22,186,15,193,192,2,67,248,2,150,2,248, +22,174,20,23,198,1,250,22,141,8,6,7,7,10,32,126,97,32,126,97,6, +1,1,32,23,196,1,249,22,141,8,6,6,6,10,32,32,32,126,97,248,22, +134,2,23,196,1,32,154,2,88,148,39,41,51,11,68,102,105,108,116,101,114, +222,33,155,2,28,248,22,90,23,195,2,9,28,248,23,194,2,248,22,83,23, +196,2,249,22,82,248,22,173,20,23,197,2,249,2,154,2,23,197,1,248,22, +174,20,23,199,1,249,2,154,2,23,195,1,248,22,174,20,23,197,1,28,248, +22,90,23,201,2,86,95,23,200,1,23,199,1,28,23,201,2,28,197,249,22, +136,16,202,199,200,86,95,23,201,1,23,198,1,27,28,248,22,90,23,198,2, +2,66,249,22,1,22,180,7,248,2,150,2,23,200,2,248,23,199,1,251,22, +141,8,6,70,70,99,111,108,108,101,99,116,105,111,110,32,110,111,116,32,102, +111,117,110,100,10,32,32,99,111,108,108,101,99,116,105,111,110,58,32,126,115, +10,32,32,105,110,32,99,111,108,108,101,99,116,105,111,110,32,100,105,114,101, +99,116,111,114,105,101,115,58,126,97,126,97,28,248,22,90,23,203,1,28,248, +22,182,15,23,202,2,248,22,186,15,23,202,1,23,201,1,250,22,180,7,28, +248,22,182,15,23,205,2,248,22,186,15,23,205,1,23,204,1,2,67,23,201, +2,249,22,1,22,180,7,249,22,2,32,0,88,148,8,36,40,48,11,9,222, +33,152,2,27,248,22,95,23,206,2,27,248,22,95,247,22,163,16,28,249,22, +133,4,249,22,188,3,23,198,2,23,197,2,44,23,206,2,249,22,96,247,22, +163,16,248,22,92,249,22,141,8,6,50,50,46,46,46,32,91,126,97,32,97, +100,100,105,116,105,111,110,97,108,32,108,105,110,107,101,100,32,97,110,100,32, +112,97,99,107,97,103,101,32,100,105,114,101,99,116,111,114,105,101,115,93,249, +22,188,3,23,201,1,23,200,1,28,249,22,5,22,133,2,23,202,2,250,22, +141,8,6,49,49,10,32,32,32,115,117,98,45,99,111,108,108,101,99,116,105, +111,110,58,32,126,115,10,32,32,105,110,32,112,97,114,101,110,116,32,100,105, +114,101,99,116,111,114,105,101,115,58,126,97,23,201,1,249,22,1,22,180,7, +249,22,2,32,0,88,148,8,36,40,48,11,9,222,33,153,2,249,2,154,2, +22,133,2,23,209,1,86,95,23,200,1,23,198,1,2,66,27,248,22,83,23, +202,2,27,28,248,22,182,15,23,195,2,249,22,136,16,23,196,1,23,199,2, +248,22,134,2,23,195,1,28,28,248,22,182,15,248,22,173,20,23,204,2,248, +22,131,16,23,194,2,10,27,250,22,1,22,136,16,23,197,1,23,202,2,28, +28,248,22,90,23,200,2,10,248,22,131,16,23,194,2,28,23,201,2,28,28, +250,80,144,45,8,32,42,195,203,204,10,27,28,248,22,182,15,202,248,22,186, +15,202,201,19,248,22,160,7,23,195,2,27,28,249,22,162,20,23,196,4,43, +28,249,22,163,7,6,4,4,46,114,107,116,249,22,179,7,23,199,2,249,22, +188,3,23,200,4,43,249,22,180,7,250,22,179,7,23,200,1,39,249,22,188, +3,23,201,4,43,6,3,3,46,115,115,86,94,23,195,1,11,86,94,23,195, +1,11,28,23,193,2,250,80,144,48,8,32,42,198,23,196,1,23,15,11,2, +28,200,249,22,136,16,194,202,192,26,8,80,144,50,8,49,42,204,205,206,23, +15,23,16,23,17,248,22,174,20,23,19,28,23,19,23,19,200,192,26,8,80, +144,50,8,49,42,204,205,206,23,15,23,16,23,17,248,22,174,20,23,19,23, +19,26,8,80,144,49,8,49,42,203,204,205,206,23,15,23,16,248,22,174,20, +23,18,23,18,90,144,41,11,89,146,41,39,11,249,80,144,43,8,31,42,23, +199,1,23,200,1,27,248,22,70,28,248,22,182,15,195,248,22,186,15,195,194, +27,27,247,22,164,16,28,248,22,90,23,194,2,9,28,248,22,83,23,194,2, +28,248,22,151,2,248,22,173,20,23,195,2,250,22,96,249,22,2,22,131,2, +250,22,160,2,248,22,173,20,23,202,2,23,203,2,9,250,22,160,2,248,22, +173,20,23,200,2,11,9,249,80,144,49,8,48,42,23,200,1,248,22,174,20, +23,199,1,27,248,80,144,46,8,30,42,248,22,173,20,23,196,2,250,22,96, +250,22,160,2,23,199,2,23,202,2,9,250,22,160,2,23,199,1,11,9,249, +80,144,50,8,48,42,23,201,1,248,22,174,20,23,200,1,249,22,96,247,22, +163,16,249,80,144,48,8,48,42,23,199,1,248,22,174,20,23,198,1,26,8, +80,144,51,8,49,42,200,202,203,205,23,16,23,17,200,11,32,158,2,88,148, +8,36,42,59,11,2,50,222,33,159,2,28,248,22,137,4,23,196,2,86,94, +23,195,1,19,248,22,151,8,23,195,2,19,248,22,151,8,23,196,2,249,22, +128,16,27,251,22,158,8,250,22,157,8,23,205,2,39,23,204,4,2,51,249, +22,157,8,23,204,1,23,202,4,2,68,28,249,22,158,20,248,22,151,8,23, +196,2,39,86,94,23,193,1,251,22,188,11,2,37,2,69,2,70,202,192,28, +248,22,183,15,198,248,22,184,15,198,247,22,185,15,2,2,27,248,22,186,3, +23,197,1,28,249,22,173,9,8,46,249,22,152,8,23,198,2,23,197,2,27, +248,22,185,3,23,195,2,249,22,128,16,27,251,22,158,8,250,22,157,8,23, +205,2,39,23,204,1,2,71,249,22,157,8,23,204,1,23,202,1,2,68,28, +249,22,158,20,248,22,151,8,23,196,2,39,86,94,23,193,1,251,22,188,11, +2,37,2,69,2,70,202,192,28,248,22,183,15,198,248,22,184,15,198,247,22, +185,15,250,2,158,2,196,197,195,248,22,130,16,27,250,22,136,16,23,200,1, +23,202,1,23,199,1,28,249,22,173,9,23,197,2,66,115,97,109,101,192,28, +248,22,141,16,23,196,2,249,22,136,16,194,196,249,80,144,46,42,42,23,195, +1,23,197,1,249,22,5,20,20,96,88,148,39,40,54,47,9,226,5,4,2, +6,33,160,2,23,199,1,23,195,1,23,197,1,23,196,1,27,248,22,130,16, +249,22,136,16,23,198,2,23,199,2,28,23,193,2,192,86,94,23,193,1,28, +23,197,1,27,90,144,41,11,89,146,41,39,11,250,80,144,46,8,34,42,23, +202,2,2,68,2,37,27,248,22,188,15,23,196,1,27,250,2,158,2,23,197, +2,23,204,1,248,22,151,8,23,198,1,28,248,22,183,15,195,249,22,136,16, +196,194,192,27,247,22,165,16,249,22,5,20,20,96,88,148,39,40,51,47,9, +226,5,6,2,3,33,161,2,23,196,1,23,195,1,23,199,1,247,22,166,16, +11,86,95,28,28,248,22,183,15,23,194,2,10,28,248,22,182,15,23,194,2, +10,28,248,22,157,7,23,194,2,28,248,22,141,16,23,194,2,10,248,22,142, +16,23,194,2,11,12,252,22,186,11,23,200,2,2,42,39,23,198,2,23,199, +2,28,28,248,22,157,7,23,195,2,10,248,22,146,8,23,195,2,86,94,23, +194,1,12,252,22,186,11,23,200,2,2,72,40,23,198,2,23,199,1,90,144, +42,11,89,146,42,39,11,248,22,139,16,23,197,2,86,94,23,195,1,86,94, +28,23,193,2,86,95,23,198,1,23,196,1,12,250,22,189,11,23,201,1,2, +73,23,199,1,249,22,7,23,195,1,23,196,1,32,164,2,88,148,8,36,46, +61,11,2,74,222,33,165,2,249,22,128,16,27,251,22,158,8,250,22,157,8, +23,203,2,39,23,207,1,23,205,1,249,23,203,1,23,202,1,23,208,1,28, +248,22,157,7,23,204,2,249,22,172,8,23,205,1,8,63,23,203,1,28,249, +22,158,20,248,22,151,8,23,196,2,39,86,94,23,193,1,251,22,188,11,2, +37,2,69,2,70,201,192,28,248,22,183,15,197,248,22,184,15,197,247,22,185, +15,32,166,2,88,148,8,36,45,8,24,11,2,50,222,33,167,2,28,248,22, +137,4,23,199,2,86,95,23,198,1,23,194,1,19,248,22,151,8,23,195,2, +19,248,22,151,8,23,196,2,249,22,128,16,27,251,22,158,8,250,22,157,8, +23,205,2,39,23,204,4,2,51,249,23,206,1,23,204,1,23,202,4,28,248, +22,157,7,23,207,2,249,22,172,8,23,208,1,8,63,23,206,1,28,249,22, +158,20,248,22,151,8,23,196,2,39,86,94,23,193,1,251,22,188,11,2,37, +2,69,2,70,204,192,28,248,22,183,15,200,248,22,184,15,200,247,22,185,15, +2,2,27,248,22,186,3,23,200,1,28,249,22,173,9,8,46,249,22,152,8, +23,198,2,23,197,2,27,248,22,185,3,23,195,2,249,22,128,16,27,251,22, +158,8,250,22,157,8,23,205,2,39,23,204,1,23,203,1,249,23,206,1,23, +204,1,23,202,1,28,248,22,157,7,23,207,2,249,22,172,8,23,208,1,8, +63,23,206,1,28,249,22,158,20,248,22,151,8,23,196,2,39,86,94,23,193, +1,251,22,188,11,2,37,2,69,2,70,204,192,28,248,22,183,15,200,248,22, +184,15,200,247,22,185,15,28,248,22,137,4,23,194,2,86,95,23,195,1,23, +193,1,19,248,22,151,8,23,196,2,19,248,22,151,8,23,197,2,249,22,128, +16,27,251,22,158,8,250,22,157,8,23,206,2,39,23,204,4,2,51,249,23, +207,1,23,205,1,23,202,4,28,248,22,157,7,23,208,2,249,22,172,8,23, +209,1,8,63,23,207,1,28,249,22,158,20,248,22,151,8,23,196,2,39,86, +94,23,193,1,251,22,188,11,2,37,2,69,2,70,205,192,28,248,22,183,15, +201,248,22,184,15,201,247,22,185,15,2,2,27,248,22,186,3,23,195,1,28, +249,22,173,9,8,46,249,22,152,8,23,199,2,23,197,2,27,248,22,185,3, +23,195,2,249,22,128,16,27,251,22,158,8,250,22,157,8,23,206,2,39,23, +204,1,23,204,1,249,23,207,1,23,205,1,23,202,1,28,248,22,157,7,23, +208,2,249,22,172,8,23,209,1,8,63,23,207,1,28,249,22,158,20,248,22, +151,8,23,196,2,39,86,94,23,193,1,251,22,188,11,2,37,2,69,2,70, +205,192,28,248,22,183,15,201,248,22,184,15,201,247,22,185,15,28,248,22,137, +4,193,254,2,164,2,201,203,204,205,248,22,151,8,202,2,51,248,22,151,8, +202,27,248,22,186,3,194,28,249,22,173,9,8,46,249,22,152,8,199,196,254, +2,164,2,202,204,205,206,199,203,248,22,185,3,200,253,2,166,2,201,202,203, +204,205,198,90,144,41,11,89,146,41,39,11,86,95,28,28,248,22,183,15,23, +199,2,10,28,248,22,182,15,23,199,2,10,28,248,22,157,7,23,199,2,28, +248,22,141,16,23,199,2,10,248,22,142,16,23,199,2,11,12,252,22,186,11, +23,200,2,2,42,39,23,203,2,23,204,2,28,28,248,22,157,7,23,200,2, +10,248,22,146,8,23,200,2,12,252,22,186,11,23,200,2,2,72,40,23,203, +2,23,204,2,90,144,42,11,89,146,42,39,11,248,22,139,16,23,202,2,86, +94,23,195,1,86,94,28,192,12,250,22,189,11,23,201,1,2,73,23,204,2, +249,22,7,194,195,27,248,22,188,15,23,196,1,27,19,248,22,151,8,23,196, +2,28,249,22,158,20,23,195,4,39,86,94,23,199,1,19,248,22,151,8,23, +197,2,19,248,22,151,8,23,198,2,249,22,128,16,27,251,22,158,8,250,22, +157,8,23,207,2,39,23,204,4,2,51,249,23,211,1,23,206,1,23,202,4, +28,248,22,157,7,23,212,2,249,22,172,8,23,213,1,8,63,23,211,1,28, +249,22,158,20,248,22,151,8,23,196,2,39,86,94,23,193,1,251,22,188,11, +2,37,2,69,2,70,23,17,192,28,248,22,183,15,205,248,22,184,15,205,247, +22,185,15,2,2,27,248,22,186,3,23,195,4,28,249,22,173,9,8,46,249, +22,152,8,23,200,2,23,197,2,27,248,22,185,3,23,195,2,249,22,128,16, +27,251,22,158,8,250,22,157,8,23,207,2,39,23,204,1,23,208,1,249,23, +211,1,23,206,1,23,202,1,28,248,22,157,7,23,212,2,249,22,172,8,23, +213,1,8,63,23,211,1,28,249,22,158,20,248,22,151,8,23,196,2,39,86, 94,23,193,1,251,22,188,11,2,37,2,69,2,70,23,17,192,28,248,22,183, -15,205,248,22,184,15,205,247,22,185,15,2,2,27,248,22,186,3,23,195,4, -28,249,22,173,9,8,46,249,22,152,8,23,200,2,23,197,2,27,248,22,185, -3,23,195,2,249,22,128,16,27,251,22,158,8,250,22,157,8,23,207,2,39, -23,204,1,23,208,1,249,23,211,1,23,206,1,23,202,1,28,248,22,157,7, -23,212,2,249,22,172,8,23,213,1,8,63,23,211,1,28,248,22,137,4,248, -22,151,8,23,195,2,86,94,23,193,1,251,22,188,11,2,37,2,69,2,70, -23,17,192,28,248,22,183,15,205,248,22,184,15,205,247,22,185,15,28,248,22, -137,4,23,194,2,86,95,23,200,1,23,193,1,254,2,164,2,23,203,2,23, -208,1,23,209,1,23,210,1,248,22,151,8,23,204,2,2,51,248,22,151,8, -23,204,1,27,248,22,186,3,23,195,1,28,249,22,173,9,8,46,249,22,152, -8,23,201,2,23,197,2,254,2,164,2,23,204,1,23,209,1,23,210,1,23, -211,1,23,200,2,23,208,1,248,22,185,3,23,201,1,253,2,166,2,23,203, -1,23,207,1,23,208,1,23,209,1,23,210,1,23,199,1,2,28,248,22,183, -15,195,249,22,136,16,196,194,192,32,169,2,88,148,8,36,43,61,11,2,50, -222,33,170,2,28,248,22,137,4,23,197,2,86,94,23,196,1,19,248,22,151, -8,23,195,2,35,248,22,151,8,23,196,2,249,22,128,16,27,251,22,158,8, -250,22,157,8,23,205,1,39,23,204,4,2,51,2,51,28,248,22,157,7,23, -205,2,249,22,172,8,23,206,1,8,63,23,204,1,28,248,22,137,4,248,22, -151,8,23,195,2,86,94,23,193,1,251,22,188,11,2,37,2,69,2,70,202, +15,205,248,22,184,15,205,247,22,185,15,28,248,22,137,4,23,194,2,86,95, +23,200,1,23,193,1,254,2,164,2,23,203,2,23,208,1,23,209,1,23,210, +1,248,22,151,8,23,204,2,2,51,248,22,151,8,23,204,1,27,248,22,186, +3,23,195,1,28,249,22,173,9,8,46,249,22,152,8,23,201,2,23,197,2, +254,2,164,2,23,204,1,23,209,1,23,210,1,23,211,1,23,200,2,23,208, +1,248,22,185,3,23,201,1,253,2,166,2,23,203,1,23,207,1,23,208,1, +23,209,1,23,210,1,23,199,1,2,28,248,22,183,15,195,249,22,136,16,196, +194,192,32,169,2,88,148,8,36,43,60,11,2,50,222,33,172,2,32,170,2, +88,148,8,36,45,60,11,2,74,222,33,171,2,86,94,23,198,1,249,22,128, +16,27,251,22,158,8,250,22,157,8,23,203,1,39,23,206,1,23,204,1,2, +51,28,248,22,157,7,23,203,2,249,22,172,8,23,204,1,8,63,23,202,1, +28,249,22,158,20,248,22,151,8,23,196,2,39,86,94,23,193,1,251,22,188, +11,2,37,2,69,2,70,200,192,28,248,22,183,15,196,248,22,184,15,196,247, +22,185,15,28,248,22,137,4,23,197,2,86,94,23,196,1,19,248,22,151,8, +23,195,2,35,248,22,151,8,23,196,2,249,22,128,16,27,251,22,158,8,250, +22,157,8,23,205,1,39,23,204,4,2,51,2,51,28,248,22,157,7,23,205, +2,249,22,172,8,23,206,1,8,63,23,204,1,28,249,22,158,20,248,22,151, +8,23,196,2,39,86,94,23,193,1,251,22,188,11,2,37,2,69,2,70,202, 192,28,248,22,183,15,198,248,22,184,15,198,247,22,185,15,2,27,248,22,186, 3,23,198,1,28,249,22,173,9,8,46,249,22,152,8,23,198,2,23,197,2, 35,248,22,185,3,23,195,2,249,22,128,16,27,251,22,158,8,250,22,157,8, 23,205,1,39,23,204,1,2,51,2,51,28,248,22,157,7,23,205,2,249,22, -172,8,23,206,1,8,63,23,204,1,28,248,22,137,4,248,22,151,8,23,195, -2,86,94,23,193,1,251,22,188,11,2,37,2,69,2,70,202,192,28,248,22, -183,15,198,248,22,184,15,198,247,22,185,15,28,248,22,137,4,23,194,2,86, -94,23,193,1,19,248,22,151,8,23,196,2,35,248,22,151,8,23,197,2,249, -22,128,16,27,251,22,158,8,250,22,157,8,23,206,1,39,23,204,4,2,51, -2,51,28,248,22,157,7,23,206,2,249,22,172,8,23,207,1,8,63,23,205, -1,28,248,22,137,4,248,22,151,8,23,195,2,86,94,23,193,1,251,22,188, -11,2,37,2,69,2,70,203,192,28,248,22,183,15,199,248,22,184,15,199,247, -22,185,15,2,27,248,22,186,3,23,195,1,28,249,22,173,9,8,46,249,22, -152,8,23,199,2,23,197,2,35,248,22,185,3,23,195,2,249,22,128,16,27, -251,22,158,8,250,22,157,8,23,206,1,39,23,204,1,2,51,2,51,28,248, -22,157,7,23,206,2,249,22,172,8,23,207,1,8,63,23,205,1,28,248,22, -137,4,248,22,151,8,23,195,2,86,94,23,193,1,251,22,188,11,2,37,2, -69,2,70,203,192,28,248,22,183,15,199,248,22,184,15,199,247,22,185,15,251, -2,169,2,198,199,200,196,90,144,41,11,89,146,41,39,11,86,95,28,28,248, -22,183,15,23,196,2,10,28,248,22,182,15,23,196,2,10,28,248,22,157,7, -23,196,2,28,248,22,141,16,23,196,2,10,248,22,142,16,23,196,2,11,12, -252,22,186,11,2,37,2,42,39,23,200,2,23,201,2,28,28,248,22,157,7, -23,197,2,10,248,22,146,8,23,197,2,12,252,22,186,11,2,37,2,72,40, -23,200,2,23,201,2,90,144,42,11,89,146,42,39,11,248,22,139,16,23,199, -2,86,94,23,195,1,86,94,28,192,12,250,22,189,11,2,37,2,73,23,201, -2,249,22,7,194,195,27,248,22,188,15,23,196,1,27,251,2,169,2,23,198, -2,23,201,1,23,202,1,248,22,151,8,23,199,1,28,248,22,183,15,195,249, -22,136,16,196,194,192,2,51,252,80,144,44,8,35,42,2,37,2,51,32,0, -88,148,8,36,41,46,11,9,222,33,172,2,198,199,32,174,2,88,148,8,36, -43,60,11,2,50,222,33,177,2,32,175,2,88,148,8,36,45,60,11,2,74, -222,33,176,2,249,22,128,16,27,251,22,158,8,250,22,157,8,23,203,2,39, -23,206,1,23,204,1,249,22,157,8,23,202,1,23,207,1,28,248,22,157,7, -23,203,2,249,22,172,8,23,204,1,8,63,23,202,1,28,248,22,137,4,248, -22,151,8,23,195,2,86,94,23,193,1,251,22,188,11,2,37,2,69,2,70, -200,192,28,248,22,183,15,196,248,22,184,15,196,247,22,185,15,28,248,22,137, -4,23,197,2,86,94,23,196,1,19,248,22,151,8,23,195,2,19,248,22,151, -8,23,196,2,249,22,128,16,27,251,22,158,8,250,22,157,8,23,205,2,39, -23,204,4,2,51,249,22,157,8,23,204,1,23,202,4,28,248,22,157,7,23, -205,2,249,22,172,8,23,206,1,8,63,23,204,1,28,248,22,137,4,248,22, -151,8,23,195,2,86,94,23,193,1,251,22,188,11,2,37,2,69,2,70,202, -192,28,248,22,183,15,198,248,22,184,15,198,247,22,185,15,2,2,27,248,22, -186,3,23,198,1,28,249,22,173,9,8,46,249,22,152,8,23,198,2,23,197, -2,27,248,22,185,3,23,195,2,249,22,128,16,27,251,22,158,8,250,22,157, -8,23,205,2,39,23,204,1,2,71,249,22,157,8,23,204,1,23,202,1,28, -248,22,157,7,23,205,2,249,22,172,8,23,206,1,8,63,23,204,1,28,248, -22,137,4,248,22,151,8,23,195,2,86,94,23,193,1,251,22,188,11,2,37, -2,69,2,70,202,192,28,248,22,183,15,198,248,22,184,15,198,247,22,185,15, -28,248,22,137,4,193,253,2,175,2,199,200,201,248,22,151,8,200,2,51,248, -22,151,8,200,27,248,22,186,3,194,28,249,22,173,9,8,46,249,22,152,8, -198,196,253,2,175,2,200,201,202,198,2,71,248,22,185,3,199,251,2,174,2, -198,199,200,196,90,144,41,11,89,146,41,39,11,86,95,28,28,248,22,183,15, -23,196,2,10,28,248,22,182,15,23,196,2,10,28,248,22,157,7,23,196,2, -28,248,22,141,16,23,196,2,10,248,22,142,16,23,196,2,11,12,252,22,186, -11,2,37,2,42,39,23,200,2,23,201,2,28,28,248,22,157,7,23,197,2, -10,248,22,146,8,23,197,2,12,252,22,186,11,2,37,2,72,40,23,200,2, -23,201,2,90,144,42,11,89,146,42,39,11,248,22,139,16,23,199,2,86,94, -23,195,1,86,94,28,192,12,250,22,189,11,2,37,2,73,23,201,2,249,22, -7,194,195,27,248,22,188,15,23,196,1,27,251,2,174,2,23,198,2,23,201, -1,23,202,1,248,22,151,8,23,199,1,28,248,22,183,15,195,249,22,136,16, -196,194,192,252,80,144,44,8,35,42,2,37,2,71,22,157,8,198,199,249,247, -22,180,5,23,195,1,11,249,247,22,180,5,194,11,28,248,22,90,23,195,2, -9,27,27,248,22,83,23,197,2,28,248,22,143,16,23,194,2,248,22,146,16, -23,194,1,28,248,22,142,16,23,194,2,90,144,42,11,89,146,42,39,11,248, -22,139,16,249,22,144,16,250,80,144,50,43,42,248,22,159,16,2,56,11,11, -248,22,159,16,2,57,86,95,23,195,1,23,194,1,248,22,146,16,249,22,144, -16,23,199,1,23,196,1,27,250,80,144,45,43,42,248,22,159,16,2,56,23, -197,1,10,28,23,193,2,248,22,146,16,23,194,1,11,28,23,193,2,249,22, -82,248,22,146,16,249,22,144,16,23,198,1,247,22,160,16,27,248,22,174,20, -23,199,1,28,248,22,90,23,194,2,9,27,248,80,144,45,56,42,248,22,83, -23,196,2,28,23,193,2,249,22,82,248,22,146,16,249,22,144,16,23,198,1, -247,22,160,16,248,80,144,47,8,50,42,248,22,174,20,23,198,1,86,94,23, -193,1,248,80,144,45,8,50,42,248,22,174,20,23,196,1,86,94,23,193,1, -27,248,22,174,20,23,197,1,28,248,22,90,23,194,2,9,27,248,80,144,43, -56,42,248,22,83,23,196,2,28,23,193,2,249,22,82,248,22,146,16,249,22, -144,16,23,198,1,247,22,160,16,248,80,144,45,8,50,42,248,22,174,20,23, -198,1,86,94,23,193,1,248,80,144,43,8,50,42,248,22,174,20,23,196,1, -28,248,22,90,23,195,2,9,27,27,248,22,83,23,197,2,28,248,22,143,16, +172,8,23,206,1,8,63,23,204,1,28,249,22,158,20,248,22,151,8,23,196, +2,39,86,94,23,193,1,251,22,188,11,2,37,2,69,2,70,202,192,28,248, +22,183,15,198,248,22,184,15,198,247,22,185,15,28,248,22,137,4,193,253,2, +170,2,199,200,201,248,22,151,8,200,2,51,248,22,151,8,200,27,248,22,186, +3,194,28,249,22,173,9,8,46,249,22,152,8,198,196,253,2,170,2,200,201, +202,198,2,51,248,22,185,3,199,251,2,169,2,198,199,200,196,90,144,41,11, +89,146,41,39,11,86,95,28,28,248,22,183,15,23,196,2,10,28,248,22,182, +15,23,196,2,10,28,248,22,157,7,23,196,2,28,248,22,141,16,23,196,2, +10,248,22,142,16,23,196,2,11,12,252,22,186,11,2,37,2,42,39,23,200, +2,23,201,2,28,28,248,22,157,7,23,197,2,10,248,22,146,8,23,197,2, +12,252,22,186,11,2,37,2,72,40,23,200,2,23,201,2,90,144,42,11,89, +146,42,39,11,248,22,139,16,23,199,2,86,94,23,195,1,86,94,28,192,12, +250,22,189,11,2,37,2,73,23,201,2,249,22,7,194,195,27,248,22,188,15, +23,196,1,27,251,2,169,2,23,198,2,23,201,1,23,202,1,248,22,151,8, +23,199,1,28,248,22,183,15,195,249,22,136,16,196,194,192,2,51,252,80,144, +44,8,35,42,2,37,2,51,32,0,88,148,8,36,41,46,11,9,222,33,174, +2,198,199,32,176,2,88,148,8,36,43,60,11,2,50,222,33,179,2,32,177, +2,88,148,8,36,45,60,11,2,74,222,33,178,2,249,22,128,16,27,251,22, +158,8,250,22,157,8,23,203,2,39,23,206,1,23,204,1,249,22,157,8,23, +202,1,23,207,1,28,248,22,157,7,23,203,2,249,22,172,8,23,204,1,8, +63,23,202,1,28,249,22,158,20,248,22,151,8,23,196,2,39,86,94,23,193, +1,251,22,188,11,2,37,2,69,2,70,200,192,28,248,22,183,15,196,248,22, +184,15,196,247,22,185,15,28,248,22,137,4,23,197,2,86,94,23,196,1,19, +248,22,151,8,23,195,2,19,248,22,151,8,23,196,2,249,22,128,16,27,251, +22,158,8,250,22,157,8,23,205,2,39,23,204,4,2,51,249,22,157,8,23, +204,1,23,202,4,28,248,22,157,7,23,205,2,249,22,172,8,23,206,1,8, +63,23,204,1,28,249,22,158,20,248,22,151,8,23,196,2,39,86,94,23,193, +1,251,22,188,11,2,37,2,69,2,70,202,192,28,248,22,183,15,198,248,22, +184,15,198,247,22,185,15,2,2,27,248,22,186,3,23,198,1,28,249,22,173, +9,8,46,249,22,152,8,23,198,2,23,197,2,27,248,22,185,3,23,195,2, +249,22,128,16,27,251,22,158,8,250,22,157,8,23,205,2,39,23,204,1,2, +71,249,22,157,8,23,204,1,23,202,1,28,248,22,157,7,23,205,2,249,22, +172,8,23,206,1,8,63,23,204,1,28,249,22,158,20,248,22,151,8,23,196, +2,39,86,94,23,193,1,251,22,188,11,2,37,2,69,2,70,202,192,28,248, +22,183,15,198,248,22,184,15,198,247,22,185,15,28,248,22,137,4,193,253,2, +177,2,199,200,201,248,22,151,8,200,2,51,248,22,151,8,200,27,248,22,186, +3,194,28,249,22,173,9,8,46,249,22,152,8,198,196,253,2,177,2,200,201, +202,198,2,71,248,22,185,3,199,251,2,176,2,198,199,200,196,90,144,41,11, +89,146,41,39,11,86,95,28,28,248,22,183,15,23,196,2,10,28,248,22,182, +15,23,196,2,10,28,248,22,157,7,23,196,2,28,248,22,141,16,23,196,2, +10,248,22,142,16,23,196,2,11,12,252,22,186,11,2,37,2,42,39,23,200, +2,23,201,2,28,28,248,22,157,7,23,197,2,10,248,22,146,8,23,197,2, +12,252,22,186,11,2,37,2,72,40,23,200,2,23,201,2,90,144,42,11,89, +146,42,39,11,248,22,139,16,23,199,2,86,94,23,195,1,86,94,28,192,12, +250,22,189,11,2,37,2,73,23,201,2,249,22,7,194,195,27,248,22,188,15, +23,196,1,27,251,2,176,2,23,198,2,23,201,1,23,202,1,248,22,151,8, +23,199,1,28,248,22,183,15,195,249,22,136,16,196,194,192,252,80,144,44,8, +35,42,2,37,2,71,22,157,8,198,199,249,247,22,180,5,23,195,1,11,249, +247,22,180,5,194,11,28,248,22,90,23,195,2,9,27,27,248,22,83,23,197, +2,28,248,22,143,16,23,194,2,248,22,146,16,23,194,1,28,248,22,142,16, +23,194,2,90,144,42,11,89,146,42,39,11,248,22,139,16,249,22,144,16,250, +80,144,50,43,42,248,22,159,16,2,56,11,11,248,22,159,16,2,57,86,95, +23,195,1,23,194,1,248,22,146,16,249,22,144,16,23,199,1,23,196,1,27, +250,80,144,45,43,42,248,22,159,16,2,56,23,197,1,10,28,23,193,2,248, +22,146,16,23,194,1,11,28,23,193,2,249,22,82,248,22,146,16,249,22,144, +16,23,198,1,247,22,160,16,27,248,22,174,20,23,199,1,28,248,22,90,23, +194,2,9,27,248,80,144,45,56,42,248,22,83,23,196,2,28,23,193,2,249, +22,82,248,22,146,16,249,22,144,16,23,198,1,247,22,160,16,248,80,144,47, +8,50,42,248,22,174,20,23,198,1,86,94,23,193,1,248,80,144,45,8,50, +42,248,22,174,20,23,196,1,86,94,23,193,1,27,248,22,174,20,23,197,1, +28,248,22,90,23,194,2,9,27,248,80,144,43,56,42,248,22,83,23,196,2, +28,23,193,2,249,22,82,248,22,146,16,249,22,144,16,23,198,1,247,22,160, +16,248,80,144,45,8,50,42,248,22,174,20,23,198,1,86,94,23,193,1,248, +80,144,43,8,50,42,248,22,174,20,23,196,1,28,248,22,90,23,195,2,9, +27,27,248,22,83,23,197,2,28,248,22,143,16,23,194,2,248,22,146,16,23, +194,1,28,248,22,142,16,23,194,2,90,144,42,11,89,146,42,39,11,248,22, +139,16,249,22,144,16,250,80,144,50,43,42,248,22,159,16,2,56,11,11,248, +22,159,16,2,57,86,95,23,195,1,23,194,1,248,22,146,16,249,22,144,16, +23,199,1,23,196,1,27,250,80,144,45,43,42,248,22,159,16,2,56,23,197, +1,10,28,23,193,2,248,22,146,16,23,194,1,11,28,23,193,2,249,22,82, +248,22,146,16,249,22,144,16,23,198,1,247,22,160,16,27,248,22,174,20,23, +199,1,28,248,22,90,23,194,2,9,27,248,80,144,45,56,42,248,22,83,23, +196,2,28,23,193,2,249,22,82,248,22,146,16,249,22,144,16,23,198,1,247, +22,160,16,248,80,144,47,8,51,42,248,22,174,20,23,198,1,86,94,23,193, +1,248,80,144,45,8,51,42,248,22,174,20,23,196,1,86,94,23,193,1,27, +248,22,174,20,23,197,1,28,248,22,90,23,194,2,9,27,248,80,144,43,56, +42,248,22,83,23,196,2,28,23,193,2,249,22,82,248,22,146,16,249,22,144, +16,23,198,1,247,22,160,16,248,80,144,45,8,51,42,248,22,174,20,23,198, +1,86,94,23,193,1,248,80,144,43,8,51,42,248,22,174,20,23,196,1,27, +248,22,159,16,2,58,28,248,22,143,16,23,194,2,248,22,146,16,23,194,1, +28,248,22,142,16,23,194,2,90,144,42,11,89,146,42,39,11,248,22,139,16, +249,22,144,16,250,80,144,49,43,42,248,22,159,16,2,56,11,11,248,22,159, +16,2,57,86,95,23,195,1,23,194,1,248,22,146,16,249,22,144,16,23,199, +1,23,196,1,27,250,80,144,44,43,42,248,22,159,16,2,56,23,197,1,10, +28,23,193,2,248,22,146,16,23,194,1,11,28,248,22,90,23,195,2,9,27, +27,248,22,83,23,197,2,28,248,22,143,16,23,194,2,248,22,146,16,23,194, +1,28,248,22,142,16,23,194,2,90,144,42,11,89,146,42,39,11,248,22,139, +16,249,22,144,16,250,80,144,50,43,42,248,22,159,16,2,56,11,11,248,22, +159,16,2,57,86,95,23,195,1,23,194,1,248,22,146,16,249,22,144,16,23, +199,1,23,196,1,27,250,80,144,45,43,42,248,22,159,16,2,56,23,197,1, +10,28,23,193,2,248,22,146,16,23,194,1,11,28,23,193,2,249,22,82,248, +22,146,16,249,22,144,16,23,198,1,247,22,160,16,27,248,22,174,20,23,199, +1,28,248,22,90,23,194,2,9,27,27,248,22,83,23,196,2,28,248,22,143, +16,23,194,2,248,22,146,16,23,194,1,28,248,22,142,16,23,194,2,90,144, +42,11,89,146,42,39,11,248,22,139,16,249,22,144,16,250,80,144,54,43,42, +248,22,159,16,2,56,11,11,248,22,159,16,2,57,86,95,23,195,1,23,194, +1,248,22,146,16,249,22,144,16,23,199,1,23,196,1,27,250,80,144,49,43, +42,248,22,159,16,2,56,23,197,1,10,28,23,193,2,248,22,146,16,23,194, +1,11,28,23,193,2,249,22,82,248,22,146,16,249,22,144,16,23,198,1,247, +22,160,16,27,248,22,174,20,23,198,1,28,248,22,90,23,194,2,9,27,248, +80,144,49,56,42,248,22,83,23,196,2,28,23,193,2,249,22,82,248,22,146, +16,249,22,144,16,23,198,1,247,22,160,16,248,80,144,51,8,53,42,248,22, +174,20,23,198,1,86,94,23,193,1,248,80,144,49,8,53,42,248,22,174,20, +23,196,1,86,94,23,193,1,27,248,22,174,20,23,196,1,28,248,22,90,23, +194,2,9,27,248,80,144,47,56,42,248,22,83,23,196,2,28,23,193,2,249, +22,82,248,22,146,16,249,22,144,16,23,198,1,247,22,160,16,248,80,144,49, +8,53,42,248,22,174,20,23,198,1,86,94,23,193,1,248,80,144,47,8,53, +42,248,22,174,20,23,196,1,86,94,23,193,1,27,248,22,174,20,23,197,1, +28,248,22,90,23,194,2,9,27,27,248,22,83,23,196,2,28,248,22,143,16, 23,194,2,248,22,146,16,23,194,1,28,248,22,142,16,23,194,2,90,144,42, -11,89,146,42,39,11,248,22,139,16,249,22,144,16,250,80,144,50,43,42,248, +11,89,146,42,39,11,248,22,139,16,249,22,144,16,250,80,144,52,43,42,248, 22,159,16,2,56,11,11,248,22,159,16,2,57,86,95,23,195,1,23,194,1, -248,22,146,16,249,22,144,16,23,199,1,23,196,1,27,250,80,144,45,43,42, +248,22,146,16,249,22,144,16,23,199,1,23,196,1,27,250,80,144,47,43,42, 248,22,159,16,2,56,23,197,1,10,28,23,193,2,248,22,146,16,23,194,1, 11,28,23,193,2,249,22,82,248,22,146,16,249,22,144,16,23,198,1,247,22, -160,16,27,248,22,174,20,23,199,1,28,248,22,90,23,194,2,9,27,248,80, -144,45,56,42,248,22,83,23,196,2,28,23,193,2,249,22,82,248,22,146,16, -249,22,144,16,23,198,1,247,22,160,16,248,80,144,47,8,51,42,248,22,174, -20,23,198,1,86,94,23,193,1,248,80,144,45,8,51,42,248,22,174,20,23, -196,1,86,94,23,193,1,27,248,22,174,20,23,197,1,28,248,22,90,23,194, -2,9,27,248,80,144,43,56,42,248,22,83,23,196,2,28,23,193,2,249,22, -82,248,22,146,16,249,22,144,16,23,198,1,247,22,160,16,248,80,144,45,8, -51,42,248,22,174,20,23,198,1,86,94,23,193,1,248,80,144,43,8,51,42, -248,22,174,20,23,196,1,27,248,22,159,16,2,58,28,248,22,143,16,23,194, -2,248,22,146,16,23,194,1,28,248,22,142,16,23,194,2,90,144,42,11,89, -146,42,39,11,248,22,139,16,249,22,144,16,250,80,144,49,43,42,248,22,159, -16,2,56,11,11,248,22,159,16,2,57,86,95,23,195,1,23,194,1,248,22, -146,16,249,22,144,16,23,199,1,23,196,1,27,250,80,144,44,43,42,248,22, -159,16,2,56,23,197,1,10,28,23,193,2,248,22,146,16,23,194,1,11,28, -248,22,90,23,195,2,9,27,27,248,22,83,23,197,2,28,248,22,143,16,23, -194,2,248,22,146,16,23,194,1,28,248,22,142,16,23,194,2,90,144,42,11, -89,146,42,39,11,248,22,139,16,249,22,144,16,250,80,144,50,43,42,248,22, -159,16,2,56,11,11,248,22,159,16,2,57,86,95,23,195,1,23,194,1,248, -22,146,16,249,22,144,16,23,199,1,23,196,1,27,250,80,144,45,43,42,248, -22,159,16,2,56,23,197,1,10,28,23,193,2,248,22,146,16,23,194,1,11, -28,23,193,2,249,22,82,248,22,146,16,249,22,144,16,23,198,1,247,22,160, -16,27,248,22,174,20,23,199,1,28,248,22,90,23,194,2,9,27,27,248,22, -83,23,196,2,28,248,22,143,16,23,194,2,248,22,146,16,23,194,1,28,248, -22,142,16,23,194,2,90,144,42,11,89,146,42,39,11,248,22,139,16,249,22, -144,16,250,80,144,54,43,42,248,22,159,16,2,56,11,11,248,22,159,16,2, -57,86,95,23,195,1,23,194,1,248,22,146,16,249,22,144,16,23,199,1,23, -196,1,27,250,80,144,49,43,42,248,22,159,16,2,56,23,197,1,10,28,23, -193,2,248,22,146,16,23,194,1,11,28,23,193,2,249,22,82,248,22,146,16, -249,22,144,16,23,198,1,247,22,160,16,27,248,22,174,20,23,198,1,28,248, -22,90,23,194,2,9,27,248,80,144,49,56,42,248,22,83,23,196,2,28,23, -193,2,249,22,82,248,22,146,16,249,22,144,16,23,198,1,247,22,160,16,248, -80,144,51,8,53,42,248,22,174,20,23,198,1,86,94,23,193,1,248,80,144, -49,8,53,42,248,22,174,20,23,196,1,86,94,23,193,1,27,248,22,174,20, -23,196,1,28,248,22,90,23,194,2,9,27,248,80,144,47,56,42,248,22,83, -23,196,2,28,23,193,2,249,22,82,248,22,146,16,249,22,144,16,23,198,1, -247,22,160,16,248,80,144,49,8,53,42,248,22,174,20,23,198,1,86,94,23, -193,1,248,80,144,47,8,53,42,248,22,174,20,23,196,1,86,94,23,193,1, -27,248,22,174,20,23,197,1,28,248,22,90,23,194,2,9,27,27,248,22,83, -23,196,2,28,248,22,143,16,23,194,2,248,22,146,16,23,194,1,28,248,22, -142,16,23,194,2,90,144,42,11,89,146,42,39,11,248,22,139,16,249,22,144, -16,250,80,144,52,43,42,248,22,159,16,2,56,11,11,248,22,159,16,2,57, -86,95,23,195,1,23,194,1,248,22,146,16,249,22,144,16,23,199,1,23,196, -1,27,250,80,144,47,43,42,248,22,159,16,2,56,23,197,1,10,28,23,193, -2,248,22,146,16,23,194,1,11,28,23,193,2,249,22,82,248,22,146,16,249, -22,144,16,23,198,1,247,22,160,16,27,248,22,174,20,23,198,1,28,248,22, -90,23,194,2,9,27,248,80,144,47,56,42,248,22,83,23,196,2,28,23,193, -2,249,22,82,248,22,146,16,249,22,144,16,23,198,1,247,22,160,16,248,80, -144,49,8,53,42,248,22,174,20,23,198,1,86,94,23,193,1,248,80,144,47, -8,53,42,248,22,174,20,23,196,1,86,94,23,193,1,27,248,22,174,20,23, -196,1,28,248,22,90,23,194,2,9,27,248,80,144,45,56,42,248,22,83,23, -196,2,28,23,193,2,249,22,82,248,22,146,16,249,22,144,16,23,198,1,247, -22,160,16,248,80,144,47,8,53,42,248,22,174,20,23,198,1,86,94,23,193, -1,248,80,144,45,8,53,42,248,22,174,20,23,196,1,27,247,22,167,16,27, -248,80,144,42,58,42,247,80,144,42,57,42,249,80,144,43,44,41,28,23,196, -2,27,249,22,179,8,247,22,178,8,2,75,28,192,249,22,169,8,194,7,63, -2,66,2,66,250,80,144,46,8,23,42,23,198,2,2,76,27,28,23,200,1, -250,22,136,16,248,22,159,16,2,61,250,22,160,2,23,205,1,2,59,247,22, -175,8,2,77,86,94,23,199,1,11,27,248,80,144,49,8,50,42,250,22,96, -9,248,22,92,248,22,159,16,2,55,9,28,193,249,22,82,195,194,192,27,247, -22,167,16,27,248,80,144,42,58,42,247,80,144,42,57,42,249,80,144,43,44, -41,28,23,196,2,27,249,22,179,8,247,22,178,8,2,75,28,192,249,22,169, -8,194,7,63,2,66,2,66,250,80,144,46,8,23,42,23,198,2,2,76,27, -28,23,200,1,250,22,136,16,248,22,159,16,2,61,250,22,160,2,23,205,1, -2,59,247,22,175,8,2,77,86,94,23,199,1,11,27,248,80,144,49,8,51, -42,250,22,96,23,207,1,248,22,92,248,22,159,16,2,55,9,28,193,249,22, -82,195,194,192,27,247,22,167,16,27,248,80,144,42,58,42,249,80,144,44,55, -40,40,80,144,44,8,52,42,249,80,144,43,44,41,28,23,196,2,27,249,22, +160,16,27,248,22,174,20,23,198,1,28,248,22,90,23,194,2,9,27,248,80, +144,47,56,42,248,22,83,23,196,2,28,23,193,2,249,22,82,248,22,146,16, +249,22,144,16,23,198,1,247,22,160,16,248,80,144,49,8,53,42,248,22,174, +20,23,198,1,86,94,23,193,1,248,80,144,47,8,53,42,248,22,174,20,23, +196,1,86,94,23,193,1,27,248,22,174,20,23,196,1,28,248,22,90,23,194, +2,9,27,248,80,144,45,56,42,248,22,83,23,196,2,28,23,193,2,249,22, +82,248,22,146,16,249,22,144,16,23,198,1,247,22,160,16,248,80,144,47,8, +53,42,248,22,174,20,23,198,1,86,94,23,193,1,248,80,144,45,8,53,42, +248,22,174,20,23,196,1,27,247,22,167,16,27,248,80,144,42,58,42,247,80, +144,42,57,42,249,80,144,43,44,41,28,23,196,2,27,249,22,179,8,247,22, +178,8,2,75,28,192,249,22,169,8,194,7,63,2,66,2,66,250,80,144,46, +8,23,42,23,198,2,2,76,27,28,23,200,1,250,22,136,16,248,22,159,16, +2,61,250,22,160,2,23,205,1,2,59,247,22,175,8,2,77,86,94,23,199, +1,11,27,248,80,144,49,8,50,42,250,22,96,9,248,22,92,248,22,159,16, +2,55,9,28,193,249,22,82,195,194,192,27,247,22,167,16,27,248,80,144,42, +58,42,247,80,144,42,57,42,249,80,144,43,44,41,28,23,196,2,27,249,22, 179,8,247,22,178,8,2,75,28,192,249,22,169,8,194,7,63,2,66,2,66, 250,80,144,46,8,23,42,23,198,2,2,76,27,28,23,200,1,250,22,136,16, 248,22,159,16,2,61,250,22,160,2,23,205,1,2,59,247,22,175,8,2,77, -86,94,23,199,1,11,27,27,250,22,96,23,207,1,248,22,92,248,22,159,16, -2,55,23,208,1,28,248,22,90,23,194,2,9,27,27,248,22,83,23,196,2, -28,248,22,143,16,23,194,2,248,22,146,16,23,194,1,28,248,22,142,16,23, -194,2,90,144,42,11,89,146,42,39,11,248,22,139,16,249,22,144,16,250,80, -144,60,43,42,248,22,159,16,2,56,11,11,248,22,159,16,2,57,86,95,23, -195,1,23,194,1,248,22,146,16,249,22,144,16,23,199,1,23,196,1,27,250, -80,144,55,43,42,248,22,159,16,2,56,23,197,1,10,28,23,193,2,248,22, -146,16,23,194,1,11,28,23,193,2,249,22,82,248,22,146,16,249,22,144,16, -23,198,1,247,22,160,16,27,248,22,174,20,23,198,1,28,248,22,90,23,194, -2,9,27,248,80,144,55,56,42,248,22,83,23,196,2,28,23,193,2,249,22, -82,248,22,146,16,249,22,144,16,23,198,1,247,22,160,16,248,80,144,57,8, -53,42,248,22,174,20,23,198,1,86,94,23,193,1,248,80,144,55,8,53,42, -248,22,174,20,23,196,1,86,94,23,193,1,27,248,22,174,20,23,196,1,28, -248,22,90,23,194,2,9,27,248,80,144,53,56,42,248,22,83,23,196,2,28, -23,193,2,249,22,82,248,22,146,16,249,22,144,16,23,198,1,247,22,160,16, -248,80,144,55,8,53,42,248,22,174,20,23,198,1,86,94,23,193,1,248,80, -144,53,8,53,42,248,22,174,20,23,196,1,28,193,249,22,82,195,194,192,27, -20,13,144,80,144,40,46,40,26,9,80,144,49,47,40,249,22,31,11,80,144, -51,46,40,22,156,15,10,22,163,15,10,22,164,15,10,22,165,15,10,248,22, -152,6,23,196,2,28,248,22,152,7,23,194,2,12,86,94,248,22,181,9,23, -194,1,27,20,13,144,80,144,41,46,40,26,9,80,144,50,47,40,249,22,31, -11,80,144,52,46,40,22,156,15,10,22,163,15,10,22,164,15,10,22,165,15, -10,248,22,152,6,23,197,2,28,248,22,152,7,23,194,2,12,86,94,248,22, -181,9,23,194,1,27,20,13,144,80,144,42,46,40,26,9,80,144,51,47,40, -249,22,31,11,80,144,53,46,40,22,156,15,10,22,163,15,10,22,164,15,10, -22,165,15,10,248,22,152,6,23,198,2,28,248,22,152,7,23,194,2,12,86, -94,248,22,181,9,23,194,1,248,80,144,43,8,54,42,197,86,94,249,22,143, -7,247,22,176,5,23,196,2,248,22,167,6,249,22,140,4,39,249,22,188,3, -28,23,198,2,23,198,1,86,94,23,198,1,39,23,199,1,27,248,22,129,6, -28,23,198,2,86,95,23,197,1,23,196,1,23,198,1,86,94,23,198,1,27, -250,80,144,45,43,42,248,22,159,16,2,56,11,11,27,248,22,143,4,23,199, -1,27,28,23,194,2,23,194,1,86,94,23,194,1,39,27,248,22,143,4,23, -202,1,249,22,144,6,23,198,1,20,20,95,88,148,8,36,39,51,11,9,224, -3,2,33,190,2,23,195,1,23,196,1,248,80,144,41,8,54,42,193,145,39, -9,20,121,145,2,1,39,16,1,11,16,0,20,27,15,56,9,2,2,2,2, -29,11,11,11,11,11,11,11,9,9,11,11,11,10,46,80,143,39,39,20,121, -145,2,1,54,16,40,2,3,2,4,2,5,2,6,2,7,2,8,2,9,30, -2,11,1,20,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,45, -107,101,121,11,6,30,2,11,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,11,4,2,12,2,13,2,14,2, -15,2,16,2,17,2,18,30,2,11,1,19,99,97,99,104,101,45,99,111,110, -102,105,103,117,114,97,116,105,111,110,11,1,2,19,2,20,2,21,2,22,2, -23,2,24,2,25,2,26,2,27,2,28,2,29,30,2,11,1,21,101,120,99, -101,112,116,105,111,110,45,104,97,110,100,108,101,114,45,107,101,121,11,3,2, -30,2,31,2,32,2,33,2,34,2,35,2,36,2,37,2,38,2,39,2,40, -16,0,40,42,39,16,0,39,16,19,2,13,2,14,2,12,2,25,2,4,2, -35,2,23,2,24,2,19,2,29,2,33,2,21,2,22,2,31,2,27,2,30, -2,32,2,36,2,28,58,11,11,11,16,17,2,9,2,17,2,15,2,40,2, -16,2,7,2,26,2,39,2,18,2,20,2,38,2,5,2,34,2,8,2,37, -2,3,2,6,16,17,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, +86,94,23,199,1,11,27,248,80,144,49,8,51,42,250,22,96,23,207,1,248, +22,92,248,22,159,16,2,55,9,28,193,249,22,82,195,194,192,27,247,22,167, +16,27,248,80,144,42,58,42,249,80,144,44,55,40,40,80,144,44,8,52,42, +249,80,144,43,44,41,28,23,196,2,27,249,22,179,8,247,22,178,8,2,75, +28,192,249,22,169,8,194,7,63,2,66,2,66,250,80,144,46,8,23,42,23, +198,2,2,76,27,28,23,200,1,250,22,136,16,248,22,159,16,2,61,250,22, +160,2,23,205,1,2,59,247,22,175,8,2,77,86,94,23,199,1,11,27,27, +250,22,96,23,207,1,248,22,92,248,22,159,16,2,55,23,208,1,28,248,22, +90,23,194,2,9,27,27,248,22,83,23,196,2,28,248,22,143,16,23,194,2, +248,22,146,16,23,194,1,28,248,22,142,16,23,194,2,90,144,42,11,89,146, +42,39,11,248,22,139,16,249,22,144,16,250,80,144,60,43,42,248,22,159,16, +2,56,11,11,248,22,159,16,2,57,86,95,23,195,1,23,194,1,248,22,146, +16,249,22,144,16,23,199,1,23,196,1,27,250,80,144,55,43,42,248,22,159, +16,2,56,23,197,1,10,28,23,193,2,248,22,146,16,23,194,1,11,28,23, +193,2,249,22,82,248,22,146,16,249,22,144,16,23,198,1,247,22,160,16,27, +248,22,174,20,23,198,1,28,248,22,90,23,194,2,9,27,248,80,144,55,56, +42,248,22,83,23,196,2,28,23,193,2,249,22,82,248,22,146,16,249,22,144, +16,23,198,1,247,22,160,16,248,80,144,57,8,53,42,248,22,174,20,23,198, +1,86,94,23,193,1,248,80,144,55,8,53,42,248,22,174,20,23,196,1,86, +94,23,193,1,27,248,22,174,20,23,196,1,28,248,22,90,23,194,2,9,27, +248,80,144,53,56,42,248,22,83,23,196,2,28,23,193,2,249,22,82,248,22, +146,16,249,22,144,16,23,198,1,247,22,160,16,248,80,144,55,8,53,42,248, +22,174,20,23,198,1,86,94,23,193,1,248,80,144,53,8,53,42,248,22,174, +20,23,196,1,28,193,249,22,82,195,194,192,27,20,13,144,80,144,40,46,40, +26,9,80,144,49,47,40,249,22,31,11,80,144,51,46,40,22,156,15,10,22, +163,15,10,22,164,15,10,22,165,15,10,248,22,152,6,23,196,2,28,248,22, +152,7,23,194,2,12,86,94,248,22,181,9,23,194,1,27,20,13,144,80,144, +41,46,40,26,9,80,144,50,47,40,249,22,31,11,80,144,52,46,40,22,156, +15,10,22,163,15,10,22,164,15,10,22,165,15,10,248,22,152,6,23,197,2, +28,248,22,152,7,23,194,2,12,86,94,248,22,181,9,23,194,1,27,20,13, +144,80,144,42,46,40,26,9,80,144,51,47,40,249,22,31,11,80,144,53,46, +40,22,156,15,10,22,163,15,10,22,164,15,10,22,165,15,10,248,22,152,6, +23,198,2,28,248,22,152,7,23,194,2,12,86,94,248,22,181,9,23,194,1, +248,80,144,43,8,54,42,197,86,94,249,22,143,7,247,22,176,5,23,196,2, +248,22,167,6,249,22,140,4,39,249,22,188,3,28,23,198,2,23,198,1,86, +94,23,198,1,39,23,199,1,27,248,22,129,6,28,23,198,2,86,95,23,197, +1,23,196,1,23,198,1,86,94,23,198,1,27,250,80,144,45,43,42,248,22, +159,16,2,56,11,11,27,248,22,143,4,23,199,1,27,28,23,194,2,23,194, +1,86,94,23,194,1,39,27,248,22,143,4,23,202,1,249,22,144,6,23,198, +1,20,20,95,88,148,8,36,39,51,11,9,224,3,2,33,128,3,23,195,1, +23,196,1,248,80,144,41,8,54,42,193,145,39,9,20,121,145,2,1,39,16, +1,11,16,0,20,27,15,56,9,2,2,2,2,29,11,11,11,11,11,11,11, +9,9,11,11,11,10,46,80,143,39,39,20,121,145,2,1,54,16,40,2,3, +2,4,2,5,2,6,2,7,2,8,2,9,30,2,11,1,20,112,97,114,97, +109,101,116,101,114,105,122,97,116,105,111,110,45,107,101,121,11,6,30,2,11, +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,11,4,2,12,2,13,2,14,2,15,2,16,2,17,2,18,30, +2,11,1,19,99,97,99,104,101,45,99,111,110,102,105,103,117,114,97,116,105, +111,110,11,1,2,19,2,20,2,21,2,22,2,23,2,24,2,25,2,26,2, +27,2,28,2,29,30,2,11,1,21,101,120,99,101,112,116,105,111,110,45,104, +97,110,100,108,101,114,45,107,101,121,11,3,2,30,2,31,2,32,2,33,2, +34,2,35,2,36,2,37,2,38,2,39,2,40,16,0,40,42,39,16,0,39, +16,19,2,13,2,14,2,12,2,25,2,4,2,35,2,23,2,24,2,19,2, +29,2,33,2,21,2,22,2,31,2,27,2,30,2,32,2,36,2,28,58,11, 11,11,16,17,2,9,2,17,2,15,2,40,2,16,2,7,2,26,2,39,2, -18,2,20,2,38,2,5,2,34,2,8,2,37,2,3,2,6,56,56,40,12, -11,11,16,0,16,0,16,0,39,39,11,12,11,11,16,0,16,0,16,0,39, -39,16,51,20,15,16,2,32,0,88,148,8,36,40,48,11,2,3,222,33,78, -80,144,39,39,40,20,15,16,2,249,22,159,7,7,92,7,92,80,144,39,40, -40,20,15,16,2,88,148,8,36,40,57,41,2,5,223,0,33,83,80,144,39, -41,40,20,15,16,2,88,148,8,36,41,61,41,2,6,223,0,33,85,80,144, -39,42,40,20,15,16,2,20,26,96,2,7,88,148,8,36,42,8,24,8,32, -9,223,0,33,92,88,148,8,36,41,50,55,9,223,0,33,93,88,148,8,36, -40,49,55,9,223,0,33,94,80,144,39,43,40,20,15,16,2,27,248,22,171, -16,248,22,171,8,27,28,249,22,173,9,247,22,184,8,2,43,6,1,1,59, -6,1,1,58,250,22,141,8,6,14,14,40,91,94,126,97,93,42,41,126,97, -40,46,42,41,23,196,2,23,196,1,88,148,8,36,41,51,11,2,8,223,0, -33,98,80,144,39,44,40,20,15,16,2,88,148,39,40,8,44,8,128,6,2, -9,223,0,33,99,80,144,39,45,40,20,15,16,2,32,0,88,148,8,36,41, -50,11,2,12,222,33,100,80,144,39,48,40,20,15,16,2,32,0,88,148,8, -36,42,51,11,2,13,222,33,102,80,144,39,49,40,20,15,16,2,32,0,88, -148,8,36,41,49,11,2,14,222,33,103,80,144,39,50,40,20,15,16,2,88, -148,39,42,53,8,128,128,2,15,223,0,33,105,80,144,39,51,40,20,15,16, -2,88,148,39,44,55,8,128,128,2,17,223,0,33,107,80,144,39,53,40,20, -15,16,2,88,148,39,39,56,55,9,223,0,33,108,80,144,39,8,40,42,20, -15,16,2,88,148,39,39,47,16,4,39,40,8,128,4,39,2,18,223,0,33, -109,80,144,39,54,40,20,15,16,2,88,148,39,39,56,55,9,223,0,33,110, -80,144,39,8,41,42,20,15,16,2,88,148,39,39,47,16,4,39,40,8,128, -8,39,2,20,223,0,33,111,80,144,39,57,40,20,15,16,2,88,148,8,36, -39,8,44,8,128,6,9,223,0,33,112,80,144,39,8,42,42,20,15,16,2, -88,148,8,36,40,50,16,4,39,39,8,128,16,39,2,21,223,0,33,113,80, -144,39,58,40,20,15,16,2,20,28,143,32,0,88,148,39,40,48,11,2,22, -222,33,114,32,0,88,148,39,40,48,11,2,22,222,33,115,80,144,39,59,40, -20,15,16,2,88,148,8,36,40,50,8,240,0,128,0,0,2,23,223,0,33, -116,80,144,39,60,40,20,15,16,2,88,148,39,39,56,55,9,223,0,33,117, -80,144,39,8,43,42,20,15,16,2,88,148,8,36,40,51,16,4,39,40,8, -128,32,39,2,24,223,0,33,118,80,144,39,61,40,20,15,16,2,88,148,39, -40,56,55,2,19,223,0,33,119,80,144,39,56,40,20,15,16,2,88,148,8, -36,41,58,16,4,8,240,0,128,0,0,8,32,8,128,64,39,2,50,223,0, -33,120,80,144,39,8,44,42,20,15,16,2,88,148,8,36,42,52,16,4,39, -39,8,128,64,39,2,25,223,0,33,121,80,144,39,8,23,40,20,15,16,2, -88,148,39,39,56,55,9,223,0,33,122,80,144,39,8,45,42,20,15,16,2, -88,148,8,36,39,57,16,4,8,240,0,128,0,0,8,137,2,8,128,128,39, -2,26,223,0,33,123,80,144,39,8,24,40,20,15,16,2,247,22,142,2,80, -144,39,8,25,40,20,15,16,2,248,22,16,67,115,116,97,109,112,80,144,39, -8,26,40,20,15,16,2,88,148,39,40,49,8,240,0,0,0,4,9,223,0, -33,125,80,144,39,8,46,42,20,15,16,2,88,148,39,41,51,16,4,39,8, -128,80,8,240,0,64,0,0,39,2,29,223,0,33,133,2,80,144,39,8,27, -40,20,15,16,2,32,0,88,148,8,36,40,48,11,2,30,222,33,134,2,80, -144,39,8,29,40,20,15,16,2,88,148,8,36,42,48,8,240,0,0,0,2, -74,109,97,107,101,45,104,97,110,100,108,101,114,223,0,33,136,2,80,144,39, -8,47,42,20,15,16,2,88,148,39,40,47,16,4,8,128,6,8,128,104,8, -240,0,128,0,0,39,2,31,223,0,33,146,2,80,144,39,8,30,40,20,15, -16,2,88,148,39,41,59,16,2,39,8,240,0,128,0,0,2,32,223,0,33, -148,2,80,144,39,8,31,40,20,15,16,2,88,148,8,36,41,61,16,4,39, -8,240,0,64,0,0,39,40,2,50,223,0,33,149,2,80,144,39,8,48,42, -20,15,16,2,88,148,39,47,8,33,16,4,39,39,40,41,67,99,108,111,111, -112,223,0,33,156,2,80,144,39,8,49,42,20,15,16,2,88,148,39,44,8, -25,16,4,39,8,240,0,192,0,0,39,42,2,16,223,0,33,157,2,80,144, -39,52,40,20,15,16,2,88,148,39,42,58,16,4,47,39,43,39,2,33,223, -0,33,162,2,80,144,39,8,32,40,20,15,16,2,32,0,88,148,39,42,53, -11,2,35,222,33,163,2,80,144,39,8,34,40,20,15,16,2,32,0,88,148, -8,36,44,8,27,11,2,36,222,33,168,2,80,144,39,8,35,40,20,15,16, -2,20,28,143,32,0,88,148,8,36,41,55,11,2,37,222,33,171,2,88,148, -8,100,41,52,16,4,39,39,47,39,2,37,223,0,33,173,2,80,144,39,8, -36,40,20,15,16,2,20,28,143,32,0,88,148,8,36,41,55,11,2,34,222, -33,178,2,88,148,8,100,41,52,16,4,39,39,47,39,2,34,223,0,33,179, -2,80,144,39,8,33,40,20,15,16,2,20,28,143,32,0,88,148,39,40,47, -11,2,38,222,33,180,2,32,0,88,148,39,40,47,11,2,38,222,33,181,2, -80,144,39,8,37,40,20,15,16,2,88,148,8,36,40,58,16,4,55,41,39, -43,2,50,223,0,33,182,2,80,144,39,8,50,42,20,15,16,2,88,148,8, -36,40,58,16,4,55,41,39,47,2,50,223,0,33,183,2,80,144,39,8,51, -42,20,15,16,2,88,148,39,39,56,55,9,223,0,33,184,2,80,144,39,8, -52,42,20,15,16,2,88,148,8,36,40,8,23,16,4,55,41,39,8,32,2, -50,223,0,33,185,2,80,144,39,8,53,42,20,15,16,2,20,26,96,2,39, -88,148,39,39,60,16,4,8,32,8,140,2,39,43,9,223,0,33,186,2,88, -148,39,40,61,16,4,8,32,8,140,2,39,47,9,223,0,33,187,2,88,148, -39,41,8,30,16,4,8,48,8,139,2,39,8,48,9,223,0,33,188,2,80, -144,39,8,38,40,20,15,16,2,88,148,8,36,40,60,16,4,8,128,6,39, -39,8,64,2,50,223,0,33,189,2,80,144,39,8,54,42,20,15,16,2,88, -148,8,36,42,56,16,4,55,39,39,8,64,2,40,223,0,33,191,2,80,144, -39,8,39,40,95,29,94,2,10,70,35,37,107,101,114,110,101,108,11,29,94, -2,10,71,35,37,109,105,110,45,115,116,120,11,2,11,9,9,9,39,9,0}; - EVAL_ONE_SIZED_STR((char *)expr, 19823); +18,2,20,2,38,2,5,2,34,2,8,2,37,2,3,2,6,16,17,11,11, +11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,16,17,2,9,2,17, +2,15,2,40,2,16,2,7,2,26,2,39,2,18,2,20,2,38,2,5,2, +34,2,8,2,37,2,3,2,6,56,56,40,12,11,11,16,0,16,0,16,0, +39,39,11,12,11,11,16,0,16,0,16,0,39,39,16,51,20,15,16,2,32, +0,88,148,8,36,40,48,11,2,3,222,33,78,80,144,39,39,40,20,15,16, +2,249,22,159,7,7,92,7,92,80,144,39,40,40,20,15,16,2,88,148,8, +36,40,57,41,2,5,223,0,33,83,80,144,39,41,40,20,15,16,2,88,148, +8,36,41,61,41,2,6,223,0,33,85,80,144,39,42,40,20,15,16,2,20, +26,96,2,7,88,148,8,36,42,8,24,8,32,9,223,0,33,92,88,148,8, +36,41,50,55,9,223,0,33,93,88,148,8,36,40,49,55,9,223,0,33,94, +80,144,39,43,40,20,15,16,2,27,248,22,171,16,248,22,171,8,27,28,249, +22,173,9,247,22,184,8,2,43,6,1,1,59,6,1,1,58,250,22,141,8, +6,14,14,40,91,94,126,97,93,42,41,126,97,40,46,42,41,23,196,2,23, +196,1,88,148,8,36,41,51,11,2,8,223,0,33,98,80,144,39,44,40,20, +15,16,2,88,148,39,40,8,44,8,128,6,2,9,223,0,33,99,80,144,39, +45,40,20,15,16,2,32,0,88,148,8,36,41,50,11,2,12,222,33,100,80, +144,39,48,40,20,15,16,2,32,0,88,148,8,36,42,51,11,2,13,222,33, +102,80,144,39,49,40,20,15,16,2,32,0,88,148,8,36,41,49,11,2,14, +222,33,103,80,144,39,50,40,20,15,16,2,88,148,39,42,53,8,128,128,2, +15,223,0,33,105,80,144,39,51,40,20,15,16,2,88,148,39,44,55,8,128, +128,2,17,223,0,33,107,80,144,39,53,40,20,15,16,2,88,148,39,39,56, +55,9,223,0,33,108,80,144,39,8,40,42,20,15,16,2,88,148,39,39,47, +16,4,39,40,8,128,4,39,2,18,223,0,33,109,80,144,39,54,40,20,15, +16,2,88,148,39,39,56,55,9,223,0,33,110,80,144,39,8,41,42,20,15, +16,2,88,148,39,39,47,16,4,39,40,8,128,8,39,2,20,223,0,33,111, +80,144,39,57,40,20,15,16,2,88,148,8,36,39,8,44,8,128,6,9,223, +0,33,112,80,144,39,8,42,42,20,15,16,2,88,148,8,36,40,50,16,4, +39,39,8,128,16,39,2,21,223,0,33,113,80,144,39,58,40,20,15,16,2, +20,28,143,32,0,88,148,39,40,48,11,2,22,222,33,114,32,0,88,148,39, +40,48,11,2,22,222,33,115,80,144,39,59,40,20,15,16,2,88,148,8,36, +40,50,8,240,0,128,0,0,2,23,223,0,33,116,80,144,39,60,40,20,15, +16,2,88,148,39,39,56,55,9,223,0,33,117,80,144,39,8,43,42,20,15, +16,2,88,148,8,36,40,51,16,4,39,40,8,128,32,39,2,24,223,0,33, +118,80,144,39,61,40,20,15,16,2,88,148,39,40,56,55,2,19,223,0,33, +119,80,144,39,56,40,20,15,16,2,88,148,8,36,41,58,16,4,8,240,0, +128,0,0,8,32,8,128,64,39,2,50,223,0,33,120,80,144,39,8,44,42, +20,15,16,2,88,148,8,36,42,52,16,4,39,39,8,128,64,39,2,25,223, +0,33,121,80,144,39,8,23,40,20,15,16,2,88,148,39,39,56,55,9,223, +0,33,122,80,144,39,8,45,42,20,15,16,2,88,148,8,36,39,57,16,4, +8,240,0,128,0,0,8,137,2,8,128,128,39,2,26,223,0,33,123,80,144, +39,8,24,40,20,15,16,2,247,22,142,2,80,144,39,8,25,40,20,15,16, +2,248,22,16,67,115,116,97,109,112,80,144,39,8,26,40,20,15,16,2,88, +148,39,40,49,8,240,0,0,0,4,9,223,0,33,125,80,144,39,8,46,42, +20,15,16,2,88,148,39,41,51,16,4,39,8,128,80,8,240,0,64,0,0, +39,2,29,223,0,33,133,2,80,144,39,8,27,40,20,15,16,2,32,0,88, +148,8,36,40,48,11,2,30,222,33,134,2,80,144,39,8,29,40,20,15,16, +2,88,148,8,36,42,48,8,240,0,0,0,2,74,109,97,107,101,45,104,97, +110,100,108,101,114,223,0,33,136,2,80,144,39,8,47,42,20,15,16,2,88, +148,39,40,47,16,4,8,128,6,8,128,104,8,240,0,128,0,0,39,2,31, +223,0,33,146,2,80,144,39,8,30,40,20,15,16,2,88,148,39,41,59,16, +2,39,8,240,0,128,0,0,2,32,223,0,33,148,2,80,144,39,8,31,40, +20,15,16,2,88,148,8,36,41,61,16,4,39,8,240,0,64,0,0,39,40, +2,50,223,0,33,149,2,80,144,39,8,48,42,20,15,16,2,88,148,39,47, +8,33,16,4,39,39,40,41,67,99,108,111,111,112,223,0,33,156,2,80,144, +39,8,49,42,20,15,16,2,88,148,39,44,8,25,16,4,39,8,240,0,192, +0,0,39,42,2,16,223,0,33,157,2,80,144,39,52,40,20,15,16,2,88, +148,39,42,58,16,4,47,39,43,39,2,33,223,0,33,162,2,80,144,39,8, +32,40,20,15,16,2,32,0,88,148,39,42,53,11,2,35,222,33,163,2,80, +144,39,8,34,40,20,15,16,2,32,0,88,148,8,36,44,8,27,11,2,36, +222,33,168,2,80,144,39,8,35,40,20,15,16,2,20,28,143,32,0,88,148, +8,36,41,55,11,2,37,222,33,173,2,88,148,8,100,41,52,16,4,39,39, +47,39,2,37,223,0,33,175,2,80,144,39,8,36,40,20,15,16,2,20,28, +143,32,0,88,148,8,36,41,55,11,2,34,222,33,180,2,88,148,8,100,41, +52,16,4,39,39,47,39,2,34,223,0,33,181,2,80,144,39,8,33,40,20, +15,16,2,20,28,143,32,0,88,148,39,40,47,11,2,38,222,33,182,2,32, +0,88,148,39,40,47,11,2,38,222,33,183,2,80,144,39,8,37,40,20,15, +16,2,88,148,8,36,40,58,16,4,55,41,39,43,2,50,223,0,33,184,2, +80,144,39,8,50,42,20,15,16,2,88,148,8,36,40,58,16,4,55,41,39, +47,2,50,223,0,33,185,2,80,144,39,8,51,42,20,15,16,2,88,148,39, +39,56,55,9,223,0,33,186,2,80,144,39,8,52,42,20,15,16,2,88,148, +8,36,40,8,23,16,4,55,41,39,8,32,2,50,223,0,33,187,2,80,144, +39,8,53,42,20,15,16,2,20,26,96,2,39,88,148,39,39,60,16,4,8, +32,8,140,2,39,43,9,223,0,33,188,2,88,148,39,40,61,16,4,8,32, +8,140,2,39,47,9,223,0,33,189,2,88,148,39,41,8,30,16,4,8,48, +8,139,2,39,8,48,9,223,0,33,190,2,80,144,39,8,38,40,20,15,16, +2,88,148,8,36,40,60,16,4,8,128,6,39,39,8,64,2,50,223,0,33, +191,2,80,144,39,8,54,42,20,15,16,2,88,148,8,36,42,56,16,4,55, +39,39,8,64,2,40,223,0,33,129,3,80,144,39,8,39,40,95,29,94,2, +10,70,35,37,107,101,114,110,101,108,11,29,94,2,10,71,35,37,109,105,110, +45,115,116,120,11,2,11,9,9,9,39,9,0}; + EVAL_ONE_SIZED_STR((char *)expr, 19773); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,52,46,48,46,53,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,52,46,48,46,54,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,15,0,0,0,1,0,0,8,0,23,0, 48,0,65,0,83,0,105,0,128,0,149,0,171,0,180,0,189,0,196,0,205, 0,212,0,0,0,248,1,0,0,3,1,5,105,110,115,112,48,76,35,37,112, @@ -1080,7 +1078,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 576); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,52,46,48,46,53,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,52,46,48,46,54,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,100,0,0,0,1,0,0,8,0,15,0, 26,0,53,0,59,0,73,0,86,0,112,0,129,0,151,0,159,0,171,0,186, 0,202,0,220,0,241,0,253,0,13,1,36,1,60,1,72,1,103,1,108,1, @@ -1161,7 +1159,7 @@ 28,248,22,143,16,23,199,2,23,198,2,27,247,22,181,5,28,192,249,22,144, 16,23,201,2,194,23,199,2,90,144,42,11,89,146,42,39,11,248,22,139,16, 23,202,1,86,94,23,195,1,90,144,41,11,89,146,41,39,11,28,23,204,2, -27,248,22,187,15,23,198,2,19,248,22,151,8,194,28,28,249,22,136,4,23, +27,248,22,187,15,23,198,2,19,248,22,151,8,194,28,28,249,22,162,20,23, 195,4,43,249,22,154,8,2,26,249,22,157,8,197,249,22,188,3,23,199,4, 43,11,249,22,7,23,200,2,248,22,191,15,249,22,158,8,250,22,157,8,201, 39,249,22,188,3,23,203,4,43,5,3,46,115,115,249,22,7,23,200,2,11, @@ -1271,10 +1269,10 @@ 28,249,22,140,9,7,47,249,22,161,7,23,200,2,23,197,2,249,22,82,250, 22,179,7,23,201,2,39,23,198,2,248,2,56,249,22,179,7,23,201,1,248, 22,185,3,23,199,1,250,2,59,23,198,4,198,248,22,185,3,196,19,248,22, -160,7,23,195,2,28,249,22,132,4,39,23,195,4,248,22,92,194,28,249,22, +160,7,23,195,2,28,249,22,158,20,39,23,195,4,248,22,92,194,28,249,22, 140,9,7,47,249,22,161,7,23,198,2,39,249,22,82,250,22,179,7,23,199, 2,39,39,27,249,22,179,7,23,199,1,40,19,248,22,160,7,23,195,2,250, -2,57,23,196,4,23,197,1,39,2,28,249,22,132,4,40,23,195,4,248,22, +2,57,23,196,4,23,197,1,39,2,28,249,22,158,20,40,23,195,4,248,22, 92,194,28,249,22,140,9,7,47,249,22,161,7,23,198,2,40,249,22,82,250, 22,179,7,23,199,2,39,40,248,2,56,249,22,179,7,23,199,1,41,250,2, 59,23,196,4,196,41,2,28,249,22,132,4,23,197,2,23,195,4,248,22,92, @@ -1359,7 +1357,7 @@ 32,126,115,10,23,202,2,248,22,178,13,28,23,196,2,251,22,186,12,23,198, 1,247,22,27,248,22,92,23,201,1,23,199,1,86,94,23,196,1,250,22,149, 13,23,197,1,247,22,27,23,198,1,32,86,88,148,8,36,40,53,11,69,115, -115,45,62,114,107,116,222,33,87,19,248,22,160,7,194,28,249,22,136,4,23, +115,45,62,114,107,116,222,33,87,19,248,22,160,7,194,28,249,22,162,20,23, 195,4,42,28,249,22,173,9,7,46,249,22,161,7,197,249,22,188,3,23,199, 4,42,28,28,249,22,173,9,7,115,249,22,161,7,197,249,22,188,3,23,199, 4,41,249,22,173,9,7,115,249,22,161,7,197,249,22,188,3,23,199,4,40, @@ -1549,7 +1547,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 9765); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,52,46,48,46,53,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,54,46,52,46,48,46,54,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,17,0,0,0,1,0,0,8,0,18,0, 24,0,38,0,52,0,64,0,84,0,98,0,113,0,126,0,131,0,135,0,147, 0,231,0,238,0,8,1,0,0,199,1,0,0,3,1,5,105,110,115,112,48, diff --git a/racket/src/racket/src/env.c b/racket/src/racket/src/env.c index 0bfbb72a58..7400699f27 100644 --- a/racket/src/racket/src/env.c +++ b/racket/src/racket/src/env.c @@ -337,6 +337,7 @@ static void init_unsafe(Scheme_Env *env) scheme_init_unsafe_numarith(unsafe_env); scheme_init_unsafe_numcomp(unsafe_env); scheme_init_unsafe_list(unsafe_env); + scheme_init_unsafe_hash(unsafe_env); scheme_init_unsafe_vector(unsafe_env); scheme_init_unsafe_fun(unsafe_env); diff --git a/racket/src/racket/src/hash.c b/racket/src/racket/src/hash.c index 425aeec5ed..185a4c61e2 100644 --- a/racket/src/racket/src/hash.c +++ b/racket/src/racket/src/hash.c @@ -657,7 +657,24 @@ void scheme_reset_hash_table(Scheme_Hash_Table *table, int *history) table->mcount = 0; } -int scheme_hash_table_index(Scheme_Hash_Table *hash, mzlonglong pos, Scheme_Object **_key, Scheme_Object **_val) +Scheme_Object *scheme_hash_table_next(Scheme_Hash_Table *hash, + mzlonglong start) +{ + int i, sz = hash->size; + if (start >= 0) { + if ((start >= sz) || !hash->vals[start]) + return NULL; + } + for (i = start + 1; i < sz; i++) { + if (hash->vals[i]) + return scheme_make_integer(i); + } + + return scheme_false; +} + +int scheme_hash_table_index(Scheme_Hash_Table *hash, mzlonglong pos, + Scheme_Object **_key, Scheme_Object **_val) { if (pos < hash->size) { if (hash->vals[pos]) { @@ -1117,6 +1134,27 @@ Scheme_Bucket_Table *scheme_clone_bucket_table(Scheme_Bucket_Table *bt) return table; } +Scheme_Object *scheme_bucket_table_next(Scheme_Bucket_Table *hash, + mzlonglong start) +{ + Scheme_Bucket *bucket; + int i, sz = hash->size; + + if (start >= 0) { + bucket = ((start < sz) ? hash->buckets[start] : NULL); + if (!bucket || !bucket->val || !bucket->key) + return NULL; + } + for (i = start + 1; i < sz; i++) { + bucket = hash->buckets[i]; + if (bucket && bucket->val && bucket->key) { + return scheme_make_integer(i); + } + } + + return scheme_false; +} + int scheme_bucket_table_index(Scheme_Bucket_Table *hash, mzlonglong pos, Scheme_Object **_key, Scheme_Object **_val) { Scheme_Bucket *bucket; @@ -2669,17 +2707,24 @@ static Scheme_Hash_Tree *hamt_remove(Scheme_Hash_Tree *ht, uintptr_t code, int s return ht; } +/* this signature is different from other scheme__next fns */ +/* but is used else where, so leave as is */ mzlonglong scheme_hash_tree_next(Scheme_Hash_Tree *tree, mzlonglong pos) { - if (pos == -1) - pos = 0; - else - pos++; - - if (pos == tree->count) + mzlonglong i = pos+1; + if (i == tree->count) return -1; else - return pos; + return i; +} + +Scheme_Object *scheme_hash_tree_next_pos(Scheme_Hash_Tree *tree, mzlonglong pos) +{ + mzlonglong i = pos+1; + if (i == tree->count) + return scheme_false; + else + return scheme_make_integer_value_from_long_long(i); } #if REVERSE_HASH_TABLE_ORDER @@ -2690,6 +2735,81 @@ mzlonglong scheme_hash_tree_next(Scheme_Hash_Tree *tree, mzlonglong pos) # define HAMT_TRAVERSE_NEXT(i) ((i)+1) #endif +/* instead of returning a pos, these unsafe iteration ops */ +/* return a view into the tree consisting of a: */ +/* - subtree */ +/* - subtree index */ +/* - stack of parent subtrees and indices */ +/* This speeds up performance of immutable hash table iteration. */ +/* These unsafe ops currently do not support REVERSE_HASH_TABLE_ORDER */ +/* to avoid unneeded popcount computations */ +Scheme_Object *scheme_unsafe_hash_tree_start(Scheme_Hash_Tree *ht) +{ + Scheme_Object *stack = scheme_null; + int i; + + ht = resolve_placeholder(ht); + + if (0 == ht->count) + return scheme_false; + + i = hamt_popcount(ht->bitmap)-1; + + while (1) { + if (HASHTR_SUBTREEP(ht->els[i]) + || HASHTR_COLLISIONP(ht->els[i])) { + stack = /* go down tree but save return point */ + scheme_make_pair((Scheme_Object *)ht, + scheme_make_pair(scheme_make_integer(i), + stack)); + ht = (Scheme_Hash_Tree *)ht->els[i]; + i = hamt_popcount(ht->bitmap)-1; + } else { + return scheme_make_pair((Scheme_Object *)ht, + scheme_make_pair(scheme_make_integer(i), + stack)); + } + } + return NULL; +} + +/* args is a (cons subtree (cons subtree-index stack-of-parents)) */ +Scheme_Object *scheme_unsafe_hash_tree_next(Scheme_Object *args) +{ + Scheme_Hash_Tree *ht = (Scheme_Hash_Tree *)SCHEME_CAR(args); + int i = SCHEME_INT_VAL(SCHEME_CADR(args)); + Scheme_Object *stack = SCHEME_CDDR(args); + + /* ht = resolve_placeholder(ht); /\* only check this in iterate-first *\/ */ + + while(1) { + if (!i) { /* pop up the tree */ + if (SCHEME_NULLP(stack)) { + return scheme_false; + } else { + ht = (Scheme_Hash_Tree *)SCHEME_CAR(stack); + i = SCHEME_INT_VAL(SCHEME_CADR(stack)); + stack = SCHEME_CDDR(stack); + } + } else { + i -= 1; + if (HASHTR_SUBTREEP(ht->els[i]) + || HASHTR_COLLISIONP(ht->els[i])) { + stack = /* go down tree but save return point */ + scheme_make_pair((Scheme_Object *)ht, + scheme_make_pair(scheme_make_integer(i), + stack)); + ht = (Scheme_Hash_Tree *)ht->els[i]; + i = hamt_popcount(ht->bitmap); + } else { + return scheme_make_pair((Scheme_Object *)ht, + scheme_make_pair(scheme_make_integer(i), + stack)); + } + } + } + return NULL; +} XFORM_NONGCING static void hamt_at_index(Scheme_Hash_Tree *ht, mzlonglong pos, Scheme_Object **_key, Scheme_Object **_val, uintptr_t *_code) diff --git a/racket/src/racket/src/list.c b/racket/src/racket/src/list.c index 058eaf0055..477a7fd843 100644 --- a/racket/src/racket/src/list.c +++ b/racket/src/racket/src/list.c @@ -175,7 +175,30 @@ static Scheme_Object *unsafe_unbox_star (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_set_box (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_set_box_star (int argc, Scheme_Object *argv[]); +/* unsafe_scheme_hash_table */ +Scheme_Object *unsafe_scheme_hash_table_iterate_start(int argc, Scheme_Object *argv[]); +Scheme_Object *unsafe_scheme_hash_table_iterate_next(int argc, Scheme_Object *argv[]); +Scheme_Object *unsafe_scheme_hash_table_iterate_key(int argc, Scheme_Object *argv[]); +Scheme_Object *unsafe_scheme_hash_table_iterate_value(int argc, Scheme_Object *argv[]); +Scheme_Object *unsafe_scheme_hash_table_iterate_pair(int argc, Scheme_Object *argv[]); +Scheme_Object *unsafe_scheme_hash_table_iterate_key_value(int argc, Scheme_Object *argv[]); +/* unsafe_scheme_hash_tree */ +Scheme_Object *unsafe_scheme_hash_tree_iterate_start(int argc, Scheme_Object *argv[]); +Scheme_Object *unsafe_scheme_hash_tree_iterate_next(int argc, Scheme_Object *argv[]); +Scheme_Object *unsafe_scheme_hash_tree_iterate_key(int argc, Scheme_Object *argv[]); +Scheme_Object *unsafe_scheme_hash_tree_iterate_value(int argc, Scheme_Object *argv[]); +Scheme_Object *unsafe_scheme_hash_tree_iterate_pair(int argc, Scheme_Object *argv[]); +Scheme_Object *unsafe_scheme_hash_tree_iterate_key_value(int argc, Scheme_Object *argv[]); +/* unsafe_scheme_bucket_table */ +Scheme_Object *unsafe_scheme_bucket_table_iterate_start(int argc, Scheme_Object *argv[]); +Scheme_Object *unsafe_scheme_bucket_table_iterate_next(int argc, Scheme_Object *argv[]); +Scheme_Object *unsafe_scheme_bucket_table_iterate_key(int argc, Scheme_Object *argv[]); +Scheme_Object *unsafe_scheme_bucket_table_iterate_value(int argc, Scheme_Object *argv[]); +Scheme_Object *unsafe_scheme_bucket_table_iterate_pair(int argc, Scheme_Object *argv[]); +Scheme_Object *unsafe_scheme_bucket_table_iterate_key_value(int argc, Scheme_Object *argv[]); + static Scheme_Object *chaperone_hash_key(const char *name, Scheme_Object *table, Scheme_Object *key); +static void chaperone_hash_key_value(const char *name, Scheme_Object *obj, Scheme_Object *k, Scheme_Object **_chap_key, Scheme_Object **_chap_val, int ischap); static Scheme_Object *chaperone_hash_tree_set(Scheme_Object *table, Scheme_Object *key, Scheme_Object *val); static Scheme_Object *chaperone_hash_clear(const char *name, Scheme_Object *table); @@ -861,6 +884,143 @@ scheme_init_unsafe_list (Scheme_Env *env) } +void +scheme_init_unsafe_hash (Scheme_Env *env) +{ + Scheme_Object *p; + + /* unsafe-hash-iterate-first ---------------------------------------- */ + p = scheme_make_immed_prim(unsafe_scheme_hash_table_iterate_start, + "unsafe-mutable-hash-iterate-first", 1, 1); + SCHEME_PRIM_PROC_FLAGS(p) |= + scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL); + scheme_add_global_constant ("unsafe-mutable-hash-iterate-first", p, env); + + p = scheme_make_immed_prim(unsafe_scheme_hash_tree_iterate_start, + "unsafe-immutable-hash-iterate-first", 1, 1); + SCHEME_PRIM_PROC_FLAGS(p) |= + scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL); + scheme_add_global_constant ("unsafe-immutable-hash-iterate-first", p, env); + + p = scheme_make_immed_prim(unsafe_scheme_bucket_table_iterate_start, + "unsafe-weak-hash-iterate-first", 1, 1); + SCHEME_PRIM_PROC_FLAGS(p) |= + scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL); + scheme_add_global_constant ("unsafe-weak-hash-iterate-first", p, env); + + /* unsafe-hash-iterate-next ---------------------------------------- */ + p = scheme_make_immed_prim(unsafe_scheme_hash_table_iterate_next, + "unsafe-mutable-hash-iterate-next", 2, 2); + SCHEME_PRIM_PROC_FLAGS(p) |= + scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL); + scheme_add_global_constant ("unsafe-mutable-hash-iterate-next", p, env); + + p = scheme_make_immed_prim(unsafe_scheme_hash_tree_iterate_next, + "unsafe-immutable-hash-iterate-next", 2, 2); + SCHEME_PRIM_PROC_FLAGS(p) |= + scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL); + scheme_add_global_constant ("unsafe-immutable-hash-iterate-next", p, env); + + p = scheme_make_immed_prim(unsafe_scheme_bucket_table_iterate_next, + "unsafe-weak-hash-iterate-next", 2, 2); + SCHEME_PRIM_PROC_FLAGS(p) |= + scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL); + scheme_add_global_constant ("unsafe-weak-hash-iterate-next", p, env); + + /* unsafe-hash-iterate-key ---------------------------------------- */ + p = scheme_make_noncm_prim(unsafe_scheme_hash_table_iterate_key, + "unsafe-mutable-hash-iterate-key", 2, 2); + SCHEME_PRIM_PROC_FLAGS(p) |= + scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_OMITABLE + | SCHEME_PRIM_IS_UNSAFE_OMITABLE); + scheme_add_global_constant ("unsafe-mutable-hash-iterate-key", p, env); + + p = scheme_make_noncm_prim(unsafe_scheme_hash_tree_iterate_key, + "unsafe-immutable-hash-iterate-key", 2, 2); + SCHEME_PRIM_PROC_FLAGS(p) |= + scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL + | SCHEME_PRIM_IS_UNSAFE_NONALLOCATE); + scheme_add_global_constant ("unsafe-immutable-hash-iterate-key", p, env); + + p = scheme_make_noncm_prim(unsafe_scheme_bucket_table_iterate_key, + "unsafe-weak-hash-iterate-key", 2, 2); + SCHEME_PRIM_PROC_FLAGS(p) |= + scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_OMITABLE + | SCHEME_PRIM_IS_UNSAFE_OMITABLE); + scheme_add_global_constant ("unsafe-weak-hash-iterate-key", p, env); + + /* unsafe-hash-iterate-value ---------------------------------------- */ + p = scheme_make_noncm_prim(unsafe_scheme_hash_table_iterate_value, + "unsafe-mutable-hash-iterate-value", 2, 2); + SCHEME_PRIM_PROC_FLAGS(p) |= + scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_OMITABLE + | SCHEME_PRIM_IS_UNSAFE_OMITABLE); + scheme_add_global_constant ("unsafe-mutable-hash-iterate-value", p, env); + + p = scheme_make_noncm_prim(unsafe_scheme_hash_tree_iterate_value, + "unsafe-immutable-hash-iterate-value", 2, 2); + SCHEME_PRIM_PROC_FLAGS(p) |= + scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL + | SCHEME_PRIM_IS_UNSAFE_NONALLOCATE); + scheme_add_global_constant ("unsafe-immutable-hash-iterate-value", p, env); + + p = scheme_make_noncm_prim(unsafe_scheme_bucket_table_iterate_value, + "unsafe-weak-hash-iterate-value", 2, 2); + SCHEME_PRIM_PROC_FLAGS(p) |= + scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_OMITABLE + | SCHEME_PRIM_IS_UNSAFE_OMITABLE); + scheme_add_global_constant ("unsafe-weak-hash-iterate-value", p, env); + + /* unsafe-hash-iterate-key+value ---------------------------------------- */ + p = scheme_make_prim_w_arity2(unsafe_scheme_hash_table_iterate_key_value, + "unsafe-mutable-hash-iterate-key+value", + 2, 2, 2, 2); + SCHEME_PRIM_PROC_FLAGS(p) |= + scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_OMITABLE + | SCHEME_PRIM_IS_UNSAFE_OMITABLE); + scheme_add_global_constant ("unsafe-mutable-hash-iterate-key+value", p, env); + + p = scheme_make_prim_w_arity2(unsafe_scheme_hash_tree_iterate_key_value, + "unsafe-immutable-hash-iterate-key+value", + 2, 2, 2, 2); + SCHEME_PRIM_PROC_FLAGS(p) |= + scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL + | SCHEME_PRIM_IS_UNSAFE_NONALLOCATE); + scheme_add_global_constant ("unsafe-immutable-hash-iterate-key+value", p, env); + + p = scheme_make_prim_w_arity2(unsafe_scheme_bucket_table_iterate_key_value, + "unsafe-weak-hash-iterate-key+value", + 2, 2, 2, 2); + SCHEME_PRIM_PROC_FLAGS(p) |= + scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_OMITABLE + | SCHEME_PRIM_IS_UNSAFE_OMITABLE); + scheme_add_global_constant ("unsafe-weak-hash-iterate-key+value", p, env); + + /* unsafe-hash-iterate-pair ---------------------------------------- */ + p = scheme_make_immed_prim(unsafe_scheme_hash_table_iterate_pair, + "unsafe-mutable-hash-iterate-pair", + 2, 2); + SCHEME_PRIM_PROC_FLAGS(p) |= + scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_OMITABLE_ALLOCATION + | SCHEME_PRIM_IS_UNSAFE_OMITABLE); + scheme_add_global_constant ("unsafe-mutable-hash-iterate-pair", p, env); + + p = scheme_make_immed_prim(unsafe_scheme_hash_tree_iterate_pair, + "unsafe-immutable-hash-iterate-pair", + 2, 2); + SCHEME_PRIM_PROC_FLAGS(p) |= + scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL); + scheme_add_global_constant ("unsafe-immutable-hash-iterate-pair", p, env); + + p = scheme_make_immed_prim(unsafe_scheme_bucket_table_iterate_pair, + "unsafe-weak-hash-iterate-pair", + 2, 2); + SCHEME_PRIM_PROC_FLAGS(p) |= + scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_OMITABLE_ALLOCATION + | SCHEME_PRIM_IS_UNSAFE_OMITABLE); + scheme_add_global_constant ("unsafe-weak-hash-iterate-pair", p, env); +} + Scheme_Object *scheme_make_pair(Scheme_Object *car, Scheme_Object *cdr) { #ifdef MZ_PRECISE_GC @@ -2743,53 +2903,11 @@ static Scheme_Object *hash_table_next(const char *name, mzlonglong start, int ar o = SCHEME_CHAPERONE_VAL(o); if (SCHEME_HASHTP(o)) { - Scheme_Hash_Table *hash; - int i, sz; - - hash = (Scheme_Hash_Table *)o; - - sz = hash->size; - if (start >= 0) { - if ((start >= sz) || !hash->vals[start]) - return NULL; - } - for (i = start + 1; i < sz; i++) { - if (hash->vals[i]) - return scheme_make_integer(i); - } - - return scheme_false; + return scheme_hash_table_next((Scheme_Hash_Table *)o, start); } else if (SCHEME_HASHTRP(o)) { - mzlonglong v; - v = scheme_hash_tree_next((Scheme_Hash_Tree *)o, start); - if (v == -1) - return scheme_false; - else if (v == -2) - return NULL; - else - return scheme_make_integer_value_from_long_long(v); + return scheme_hash_tree_next_pos((Scheme_Hash_Tree *)o, start); } else if (SCHEME_BUCKTP(o)) { - Scheme_Bucket_Table *hash; - Scheme_Bucket *bucket; - int i, sz; - - hash = (Scheme_Bucket_Table *)o; - - sz = hash->size; - - if (start >= 0) { - bucket = ((start < sz) ? hash->buckets[start] : NULL); - if (!bucket || !bucket->val || !bucket->key) - return NULL; - } - for (i = start + 1; i < sz; i++) { - bucket = hash->buckets[i]; - if (bucket && bucket->val && bucket->key) { - return scheme_make_integer(i); - } - } - - return scheme_false; + return scheme_bucket_table_next((Scheme_Bucket_Table *)o, start); } else { scheme_wrong_contract(name, "hash?", 0, argc, argv); return NULL; @@ -2815,8 +2933,7 @@ Scheme_Object *scheme_hash_table_iterate_next(int argc, Scheme_Object *argv[]) v = hash_table_next("hash-iterate-next", pos, argc, argv); - if (v) - return v; + if (v) return v; if (SCHEME_INTP(p)) { if (SCHEME_INT_VAL(p) >= 0) @@ -2827,12 +2944,12 @@ Scheme_Object *scheme_hash_table_iterate_next(int argc, Scheme_Object *argv[]) } if (p) - scheme_wrong_contract("hash-iterate-next", "exact-nonnegative-integer?", 1, argc, argv); + scheme_wrong_contract("hash-iterate-next", + "exact-nonnegative-integer?", 1, argc, argv); scheme_contract_error("hash-iterate-next", "no element at index", "index", 1, argv[1], NULL); - return NULL; } @@ -2845,9 +2962,7 @@ static int hash_table_index(const char *name, int argc, Scheme_Object *argv[], S if (SCHEME_NP_CHAPERONEP(obj)) obj = SCHEME_CHAPERONE_VAL(obj); - if (!scheme_get_long_long_val(p, &pos)) - pos = HASH_POS_TOO_BIG; - else if (pos < 0) + if (!scheme_get_long_long_val(p, &pos) || (pos < 0)) pos = HASH_POS_TOO_BIG; if (SCHEME_HASHTP(obj)) { @@ -2899,10 +3014,8 @@ Scheme_Object *scheme_hash_table_iterate_value(int argc, Scheme_Object *argv[]) Scheme_Object *obj = argv[0]; if (SCHEME_NP_CHAPERONEP(obj)) { Scheme_Object *chap_key, *chap_val; - chap_key = chaperone_hash_key(name, obj, key); - chap_val = scheme_chaperone_hash_get(obj, chap_key); - if (!chap_val) - no_post_key(name, chap_key, SCHEME_HASHTRP(SCHEME_CHAPERONE_VAL(obj))); + int ischap = SCHEME_HASHTRP(SCHEME_CHAPERONE_VAL(obj)); + chaperone_hash_key_value(name, obj, key, &chap_key, &chap_val, ischap); return chap_val; } else @@ -2919,10 +3032,8 @@ Scheme_Object *scheme_hash_table_iterate_pair(int argc, Scheme_Object *argv[]) Scheme_Object *obj = argv[0]; if (SCHEME_NP_CHAPERONEP(obj)) { Scheme_Object *chap_key, *chap_val; - chap_key = chaperone_hash_key(name, obj, key); - chap_val = scheme_chaperone_hash_get(obj, chap_key); - if (!chap_val) - no_post_key(name, chap_key, SCHEME_HASHTRP(SCHEME_CHAPERONE_VAL(obj))); + int ischap = SCHEME_HASHTRP(SCHEME_CHAPERONE_VAL(obj)); + chaperone_hash_key_value(name, obj, key, &chap_key, &chap_val, ischap); return scheme_make_pair(chap_key, chap_val); } else @@ -2938,13 +3049,8 @@ Scheme_Object *scheme_hash_table_iterate_key_value(int argc, Scheme_Object *argv if (hash_table_index(name, argc, argv, &key, &val)) { Scheme_Object *res[2], *obj = argv[0]; if (SCHEME_NP_CHAPERONEP(obj)) { - Scheme_Object *chap_key, *chap_val; - chap_key = chaperone_hash_key(name, obj, key); - chap_val = scheme_chaperone_hash_get(obj, chap_key); - if (!chap_val) - no_post_key(name, chap_key, SCHEME_HASHTRP(SCHEME_CHAPERONE_VAL(obj))); - res[0] = chap_key; - res[1] = chap_val; + int ischap = SCHEME_HASHTRP(SCHEME_CHAPERONE_VAL(obj)); + chaperone_hash_key_value(name, obj, key, &res[0], &res[1], ischap); } else { res[0] = key; @@ -3294,6 +3400,16 @@ static Scheme_Object *chaperone_hash_key(const char *name, Scheme_Object *table, { return chaperone_hash_op(name, table, key, NULL, 3, scheme_null); } +static void chaperone_hash_key_value(const char *name, Scheme_Object *obj, Scheme_Object *key, Scheme_Object **_chap_key, Scheme_Object **_chap_val, int ischap) +{ + Scheme_Object *chap_key, *chap_val; + chap_key = chaperone_hash_key(name, obj, key); + chap_val = scheme_chaperone_hash_get(obj, chap_key); + if (!chap_val) + no_post_key(name, chap_key, ischap); + *_chap_key = chap_key; + *_chap_val = chap_val; +} static Scheme_Object *chaperone_hash_clear(const char *name, Scheme_Object *table) { @@ -3878,3 +3994,303 @@ static Scheme_Object *unsafe_set_box (int argc, Scheme_Object *argv[]) SCHEME_BOX_VAL(argv[0]) = argv[1]; return scheme_void; } + +/************************************************************/ +/* unsafe hash table iteration ops */ +/************************************************************/ + +/* unsafe_scheme_hash_table, ie SCHEME_HASHTP, ops */ +Scheme_Object *unsafe_scheme_hash_table_iterate_start(int argc, Scheme_Object *argv[]) +{ + Scheme_Object *o = argv[0]; + + if (SCHEME_NP_CHAPERONEP(o)) o = SCHEME_CHAPERONE_VAL(o); + + return scheme_hash_table_next((Scheme_Hash_Table *)o, -1); +} +Scheme_Object *unsafe_scheme_hash_table_iterate_next(int argc, Scheme_Object *argv[]) +{ + Scheme_Object *o = argv[0], *res; + + if (SCHEME_NP_CHAPERONEP(o)) o = SCHEME_CHAPERONE_VAL(o); + + res = scheme_hash_table_next((Scheme_Hash_Table *)o, SCHEME_INT_VAL(argv[1])); + + if (res) + return res; + else + scheme_contract_error("unsafe-mutable-hash-iterate-next", + "no element at index", + "index", 1, argv[1], + NULL); + return NULL; +} +Scheme_Object *unsafe_scheme_hash_table_iterate_key(int argc, Scheme_Object *argv[]) +{ + const char *name = "unsafe-mutable-hash-iterate-key"; + Scheme_Object *obj = argv[0], *key; + mzlonglong pos = SCHEME_INT_VAL(argv[1]); + + if (SCHEME_NP_CHAPERONEP(obj)) { + Scheme_Hash_Table *ht = (Scheme_Hash_Table *)SCHEME_CHAPERONE_VAL(obj); + if (scheme_hash_table_index(ht, pos, &key, NULL)) + return chaperone_hash_key(name, obj, key); + } else { + if(scheme_hash_table_index((Scheme_Hash_Table *)obj, pos, &key, NULL)) + return key; + } + scheme_contract_error(name, "no element at index", "index", 1, argv[1], NULL); + return NULL; +} +Scheme_Object *unsafe_scheme_hash_table_iterate_value(int argc, Scheme_Object *argv[]) +{ + const char *name = "unsafe-mutable-hash-iterate-value"; + Scheme_Object *obj = argv[0], *key, *val; + mzlonglong pos = SCHEME_INT_VAL(argv[1]); + + if (SCHEME_NP_CHAPERONEP(obj)) { + Scheme_Object *chap_key, *chap_val; + Scheme_Hash_Table *ht = (Scheme_Hash_Table *)SCHEME_CHAPERONE_VAL(obj); + if (scheme_hash_table_index(ht, pos, &key, NULL)) { + chaperone_hash_key_value(name, obj, key, &chap_key, &chap_val, 0); + return chap_val; + } + } else { + if(scheme_hash_table_index((Scheme_Hash_Table *)obj, pos, &key, &val)) + return val; + } + scheme_contract_error(name, "no element at index", "index", 1, argv[1], NULL); + return NULL; +} +Scheme_Object *unsafe_scheme_hash_table_iterate_pair(int argc, Scheme_Object *argv[]) +{ + const char *name = "unsafe-mutable-hash-iterate-pair"; + Scheme_Object *obj = argv[0], *key, *val; + mzlonglong pos = SCHEME_INT_VAL(argv[1]); + + if (SCHEME_NP_CHAPERONEP(obj)) { + Scheme_Object *chap_key, *chap_val; + Scheme_Hash_Table *ht = (Scheme_Hash_Table *)SCHEME_CHAPERONE_VAL(obj); + if (scheme_hash_table_index(ht, pos, &key, NULL)) { + chaperone_hash_key_value(name, obj, key, &chap_key, &chap_val, 0); + return scheme_make_pair(chap_key, chap_val); + } + } else { + if(scheme_hash_table_index((Scheme_Hash_Table *)obj, pos, &key, &val)) + return scheme_make_pair(key, val); + } + scheme_contract_error(name, "no element at index", "index", 1, argv[1], NULL); + return NULL; +} +Scheme_Object *unsafe_scheme_hash_table_iterate_key_value(int argc, Scheme_Object *argv[]) +{ + const char *name = "unsafe-mutable-hash-iterate-key+value"; + Scheme_Object *obj = argv[0], *res[2]; + mzlonglong pos = SCHEME_INT_VAL(argv[1]); + + if (SCHEME_NP_CHAPERONEP(obj)) { + Scheme_Object *key; + Scheme_Hash_Table *ht = (Scheme_Hash_Table *)SCHEME_CHAPERONE_VAL(obj); + if (scheme_hash_table_index(ht, pos, &key, NULL)) { + chaperone_hash_key_value(name, obj, key, &res[0], &res[1], 0); + return scheme_values(2, res); + } + } else { + if(scheme_hash_table_index((Scheme_Hash_Table *)obj, pos, &res[0], &res[1])) + return scheme_values(2, res); + } + scheme_contract_error(name, "no element at index", "index", 1, argv[1], NULL); + return NULL; +} + +/* unsafe_scheme_hash_tree, ie SCHEME_HASHTRP, ops */ +Scheme_Object *unsafe_scheme_hash_tree_iterate_start(int argc, Scheme_Object *argv[]) +{ + Scheme_Object *o = argv[0]; + + if (SCHEME_NP_CHAPERONEP(o)) o = SCHEME_CHAPERONE_VAL(o); + + return scheme_unsafe_hash_tree_start((Scheme_Hash_Tree *)o); +} +Scheme_Object *unsafe_scheme_hash_tree_iterate_next(int argc, Scheme_Object *argv[]) +{ + Scheme_Object *o = argv[0]; + + if (SCHEME_NP_CHAPERONEP(o)) o = SCHEME_CHAPERONE_VAL(o); + + return scheme_unsafe_hash_tree_next(argv[1]); +} +Scheme_Object *unsafe_scheme_hash_tree_iterate_key(int argc, Scheme_Object *argv[]) +{ + Scheme_Object *obj = argv[0], *args = argv[1], *key; + Scheme_Hash_Tree *subtree = (Scheme_Hash_Tree *)SCHEME_CAR(args); + int i = SCHEME_INT_VAL(SCHEME_CADR(args)); + key = subtree->els[i]; + + if (SCHEME_NP_CHAPERONEP(obj)) + return chaperone_hash_key("unsafe-weak-hash-iterate-key", obj, key); + else + return key; +} +Scheme_Object *unsafe_scheme_hash_tree_iterate_value(int argc, Scheme_Object *argv[]) +{ + Scheme_Object *obj = argv[0], *args = argv[1]; + Scheme_Hash_Tree *subtree = (Scheme_Hash_Tree *)SCHEME_CAR(args); + int i = SCHEME_INT_VAL(SCHEME_CADR(args)); + + if (SCHEME_NP_CHAPERONEP(obj)) { + Scheme_Object *chap_key, *chap_val; + chaperone_hash_key_value("unsafe-weak-hash-iterate-value", + obj, subtree->els[i], &chap_key, &chap_val, 0); + return chap_val; + } else { + int popcount; + popcount = hamt_popcount(subtree->bitmap); + return subtree->els[i+popcount]; + } +} +Scheme_Object *unsafe_scheme_hash_tree_iterate_pair(int argc, Scheme_Object *argv[]) +{ + Scheme_Object *obj = argv[0], *args = argv[1]; + Scheme_Hash_Tree *subtree = (Scheme_Hash_Tree *)SCHEME_CAR(args); + int i = SCHEME_INT_VAL(SCHEME_CADR(args)); + Scheme_Object *key = subtree->els[i]; + + if (SCHEME_NP_CHAPERONEP(obj)) { + Scheme_Object *chap_key, *chap_val; + chaperone_hash_key_value("unsafe-weak-hash-iterate-pair", + obj, subtree->els[i], &chap_key, &chap_val, 0); + return scheme_make_pair(chap_key, chap_val); + } else { + Scheme_Object *val; + int popcount; + popcount = hamt_popcount(subtree->bitmap); + val = subtree->els[i+popcount]; + return scheme_make_pair(key, val); + } +} +Scheme_Object *unsafe_scheme_hash_tree_iterate_key_value(int argc, Scheme_Object *argv[]) +{ + Scheme_Object *obj = argv[0], *args = argv[1], *res[2]; + Scheme_Hash_Tree *subtree = (Scheme_Hash_Tree *)SCHEME_CAR(args); + int i = SCHEME_INT_VAL(SCHEME_CADR(args)); + Scheme_Object *key = subtree->els[i]; + + if (SCHEME_NP_CHAPERONEP(obj)) { + chaperone_hash_key_value("unsafe-weak-hash-iterate-pair", + obj, subtree->els[i], &res[0], &res[1], 0); + } else { + Scheme_Object *val; + int popcount; + popcount = hamt_popcount(subtree->bitmap); + val = subtree->els[i+popcount]; + res[0] = key; + res[1] = val; + } + return scheme_values(2, res); +} + +/* unsafe_scheme_bucket_table, ie SCHEME_BUCKTP, ops */ +Scheme_Object *unsafe_scheme_bucket_table_iterate_start(int argc, Scheme_Object *argv[]) +{ + Scheme_Object *o = argv[0]; + + if (SCHEME_NP_CHAPERONEP(o)) o = SCHEME_CHAPERONE_VAL(o); + + return scheme_bucket_table_next((Scheme_Bucket_Table *)o, -1); +} +Scheme_Object *unsafe_scheme_bucket_table_iterate_next(int argc, Scheme_Object *argv[]) +{ + Scheme_Object *o = argv[0], *res; + + if (SCHEME_NP_CHAPERONEP(o)) o = SCHEME_CHAPERONE_VAL(o); + + res = scheme_bucket_table_next((Scheme_Bucket_Table *)o, + SCHEME_INT_VAL(argv[1])); + if (res) + return res; + else + scheme_contract_error("unsafe-weak-hash-iterate-next", + "no element at index", + "index", 1, argv[1], + NULL); + return NULL; +} +Scheme_Object *unsafe_scheme_bucket_table_iterate_key(int argc, Scheme_Object *argv[]) +{ + const char *name = "unsafe-weak-hash-iterate-key"; + Scheme_Object *obj = argv[0], *key; + mzlonglong pos = SCHEME_INT_VAL(argv[1]); + + if (SCHEME_NP_CHAPERONEP(obj)) { + Scheme_Bucket_Table *ht = (Scheme_Bucket_Table *)SCHEME_CHAPERONE_VAL(obj); + if (scheme_bucket_table_index(ht, pos, &key, NULL)) + return chaperone_hash_key(name, obj, key); + } else { + if(scheme_bucket_table_index((Scheme_Bucket_Table *)obj, pos, &key, NULL)) + return key; + } + scheme_contract_error(name, "no element at index", "index", 1, argv[1], NULL); + return NULL; +} +Scheme_Object *unsafe_scheme_bucket_table_iterate_value(int argc, Scheme_Object *argv[]) +{ + const char *name = "unsafe-weak-hash-iterate-value"; + Scheme_Object *obj = argv[0], *key, *val; + mzlonglong pos = SCHEME_INT_VAL(argv[1]); + + if (SCHEME_NP_CHAPERONEP(obj)) { + Scheme_Bucket_Table *ht = (Scheme_Bucket_Table *)SCHEME_CHAPERONE_VAL(obj); + Scheme_Object *chap_key, *chap_val; + if (scheme_bucket_table_index(ht, pos, &key, NULL)) { + chaperone_hash_key_value(name, obj, key, &chap_key, &chap_val, 0); + return chap_val; + } + } else { + if(scheme_bucket_table_index((Scheme_Bucket_Table *)obj, pos, &key, &val)) + return val; + } + scheme_contract_error(name, "no element at index", "index", 1, argv[1], NULL); + return NULL; +} +Scheme_Object *unsafe_scheme_bucket_table_iterate_pair(int argc, Scheme_Object *argv[]) +{ + const char *name = "unsafe-weak-hash-iterate-pair"; + Scheme_Object *obj = argv[0], *key, *val; + mzlonglong pos = SCHEME_INT_VAL(argv[1]); + + if (SCHEME_NP_CHAPERONEP(obj)) { + Scheme_Bucket_Table *ht = (Scheme_Bucket_Table *)SCHEME_CHAPERONE_VAL(obj); + Scheme_Object *chap_key, *chap_val; + if (scheme_bucket_table_index(ht, pos, &key, NULL)) { + chaperone_hash_key_value(name, obj, key, &chap_key, &chap_val, 0); + return scheme_make_pair(chap_key, chap_val); + } + } else { + if(scheme_bucket_table_index((Scheme_Bucket_Table *)obj, pos, &key, &val)) + return scheme_make_pair(key, val); + } + scheme_contract_error(name, "no element at index", "index", 1, argv[1], NULL); + return NULL; +} +Scheme_Object *unsafe_scheme_bucket_table_iterate_key_value(int argc, Scheme_Object *argv[]) +{ + const char *name = "unsafe-weak-hash-iterate-key+value"; + Scheme_Object *obj = argv[0], *res[2]; + mzlonglong pos = SCHEME_INT_VAL(argv[1]); + + if (SCHEME_NP_CHAPERONEP(obj)) { + Scheme_Bucket_Table *ht = (Scheme_Bucket_Table *)SCHEME_CHAPERONE_VAL(obj); + Scheme_Object *key; + if (scheme_bucket_table_index(ht, pos, &key, NULL)) { + chaperone_hash_key_value(name, obj, key, &res[0], &res[1], 0); + return scheme_values(2, res); + } + } else { + Scheme_Bucket_Table *ht = (Scheme_Bucket_Table *)obj; + if(scheme_bucket_table_index(ht, pos, &res[0], &res[1])) + return scheme_values(2, res); + } + scheme_contract_error(name, "no element at index", "index", 1, argv[1], NULL); + return NULL; +} diff --git a/racket/src/racket/src/schemef.h b/racket/src/racket/src/schemef.h index 7e810875a9..3da9449b4e 100644 --- a/racket/src/racket/src/schemef.h +++ b/racket/src/racket/src/schemef.h @@ -484,46 +484,6 @@ MZ_EXTERN void scheme_free_immobile_box(void **b); MZ_EXTERN Scheme_Object *scheme_add_gc_callback(Scheme_Object *pre, Scheme_Object *post); MZ_EXTERN void scheme_remove_gc_callback(Scheme_Object *key); -/*========================================================================*/ -/* hash tables */ -/*========================================================================*/ - -MZ_EXTERN Scheme_Bucket_Table *scheme_make_bucket_table(intptr_t size_hint, int type); -MZ_EXTERN void scheme_add_to_table(Scheme_Bucket_Table *table, const char *key, void *val, int); -MZ_EXTERN void scheme_change_in_table(Scheme_Bucket_Table *table, const char *key, void *new_val); -MZ_EXTERN void *scheme_lookup_in_table(Scheme_Bucket_Table *table, const char *key); -MZ_EXTERN Scheme_Bucket *scheme_bucket_from_table(Scheme_Bucket_Table *table, const char *key); -MZ_EXTERN int scheme_bucket_table_equal(Scheme_Bucket_Table *t1, Scheme_Bucket_Table *t2); -MZ_EXTERN Scheme_Bucket_Table *scheme_clone_bucket_table(Scheme_Bucket_Table *bt); -MZ_EXTERN void scheme_clear_bucket_table(Scheme_Bucket_Table *bt); -XFORM_NONGCING MZ_EXTERN int scheme_bucket_table_index(Scheme_Bucket_Table *hash, mzlonglong pos, Scheme_Object **_key, Scheme_Object **_val); - -MZ_EXTERN Scheme_Hash_Table *scheme_make_hash_table(int type); -MZ_EXTERN Scheme_Hash_Table *scheme_make_hash_table_equal(); -MZ_EXTERN Scheme_Hash_Table *scheme_make_hash_table_eqv(); -MZ_EXTERN void scheme_hash_set(Scheme_Hash_Table *table, Scheme_Object *key, Scheme_Object *val); -MZ_EXTERN Scheme_Object *scheme_hash_get(Scheme_Hash_Table *table, Scheme_Object *key); -XFORM_NONGCING MZ_EXTERN Scheme_Object *scheme_eq_hash_get(Scheme_Hash_Table *table, Scheme_Object *key); -MZ_EXTERN void scheme_hash_set_atomic(Scheme_Hash_Table *table, Scheme_Object *key, Scheme_Object *val); -MZ_EXTERN Scheme_Object *scheme_hash_get_atomic(Scheme_Hash_Table *table, Scheme_Object *key); -MZ_EXTERN int scheme_hash_table_equal(Scheme_Hash_Table *t1, Scheme_Hash_Table *t2); -MZ_EXTERN int scheme_is_hash_table_equal(Scheme_Object *o); -MZ_EXTERN int scheme_is_hash_table_eqv(Scheme_Object *o); -MZ_EXTERN Scheme_Hash_Table *scheme_clone_hash_table(Scheme_Hash_Table *ht); -MZ_EXTERN void scheme_clear_hash_table(Scheme_Hash_Table *ht); -XFORM_NONGCING MZ_EXTERN int scheme_hash_table_index(Scheme_Hash_Table *hash, mzlonglong pos, Scheme_Object **_key, Scheme_Object **_val); - -MZ_EXTERN Scheme_Hash_Tree *scheme_make_hash_tree(int kind); -MZ_EXTERN Scheme_Hash_Tree *scheme_make_hash_tree_set(int kind); -MZ_EXTERN Scheme_Hash_Tree *scheme_hash_tree_set(Scheme_Hash_Tree *tree, Scheme_Object *key, Scheme_Object *val); -MZ_EXTERN Scheme_Object *scheme_hash_tree_get(Scheme_Hash_Tree *tree, Scheme_Object *key); -XFORM_NONGCING MZ_EXTERN Scheme_Object *scheme_eq_hash_tree_get(Scheme_Hash_Tree *tree, Scheme_Object *key); -XFORM_NONGCING MZ_EXTERN mzlonglong scheme_hash_tree_next(Scheme_Hash_Tree *tree, mzlonglong pos); -XFORM_NONGCING MZ_EXTERN int scheme_hash_tree_index(Scheme_Hash_Tree *tree, mzlonglong pos, Scheme_Object **_key, Scheme_Object **_val); -MZ_EXTERN int scheme_hash_tree_equal(Scheme_Hash_Tree *t1, Scheme_Hash_Tree *t2); -MZ_EXTERN int scheme_is_hash_tree_equal(Scheme_Object *o); -MZ_EXTERN int scheme_is_hash_tree_eqv(Scheme_Object *o); - /*========================================================================*/ /* basic Scheme value constructors */ /*========================================================================*/ diff --git a/racket/src/racket/src/schminc.h b/racket/src/racket/src/schminc.h index bc150d5523..1dc5caf24e 100644 --- a/racket/src/racket/src/schminc.h +++ b/racket/src/racket/src/schminc.h @@ -15,7 +15,7 @@ #define USE_COMPILED_STARTUP 1 #define EXPECTED_PRIM_COUNT 1144 -#define EXPECTED_UNSAFE_COUNT 108 +#define EXPECTED_UNSAFE_COUNT 126 #define EXPECTED_FLFXNUM_COUNT 69 #define EXPECTED_EXTFL_COUNT 45 #define EXPECTED_FUTURES_COUNT 15 diff --git a/racket/src/racket/src/schpriv.h b/racket/src/racket/src/schpriv.h index b282eae41b..8bc90a71d4 100644 --- a/racket/src/racket/src/schpriv.h +++ b/racket/src/racket/src/schpriv.h @@ -289,6 +289,7 @@ void scheme_init_logger_wait(); void scheme_init_struct_wait(); void scheme_init_list(Scheme_Env *env); void scheme_init_unsafe_list(Scheme_Env *env); +void scheme_init_unsafe_hash(Scheme_Env *env); void scheme_init_stx(Scheme_Env *env); void scheme_init_module(Scheme_Env *env); void scheme_init_module_path_table(void); @@ -589,38 +590,6 @@ extern Scheme_Object *scheme_uint32_ctype; extern Scheme_Object *scheme_int64_ctype; extern Scheme_Object *scheme_uint64_ctype; -/*========================================================================*/ -/* hash functions */ -/*========================================================================*/ - -Scheme_Object *scheme_make_immutable_hash(int argc, Scheme_Object *argv[]); -Scheme_Object *scheme_make_immutable_hasheq(int argc, Scheme_Object *argv[]); -Scheme_Object *scheme_make_immutable_hasheqv(int argc, Scheme_Object *argv[]); -Scheme_Object *scheme_hash_eq_p(int argc, Scheme_Object *argv[]); -Scheme_Object *scheme_hash_eqv_p(int argc, Scheme_Object *argv[]); -Scheme_Object *scheme_hash_equal_p(int argc, Scheme_Object *argv[]); -Scheme_Object *scheme_hash_table_put(int argc, Scheme_Object *argv[]); -Scheme_Object *scheme_hash_table_iterate_start(int argc, Scheme_Object *argv[]); -Scheme_Object *scheme_hash_table_iterate_next(int argc, Scheme_Object *argv[]); -Scheme_Object *scheme_hash_table_iterate_value(int argc, Scheme_Object *argv[]); -Scheme_Object *scheme_hash_table_iterate_key(int argc, Scheme_Object *argv[]); - -Scheme_Object *scheme_hash_get_w_key_wraps(Scheme_Hash_Table *table, Scheme_Object *key, - Scheme_Object *key_wraps); -void scheme_hash_set_w_key_wraps(Scheme_Hash_Table *table, Scheme_Object *key, Scheme_Object *val, - Scheme_Object *key_wraps); -Scheme_Bucket *scheme_bucket_or_null_from_table_w_key_wraps(Scheme_Bucket_Table *table, - const char *key, int add, - Scheme_Object *key_wraps); -void scheme_add_to_table_w_key_wraps(Scheme_Bucket_Table *table, const char *key, void *val, - int constant, Scheme_Object *key_wraps); -void *scheme_lookup_in_table_w_key_wraps(Scheme_Bucket_Table *table, const char *key, - Scheme_Object *key_wraps); -Scheme_Object *scheme_hash_tree_get_w_key_wraps(Scheme_Hash_Tree *tree, Scheme_Object *key, - Scheme_Object *key_wraps); -Scheme_Hash_Tree *scheme_hash_tree_set_w_key_wraps(Scheme_Hash_Tree *tree, Scheme_Object *key, Scheme_Object *val, - Scheme_Object *key_wraps); - /*========================================================================*/ /* thread state and maintenance */ /*========================================================================*/ @@ -927,6 +896,85 @@ struct Scheme_Hash_Tree { Scheme_Object *scheme_intern_literal_string(Scheme_Object *str); Scheme_Object *scheme_intern_literal_number(Scheme_Object *num); +/*========================================================================*/ +/* hash functions */ +/*========================================================================*/ + +Scheme_Object *scheme_make_immutable_hash(int argc, Scheme_Object *argv[]); +Scheme_Object *scheme_make_immutable_hasheq(int argc, Scheme_Object *argv[]); +Scheme_Object *scheme_make_immutable_hasheqv(int argc, Scheme_Object *argv[]); +Scheme_Object *scheme_hash_eq_p(int argc, Scheme_Object *argv[]); +Scheme_Object *scheme_hash_eqv_p(int argc, Scheme_Object *argv[]); +Scheme_Object *scheme_hash_equal_p(int argc, Scheme_Object *argv[]); +Scheme_Object *scheme_hash_table_put(int argc, Scheme_Object *argv[]); +Scheme_Object *scheme_hash_table_iterate_start(int argc, Scheme_Object *argv[]); +Scheme_Object *scheme_hash_table_iterate_next(int argc, Scheme_Object *argv[]); +Scheme_Object *scheme_hash_table_iterate_value(int argc, Scheme_Object *argv[]); +Scheme_Object *scheme_hash_table_iterate_key(int argc, Scheme_Object *argv[]); + +Scheme_Object *scheme_hash_get_w_key_wraps(Scheme_Hash_Table *table, Scheme_Object *key, + Scheme_Object *key_wraps); +void scheme_hash_set_w_key_wraps(Scheme_Hash_Table *table, Scheme_Object *key, Scheme_Object *val, + Scheme_Object *key_wraps); +Scheme_Bucket *scheme_bucket_or_null_from_table_w_key_wraps(Scheme_Bucket_Table *table, + const char *key, int add, + Scheme_Object *key_wraps); +void scheme_add_to_table_w_key_wraps(Scheme_Bucket_Table *table, const char *key, void *val, + int constant, Scheme_Object *key_wraps); +void *scheme_lookup_in_table_w_key_wraps(Scheme_Bucket_Table *table, const char *key, + Scheme_Object *key_wraps); +Scheme_Object *scheme_hash_tree_get_w_key_wraps(Scheme_Hash_Tree *tree, Scheme_Object *key, + Scheme_Object *key_wraps); +Scheme_Hash_Tree *scheme_hash_tree_set_w_key_wraps(Scheme_Hash_Tree *tree, Scheme_Object *key, Scheme_Object *val, + Scheme_Object *key_wraps); + +/*========================================================================*/ +/* hash tables */ +/*========================================================================*/ + +Scheme_Bucket_Table *scheme_make_bucket_table(intptr_t size_hint, int type); +void scheme_add_to_table(Scheme_Bucket_Table *table, const char *key, void *val, int); +void scheme_change_in_table(Scheme_Bucket_Table *table, const char *key, void *new_val); +void *scheme_lookup_in_table(Scheme_Bucket_Table *table, const char *key); +Scheme_Bucket *scheme_bucket_from_table(Scheme_Bucket_Table *table, const char *key); +int scheme_bucket_table_equal(Scheme_Bucket_Table *t1, Scheme_Bucket_Table *t2); +Scheme_Bucket_Table *scheme_clone_bucket_table(Scheme_Bucket_Table *bt); +void scheme_clear_bucket_table(Scheme_Bucket_Table *bt); +Scheme_Object *scheme_bucket_table_next(Scheme_Bucket_Table *hash, mzlonglong start); +XFORM_NONGCING int scheme_bucket_table_index(Scheme_Bucket_Table *hash, mzlonglong pos, Scheme_Object **_key, Scheme_Object **_val); + +Scheme_Hash_Table *scheme_make_hash_table(int type); +Scheme_Hash_Table *scheme_make_hash_table_equal(); +Scheme_Hash_Table *scheme_make_hash_table_eqv(); +void scheme_hash_set(Scheme_Hash_Table *table, Scheme_Object *key, Scheme_Object *val); +Scheme_Object *scheme_hash_get(Scheme_Hash_Table *table, Scheme_Object *key); +XFORM_NONGCING Scheme_Object *scheme_eq_hash_get(Scheme_Hash_Table *table, Scheme_Object *key); +void scheme_hash_set_atomic(Scheme_Hash_Table *table, Scheme_Object *key, Scheme_Object *val); +Scheme_Object *scheme_hash_get_atomic(Scheme_Hash_Table *table, Scheme_Object *key); +int scheme_hash_table_equal(Scheme_Hash_Table *t1, Scheme_Hash_Table *t2); +int scheme_is_hash_table_equal(Scheme_Object *o); +int scheme_is_hash_table_eqv(Scheme_Object *o); +Scheme_Hash_Table *scheme_clone_hash_table(Scheme_Hash_Table *ht); +void scheme_clear_hash_table(Scheme_Hash_Table *ht); +Scheme_Object *scheme_hash_table_next(Scheme_Hash_Table *hash, mzlonglong start); +XFORM_NONGCING int scheme_hash_table_index(Scheme_Hash_Table *hash, mzlonglong pos, Scheme_Object **_key, Scheme_Object **_val); + +Scheme_Hash_Tree *scheme_make_hash_tree(int kind); +Scheme_Hash_Tree *scheme_make_hash_tree_set(int kind); +Scheme_Hash_Tree *scheme_hash_tree_set(Scheme_Hash_Tree *tree, Scheme_Object *key, Scheme_Object *val); +Scheme_Object *scheme_hash_tree_get(Scheme_Hash_Tree *tree, Scheme_Object *key); +XFORM_NONGCING Scheme_Object *scheme_eq_hash_tree_get(Scheme_Hash_Tree *tree, Scheme_Object *key); +XFORM_NONGCING mzlonglong scheme_hash_tree_next(Scheme_Hash_Tree *tree, mzlonglong pos); +Scheme_Object *scheme_unsafe_hash_tree_start(Scheme_Hash_Tree *ht); +Scheme_Object *scheme_unsafe_hash_tree_next(Scheme_Object *args); +Scheme_Object *scheme_hash_tree_next_pos(Scheme_Hash_Tree *tree, mzlonglong pos); +XFORM_NONGCING int scheme_hash_tree_index(Scheme_Hash_Tree *tree, mzlonglong pos, Scheme_Object **_key, Scheme_Object **_val); +int scheme_hash_tree_equal(Scheme_Hash_Tree *t1, Scheme_Hash_Tree *t2); +int scheme_is_hash_tree_equal(Scheme_Object *o); +int scheme_is_hash_tree_eqv(Scheme_Object *o); + +XFORM_NONGCING int hamt_popcount(hash_tree_bitmap_t x); + /*========================================================================*/ /* structs */ /*========================================================================*/ diff --git a/racket/src/racket/src/schvers.h b/racket/src/racket/src/schvers.h index f94b23cfa4..da43a938bf 100644 --- a/racket/src/racket/src/schvers.h +++ b/racket/src/racket/src/schvers.h @@ -13,12 +13,12 @@ consistently.) */ -#define MZSCHEME_VERSION "6.4.0.5" +#define MZSCHEME_VERSION "6.4.0.6" #define MZSCHEME_VERSION_X 6 #define MZSCHEME_VERSION_Y 4 #define MZSCHEME_VERSION_Z 0 -#define MZSCHEME_VERSION_W 5 +#define MZSCHEME_VERSION_W 6 #define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y) #define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W)