diff options
| author | 2026-10-14 09:09:21 +0330 | |
|---|---|---|
| committer | 2026-10-14 09:09:21 +0330 | |
| commit | dc7f7407e08f54e4a2a3c1d1723b2a7d6959532d (patch) | |
| tree | d1de9f471a99951c57896f85b5e5523eeb96cee1 /docs/history/17-o3-boundaries | |
| parent | todo: sync docs, examples and fixtures with the include format, and test acto... (diff) | |
docs: archive the frozen stage code as one compressed tarball
docs/history kept six stages with a full copy of the project under code/,
3.8 mb of sources duplicated from stage to stage and already superseded. store
them as docs/history/code-snapshots.tar.gz, 0.66 mb, and extract one in place
to read it. every stage's notes.md stays browsable, and the index says where the
code went and how to get it back.
the top-level README points at the archive too. its other two links into
docs/history, 21-micro and 35-bench, were notes that were never kept and do not
resolve; the index now records that.
Diffstat (limited to 'docs/history/17-o3-boundaries')
93 files changed, 0 insertions, 12859 deletions
diff --git a/docs/history/17-o3-boundaries/code/README.md b/docs/history/17-o3-boundaries/code/README.md deleted file mode 100644 index 7b91935..0000000 --- a/docs/history/17-o3-boundaries/code/README.md +++ /dev/null @@ -1,528 +0,0 @@ -# tinyvm zygote: notes and transcript - -a tiny stack cpu that started as a c89 code golf entry and ended up as a self-hosting runtime. a small native core runs vm code: jit-compiled to arm64, compiled through llvm on other hosts if you build with it, or interpreted. the genome it boots is a compiler for zc, a c-like language that keeps the forth habits. the compiler lives in vm memory next to your program, and your program can call into it, patch its tables, add syntax to it and compile new code while it runs. heap objects carry an ownership tag (u, m or d) that a static analyzer inside the compiler checks, with deterministic frees at scope ends and a mark-sweep collector underneath. types are a compiler primitive, with structs, generics, reflection and an optional typechecker. a program can also wire up to 512 custom opcodes into the cpu (virtual enhancements), which the jits inline as native code. and code marked `o3` skips the stack machine: the core compiles it as a whole region, with its variables in registers. - -this folder has the latest code. `history/` is the scrapbook: notes for every stage, plus frozen code from the stages that still have it. - -## files - -`core.c` is the native core and the only native code at runtime: the arm64 jit, the llvm backend (behind `-DZYLLVM`), the portable interpreter, the enhancement unit (recipe parser, vm-code lifter, optimizer and lowering) and the o3 region compiler. `src/rt.zc` is the runtime (i/o, the native division enhancements, the heap and the collector) and `src/compiler.zc` is the compiler, both written in zc. together they are the genome. `zc0.c` is stage 0 of the bootstrap, a compiler in c for the subset of zc that `compiler.zc` is written in. `tools/build.zc` makes the resident compiler compile its own source into a fresh image, and `mkgenome.c` turns that image into `genome.h`, which is generated and checked in. `examples/` has the small ones (hello, factorial, echo, self-patching code, an owning list, a repl, a typed program, an enhancement demo) and some bigger proofs of concept: - -- `mandel.zc`: the mandelbrot set in 16.16 fixed point, with the fixed-point multiply wired in as a custom opcode. -- `bf.zc`: a brainfuck compiler. it turns brainfuck into zc source, has the resident compiler compile it, and runs it (native code on the jit). it takes a program after a backtick, or runs hello world. -- `dump.zc`: prints any heap struct, nested ones included, with no printing code, by walking its type through reflection. -- `tree.zc`: a binary search tree whose nodes own their children. there's no `free` anywhere, and the live object count drops back to 0 when the root's block ends. -- `lang.zc`: grows the language while it compiles: a `|>` pipe operator (one table entry, since on a stack machine it's just `call`), `unless`, an `assert` that knows its source line, and `times n { }`. -- `staged.zc`: writes a polynomial as source with its coefficients baked in, compiles it while running, and finds it by name. -- `quine.zc`: prints its own source. -- `life.zc`: conway's life on a typed 2d board, with a glider wrapping around a torus. -- `primes.zc`: an o3 sieve over a fixed array, the primes gathered into a growable one, then twin primes and the widest gap. - -`tests/` has feature tests, `tests/errors/` (programs the lifetime analyzer has to reject), `tests/typeerrors/` (programs the typechecker has to reject) and `tests/langerrors/` (o3 and array misuse). each of those starts with the message it expects, and `tests/runerr.sh` runs a folder of them. `test.sh` does the whole bootstrap and runs everything on all three backends. `bench.sh` times o3 against plain code on each backend. `history/` is the scrapbook. - -## build - -``` -cc -O2 core.c io_linux.c -o zy # io_linux.c provides Q, G and J -./zy <examples/hello.zc -cc -O2 -DZYLLVM $(llvm-config --cflags) core.c io_linux.c -o zy $(llvm-config --ldflags --libs) -``` - -on arm64 the first line builds the jit, anywhere else the interpreter. the second line builds the llvm backend (non-arm64, or arm64 with `-DZYINTERP`). `-DZYINTERP` forces the plain interpreter. `J` is a `char` by default, so compile with `-DJTYPE=int` if yours is an int. the source ends at eof or at a backtick, and anything after the backtick stays unread for the program itself. environment: `ZYTRACE=1` logs translations, installs and the optimized enhancement code on stderr, and on the llvm build `ZYHOT=n` sets how many runs a block needs before it gets compiled (default 5000) and `ZYPASSES` the llvm pass pipeline (default `default<O2>`). `ZYNOLLVM=1` turns the llvm tier off. with `ZYTRACE=1`, `ZYO3DUMP=1` also prints every o3 block's micro-ops. - -regenerating the genome after changing `src/`: - -``` -cc zc0.c -o zc0 && cc mkgenome.c -o mkgenome -cat src/rt.zc src/compiler.zc | ./zc0 >genome.h # stage 0, from c -cc -O2 core.c io_linux.c -o zy -(cat tools/build.zc; printf '`'; cat src/rt.zc src/compiler.zc) | ./zy | ./mkgenome >g.h -mv g.h genome.h && cc -O2 core.c io_linux.c -o zy # now built by itself -``` - -run the last two lines once more and `genome.h` should come out byte for byte the same. `test.sh` checks that, on every backend. - -## zc, the language - -it reads like c. underneath every value is a 32 bit word and memory is word addressed, so `p + 1` is the next word whatever `p` points at, and strings are one char per word with a 0 at the end. types are optional: untyped code is typed `word`, which goes with anything. - -``` -const N = 10; -[N]int table; // a global array -int fib(int n) { if (n < 2) return n; return fib(n - 1) + fib(n - 2); } -fn main() { - for (int i = 0; i < N; i++) table[i] = fib(i); - let sq = { let t = table[5]; t * t }; // a block is an expression too, its last line is its value - let x = asm { 2 3 + }; // raw vm code, leaves one value - putn(sq + x); putc(10); - return 0; -} -``` - -declarations are c-style, type first: `int a = 1, b;`, `*node p = new(node);`, `[4]char buf;`, `point origin;`. `let` declares without a type: it infers pointer, struct and function types from the initializer and keeps numbers as plain words, and `let a[10];` is an untyped array. statements are declarations, `if`/`else`, `while`, `for`, `switch`, `break`, `continue`, `return`, `{ }` blocks, `asm { }` and expressions. `switch (e) { case 1, 2: ... default: ... }` takes constant labels, and its cases don't fall through: each ends where the next begins, and `break` leaves early. operators are c's with c's precedence, including `c ? a : b`, plus `p.x` and `p->x` (the same thing: `.` goes through a pointer on its own), `e as T` to change a type without changing the bits, and the casts below. comparisons and `&& ||` give 0 or 1. `/`, `%` and `<<` compile to native enhancement opcodes. character literals, `0x` hex and the usual escapes are there. - -functions are declared like c, return type first: `int f(int x)`, `*node.u make()`, `.u grab()` (a tag on its own), `void log(*char s)`. `fn f(a, b)` is the untyped form, returning a word. a generic function lists its type parameters after its name, `T first<T>(*list<T> l)`, the same place a call gives explicit ones, `first<int>(l)`. the return type can use them before they're declared: while it's read, an unknown name is taken as a type parameter, and the list after the name has to confirm it. function types are written the same way, `int(int, *char)`, and `fn(int)` for one that returns a word. the earlier `fn f(...) -> T` spelling is gone. - -arrays come in three kinds. `[n]T` has its size in the type and lives in place. `[]T` is a growable array: a small handle object that owns its items, made with `new([]T)` or `new([]T, n)`, indexed with a bounds check, and changed with `push(a, x)`, `pop(a)` and `resize(a, n)`. `len(a)` works on both (for `[n]T` it's the constant) and `cap(a)` gives the room before the next grow. `fixed []T` is a `[]T` that can't change size: `new(fixed []T, n)` needs the length, and `push`, `pop` and `resize` on it are compile errors. a `fixed []T` can't be passed where a `[]T` is expected, the other way round is fine, and a constant index outside a `[n]T` is caught at compile time. the items belong to the array, so freeing it frees them, and objects stored into a `[]*T` are its children like any container's. - -a unit is read whole and scanned for function signatures before it compiles, so calls can come before definitions, tags included, and prototypes are optional. `main` runs after the whole program has compiled. every function returns one word, 0 if it falls off the end. - -builtins from the runtime: `putc`, `getc`, `eof`, `puts`, `putn`, `halt`, `strlen`, `streq`, `wcopy`, `wfill`, `new`, `new_t`, `new_raw`, `free`, `gc`, `isobj`, `osize`, `typeof_obj`, `live_objects`, `install`, `zdiv`, `zmod`, `zshl`. - -## memory model: u, m and d - -`new(n)` or `new(T)` gives back a fresh object. bind it to a local and the local owns it, tagged **m**. tags live on local variables and parameters, the analyzer follows them through the code, and the compiler inserts `free` calls where owned objects die. a tag is written after the type, `*node.u p`, or alone, `.d x`. `u`, `m` and `d` are reserved words. - -**m** means the object belongs to this block and has to be used in it. you can lend it to callees as often as you like, and when the block ends it's freed. an m object that's never used anywhere in its block is an error. - -**d** means the object is going down. the first time it's handed to a lower scope its life here is over: passing it to a `.d` parameter, or touching it inside an inner block, which then owns it as m and frees it when that block ends. using it afterwards is an error, and so is ending the block with a d object that never left. - -**u** means the object is going up. it has to leave this block for the one above, where it arrives as m. it leaves through `return` (the function's return type has to carry `.u`, like `*node.u make()` or just `.u make()`), as the value of a block expression, or by assignment to a variable of the directly enclosing block. letting it fall out of scope, or throwing away a u result, is an error. - -recasting is multiplication by the tag: `u*x`, `d*x`, `m*x`. it only goes away from m: m can become u or d (and u and d can swap), but nothing goes back to m in the same scope. a declaration can carry a tag too, `.u r;`, and then whatever lands in it gets that tag. - -parameters: an untagged parameter is m from the caller's side, a lend, and the callee sees a plain word. `.m` makes it a checked borrow: the callee can read and write it but can't free it, return it, recast it or store it anywhere. `.d` hands the object over, and it arrives as m. - -``` -*int.u box(int v) { *int b = new(int); *b = v; return u*b; } -fn add(*list l, *int.d item) { l.items[l.len] = d*item; l.len++; return 0; } -``` - -containers own what you store in them. `p[i] = c` or `p.f = c` needs `c` to carry the same tag as `p` (or be a fresh object), and from then on `c` follows `p`: if `p` is recast, so is `c`, if `p` is given away `c` goes with it, and when `p` is freed its children are freed too. a child can't be recast or given away on its own. storing into an object you only borrowed gives the child away: it's dead here afterwards, and the caller's object owns it. the runtime records the owner in the child's header, so freeing a container frees exactly the objects it owns. - -globals, plain pointers and arrays aren't tracked. storing an owned object there needs `d*`, and the mark-sweep collector takes it over. a fresh object can go straight in. - -where paths join (after an `if`, a loop, a `switch` or `?:`) every variable has to be in the same state on every path that reaches the join, with one exception. a variable that became d, or was given away, on some path is dead afterwards, and the compiler frees it on the paths where it's still alive, on their way in. a loop's exit state is the join of its `break`s and its normal exit, so giving something away and breaking is fine. what a loop can't do is give something away on a path that comes back around to the top, since the next pass would use it dead. a u object doesn't get the dead treatment: it still has to leave. - -### the analyzer - -it runs inside the compiler on every function, including code compiled at runtime by `eval` and friends, and reports each violation with a line number and the variable's name. the compiler keeps going after errors, up to 20: a syntax error skips to the next `;` or `}` (or the next top-level declaration), and analyzer and type errors just get reported, since the parse is still in step. a unit with errors doesn't run. `tests/errors/` has one small program per rule. to turn it off: `unchecked fn f() { }` for one function, `unchecked { }` for a block, and a top-level `unchecked;` for the rest of the unit (a parse word can also set `check_on = 0`). unchecked code doesn't track anything, so what it allocates belongs to the collector, and checked variables can't be touched from inside an unchecked block. - -## types - -types are a compiler primitive. the compiler keeps them as records in a type area at 0x9C000, hash-consed so the same type is always the same pointer. they stay in memory after compiling, so programs and parse words can look at them. - -``` -struct point { int x, y; }; -struct list<T> { int len; *T items; }; -type num = int; -T first<T>(*list<T> l) { return l.items[0]; } -*list<T>.u mk<T>(int cap) { *list<T> l = new(list<T>); l.items = new(T, cap); return u*l; } -... -*list<*point> ps = mk<*point>(8); // explicit type arguments, or inferred from the arguments -``` - -the kinds are `word`, `int`, `char`, `bool`, `void`, pointers `*T`, arrays `[n]T`, `[]T` and `fixed []T`, function types `int(int, *char)`, structs, generic structs and generic functions. structs and arrays live in place (in a frame, a global or inside another struct), and their value is their address, so they're passed around by pointer. `sizeof` counts words. type arguments have to be one word (a number, a pointer or another parameter), so a generic function is compiled once and works for every instance. indexing scales by the element's size, while plain pointer arithmetic stays in words, like b. `new(T)` and `new(T, n)` stamp the type into the object's header. - -### reflection - -`typeof(e)` and `typeof(T)` give a type record and `sizeof(...)` its size. both work on any expression, which is compiled dry and never runs. at runtime: `tkind(t)` (one of the `TY_` constants), `tsize`, `tname`, `tlen`, `tnfields`, `tfname(t, i)`, `tftype`, `tfoff`, `tret`, `tnparams`, `tparam`, `tparamtag` (the u/m/d tag of a parameter), `tretu`, `tnargs` and `targ` for generic instances, and `tprint(t)`. `sigof(f)` gives the type of a function by address (untyped ones get a signature built from their arity and tags), `sigofs("name")` by name, and `typeof_obj(p)` reads the type stamped on a heap object (0 for an o3 object that hasn't been fattened yet). - -### the typechecker - -off by default. `typecheck on;` turns it on for what follows and `typecheck off;` turns it back off (a parse word can flip `tc_on`). it checks initializers, assignments, arguments (unifying generic parameters), return values, arithmetic, comparisons, dereferencing, indexing and calls. `word` matches anything, numbers mix with each other, a literal 0 is a null pointer, and arrays decay to pointers. it stops at the first error, printing what it expected and what it got. `tests/typeerrors/` has one per rule. some things are checked whatever the setting, because the compiler needs them to generate code: field names, and field access on something that isn't a struct. - -## virtual enhancements - -the cpu has room for 512 custom opcodes (22 to 533), and opcode 21 (`%` in asm) installs one at runtime. it's the closest a soft cpu gets to rewiring itself. an enhancement takes up to 8 inputs off the data stack and leaves up to 8 outputs, and it's written one of two ways: - -``` -enhance clamp(x, lo, hi) micro "x = max x lo; x = min x hi"; -enhance 2 divmod(a, b) micro "r2 = sdiv a b; r1 = srem a b; r0 = r2"; // the number is how many outputs -enhance cube(x) vm { 0 $ 0 $ * * }; -enhance noisy(x) vm { 0 $ . } else soft_noisy; // can't be lifted (it does i/o), so calls use the fallback -``` - -a micro recipe works on registers `r0`..`r15`, which the inputs arrive in (also under the parameter names), and the outputs leave from `r0` up. the micro-ops are `li mov add sub mul sdiv udiv srem urem and or xor shl shr sar neg not lt ltu eq ne min max minu maxu mulhs mulhu clz abs sel ld st`. a `vm` body is straight-line vm code that gets lifted by running it symbolically. both turn into ssa, and the core's optimizer folds constants, simplifies algebra, removes common subexpressions and dead code, and turns division by a constant into a multiply-high sequence (`ZYTRACE=1` prints the result). the arm64 jit then inlines the code at every use with registers allocated, the llvm backend inlines it as ir, and the interpreter runs the optimized list. if something doesn't fit in registers, the jit calls the interpreter for that op. when literals feed an enhancement's last inputs (`x / 7` is `x 7 idiv`), the arm64 jit specializes that use on them: the literals become constants, the optimizer runs again, and `x / 7` turns into a multiply-high and two shifts instead of a divide. - -an enhancement is called like a function when it has one output, or by name from asm. `enhance` installs at compile time, so the wiring is there before `main` runs, and a parse word can use it right away. an image installs its own enhancements when it boots, from its symbol table. that's how `/`, `%` and `<<` work: `rt.zc` declares `idiv`, `imod` and `ishl` as one-instruction recipes. `install(desc)` is the raw interface, and its descriptor format is documented in `core.c`. stores done by an enhancement don't invalidate compiled code, so use them for data. - -this replaces my first plan for enhancements, which compiled c or llvm ir sources at runtime. part of that reply got stopped by a safety check, and once it turned out llvm was meant for portability, it moved into the backend below instead. - -## o3 - -`o3` marks code for the optimizing tier. it goes on a function, a block or a single variable: - -``` -o3 int sum(fixed []int a) { int s = 0; for (int i = 0; i < len(a); i++) s += a[i]; return s; } -fn main() { - o3 int hits = 0; // one o3 variable - o3 { for (int i = 0; i < 1000; i++) if (i % 7 == 3) hits++; } - ... -} -``` - -what it gives up, as asked: variables declared in o3 code must be typed (`let` and untyped parameters are errors), they have no address (`&x` and naming one from `asm` are errors), `new` in o3 code returns raw memory with no type stamp and no zero fill (`new_raw`), and an o3 function skips the frame stack check in its prologue. what it gets: the compiler hands each o3 function body and each o3 block to the core as a region (install kind 2: the range of vm words plus its typed scalar variables' frame slots, each with a register), and the core compiles the region right away. the cpu has 7 registers for variables. a variable takes the one most recently freed by a scope that closed, or the next unused one, so loop counters in sibling loops share a register, and a variable declared when all 7 are busy stays in memory. a register shared by several slots gets written back to all of them when the region exits, and they never hold different live values, since their scopes don't overlap. - -inside the core, a region is cut into basic blocks at jump targets, branch fallthroughs and call return points. each block is lifted to ssa the way enhancements are: the vm stack becomes values, and only what's still on it at the end of the block is written to memory. the frame pointer and the promoted slots become variables that live in registers across the whole region, so `i++` on an o3 int is one add. enhancements are spliced into the block, so `/`, `%` and `<<` become one instruction or a magic-number sequence. every block then goes through the same optimizer (folding, algebra, cse, dce, division by constants). in o3 code `a[i]` on a `[]T` is compiled inline with its bounds check (`outside(i, len)`, one enhancement), and `len(a)` is a load. a `fixed []T` in an o3 variable does better: its items pointer and length can't change, so the compiler gives it two hidden o3 variables holding them. they're loaded when the region starts and whenever the array variable is assigned, so indexing is a compare against a register and an indexed load, with no loads through the handle. - -the backends: on arm64 the region becomes one piece of native code. variables sit in w0..w7, block values in w8..w14 and w26..w28, constants are folded into instructions where they fit, loads from a fixed address are one `ldr`, and blocks branch to each other directly with no dispatch and no stack checks. on the llvm build the region becomes one function, with the variables in allocas that mem2reg turns into ssa across blocks, and it goes through llvm's O3 pipeline. on the plain interpreter, a small region interpreter runs the optimized blocks with the variables in locals. - -calls, returns, jumps out of the region, i/o, `install`, a store to the frame pointer and anything else a block can't lift all leave the region: the variables are written back to the frame first, so outside code sees ordinary memory. a call's return point is an entry, which loads them again. stores inside a region still check the coverage map, so writing to compiled code works, and a store into the region's own code drops it (it lifts again at its next entry). to keep variable addresses from waiting on the stack across a branch, assignment to an o3 variable in o3 code evaluates the value first and the address after. the lifter refuses a block that would leave such an address on the stack, rather than miscompile it. single o3 variables outside o3 code are reached through `lfa(k)`, an enhancement for `fp + k`, which the arm64 jit specializes into a load and an add. - -`bench.sh` runs four kernels from `tests/bench.zc` with and without `o3`. milliseconds per run, with start-up and compile time removed by timing 1 run against enough runs to take more than a second (arm64 is under qemu on an x86 host, so only its ratios mean much, and the machine was noisy enough that the small numbers move by 20% between runs): - -``` -backend kernel plain ms o3 ms speedup -interp collatz 324.90 240.61 1.4x -interp sieve 47.08 21.71 2.2x -interp digits 160.89 100.82 1.6x -interp fib 3.48 4.09 0.8x -llvm collatz 47.03 3.34 14.1x -llvm sieve 10.77 0.28 38.9x -llvm digits 18.93 1.45 13.1x -llvm fib 0.87 1.01 0.9x -arm64 (qemu) collatz 323.89 13.04 24.8x -arm64 (qemu) sieve 56.84 1.74 32.6x -arm64 (qemu) digits 147.06 4.17 35.3x -arm64 (qemu) fib 5.19 5.71 0.9x -``` - -fib gains nothing and can lose a little, since every call leaves the region through the dispatcher and comes back in through an entry stub, which costs about what the body saves. - -### leaving o3: fattening - -going into o3 is free: o3 code reads normal objects the same way and ignores their metadata. coming out is where the work is, since an object made by `new` in o3 code has no type stamp and garbage after what was asked for. `new_raw` keeps one hint for later: the header's type word holds -(n + 1), the number of words asked for, so the object stays recognizably raw and its real size is known. - -the compiler fattens at the points where o3 data reaches code that expects the metadata, using the static type it knows there: storing a pointer anywhere other than an o3 variable (a normal local, a global, a field, an element), passing one to a function that isn't o3 (`free` excepted), returning one from o3 code, `push` into a growable array, and, at the end of an o3 block, whatever the o3 variables declared outside it hold. `fatten(p, t)` (in the compiler, so it can read type records) stamps the type, as `[0]T` when more than one element was asked for, zeroes the slack, and then follows every typed pointer, field, array element and growable array element inside, fattening what it finds. objects that are already fat stop the walk, so building a list in o3 costs one stamp per node, and a depth limit of 32 stops cycles through growable arrays. untyped words carry no hint, so pointers kept in `word` variables stay raw until typed code sees them. - -## the llvm backend - -a tiered jit for hosts the arm64 backend doesn't cover. the interpreter counts how often each block start gets reached, and a hot block is translated to llvm ir using the same block rules as the arm64 jit: it ends at call, jump, ret or halt, keeps going past a jz, and literal targets are fused. the ir goes through the O2 pipeline and gets compiled by orc's lljit. stores into compiled words drop the blocks covering them, like on arm64. it pays off for long-running code: a loop-and-recursion benchmark runs about 3.3x faster than the interpreter. short bursty work like the self-compile is slower, since compile time dominates there. `ZYHOT=1` compiles every block, which is a good stress test, and the test suite runs that way too. - -## the heap - -0x40000 to 0x9BFFF, managed by a buddy allocator. the heap is split into aligned power-of-two chunks, every block is a power of two words, and a freed block merges with its buddy whenever that one is free too, so freed space can be reused at any size. (stage 15 fixed a bug here: `release` marked a container free before freeing its children, so a child whose buddy was the container merged into it while the container was still being freed, and corrupted a free list. growable arrays hit it every time, since a handle and its items are often buddies.) allocation finds the smallest free block that fits and splits it down. free blocks sit on a doubly linked list per class, so taking a buddy off its list during a merge is constant time. checked code frees deterministically. under that runs a mark-sweep collector, conservative and non-moving, which handles globals, unchecked code and anything given to it. it runs on `gc()`, which returns how many objects it freed, or when an allocation doesn't fit. the sweep frees through the same merging path. - -## code as data - -the compiler is in memory with your program and every name in it is callable. - -`asm { }` emits raw vm words: numbers push, `-5` pushes a negative, `#n` emits a raw word, one-char tokens from the mnemonic table are opcodes, `:name` defines a label local to the block, enhancement names emit their opcode, and other names push the address of a variable or function. - -`quote { ... }` is a token list as a fresh object: `[n, kind, value, line, kind, value, line, ...]`, so errors inside a macro expansion point at the line the tokens came from, where names, strings and operators are interned pointers (`intern("while")` gets one). `tokens(s)` makes one from a string, and `qdup(q)` copies one. - -`eval(q)` compiles a token list as a function body and runs it. `compile(q)` returns its address instead, `load(q)` compiles top-level declarations, and `evals(s)` runs `eval` on a string. - -parse words: `immediate fn name() { }` runs at compile time whenever `name` shows up as a statement, inside an expression or at the top level. it starts with the current token on its own name and works the compiler directly: `next()`, `peek()` and `peekat(k)` (up to 4 tokens ahead), `tk`/`tv` (current token kind and value), `expect`, `accept`, `expr()`, `stmt()`, `substmt()`, `ptype()`, `emit`, `lit`, `op`, `hole`/`setlit` for jumps, and `here`. `grab()` reads a `{ }` group into a token list, and `feed(q)` pushes a list back into the input, which is all a macro needs. parse words can call `eval` partway through a compile: the compiler saves its state and emits the new function in place with a jump around it. the built-in keywords are entries in the same table, so a parse word called `while` replaces `while`. - -tables: `add_binop("**", 11, "ipow c")` adds or replaces a binary operator with a precedence and its code, written like asm (names resolve when it's used). `add_unop` does the same for prefix operators, and the lexer learns new spellings from both. `mnem` is the asm mnemonic table, `q@!$_~cjzr,?.+-*&|^><%`, and can be rewritten. - -## the bootstrap - -`zc0.c` compiles the subset `compiler.zc` uses (no analyzer, types, quote, parse words or block expressions, but it does lay out `enhance` declarations) into a first genome. that genome compiles `compiler.zc` again on the vm. that's where the real compiler, the analyzer and native division first meet their own source, and `compiler.zc` passes its own lifetime checks. the result compiles itself into identical words, on all three backends, and that's the `genome.h` that ships (84118 words). an image build (`build_image(org, dst)`) compiles with only the image's own names visible (plus keywords and builtin types), writes code meant for one address into another, and appends a symbol table so the booted genome knows its own names and enhancements. - -## the instruction set - -every word is 32 bits. an odd word is a literal that pushes `w>>1` (31 bits, sign extended). an even word is an opcode, `w/2`. there's a data stack and a return stack, both stored inside memory. - -``` -0 q halt 5 ~ swap 10 , in (Q) 15 * mul 20 < less -1 @ load 6 c call 11 ? empty (J) 16 & and 21 % install -2 ! store 7 j jump 12 . out (G) 17 | or 22..533 enhancements -3 $ pick 8 z jz 13 + add 18 ^ xor -4 _ drop 9 r ret 14 - sub 19 > shr -``` - -stack effects: `!` is `(v addr --)`, `$` is `(n -- copy of the nth item)` so `0 $` is dup, `z` is `(cond addr --)` and jumps when cond is 0, `c` and `j` take their target from the stack, and `%` is `(descriptor -- status)`. there's still no div or mod in the base set, because a divider can't finish in one cycle in hardware. an enhancement can add one. - -## memory map and abi - -memory is 1m (1048576) words. it could grow until the host runs out (literals already reach 1g words), but that would mean reserving the jit tables with mmap instead of static arrays, and 1m is plenty for now. - -``` -0x00000.. the program: code, with globals between functions -0x40000..0x9BFFF heap -0x9C000..0x9FFFF type records -0xA0000 frame pointer word -0xA0100..0xBFFFF compiler data: interned names, symbol table, locals, tables -0xC0000.. genome: 0xC0000 entry, 0xC0005 symbol table address, 0xC0006 image end -0xE0000..0xEFFFF frame stack, grows down from 0xF0000 -0xF0000.. return stack, grows up -0xF8000.. mark stack -0xFC000..0xFFFF0 data stack, grows down -``` - -calls push the arguments left to right and the callee's prologue pops them into its frame. locals live in the frame at `*0xA0000 + slot`. every function leaves exactly one word on the data stack. heap objects have a 6 word header: size, size class, flags, a check word, owner, type. - -## how the core works - -registers: x19 holds the memory base, x20 the data stack pointer, x21 the return stack pointer, x22 the translation table and x23 the state block (memory, s, r, table, coverage map, Q, G, &J, store hook, install hook, enhancement fallback). o3 regions also use x26..x28, which the entry stub saves. - -compilation is lazy. the first time control reaches an address, that block is translated from live memory. a block ends at call, jump, ret or halt. a `z` doesn't end it: the not-taken side keeps compiling, which makes superblocks. a literal followed by `c`, `j` or `z` is fused into a constant target. every exit goes through a dispatch stub that checks both stack pointers against their limits (kept in x24 and x25), bounds-checks the target, loads `tab[t]`, and branches straight to it when it's already compiled. otherwise it returns to c, which compiles the block and re-enters. enhancements are inlined: inputs load from the data stack into w0..w15, the optimized micro-ops run in registers with x16 and x17 as scratch, and the outputs go back. an install calls into c and then returns to the loop, which flushes every translation, since code built before the install may have inlined the old version. a flush drops o3 regions too, and they lift again on their next entry. when the loop reaches an o3 entry point, it compiles the region (or reuses it) instead of translating a block. - -self-modification is handled with a byte map of which words some live translation covers. a store checks that byte inline: an uncovered target, the usual case, gets a plain store. a covered target calls the hook, which drops every translation containing that word and makes the jit code return to c at the next instruction, so even patches to the very next word take effect. writing back the same value is a no-op. if the 16 mb code buffer fills, everything is flushed. - -the stacks are checked. the data and return stacks are checked at every block exit on all three backends, so the cost is a couple of compares per block rather than per push. a block pushes at most about 1024 words, which the data stack limit leaves room for. overflowing either one stops the cpu with `zy: data stack overflow` or `zy: return stack overflow`. the frame stack is checked in every function prologue, which resets the frame pointer and stops with `zy: frame stack overflow`. - -platform: the darwin path uses `MAP_JIT`, `pthread_jit_write_protect_np` and `sys_icache_invalidate`. linux uses rwx mmap and `__builtin___clear_cache`. only linux arm64 has actually been run, under qemu. the darwin path follows apple's documented recipe but hasn't been tested, and under the hardened runtime it also needs the allow-jit entitlement. every host shares the same semantics: shift counts wrap at 32, stores outside memory are ignored, loads outside memory read 0, and jumping outside memory or to an unwired opcode halts. - -## test results - -`test.sh` passes all 131 checks on x86-64 linux: the fixpoint, an up-to-date `genome.h`, and then every example and feature test on the interpreter, on the arm64 jit under qemu, and on the llvm backend, all with identical output. it also covers joins and fixup frees (with a leak count), `switch` and `?:`, the buddy allocator, several errors in one run, all three stack overflows, growable and fixed arrays, and `tests/o3.zc` (loops, recursion, calls inside loops, `switch`, `&& ||`, structs through pointers, arrays, division by constants, and a function with more variables than registers), whose output matches the same file with `o3` taken out, register sharing between scopes with a cached fixed array, and fattening (a list returned from o3 typed all the way down, a struct assigned out of an o3 block and its pointer field). it checks that every o3 region in that test lifts, and gets compiled on the jit and on llvm, that the o3 bounds check fires, and that all 22 programs in `tests/errors/`, all 10 in `tests/typeerrors/` and all 9 in `tests/langerrors/` get rejected with the expected message on each backend, that llvm agrees when it compiles every block, and that the self-compile matches byte for byte on all three. separately, 80000 random divisions through enhancements matched the software routine, covering divide by zero, INT_MIN/-1, negatives and the magic-number path for constants. - -## open ends - -fixed in stage 13 (details in `history/13-gap-fixes`): branch and loop joins, free lists that never merged (now a buddy allocator), missing stack checks, stopping at the first error, macro line numbers, required prototypes, `d*` for storing into borrowed objects, `**` declarations, and `?:` and `switch`. still open: - -**untracked aliases.** the analyzer only follows bare variable names, so `let q = p + 0;` or `let c = list[1];` is a plain word nobody tracks, and it dangles once the owner is freed. two cheap fixes, and they combine well. at runtime: don't reuse a freed block right away. `free` would put it on a quarantine list, and the collector's next sweep only releases quarantined blocks that no word points at. the conservative mark already finds such words, so that's maybe 30 lines in rt.zc. a stale alias then reads a dead but intact block, and a second free through it is a no-op, because the header's flags say free. at compile time: now that there are types, a pointer-typed value computed from a tracked variable (`p + k`, `p.field`, `p[i]` when the element is a pointer) can carry a "borrowed from p" mark into the local it's stored in. using that local after `p` dies becomes an error. that's the same machinery children already use. - -**the conservative collector.** it scans the whole data stack region, because the vm can't read its own stack pointer, and stale words keep garbage alive a little longer. the fix is one base opcode that pushes the data stack depth, which is trivial in hardware since the register already exists. then the collector scans only the live part. zeroing a frame in the prologue would do the same for the frame stack, at a few words per call. - -**coarse invalidation.** a store to a covered word rescans every block, and an install flushes everything. three fixes, in order of payoff. first, index blocks by page (say 64 words): a covered store only looks at the blocks touching its page, and dropping a block only rebuilds the coverage bytes for that block. second, record which enhancement slots each translation inlines, so an install only drops those. third, on llvm, give each block its own resource tracker, so dropped code actually gets freed. - -**automatic tiering.** o3 is the explicit version of what you asked about in message 14. doing it without the keyword means a run counter per block (about 4 instructions per block entry) and, for a hot loop, finding its region and its variables without the compiler's help. the hard part is the variables: o3 can keep them in registers because the compiler promises nothing takes their address, and code without that promise would need the lifter to prove it. - -**o3's own gaps.** calls always leave the region through the dispatcher, so call-heavy code gains nothing (fib above). a direct call from one compiled region into another, with the variables spilled only for the slots the callee can't see, would fix most of that. a value that stays on the vm stack across a branch (like an index across its bounds check) goes through memory, since blocks only share variables. the core's own optimizer works one block at a time (no loop-invariant motion or cross-block cse); llvm does that on its build. regions aren't built into images, so `rt.zc` and the compiler can't use o3. and o3 code that rewrites its own region sees the change at the next entry, not right away. - -**generics are erased.** a generic function is compiled once, so the type stamped by `new(T)` inside it says `T`, and type arguments have to be one word. - -**the rest.** the prescan only knows tags, not types, so a call to a typed function that's defined further down gets `word` as its result type until the definition shows up. the llvm backend compiles one module per block, so it warms up slowly. stores done by enhancements don't invalidate compiled code. a parse word that changes the syntax can confuse the prescan. it only records signatures, though, and a real definition always overrides what the prescan guessed. - ---- - -## transcript - -each of my messages is quoted exactly, followed by a summary of the reply. - -### 1 - -> codegolf a tiny cpu vm in C89. the goal is to achieve the lowest character count possible. include an assembler as well (scored separately) and a hello world program (not scored, but elegance and simplicity is a bonus) -> it must be capable of re-entrant code and a realistically workable instruction set. - -**summary:** a two-stack forth-style machine. the vm was 384 bytes: one ternary chain inside `while(o=m[p++])`, the top two stack items cached in `a` and `b`, the program loaded with `read(open(...))` so it needs no headers, and both stacks inside the 65536-word memory. it had 22 opcodes including div and mod, a two-word literal, and jump/call targets popped from the stack. the assembler was 348 bytes and two-pass, using `strcspn` instead of `strchr` so the implicit int return stays safe on 64-bit. hello world was a pointer loop over a string with a zero terminator. re-entrancy was shown with a recursive factorial plus a recursive decimal printer. - -### 2 - -> your cpu should also be realistically close to hardware (translating it to logical circuitry hardware should be fairly easy) and sport an acceptably fast execution (if hypothetically ported to hardware, not in software) -> -> assume i/o is handled by two external functions, `char Q()` (getchar) and `void G(char)` (putchar) and a state variable J (boolean, shows if input is empty). -> -> don't be afraid to use macros. - -**summary:** no reply was sent to this message at the time. it was answered together with message 3. - -### 3 - -> pro tip: if you define a macro as `!o--`, you can save 2 characters per if condition -> oh and btw, newlines are free - -**summary:** used the tip as `#define X !--o?`, with pre-decrement because opcode 0 (halt) is already handled by the loop, and with the `?` folded into the macro and free newlines used as separators. the hardware-oriented redesign: bit 0 of each word is a literal flag, so literals take one cycle like the j1 cpu. div and mod were dropped because they can't finish in one cycle and were replaced by an arithmetic shift right, giving 8 alu ops that decode from 3 bits. every instruction does a fixed amount of work with at most one data memory access, and call and jump share a datapath (`r-=o`). i/o now goes through `Q`, `G` and a `?` op that reads `J`. the result was the vm at 339 bytes and the assembler at 346. the final golfed code: - -```c -#define X !--o? -int m[1<<16],p,s=65e3,r=6e4,o,a,b;main(c,v)char**v;{read(open(v[1],0),m,s);while(o=m[p++])a=m[s],b=m[s+1],o&1?m[--s]=o>>1:(o/=2,X -m[s]=m[a]:X -m[a]=b,s+=2:X -m[s]=m[s-~a]:X -s++:X -m[s]=b,m[s+1]=a:(o-=2)<1?m[r]=p,r-=o,p=a,s++:X -p=b?p:a,s+=2:X -p=m[--r]:X -m[--s]=Q():X -m[--s]=J:X -G(a),s++:(m[++s]=X -b+a:X -b-a:X -b*a:X -b&a:X -b|a:X -b^a:X -b>>a:b<a));} -``` - -```c -char t[9999][99],*o="q@!$_~cjzr,?.+-*&|^><",*q;A[9999],k,i,j,n,P;E(y){n++;write(P,&y,4);}V(char*s){for(j=k;j--&&(*t[j]-58||strcmp(t[j]+1,s)););return~j?A[j]:atoi(s);}main(){while(~scanf("%s",t[k]))k++;for(;P<2;P++)for(n=i=0;i<k;i++)if(*(q=t[i])==34)while(*++q)E(*q);else*q==58?A[i]=n:!q[1]&&o[j=strcspn(o,q)]?E(j*2):*q==35?E(V(q+1)):E(V(q)*2+1);} -``` - -### 4 - -> now let's move in stages. write a compiler that takes this assembler's code and converts it into darwin arm - -**summary:** an ungolfed c89 compiler from vm assembly to darwin arm64 assembly. every word got its own label, the image was emitted as an addressable data array, x19/x20/x21 held the memory base and the two stack pointers, and computed jumps went through a table of offsets. a literal followed by a jump became a direct branch. `Q` and `G` went through `sxtb`, since char is signed on apple arm64, and `J` was read with `ldrb`. it was verified by assembling with llvm-mc for darwin, then rewriting to linux with sed and running under qemu, where it matched the vm byte for byte. this version couldn't handle self-modifying code. - -### 5 - -> can you write the assembler in assembly and pair the code with the assembly and the assembler so that it can re-wire itself at runtime? or maybe include an interp for self-modification, otherwise fns are exec'd native - -**summary:** both. `aslib.s` is the assembler written in vm assembly as a library (`a.src`, `a.dst`, `a.org`, `a.lab`, then `a.run c`), and with `asmain.s` it's a 568-word standalone assembler. it's byte-identical to the c assembler and reaches a fixpoint when assembling itself. this is also where the `:;comment` trick came from. the compiler became a hybrid. the image is split into basic blocks, each block counts how many of its words differ from the original image, and stores into code go through a slow path that updates the counters. clean blocks run native, while dirty blocks and anything past the image run in an interpreter compiled into the same binary, which hands control back to native code whenever it lands in a clean block. `cc -t` printed `[` and `]` at each switch. the demo rewired a function at runtime to point at freshly assembled code and then restored it. - -### 6 - -> which one do you like more? and which is more performant? -> keep that one, then port to using llvm ir so that it can be platform independent - -**summary:** no reply was sent at the time. the llvm port was dropped when message 7 changed direction. the question was answered at the start of the reply to message 7: the hybrid was the favorite because it kept the vm's semantics exact. the plain compiler was slightly faster on code that never rewrites itself, but it silently ran stale code once anything did. the zygote beats both. - -### 7 - -> can you make it a zygote approach? -> a minimal core loads first, reads and compiles the program (either wholly or partially, for speed) and replaces it with itself. so it's like a jvm but self-contained and on the same level as itself, where the assembler can itself be modified in-memory to assemble different code. for this we need to ditch llvm - -**summary:** the current design, described above. the native core only does jit and glue. it loads the genome (boot loader + assembler, both vm code) at 48000. the boot loader reads source until eof or a backtick, assembles it at 0 and jumps there. compilation is lazy per block, straight from live memory, with superblocks through `z`, fused constant targets, and dispatch chained through a table. invalidation uses the coverage byte map plus a store hook, so self-modified code gets retranslated instead of interpreted. the resident assembler sits at fixed addresses, and `repl.s` rewrites its mnemonic table so `p` means out, then assembles and runs input chunks in a loop, overwriting the same address each time. verified under qemu on linux arm64, including the self-hosted assembler running on the zygote. about 4x faster than the golfed interpreter. - -### 8 - -> damn dawg you made an entire baremetal os? -> -> let's move to cowork. pack everything up alongside a transcript of every message i've sent and your own notes on what you've implemented in an md file, with the code, so i can move it. - -**summary:** not quite an os. it's a userland runtime. it still runs on darwin or linux, uses their mmap for executable memory, and gets i/o from the host through `Q`, `G` and `J`. there's no scheduler, no drivers and no hardware access, so a closer description is a tiny self-hosting jit, in the spirit of a jvm. the first packing attempt bundled every stage's code with a full test script. - -### 9 - -> nono we don't need all the code, just the recent ones. my msgs and your summaries are more important and all should be there - -**summary:** this package. only the zygote stack plus its examples and tests are included, and earlier stages appear only as summaries. the golfed reference vm and assembler are inlined under message 3, because they define the instruction set. - -### 10 - -> we're gonna make this thing cooler. make the syntax C-like whilst still keeping the forth capabilities like super-homiconicity and the likes, add explicit and automatic gc (use a fast approach) and memory management that looks like this: -> every heap object has a classifier u m d, up middle down. up means the object will die at the scope above (becomes m when returned to the parent scope, and it must be returned and cannot be discarded). m means it must be used here and can be passed down (but once it's recasted as u or d it can't be casted back to m in this scope). d means the variable is passed down, and its lifetime ends after it's given for the first time to a scope lower than the current one. -> ask me questions to clarify this approach, then add it to the code and also add a simple static analyzer which checks these lifetimes - -my answers to the clarifying questions, exactly: - -> scope: every { } block -> -> lending an m object to a callee: borrow, no escape (Recommended) -> -> storing a heap object inside another object or a global: container gets ownership. putting a value inside a container requires its umd to match the parent, and from then on, the umd for that is also inherited from the parent (as in if a parent m is casted to d, so is the child heap object) -> -> gc: free lists + mark-sweep (Recommended) -> -> where the compiler lives: resident in vm code. bootstrap it step by step, by writing a c-like in core.c and then rewriting the compiler inside the c-like. also bring back llvm if you think it'll make your job easier -> -> homoiconic features: parse words, quoted code blocks, inline stack code, patchable compiler tables -> -> how an inner block hands a u object up: expression and assign, both -> -> when the analyzer runs: inside the compiler but can be turned off if the code requests it - -**summary:** the genome is now zc, a typeless c-like language, described above. stage 0 is `zc0.c` (kept as its own file next to core.c rather than inside it, so the runtime still has one native file), and the resident compiler is `src/compiler.zc` plus `src/rt.zc`, which reached a byte-identical fixpoint compiling itself. llvm wasn't brought back, since the target is the vm itself. memory went to 1m words, and core.c gained an interpreter for non-arm64 hosts. calls i made without asking: tags go on signatures (`fn f(m a, d b) -> u`) and recasts are `x as u` / `x as d`; a d object touched inside an inner block moves into that block; storing into a borrowed object, a global or untracked memory needs `as d`; handing a u up by assignment only reaches the directly enclosing block; unchecked code gives its objects to the collector. the old asm genome moved to `legacy/`. - -### 11 - -> progress report? -> add types please :) -> mostly as a compiler primitive though, plus type-inspection via reflection -> and a small optional typechecker (default off) -> oh and keep the stuff you write as a history scrapbook -> if it helps, add a path to the hardware which is called "virtual enhancements", and allows up to 512 custom operations to be compiled down via jit into hardware-level speeds and interoped directly into a fast path in the vm to become essentially custom wiring. useful for division and other stuff as a dynamic runtime path - -my answers to the clarifying questions, exactly: - -> types: words + structs + generics -> -> reflection: runtime type of heap objects, function signatures, typeof at compile time -> -> how an enhancement is defined: either actual C or llvm ir code or vm code or micro-ops passed through an optimizer. since for example, micro-ops and vm code are not sufficient for optimizing things like division -> -> scrapbook: notes + code snapshots - -**summary:** the progress report said the previous round was finished and shipped. i then laid out a plan where the core would compile c or llvm ir enhancement sources at runtime with the host toolchain and load the result. part of that reply was stopped by a safety check before it finished, so i stopped and checked in instead of building it. - -### 12 - -> also make the umd syntax like `type.u name`, and casting is multiplication `u*name` -> ideally i'd prefer memory to be unlimited words growing until system oom, but 1m is fine -> core.c plain interp is also nice -> zc0.c own file is fine -> i mentioned llvm for portability to non-arm targets -> yes, d object semantic that was intended -> u object hands up one block and becomes an m, that's fine. the code can make it a u or a d or whatever -> explain your gaps more -> -> wait why safety check? what's wrong with that - -my answers to the clarifying questions, exactly: - -> declarations: c-style, var -> let -> -> tags on untyped values and the names u, m, d: names reserved, bare .u allowed, untype is m by default -> -> llvm: llvm jit backend (Recommended) - -**summary:** on the safety check: nothing was wrong with the request. my best guess was that it tripped on the plan for a program inside the vm handing source text to the system compiler and loading the result into the running process, since that pattern also shows up in malware. with llvm meant for portability, that path wasn't needed. the gaps got the longer explanations that are now under open ends above. then the round itself: - -**syntax.** declarations are c-style (`int x`, `*node.m p`), `let` replaces `var` for untyped and inferred declarations, tags are `.u .m .d` after the type or on their own, recasts are `u*x` / `d*x` / `m*x`, `u m d` are reserved, and an untagged parameter counts as an m lend. - -**types.** a compiler primitive: hash-consed records with structs, generic structs and functions, fixed arrays, function types, `typeof`/`sizeof`, `as` casts and a reflection api, with object headers carrying their type. the typechecker is off by default and turned on with `typecheck on;`. - -**virtual enhancements.** opcode 21 installs, 22 to 533 are the slots. micro-op recipes and lifted vm code go through an optimizer in the core (folding, cse, dce, multiply-high division by constants) and get inlined by both jits. the language's own `/ % <<` now run on them. - -**backends.** a tiered llvm backend (`-DZYLLVM`) for non-arm hosts. - -**bootstrap and history.** it still reaches its fixpoint on all three backends. `history/` holds notes for every stage and code from stages 7, 10 and this one (in 11-types-enhancements). - -### 13 - -> gaps -> 1. when there's a var state change to d, mark that var as dead by default for any other scope that can access it afterwards. u is fine since it just returns -> 2. any suggestions for a cheap fix? -> 3. it's fine, rare occurrence (probably?), suggest a fix -> 4. fix that -> 5. suggest a fix -> 6. fix -> 7. fix - -**summary:** the numbers followed the gap list from my previous chat message. here's what each one got. - -**1. joins.** a variable that became d, or was given away, on any path is dead after the join, and fixup code frees it on the paths that still own it. a loop's exit state is the join of its breaks and its normal exit. giving something away on a path that loops back is still an error. u and borrows don't get the dead treatment. - -**2, 3 and 5.** suggestions only, now under open ends: a quarantine on reuse plus "borrowed from" marks on pointer-typed values for aliases, a stack-depth opcode for the collector, and page-indexed invalidation plus per-slot install tracking for the jit. - -**4. heap.** a buddy allocator. - -**6. stack checks.** all three stacks are checked: data and return at every block exit on all backends, and frames in every prologue. - -**7. the small stuff.** error recovery with up to 20 reported errors, line numbers carried in token lists, a signature prescan over the whole unit so prototypes are optional, storing into a borrowed object moving the object automatically, `?:`, and go-style `switch`. on the side, a 4-token lookahead fixed `**` declarations. - -### 14 - -> how costly is it if we add a counter to each block to see how many times it runs, then run the optimizer on it if it's a hot path? - -> continue - -**summary:** answered without building anything. about 4 instructions per block entry while a block is being counted, and nothing once its optimized translation replaces it. the optimizing pass would reuse the enhancement lifter, optimizer and register allocator. lifting whole blocks would need jz side exits and barriers at calls and i/o. compiling a block that way takes microseconds, against milliseconds for llvm, and keeping values in registers instead of the memory stack likely gives 2 to 4x on tight loops. it's listed under open ends. then the gap fixes continued. - -### 15 - -> write some really cool examples for this language - -> no, wdym building a fresh vm?? just pocs 😠we already have a compiler and everything - -**summary:** my progress note had said "building a fresh vm", which only meant compiling core.c into a binary to run the examples. eight proofs of concept went into `examples/`: mandel, bf, dump, tree, lang, staged, quine and life, each described under files above and checked by `test.sh` on all three backends. - -### 16 - -> add opt keywords, for example `optim` (or o3, i prefer o3 as the keyword) will cause any vars in a scope to not assign heap type metadata, compiles with opt level o3 and is immediately compiled down to native, and when used with variables they must be always typed and it reduces the perf cost for accessing or modifying them, etc etc. add a `fixed` keyword which says that an array has a fixed size and cannot be resized, etc - -my answers to the clarifying questions, exactly: - -> where o3 goes: functions, blocks and single vars -> -> how far o3 goes: real optimizing tier (Recommended) -> -> what o3 code may give up: type stamps on objects, zero-filling new objects, the address of o3 vars, stack and frame checks, also i don't like the -> return type syntax. please replace it with the c-like syntax -> -> arrays: add growable arrays too (Recommended) - -**summary:** three things changed. - -**return types.** functions are declared c-style now, `int f(int x)`, `*node.u make()`, with fn types written `int(int, *char)`. `->` is gone from the compiler, zc0, the tests and the examples. - -**arrays.** `[]T` grows (`push`, `pop`, `resize`, `len`, `cap`), and `fixed []T` can't change size after `new(fixed []T, n)`. both are bounds-checked. `[n]T` stays as it was, plus a compile-time check for constant indexes. - -**o3.** on functions, blocks and single variables, with the trade-offs you picked, and a real optimizing tier in the core, described in the o3 section above. it compiles at install time on arm64 and llvm and has a region interpreter for the plain build. measured gains are 1.5 to 2.8x on the interpreter, 8 to 100x on llvm and 20 to 43x on arm64 (under qemu) for loop-heavy kernels, and much less for call-heavy ones. on the way, the arm64 jit learned to specialize an enhancement on literal inputs, so `x / 7` is a multiply-high everywhere, not only in o3 code. tests for arrays and o3 turned up an old heap bug: freeing a container could merge one of its children into it while it was still being freed, which corrupted a free list. growable arrays hit it every time. it's fixed. - -### 17 - -> generics should go after fn name and before parens -> we also need some machinery for converting values to/from o3. to is pretty easy, we just hand over the data, and o3 ignores the fat metadata. from is a bit harder, there needs to be a system to get type hints and fatten the metadata for the packed data -> variables just get the latest free register, it's fine for now -> add the fixed array once per region thing -> -> also if you have any tips on how to make the memory system better (aka avoiding gc and leaks/uaf as much as possible) do tell - -**summary:** generics went back after the name, `T first<T>(...)`, with the return type allowed to use them before the list declares them. o3 got fattening on the way out (the section above): `new_raw` keeps the requested size in the type word, and the compiler calls `fatten` with the static type wherever o3 data reaches normal code. registers now follow scopes, so a closed scope's register goes to the next variable. fixed arrays in o3 variables keep their items and length in two hidden register variables. the memory tips were answered in chat, not built. diff --git a/docs/history/17-o3-boundaries/code/bench.sh b/docs/history/17-o3-boundaries/code/bench.sh deleted file mode 100755 index b1f268c..0000000 --- a/docs/history/17-o3-boundaries/code/bench.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash -# o3 against plain code: each kernel in tests/bench.zc on each backend, with -# the time to start up and compile (the 'z' run) taken off. needs bc. -cd "$(dirname "$0")"; T=$(mktemp -d); trap 'rm -rf $T' EXIT -gcc -O2 -w -DJTYPE=int core.c io_linux.c -o $T/zy -vms=("$T/zy"); names=("interp") -if command -v llvm-config >/dev/null; then - gcc -O2 -w -DJTYPE=int -DZYLLVM $(llvm-config --cflags) core.c io_linux.c -o $T/zyl $(llvm-config --ldflags --libs) && { vms+=("$T/zyl"); names+=("llvm"); } -fi -if command -v aarch64-linux-gnu-gcc >/dev/null && command -v qemu-aarch64 >/dev/null; then - aarch64-linux-gnu-gcc -O2 -w -DJTYPE=int -static core.c io_linux.c -o $T/zyj && { vms+=("qemu-aarch64 $T/zyj"); names+=("arm64 (qemu)"); } -fi -# seconds per run of kernel $2 on vm $1: the slope between $3 runs and 1 run, -# best of three each, so starting up and compiling cancel out -t(){ local s e; s=$(date +%s.%N); (cat tests/bench.zc; printf '`%s%s' $2 $3) | $1 >/dev/null; e=$(date +%s.%N); echo "$e - $s" | bc; } -best(){ local b=999 x i; for i in 1 2 3; do x=$(t "$1" $2 $3); b=$(echo "if ($x < $b) $x else $b" | bc); done; echo $b; } -# grows the run count until the difference is at least a second, so the noise -# of starting up is small next to it -per(){ - local one n=4 many - one=$(best "$1" $2 1) - while :; do - many=$(best "$1" $2 $n) - if [ "$(echo "$many - $one > 1" | bc)" = 1 ] || [ $n -ge 4096 ]; then break; fi - n=$((n * 4)) - done - echo "scale=6; ($many - $one) / ($n - 1)" | bc -} -printf "%-14s %-8s %10s %10s %8s\n" backend kernel "plain ms" "o3 ms" speedup -for i in "${!vms[@]}"; do - for k in "collatz a b" "sieve c d" "digits e f" "fib g h"; do - set -- $k - p=$(per "${vms[$i]}" $2); o=$(per "${vms[$i]}" $3) - printf "%-14s %-8s %10.2f %10.2f %7.1fx\n" "${names[$i]}" $1 $(echo "$p * 1000" | bc) $(echo "$o * 1000" | bc) $(echo "scale=2; $p / $o" | bc) - done -done diff --git a/docs/history/17-o3-boundaries/code/core.c b/docs/history/17-o3-boundaries/code/core.c deleted file mode 100644 index 7f4aa33..0000000 --- a/docs/history/17-o3-boundaries/code/core.c +++ /dev/null @@ -1,2030 +0,0 @@ -/* zygote core: puts the genome (the zc compiler and its runtime, both vm code) - into memory and runs it. on arm64, every block of vm code is translated to - arm64 the first time it is reached, straight from live memory. stores that - land on translated words throw those translations away, so code that - rewrites itself, including the resident compiler, just gets retranslated - on the next visit. on other hosts (or with -DZYINTERP) a plain interpreter - with the same semantics runs instead. ZYTRACE=1 logs translations on stderr. */ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#if defined(__aarch64__) && !defined(ZYINTERP) -#define ZYJIT 1 -#include <sys/mman.h> -#ifdef __APPLE__ -#include <pthread.h> -#include <libkern/OSCacheControl.h> -#endif -#endif -#include "genome.h" - -#ifndef JTYPE -#define JTYPE char -#endif -char Q(void); -void G(char); -extern JTYPE J; - -#define MW (1 << 20) /* memory, in words */ -#define DS0 (MW - 16) /* data stack grows down from here */ -#define RS0 0xF0000 /* return stack grows up from here */ -#define DSLIM (0xFC000 + 1100) /* data stack overflows below this (a block pushes at most ~1024) */ -#define RSLIM (0xF8000 - 8) /* return stack overflows above this */ -/* why the cpu stopped, when it wasn't a halt */ -static int stopped(int p) -{ - if (p == MW + 1) { fprintf(stderr, "zy: data stack overflow\n"); return 2; } - if (p == MW + 2) { fprintf(stderr, "zy: return stack overflow\n"); return 2; } - return 0; -} -#define CODEW (4 << 20) /* 16 MB of code, in instruction words */ -#define MAXB 65536 -#define BLKW 1024 /* longest block, in vm words */ - -static int m[MW]; -static int trace; - -/* ---- virtual enhancements ---- - up to 512 custom opcodes (22 .. 533), wired in at runtime by the install - opcode (21). an enhancement is a short program over native micro-ops, - written either as a recipe (text) or as straight-line vm code that gets - lifted. both become ssa, go through the optimizer below, and then run in - the interpreter or get inlined by the jit as native code. */ -#define NENH 512 -#define XOP0 22 -enum { U_LI, U_MOV, U_ADD, U_SUB, U_MUL, U_SDIV, U_UDIV, U_SREM, U_UREM, U_AND, U_OR, U_XOR, - U_SHL, U_SHR, U_SAR, U_NEG, U_NOT, U_LT, U_LTU, U_EQ, U_NE, U_MIN, U_MAX, U_MINU, U_MAXU, - U_MULHS, U_MULHU, U_CLZ, U_ABS, U_SEL, U_LD, U_ST, U_N }; -static const char *unames[U_N] = { "li", "mov", "add", "sub", "mul", "sdiv", "udiv", "srem", "urem", - "and", "or", "xor", "shl", "shr", "sar", "neg", "not", "lt", "ltu", "eq", "ne", "min", "max", - "minu", "maxu", "mulhs", "mulhu", "clz", "abs", "sel", "ld", "st" }; -static const signed char uarity[U_N] = { 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 1, 3, 1, 2 }; -typedef struct { int op, d, a, b, c, imm; } Uop; /* ssa: d is a fresh value, a b c are values */ -typedef struct { - int live, kind, nin, nout, n, nv, out[8]; - Uop *u; - signed char *reg; /* physical register per value, for the jit; 0 if it didn't fit */ -} Enh; -static Enh enh[NENH]; -static int need_flush; - -#define MAXUOP 4096 -static Uop ub[MAXUOP]; static int un, unv, uerr; /* the program being built */ -static int unew(int op, int a, int b, int c, int imm) -{ - Uop *u; - if (un >= MAXUOP) { uerr = -5; return 0; } - u = &ub[un++]; u->op = op; u->d = unv++; u->a = a; u->b = b; u->c = c; u->imm = imm; - return u->d; -} -static int mread(int a) { return (unsigned)a < MW ? m[a] : 0; } - -/* recipe text: one statement per line or per ';' - r0 = sdiv r0 r1 dst = op operands, operands are rN, parameter names or numbers - r2 = r0 a copy, or a number - st r1 r0 memory[r1] = r0 - inputs arrive in r0.. (and under the parameter names), outputs leave from r0.. */ -static int parse_recipe(int src, int names, int nin, int nout, int *out) -{ - int cur[16], i, p = src, n, k, op, args[3], na, dst, isst; - char tok[8][32]; int nt; - for (i = 0; i < 16; i++) cur[i] = i < nin ? i : -1; - for (;;) { - /* read one statement into tokens */ - nt = 0; - for (;;) { - int c = mread(p); - while (c == ' ' || c == '\t' || c == '\r') c = mread(++p); - if (!c || c == '\n' || c == ';') break; - if (c == '=') { if (nt < 8) strcpy(tok[nt++], "="); p++; continue; } - n = 0; - while (c && c != ' ' && c != '\t' && c != '\n' && c != ';' && c != '=' && c != '\r') { if (n < 31) tok[nt < 8 ? nt : 7][n++] = (char)c; c = mread(++p); } - if (nt < 8) tok[nt++][n] = 0; - } - if (nt) { - isst = !strcmp(tok[0], "st"); - if (!isst && (nt < 3 || strcmp(tok[1], "="))) return -2; - /* destination register */ - dst = -1; - if (!isst) { - if (tok[0][0] == 'r' && tok[0][1] >= '0' && tok[0][1] <= '9') dst = atoi(tok[0] + 1); - else for (i = 0; i < nin && names; i++) { - int s = mread(names + i), j = 0; - while (mread(s + j) && mread(s + j) == (unsigned char)tok[0][j]) j++; - if (!mread(s + j) && !tok[0][j]) dst = i; - } - if (dst < 0 || dst > 15) return -2; - } - k = isst ? 1 : 2; /* first token after "=" (or after st) */ - op = -1; - if (!isst && nt > 3) { for (i = 0; i < U_N; i++) if (!strcmp(tok[k], unames[i])) op = i; if (op < 0) return -2; k++; } - if (isst) op = U_ST; - na = 0; - for (; k < nt; k++) { - char *t = tok[k], *e; int v = -1; - if (na >= 3) return -2; - if (t[0] == 'r' && t[1] >= '0' && t[1] <= '9') { int r = atoi(t + 1); if (r > 15) return -2; if (cur[r] < 0) cur[r] = unew(U_LI, 0, 0, 0, 0); v = cur[r]; } - else if ((t[0] >= '0' && t[0] <= '9') || t[0] == '-') { long x = strtol(t, &e, 0); if (*e) return -2; v = unew(U_LI, 0, 0, 0, (int)x); } - else { - for (i = 0; i < nin && names; i++) { - int s = mread(names + i), j = 0; - while (mread(s + j) && mread(s + j) == (unsigned char)t[j]) j++; - if (!mread(s + j) && !t[j]) v = cur[i] < 0 ? (cur[i] = unew(U_LI, 0, 0, 0, 0)) : cur[i]; - } - if (v < 0) return -2; - } - args[na++] = v; - } - if (op < 0) { /* x = y */ - if (na != 1) return -2; - cur[dst] = args[0]; - } else { - if (na != (op == U_LI ? 0 : uarity[op])) { - if (!(op == U_LI && na == 1)) return -2; - } - if (op == U_LI) cur[dst] = args[0]; - else if (op == U_ST) unew(U_ST, args[0], args[1], 0, 0); - else cur[dst] = unew(op, args[0], na > 1 ? args[1] : 0, na > 2 ? args[2] : 0, 0); - } - if (uerr) return uerr; - } - if (!mread(p)) break; - p++; - } - for (i = 0; i < nout; i++) { if (cur[i] < 0) cur[i] = unew(U_LI, 0, 0, 0, 0); out[i] = cur[i]; } - return uerr; -} - -/* straight-line vm code from addr up to its ret, run symbolically */ -static int lift_vm(int a, int len, int nin, int nout, int *out) -{ - int st[256], sp = 0, i, w, k, x, y; - for (i = 0; i < nin; i++) st[sp++] = i; - for (i = 0; i < len; i++) { - w = mread(a + i); - if (w & 1) { if (sp >= 256) return -4; st[sp++] = unew(U_LI, 0, 0, 0, w >> 1); continue; } - k = w / 2; - if (k == 9) break; - switch (k) { - case 1: if (sp < 1) return -4; st[sp - 1] = unew(U_LD, st[sp - 1], 0, 0, 0); break; - case 2: if (sp < 2) return -4; unew(U_ST, st[sp - 1], st[sp - 2], 0, 0); sp -= 2; break; - case 3: /* pick needs a constant index */ - if (sp < 1) return -4; - x = st[sp - 1]; - if (x < nin) return -4; - { int j; for (j = 0; j < un && ub[j].d != x; j++); if (j == un || ub[j].op != U_LI) return -4; y = ub[j].imm; } - if (y < 0 || y >= sp - 1) return -4; - st[sp - 1] = st[sp - 2 - y]; - break; - case 4: if (sp < 1) return -4; sp--; break; - case 5: if (sp < 2) return -4; x = st[sp - 1]; st[sp - 1] = st[sp - 2]; st[sp - 2] = x; break; - case 13: case 14: case 15: case 16: case 17: case 18: case 19: case 20: { - static const int map[] = { U_ADD, U_SUB, U_MUL, U_AND, U_OR, U_XOR, U_SAR, U_LT }; - if (sp < 2) return -4; - x = st[sp - 1]; y = st[sp - 2]; sp -= 2; - st[sp++] = unew(map[k - 13], y, x, 0, 0); - break; } - default: return -4; /* control flow, i/o and other enhancements don't lift */ - } - if (uerr) return uerr; - } - if (sp != nout) return -4; - for (i = 0; i < nout; i++) out[i] = st[i]; - return uerr; -} - -/* ---- the optimizer ---- - one forward pass of copy propagation, constant folding, algebraic - simplification, division by constants (the multiply-high trick) and - common subexpression elimination, then dead code removal. */ -static int ev(int op, int a, int b, int c) -{ - unsigned ua = (unsigned)a, ub_ = (unsigned)b; - switch (op) { - case U_ADD: return (int)(ua + ub_); - case U_SUB: return (int)(ua - ub_); - case U_MUL: return (int)(ua * ub_); - case U_SDIV: return b == 0 ? 0 : (a == (int)0x80000000 && b == -1) ? a : a / b; - case U_UDIV: return b == 0 ? 0 : (int)(ua / ub_); - case U_SREM: return b == 0 ? a : (a == (int)0x80000000 && b == -1) ? 0 : a % b; - case U_UREM: return b == 0 ? a : (int)(ua % ub_); - case U_AND: return a & b; - case U_OR: return a | b; - case U_XOR: return a ^ b; - case U_SHL: return (int)(ua << (b & 31)); - case U_SHR: return (int)(ua >> (b & 31)); - case U_SAR: return a >> (b & 31); - case U_NEG: return (int)(0u - ua); - case U_NOT: return ~a; - case U_LT: return a < b; - case U_LTU: return ua < ub_; - case U_EQ: return a == b; - case U_NE: return a != b; - case U_MIN: return a < b ? a : b; - case U_MAX: return a > b ? a : b; - case U_MINU: return ua < ub_ ? a : b; - case U_MAXU: return ua > ub_ ? a : b; - case U_MULHS: return (int)(((long long)a * (long long)b) >> 32); - case U_MULHU: return (int)(((unsigned long long)ua * ub_) >> 32); - case U_CLZ: { int n = 0; if (!ua) return 32; while (!(ua & 0x80000000u)) { ua <<= 1; n++; } return n; } - case U_ABS: return a < 0 ? (int)(0u - ua) : a; - case U_SEL: return a ? b : c; - } - return 0; -} -static void smagic(int d, int *mul, int *sh) /* hacker's delight, signed */ -{ - const unsigned two31 = 0x80000000u; - unsigned ad = d < 0 ? 0u - (unsigned)d : (unsigned)d, t = two31 + ((unsigned)d >> 31); - unsigned anc = t - 1 - t % ad, q1 = two31 / anc, r1 = two31 - q1 * anc, q2 = two31 / ad, r2 = two31 - q2 * ad, delta; - int p = 31; - do { - p++; - q1 *= 2; r1 *= 2; if (r1 >= anc) { q1++; r1 -= anc; } - q2 *= 2; r2 *= 2; if (r2 >= ad) { q2++; r2 -= ad; } - delta = ad - r2; - } while (q1 < delta || (q1 == delta && r1 == 0)); - *mul = (int)(q2 + 1); if (d < 0) *mul = -*mul; - *sh = p - 32; -} -static void umagic(unsigned d, unsigned *mul, int *add, int *sh) /* hacker's delight, unsigned */ -{ - unsigned nc = 0xFFFFFFFFu - (0u - d) % d, q1, r1, q2, r2, delta; - int p = 31; - *add = 0; - q1 = 0x80000000u / nc; r1 = 0x80000000u - q1 * nc; - q2 = 0x7FFFFFFFu / d; r2 = 0x7FFFFFFFu - q2 * d; - do { - p++; - if (r1 >= nc - r1) { q1 = 2 * q1 + 1; r1 = 2 * r1 - nc; } else { q1 = 2 * q1; r1 = 2 * r1; } - if (r2 + 1 >= d - r2) { if (q2 >= 0x7FFFFFFFu) *add = 1; q2 = 2 * q2 + 1; r2 = 2 * r2 + 1 - d; } - else { if (q2 >= 0x80000000u) *add = 1; q2 = 2 * q2; r2 = 2 * r2 + 1; } - delta = d - 1 - r2; - } while (p < 64 && (q1 < delta || (q1 == delta && r1 == 0))); - *mul = q2 + 1; *sh = p - 32; -} - -static Uop ob[MAXUOP]; static int on, onv; -static int *omap, *isk, *kv; /* old value -> new value; constness of new values */ -static int pure(int op) { return op != U_LD && op != U_ST; } -static int ispow2(unsigned x) { return x && !(x & (x - 1)); } -static int lg2(unsigned x) { int n = 0; while (x > 1) { x >>= 1; n++; } return n; } -static int oe(int op, int a, int b, int c, int imm); -static int K(int v) { return oe(U_LI, 0, 0, 0, v); } -static int raw(int op, int a, int b, int c, int imm) -{ - Uop *u; int i; - if (pure(op)) /* cse */ - for (i = 0; i < on; i++) { - u = &ob[i]; - if (u->op == op && u->a == a && u->b == b && u->c == c && u->imm == imm) return u->d; - } - if (on >= MAXUOP) { uerr = -5; return 0; } - u = &ob[on++]; u->op = op; u->d = onv++; u->a = a; u->b = b; u->c = c; u->imm = imm; - isk[u->d] = op == U_LI; kv[u->d] = imm; - return u->d; -} -static int sdivk(int a, int d) /* a / d for a constant d, no divide instruction */ -{ - int mul, sh, q, t; - if (d == 1) return a; - if (d == -1) return oe(U_NEG, a, 0, 0, 0); - if (d == (int)0x80000000) return oe(U_EQ, a, K(d), 0, 0); - if (ispow2((unsigned)(d < 0 ? -d : d))) { - int k = lg2((unsigned)(d < 0 ? -d : d)); - t = oe(U_SAR, a, K(31), 0, 0); - t = oe(U_SHR, t, K(32 - k), 0, 0); - q = oe(U_SAR, oe(U_ADD, a, t, 0, 0), K(k), 0, 0); - return d < 0 ? oe(U_NEG, q, 0, 0, 0) : q; - } - smagic(d, &mul, &sh); - q = oe(U_MULHS, a, K(mul), 0, 0); - if (d > 0 && mul < 0) q = oe(U_ADD, q, a, 0, 0); - if (d < 0 && mul > 0) q = oe(U_SUB, q, a, 0, 0); - if (sh) q = oe(U_SAR, q, K(sh), 0, 0); - return oe(U_ADD, q, oe(U_SHR, q, K(31), 0, 0), 0, 0); -} -static int udivk(int a, unsigned d) -{ - unsigned mul; int add, sh, t; - if (d == 1) return a; - if (ispow2(d)) return oe(U_SHR, a, K(lg2(d)), 0, 0); - if (d > 0x80000000u) return oe(U_XOR, oe(U_LTU, a, K((int)d), 0, 0), K(1), 0, 0); /* a >= d */ - umagic(d, &mul, &add, &sh); - t = oe(U_MULHU, a, K((int)mul), 0, 0); - if (!add) return sh ? oe(U_SHR, t, K(sh), 0, 0) : t; - t = oe(U_ADD, oe(U_SHR, oe(U_SUB, a, t, 0, 0), K(1), 0, 0), t, 0, 0); - return sh > 1 ? oe(U_SHR, t, K(sh - 1), 0, 0) : t; -} -static int oe(int op, int a, int b, int c, int imm) -{ - int ka, kb, A, B; - if (op == U_LI) return raw(U_LI, 0, 0, 0, imm); - if (op == U_MOV) return a; - if (op == U_LD || op == U_ST) return raw(op, a, b, 0, 0); - ka = isk[a]; kb = uarity[op] > 1 && isk[b]; - A = kv[a]; B = kv[b]; - /* everything constant: fold */ - if (ka && (uarity[op] < 2 || kb) && (uarity[op] < 3 || isk[c])) return K(ev(op, A, B, kv[c])); - /* constants go right for commutative ops */ - if (ka && !kb && (op == U_ADD || op == U_MUL || op == U_AND || op == U_OR || op == U_XOR || op == U_EQ || op == U_NE || - op == U_MIN || op == U_MAX || op == U_MINU || op == U_MAXU || op == U_MULHS || op == U_MULHU)) { - int t = a; a = b; b = t; kb = 1; B = A; ka = 0; - } - if (op == U_SEL && ka) return A ? b : c; - if (op == U_SEL && b == c) return b; - if (kb) switch (op) { - case U_ADD: case U_SUB: case U_OR: case U_XOR: case U_SHL: case U_SHR: case U_SAR: - if (!B || (op >= U_SHL && op <= U_SAR && !(B & 31))) return a; - break; - case U_MUL: - if (B == 0) return K(0); - if (B == 1) return a; - if (B == -1) return oe(U_NEG, a, 0, 0, 0); - if (ispow2((unsigned)B)) return oe(U_SHL, a, K(lg2((unsigned)B)), 0, 0); - break; - case U_AND: if (B == 0) return K(0); if (B == -1) return a; break; - case U_SDIV: if (B == 0) return K(0); return sdivk(a, B); - case U_SREM: if (B == 0) return a; if (B == 1 || B == -1) return K(0); - return oe(U_SUB, a, oe(U_MUL, sdivk(a, B), b, 0, 0), 0, 0); - case U_UDIV: if (B == 0) return K(0); return udivk(a, (unsigned)B); - case U_UREM: if (B == 0) return a; - if (ispow2((unsigned)B)) return oe(U_AND, a, K(B - 1), 0, 0); - return oe(U_SUB, a, oe(U_MUL, udivk(a, (unsigned)B), b, 0, 0), 0, 0); - } - if (a == b && uarity[op] == 2) { - if (op == U_SUB || op == U_XOR || op == U_LT || op == U_LTU || op == U_NE) return K(0); - if (op == U_AND || op == U_OR || op == U_MIN || op == U_MAX || op == U_MINU || op == U_MAXU) return a; - if (op == U_EQ) return K(1); - } - return raw(op, a, b, c, 0); -} -/* runs the optimizer over ub[0..un) with nin inputs; leaves the result in e */ -static int optimize(Enh *e, int nin, int *out, int nout) -{ - int i, *live, n = 0; - static int omap_[MAXUOP + 16], isk_[MAXUOP * 4], kv_[MAXUOP * 4]; - omap = omap_; isk = isk_; kv = kv_; - on = 0; onv = nin; - for (i = 0; i < nin; i++) { omap[i] = i; isk[i] = 0; } - for (i = 0; i < un && !uerr; i++) { - Uop *u = &ub[i]; - int a = uarity[u->op] > 0 || u->op == U_ST || u->op == U_LD ? omap[u->a] : 0; - int b = uarity[u->op] > 1 || u->op == U_ST ? omap[u->b] : 0; - int c = uarity[u->op] > 2 ? omap[u->c] : 0; - if (u->op == U_ST) oe(U_ST, a, b, 0, 0); - else omap[u->d] = oe(u->op, a, b, c, u->imm); - } - if (uerr) return uerr; - /* dead code: outputs and stores are live */ - live = calloc(onv + 1, sizeof *live); - for (i = 0; i < nout; i++) { e->out[i] = omap[out[i]]; live[e->out[i]] = 1; } - for (i = on; i--;) { - Uop *u = &ob[i]; - if (u->op != U_ST && !live[u->d]) { u->op = -1; continue; } - if (uarity[u->op] > 0 || u->op == U_ST || u->op == U_LD) live[u->a] = 1; - if (uarity[u->op] > 1 || u->op == U_ST) live[u->b] = 1; - if (uarity[u->op] > 2) live[u->c] = 1; - } - free(live); - e->u = malloc((on + 1) * sizeof(Uop)); - for (i = 0; i < on; i++) if (ob[i].op >= 0) e->u[n++] = ob[i]; - e->n = n; e->nv = onv; e->nin = nin; e->nout = nout; - return 0; -} -/* run an installed enhancement on a downward-growing stack; returns the new top */ -static int *xexec(Enh *e, int *sp) -{ - int vb[256], *v = e->nv <= 256 ? vb : malloc(e->nv * sizeof(int)), i, j; - for (j = 0; j < e->nin; j++) v[j] = sp[e->nin - 1 - j]; - for (i = 0; i < e->n; i++) { - Uop *u = &e->u[i]; - switch (u->op) { - case U_LI: v[u->d] = u->imm; break; - case U_LD: v[u->d] = mread(v[u->a]); break; - case U_ST: if ((unsigned)v[u->a] < MW) m[v[u->a]] = v[u->b]; break; - default: v[u->d] = ev(u->op, v[u->a], v[u->b], v[u->c]); - } - } - sp += e->nin - e->nout; - for (j = 0; j < e->nout; j++) sp[e->nout - 1 - j] = v[e->out[j]]; - if (v != vb) free(v); - return sp; -} -static void xdump(int slot, Enh *e) -{ - int i; - fprintf(stderr, "enh %d: %d in, %d out, %d ops\n", slot, e->nin, e->nout, e->n); - for (i = 0; i < e->n; i++) { - Uop *u = &e->u[i]; - if (u->op == U_ST) fprintf(stderr, " st v%d v%d\n", u->a, u->b); - else if (u->op == U_LI) fprintf(stderr, " v%d = %d\n", u->d, u->imm); - else { fprintf(stderr, " v%d = %s v%d", u->d, unames[u->op], u->a); if (uarity[u->op] > 1) fprintf(stderr, " v%d", u->b); if (uarity[u->op] > 2) fprintf(stderr, " v%d", u->c); fprintf(stderr, "\n"); } - } - for (i = 0; i < e->nout; i++) fprintf(stderr, " out%d = v%d\n", i, e->out[i]); -} -/* registers for the jit: values live in w0..w15, straight-line linear scan. - if they don't fit, reg stays 0 and the jit calls the interpreter instead. */ -static void regalloc(Enh *e) -{ - int *last = malloc(e->nv * sizeof(int)), i, j, k, fr = 0xffff; - signed char *r = malloc(e->nv); - for (i = 0; i < e->nv; i++) { last[i] = -2; r[i] = -1; } - for (i = 0; i < e->n; i++) { - Uop *u = &e->u[i]; - if (uarity[u->op] > 0 || u->op == U_ST || u->op == U_LD) last[u->a] = i; - if (uarity[u->op] > 1 || u->op == U_ST) last[u->b] = i; - if (uarity[u->op] > 2) last[u->c] = i; - } - for (i = 0; i < e->nout; i++) last[e->out[i]] = e->n; -#define TAKE(v) do { for (k = 0; k < 16 && !(fr >> k & 1); k++); if (k == 16) goto fail; fr &= ~(1 << k); r[v] = (signed char)k; } while (0) - for (j = 0; j < e->nin; j++) if (last[j] >= -1 && last[j] != -2) TAKE(j); - for (i = 0; i < e->n; i++) { - Uop *u = &e->u[i]; int ops[3], no = 0; - if (uarity[u->op] > 0 || u->op == U_ST || u->op == U_LD) ops[no++] = u->a; - if (uarity[u->op] > 1 || u->op == U_ST) ops[no++] = u->b; - if (uarity[u->op] > 2) ops[no++] = u->c; - for (j = 0; j < no; j++) if (last[ops[j]] == i && r[ops[j]] >= 0 && (fr >> r[ops[j]] & 1) == 0) fr |= 1 << r[ops[j]]; - if (u->op != U_ST) TAKE(u->d); - if (u->op != U_ST && last[u->d] == -2) fr |= 1 << r[u->d]; /* never used */ - } -#undef TAKE - free(last); e->reg = r; return; -fail: - free(last); free(r); e->reg = 0; -} -/* the install opcode. descriptor: slot, kind (0 recipe, 1 vm code), inputs, - outputs, payload address, payload length, parameter names (or 0). kind 2 - is an o3 region (below). - returns 0, or -1 bad descriptor, -2 recipe syntax, -4 code doesn't lift, - -5 too big. */ -static int o3install(int d); -static int install(int d) -{ - int slot = mread(d), kind = mread(d + 1), nin = mread(d + 2), nout = mread(d + 3); - int pay = mread(d + 4), len = mread(d + 5), names = mread(d + 6), out[8], r; - Enh ne; - if (kind == 2) return o3install(d); - if ((unsigned)slot >= NENH || (unsigned)nin > 8 || (unsigned)nout > 8 || (kind != 0 && kind != 1)) return -1; - un = 0; unv = nin; uerr = 0; - r = kind == 0 ? parse_recipe(pay, names, nin, nout, out) : lift_vm(pay, len, nin, nout, out); - if (r) { if (trace) fprintf(stderr, "enh %d: install failed (%d)\n", slot, r); return r; } - memset(&ne, 0, sizeof ne); - if ((r = optimize(&ne, nin, out, nout))) return r; - ne.kind = kind; ne.live = 1; - regalloc(&ne); - if (enh[slot].live) { free(enh[slot].u); free(enh[slot].reg); } - enh[slot] = ne; - need_flush = 1; - if (trace) xdump(slot, &enh[slot]); - return 0; -} - -/* ---- o3: optimized regions ---- - o3 code comes from the compiler as a region: a range [lo, hi) of vm words - plus the frame slots that nothing takes the address of, each with one of 7 - registers (install kind 2: [-, 2, lo, hi, n, slot, register, ...]). the region is cut into basic blocks. each - block is lifted to ssa: the vm stack is tracked symbolically, so only what - is left on it at the end of the block touches memory, the slots live in - registers across blocks (VGET reads one at block entry, the block's end - says what each one holds now), the frame pointer is var 0, and enhancements - are spliced in. every block then goes through the optimizer above. a - backend compiles the whole region at once: arm64, llvm at O3, or the - region interpreter below. the region is entered at lo and at the return - points of its calls. a register can stand for several slots (variables - whose scopes don't overlap), and spilling writes it to all of them. calls, - returns, jumps out, and anything a block can't - lift leave it: the slots go back to the frame first, so the code outside - sees the usual memory. stores to its own code drop it; it lifts again on - its next entry. */ -#define ZFP 0xA0000 /* the frame pointer word */ -#define U_VGET U_N /* a var at block entry; imm = var */ -#define U_SLD (U_N + 1) /* the stack word at offset imm from the top at block entry */ -#define RMAXV 8 -#define RMAXE 256 -enum { T_BR, T_CBR, T_JMP, T_CALL, T_RET }; -typedef struct { - int a, n, nv, delta, nso, term, cv, s1, s2, x1, x2; - int vs[RMAXV]; /* each var's value at the end, -1 if unchanged */ - int *so; /* stack words to write at the end: offset, value */ - Uop *u; -} RB; -typedef struct { - int idx, lo, hi, nv, slot[RMAXV], lifted, dead, nonat, nb, ne, maxnv; - int np, ps[32], pv[32]; /* frame slot -> var; vars in scopes that never overlap share one */ - int ent[RMAXE], entb[RMAXE]; - RB *b; - void *nat, *stub[RMAXE]; /* the backend's code */ -} Rg; -#define MAXRG 4096 -static Rg *rgs[MAXRG]; -static int nrg; -static unsigned short o3ent[MW]; /* region + 1 at an entry point */ -static unsigned char o3ei[MW]; /* which of its entries */ -static void rforget(Rg *R); /* the backend drops its code */ -static void rmark(Rg *R); /* the backend watches the region's words */ -static void rcompile(Rg *R, int eager); - -static int nargs(int op) { return op >= U_N ? 0 : uarity[op]; } -static void rclear(Rg *R) -{ - int b; - rforget(R); - for (b = 0; b < R->nb; b++) { free(R->b[b].u); free(R->b[b].so); } - free(R->b); R->b = 0; R->nb = 0; R->lifted = 0; -} -static void rdrop_all(void) { int j; for (j = 0; j < nrg; j++) if (rgs[j]->lifted) rclear(rgs[j]); } - -/* lifting one block */ -static Rg *R_; -static unsigned char *lead_; -static int *bidx_, *wl_, nw_; -static int lv_[RMAXV], lw_[RMAXV]; -#define SB 1100 -static int skv[2 * SB], stp, slo, shi; -static unsigned char skk[2 * SB]; -static int afp[MAXUOP * 4 + 16]; /* value -> 1 + its offset from fp, if it is fp + k */ -static int emap[MAXUOP * 4 + 16]; - -static int rvar(int v) -{ - if (lv_[v] < 0) { lv_[v] = raw(U_VGET, 0, 0, 0, v); if (!v) afp[lv_[v]] = 1; } - return lv_[v]; -} -static int slotvar(int off) { int j; for (j = 0; j < R_->np; j++) if (R_->ps[j] == off) return R_->pv[j]; return 0; } -static int rbin(int op, int x, int y, int z) -{ - int r = oe(op, x, y, z, 0); - if (op == U_ADD && !afp[r]) { - if (afp[x] && isk[y]) afp[r] = afp[x] + kv[y]; - else if (afp[y] && isk[x]) afp[r] = afp[y] + kv[x]; - } - return r; -} -static int rld(int a) -{ - int v; - if (isk[a] && kv[a] == ZFP) return rvar(0); - if (afp[a] && (v = slotvar(afp[a] - 1))) return rvar(v); - return oe(U_LD, a, 0, 0, 0); -} -static int rst(int a, int b) -{ - int v; - if (isk[a] && kv[a] == ZFP) return 0; /* moving the frame: not in here */ - if (afp[a] && (v = slotvar(afp[a] - 1))) { lv_[v] = b; lw_[v] = 1; return 1; } - oe(U_ST, a, b, 0, 0); - return 1; -} -static int sget(int o) -{ - if (o < -SB || o >= SB) { uerr = -6; return 0; } - if (!skk[o + SB]) { - if (o < 0) { uerr = -6; return 0; } - skv[o + SB] = raw(U_SLD, 0, 0, 0, o); skk[o + SB] = 1; - } - if (o < slo) slo = o; - if (o >= shi) shi = o + 1; - return skv[o + SB]; -} -static void sset(int o, int v) -{ - if (o < -SB || o >= SB) { uerr = -6; return; } - skv[o + SB] = v; skk[o + SB] = 1; - if (o < slo) slo = o; - if (o >= shi) shi = o + 1; -} -static int spop(void) { return sget(stp++); } -static void spush(int v) { sset(--stp, v); } -static int rblk(int t) { return t >= R_->lo && t < R_->hi && lead_[t - R_->lo] ? bidx_[t - R_->lo] : -1; } -/* an enhancement, spliced into the block */ -static int rsplice(Enh *e) -{ - int i, j; - for (j = e->nin; j--;) emap[j] = spop(); - for (i = 0; i < e->n && !uerr; i++) { - Uop *u = &e->u[i]; - int na = nargs(u->op), a = na > 0 ? emap[u->a] : 0, b = na > 1 ? emap[u->b] : 0, c = na > 2 ? emap[u->c] : 0; - if (u->op == U_LI) emap[u->d] = K(u->imm); - else if (u->op == U_LD) emap[u->d] = rld(a); - else if (u->op == U_ST) { if (!rst(a, b)) uerr = -4; } - else emap[u->d] = rbin(u->op, a, b, c); - } - for (j = 0; j < e->nout; j++) spush(emap[e->out[j]]); - return uerr; -} -static int lift_block(int bi) -{ - static const int map[] = { U_ADD, U_SUB, U_MUL, U_AND, U_OR, U_XOR, U_SAR, U_LT }; - RB *B = &R_->b[bi]; - int i = B->a, w, k, x, y, t, j, o, n = 0, *live; - on = 0; onv = 0; uerr = 0; - memset(afp, 0, sizeof afp); memset(skk, 0, sizeof skk); - stp = slo = shi = 0; - for (j = 0; j < RMAXV; j++) { lv_[j] = -1; lw_[j] = 0; } - B->term = T_JMP; B->cv = -1; B->s1 = B->s2 = -1; B->x1 = B->x2 = 0; - for (;;) { - if (uerr) return uerr; - if (i != B->a && (t = rblk(i)) >= 0) { B->term = T_BR; B->s1 = t; goto done; } - if (i < R_->lo || i >= R_->hi) goto leave_at; - w = m[i]; - if (w & 1) { spush(K(w >> 1)); i++; continue; } - k = w / 2; - switch (k) { - case 0: B->cv = K(-1); goto done; /* halt */ - case 1: x = spop(); spush(rld(x)); break; - case 2: - x = sget(stp); - if (isk[x] && kv[x] == ZFP) goto leave_at; - x = spop(); y = spop(); rst(x, y); - break; - case 3: /* pick: a constant depth */ - x = sget(stp); - if (!isk[x] || kv[x] < 0 || kv[x] > 1024) goto leave_at; - stp++; spush(sget(stp + kv[x])); - break; - case 4: stp++; break; - case 5: x = sget(stp); y = sget(stp + 1); sset(stp, y); sset(stp + 1, x); break; - case 6: B->cv = spop(); B->term = T_CALL; B->x2 = i + 1; goto done; - case 7: - x = spop(); - if (isk[x] && (t = rblk(kv[x])) >= 0) { B->term = T_BR; B->s1 = t; } - else B->cv = x; - goto done; - case 8: - x = sget(stp); - if (!isk[x]) goto leave_at; - stp++; y = spop(); - if (isk[y]) { /* a known condition */ - if (kv[y]) { i++; continue; } - if ((t = rblk(kv[x])) >= 0) { B->term = T_BR; B->s1 = t; } else B->cv = K(kv[x]); - goto done; - } - B->term = T_CBR; B->cv = y; - B->x1 = kv[x]; B->s1 = rblk(kv[x]); - B->x2 = i + 1; B->s2 = rblk(i + 1); - goto done; - case 9: B->term = T_RET; goto done; - case 13: case 14: case 15: case 16: case 17: case 18: case 19: case 20: - x = spop(); y = spop(); spush(rbin(map[k - 13], y, x, 0)); - break; - default: - if (k >= XOP0 && k < XOP0 + NENH && enh[k - XOP0].live) { if (rsplice(&enh[k - XOP0])) return uerr; break; } - goto leave_at; /* i/o, install, unwired: done the usual way */ - } - i++; - } -leave_at: - B->term = T_JMP; B->cv = K(i); -done: - if (uerr) return uerr; - B->delta = stp; - B->so = malloc((shi - slo + 1) * 2 * sizeof(int)); - B->nso = 0; - for (o = stp > slo ? stp : slo; o < shi; o++) - if (skk[o + SB]) { - x = skv[o + SB]; - if (ob[x].op == U_SLD && ob[x].imm == o) continue; /* still the word that was there */ - if (afp[x] && slotvar(afp[x] - 1)) return -7; /* a register var's address can't wait in memory */ - B->so[2 * B->nso] = o; B->so[2 * B->nso + 1] = x; B->nso++; - } - for (j = 0; j < RMAXV; j++) B->vs[j] = -1; - for (j = 1; j < R_->nv; j++) - if (lw_[j] && !(ob[lv_[j]].op == U_VGET && ob[lv_[j]].imm == j)) B->vs[j] = lv_[j]; - /* dead code: what the block leaves behind and its stores are live */ - live = calloc(onv + 1, sizeof *live); - for (j = 0; j < B->nso; j++) live[B->so[2 * j + 1]] = 1; - for (j = 1; j < R_->nv; j++) if (B->vs[j] >= 0) live[B->vs[j]] = 1; - if (B->term == T_CBR || B->term == T_JMP || B->term == T_CALL) live[B->cv] = 1; - for (i = on; i--;) { - Uop *u = &ob[i]; - if (u->op != U_ST && !live[u->d]) { u->op = -1; continue; } - k = nargs(u->op); - if (k > 0) live[u->a] = 1; - if (k > 1) live[u->b] = 1; - if (k > 2) live[u->c] = 1; - } - free(live); - B->u = malloc((on + 1) * sizeof(Uop)); - for (i = 0; i < on; i++) if (ob[i].op >= 0) B->u[n++] = ob[i]; - B->n = n; B->nv = onv; - if (onv > R_->maxnv) R_->maxnv = onv; - return 0; -} -static void addl(int x, int en) -{ - int e; - if (x < R_->lo || x >= R_->hi) return; - if (!lead_[x - R_->lo]) { lead_[x - R_->lo] = 1; wl_[nw_++] = x; } - if (en) { for (e = 0; e < R_->ne && R_->ent[e] != x; e++); if (e == R_->ne && e < RMAXE) R_->ent[R_->ne++] = x; } -} -/* blocks, then each one lifted and optimized */ -static int rlift(Rg *R) -{ - int n = R->hi - R->lo, L, i, w, k, t, b, e, r = 0, cnt; - if (R->lifted) rclear(R); - R_ = R; - lead_ = calloc(n, 1); bidx_ = malloc(n * sizeof(int)); wl_ = malloc(n * sizeof(int)); nw_ = 0; - R->ne = 0; - addl(R->lo, 1); - while (nw_) { - L = wl_[--nw_]; - for (i = L, cnt = 0;;) { - if (i >= R->hi || (i != L && lead_[i - R->lo])) break; - if (cnt++ >= 1000) { addl(i, 0); break; } - w = m[i]; - if (w & 1) { - if (i + 1 < R->hi && !(m[i + 1] & 1) && (k = m[i + 1] / 2) >= 6 && k <= 8) { - t = w >> 1; - if (k == 6) addl(i + 2, 1); /* a call comes back here */ - else if (k == 7) addl(t, 0); - else { addl(t, 0); addl(i + 2, 0); } - break; - } - i++; - continue; - } - k = w / 2; - if (k == 6) { addl(i + 1, 1); break; } - if (k == 8) { addl(i + 1, 0); break; } - if (k == 0 || k == 7 || k == 9) break; - i++; - } - } - for (i = 0, b = 0; i < n; i++) if (lead_[i]) bidx_[i] = b++; - R->nb = b; R->b = calloc(b, sizeof(RB)); R->maxnv = 0; - for (i = 0; i < n; i++) if (lead_[i]) R->b[bidx_[i]].a = R->lo + i; - for (b = 0; b < R->nb && !r; b++) r = lift_block(b); - for (e = 0; e < R->ne; e++) R->entb[e] = bidx_[R->ent[e] - R->lo]; - free(lead_); free(bidx_); free(wl_); - if (r) { - if (trace) fprintf(stderr, "o3: %d..%d doesn't lift (%d)\n", R->lo, R->hi - 1, r); - R->lifted = 1; rclear(R); return r; - } - for (e = 0; e < R->ne; e++) { o3ent[R->ent[e]] = R->idx + 1; o3ei[R->ent[e]] = e; } - R->lifted = 1; - rmark(R); - if (trace) { - int ops = 0; - for (b = 0; b < R->nb; b++) ops += R->b[b].n; - fprintf(stderr, "o3: %d..%d: %d blocks, %d entries, %d vars, %d micro-ops\n", R->lo, R->hi - 1, R->nb, R->ne, R->nv - 1, ops); - if (getenv("ZYO3DUMP")) - for (b = 0; b < R->nb; b++) { - RB *B = &R->b[b]; - fprintf(stderr, " b%d @%d: %d ops, sp %+d, term %d cv v%d s %d/%d x %d/%d\n", b, B->a, B->n, B->delta, B->term, B->cv, B->s1, B->s2, B->x1, B->x2); - for (i = 0; i < B->n; i++) { - Uop *u = &B->u[i]; - if (u->op == U_ST) fprintf(stderr, " st v%d v%d\n", u->a, u->b); - else if (u->op == U_LI) fprintf(stderr, " v%d = %d\n", u->d, u->imm); - else if (u->op == U_VGET) fprintf(stderr, " v%d = var%d\n", u->d, u->imm); - else if (u->op == U_SLD) fprintf(stderr, " v%d = s[%d]\n", u->d, u->imm); - else { fprintf(stderr, " v%d = %s v%d", u->d, unames[u->op], u->a); if (nargs(u->op) > 1) fprintf(stderr, " v%d", u->b); if (nargs(u->op) > 2) fprintf(stderr, " v%d", u->c); fprintf(stderr, "\n"); } - } - for (i = 0; i < B->nso; i++) fprintf(stderr, " s[%d] = v%d\n", B->so[2 * i], B->so[2 * i + 1]); - for (i = 1; i < R->nv; i++) if (B->vs[i] >= 0) fprintf(stderr, " var%d = v%d\n", i, B->vs[i]); - } - } - return 0; -} -/* install kind 2 */ -static int o3install(int d) -{ - int lo = mread(d + 2), hi = mread(d + 3), n = mread(d + 4), i, r; - Rg *R; - if (lo <= 0 || hi <= lo || hi > MW || hi - lo > 1000000 || (unsigned)n > 32 || nrg >= MAXRG) return -1; - R = calloc(1, sizeof *R); - R->idx = nrg; rgs[nrg++] = R; - R->lo = lo; R->hi = hi; R->nv = 1; R->np = n; - for (i = 1; i < RMAXV; i++) R->slot[i] = -1; - for (i = 0; i < n; i++) { /* pairs: frame slot, register 1..7 */ - int s = mread(d + 5 + 2 * i), v = mread(d + 6 + 2 * i); - if ((unsigned)s >= 4096 || v < 1 || v >= RMAXV) { R->dead = 1; return -1; } - R->ps[i] = s; R->pv[i] = v; - if (R->slot[v] < 0) R->slot[v] = s; - if (v >= R->nv) R->nv = v + 1; - } - for (i = 1; i < R->nv; i++) if (R->slot[i] < 0) R->slot[i] = R->ps[0]; - if ((r = rlift(R))) { R->dead = 1; return r; } - rcompile(R, 1); - return 0; -} -/* the region entered at p, lifted again if it has to be, or 0 */ -static Rg *rat(int p) -{ - Rg *R = rgs[o3ent[p] - 1]; - if (R->dead) { o3ent[p] = 0; return 0; } - if (!R->lifted && rlift(R)) { R->dead = 1; o3ent[p] = 0; return 0; } - if (o3ei[p] >= R->ne || R->ent[o3ei[p]] != p) { o3ent[p] = 0; return 0; } - return R; -} - -#ifdef ZYJIT -static unsigned char cov[MW]; /* 1 if a live translation covers the word */ -static void *tab[MW]; /* vm address -> translation */ -static struct { int a, b; } bl[MAXB]; /* live translations cover [a,b); a < 0 is dead */ -static int nbl; -static unsigned *code, *cp, *x_enter, *x_exit, *x_disp, *x_first; -static long S[13]; /* m, s, r, tab, cov, Q, G, &J, store hook, install, enhancement fallback, stack limits */ - -enum { W0 = 0, W1 = 1, X9 = 9, X10, X11, M = 19, SP = 20, RP = 21, TAB = 22, ST = 23 }; - -static void E(unsigned x) { *cp++ = x; } -static void li(int d, int v) -{ - unsigned u = (unsigned)v; - E(0x52800000 | (u & 0xffff) << 5 | d); - if (u >> 16) E(0x72a00000 | (u >> 16) << 5 | d); -} -static void ldr_post(int t, int n, int i) { E(0xb8400400 | (i & 0x1ff) << 12 | n << 5 | t); } -static void ldr_pre(int t, int n, int i) { E(0xb8400c00 | (i & 0x1ff) << 12 | n << 5 | t); } -static void str_pre(int t, int n, int i) { E(0xb8000c00 | (i & 0x1ff) << 12 | n << 5 | t); } -static void str_post(int t, int n, int i) { E(0xb8000400 | (i & 0x1ff) << 12 | n << 5 | t); } -static void ldr_u(int t, int n, int o) { E(0xb9400000 | (o / 4) << 10 | n << 5 | t); } -static void str_u(int t, int n, int o) { E(0xb9000000 | (o / 4) << 10 | n << 5 | t); } -static void ldrx_u(int t, int n, int o) { E(0xf9400000 | (o / 8) << 10 | n << 5 | t); } -static void ldr_rr(int t, int n, int r, int ext) { E(0xb8600800 | r << 16 | ext << 13 | 1 << 12 | n << 5 | t); } -static void str_rr(int t, int n, int r, int ext) { E(0xb8200800 | r << 16 | ext << 13 | 1 << 12 | n << 5 | t); } -static void ldp_post(int t, int u, int n, int i) { E(0x28c00000 | ((i / 4) & 0x7f) << 15 | u << 10 | n << 5 | t); } -static void op3(unsigned op, int d, int n, int r) { E(op | r << 16 | n << 5 | d); } -static void addx_ext(int d, int n, int r, int ext) { E(0x8b200000 | r << 16 | ext << 13 | 2 << 10 | n << 5 | d); } -static void movw(int d, int r) { E(0x2a0003e0 | r << 16 | d); } -static void blr(int n) { E(0xd63f0000 | n << 5); } -static void b_to(unsigned *t) { long o = t - cp; E(0x14000000 | (o & 0x3ffffff)); } -static void cb_fix(unsigned *at, unsigned *to) { *at |= ((to - at) & 0x7ffff) << 5; } -#define SXTW 6 -#define UXTW 2 - -static void build_stubs(void) -{ - cp = code; - x_enter = cp; /* int enter(long *S, void *code) */ - E(0xa9b97bfd); /* stp x29, x30, [sp, #-112]! */ - E(0x910003fd); /* mov x29, sp */ - E(0xa90153f3); /* stp x19, x20, [sp, #16] */ - E(0xa9025bf5); /* stp x21, x22, [sp, #32] */ - E(0xf9001bf7); /* str x23, [sp, #48] */ - E(0xa90467f8); /* stp x24, x25, [sp, #64] */ - E(0xa9056ffa); /* stp x26, x27, [sp, #80] */ - E(0xf90033fc); /* str x28, [sp, #96] */ - E(0xaa0003f7); /* mov x23, x0 */ - ldrx_u(M, ST, 0); - ldrx_u(24, ST, 88); ldrx_u(25, ST, 96); /* x24, x25: the stack limits, as addresses */ - ldr_u(X9, ST, 8); addx_ext(SP, M, X9, UXTW); - ldr_u(X9, ST, 16); addx_ext(RP, M, X9, UXTW); - ldrx_u(TAB, ST, 24); - E(0xd61f0020); /* br x1 */ - x_exit = cp; /* w0 = next vm address */ - op3(0xcb000000, X9, SP, M); E(0xd342fd29); str_u(X9, ST, 8); /* s = (x20 - x19) >> 2 */ - op3(0xcb000000, X9, RP, M); E(0xd342fd29); str_u(X9, ST, 16); - E(0xa94153f3); /* ldp x19, x20, [sp, #16] */ - E(0xa9425bf5); /* ldp x21, x22, [sp, #32] */ - E(0xf9401bf7); /* ldr x23, [sp, #48] */ - E(0xa94467f8); /* ldp x24, x25, [sp, #64] */ - E(0xa9456ffa); /* ldp x26, x27, [sp, #80] */ - E(0xf94033fc); /* ldr x28, [sp, #96] */ - E(0xa8c77bfd); /* ldp x29, x30, [sp], #112 */ - E(0xd65f03c0); /* ret */ - { - unsigned *ovd = cp, *ovr; - li(W0, MW + 1); b_to(x_exit); /* data stack overflow */ - ovr = cp; - li(W0, MW + 2); b_to(x_exit); /* return stack overflow */ - x_disp = cp; /* w0 = target: check the stacks, chain through tab[] or fall back to c */ - E(0xeb18029f); /* cmp x20, x24 */ - E(0x54000003 | ((ovd - cp) & 0x7ffff) << 5); /* b.lo data overflow */ - E(0xeb1902bf); /* cmp x21, x25 */ - E(0x54000002 | ((ovr - cp) & 0x7ffff) << 5); /* b.hs return overflow */ - } - E(0x7144001f); /* cmp w0, #MW */ - E(0x54000002 | ((x_exit - cp) & 0x7ffff) << 5); /* b.hs exit */ - E(0xf8605ac9); /* ldr x9, [x22, w0, uxtw #3] */ - E(0xb4000009 | ((x_exit - cp) & 0x7ffff) << 5); /* cbz x9, exit */ - E(0xd61f0120); /* br x9 */ - x_first = cp; -} - -static void flush(void) -{ - memset(tab, 0, sizeof tab); - memset(cov, 0, sizeof cov); - nbl = 0; - cp = x_first; - rdrop_all(); - if (trace) fprintf(stderr, "jit: flushed\n"); -} - -static void jitwrite(int on) -{ -#ifdef __APPLE__ - pthread_jit_write_protect_np(!on); -#else - (void)on; -#endif -} - -static void syncicache(unsigned *a, unsigned *b) -{ -#ifdef __APPLE__ - sys_icache_invalidate(a, (char *)b - (char *)a); -#else - __builtin___clear_cache((char *)a, (char *)b); -#endif -} - -/* store hook for words that are covered by a translation */ -static int hook(int a, int v) -{ - int j, x, hit = 0; - if (m[a] == v) return 0; - m[a] = v; - for (j = 0; j < nbl; j++) - if (bl[j].a >= 0 && bl[j].a <= a && a < bl[j].b) { - tab[bl[j].a] = 0; - for (x = bl[j].a; x < bl[j].b; x++) cov[x] = 0; - if (trace) fprintf(stderr, "jit: dropped %d..%d\n", bl[j].a, bl[j].b - 1); - bl[j].a = -1; - hit = 1; - } - for (j = 0; j < nrg; j++) - if (rgs[j]->lifted && rgs[j]->lo <= a && a < rgs[j]->hi) { - if (trace) fprintf(stderr, "o3: dropped %d..%d (a store to %d)\n", rgs[j]->lo, rgs[j]->hi - 1, a); - rclear(rgs[j]); - memset(cov, 0, sizeof cov); - hit = 1; - } - for (j = 0; j < nbl; j++) - if (bl[j].a >= 0) for (x = bl[j].a; x < bl[j].b; x++) cov[x] = 1; - for (j = 0; j < nrg; j++) if (rgs[j]->lifted) rmark(rgs[j]); - return hit; -} - -static void op(int i, int k) /* everything except control flow */ -{ - unsigned *a, *b, *c, *z; - switch (k) { - case 1: ldr_u(X9, SP, 0); ldr_rr(X9, M, X9, SXTW); str_u(X9, SP, 0); return; - case 2: /* store: inline unless the target word is translated */ - ldp_post(X9, X10, SP, 8); - E(0x7144013f); /* cmp w9, #MW */ - a = cp; E(0x54000002); /* b.hs done */ - ldrx_u(X11, ST, 32); - E(0x3869496b); /* ldrb w11, [x11, w9, uxtw] */ - b = cp; E(0x3500000b); /* cbnz w11, slow */ - str_rr(X10, M, X9, UXTW); - c = cp; E(0x14000000); /* b done */ - cb_fix(b, cp); /* slow: hook(a, v) */ - movw(W0, X9); movw(W1, X10); ldrx_u(X11, ST, 64); blr(X11); - z = cp; E(0x34000000); /* cbz w0, done */ - li(W0, i + 1); b_to(x_exit); /* a translation died: resume at i+1 in c */ - cb_fix(a, cp); cb_fix(z, cp); - *c |= (cp - c) & 0x3ffffff; - return; - case 3: ldr_u(X9, SP, 0); E(0x9100128a); ldr_rr(X9, X10, X9, SXTW); str_u(X9, SP, 0); return; /* add x10, x20, #4 */ - case 4: E(0x91001294); return; /* add x20, x20, #4 */ - case 5: E(0x29402a89); E(0x2900268a); return; /* ldp w9, w10, [x20]; stp w10, w9, [x20] */ - case 10: ldrx_u(X11, ST, 40); blr(X11); E(0x13001c09); str_pre(X9, SP, -4); return; /* sxtb w9, w0 */ - case 11: - ldrx_u(X9, ST, 56); - if (sizeof J == 1) E(0x39400129); else ldr_u(X9, X9, 0); /* ldrb w9, [x9] */ - str_pre(X9, SP, -4); - return; - case 12: ldr_post(W0, SP, 4); E(0x13001c00); ldrx_u(X11, ST, 48); blr(X11); return; /* sxtb w0, w0 */ - } - ldr_post(X9, SP, 4); - ldr_u(X10, SP, 0); - switch (k) { - case 13: op3(0x0b000000, X10, X10, X9); break; - case 14: op3(0x4b000000, X10, X10, X9); break; - case 15: op3(0x1b007c00, X10, X10, X9); break; - case 16: op3(0x0a000000, X10, X10, X9); break; - case 17: op3(0x2a000000, X10, X10, X9); break; - case 18: op3(0x4a000000, X10, X10, X9); break; - case 19: op3(0x1ac02800, X10, X10, X9); break; - default: E(0x6b09015f); E(0x1a9fa7ea); /* cmp w10, w9; cset w10, lt */ - } - str_u(X10, SP, 0); -} - -/* one micro-op, operands in registers. tmp is a scratch register for the - remainders; x16 and x17 are scratch too. */ -static void emit_uop(int op, int d, int a, int b, int c, int tmp) -{ - switch (op) { - case U_ADD: op3(0x0b000000, d, a, b); break; - case U_SUB: op3(0x4b000000, d, a, b); break; - case U_MUL: op3(0x1b007c00, d, a, b); break; - case U_SDIV: op3(0x1ac00c00, d, a, b); break; - case U_UDIV: op3(0x1ac00800, d, a, b); break; - case U_SREM: op3(0x1ac00c00, tmp, a, b); E(0x1b008000 | b << 16 | a << 10 | tmp << 5 | d); break; /* msub */ - case U_UREM: op3(0x1ac00800, tmp, a, b); E(0x1b008000 | b << 16 | a << 10 | tmp << 5 | d); break; - case U_AND: op3(0x0a000000, d, a, b); break; - case U_OR: op3(0x2a000000, d, a, b); break; - case U_XOR: op3(0x4a000000, d, a, b); break; - case U_SHL: op3(0x1ac02000, d, a, b); break; - case U_SHR: op3(0x1ac02400, d, a, b); break; - case U_SAR: op3(0x1ac02800, d, a, b); break; - case U_NEG: E(0x4b0003e0 | a << 16 | d); break; - case U_NOT: E(0x2a2003e0 | a << 16 | d); break; - case U_LT: E(0x6b00001f | b << 16 | a << 5); E(0x1a9fa7e0 | d); break; /* cmp; cset lt */ - case U_LTU: E(0x6b00001f | b << 16 | a << 5); E(0x1a9f27e0 | d); break; /* cset lo */ - case U_EQ: E(0x6b00001f | b << 16 | a << 5); E(0x1a9f17e0 | d); break; - case U_NE: E(0x6b00001f | b << 16 | a << 5); E(0x1a9f07e0 | d); break; - case U_MIN: E(0x6b00001f | b << 16 | a << 5); E(0x1a800000 | b << 16 | 11 << 12 | a << 5 | d); break; - case U_MAX: E(0x6b00001f | b << 16 | a << 5); E(0x1a800000 | b << 16 | 12 << 12 | a << 5 | d); break; - case U_MINU: E(0x6b00001f | b << 16 | a << 5); E(0x1a800000 | b << 16 | 3 << 12 | a << 5 | d); break; - case U_MAXU: E(0x6b00001f | b << 16 | a << 5); E(0x1a800000 | b << 16 | 8 << 12 | a << 5 | d); break; - case U_MULHS: E(0x9b207c00 | b << 16 | a << 5 | 16); E(0xd360fc00 | 16 << 5 | d); break; /* smull; lsr #32 */ - case U_MULHU: E(0x9ba07c00 | b << 16 | a << 5 | 16); E(0xd360fc00 | 16 << 5 | d); break; - case U_CLZ: E(0x5ac01000 | a << 5 | d); break; - case U_ABS: E(0x7100001f | a << 5); E(0x5a800400 | a << 16 | 10 << 12 | a << 5 | d); break; /* cmp #0; cneg */ - case U_SEL: E(0x7100001f | a << 5); E(0x1a800000 | c << 16 | 1 << 12 | b << 5 | d); break; /* csel ne */ - case U_LD: /* out of range reads 0, like the interpreter */ - E(0x52800011); E(0x7144001f | a << 5); E(0x54000042); ldr_rr(17, M, a, UXTW); movw(d, 17); - break; - case U_ST: E(0x7144001f | a << 5); E(0x54000042); str_rr(b, M, a, UXTW); break; - } -} -/* an enhancement, inlined: inputs from the data stack into w0..w15, the - optimized micro-ops, outputs back. constants are made where they're used, - or folded into the instruction (a fixed address, a small addend). */ -static int ekc[MAXUOP * 4 + 16], ekv[MAXUOP * 4 + 16]; -static void emit_enh_e(Enh *e, int s) -{ - signed char *r = e->reg; - int i, j, delta, na; - if (!r) { /* didn't fit in registers: x0 = data stack, w1 = slot, call the interpreter */ - E(0xaa1403e0); li(W1, s); ldrx_u(X11, ST, 80); blr(X11); E(0xaa0003f4); - return; - } - for (i = 0; i < e->nv; i++) ekc[i] = 0; - for (i = 0; i < e->n; i++) if (e->u[i].op == U_LI) { ekc[e->u[i].d] = 1; ekv[e->u[i].d] = e->u[i].imm; } -#define EOP(x) (ekc[x] ? (li(r[x], ekv[x]), r[x]) : r[x]) - for (j = 0; j < e->nin; j++) if (r[j] >= 0) ldr_u(r[j], SP, 4 * (e->nin - 1 - j)); - for (i = 0; i < e->n; i++) { - Uop *u = &e->u[i]; - int d = u->op == U_ST ? 0 : r[u->d], a = 0, b = 0, c = 0; - if (u->op == U_LI) continue; - if (u->op == U_LD && ekc[u->a] && (unsigned)ekv[u->a] < MW) { - if (ekv[u->a] < 4096) ldr_u(d, M, ekv[u->a] * 4); else ldr_rr(d, M, EOP(u->a), UXTW); - continue; - } - if ((u->op == U_ADD || u->op == U_SUB) && ekc[u->b] && ekv[u->b] >= 0 && ekv[u->b] < 4096) { - E((u->op == U_ADD ? 0x11000000 : 0x51000000) | ekv[u->b] << 10 | EOP(u->a) << 5 | d); - continue; - } - na = nargs(u->op); - if (na > 0) a = EOP(u->a); - if (na > 1) b = EOP(u->b); - if (na > 2) c = EOP(u->c); - emit_uop(u->op, d, a, b, c, 16); - } - delta = 4 * (e->nin - e->nout); - if (delta > 0) E(0x91000294 | delta << 10); - if (delta < 0) E(0xd1000294 | (-delta) << 10); - for (j = 0; j < e->nout; j++) str_u(EOP(e->out[j]), SP, 4 * (e->nout - 1 - j)); -#undef EOP -} -static void emit_enh(int s) { emit_enh_e(&enh[s], s); } -/* lit .. lit xop: the enhancement specialized on the literals that feed its - last inputs, so the optimizer sees them as constants (x / 7 becomes a - multiply, lfa(k) a load and an add). 0 if it worked. */ -static int spec_enh(int s, int *ks, int nk, Enh *te) -{ - Enh *e = &enh[s]; - int nin = e->nin - nk, i, j, out[8], na; - static int mp[MAXUOP * 4 + 16]; - if (e->nv > MAXUOP * 4) return -1; - un = 0; unv = nin; uerr = 0; - for (j = 0; j < nin; j++) mp[j] = j; - for (j = 0; j < nk; j++) mp[nin + j] = unew(U_LI, 0, 0, 0, ks[j]); - for (i = 0; i < e->n; i++) { - Uop *u = &e->u[i]; - na = nargs(u->op); - j = unew(u->op, na > 0 ? mp[u->a] : 0, na > 1 ? mp[u->b] : 0, na > 2 ? mp[u->c] : 0, u->imm); - if (u->op != U_ST) mp[u->d] = j; - } - for (j = 0; j < e->nout; j++) out[j] = mp[e->out[j]]; - memset(te, 0, sizeof *te); - if (uerr || optimize(te, nin, out, e->nout)) return -1; - regalloc(te); - if (!te->reg) { free(te->u); return -1; } - return 0; -} - -/* ---- o3 regions on arm64 ---- - vars live in w0..w7 (w0 is the frame pointer), block values in w8..w14, - w26..w28 and the homes of unused vars. constants have no register: they - are made in a scratch register where they're used (w16, w17, w15), or - folded into the instruction. x15..x17 are scratch. */ -static signed char rreg[MAXUOP * 4 + 16]; -static unsigned char rk[MAXUOP * 4 + 16], rhome[MAXUOP * 4 + 16]; -static int rkv[MAXUOP * 4 + 16], rlast[MAXUOP * 4 + 16]; -static unsigned **rfa; static int *rfb, rnf; /* branches to blocks, fixed up at the end */ - -static void rforget(Rg *R) -{ - int e; - if (R->nat) for (e = 0; e < R->ne; e++) if (tab[R->ent[e]] == R->stub[e]) tab[R->ent[e]] = 0; - R->nat = 0; -} -static void rmark(Rg *R) { int x; for (x = R->lo; x < R->hi; x++) cov[x] = 1; } -static int ralloc(Rg *R, RB *B) -{ - int i, j, k, n = B->n; - unsigned fr = 0x7f00u | 0x1c000000u; /* w8..w14, w26..w28 */ - for (j = R->nv; j < 8; j++) fr |= 1u << j; - for (i = 0; i < B->nv; i++) { rlast[i] = -2; rk[i] = 0; rhome[i] = 0; rreg[i] = -1; } - for (i = 0; i < n; i++) { - Uop *u = &B->u[i]; int na = nargs(u->op); - if (na > 0) rlast[u->a] = i; - if (na > 1) rlast[u->b] = i; - if (na > 2) rlast[u->c] = i; - } - for (j = 0; j < B->nso; j++) rlast[B->so[2 * j + 1]] = n; - for (j = 1; j < R->nv; j++) if (B->vs[j] >= 0) rlast[B->vs[j]] = n; - if (B->term == T_CBR || B->term == T_JMP || B->term == T_CALL) rlast[B->cv] = n; - for (i = 0; i < n; i++) { - Uop *u = &B->u[i]; int na = nargs(u->op), ops[3], d = u->d; - ops[0] = u->a; ops[1] = u->b; ops[2] = u->c; - for (j = 0; j < na; j++) { int x = ops[j]; if (rlast[x] == i && rreg[x] >= 0 && !rhome[x]) fr |= 1u << rreg[x]; } - if (u->op == U_ST) continue; - if (u->op == U_LI) { rk[d] = 1; rkv[d] = u->imm; continue; } - if (u->op == U_VGET) { rreg[d] = (signed char)u->imm; rhome[d] = 1; continue; } - for (k = 0; k < 32 && !(fr >> k & 1); k++); - if (k == 32) return -1; - fr &= ~(1u << k); rreg[d] = (signed char)k; - if (rlast[d] == -2) fr |= 1u << k; - } - return 0; -} -static int ropr(int x, int s) { if (rk[x]) { li(s, rkv[x]); return s; } return rreg[x]; } -/* w t <-> the data stack word o places from the top at block entry */ -static void rsw(int t, int o, int store) -{ - int by = o * 4; - if (by >= 0 && by < 16384) { if (store) str_u(t, SP, by); else ldr_u(t, SP, by); } - else if (by >= -256 && by < 256) E((store ? 0xb8000000u : 0xb8400000u) | (unsigned)(by & 0x1ff) << 12 | SP << 5 | t); /* stur, ldur */ - else { li(16, by); addx_ext(16, SP, 16, SXTW); if (store) str_u(t, 16, 0); else ldr_u(t, 16, 0); } -} -static void addsp(int by) -{ - if (by > 0 && by < 4096) E(0x91000294 | by << 10); - else if (by < 0 && -by < 4096) E(0xd1000294 | (-by) << 10); - else if (by) { li(16, by); addx_ext(SP, SP, 16, SXTW); } -} -static void rspill(Rg *R) -{ - int v; - for (v = 0; v < R->np; v++) { E(0x11000000 | R->ps[v] << 10 | 16); str_rr(R->pv[v], M, 16, UXTW); } /* add w16, w0, #slot */ -} -static void rload(Rg *R) -{ - int v; - li(16, ZFP); ldr_rr(0, M, 16, UXTW); - for (v = 1; v < R->nv; v++) { E(0x11000000 | R->slot[v] << 10 | 16); ldr_rr(v, M, 16, UXTW); } -} -static void rexitk(Rg *R, int t) { rspill(R); li(W0, t); b_to(x_disp); } -static void rbranch(int b) { rfa[rnf] = cp; rfb[rnf++] = b; E(0x14000000); } -/* m[a] = v, checked like the jit's own stores: a word some translation covers goes through hook */ -static void rstore(int a, int v) -{ - unsigned *p1, *p2, *p3; - int j; - E(0x7144001f | a << 5); /* cmp wa, #MW */ - p1 = cp; E(0x54000002); /* b.hs done */ - ldrx_u(15, ST, 32); - E(0x38604800 | a << 16 | 15 << 5 | 15); /* ldrb w15, [x15, wa, uxtw] */ - p2 = cp; E(0x35000000 | 15); /* cbnz w15, slow */ - str_rr(v, M, a, UXTW); - p3 = cp; E(0x14000000); - cb_fix(p2, cp); - E(0xd10203ff); /* sub sp, sp, #128 */ - for (j = 0; j < 16; j += 2) E(0xa9000000 | (j / 2 * 2) << 15 | (j + 1) << 10 | 31 << 5 | j); /* stp xj, xj+1, [sp, #8j] */ - movw(15, a); movw(1, v); movw(0, 15); - ldrx_u(16, ST, 64); blr(16); - for (j = 0; j < 16; j += 2) E(0xa9400000 | (j / 2 * 2) << 15 | (j + 1) << 10 | 31 << 5 | j); - E(0x910203ff); /* add sp, sp, #128 */ - cb_fix(p1, cp); - *p3 |= (cp - p3) & 0x3ffffff; -} -static void rpmove(Rg *R, RB *B) -{ - int dst[RMAXV], src[RMAXV], n = 0, j, k, x; - for (j = 1; j < R->nv; j++) - if (B->vs[j] >= 0 && !rk[B->vs[j]] && rreg[B->vs[j]] != j) { dst[n] = j; src[n] = rreg[B->vs[j]]; n++; } - while (n) { - for (j = 0; j < n; j++) { for (k = 0; k < n && src[k] != dst[j]; k++); if (k == n) break; } - if (j < n) { movw(dst[j], src[j]); n--; dst[j] = dst[n]; src[j] = src[n]; continue; } - x = src[0]; movw(16, x); /* a cycle: park one */ - for (k = 0; k < n; k++) if (src[k] == x) src[k] = 16; - } - for (j = 1; j < R->nv; j++) if (B->vs[j] >= 0 && rk[B->vs[j]]) li(j, rkv[B->vs[j]]); -} -static void emit_uop(int op, int d, int a, int b, int c, int tmp); -static int remit(Rg *R, int bi) -{ - RB *B = &R->b[bi]; - int i, j, d, a, b, c; - unsigned *p; - if (ralloc(R, B)) return -1; - for (i = 0; i < B->n; i++) { - Uop *u = &B->u[i]; - switch (u->op) { - case U_LI: case U_VGET: continue; - case U_SLD: rsw(rreg[u->d], u->imm, 0); continue; - case U_LD: - if (rk[u->a] && (unsigned)rkv[u->a] < MW) { /* a fixed address */ - if (rkv[u->a] < 4096) ldr_u(rreg[u->d], M, rkv[u->a] * 4); - else { li(16, rkv[u->a]); ldr_rr(rreg[u->d], M, 16, UXTW); } - continue; - } - break; - case U_ST: a = ropr(u->a, 16); rstore(a, ropr(u->b, 17)); continue; - case U_ADD: case U_SUB: - if (rk[u->b] && rkv[u->b] >= 0 && rkv[u->b] < 4096) { - E((u->op == U_ADD ? 0x11000000 : 0x51000000) | rkv[u->b] << 10 | ropr(u->a, 16) << 5 | rreg[u->d]); - continue; - } - break; - } - d = rreg[u->d]; - a = nargs(u->op) > 0 ? ropr(u->a, 16) : 0; - b = nargs(u->op) > 1 ? ropr(u->b, 17) : 0; - c = nargs(u->op) > 2 ? ropr(u->c, 15) : 0; - emit_uop(u->op, d, a, b, c, 15); - } - for (j = 0; j < B->nso; j++) rsw(ropr(B->so[2 * j + 1], 17), B->so[2 * j], 1); - if (B->term == T_CBR || B->term == T_JMP || B->term == T_CALL) { - if (rk[B->cv]) li(17, rkv[B->cv]); else movw(17, rreg[B->cv]); - } - addsp(B->delta * 4); - rpmove(R, B); - switch (B->term) { - case T_BR: rbranch(B->s1); break; - case T_CBR: - if (B->s1 >= 0) { rfa[rnf] = cp; rfb[rnf++] = B->s1; E(0x34000000 | 17); } /* cbz w17, taken */ - else { p = cp; E(0x35000000 | 17); rexitk(R, B->x1); cb_fix(p, cp); } - if (B->s2 >= 0) rbranch(B->s2); else rexitk(R, B->x2); - break; - case T_CALL: rspill(R); li(16, B->x2); str_post(16, RP, 4); movw(W0, 17); b_to(x_disp); break; - case T_RET: rspill(R); ldr_pre(W0, RP, -4); b_to(x_disp); break; - default: rspill(R); movw(W0, 17); b_to(x_disp); - } - return 0; -} -/* the whole region: entry stubs that load the vars, then the blocks */ -static int rjit(Rg *R, int wr) -{ - unsigned *start = cp, **lab; - int b, e, j, bad = 0; - long need = (long)(R->hi - R->lo) * 96 + (long)R->ne * 32 + 4096; - if (need > (code + CODEW) - cp) return -1; - if (wr) jitwrite(1); - lab = malloc((R->nb + 1) * sizeof *lab); - rfa = malloc((2 * R->nb + R->ne + 4) * sizeof *rfa); rfb = malloc((2 * R->nb + R->ne + 4) * sizeof *rfb); rnf = 0; - for (e = 0; e < R->ne; e++) { R->stub[e] = cp; rload(R); rbranch(R->entb[e]); } - for (b = 0; b < R->nb && !bad; b++) { lab[b] = cp; bad = remit(R, b); } - if (!bad) { - for (j = 0; j < rnf; j++) { - unsigned *at = rfa[j], *to = lab[rfb[j]]; - if ((*at & 0xfc000000u) == 0x14000000u) *at |= (to - at) & 0x3ffffff; else cb_fix(at, to); - } - R->nat = start; - for (e = 0; e < R->ne; e++) tab[R->ent[e]] = R->stub[e]; - syncicache(start, cp); - if (trace) fprintf(stderr, "o3: %d..%d -> %ld bytes of arm64\n", R->lo, R->hi - 1, (long)((char *)cp - (char *)start)); - } else { - cp = start; - if (trace) fprintf(stderr, "o3: %d..%d: a block needs too many registers\n", R->lo, R->hi - 1); - } - free(lab); free(rfa); free(rfb); - if (wr) jitwrite(0); - return bad; -} -static void rcompile(Rg *R, int eager) -{ - if (R->nat || R->nonat) return; - if (rjit(R, eager) && cp - code < CODEW / 2) R->nonat = 1; /* registers, not space: give up on it */ -} - -static int inst_hook(int d) { return install(d); } -static long xrun(long sp, int slot) { return (long)xexec(&enh[slot], (int *)sp); } - -static void *translate(int p) -{ - unsigned *start; - int i = p, n = 0, w, k, t; - if (cp - code > CODEW - 65536 || nbl >= MAXB) flush(); - if (o3ent[p]) { /* an o3 region starts here */ - Rg *R = rat(p); - if (R) { rcompile(R, 0); if (R->nat && tab[p]) return tab[p]; } - } - start = cp; - for (;;) { - if (i >= MW) { E(0x12800000); b_to(x_exit); break; } /* movn w0, #0: halt */ - if (n++ >= BLKW) { li(W0, i); b_to(x_disp); break; } - w = m[i]; - cov[i] = 1; - if (w & 1 && i + 1 < MW && !(m[i + 1] & 1) && (k = m[i + 1] / 2) >= 6 && k <= 8) { - t = (w - 1) / 2; /* literal + call/jmp/jz with a known target */ - cov[i + 1] = 1; - if (k == 8) { - unsigned *a; - ldr_post(X10, SP, 4); - a = cp; E(0x3500000a); /* cbnz w10, fallthrough */ - li(W0, t); b_to(x_disp); - cb_fix(a, cp); - i += 2; - continue; - } - li(X10, i + 2); - if (k == 6) str_post(X10, RP, 4); else str_u(X10, RP, 0); - li(W0, t); b_to(x_disp); - i += 2; - break; - } - if (w & 1) { - int L = 0, x, s, nk, ks[8], j; - Enh te; - while (L < 8 && i + L < MW && (m[i + L] & 1)) L++; - x = i + L < MW ? m[i + L] : 1; - if (!(x & 1) && (s = x / 2 - XOP0) >= 0 && s < NENH && enh[s].live && enh[s].nin) { - nk = L < enh[s].nin ? L : enh[s].nin; - for (j = 0; j < nk; j++) ks[j] = m[i + L - nk + j] >> 1; - if (!spec_enh(s, ks, nk, &te)) { - for (j = 0; j < L - nk; j++) { li(X9, m[i + j] >> 1); str_pre(X9, SP, -4); } - for (j = 0; j <= L; j++) cov[i + j] = 1; - emit_enh_e(&te, s); - free(te.u); free(te.reg); - i += L + 1; n += L; - continue; - } - } - li(X9, (w - 1) / 2); str_pre(X9, SP, -4); i++; continue; - } - k = w / 2; - if (k == 0) { E(0x12800000); b_to(x_exit); i++; break; } - if (k < 0 || k == 6 || k == 7) { - ldr_post(W0, SP, 4); - li(X10, i + 1); - if (k == 6) str_post(X10, RP, 4); else str_u(X10, RP, 0); - if (k < 0) { li(X11, 7 - k); addx_ext(RP, RP, X11, SXTW); } - b_to(x_disp); - i++; - break; - } - if (k == 8) { /* jz: taken leaves, not taken keeps going */ - ldp_post(X9, X10, SP, 8); - E(0x3500006a); /* cbnz w10, +3 */ - movw(W0, X9); - b_to(x_disp); - i++; - continue; - } - if (k == 9) { ldr_pre(W0, RP, -4); b_to(x_disp); i++; break; } - if (k == 21) { /* install: call into c, then return to it so it can flush */ - ldr_u(W0, SP, 0); ldrx_u(X11, ST, 72); blr(X11); str_u(W0, SP, 0); - li(W0, i + 1); b_to(x_exit); i++; break; - } - if (k >= XOP0 && k < XOP0 + NENH && enh[k - XOP0].live) { emit_enh(k - XOP0); i++; continue; } - if (k > 20) { E(0x12800000); b_to(x_exit); i++; break; } /* not wired: halt */ - op(i, k); - i++; - } - bl[nbl].a = p; - bl[nbl++].b = i; - tab[p] = start; - syncicache(start, cp); - if (trace) fprintf(stderr, "jit: %d..%d -> %ld bytes\n", p, i - 1, (long)((char *)cp - (char *)start)); - return start; -} - -#else -/* portable path for hosts without the arm64 jit: a plain interpreter with - the same semantics (shift counts wrap at 32, stores outside memory are - ignored, loads outside memory read 0, leaving memory halts). */ -#ifdef ZYLLVM -/* ---- llvm backend ---- - a tiered jit for hosts the arm64 backend doesn't cover. the interpreter - counts how often each block start is reached; a hot block is translated to - llvm ir (same block rules as the arm64 jit: it ends at call, jump, ret or - halt, and keeps going past a jz), optimized at O2 and compiled with orc. - enhancements are inlined as ir. stores into compiled words drop the blocks - that cover them, so self-modifying code still works. */ -#include <llvm-c/Core.h> -#include <llvm-c/Error.h> -#include <llvm-c/LLJIT.h> -#include <llvm-c/Orc.h> -#include <llvm-c/Target.h> -#include <llvm-c/Transforms/PassBuilder.h> -static int HOT = 5000; /* runs before a block gets compiled: ZYHOT */ -static const char *lpasses = "default<O2>"; /* ZYPASSES */ -#define LMAXB 65536 -typedef int (*Blk)(int *mem, int *regs); -static Blk lt[MW]; /* address -> compiled block */ -static unsigned short hot[MW]; -static unsigned char lcov[MW]; /* 1 if a compiled block covers the word */ -static struct { int a, b; } lbl[LMAXB]; -static int nlbl, llvm_ok, nblocks; -static LLVMOrcLLJITRef jit; -static LLVMOrcThreadSafeContextRef tsc; -static LLVMContextRef ctx; -static LLVMTypeRef i8t, i32t, i64t, ptrt, i1t; -static LLVMBuilderRef bd; -static LLVMValueRef fn_, vm_, vregs, vs, vr; /* function, memory, regs, s and r slots */ -static LLVMModuleRef mod_; - -static unsigned char rcov[MW]; /* 1 on the words of a lifted o3 region */ -static int rdrop(int a); -static void ldrop_all(void) -{ - rdrop_all(); memset(rcov, 0, sizeof rcov); - memset(lt, 0, sizeof lt); memset(lcov, 0, sizeof lcov); memset(hot, 0, sizeof hot); nlbl = 0; - if (trace) fprintf(stderr, "llvm: dropped every block\n"); -} -/* a store to a word some block covers: write it, drop those blocks */ -static int lhook(int a, int v) -{ - int j, x, hit = 0; - if (m[a] == v) return 0; - m[a] = v; - for (j = 0; j < nlbl; j++) - if (lbl[j].a >= 0 && lbl[j].a <= a && a < lbl[j].b) { - lt[lbl[j].a] = 0; hot[lbl[j].a] = 0; - if (trace) fprintf(stderr, "llvm: dropped %d..%d\n", lbl[j].a, lbl[j].b - 1); - lbl[j].a = -1; hit = 1; - } - if (rcov[a] && rdrop(a)) hit = 1; - if (hit) { - memset(lcov, 0, sizeof lcov); - for (j = 0; j < nlbl; j++) if (lbl[j].a >= 0) for (x = lbl[j].a; x < lbl[j].b; x++) lcov[x] = 1; - for (j = 0; j < nrg; j++) if (rgs[j]->lifted) for (x = rgs[j]->lo; x < rgs[j]->hi; x++) lcov[x] = 1; - } - return hit; -} -static int linstall(int d) { return install(d); } - -static LLVMValueRef K32(int v) { return LLVMConstInt(i32t, (unsigned)v, 0); } -static LLVMValueRef cptr(void *p) { return LLVMConstIntToPtr(LLVMConstInt(i64t, (unsigned long long)(size_t)p, 0), ptrt); } -static LLVMValueRef mslot(LLVMValueRef idx) { return LLVMBuildGEP2(bd, i32t, vm_, &idx, 1, ""); } -static LLVMValueRef ld(LLVMValueRef idx) { return LLVMBuildLoad2(bd, i32t, mslot(idx), ""); } -static void st(LLVMValueRef idx, LLVMValueRef v) { LLVMBuildStore(bd, v, mslot(idx)); } -static LLVMValueRef gets(void) { return LLVMBuildLoad2(bd, i32t, vs, ""); } -static void sets(LLVMValueRef v) { LLVMBuildStore(bd, v, vs); } -static LLVMValueRef add(LLVMValueRef a, int k) { return LLVMBuildAdd(bd, a, K32(k), ""); } -/* a load that reads 0 outside memory */ -static LLVMValueRef safeld(LLVMValueRef a) -{ - LLVMValueRef in = LLVMBuildICmp(bd, LLVMIntULT, a, K32(MW), ""); - LLVMValueRef v = ld(LLVMBuildSelect(bd, in, a, K32(0), "")); - return LLVMBuildSelect(bd, in, v, K32(0), ""); -} -static void push(LLVMValueRef v) { LLVMValueRef s = add(gets(), -1); sets(s); st(s, v); } -/* leave the block: write s and r back, return the next vm address */ -static void leave(LLVMValueRef next) -{ - LLVMValueRef r0 = K32(0), r1 = K32(1); - LLVMBuildStore(bd, gets(), LLVMBuildGEP2(bd, i32t, vregs, &r0, 1, "")); - LLVMBuildStore(bd, LLVMBuildLoad2(bd, i32t, vr, ""), LLVMBuildGEP2(bd, i32t, vregs, &r1, 1, "")); - LLVMBuildRet(bd, next); -} -static LLVMBasicBlockRef newbb(void) { return LLVMAppendBasicBlockInContext(ctx, fn_, ""); } -static LLVMValueRef callp(void *f, LLVMTypeRef ret, LLVMTypeRef *at, int n, LLVMValueRef *args) -{ - LLVMTypeRef ft = LLVMFunctionType(ret, at, (unsigned)n, 0); - return LLVMBuildCall2(bd, ft, cptr(f), args, (unsigned)n, ""); -} -/* one micro-op as ir: the same semantics as ev() */ -static LLVMValueRef ir_op(int op, LLVMValueRef a, LLVMValueRef b, LLVMValueRef c) -{ - LLVMValueRef z = K32(0), q, d, t, c1, c2, r = 0; - LLVMTypeRef i64 = i64t; - switch (op) { - case U_ADD: r = LLVMBuildAdd(bd, a, b, ""); break; - case U_SUB: r = LLVMBuildSub(bd, a, b, ""); break; - case U_MUL: r = LLVMBuildMul(bd, a, b, ""); break; - case U_SDIV: case U_SREM: /* /0 and INT_MIN/-1 are defined, like the cpu */ - c1 = LLVMBuildICmp(bd, LLVMIntEQ, b, z, ""); - c2 = LLVMBuildAnd(bd, LLVMBuildICmp(bd, LLVMIntEQ, a, K32((int)0x80000000), ""), LLVMBuildICmp(bd, LLVMIntEQ, b, K32(-1), ""), ""); - d = LLVMBuildSelect(bd, LLVMBuildOr(bd, c1, c2, ""), K32(1), b, ""); - if (op == U_SDIV) { q = LLVMBuildSDiv(bd, a, d, ""); r = LLVMBuildSelect(bd, c1, z, q, ""); } - else { q = LLVMBuildSRem(bd, a, d, ""); r = LLVMBuildSelect(bd, c1, a, LLVMBuildSelect(bd, c2, z, q, ""), ""); } - break; - case U_UDIV: case U_UREM: - c1 = LLVMBuildICmp(bd, LLVMIntEQ, b, z, ""); - d = LLVMBuildSelect(bd, c1, K32(1), b, ""); - if (op == U_UDIV) r = LLVMBuildSelect(bd, c1, z, LLVMBuildUDiv(bd, a, d, ""), ""); - else r = LLVMBuildSelect(bd, c1, a, LLVMBuildURem(bd, a, d, ""), ""); - break; - case U_AND: r = LLVMBuildAnd(bd, a, b, ""); break; - case U_OR: r = LLVMBuildOr(bd, a, b, ""); break; - case U_XOR: r = LLVMBuildXor(bd, a, b, ""); break; - case U_SHL: r = LLVMBuildShl(bd, a, LLVMBuildAnd(bd, b, K32(31), ""), ""); break; - case U_SHR: r = LLVMBuildLShr(bd, a, LLVMBuildAnd(bd, b, K32(31), ""), ""); break; - case U_SAR: r = LLVMBuildAShr(bd, a, LLVMBuildAnd(bd, b, K32(31), ""), ""); break; - case U_NEG: r = LLVMBuildSub(bd, z, a, ""); break; - case U_NOT: r = LLVMBuildNot(bd, a, ""); break; - case U_LT: r = LLVMBuildZExt(bd, LLVMBuildICmp(bd, LLVMIntSLT, a, b, ""), i32t, ""); break; - case U_LTU: r = LLVMBuildZExt(bd, LLVMBuildICmp(bd, LLVMIntULT, a, b, ""), i32t, ""); break; - case U_EQ: r = LLVMBuildZExt(bd, LLVMBuildICmp(bd, LLVMIntEQ, a, b, ""), i32t, ""); break; - case U_NE: r = LLVMBuildZExt(bd, LLVMBuildICmp(bd, LLVMIntNE, a, b, ""), i32t, ""); break; - case U_MIN: r = LLVMBuildSelect(bd, LLVMBuildICmp(bd, LLVMIntSLT, a, b, ""), a, b, ""); break; - case U_MAX: r = LLVMBuildSelect(bd, LLVMBuildICmp(bd, LLVMIntSGT, a, b, ""), a, b, ""); break; - case U_MINU: r = LLVMBuildSelect(bd, LLVMBuildICmp(bd, LLVMIntULT, a, b, ""), a, b, ""); break; - case U_MAXU: r = LLVMBuildSelect(bd, LLVMBuildICmp(bd, LLVMIntUGT, a, b, ""), a, b, ""); break; - case U_MULHS: case U_MULHU: { - LLVMValueRef x = op == U_MULHS ? LLVMBuildSExt(bd, a, i64, "") : LLVMBuildZExt(bd, a, i64, ""); - LLVMValueRef y = op == U_MULHS ? LLVMBuildSExt(bd, b, i64, "") : LLVMBuildZExt(bd, b, i64, ""); - r = LLVMBuildTrunc(bd, LLVMBuildLShr(bd, LLVMBuildMul(bd, x, y, ""), LLVMConstInt(i64, 32, 0), ""), i32t, ""); - break; } - case U_CLZ: { - unsigned id = LLVMLookupIntrinsicID("llvm.ctlz", 9); - LLVMValueRef f = LLVMGetIntrinsicDeclaration(mod_, id, &i32t, 1), args[2]; - args[0] = a; args[1] = LLVMConstInt(i1t, 0, 0); - r = LLVMBuildCall2(bd, LLVMIntrinsicGetType(ctx, id, &i32t, 1), f, args, 2, ""); - break; } - case U_ABS: t = LLVMBuildICmp(bd, LLVMIntSLT, a, z, ""); r = LLVMBuildSelect(bd, t, LLVMBuildSub(bd, z, a, ""), a, ""); break; - case U_SEL: r = LLVMBuildSelect(bd, LLVMBuildICmp(bd, LLVMIntNE, a, z, ""), b, c, ""); break; - } - return r; -} -/* an enhancement as ir */ -static void ir_enh(Enh *e) -{ - LLVMValueRef *v = calloc(e->nv + 1, sizeof *v), s = gets(); - int i, j; - for (j = 0; j < e->nin; j++) v[j] = ld(add(s, e->nin - 1 - j)); - for (i = 0; i < e->n; i++) { - Uop *u = &e->u[i]; - LLVMValueRef a = u->op == U_LI ? 0 : v[u->a], b = uarity[u->op] > 1 || u->op == U_ST ? v[u->b] : 0, c = uarity[u->op] > 2 ? v[u->c] : 0, r = 0; - switch (u->op) { - case U_LI: r = K32(u->imm); break; - case U_LD: r = safeld(a); break; - case U_ST: { - LLVMBasicBlockRef yes = newbb(), done = newbb(); - LLVMBuildCondBr(bd, LLVMBuildICmp(bd, LLVMIntULT, a, K32(MW), ""), yes, done); - LLVMPositionBuilderAtEnd(bd, yes); st(a, b); LLVMBuildBr(bd, done); - LLVMPositionBuilderAtEnd(bd, done); - break; } - default: r = ir_op(u->op, a, b, c); - } - if (u->op != U_ST) v[u->d] = r; - } - s = add(s, e->nin - e->nout); sets(s); - for (j = 0; j < e->nout; j++) st(add(s, e->nout - 1 - j), v[e->out[j]]); - free(v); -} -static void llvm_init(void) -{ - LLVMErrorRef err; - if (getenv("ZYHOT")) HOT = atoi(getenv("ZYHOT")); - if (HOT < 1) HOT = 1; - if (HOT > 65000) HOT = 65000; - if (getenv("ZYPASSES")) lpasses = getenv("ZYPASSES"); - LLVMInitializeNativeTarget(); LLVMInitializeNativeAsmPrinter(); - if ((err = LLVMOrcCreateLLJIT(&jit, 0))) { char *msg = LLVMGetErrorMessage(err); fprintf(stderr, "llvm: %s\n", msg); LLVMDisposeErrorMessage(msg); return; } - tsc = LLVMOrcCreateNewThreadSafeContext(); - ctx = LLVMOrcThreadSafeContextGetContext(tsc); - i1t = LLVMInt1TypeInContext(ctx); i8t = LLVMInt8TypeInContext(ctx); i32t = LLVMInt32TypeInContext(ctx); - i64t = LLVMInt64TypeInContext(ctx); ptrt = LLVMPointerTypeInContext(ctx, 0); - bd = LLVMCreateBuilderInContext(ctx); - llvm_ok = 1; -} -/* compile the block at p; 0 if it couldn't be */ -static Blk lcompile(int p) -{ - char name[32]; LLVMTypeRef pt[2], ft; LLVMValueRef s, a, b, v, r, args[2]; LLVMTypeRef at[2]; - LLVMOrcExecutorAddress addr; LLVMErrorRef err; LLVMPassBuilderOptionsRef po; - int i = p, n = 0, w, k, t, done = 0; - if (!llvm_ok || nlbl >= LMAXB) return 0; - sprintf(name, "b%d_%d", p, nblocks++); - mod_ = LLVMModuleCreateWithNameInContext(name, ctx); - pt[0] = ptrt; pt[1] = ptrt; - ft = LLVMFunctionType(i32t, pt, 2, 0); - fn_ = LLVMAddFunction(mod_, name, ft); - vm_ = LLVMGetParam(fn_, 0); vregs = LLVMGetParam(fn_, 1); - LLVMPositionBuilderAtEnd(bd, newbb()); - vs = LLVMBuildAlloca(bd, i32t, "s"); vr = LLVMBuildAlloca(bd, i32t, "r"); - { LLVMValueRef r0 = K32(0), r1 = K32(1); - sets(LLVMBuildLoad2(bd, i32t, LLVMBuildGEP2(bd, i32t, vregs, &r0, 1, ""), "")); - LLVMBuildStore(bd, LLVMBuildLoad2(bd, i32t, LLVMBuildGEP2(bd, i32t, vregs, &r1, 1, ""), ""), vr); } - while (!done) { - if (i >= MW) { leave(K32(MW)); break; } - if (n++ >= 1024) { leave(K32(i)); break; } - w = m[i]; - lcov[i] = 1; - if (w & 1) { - /* a literal followed by call, jump or jz: a known target */ - if (i + 1 < MW && !(m[i + 1] & 1) && (k = m[i + 1] / 2) >= 6 && k <= 8) { - t = w >> 1; lcov[i + 1] = 1; - if (k == 8) { - LLVMBasicBlockRef tk = newbb(), go = newbb(); - s = gets(); a = ld(s); sets(add(s, 1)); - LLVMBuildCondBr(bd, LLVMBuildICmp(bd, LLVMIntEQ, a, K32(0), ""), tk, go); - LLVMPositionBuilderAtEnd(bd, tk); leave(K32(t)); - LLVMPositionBuilderAtEnd(bd, go); - i += 2; continue; - } - if (k == 6) { r = LLVMBuildLoad2(bd, i32t, vr, ""); st(r, K32(i + 2)); LLVMBuildStore(bd, add(r, 1), vr); } - leave(K32(t)); i += 2; break; - } - push(K32(w >> 1)); i++; continue; - } - k = w / 2; - s = gets(); - switch (k) { - case 0: leave(K32(MW)); done = 1; break; - case 1: st(s, safeld(ld(s))); break; - case 2: { - LLVMBasicBlockRef in = newbb(), cv = newbb(), plain = newbb(), out = newbb(), quit = newbb(); - a = ld(s); b = ld(add(s, 1)); sets(add(s, 2)); - LLVMBuildCondBr(bd, LLVMBuildICmp(bd, LLVMIntULT, a, K32(MW), ""), in, out); - LLVMPositionBuilderAtEnd(bd, in); - v = LLVMBuildLoad2(bd, i8t, LLVMBuildGEP2(bd, i8t, cptr(lcov), &a, 1, ""), ""); - LLVMBuildCondBr(bd, LLVMBuildICmp(bd, LLVMIntNE, v, LLVMConstInt(i8t, 0, 0), ""), cv, plain); - LLVMPositionBuilderAtEnd(bd, plain); st(a, b); LLVMBuildBr(bd, out); - LLVMPositionBuilderAtEnd(bd, cv); - at[0] = i32t; at[1] = i32t; args[0] = a; args[1] = b; - v = callp((void *)lhook, i32t, at, 2, args); - LLVMBuildCondBr(bd, LLVMBuildICmp(bd, LLVMIntNE, v, K32(0), ""), quit, out); - LLVMPositionBuilderAtEnd(bd, quit); leave(K32(i + 1)); /* a block died: back to the loop */ - LLVMPositionBuilderAtEnd(bd, out); - break; } - case 3: a = ld(s); st(s, safeld(LLVMBuildAdd(bd, add(s, 1), a, ""))); break; - case 4: sets(add(s, 1)); break; - case 5: a = ld(s); b = ld(add(s, 1)); st(s, b); st(add(s, 1), a); break; - case 6: case 7: - a = ld(s); sets(add(s, 1)); - if (k == 6) { r = LLVMBuildLoad2(bd, i32t, vr, ""); st(r, K32(i + 1)); LLVMBuildStore(bd, add(r, 1), vr); } - leave(a); done = 1; break; - case 8: { - LLVMBasicBlockRef tk = newbb(), go = newbb(); - a = ld(s); b = ld(add(s, 1)); sets(add(s, 2)); - LLVMBuildCondBr(bd, LLVMBuildICmp(bd, LLVMIntEQ, b, K32(0), ""), tk, go); - LLVMPositionBuilderAtEnd(bd, tk); leave(a); - LLVMPositionBuilderAtEnd(bd, go); - break; } - case 9: - r = add(LLVMBuildLoad2(bd, i32t, vr, ""), -1); LLVMBuildStore(bd, r, vr); - leave(ld(r)); done = 1; break; - case 10: v = callp((void *)Q, i8t, 0, 0, 0); push(LLVMBuildSExt(bd, v, i32t, "")); break; - case 11: - if (sizeof J == 1) push(LLVMBuildZExt(bd, LLVMBuildLoad2(bd, i8t, cptr(&J), ""), i32t, "")); - else push(LLVMBuildLoad2(bd, i32t, cptr(&J), "")); - break; - case 12: at[0] = i8t; args[0] = LLVMBuildTrunc(bd, ld(s), i8t, ""); callp((void *)G, LLVMVoidTypeInContext(ctx), at, 1, args); sets(add(s, 1)); break; - case 13: case 14: case 15: case 16: case 17: case 18: case 19: case 20: - a = ld(s); b = ld(add(s, 1)); s = add(s, 1); sets(s); - switch (k) { - case 13: v = LLVMBuildAdd(bd, b, a, ""); break; - case 14: v = LLVMBuildSub(bd, b, a, ""); break; - case 15: v = LLVMBuildMul(bd, b, a, ""); break; - case 16: v = LLVMBuildAnd(bd, b, a, ""); break; - case 17: v = LLVMBuildOr(bd, b, a, ""); break; - case 18: v = LLVMBuildXor(bd, b, a, ""); break; - case 19: v = LLVMBuildAShr(bd, b, LLVMBuildAnd(bd, a, K32(31), ""), ""); break; - default: v = LLVMBuildZExt(bd, LLVMBuildICmp(bd, LLVMIntSLT, b, a, ""), i32t, ""); - } - st(s, v); break; - case 21: /* install: then back to the loop, which drops every block */ - at[0] = i32t; args[0] = ld(s); - st(s, callp((void *)linstall, i32t, at, 1, args)); - leave(K32(i + 1)); done = 1; break; - default: - if (k >= XOP0 && k < XOP0 + NENH && enh[k - XOP0].live) { ir_enh(&enh[k - XOP0]); break; } - leave(K32(MW)); done = 1; /* not wired: halt */ - } - i++; - } - lbl[nlbl].a = p; lbl[nlbl++].b = i; - po = LLVMCreatePassBuilderOptions(); - if ((err = LLVMRunPasses(mod_, lpasses, 0, po))) { LLVMConsumeError(err); } - LLVMDisposePassBuilderOptions(po); - if ((err = LLVMOrcLLJITAddLLVMIRModule(jit, LLVMOrcLLJITGetMainJITDylib(jit), LLVMOrcCreateNewThreadSafeModule(mod_, tsc)))) { - char *msg = LLVMGetErrorMessage(err); fprintf(stderr, "llvm: %s\n", msg); LLVMDisposeErrorMessage(msg); return 0; - } - if ((err = LLVMOrcLLJITLookup(jit, &addr, name))) { char *msg = LLVMGetErrorMessage(err); fprintf(stderr, "llvm: %s\n", msg); LLVMDisposeErrorMessage(msg); return 0; } - if (trace) fprintf(stderr, "llvm: %d..%d compiled\n", p, i - 1); - return (Blk)(size_t)addr; -} -#endif - -/* ---- o3 regions without the arm64 jit: compiled by llvm, or run here ---- */ -#ifndef ZYLLVM -static unsigned char rcov[MW]; /* 1 on the words of a lifted region */ -#endif -static int rvals[MAXUOP * 4 + 16]; -static int rdrop(int a) /* a store landed on region code: drop those regions */ -{ - int j, x, hit = 0; - for (j = 0; j < nrg; j++) - if (rgs[j]->lifted && rgs[j]->lo <= a && a < rgs[j]->hi) { - if (trace) fprintf(stderr, "o3: dropped %d..%d (a store to %d: %d)\n", rgs[j]->lo, rgs[j]->hi - 1, a, m[a]); - rclear(rgs[j]); hit = 1; - } - if (hit) { - memset(rcov, 0, sizeof rcov); - for (j = 0; j < nrg; j++) if (rgs[j]->lifted) for (x = rgs[j]->lo; x < rgs[j]->hi; x++) rcov[x] = 1; - } - return hit; -} -#ifdef ZYLLVM -static int lhook(int a, int v); -#define RSTORE(a, b) do { if ((unsigned)(a) < MW) { if (lcov[a]) lhook(a, b); else m[a] = b; } } while (0) -#else -#define RSTORE(a, b) do { if ((unsigned)(a) < MW) { m[a] = b; if (rcov[a]) rdrop(a); } } while (0) -#endif -/* the region interpreter: ssa values in an array, vars in locals */ -static int rexec(Rg *R, int e, int *ps, int *pr) -{ - int var[RMAXV], nv2[RMAXV], *v = rvals, s = *ps, r = *pr, b = R->entb[e], fp, j, i, t, o; - var[0] = fp = mread(ZFP); - for (j = 1; j < R->nv; j++) var[j] = mread(fp + R->slot[j]); - for (;;) { - RB *B = &R->b[b]; - for (i = 0; i < B->n; i++) { - Uop *u = &B->u[i]; - switch (u->op) { - case U_LI: v[u->d] = u->imm; break; - case U_VGET: v[u->d] = var[u->imm]; break; - case U_SLD: v[u->d] = mread(s + u->imm); break; - case U_LD: v[u->d] = mread(v[u->a]); break; - case U_ST: RSTORE(v[u->a], v[u->b]); break; - default: v[u->d] = ev(u->op, v[u->a], v[u->b], v[u->c]); - } - } - for (j = 0; j < B->nso; j++) { o = s + B->so[2 * j]; if ((unsigned)o < MW) m[o] = v[B->so[2 * j + 1]]; } - s += B->delta; - for (j = 1; j < R->nv; j++) if (B->vs[j] >= 0) nv2[j] = v[B->vs[j]]; - for (j = 1; j < R->nv; j++) if (B->vs[j] >= 0) var[j] = nv2[j]; - if (B->term == T_BR) { b = B->s1; continue; } - if (B->term == T_CBR) { - if (!v[B->cv]) { if (B->s1 >= 0) { b = B->s1; continue; } t = B->x1; } - else { if (B->s2 >= 0) { b = B->s2; continue; } t = B->x2; } - } else if (B->term == T_JMP) t = v[B->cv]; - else if (B->term == T_CALL) { m[r++] = B->x2; t = v[B->cv]; } - else t = m[--r]; - break; - } - for (j = 0; j < R->np; j++) if ((unsigned)(fp + R->ps[j]) < MW) m[fp + R->ps[j]] = var[R->pv[j]]; - *ps = s; *pr = r; - return t; -} -#ifndef ZYLLVM -static void rforget(Rg *R) { (void)R; } -static void rmark(Rg *R) { int x; for (x = R->lo; x < R->hi; x++) rcov[x] = 1; } -static void rcompile(Rg *R, int eager) { (void)R; (void)eager; } -#endif -#ifdef ZYLLVM - -/* ---- o3 regions in llvm: one function per region, vars in allocas (so - mem2reg makes them ssa across blocks), each block's micro-ops as ir, then - the O3 pipeline. f(mem, regs, entry) returns the next vm address. */ -typedef int (*RFn)(int *mem, int *regs, int ent); -static int nregions; -static LLVMValueRef rvv[RMAXV]; -static void rforget(Rg *R) { R->nat = 0; } -static void rmark(Rg *R) { int x; for (x = R->lo; x < R->hi; x++) rcov[x] = lcov[x] = 1; } -static void rspill_ir(Rg *R) -{ - LLVMValueRef fp = LLVMBuildLoad2(bd, i32t, rvv[0], ""); - int j; - for (j = 0; j < R->np; j++) st(add(fp, R->ps[j]), LLVMBuildLoad2(bd, i32t, rvv[R->pv[j]], "")); -} -static LLVMBasicBlockRef rexit_bb(Rg *R, int t) -{ - LLVMBasicBlockRef here = LLVMGetInsertBlock(bd), x = newbb(); - LLVMPositionBuilderAtEnd(bd, x); - rspill_ir(R); leave(K32(t)); - LLVMPositionBuilderAtEnd(bd, here); - return x; -} -/* m[a] = v, through lhook if some compiled code covers the word */ -static void rstore_ir(LLVMValueRef a, LLVMValueRef b) -{ - LLVMBasicBlockRef in = newbb(), cv = newbb(), plain = newbb(), out = newbb(); - LLVMValueRef v, args[2]; LLVMTypeRef at[2]; - LLVMBuildCondBr(bd, LLVMBuildICmp(bd, LLVMIntULT, a, K32(MW), ""), in, out); - LLVMPositionBuilderAtEnd(bd, in); - v = LLVMBuildLoad2(bd, i8t, LLVMBuildGEP2(bd, i8t, cptr(lcov), &a, 1, ""), ""); - LLVMBuildCondBr(bd, LLVMBuildICmp(bd, LLVMIntNE, v, LLVMConstInt(i8t, 0, 0), ""), cv, plain); - LLVMPositionBuilderAtEnd(bd, plain); st(a, b); LLVMBuildBr(bd, out); - LLVMPositionBuilderAtEnd(bd, cv); - at[0] = i32t; at[1] = i32t; args[0] = a; args[1] = b; - callp((void *)lhook, i32t, at, 2, args); - LLVMBuildBr(bd, out); - LLVMPositionBuilderAtEnd(bd, out); -} -static void *lregion(Rg *R) -{ - char name[40]; LLVMTypeRef pt[3], ft; LLVMValueRef ent, sw, *val, s0, fp, r; - LLVMBasicBlockRef *bb, eb, dflt; - LLVMOrcExecutorAddress addr; LLVMErrorRef err; LLVMPassBuilderOptionsRef po; - int b, i, j, e; - sprintf(name, "o3_%d_%d", R->lo, nregions++); - mod_ = LLVMModuleCreateWithNameInContext(name, ctx); - pt[0] = ptrt; pt[1] = ptrt; pt[2] = i32t; - ft = LLVMFunctionType(i32t, pt, 3, 0); - fn_ = LLVMAddFunction(mod_, name, ft); - vm_ = LLVMGetParam(fn_, 0); vregs = LLVMGetParam(fn_, 1); ent = LLVMGetParam(fn_, 2); - LLVMPositionBuilderAtEnd(bd, newbb()); - vs = LLVMBuildAlloca(bd, i32t, "s"); vr = LLVMBuildAlloca(bd, i32t, "r"); - for (j = 0; j < R->nv; j++) rvv[j] = LLVMBuildAlloca(bd, i32t, ""); - { LLVMValueRef r0 = K32(0), r1 = K32(1); - sets(LLVMBuildLoad2(bd, i32t, LLVMBuildGEP2(bd, i32t, vregs, &r0, 1, ""), "")); - LLVMBuildStore(bd, LLVMBuildLoad2(bd, i32t, LLVMBuildGEP2(bd, i32t, vregs, &r1, 1, ""), ""), vr); } - bb = malloc(R->nb * sizeof *bb); - for (b = 0; b < R->nb; b++) bb[b] = newbb(); - dflt = newbb(); - sw = LLVMBuildSwitch(bd, ent, dflt, (unsigned)R->ne); - for (e = 0; e < R->ne; e++) { - eb = newbb(); - LLVMAddCase(sw, K32(e), eb); - LLVMPositionBuilderAtEnd(bd, eb); - fp = ld(K32(ZFP)); - LLVMBuildStore(bd, fp, rvv[0]); - for (j = 1; j < R->nv; j++) LLVMBuildStore(bd, safeld(add(fp, R->slot[j])), rvv[j]); - LLVMBuildBr(bd, bb[R->entb[e]]); - } - LLVMPositionBuilderAtEnd(bd, dflt); leave(K32(-1)); - val = calloc(R->maxnv + 1, sizeof *val); - for (b = 0; b < R->nb; b++) { - RB *B = &R->b[b]; - LLVMPositionBuilderAtEnd(bd, bb[b]); - s0 = gets(); - for (i = 0; i < B->n; i++) { - Uop *u = &B->u[i]; - LLVMValueRef a = nargs(u->op) > 0 ? val[u->a] : 0, x = nargs(u->op) > 1 ? val[u->b] : 0, c = nargs(u->op) > 2 ? val[u->c] : 0; - switch (u->op) { - case U_LI: val[u->d] = K32(u->imm); break; - case U_VGET: val[u->d] = LLVMBuildLoad2(bd, i32t, rvv[u->imm], ""); break; - case U_SLD: val[u->d] = ld(add(s0, u->imm)); break; - case U_LD: val[u->d] = safeld(a); break; - case U_ST: rstore_ir(a, x); break; - default: val[u->d] = ir_op(u->op, a, x, c); - } - } - for (j = 0; j < B->nso; j++) st(add(s0, B->so[2 * j]), val[B->so[2 * j + 1]]); - sets(add(s0, B->delta)); - for (j = 1; j < R->nv; j++) if (B->vs[j] >= 0) LLVMBuildStore(bd, val[B->vs[j]], rvv[j]); - switch (B->term) { - case T_BR: LLVMBuildBr(bd, bb[B->s1]); break; - case T_CBR: - LLVMBuildCondBr(bd, LLVMBuildICmp(bd, LLVMIntEQ, val[B->cv], K32(0), ""), - B->s1 >= 0 ? bb[B->s1] : rexit_bb(R, B->x1), B->s2 >= 0 ? bb[B->s2] : rexit_bb(R, B->x2)); - break; - case T_CALL: - r = LLVMBuildLoad2(bd, i32t, vr, ""); st(r, K32(B->x2)); LLVMBuildStore(bd, add(r, 1), vr); - rspill_ir(R); leave(val[B->cv]); - break; - case T_RET: - r = add(LLVMBuildLoad2(bd, i32t, vr, ""), -1); LLVMBuildStore(bd, r, vr); - rspill_ir(R); leave(ld(r)); - break; - default: rspill_ir(R); leave(val[B->cv]); - } - } - free(val); free(bb); - po = LLVMCreatePassBuilderOptions(); - if ((err = LLVMRunPasses(mod_, "default<O3>", 0, po))) LLVMConsumeError(err); - LLVMDisposePassBuilderOptions(po); - if ((err = LLVMOrcLLJITAddLLVMIRModule(jit, LLVMOrcLLJITGetMainJITDylib(jit), LLVMOrcCreateNewThreadSafeModule(mod_, tsc)))) { - char *msg = LLVMGetErrorMessage(err); fprintf(stderr, "llvm: %s\n", msg); LLVMDisposeErrorMessage(msg); return 0; - } - if ((err = LLVMOrcLLJITLookup(jit, &addr, name))) { char *msg = LLVMGetErrorMessage(err); fprintf(stderr, "llvm: %s\n", msg); LLVMDisposeErrorMessage(msg); return 0; } - if (trace) fprintf(stderr, "o3: %d..%d compiled by llvm\n", R->lo, R->hi - 1); - return (void *)(size_t)addr; -} -static void rcompile(Rg *R, int eager) -{ - (void)eager; - if (R->nat || R->nonat || !llvm_ok) return; - if (!(R->nat = lregion(R))) R->nonat = 1; -} -#endif -#define LD(x) ((unsigned)(x) < MW ? m[x] : 0) -static int run(int p) -{ - int s = DS0, r = RS0, w, a, b, xfer = 1; - unsigned long long steps = 0; -#ifdef ZYLLVM - int regs[2]; - if (!getenv("ZYNOLLVM")) llvm_init(); -#endif - while ((unsigned)p < MW) { - if (xfer && (s < DSLIM || r > RSLIM)) { p = s < DSLIM ? MW + 1 : MW + 2; break; } - if (xfer && o3ent[p]) { /* an o3 region */ - Rg *R = rat(p); - if (R) { -#ifdef ZYLLVM - rcompile(R, 0); - if (R->nat) { regs[0] = s; regs[1] = r; p = ((RFn)R->nat)(m, regs, o3ei[p]); s = regs[0]; r = regs[1]; } - else -#endif - p = rexec(R, o3ei[p], &s, &r); - continue; - } - } -#ifdef ZYLLVM - if (xfer && llvm_ok) { /* at a block start: run it compiled, or count it */ - xfer = 0; - if (!lt[p] && hot[p] < 65535 && ++hot[p] == HOT && !(lt[p] = lcompile(p))) hot[p] = 65535; - if (lt[p]) { - regs[0] = s; regs[1] = r; - p = lt[p](m, regs); - s = regs[0]; r = regs[1]; - if (need_flush) { need_flush = 0; ldrop_all(); } - xfer = 1; - continue; - } - } -#endif - w = m[p++]; - steps++; - if (w & 1) { m[--s] = w >> 1; continue; } - a = m[s]; b = m[s + 1]; - switch (w / 2) { - case 1: m[s] = LD(a); break; - case 2: - if ((unsigned)a < MW) { -#ifdef ZYLLVM - if (lcov[a]) lhook(a, b); else -#else - if (rcov[a]) { m[a] = b; rdrop(a); } else -#endif - m[a] = b; - } - s += 2; break; - case 3: m[s] = LD(s + 1 + a); break; - case 4: s++; break; - case 5: m[s] = b; m[s + 1] = a; break; - case 6: m[r++] = p; p = a; s++; xfer = 1; break; - case 7: p = a; s++; xfer = 1; break; - case 8: if (!b) { p = a; xfer = 1; } s += 2; break; - case 9: p = m[--r]; xfer = 1; break; - case 10: m[--s] = (signed char)Q(); break; - case 11: m[--s] = J; break; - case 12: G((char)a); s++; break; - case 13: m[++s] = b + a; break; - case 14: m[++s] = (int)((unsigned)b - (unsigned)a); break; - case 15: m[++s] = (int)((unsigned)b * (unsigned)a); break; - case 16: m[++s] = b & a; break; - case 17: m[++s] = b | a; break; - case 18: m[++s] = b ^ a; break; - case 19: m[++s] = b >> (a & 31); break; - case 20: m[++s] = b < a; break; - case 21: - m[s] = install(a); -#ifdef ZYLLVM - if (need_flush) { need_flush = 0; ldrop_all(); } -#else - if (need_flush) { need_flush = 0; rdrop_all(); memset(rcov, 0, sizeof rcov); } -#endif - break; - default: - if (w / 2 >= XOP0 && w / 2 < XOP0 + NENH && enh[w / 2 - XOP0].live) s = (int)(xexec(&enh[w / 2 - XOP0], m + s) - m); - else p = MW; /* halt: unwired opcodes and the reserved negative ones */ - } - } - if (trace) fprintf(stderr, "interp: %llu steps\n", steps); - return stopped(p); -} -#endif - -int main(void) -{ - trace = getenv("ZYTRACE") != 0; - memcpy(m + GORG, genome, sizeof genome); -#ifdef ZYJIT - { - int p = GORG; - union { unsigned *u; int (*f)(long *, void *); } enter; -#ifdef __APPLE__ - code = mmap(0, CODEW * 4, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON | MAP_JIT, -1, 0); -#else - code = mmap(0, CODEW * 4, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); -#endif - if (code == MAP_FAILED) { perror("mmap"); return 1; } - jitwrite(1); - build_stubs(); - jitwrite(0); - syncicache(code, cp); - S[0] = (long)m; S[1] = DS0; S[2] = RS0; S[3] = (long)tab; S[4] = (long)cov; - S[5] = (long)Q; S[6] = (long)G; S[7] = (long)&J; S[8] = (long)hook; - S[9] = (long)inst_hook; S[10] = (long)xrun; - S[11] = (long)(m + DSLIM); S[12] = (long)(m + RSLIM); - enter.u = x_enter; - while ((unsigned)p < MW) { - void *c = tab[p]; - if (!c) { jitwrite(1); c = translate(p); jitwrite(0); } - p = enter.f(S, c); - if (need_flush) { need_flush = 0; jitwrite(1); flush(); jitwrite(0); } - } - return stopped(p); - } -#else - return run(GORG); -#endif - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/examples/bf.zc b/docs/history/17-o3-boundaries/code/examples/bf.zc deleted file mode 100644 index 384025a..0000000 --- a/docs/history/17-o3-boundaries/code/examples/bf.zc +++ /dev/null @@ -1,50 +0,0 @@ -// a brainfuck compiler. it turns a brainfuck program into zc source, hands -// that to the compiler that's sitting in memory, and runs the result, which on -// arm64 means native code. runs of + - < > fold into one statement each. -// give it a program after a backtick, or it runs the hello world below. -let out[30000], n, depth; -fn emit(s) { let i = 0; while (s[i]) { out[n] = s[i]; n++; i++; } return 0; } -fn emitn(int v) { if (v >= 10) emitn(v / 10); out[n] = '0' + v % 10; n++; return 0; } -// how many times does c repeat from s[i] -int run(s, int i, int c) { int k = 0; while (s[i + k] == c) k++; return k; } - -fn translate(s) -{ - int i = 0, k; - n = 0; depth = 0; - emit("let t[30000], p = 0;\n"); - while (s[i]) { - switch (s[i]) { - case '+', '-': - k = run(s, i, s[i]); - emit("t[p] = (t[p] "); emit(s[i] == '+' ? "+ " : "- "); emitn(k); emit(") & 255;\n"); - i = i + k; continue; - case '>', '<': - k = run(s, i, s[i]); - emit("p "); emit(s[i] == '>' ? "+= " : "-= "); emitn(k); emit(";\n"); - i = i + k; continue; - case '[': emit("while (t[p]) {\n"); depth++; - case ']': emit("}\n"); depth--; - case '.': emit("putc(t[p]);\n"); - case ',': emit("t[p] = eof() ? 0 : getc() & 255;\n"); - } - i++; - } - emit("return 0;\n"); - out[n] = 0; - return depth; -} -let hello = "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++."; -let prog[20000]; -fn main() -{ - let src = hello, k = 0, lines = 0, i = 0; - while (!eof() && k < 19999) { let c = getc(); if (c != 10) { prog[k] = c; k++; } } - prog[k] = 0; - if (k) src = prog; - if (translate(src)) { puts("unbalanced brackets\n"); return 1; } - while (out[i]) { if (out[i] == 10) lines++; i++; } - puts("compiled to "); putn(lines); puts(" lines of zc, running it:\n"); - evals(out); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/examples/dump.zc b/docs/history/17-o3-boundaries/code/examples/dump.zc deleted file mode 100644 index 6082213..0000000 --- a/docs/history/17-o3-boundaries/code/examples/dump.zc +++ /dev/null @@ -1,32 +0,0 @@ -// printing any struct with no printing code: the heap knows each object's -// type, and reflection walks its fields -struct person { *char name; int age; }; -struct item { *char name; int count; *person owner; }; - -fn dump(p) -{ - let t = typeof_obj(p), i = 0; - if (!t) { puts("?"); return 0; } - tprint(t); puts(" { "); - while (i < tnfields(t)) { - let ft = tftype(t, i), v = p[tfoff(t, i)]; - if (i) puts(", "); - puts(tfname(t, i)); puts(": "); - if (tkind(ft) == TY_PTR && telem(ft) == typeof(char)) { putc('"'); puts(v); putc('"'); } - else if (tkind(ft) == TY_PTR) { if (v) dump(v); else puts("null"); } - else putn(v); - i++; - } - puts(" }"); - return 0; -} -fn main() -{ - *person ana = new(person); - ana.name = "ana"; ana.age = 30; - *item lamp = new(item); - lamp.name = "lamp"; lamp.count = 3; lamp.owner = ana; - dump(lamp); putc(10); - free(d*lamp); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/examples/echo.zc b/docs/history/17-o3-boundaries/code/examples/echo.zc deleted file mode 100644 index 01f28b0..0000000 --- a/docs/history/17-o3-boundaries/code/examples/echo.zc +++ /dev/null @@ -1,2 +0,0 @@ -// everything after the backtick is left unread, for the program itself -fn main() { while (!eof()) putc(getc()); return 0; } diff --git a/docs/history/17-o3-boundaries/code/examples/fact.zc b/docs/history/17-o3-boundaries/code/examples/fact.zc deleted file mode 100644 index 2a218b2..0000000 --- a/docs/history/17-o3-boundaries/code/examples/fact.zc +++ /dev/null @@ -1,4 +0,0 @@ -fn fact(n) { if (n < 2) return 1; return n * fact(n - 1); } -// prints in binary, like the old asm example -fn bin(n) { if (n > 1) bin(n >> 1); putc('0' + (n & 1)); return 0; } -fn main() { bin(fact(10)); putc(10); putn(fact(10)); putc(10); return 0; } diff --git a/docs/history/17-o3-boundaries/code/examples/hello.zc b/docs/history/17-o3-boundaries/code/examples/hello.zc deleted file mode 100644 index f36a810..0000000 --- a/docs/history/17-o3-boundaries/code/examples/hello.zc +++ /dev/null @@ -1 +0,0 @@ -fn main() { puts("hello, world!\n"); return 0; } diff --git a/docs/history/17-o3-boundaries/code/examples/lang.zc b/docs/history/17-o3-boundaries/code/examples/lang.zc deleted file mode 100644 index e4d91c5..0000000 --- a/docs/history/17-o3-boundaries/code/examples/lang.zc +++ /dev/null @@ -1,53 +0,0 @@ -// growing the language from inside a program, while it compiles - -// x |> f calls f(x). on a stack machine that's just "call": the value is -// already on the stack, under f's address. -immediate fn pipe_op() { next(); add_binop("|>", 1, "c"); return 0; } -pipe_op - -// unless (c) stmt -immediate fn unless() -{ - let a; - next(); expect(intern("(")); plainuse(expr()); rval(); expect(intern(")")); - emitseq(useq[0], ulen[0]); // not - a = hole(); op(O_JZ); - substmt(); - setlit(a, here); - return 0; -} -// assert (c): the failure message carries the line it was written on -fn assert_fail(int line) { puts("assertion failed on line "); putn(line); putc(10); halt(); return 0; } -immediate fn assert() -{ - let a, l = tline; - next(); expect(intern("(")); plainuse(expr()); rval(); expect(intern(")")); - emitseq(useq[0], ulen[0]); // not: the jump below skips the failure when it holds - a = hole(); op(O_JZ); - lit(l); callname(intern("assert_fail")); op(O_DROP); - setlit(a, here); - return 0; -} -// times N { body }: the body pasted N times, at compile time -immediate fn times() -{ - let n, b, i = 0; - next(); n = tv; next(); - b = grab(); - while (i < n) { feed(qdup(b)); i++; } - free(d*b); - return 0; -} - -fn double(x) { return x * 2; } -fn inc(x) { return x + 1; } -fn main() -{ - putn(5 |> double |> inc |> double); putc(10); - unless (1 > 2) puts("one isn't bigger than two\n"); - times 3 { putc('*'); } - putc(10); - assert(double(4) == 8); - assert(inc(1) == 3); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/examples/life.zc b/docs/history/17-o3-boundaries/code/examples/life.zc deleted file mode 100644 index a43d660..0000000 --- a/docs/history/17-o3-boundaries/code/examples/life.zc +++ /dev/null @@ -1,38 +0,0 @@ -// conway's life on a 10 x 20 torus, with typed 2d arrays in a struct. -// a glider walks diagonally and wraps around the edges. -const H = 10, W = 20; -struct board { [10][20]int c; }; - -int get(*board b, int y, int x) { return b.c[(y + H) % H][(x + W) % W]; } -fn step(*board from, *board to) -{ - for (int y = 0; y < H; y++) - for (int x = 0; x < W; x++) { - int n = 0; - for (int dy = 0 - 1; dy <= 1; dy++) - for (int dx = 0 - 1; dx <= 1; dx++) - if (dy || dx) n += get(from, y + dy, x + dx); - to.c[y][x] = n == 3 || (n == 2 && from.c[y][x]); - } - return 0; -} -fn show(*board b, int gen) -{ - puts("generation "); putn(gen); putc(10); - for (int y = 0; y < H; y++) { for (int x = 0; x < W; x++) putc(b.c[y][x] ? '#' : '.'); putc(10); } - return 0; -} -fn main() -{ - *board a = new(board), b = new(board); - a.c[0][1] = 1; a.c[1][2] = 1; a.c[2][0] = 1; a.c[2][1] = 1; a.c[2][2] = 1; - // two generations a pass, a -> b -> a: owned boards can't be swapped - // through a temporary, since the analyzer can't follow that - for (int g = 0; g <= 40; g += 2) { - if (g % 20 == 0) show(a, g); - step(a, b); - step(b, a); - } - free(d*a); free(d*b); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/examples/lists.zc b/docs/history/17-o3-boundaries/code/examples/lists.zc deleted file mode 100644 index 3cf0206..0000000 --- a/docs/history/17-o3-boundaries/code/examples/lists.zc +++ /dev/null @@ -1,34 +0,0 @@ -// ownership in practice: a list owns its boxes. nothing here calls free; -// everything is released at the end of the block that owns it. -.u box(v) { let b = new(1); b[0] = v; return u*b; } -.u mklist(cap) { let l = new(cap + 1); l[0] = 0; return u*l; } -// item m*arrives (it was given down), and goes d*on into the borrowed list -fn push(.m l, .d item) { l[l[0] + 1] = d*item; l[0] = l[0] + 1; return 0; } -fn show(.m l) -{ - let i = 1; - putc('['); - while (i <= l[0]) { if (i > 1) putc(' '); putn(l[i][0]); i++; } - putc(']'); - return 0; -} -.u squares(n) { - let l = mklist(n), i = 0; - while (i < n) { - let b = box(i * i); - push(l, d*b); - i++; - } - return u*l; -} -fn main() -{ - let before = live_objects(); - { - let l = squares(6); - show(l); putc(10); - puts("live: "); putn(live_objects() - before); putc(10); - } - puts("after the block: "); putn(live_objects() - before); putc(10); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/examples/mandel.zc b/docs/history/17-o3-boundaries/code/examples/mandel.zc deleted file mode 100644 index 5810397..0000000 --- a/docs/history/17-o3-boundaries/code/examples/mandel.zc +++ /dev/null @@ -1,36 +0,0 @@ -// the mandelbrot set in 16.16 fixed point. the cpu has no fixed-point -// multiply, so one gets wired in: a 32x32 -> 64 bit multiply, keeping the -// middle 32 bits. the jit inlines it as two native multiplies and a shift. -enhance fmul(a, b) micro - "r2 = mul a b; r3 = mulhs a b" - "; r3 = shl r3 16; r2 = shr r2 16; a = or r3 r2"; - -const ONE = 65536, W = 72, H = 28, MAXIT = 40; -let shades = " .,:;-=+*%#@"; - -int escape(int cx, int cy) { - int x = 0, y = 0, i = 0; - while (i < MAXIT) { - int xx = fmul(x, x), yy = fmul(y, y); - if (xx + yy > 4 * ONE) return i; - y = 2 * fmul(x, y) + cy; - x = xx - yy + cx; - i++; - } - return MAXIT; -} -fn main() -{ - int row = 0; - while (row < H) { - int col = 0, cy = (row * 2400 / (H - 1) - 1200) * ONE / 1000; - while (col < W) { - int cx = (col * 3200 / (W - 1) - 2200) * ONE / 1000, it = escape(cx, cy); - putc(it == MAXIT ? '@' : shades[it * 11 / MAXIT]); - col++; - } - putc(10); - row++; - } - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/examples/primes.zc b/docs/history/17-o3-boundaries/code/examples/primes.zc deleted file mode 100644 index 26df0b5..0000000 --- a/docs/history/17-o3-boundaries/code/examples/primes.zc +++ /dev/null @@ -1,38 +0,0 @@ -// primes below 60000: an o3 sieve over a fixed array, the primes -// gathered into a growable one, then a few questions asked of them. -// with ZYTRACE=1 the o3 lines show each region being lifted and compiled. - -// marks the composites; f[i] ends up 1 for every prime i -o3 int sieve(fixed []int f) -{ - int n = len(f), c = 0; - for (int i = 2; i < n; i++) f[i] = 1; - for (int i = 2; i * i < n; i++) - if (f[i]) for (int j = i * i; j < n; j += i) f[j] = 0; - for (int i = 2; i < n; i++) c += f[i]; - return c; -} -// the largest gap between neighbours, and where it starts -o3 int gap(fixed []int f, *int at) -{ - int n = len(f), last = 2, best = 0, where = 0; - for (int i = 3; i < n; i++) - if (f[i]) { if (i - last > best) { best = i - last; where = last; } last = i; } - *at = where; - return best; -} -fn main() -{ - fixed []int f = new(fixed []int, 60000); - []int ps = new([]int); - int c = sieve(f), at = 0, twins = 0; - for (int i = 2; i < len(f); i++) if (f[i]) push(ps, i); - o3 { for (int k = 1; k < len(ps); k++) if (ps[k] - ps[k - 1] == 2) twins++; } - puts("primes below 60000: "); putn(c); putc(10); - puts("the last five:"); for (int k = len(ps) - 5; k < len(ps); k++) { putc(' '); putn(ps[k]); } putc(10); - puts("twin pairs: "); putn(twins); putc(10); - int g = gap(f, &at); - puts("widest gap: "); putn(g); puts(", after "); putn(at); putc(10); - free(d*f); free(d*ps); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/examples/quine.zc b/docs/history/17-o3-boundaries/code/examples/quine.zc deleted file mode 100644 index 23be8cb..0000000 --- a/docs/history/17-o3-boundaries/code/examples/quine.zc +++ /dev/null @@ -1 +0,0 @@ -let s="let s=#;fn main(){let i=0;while(s[i]){if(s[i]==35){putc(34);puts(s);putc(34);}else putc(s[i]);i++;}putc(10);return 0;}";fn main(){let i=0;while(s[i]){if(s[i]==35){putc(34);puts(s);putc(34);}else putc(s[i]);i++;}putc(10);return 0;} diff --git a/docs/history/17-o3-boundaries/code/examples/repl.zc b/docs/history/17-o3-boundaries/code/examples/repl.zc deleted file mode 100644 index b7b81b8..0000000 --- a/docs/history/17-o3-boundaries/code/examples/repl.zc +++ /dev/null @@ -1,27 +0,0 @@ -// a repl on the resident compiler: each backtick-separated chunk of input is -// compiled as a function body and run. definitions (fn ...) can be loaded too: -// a chunk that starts with "fn" goes through load instead of eval. -let buf[4000]; -fn readchunk() -{ - let n = 0, c; - while (!eof()) { - c = getc(); - if (c == 96) break; - if (n < 3999) { buf[n] = c; n++; } - } - buf[n] = 0; - return n; -} -fn main() -{ - let q, i; - while (!eof()) { - readchunk(); - q = tokens(buf); - if (q[0] && q[1] == T_ID && q[2] == intern("fn")) load(q); - else eval(q); - free(d*q); - } - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/examples/selfpatch.zc b/docs/history/17-o3-boundaries/code/examples/selfpatch.zc deleted file mode 100644 index 074ccec..0000000 --- a/docs/history/17-o3-boundaries/code/examples/selfpatch.zc +++ /dev/null @@ -1,17 +0,0 @@ -// code is data: find the literal 'A' inside f's compiled words and rewrite it. -// on the jit the store lands on translated code, which gets dropped and -// retranslated on the next call. -fn f() { putc('A'); return 0; } -fn litw(v) { return v + v + 1; } // how the vm encodes a literal push -fn main() -{ - let p = f; - f(); - while (*p != litw('A')) p++; - *p = litw('B'); - f(); - *p = litw('C'); - f(); - putc(10); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/examples/staged.zc b/docs/history/17-o3-boundaries/code/examples/staged.zc deleted file mode 100644 index 5f6342e..0000000 --- a/docs/history/17-o3-boundaries/code/examples/staged.zc +++ /dev/null @@ -1,35 +0,0 @@ -// staged code: a program writes a specialized function as source, compiles it -// while running, and calls it. here, polynomials with their coefficients baked -// in as constants, so there's no loop and no array left at runtime. -let buf[2000], n; -fn put(s) { let i = 0; while (s[i]) { buf[n] = s[i]; n++; i++; } return 0; } -fn putnum(int v) { if (v >= 10) putnum(v / 10); buf[n] = '0' + v % 10; n++; return 0; } - -// coefficients c[0] + c[1] x + ... in horner form: ((c3 x + c2) x + c1) x + c0 -fn specialize(*int c, int deg) -{ - n = 0; - put("fn poly(x) { return "); - for (int i = 0; i < deg; i++) put("("); - if (c[deg] < 0) { put("0 - "); putnum(0 - c[deg]); } else putnum(c[deg]); - for (int i = deg - 1; i >= 0; i--) { - put(") * x "); - if (c[i] < 0) { put("- "); putnum(0 - c[i]); } else { put("+ "); putnum(c[i]); } - } - put("; }"); - buf[n] = 0; - return buf; -} -fn main() -{ - [4]int c; - c[0] = 7; c[1] = 0 - 3; c[2] = 0; c[3] = 2; // 2x^3 - 3x + 7 - let src = specialize(c, 3), q = tokens(src); - puts(src); putc(10); - load(q); // compiled now, into the running program - free(d*q); - let f = sval[lookups("poly")]; // and found by name in the compiler's symbol table - for (int x = 0 - 2; x <= 3; x++) { putn(f(x)); putc(' '); } - putc(10); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/examples/tree.zc b/docs/history/17-o3-boundaries/code/examples/tree.zc deleted file mode 100644 index 90a01d4..0000000 --- a/docs/history/17-o3-boundaries/code/examples/tree.zc +++ /dev/null @@ -1,28 +0,0 @@ -// a binary search tree where every node owns its children. there's no free -// anywhere: when the root's block ends, the whole tree goes with it. -struct node { int v; *node left, right; }; - -*node.u leaf(int v) { *node n = new(node); n.v = v; return u*n; } -// n is borrowed; storing a new leaf into it makes n the leaf's owner -fn insert(*node.m n, int v) -{ - if (v < n.v) { if (n.left) insert(n.left, v); else n.left = leaf(v); } - else { if (n.right) insert(n.right, v); else n.right = leaf(v); } - return 0; -} -fn walk(*node n) { if (!n) return 0; walk(n.left); putn(n.v); putc(' '); walk(n.right); return 0; } -int height(*node n) { if (!n) return 0; int l = height(n.left), r = height(n.right); return 1 + (l > r ? l : r); } - -fn main() -{ - let before = live_objects(); - { - *node root = leaf(50); - int x = 7; - for (int i = 0; i < 30; i++) { x = (x * 37 + 11) % 100; insert(root, x); } - walk(root); putc(10); - puts("height "); putn(height(root)); puts(", live objects "); putn(live_objects() - before); putc(10); - } - puts("after the block: "); putn(live_objects() - before); putc(10); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/examples/typed.zc b/docs/history/17-o3-boundaries/code/examples/typed.zc deleted file mode 100644 index 3bba399..0000000 --- a/docs/history/17-o3-boundaries/code/examples/typed.zc +++ /dev/null @@ -1,44 +0,0 @@ -// types: structs, a generic container, and looking at it all through reflection -typecheck on; -struct point { int x, y; }; -struct vec<T> { int len, cap; *T items; }; - -*vec<T>.u mkvec<T>(int cap) { - *vec<T> v = new(vec<T>); - v.cap = cap; - v.items = new(T, cap); - return u*v; -} -// x is given away (.d): the vector's memory holds it from now on, and the -// collector looks after it -bool push<T>(*vec<T> v, T.d x) { - if (v.len == v.cap) { free(d*x); return 0; } - v.items[v.len] = d*x; - v.len++; - return 1; -} -fn show(word t) -{ - let i = 0; - tprint(t); puts(" is "); putn(tsize(t)); puts(" words: "); - while (i < tnfields(t)) { if (i) puts(", "); puts(tfname(t, i)); puts(" "); tprint(tftype(t, i)); i++; } - putc(10); - return 0; -} -int main() { - *vec<*point> v = mkvec<*point>(4); - int i = 0; - while (i < 3) { - *point p = new(point); - p.x = i; p.y = i * i; - push(v, d*p); - i++; - } - puts("last: "); putn(v.items[2].y); putc(10); - show(typeof(point)); - show(typeof(*v)); - puts("push is "); tprint(sigof(push)); putc(10); - // generic code is compiled once, so what mkvec stamped is vec<T> - puts("the heap says v is a "); tprint(typeof_obj(v)); puts(", and v.items[0] is a "); tprint(typeof_obj(v.items[0])); putc(10); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/examples/wiring.zc b/docs/history/17-o3-boundaries/code/examples/wiring.zc deleted file mode 100644 index d5e64f4..0000000 --- a/docs/history/17-o3-boundaries/code/examples/wiring.zc +++ /dev/null @@ -1,19 +0,0 @@ -// virtual enhancements: custom opcodes wired into the cpu while compiling. -// the recipes run through the core's optimizer; the jit inlines the result. -enhance popcount(x) micro - "r1 = shr x 1; r1 = and r1 0x55555555; x = sub x r1" - "; r1 = shr x 2; r1 = and r1 0x33333333; x = and x 0x33333333; x = add x r1" - "; r1 = shr x 4; x = add x r1; x = and x 0x0f0f0f0f; x = mul x 0x01010101; x = shr x 24"; -enhance div10(x) micro "x = udiv x 10"; // becomes a multiply-high, no divide -enhance hypot2(a, b) vm { 0 $ * ~ 0 $ * + }; // lifted from vm code -enhance 2 minmax(a, b) micro "r2 = min a b; r1 = max a b; r0 = r2"; -let lo, hi; -fn main() -{ - putn(popcount(0xff00ff)); putc(' '); - putn(div10(12345)); putc(' '); - putn(hypot2(3, 4)); putc(' '); - asm { 9 4 minmax hi ! lo ! } - putn(lo); putc('/'); putn(hi); putc(10); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/genome.h b/docs/history/17-o3-boundaries/code/genome.h deleted file mode 100644 index 46aa7aa..0000000 --- a/docs/history/17-o3-boundaries/code/genome.h +++ /dev/null @@ -1,5262 +0,0 @@ -#define GORG 786432 -static const int genome[] = { -1966081,1310721,4,1728715,14,864582,870550,1310721,2,3,28,1310721,4,1310721,2,1835009, -40,1572913,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2,42,1572933, -14,1,1310721,2,3,26,1310721,4,18,0,0,2,1,786486,0,786480, -786482,786484,97,0,98,0,97,32,61,32,115,100,105,118,32,97, -32,98,0,1,0,2,1,786512,0,786506,786508,786510,97,0,98,0, -97,32,61,32,115,114,101,109,32,97,32,98,0,2,0,2, -1,786538,0,786532,786534,786536,97,0,98,0,97,32,61,32,115,104, -108,32,97,32,98,0,3,0,1,1,786560,0,786557,786558,107,0, -114,49,32,61,32,108,100,32,54,53,53,51,54,48,59,32, -107,32,61,32,97,100,100,32,114,49,32,107,0,4,0,2, -1,786602,0,786596,786598,786600,105,0,110,0,105,32,61,32,108,116, -117,32,105,32,110,59,32,105,32,61,32,120,111,114,32,105, -32,49,0,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1573289,16,1966081, -1310721,4,1579223,12,1310721,2,4,1310721,2,2,24,1,1573311,14,1,1310721, -2,3,26,1310721,4,18,1310721,2,1,28,1310721,4,1310721,2,1835009,40, -1573359,16,1966081,1310721,4,1579223,12,20,1573367,14,1,1310721,2,1,26,1310721, -4,18,1310721,2,1,28,1310721,4,1310721,2,1835009,40,1573415,16,1966081,1310721, -4,1579223,12,22,1573423,14,1,1310721,2,1,26,1310721,4,18,1310721,2, -1,28,1310721,4,1310721,2,1835009,40,1573471,16,1966081,1310721,4,1579223,12,0, -1,1573481,14,1,1310721,2,1,26,1310721,4,18,1310721,2,5,28,1310721, -4,1310721,2,1835009,40,1573529,16,1966081,1310721,4,1579223,12,1310721,2,4,1, -1310721,2,3,26,4,1310721,2,2,1310721,2,3,26,2,26,2,1573635, -16,1310721,2,2,1310721,2,3,26,2,26,2,1573255,12,8,1310721,2, -3,26,1,6,2,1,6,3,26,5,6,4,10,8,8,1573547, -14,1,1573643,14,1,1310721,2,5,26,1310721,4,18,1310721,2,29,28, -1310721,4,1310721,2,1835009,40,1573691,16,1966081,1310721,4,1579223,12,1310721,2,4, -1,1310721,2,27,26,4,1310721,2,2,1,40,1573757,16,91,1573255,12, -8,1310721,2,1,1310721,2,2,28,10,3,6,10,4,8,1310721,2, -2,1,40,1573811,16,1573797,14,50,49,52,55,52,56,51,54,52, -56,0,1573775,1573495,12,8,1,1574025,14,3,1573949,16,1310721,2,3,26, -1310721,2,27,26,1,6,2,1,6,3,26,5,6,4,10,8, -26,97,1310721,2,2,21,46,26,10,3,6,10,4,8,1310721,2, -1310721,2,2,21,44,10,3,6,10,4,8,1310721,2,2,1,6, -1,10,28,34,63,38,3,26,1573945,16,1573949,14,1573811,14,1310721,2, -27,26,2,1574017,16,1310721,2,3,26,1310721,2,27,26,1,6,2, --1,26,1,6,5,6,4,10,8,26,2,1573255,12,8,1573949,14, -1,1574025,14,1,1310721,2,29,26,1310721,4,18,1310721,2,5,28,1310721, -4,1310721,2,1835009,40,1574073,16,1966081,1310721,4,1579223,12,1310721,2,4,1, -1310721,2,3,26,4,1310721,2,2,1310721,2,3,26,2,26,2,1574153, -16,1310721,2,3,26,1,6,2,1,6,3,26,5,6,4,10, -8,8,1574091,14,1310721,2,3,26,2,1574169,14,1,1310721,2,5,26, -1310721,4,18,1310721,2,7,28,1310721,4,1310721,2,1835009,40,1574217,16,1966081, -1310721,4,1579223,12,1310721,2,3,26,4,1310721,2,4,1,1310721,2,5, -26,4,1310721,2,2,1310721,2,5,26,2,26,2,1574361,16,1310721,2, -2,1310721,2,5,26,2,26,2,1310721,2,3,26,2,1310721,2,5, -26,2,26,2,28,1,6,1,10,28,34,63,38,3,26,1, -6,1,10,28,34,63,38,1,10,28,1574363,14,1,1574405,16,1310721, -2,5,26,1,6,2,1,6,3,26,5,6,4,10,8,8, -1574245,14,1310721,2,2,1310721,2,5,26,2,26,2,1310721,2,3,26, -2,1310721,2,5,26,2,26,2,28,1,6,1,10,28,34,63, -38,3,26,1574477,14,1,1310721,2,7,26,1310721,4,18,1310721,2,9, -28,1310721,4,1310721,2,1835009,40,1574525,16,1966081,1310721,4,1579223,12,1310721,2, -5,26,4,1310721,2,3,26,4,1310721,2,4,1,1310721,2,7,26, -4,1310721,2,7,26,2,1310721,2,5,26,2,40,1574681,16,1310721,2, -2,1310721,2,7,26,2,26,1310721,2,3,26,2,1310721,2,7,26, -2,26,2,10,3,6,10,4,8,1310721,2,7,26,1,6,2, -1,6,3,26,5,6,4,10,8,8,1574563,14,1,1574689,14,1, -1310721,2,9,26,1310721,4,18,1310721,2,9,28,1310721,4,1310721,2,1835009, -40,1574737,16,1966081,1310721,4,1579223,12,1310721,2,5,26,4,1310721,2,3, -26,4,1310721,2,4,1,1310721,2,7,26,4,1310721,2,7,26,2, -1310721,2,5,26,2,40,1574879,16,1310721,2,2,1310721,2,7,26,2, -26,1310721,2,3,26,2,10,3,6,10,4,8,1310721,2,7,26, -1,6,2,1,6,3,26,5,6,4,10,8,8,1574775,14,1, -1574887,14,1,1310721,2,9,26,1310721,4,18,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,1310721,2,11,28,1310721, -4,1310721,2,1835009,40,1575001,16,1966081,1310721,4,1579223,12,1310721,2,3,26, -4,1310721,2,4,1,1310721,2,5,26,4,1,1310721,2,7,26,4, -61,1310721,2,9,26,4,1310721,2,2,1310721,2,3,26,2,40,1575101, -16,1574965,1310721,2,2,10,3,6,10,4,8,1,1575415,14,1310721,2, -9,26,2,1,40,3,36,1575375,16,1310721,2,7,26,1310721,2,7, -26,2,1310721,2,7,26,2,26,1310721,2,2,1310721,2,9,26,2, -38,3,32,26,10,3,6,10,4,8,1310721,2,5,26,1310721,2, -5,26,2,1310721,2,5,26,2,26,10,3,6,10,4,8,1310721, -2,7,26,2,1310721,2,3,26,2,40,3,36,1575337,16,1310721,2, -7,26,1310721,2,7,26,2,1310721,2,3,26,2,28,10,3,6, -10,4,8,1310721,2,5,26,1,6,2,1,6,3,26,5,6, -4,10,8,8,1310721,2,9,26,1,6,2,1,6,-1,26,5, -6,4,10,8,8,1575101,14,1574965,1310721,2,7,26,2,10,3,6, -10,4,8,1310721,2,5,26,2,1575415,14,1,1310721,2,11,26,1310721, -4,18,1310721,2,9,28,1310721,4,1310721,2,1835009,40,1575463,16,1966081,1310721, -4,1579223,12,1310721,2,3,26,4,1310721,2,4,1,1310721,2,5,26, -4,1310721,2,3,26,2,1,28,1,6,1,10,28,34,63,38, -3,26,1575555,16,1574965,1310721,2,2,10,3,6,10,4,8,1,1575791, -14,1310721,2,2,1,40,1575617,16,1310721,2,1,1310721,2,2,28,10, -3,6,10,4,8,1310721,2,5,26,3,10,3,6,10,4,8, -1310721,2,3,26,2,1,40,1575703,16,1310721,2,3,26,1,1310721,2, -3,26,2,28,10,3,6,10,4,8,1310721,2,5,26,1310721,2, -5,26,2,3,36,10,3,6,10,4,8,1310721,2,7,26,1310721, -2,2,1310721,2,3,26,2,1574967,12,10,3,6,10,4,8,1310721, -2,5,26,2,1575775,16,1,1310721,2,7,26,2,28,1575791,14,1310721, -2,7,26,2,1575791,14,1,1310721,2,9,26,1310721,4,18,1310721,2, -7,28,1310721,4,1310721,2,1835009,40,1575839,16,1966081,1310721,4,1579223,12,1310721, -2,3,26,4,1310721,2,4,1310721,2,2,1,40,1310721,2,5,26, -4,1310721,2,3,26,2,1,28,1,6,1,10,28,34,63,38, -3,26,1575923,16,1310721,2,2,1575981,14,1310721,2,2,1310721,2,3,26, -2,1575429,12,8,1310721,2,5,26,2,1575971,16,1,1574965,2,28,1575981, -14,1574965,2,1575981,14,1,1310721,2,7,26,1310721,4,18,1310721,2,5, -28,1310721,4,1310721,2,1835009,40,1576029,16,1966081,1310721,4,1579223,12,1310721,2, -3,26,4,1310721,2,4,1310721,2,2,1574901,1310721,2,3,26,2,63, -32,26,2,30,1576079,14,1,1310721,2,5,26,1310721,4,18,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1310721,2,9,28,1310721,4,1310721,2,1835009,40,1576199,16,1966081,1310721, -4,1579223,12,1310721,2,4,1310721,524289,28,1310721,2,3,26,4,1,1310721, -2,5,26,4,1310721,2,3,26,2,1576495,16,1310721,2,7,26,3, -10,3,6,10,4,8,1310721,2,7,26,2,1310721,2,7,26,2, -26,1310721,2,3,26,2,10,40,3,36,1576359,16,1310721,2,7,26, -1310721,2,7,26,2,1310721,2,7,26,2,26,10,3,6,10,4, -8,1576269,14,1310721,2,2,1310721,2,5,26,2,1310721,2,7,26,2, -26,40,1576407,16,1310721,2,7,26,2,1576503,14,1310721,2,5,26,1310721, -2,5,26,2,1310721,2,7,26,2,26,10,3,6,10,4,8, -1310721,2,3,26,1310721,2,3,26,2,1310721,2,7,26,2,28,10, -3,6,10,4,8,1576233,14,1,1576503,14,1,1310721,2,9,26,1310721, -4,18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1576551,16,1966081,1310721, -4,1579223,12,1310721,2,3,26,4,1310721,2,4,1310721,2,2,5,26, -1,10,3,6,10,4,8,1310721,2,2,13,26,1576095,1310721,2,3, -26,2,26,2,10,3,6,10,4,8,1310721,2,2,15,26,1, -10,3,6,10,4,8,1576095,1310721,2,3,26,2,26,2,1576711,16, -1576095,1310721,2,3,26,2,26,2,15,26,1310721,2,2,10,3,6, -10,4,8,1576095,1310721,2,3,26,2,26,1310721,2,2,10,3,6, -10,4,8,1,1576751,14,1,1310721,2,5,26,1310721,4,18,1310721,2, -5,28,1310721,4,1310721,2,1835009,40,1576799,16,1966081,1310721,4,1579223,12,1310721, -2,3,26,4,1310721,2,4,1310721,2,2,15,26,2,1576875,16,1310721, -2,2,15,26,2,13,26,1310721,2,2,13,26,2,10,3,6, -10,4,8,1576913,14,1576095,1310721,2,3,26,2,26,1310721,2,2,13, -26,2,10,3,6,10,4,8,1310721,2,2,13,26,2,1576969,16, -1310721,2,2,13,26,2,15,26,1310721,2,2,15,26,2,10,3, -6,10,4,8,1,1576977,14,1,1310721,2,5,26,1310721,4,18,1310721, -2,5,28,1310721,4,1310721,2,1835009,40,1577025,16,1966081,1310721,4,1579223,12, -1310721,2,3,26,4,1310721,2,4,1310721,2,2,1,26,1574901,1310721,2, -3,26,2,26,2,10,3,6,10,4,8,1310721,2,2,3,26, -1310721,2,3,26,2,10,3,6,10,4,8,1310721,2,2,5,26, -1,10,3,6,10,4,8,1310721,2,2,7,26,1,10,3,6, -10,4,8,1310721,2,2,9,26,1,10,3,6,10,4,8,1310721, -2,2,11,26,1,10,3,6,10,4,8,1310721,2,2,1577219,14, -1,1310721,2,5,26,1310721,4,18,1310721,2,9,28,1310721,4,1310721,2, -1835009,40,1577267,16,1966081,1310721,4,1579223,12,3,1310721,2,4,524289,1310721,2, -3,26,4,1574901,1,26,3,10,3,6,10,4,8,1310721,2,2, -65,40,1577411,16,1574901,1310721,2,2,26,1574901,1310721,2,2,3,28,26, -2,1574901,1310721,2,2,3,28,26,2,26,10,3,6,10,4,8, -1310721,2,1,6,2,1,6,3,26,5,6,4,10,8,8,1577307, -14,1576093,1310721,10,3,6,10,4,8,1576095,1,65,1574703,12,8,1310721, -2,3,26,2,1310721,40,1577673,16,1310721,2,5,26,1310721,2,3,26, -2,524289,28,1576165,12,10,3,6,10,4,8,1310721,2,7,26,1, -10,3,6,10,4,8,1574901,1310721,2,7,26,2,26,2,1310721,2, -5,26,2,40,1577587,16,1310721,2,7,26,1,6,2,1,6,3, -26,5,6,4,10,8,8,1577517,14,1310721,2,3,26,2,1310721,2, -7,26,2,1576991,12,1310721,2,7,26,2,1576517,12,8,1310721,2,3, -26,1310721,2,3,26,2,1310721,2,5,26,2,26,10,3,6,10, -4,8,1577439,14,1,1577681,14,1,1310721,2,9,26,1310721,4,18,1310721, -2,9,28,1310721,4,1310721,2,1835009,40,1577729,16,1966081,1310721,4,1579223,12, -1310721,2,4,1310721,2,2,1310721,2,3,26,4,1310721,2,3,26,2, -65,40,1577831,16,1576095,1310721,2,3,26,2,26,2,1,6,1,10, -28,34,63,38,3,26,1,6,1,10,28,34,63,38,1,10, -28,1577833,14,1,1577875,16,1310721,2,3,26,1,6,2,1,6,3, -26,5,6,4,10,8,8,1577751,14,1310721,2,3,26,2,65,40, -3,36,1577903,16,1,1578153,14,1310721,2,5,26,1576095,1310721,2,3,26, -2,26,2,10,3,6,10,4,8,1310721,2,5,26,2,1310721,2, -3,26,2,1576765,12,8,1310721,2,3,26,2,1310721,2,2,10,40, -1578115,16,1310721,2,3,26,1,6,2,1,6,-1,26,5,6,4, -10,8,8,1310721,2,7,26,1310721,2,5,26,2,1574901,1310721,2,3, -26,2,26,2,26,10,3,6,10,4,8,1310721,2,7,26,2, -1310721,2,3,26,2,1576991,12,1310721,2,3,26,2,1576517,12,8,1577965, -14,1310721,2,5,26,2,1310721,2,2,1576991,12,8,1310721,2,5,26, -2,1578153,14,1,1310721,2,9,26,1310721,4,18,0,1310721,2,11,28, -1310721,4,1310721,2,1835009,40,1578203,16,1966081,1310721,4,1579223,12,1310721,2,4, -1310721,2,2,3,26,2,1310721,2,3,26,4,1574901,1310721,2,3,26, -2,26,2,1310721,2,5,26,4,3,1578875,16,1310721,2,7,26,1310721, -2,2,524289,28,10,3,6,10,4,8,1310721,2,5,26,2,1310721, -2,7,26,2,1576165,12,40,3,36,1578331,16,1578875,14,1310721,2,9, -26,524289,1310721,2,7,26,2,1310721,2,5,26,2,36,26,10,3, -6,10,4,8,1310721,2,9,26,2,5,26,2,1,28,1,6, -1,10,28,34,63,38,1,10,28,1578429,16,3,1578501,14,1310721,2, -9,26,2,3,26,2,1310721,2,3,26,2,28,1,6,1,10, -28,34,63,38,1,10,28,1,6,1,10,28,34,63,38,1, -10,28,1578511,16,3,1578583,14,1310721,2,9,26,2,1,26,2,1310721, -2,5,26,2,28,1,6,1,10,28,34,63,38,1,10,28, -1,6,1,10,28,34,63,38,1,10,28,1578591,16,1578875,14,1310721, -2,9,26,2,1310721,2,3,26,2,1576765,12,8,1310721,2,9,26, -2,1310721,2,2,40,1578717,16,1310721,2,2,1,26,1,10,3,6, -10,4,8,1310721,2,2,7,26,1,10,3,6,10,4,8,1310721, -2,1310721,2,9,26,2,10,3,6,10,4,8,1578773,14,1310721,2, -9,26,2,1,26,1,10,3,6,10,4,8,1310721,2,9,26, -2,7,26,1,10,3,6,10,4,8,1310721,2,3,26,1,6, -2,1,6,3,26,5,6,4,10,8,8,1310721,2,5,26,1310721, -2,5,26,2,1310721,2,5,26,2,26,10,3,6,10,4,8, -1310721,2,2,1310721,2,3,26,2,1576991,12,8,1578257,14,1310721,2,2, -1310721,2,3,26,2,1576991,12,1310721,2,3,26,2,1576517,12,8,1578167, -1310721,2,2,1310721,2,5,26,2,26,10,3,6,10,4,8,1, -1578951,14,1,1310721,2,11,26,1310721,4,18,1310721,2,3,28,1310721,4, -1310721,2,1835009,40,1578999,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2, -2,524289,13,26,40,3,36,1579065,16,1310721,2,2,1576093,2,40,1, -6,1,10,28,34,63,38,1,10,28,1579067,14,1,1579147,16,1310721, -2,2,7,1,10,28,26,2,1310721,2,2,1459366445,36,28,1,6, -1,10,28,34,63,38,3,26,1,6,1,10,28,34,63,38, -1,10,28,1579149,14,1,1579201,16,1310721,2,2,9,1,10,28,26, -2,3,32,1,6,1,10,28,34,63,38,1,10,28,1579203,14, -1,1579209,14,1,1310721,2,3,26,1310721,4,18,1310721,2,1,28,1310721, -4,1310721,2,1835009,40,1579257,16,1966081,1310721,4,1579223,12,1579313,14,122,121, -58,32,102,114,97,109,101,32,115,116,97,99,107,32,111,118, -101,114,102,108,111,119,10,0,1579261,1573495,12,8,1573437,12,8,1, -1579335,14,1,1310721,2,1,26,1310721,4,18,1310721,2,1,28,1310721,4, -1310721,2,1835009,40,1579383,16,1966081,1310721,4,1579223,12,1579435,14,122,99,58, -32,111,117,116,32,111,102,32,104,101,97,112,32,109,101,109, -111,114,121,10,0,1579387,1573495,12,8,1573437,12,8,1,1579457,14,1, -1310721,2,1,26,1310721,4,18,1310721,2,11,28,1310721,4,1310721,2,1835009, -40,1579505,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2,13,26, -1310721,2,3,26,4,7,1310721,2,5,26,4,1310721,2,2,1,40, -1579579,16,1310721,2,3,26,13,10,3,6,10,4,8,1574901,1310721,2, -5,26,2,26,2,1310721,2,3,26,2,40,1579649,16,1310721,2,5, -26,1,6,2,1,6,3,26,5,6,4,10,8,8,1579579,14, -1310721,2,7,26,1310721,2,5,26,2,1577695,12,10,3,6,10,4, -8,1310721,2,7,26,2,1,6,1,10,28,34,63,38,3,26, -1579747,16,1576163,2,1,6,1,10,28,34,63,38,1,10,28,1579749, -14,1,1579793,16,1584157,12,8,1310721,2,7,26,1310721,2,5,26,2, -1577695,12,10,3,6,10,4,8,1310721,2,7,26,2,1,6,1, -10,28,34,63,38,3,26,1579833,16,1579349,12,8,1310721,2,9,26, -1310721,2,7,26,2,13,26,10,3,6,10,4,8,1310721,2,7, -26,2,5,26,3,10,3,6,10,4,8,1310721,2,7,26,2, -7,26,1310721,2,9,26,2,1459366445,36,10,3,6,10,4,8,1310721, -2,7,26,2,9,26,1,10,3,6,10,4,8,1310721,2,7, -26,2,11,26,1,1310721,2,2,28,3,28,10,3,6,10,4, -8,1310721,2,9,26,2,1580019,14,1,1310721,2,11,26,1310721,4,18, -1310721,2,7,28,1310721,4,1310721,2,1835009,40,1580067,16,1966081,1310721,4,1579223, -12,1310721,2,3,26,4,1310721,2,4,1310721,2,2,1579471,12,1310721,2, -5,26,4,1310721,2,5,26,2,3,1,10,28,26,1310721,2,3, -26,2,10,3,6,10,4,8,1310721,2,5,26,2,1,1310721,2, -5,26,2,13,1,10,28,26,2,13,28,1574703,12,8,1310721,2, -5,26,2,1580205,14,1,1310721,2,7,26,1310721,4,18,1310721,2,3, -28,1310721,4,1310721,2,1835009,40,1580253,16,1966081,1310721,4,1579223,12,1310721,2, -4,1310721,2,2,1,1580033,12,1580277,14,1,1310721,2,3,26,1310721,4, -18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1580325,16,1966081,1310721,4, -1579223,12,1310721,2,4,1310721,2,2,1578965,12,1,6,1,10,28,34, -63,38,3,26,1580371,16,1,1580399,14,1310721,2,2,13,1,10,28, -26,2,13,28,1580399,14,1,1310721,2,3,26,1310721,4,18,1310721,2, -3,28,1310721,4,1310721,2,1835009,40,1580447,16,1966081,1310721,4,1579223,12,1310721, -2,4,1310721,2,2,1578965,12,1,6,1,10,28,34,63,38,3, -26,1580493,16,3,1580537,14,1310721,2,2,3,1,10,28,26,2,1, -40,1,6,1,10,28,34,63,38,1,10,28,1580547,16,1,1580571, -14,1310721,2,2,3,1,10,28,26,2,1580571,14,1,1310721,2,3, -26,1310721,4,18,1310721,2,11,28,1310721,4,1310721,2,1835009,40,1580619,16, -1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2,13,28,1310721,2,3, -26,4,1310721,2,3,26,2,1,26,2,13,28,1310721,2,5,26, -4,1,1310721,2,7,26,4,1310721,2,3,26,2,5,26,5,10, -3,6,10,4,8,1310721,2,7,26,2,1310721,2,5,26,2,40, -1580935,16,1310721,2,9,26,1310721,2,2,1310721,2,7,26,2,26,2, -10,3,6,10,4,8,1310721,2,9,26,2,1578965,12,1580875,16,1310721, -2,9,26,2,5,1,10,28,26,2,1310721,2,2,28,1,6, -1,10,28,34,63,38,3,26,1,6,1,10,28,34,63,38, -1,10,28,1580877,14,1,1580897,16,1310721,2,9,26,2,1580585,12,8, -1310721,2,7,26,1,6,2,1,6,3,26,5,6,4,10,8, -8,1580715,14,1310721,2,3,26,2,1578169,12,8,1,1580959,14,1,1310721, -2,11,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40, -1581007,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2,1578965,12,1581039, -16,1310721,2,2,1580585,12,8,1,1581047,14,1,1310721,2,3,26,1310721, -4,18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1581095,16,1966081,1310721, -4,1579223,12,1310721,2,3,26,4,1310721,2,4,1310721,2,2,1578965,12, -1581163,16,1310721,2,2,5,1,10,28,26,1310721,2,3,26,2,10, -3,6,10,4,8,1310721,2,2,1581175,14,1,1310721,2,5,26,1310721, -4,18,1310721,2,13,28,1310721,4,1310721,2,1835009,40,1581223,16,1966081,1310721, -4,1579223,12,1310721,2,5,26,4,1310721,2,3,26,4,1310721,2,4, -9,1310721,2,5,26,2,1580033,12,1310721,2,7,26,4,1310721,2,3, -26,2,1310721,2,9,26,4,1310721,2,9,26,2,9,40,1581335,16, -1310721,2,9,26,9,10,3,6,10,4,8,1310721,2,11,26,1310721, -2,9,26,2,1310721,2,2,30,1580219,12,10,3,6,10,4,8, -1310721,2,7,26,2,1,26,1310721,2,3,26,2,10,3,6,10, -4,8,1310721,2,7,26,2,3,26,1310721,2,9,26,2,10,3, -6,10,4,8,1310721,2,7,26,2,5,26,1310721,2,11,26,2, -1310721,2,7,26,2,1581061,12,10,3,6,10,4,8,1310721,2,7, -26,2,7,26,1310721,2,2,10,3,6,10,4,8,1310721,2,7, -26,2,1581547,14,1,1310721,2,13,26,1310721,4,18,1310721,2,17,28, -1310721,4,1310721,2,1835009,40,1581595,16,1966081,1310721,4,1579223,12,1310721,2,3, -26,4,1310721,2,4,1310721,2,2,3,26,2,1310721,2,5,26,4, -1310721,2,2,5,26,2,1310721,2,9,26,4,1,1310721,2,11,26, -4,1310721,2,3,26,2,1310721,2,5,26,2,10,40,3,36,1581705, -16,1,1582259,14,1310721,2,5,26,2,1310721,2,3,26,2,40,1581777, -16,1310721,2,5,26,1310721,2,5,26,2,1310721,2,5,26,2,26, -10,3,6,10,4,8,1581705,14,1310721,2,7,26,1310721,2,5,26, -2,1310721,2,2,7,26,2,30,1580219,12,10,3,6,10,4,8, -1310721,2,15,26,1310721,2,2,1,26,2,1310721,2,2,7,26,2, -30,10,3,6,10,4,8,1310721,2,7,26,2,1310721,2,9,26, -2,1310721,2,15,26,2,1574491,12,8,1310721,2,11,26,2,1310721,2, -15,26,2,40,1582161,16,1310721,2,13,26,1310721,2,7,26,2,1310721, -2,11,26,2,26,2,10,3,6,10,4,8,1310721,2,13,26, -2,1578965,12,1582075,16,1310721,2,13,26,2,5,1,10,28,26,2, -1310721,2,9,26,2,28,1,6,1,10,28,34,63,38,3,26, -1,6,1,10,28,34,63,38,1,10,28,1582077,14,1,1582123,16, -1310721,2,13,26,2,5,1,10,28,26,1310721,2,7,26,2,10, -3,6,10,4,8,1310721,2,11,26,1,6,2,1,6,3,26, -5,6,4,10,8,8,1581907,14,1310721,2,2,5,26,1310721,2,7, -26,2,1310721,2,2,1581061,12,10,3,6,10,4,8,1310721,2,2, -3,26,1310721,2,5,26,2,10,3,6,10,4,8,1310721,2,9, -26,2,1580973,12,8,1,1582259,14,1,1310721,2,17,26,1310721,4,18, -1310721,2,5,28,1310721,4,1310721,2,1835009,40,1582307,16,1966081,1310721,4,1579223, -12,1310721,2,3,26,4,1310721,2,4,1582349,14,122,121,58,32,105, -110,100,101,120,32,0,1582327,1573495,12,8,1310721,2,2,1573657,12,8, -1582419,14,32,111,117,116,32,111,102,32,114,97,110,103,101,32, -40,108,101,110,103,116,104,32,0,1582373,1573495,12,8,1310721,2,3, -26,2,1573657,12,8,1582453,14,41,10,0,1582447,1573495,12,8,1573437,12, -8,1,1582475,14,1,1310721,2,5,26,1310721,4,18,1310721,2,5,28, -1310721,4,1310721,2,1835009,40,1582523,16,1966081,1310721,4,1579223,12,1310721,2,3, -26,4,1310721,2,4,1310721,2,3,26,2,1,40,1582563,16,3,1582613, -14,1310721,2,3,26,2,1310721,2,2,1,26,2,40,3,36,1, -6,1,10,28,34,63,38,1,10,28,1582645,16,1310721,2,3,26, -2,1310721,2,2,1,26,2,1582273,12,8,1310721,2,2,5,26,2, -1310721,2,3,26,2,1310721,2,2,7,26,2,30,26,1582689,14,1, -1310721,2,5,26,1310721,4,18,1310721,2,5,28,1310721,4,1310721,2,1835009, -40,1582737,16,1966081,1310721,4,1579223,12,1310721,2,3,26,4,1310721,2,4, -1310721,2,2,1310721,2,2,1,26,2,3,26,1581561,12,8,1310721,2, -2,5,26,2,1310721,2,2,1,26,2,26,1310721,2,3,26,2, -10,3,6,10,4,8,1310721,2,3,26,2,1310721,2,2,5,26, -2,1581061,12,8,1310721,2,2,1,26,1310721,2,2,1,26,2,3, -26,10,3,6,10,4,8,1,1582903,14,1,1310721,2,5,26,1310721, -4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1582951,16,1966081,1310721, -4,1579223,12,1310721,2,4,1310721,2,2,1,26,2,1,6,1,10, -28,34,63,38,3,26,1583009,16,3,1,10,28,1,1582273,12,8, -1310721,2,2,1,26,1310721,2,2,1,26,2,3,28,10,3,6, -10,4,8,1310721,2,2,5,26,2,1310721,2,2,1,26,2,26, -2,1583081,14,1,1310721,2,3,26,1310721,4,18,1310721,2,7,28,1310721, -4,1310721,2,1835009,40,1583129,16,1966081,1310721,4,1579223,12,1310721,2,3,26, -4,1310721,2,4,1310721,2,2,1,26,2,1310721,2,2,7,26,2, -30,1310721,2,5,26,4,1310721,2,3,26,2,1,40,1583221,16,1310721, -2,3,26,1,10,3,6,10,4,8,1310721,2,2,1310721,2,3, -26,2,1581561,12,8,1310721,2,3,26,2,1310721,2,2,7,26,2, -30,1310721,2,5,26,2,10,40,1583353,16,1310721,2,2,5,26,2, -1310721,2,5,26,2,26,1,1310721,2,3,26,2,1310721,2,2,7, -26,2,30,1310721,2,5,26,2,28,1574703,12,8,1310721,2,2,1, -26,1310721,2,3,26,2,10,3,6,10,4,8,1,1583393,14,1, -1310721,2,7,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009, -40,1583441,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2,1,26, -2,1583465,14,1,1310721,2,3,26,1310721,4,18,1310721,2,3,28,1310721, -4,1310721,2,1835009,40,1583513,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721, -2,2,3,26,2,1583537,14,1,1310721,2,3,26,1310721,4,18,0, -0,0,0,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1583593,16,1966081, -1310721,4,1579223,12,1310721,2,4,1310721,2,2,1578965,12,1,6,1,10, -28,34,63,38,3,26,1583639,16,3,1583683,14,1310721,2,2,9,1, -10,28,26,2,5,32,1,6,1,10,28,34,63,38,1,10, -28,1583693,16,1,1583837,14,1310721,2,2,9,1,10,28,26,1310721,2, -2,9,1,10,28,26,2,5,34,10,3,6,10,4,8,1583551, -2,32769,40,1583813,16,2031617,1583551,2,26,1310721,2,2,10,3,6,10, -4,8,1583551,1,6,2,1,6,3,26,5,6,4,10,8,8, -1583829,14,1583553,3,10,3,6,10,4,8,1,1583837,14,1,1310721,2, -3,26,1310721,4,18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1583885, -16,1966081,1310721,4,1579223,12,1310721,2,3,26,4,1310721,2,4,1310721,2, -2,1310721,2,3,26,2,40,1583971,16,1310721,2,2,2,1583559,12,8, -1310721,2,1,6,2,1,6,3,26,5,6,4,10,8,8,1583901, -14,1,1583979,14,1,1310721,2,5,26,1310721,4,18,1310721,2,3,28, -1310721,4,1310721,2,1835009,40,1584027,16,1966081,1310721,4,1579223,12,1583551,2,1584135, -16,1583551,1,6,2,1,6,-1,26,5,6,4,10,8,8,1310721, -2,2031617,1583551,2,26,2,10,3,6,10,4,8,1310721,2,2,1310721, -2,2,1310721,2,2,13,1,10,28,26,2,26,13,28,1583851,12, -8,1584027,14,1,1584143,14,1,1310721,2,3,26,1310721,4,18,1310721,2, -7,28,1310721,4,1310721,2,1835009,40,1584191,16,1966081,1310721,4,1579223,12,1, -1310721,2,5,26,4,1583551,1,10,3,6,10,4,8,1583553,1,10, -3,6,10,4,8,1725417,12,8,1583993,12,8,1583553,2,1584429,16,1583553, -1,10,3,6,10,4,8,1310721,2,524289,10,3,6,10,4,8, -1310721,2,2,1310721,40,1584425,16,1310721,2,2,5,26,2,7,28,1, -6,1,10,28,34,63,38,3,26,1584379,16,1310721,2,2,13,26, -1310721,2,2,1310721,2,2,1,26,2,26,1583851,12,8,1310721,2,1310721, -2,2,1310721,2,2,1,26,2,26,10,3,6,10,4,8,1583993, -12,8,1584289,14,1584247,14,1310721,2,524289,10,3,6,10,4,8,1310721, -2,2,1310721,40,1584705,16,1310721,2,3,26,1310721,2,2,1,26,2, -10,3,6,10,4,8,1310721,2,2,5,26,2,3,28,1,6, -1,10,28,34,63,38,3,26,1584603,16,1310721,2,2,1578169,12,8, -1310721,2,5,26,1,6,2,1,6,3,26,5,6,4,10,8, -8,1310721,2,1578167,2,10,3,6,10,4,8,1584701,14,1310721,2,2, -5,26,2,7,28,1,6,1,10,28,34,63,38,3,26,1584667, -16,1310721,2,2,5,26,3,10,3,6,10,4,8,1310721,2,1310721, -2,2,1310721,2,3,26,2,26,10,3,6,10,4,8,1584447,14, -1576159,1,6,2,1,6,3,26,5,6,4,10,8,8,1576161,1576161, -2,1310721,2,5,26,2,26,10,3,6,10,4,8,1310721,2,5, -26,2,1584779,14,1,1310721,2,7,26,1310721,4,18,1310721,2,5,28, -1310721,4,1310721,2,1835009,40,1584827,16,1966081,1310721,4,1579223,12,524289,1310721,2, -4,1,1310721,2,3,26,4,1310721,2,2,1310721,40,1584955,16,1310721,2, -2,5,26,2,3,32,1584915,16,1310721,2,3,26,1,6,2,1, -6,3,26,5,6,4,10,8,8,1310721,2,1310721,2,2,1310721,2, -2,1,26,2,26,10,3,6,10,4,8,1584847,14,1310721,2,3, -26,2,1584971,14,1,1310721,2,5,26,1310721,4,18,1310721,2,3,28, -1310721,4,1310721,2,1835009,40,1585019,16,1966081,1310721,4,1579223,12,63,1310721,2, -4,1310721,2,2,1,10,40,1585101,16,1576095,1310721,2,2,26,2,1, -6,1,10,28,34,63,38,3,26,1,6,1,10,28,34,63, -38,1,10,28,1585103,14,1,1585141,16,1310721,2,1,6,2,1,6, --1,26,5,6,4,10,8,8,1585027,14,1576095,1310721,2,2,26,2, -1,6,1,10,28,34,63,38,3,26,1585183,16,1,1585201,14,1574901, -1310721,2,2,26,2,1585201,14,1,1310721,2,3,26,1310721,4,18,0, -0,0,0,0,0,0,0,0,0,0,0,792620,113,64,33,36, -95,126,99,106,122,114,44,63,46,43,45,42,38,124,94,62, -60,37,0,1,0,0,0,0,1,0,0,0,0,0,-1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,1310721,2,1, -28,1310721,4,1310721,2,1835009,40,1590621,16,1966081,1310721,4,1579223,12,1590645,14, -122,99,58,32,108,105,110,101,32,0,1590625,1573495,12,8,1585295,2, -1573657,12,8,1590673,14,58,32,0,1590667,1573495,12,8,1590583,1,6,2, -1,6,3,26,5,6,4,10,8,8,1,1590717,14,1,1310721,2, -1,26,1310721,4,18,1310721,2,1,28,1310721,4,1310721,2,1835009,40,1590765, -16,1966081,1310721,4,1579223,12,21,1573255,12,8,1590583,2,41,40,3,36, -1590869,16,1590855,14,122,99,58,32,116,111,111,32,109,97,110,121, -32,101,114,114,111,114,115,44,32,115,116,111,112,112,105,110, -103,10,0,1590793,1573495,12,8,1573437,12,8,1,1590877,14,1,1310721,2, -1,26,1310721,4,18,1310721,2,1,28,1310721,4,1310721,2,1835009,40,1590925, -16,1966081,1310721,4,1579223,12,1590939,14,122,99,58,32,0,1590929,1573495,12, -8,1590583,2,1573657,12,8,1590583,2,3,28,1,6,1,10,28,34, -63,38,3,26,1591021,16,1591009,14,32,101,114,114,111,114,10,0, -1590993,1573495,12,8,1591051,14,1591043,14,32,101,114,114,111,114,115,10, -0,1591025,1573495,12,8,1573437,12,8,1,1591065,14,1,1310721,2,1,26, -1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1591113,16,1966081, -1310721,4,1579223,12,1310721,2,4,1590587,12,8,1310721,2,2,1573495,12,8, -21,1573255,12,8,1573437,12,8,1,1591159,14,1,1310721,2,3,26,1310721, -4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1591207,16,1966081,1310721, -4,1579223,12,1310721,2,4,1590585,2,1,6,1,10,28,34,63,38, -3,26,1591291,16,1587703,2,1,6,1,10,28,34,63,38,3,26, -1,6,1,10,28,34,63,38,1,10,28,1591293,14,1,1591321,16, -1590587,12,8,1310721,2,2,1573495,12,8,1590731,12,8,1,1591329,14,1, -1310721,2,3,26,1310721,4,18,1310721,2,5,28,1310721,4,1310721,2,1835009, -40,1591377,16,1966081,1310721,4,1579223,12,1310721,2,3,26,4,1310721,2,4, -1590585,2,1,6,1,10,28,34,63,38,3,26,1591471,16,1587703,2, -1,6,1,10,28,34,63,38,3,26,1,6,1,10,28,34, -63,38,1,10,28,1591473,14,1,1591535,16,1590587,12,8,1310721,2,2, -1573495,12,8,1591505,14,58,32,0,1591499,1573495,12,8,1310721,2,3,26, -2,1573495,12,8,1590731,12,8,1,1591543,14,1,1310721,2,5,26,1310721, -4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1591591,16,1966081,1310721, -4,1579223,12,1310721,2,4,1310721,2,2,1591173,12,8,1590585,3,10,3, -6,10,4,8,1585289,2,1,28,1,6,1,10,28,34,63,38, -3,26,1591663,16,1590891,12,8,1604999,12,8,1,1591677,14,1,1310721,2, -3,26,1310721,4,18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1591725, -16,1966081,1310721,4,1579223,12,1310721,2,3,26,4,1310721,2,4,1310721,2, -2,1310721,2,3,26,2,1591343,12,8,1590585,3,10,3,6,10,4, -8,1585289,2,1,28,1,6,1,10,28,34,63,38,3,26,1591817, -16,1590891,12,8,1604999,12,8,1,1591831,14,1,1310721,2,5,26,1310721, -4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1591879,16,1966081,1310721, -4,1579223,12,1310721,2,4,1587565,2,1591923,16,1587569,2,1,6,1,10, -28,34,63,38,1,10,28,1591925,14,1,1591941,16,1310721,2,2,1591173, -12,8,1,1591949,14,1,1310721,2,3,26,1310721,4,18,1310721,2,5, -28,1310721,4,1310721,2,1835009,40,1591997,16,1966081,1310721,4,1579223,12,1310721,2, -3,26,4,1310721,2,4,1587565,2,1592051,16,1587569,2,1,6,1,10, -28,34,63,38,1,10,28,1592053,14,1,1592085,16,1466881,1310721,2,2, -26,2,1310721,2,3,26,2,1591343,12,8,1,1592093,14,1,1310721,2, -5,26,1310721,4,18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1592141, -16,1966081,1310721,4,1579223,12,1310721,2,4,1,1310721,2,3,26,4,1310721, -2,2,2,1592249,16,1310721,2,3,26,1310721,2,3,26,2,63,30, -1310721,2,2,2,26,10,3,6,10,4,8,1310721,2,1,6,2, -1,6,3,26,5,6,4,10,8,8,1592159,14,1310721,2,3,26, -2,16385,3,28,32,1592273,14,1,1310721,2,5,26,1310721,4,18,1310721, -2,9,28,1310721,4,1310721,2,1835009,40,1592321,16,1966081,1310721,4,1579223,12, -1310721,2,4,1310721,2,2,1592107,12,1310721,2,3,26,4,3,1592511,16, -1310721,2,5,26,1311233,1310721,2,3,26,2,26,2,10,3,6,10, -4,8,1310721,2,5,26,2,1,6,1,10,28,34,63,38,3, -26,1592427,16,1592511,14,1310721,2,5,26,2,1310721,2,2,1574183,12,1592465, -16,1310721,2,5,26,2,1592791,14,1310721,2,3,26,1310721,2,3,26, -2,3,26,16385,3,28,32,10,3,6,10,4,8,1592347,14,1310721, -2,7,26,1310721,2,2,1574039,12,10,3,6,10,4,8,1585217,2, -1310721,2,7,26,2,26,5,26,1409025,40,3,36,1592619,16,1592611,14, -115,116,114,105,110,103,32,112,111,111,108,32,102,117,108,108, -0,1592577,1591079,12,8,1585217,2,1,26,1,10,3,6,10,4,8, -1310721,2,5,26,1585217,2,3,26,10,3,6,10,4,8,1310721,2, -5,26,2,1310721,2,2,1310721,2,7,26,2,3,26,1574491,12,8, -1585217,1585217,2,1310721,2,7,26,2,26,5,26,10,3,6,10,4, -8,1311233,1310721,2,3,26,2,26,1310721,2,5,26,2,10,3,6, -10,4,8,1310721,2,5,26,2,1592791,14,1,1310721,2,9,26,1310721, -4,18,1310721,2,9,28,1310721,4,1310721,2,1835009,40,1592839,16,1966081,1310721, -4,1579223,12,1310721,2,5,26,4,1310721,2,3,26,4,1310721,2,4, -1585219,2,1310721,2,7,26,4,1585219,2,8193,40,3,36,1592943,16,1592935, -14,115,121,109,98,111,108,32,116,97,98,108,101,32,102,117, -108,108,0,1592899,1591079,12,8,1585219,1,6,2,1,6,3,26,5, -6,4,10,8,8,1409537,1310721,2,7,26,2,26,1310721,2,2,10, -3,6,10,4,8,1417729,1310721,2,7,26,2,26,1310721,2,3,26, -2,10,3,6,10,4,8,1425921,1310721,2,7,26,2,26,1310721,2, -5,26,2,10,3,6,10,4,8,1434113,1310721,2,7,26,2,26, -1,10,3,6,10,4,8,1442305,1310721,2,7,26,2,26,3,10, -3,6,10,4,8,1450497,1310721,2,7,26,2,26,1,10,3,6, -10,4,8,1559041,1310721,2,7,26,2,26,1,10,3,6,10,4, -8,1458689,1310721,2,7,26,2,26,1310721,2,2,3,1,10,28,26, -2,10,3,6,10,4,8,1310721,2,2,3,1,10,28,26,1310721, -2,7,26,2,3,26,10,3,6,10,4,8,1310721,2,7,26, -2,1593289,14,1,1310721,2,9,26,1310721,4,18,1310721,2,5,28,1310721, -4,1310721,2,1835009,40,1593337,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721, -2,2,3,1,10,28,26,2,3,28,1310721,2,3,26,4,1310721, -2,3,26,2,1,40,3,36,1593623,16,1310721,2,3,26,2,1585223, -2,40,3,36,1593427,16,3,1593489,14,1417729,1310721,2,3,26,2,26, -2,11,28,1,6,1,10,28,34,63,38,3,26,1,6,1, -10,28,34,63,38,1,10,28,1593499,16,3,1593561,14,1417729,1310721,2, -3,26,2,26,2,15,28,1,6,1,10,28,34,63,38,3, -26,1,6,1,10,28,34,63,38,1,10,28,1593579,16,1310721,2, -3,26,2,1593637,14,1310721,2,3,26,1458689,1310721,2,3,26,2,26, -2,3,28,10,3,6,10,4,8,1593375,14,3,1,10,28,1593637, -14,1,1310721,2,5,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721, -2,1835009,40,1593685,16,1966081,1310721,4,1579223,12,1310721,2,4,1585219,2,1310721, -2,2,10,40,1593783,16,1585219,1,6,2,1,6,-1,26,5,6, -4,10,8,8,1409537,1585219,2,26,2,3,1,10,28,26,1458689,1585219, -2,26,2,10,3,6,10,4,8,1593691,14,1,1593791,14,1,1310721, -2,3,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40, -1593839,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2,1592287,12,1593303, -12,1593865,14,1,1310721,2,3,26,1310721,4,18,1310721,2,7,28,1310721, -4,1310721,2,1835009,40,1593913,16,1966081,1310721,4,1579223,12,1310721,2,3,26, -4,1310721,2,4,1585227,2,1310721,2,5,26,4,1310721,2,5,26,2, -1593991,16,1585227,1491457,1310721,2,5,26,2,26,2,10,3,6,10,4, -8,1594133,14,1585225,1,6,2,1,6,3,26,5,6,4,10,8, -8,1310721,2,5,26,1585225,2,10,3,6,10,4,8,1310721,2,5, -26,2,16385,40,3,36,1594133,16,1594125,14,116,111,111,32,109,97, -110,121,32,102,111,114,119,97,114,100,32,114,101,102,101,114, -101,110,99,101,115,0,1594069,1591079,12,8,1475073,1310721,2,5,26,2, -26,1310721,2,2,10,3,6,10,4,8,1491457,1310721,2,5,26,2, -26,1310721,2,3,26,2,10,3,6,10,4,8,1310721,2,5,26, -2,1594217,14,1,1310721,2,7,26,1310721,4,18,1310721,2,7,28,1310721, -4,1310721,2,1835009,40,1594265,16,1966081,1310721,4,1579223,12,1310721,2,3,26, -4,1310721,2,4,1310721,2,2,1594427,16,1475073,1310721,2,2,26,2,1310721, -2,3,26,2,1594811,12,8,1310721,2,5,26,1491457,1310721,2,2,26, -2,10,3,6,10,4,8,1491457,1310721,2,2,26,1585227,2,10,3, -6,10,4,8,1585227,1310721,2,2,10,3,6,10,4,8,1310721,2, -1310721,2,5,26,2,10,3,6,10,4,8,1594281,14,1,1594435,14, -1,1310721,2,7,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2, -1835009,40,1594483,16,1966081,1310721,4,1579223,12,1310721,2,4,1587703,2,1594503,16, -1,1594629,14,1587549,2,1587553,2,40,3,36,1594565,16,1594557,14,112,114, -111,103,114,97,109,32,116,111,111,32,98,105,103,0,1594525,1591079, -12,8,1587549,2,1587551,2,26,1310721,2,2,10,3,6,10,4,8, -1587549,1,6,2,1,6,3,26,5,6,4,10,8,8,1,1594629, -14,1,1310721,2,3,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721, -2,1835009,40,1594677,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2, -1310721,2,2,26,3,26,1594449,12,8,1,1594715,14,1,1310721,2,3, -26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1594763,16, -1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2,1310721,2,2,26,1594449, -12,8,1,1594797,14,1,1310721,2,3,26,1310721,4,18,1310721,2,5, -28,1310721,4,1310721,2,1835009,40,1594845,16,1966081,1310721,4,1579223,12,1310721,2, -3,26,4,1310721,2,4,1587703,2,1594875,16,1,1594933,14,1310721,2,2, -1587551,2,26,1310721,2,3,26,2,1310721,2,3,26,2,26,3,26, -10,3,6,10,4,8,1,1594933,14,1,1310721,2,5,26,1310721,4, -18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1594981,16,1966081,1310721,4, -1579223,12,1310721,2,4,1310721,2,2,1594643,12,8,15,1594729,12,8,1, -1595015,14,1,1310721,2,3,26,1310721,4,18,1310721,2,3,28,1310721,4, -1310721,2,1835009,40,1595063,16,1966081,1310721,4,1579223,12,1587549,2,1310721,2,4, -2097153,3,28,1594643,12,8,1310721,2,2,1595097,14,1,1310721,2,3,26, -1310721,4,18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1595145,16,1966081, -1310721,4,1579223,12,1310721,2,4,1310721,2,2,3,1585295,2,1592805,12,1310721, -2,3,26,4,1442305,1310721,2,3,26,2,26,1,10,3,6,10, -4,8,1310721,2,3,26,2,1595221,14,1,1310721,2,5,26,1310721,4, -18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1595269,16,1966081,1310721,4, -1579223,12,1310721,2,4,1442305,1310721,2,2,26,2,3,32,1595319,16,1425921, -1310721,2,2,26,2,1594643,12,8,1,1595395,14,1587703,2,1595333,16,1, -1595395,14,1450497,1310721,2,2,26,1587549,2,1450497,1310721,2,2,26,2,1593879, -12,10,3,6,10,4,8,2097153,3,28,1594643,12,8,1,1595395,14, -1,1310721,2,3,26,1310721,4,18,1310721,2,5,28,1310721,4,1310721,2, -1835009,40,1595443,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2,1593303, -12,1310721,2,3,26,4,1310721,2,3,26,2,1,40,1595517,16,1310721, -2,3,26,1310721,2,2,1595111,12,10,3,6,10,4,8,1310721,2, -3,26,2,1595235,12,8,13,1594729,12,8,1,1595549,14,1,1310721,2, -5,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1595597, -16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,1594643,12,8,3,1594729,12, -8,1310721,2,2,1595649,16,1310721,2,2,1594643,12,8,27,1594729,12,8, -1,1595657,14,1,1310721,2,3,26,1310721,4,18,1310721,2,5,28,1310721, -4,1310721,2,1835009,40,1595705,16,1966081,1310721,4,1579223,12,1310721,2,4,1558017, -1310721,2,2,26,2,33,32,1595903,16,1310721,2,3,26,1587761,2,1593303, -12,10,3,6,10,4,8,1310721,2,3,26,2,1,40,3,36, -1595847,16,1417729,1310721,2,3,26,2,26,2,13,28,1,6,1,10, -28,34,63,38,3,26,1,6,1,10,28,34,63,38,1,10, -28,1595849,14,1,1595903,16,1467905,1310721,2,2,26,2,1594643,12,8,45, -1425921,1310721,2,3,26,2,26,2,26,1594729,12,8,1,1595925,14,1467905, -1310721,2,2,26,2,1595563,12,1595925,14,1,1310721,2,5,26,1310721,4, -18,1310721,2,1,28,1310721,4,1310721,2,1835009,40,1595973,16,1966081,1310721,4, -1579223,12,1589483,1,10,3,6,10,4,8,1589485,3,10,3,6,10, -4,8,1587903,1,10,3,6,10,4,8,1,1596029,14,1,1310721,2, -1,26,1310721,4,18,1310721,2,1,28,1310721,4,1310721,2,1835009,40,1596077, -16,1966081,1310721,4,1579223,12,1589483,2,1596127,16,1589483,1,6,2,1,6, --1,26,5,6,4,10,8,8,1589467,1589483,2,26,2,1596187,14,1589485, -2,17,40,1596179,16,1589485,1,6,2,1,6,3,26,5,6,4, -10,8,8,1589485,2,3,28,1596187,14,1,1596187,14,1,1310721,2,1, -26,1310721,4,18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1596235,16, -1966081,1310721,4,1579223,12,1310721,2,4,1558017,1310721,2,2,26,1558017,1310721,2, -2,26,2,1558017,1310721,2,2,26,2,3585,32,28,10,3,6,10, -4,8,1587769,2,1,6,1,10,28,34,63,38,3,26,1596327,16, -3,1596361,14,1473025,1310721,2,2,26,2,1,6,1,10,28,34,63, -38,1,10,28,1596371,16,3,1596405,14,1587903,2,65,40,3,36,1, -6,1,10,28,34,63,38,1,10,28,1596415,16,1,1596627,14,1310721, -2,3,26,1596043,12,10,3,6,10,4,8,1310721,2,3,26,2, -1,6,1,10,28,34,63,38,3,26,1596479,16,1,1596627,14,1558017, -1310721,2,2,26,1558017,1310721,2,2,26,2,1310721,2,3,26,2,513, -30,26,10,3,6,10,4,8,1587775,1587903,2,26,1467905,1310721,2,2, -26,2,10,3,6,10,4,8,1587839,1587903,2,26,1310721,2,3,26, -2,10,3,6,10,4,8,1587903,1,6,2,1,6,3,26,5, -6,4,10,8,8,1,1596627,14,1,1310721,2,5,26,1310721,4,18, -1310721,2,5,28,1310721,4,1310721,2,1835009,40,1596675,16,1966081,1310721,4,1579223, -12,1310721,2,4,1587769,2,1,6,1,10,28,34,63,38,3,26, -1596715,16,3,1596781,14,1556993,1310721,2,2,26,2,1,26,2,23,28, -1,6,1,10,28,34,63,38,1,10,28,1,6,1,10,28, -34,63,38,1,10,28,1596791,16,3,1596851,14,1556993,1310721,2,2,26, -2,7,26,2,1,6,1,10,28,34,63,38,3,26,1,6, -1,10,28,34,63,38,1,10,28,1596861,16,1,1597091,14,1310721,2, -3,26,1590513,2,1611819,12,10,3,6,10,4,8,1587563,1,6,2, -1,6,3,26,5,6,4,10,8,8,1558017,1310721,2,3,26,2, -26,33,10,3,6,10,4,8,1310721,2,3,26,2,1596201,12,8, -1590515,2,1611819,12,8,1587563,1,6,2,1,6,3,26,5,6,4, -10,8,8,1558017,1310721,2,3,26,2,3,26,26,33,10,3,6, -10,4,8,1310721,2,3,26,2,3,26,1596201,12,8,1589487,1310721,2, -2,26,1310721,2,3,26,2,10,3,6,10,4,8,1,1597091,14, -1,1310721,2,5,26,1310721,4,18,1310721,2,5,28,1310721,4,1310721,2, -1835009,40,1597139,16,1966081,1310721,4,1579223,12,1310721,2,4,1589487,1310721,2,2, -26,2,1310721,2,3,26,4,1310721,2,3,26,2,1,6,1,10, -28,34,63,38,3,26,1597207,16,1,1597339,14,1310721,2,2,1595671,12, -8,3,1594729,12,8,5,1594643,12,8,27,1594729,12,8,3,1594729,12, -8,1310721,2,3,26,2,1595671,12,8,5,1594729,12,8,1310721,2,2, -1595671,12,8,3,1594729,12,8,3,1594729,12,8,1310721,2,3,26,2, -3,26,1595671,12,8,5,1594729,12,8,1,1597339,14,1,1310721,2,5, -26,1310721,4,18,1310721,2,13,28,1310721,4,1310721,2,1835009,40,1597387,16, -1966081,1310721,4,1579223,12,1310721,2,9,26,4,1310721,2,7,26,4,1310721, -2,5,26,4,1310721,2,3,26,4,1310721,2,4,1,1310721,2,11, -26,4,1587551,2,1597459,16,3,1597503,14,1310721,2,2,1310721,2,3,26, -2,40,3,36,1,6,1,10,28,34,63,38,1,10,28,1597513, -16,1,1597845,14,1589307,1,26,1,10,3,6,10,4,8,1589307,3, -26,5,10,3,6,10,4,8,1589307,5,26,1310721,2,2,10,3, -6,10,4,8,1589307,7,26,1310721,2,3,26,2,10,3,6,10, -4,8,1589307,9,26,1310721,2,9,26,2,10,3,6,10,4,8, -1310721,2,11,26,2,1310721,2,9,26,2,40,1597829,16,1589307,11,1310721, -2,11,26,2,26,1310721,2,11,26,2,26,26,1310721,2,5,26, -2,1310721,2,11,26,2,26,2,10,3,6,10,4,8,1589307,13, -1310721,2,11,26,2,26,1310721,2,11,26,2,26,26,1310721,2,7, -26,2,1310721,2,11,26,2,26,2,10,3,6,10,4,8,1310721, -2,11,26,1,6,2,1,6,3,26,5,6,4,10,8,8, -1597633,14,1589307,1572879,12,8,1,1597845,14,1,1310721,2,13,26,1310721,4, -18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1597893,16,1966081,1310721,4, -1579223,12,1,1310721,2,4,1310721,2,2,1589305,2,40,1598067,16,1310721,2, -3,26,1587905,1310721,2,2,135,30,26,10,3,6,10,4,8,1310721, -2,3,26,2,1,26,2,1310721,2,3,26,2,3,26,2,1310721, -2,3,26,2,7,26,1310721,2,3,26,2,71,26,1310721,2,3, -26,2,5,26,2,1597353,12,8,1310721,2,1,6,2,1,6,3, -26,5,6,4,10,8,8,1597901,14,1589305,1,10,3,6,10,4, -8,1,1598091,14,1,1310721,2,5,26,1310721,4,18,1310721,2,7,28, -1310721,4,1310721,2,1835009,40,1598139,16,1966081,1310721,4,1579223,12,1310721,2,4, -1595029,12,1310721,2,3,26,4,15,1594729,12,8,1310721,2,5,26,1587549, -2,10,3,6,10,4,8,1310721,2,2,2,1598251,16,1310721,2,2, -2,1594449,12,8,1310721,2,1,6,2,1,6,3,26,5,6,4, -10,8,8,1598191,14,1,1594449,12,8,1310721,2,3,26,2,1587549,2, -1594811,12,8,1310721,2,5,26,2,1594643,12,8,1,1598303,14,1,1310721, -2,7,26,1310721,4,18,1310721,2,1,28,1310721,4,1310721,2,1835009,40, -1598351,16,1966081,1310721,4,1579223,12,1585301,2,1,28,1,6,1,10,28, -34,63,38,3,26,1598557,16,1585307,2,1598397,16,3,1598423,14,1573381,12, -1,6,1,10,28,34,63,38,1,10,28,1598455,16,1585299,3,1, -10,28,10,3,6,10,4,8,1,1598857,14,1585299,1573325,12,511,32, -10,3,6,10,4,8,1585299,2,193,28,1,6,1,10,28,34, -63,38,3,26,1598553,16,1585307,3,10,3,6,10,4,8,1585299,3, -1,10,28,10,3,6,10,4,8,1,1598857,14,1598789,14,1585301,2, -7,28,1,6,1,10,28,34,63,38,3,26,1598703,16,1585299,1585305, -2,1585303,2,5,38,26,2,1585303,2,7,32,17,30,38,511,32, -10,3,6,10,4,8,1585299,2,1598677,16,1585303,1,6,2,1,6, -3,26,5,6,4,10,8,8,1598699,14,1585299,3,1,10,28,10, -3,6,10,4,8,1598789,14,1585299,1585303,2,2,511,32,10,3,6, -10,4,8,1585299,2,1598767,16,1585303,1,6,2,1,6,3,26,5, -6,4,10,8,8,1598789,14,1585299,3,1,10,28,10,3,6,10, -4,8,1585299,2,21,28,1,6,1,10,28,34,63,38,3,26, -1598849,16,1585297,1,6,2,1,6,3,26,5,6,4,10,8,8, -1,1598857,14,1,1310721,2,1,26,1310721,4,18,1310721,2,13,28,1310721, -4,1310721,2,1835009,40,1598905,16,1966081,1310721,4,1579223,12,1310721,2,7,26, -4,1310721,2,5,26,4,1310721,2,3,26,4,1310721,2,4,1585309,1, -6,2,1,6,3,26,5,6,4,10,8,8,1585309,2,65,40, -3,36,1599049,16,1599041,14,115,111,117,114,99,101,115,32,110,101, -115,116,101,100,32,116,111,111,32,100,101,101,112,108,121,0, -1598989,1591079,12,8,1310721,2,9,26,1540609,1585309,2,65,30,26,10,3, -6,10,4,8,1310721,2,9,26,2,1,26,1310721,2,2,10,3, -6,10,4,8,1310721,2,9,26,2,3,26,1310721,2,3,26,2, -10,3,6,10,4,8,1310721,2,9,26,2,5,26,1,10,3, -6,10,4,8,1310721,2,9,26,2,7,26,1,10,3,6,10, -4,8,1310721,2,9,26,2,9,26,1310721,2,5,26,2,10,3, -6,10,4,8,1310721,2,9,26,2,23,26,1310721,2,7,26,2, -10,3,6,10,4,8,1310721,2,9,26,2,11,26,1585289,2,10, -3,6,10,4,8,1310721,2,9,26,2,13,26,1585291,2,10,3, -6,10,4,8,1310721,2,9,26,2,15,26,1585293,2,10,3,6, -10,4,8,1310721,2,9,26,2,17,26,1585299,2,10,3,6,10, -4,8,1310721,2,9,26,2,19,26,1585301,2,10,3,6,10,4, -8,1310721,2,9,26,2,21,26,1585303,2,10,3,6,10,4,8, -1310721,2,9,26,2,25,26,1585297,2,10,3,6,10,4,8,1310721, -2,9,26,2,27,26,1585295,2,10,3,6,10,4,8,1310721,2, -9,26,2,29,26,1587515,2,10,3,6,10,4,8,1310721,2,9, -26,2,63,26,1585305,2,10,3,6,10,4,8,1310721,2,11,26, -1,10,3,6,10,4,8,1310721,2,11,26,2,1587515,2,40,1599889, -16,1310721,2,9,26,2,31,1310721,2,11,26,2,9,30,26,26, -1587517,1310721,2,11,26,2,26,2,10,3,6,10,4,8,1310721,2, -9,26,2,33,1310721,2,11,26,2,9,30,26,26,1587525,1310721,2, -11,26,2,26,2,10,3,6,10,4,8,1310721,2,9,26,2, -35,1310721,2,11,26,2,9,30,26,26,1587533,1310721,2,11,26,2, -26,2,10,3,6,10,4,8,1310721,2,9,26,2,37,1310721,2, -11,26,2,9,30,26,26,1587541,1310721,2,11,26,2,26,2,10, -3,6,10,4,8,1310721,2,11,26,1,6,2,1,6,3,26, -5,6,4,10,8,8,1599599,14,1587515,1,10,3,6,10,4,8, -1310721,2,2,3,28,1,6,1,10,28,34,63,38,3,26,1599981, -16,1310721,2,9,26,2,7,26,1310721,2,3,26,2,1,26,2, -10,3,6,10,4,8,1310721,2,2,1,28,1,6,1,10,28, -34,63,38,3,26,1600069,16,1585301,1,10,3,6,10,4,8,1585307, -1,10,3,6,10,4,8,1585297,3,10,3,6,10,4,8,1598317, -12,8,1310721,2,2,5,28,1,6,1,10,28,34,63,38,3, -26,1600165,16,1585301,5,10,3,6,10,4,8,1585303,1310721,2,3,26, -2,10,3,6,10,4,8,1585297,3,10,3,6,10,4,8,1598317, -12,8,1310721,2,2,7,28,1,6,1,10,28,34,63,38,3, -26,1600277,16,1585301,7,10,3,6,10,4,8,1585305,1310721,2,3,26, -2,10,3,6,10,4,8,1585303,1,10,3,6,10,4,8,1585297, -3,10,3,6,10,4,8,1598317,12,8,1,1600285,14,1,1310721,2, -13,26,1310721,4,18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1600333, -16,1966081,1310721,4,1579223,12,1540609,1585309,2,65,30,26,1310721,2,4,1, -1310721,2,3,26,4,1585289,1310721,2,2,11,26,2,10,3,6,10, -4,8,1585291,1310721,2,2,13,26,2,10,3,6,10,4,8,1585293, -1310721,2,2,15,26,2,10,3,6,10,4,8,1585299,1310721,2,2, -17,26,2,10,3,6,10,4,8,1585301,1310721,2,2,19,26,2, -10,3,6,10,4,8,1585303,1310721,2,2,21,26,2,10,3,6, -10,4,8,1585297,1310721,2,2,25,26,2,10,3,6,10,4,8, -1585295,1310721,2,2,27,26,2,10,3,6,10,4,8,1587515,1310721,2, -2,29,26,2,10,3,6,10,4,8,1585305,1310721,2,2,63,26, -2,10,3,6,10,4,8,1310721,2,3,26,2,1587515,2,40,1600897, -16,1587517,1310721,2,3,26,2,26,1310721,2,2,31,1310721,2,3,26, -2,9,30,26,26,2,10,3,6,10,4,8,1587525,1310721,2,3, -26,2,26,1310721,2,2,33,1310721,2,3,26,2,9,30,26,26, -2,10,3,6,10,4,8,1587533,1310721,2,3,26,2,26,1310721,2, -2,35,1310721,2,3,26,2,9,30,26,26,2,10,3,6,10, -4,8,1587541,1310721,2,3,26,2,26,1310721,2,2,37,1310721,2,3, -26,2,9,30,26,26,2,10,3,6,10,4,8,1310721,2,3, -26,1,6,2,1,6,3,26,5,6,4,10,8,8,1600623,14, -1585309,1,6,2,1,6,-1,26,5,6,4,10,8,8,1310721,2, -2,23,26,2,1600959,16,1310721,2,2,3,26,2,1580973,12,8,1, -1600967,14,1,1310721,2,5,26,1310721,4,18,1310721,2,5,28,1310721,4, -1310721,2,1835009,40,1601015,16,1966081,1310721,4,1579223,12,1310721,2,4,1601065,14, -43,45,42,47,37,61,60,62,33,38,124,94,126,63,58,46, -64,35,36,0,1601025,1310721,2,3,26,4,1310721,2,3,26,2,2, -1601181,16,1310721,2,3,26,2,2,1310721,2,2,28,1,6,1,10, -28,34,63,38,3,26,1601143,16,3,1601189,14,1310721,2,3,26,1, -6,2,1,6,3,26,5,6,4,10,8,8,1601077,14,1,1601189, -14,1,1310721,2,5,26,1310721,4,18,1310721,2,11,28,1310721,4,1310721, -2,1835009,40,1601237,16,1966081,1310721,4,1579223,12,1310721,2,3,26,4,1310721, -2,4,1,1310721,2,5,26,4,1310721,2,5,26,2,1585235,2,40, -1601667,16,1310721,2,7,26,1547777,1310721,2,5,26,2,26,2,10,3, -6,10,4,8,1310721,2,9,26,1,10,3,6,10,4,8,1310721, -2,9,26,2,1310721,2,2,40,1601453,16,1310721,2,7,26,2,1310721, -2,9,26,2,26,2,1585311,1310721,2,9,26,2,26,2,28,1, -6,1,10,28,34,63,38,3,26,1,6,1,10,28,34,63, -38,1,10,28,1601455,14,1,1601497,16,1310721,2,9,26,1,6,2, -1,6,3,26,5,6,4,10,8,8,1601343,14,1310721,2,9,26, -2,1310721,2,2,28,1,6,1,10,28,34,63,38,3,26,1601617, -16,1310721,2,7,26,2,1310721,2,2,26,2,1310721,2,3,26,2, -28,1,6,1,10,28,34,63,38,3,26,1,6,1,10,28, -34,63,38,1,10,28,1601619,14,1,1601629,16,3,1601675,14,1310721,2, -5,26,1,6,2,1,6,3,26,5,6,4,10,8,8,1601265, -14,1,1601675,14,1,1310721,2,11,26,1310721,4,18,1310721,2,3,28, -1310721,4,1310721,2,1835009,40,1601723,16,1966081,1310721,4,1579223,12,1310721,2,4, -1310721,2,2,97,40,3,36,1601789,16,1310721,2,2,115,10,40,3, -36,1,6,1,10,28,34,63,38,1,10,28,1601791,14,1,1601797, -14,1,1310721,2,3,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721, -2,1835009,40,1601845,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2, -195,40,3,36,1601911,16,1310721,2,2,245,10,40,3,36,1,6, -1,10,28,34,63,38,1,10,28,1601913,14,1,1601923,16,3,1602007, -14,1310721,2,2,131,40,3,36,1601983,16,1310721,2,2,181,10,40, -3,36,1,6,1,10,28,34,63,38,1,10,28,1601985,14,1, -1,6,1,10,28,34,63,38,1,10,28,1602017,16,3,1602069,14, -1310721,2,2,191,28,1,6,1,10,28,34,63,38,3,26,1, -6,1,10,28,34,63,38,1,10,28,1602075,14,1,1310721,2,3, -26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1602123,16, -1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2,1601689,12,1602157,16,1310721, -2,2,97,28,1602339,14,1310721,2,2,195,40,3,36,1602217,16,1310721, -2,2,205,10,40,3,36,1,6,1,10,28,34,63,38,1, -10,28,1602219,14,1,1602241,16,1310721,2,2,195,28,21,26,1602339,14, -1310721,2,2,131,40,3,36,1602301,16,1310721,2,2,141,10,40,3, -36,1,6,1,10,28,34,63,38,1,10,28,1602303,14,1,1602325, -16,1310721,2,2,131,28,21,26,1602339,14,3,1,10,28,1602339,14, -1,1310721,2,3,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2, -1835009,40,1602387,16,1966081,1310721,4,1579223,12,1585299,2,1310721,2,4,1598317,12, -8,1310721,2,2,185,28,1,6,1,10,28,34,63,38,1,10, -28,1602449,16,1310721,2,2,1602687,14,1310721,2,1585299,2,10,3,6,10, -4,8,1598317,12,8,1310721,2,2,221,28,1,6,1,10,28,34, -63,38,3,26,1602515,16,21,1602687,14,1310721,2,2,233,28,1,6, -1,10,28,34,63,38,3,26,1602555,16,19,1602687,14,1310721,2,2, -229,28,1,6,1,10,28,34,63,38,3,26,1602595,16,27,1602687, -14,1310721,2,2,97,28,1,6,1,10,28,34,63,38,3,26, -1602635,16,1,1602687,14,1310721,2,2,203,28,1,6,1,10,28,34, -63,38,3,26,1602675,16,55,1602687,14,1310721,2,2,1602687,14,1,1310721, -2,3,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40, -1602735,16,1966081,1310721,4,1579223,12,1310721,2,4,1585299,2,1,40,3,36, -1602791,16,1585299,2,1600981,12,1,6,1,10,28,34,63,38,1,10, -28,1602793,14,1,1602837,16,1310721,2,2,1585299,2,1601203,12,1,6,1, -10,28,34,63,38,1,10,28,1602839,14,1,1602909,16,1585311,1310721,2, -2,26,1585299,2,10,3,6,10,4,8,1310721,2,1,6,2,1, -6,3,26,5,6,4,10,8,8,1598317,12,8,1602741,14,1585311,1310721, -2,2,26,1,10,3,6,10,4,8,1585289,9,10,3,6,10, -4,8,1585291,1585311,1592287,12,10,3,6,10,4,8,1,1602977,14,1, -1310721,2,3,26,1310721,4,18,1310721,2,7,28,1310721,4,1310721,2,1835009, -40,1603025,16,1966081,1310721,4,1579223,12,1,1310721,2,4,1585293,3,10,3, -6,10,4,8,3,1603701,16,1585299,2,65,28,1,6,1,10,28, -34,63,38,3,26,1603093,16,3,1603143,14,1585299,2,19,28,1,6, -1,10,28,34,63,38,3,26,1,6,1,10,28,34,63,38, -1,10,28,1603153,16,3,1603203,14,1585299,2,21,28,1,6,1,10, -28,34,63,38,3,26,1,6,1,10,28,34,63,38,1,10, -28,1603213,16,3,1603263,14,1585299,2,27,28,1,6,1,10,28,34, -63,38,3,26,1,6,1,10,28,34,63,38,1,10,28,1603293, -16,1598317,12,8,1585293,1,10,3,6,10,4,8,1603055,14,1585299,2, -95,28,1,6,1,10,28,34,63,38,1,10,28,1603331,16,1603701, -14,1598317,12,8,1585299,2,95,28,1,6,1,10,28,34,63,38, -3,26,1603477,16,1585299,2,1,40,3,36,1603441,16,1585299,2,21,28, -1,6,1,10,28,34,63,38,1,10,28,1,6,1,10,28, -34,63,38,1,10,28,1603443,14,1,1603457,16,1598317,12,8,1603369,14, -1585293,1,10,3,6,10,4,8,1603049,14,1585299,2,85,28,1,6, -1,10,28,34,63,38,3,26,1603645,16,1598317,12,8,1585299,2,1, -40,3,36,1603619,16,1585299,2,85,28,1,6,1,10,28,34,63, -38,3,26,1603609,16,1598317,12,8,1585299,2,95,28,1,6,1,10, -28,34,63,38,3,26,1603605,16,1603619,14,1603615,14,1598317,12,8,1603515, -14,1598317,12,8,1585293,1,10,3,6,10,4,8,1603049,14,1585295,1585297, -2,10,3,6,10,4,8,1585311,1,26,95,10,3,6,10,4, -8,3,1602701,12,8,1,1604985,14,1603049,14,1585295,1585297,2,10,3,6, -10,4,8,1585299,2,1,40,1603769,16,1585289,1,10,3,6,10,4, -8,1585291,1,10,3,6,10,4,8,1,1604985,14,1585299,2,1601689,12, -1604191,16,1310721,2,3,26,1,10,3,6,10,4,8,1585299,2,97, -28,1,6,1,10,28,34,63,38,3,26,1604079,16,1598317,12,8, -1585299,2,241,28,1,6,1,10,28,34,63,38,3,26,1603879,16, -3,1603929,14,1585299,2,177,28,1,6,1,10,28,34,63,38,3, -26,1,6,1,10,28,34,63,38,1,10,28,1604079,16,1598317,12, -8,1310721,2,5,26,1585299,2,1602089,12,10,3,6,10,4,1,40, -3,36,1604033,16,1310721,2,3,26,1310721,2,3,26,2,33,30,1310721, -2,5,26,2,26,10,3,6,10,4,8,1598317,12,8,1603939,14, -1585289,3,10,3,6,10,4,8,1585291,1310721,2,3,26,2,10,3, -6,10,4,8,1,1604985,14,1585299,2,1601689,12,1604145,16,1310721,2,3, -26,1310721,2,3,26,2,21,30,1585299,2,26,97,28,10,3,6, -10,4,8,1598317,12,8,1604079,14,1585289,3,10,3,6,10,4,8, -1585291,1310721,2,3,26,2,10,3,6,10,4,8,1,1604985,14,1585299, -2,1601811,12,1604401,16,1585299,2,1601811,12,1604221,16,3,1604251,14,1585299,2, -1601689,12,1,6,1,10,28,34,63,38,1,10,28,1604335,16,1310721, -2,2,2001,40,1604325,16,1585311,1310721,2,2,26,1585299,2,10,3,6, -10,4,8,1310721,2,1,6,2,1,6,3,26,5,6,4,10, -8,8,1598317,12,8,1604203,14,1585311,1310721,2,2,26,1,10,3,6, -10,4,8,1585289,5,10,3,6,10,4,8,1585291,1585311,1592287,12,10, -3,6,10,4,8,1,1604985,14,1585299,2,79,28,1,6,1,10, -28,34,63,38,3,26,1604575,16,1598317,12,8,1585291,1602353,12,10,3, -6,10,4,8,1585299,2,79,28,1,6,1,10,28,34,63,38, -1,10,28,1604547,16,1604539,14,98,97,100,32,99,104,97,114,97, -99,116,101,114,32,108,105,116,101,114,97,108,0,1604495,1591557,12, -8,1598317,12,8,1585289,3,10,3,6,10,4,8,1,1604985,14,1585299, -2,69,28,1,6,1,10,28,34,63,38,3,26,1604867,16,1598317, -12,8,1585299,2,1,40,3,36,1604685,16,1585299,2,69,28,1,6, -1,10,28,34,63,38,1,10,28,1,6,1,10,28,34,63, -38,1,10,28,1604687,14,1,1604795,16,1310721,2,3,26,1602353,12,10, -3,6,10,4,8,1310721,2,2,2001,40,1604791,16,1585311,1310721,2,2, -26,1310721,2,3,26,2,10,3,6,10,4,8,1310721,2,1,6, -2,1,6,3,26,5,6,4,10,8,8,1604613,14,1598317,12,8, -1585311,1310721,2,2,26,1,10,3,6,10,4,8,1585289,7,10,3, -6,10,4,8,1585291,1585311,1592287,12,10,3,6,10,4,8,1,1604985, -14,1585311,1,26,1585299,2,10,3,6,10,4,8,1598317,12,8,1585311, -1,26,2,1600981,12,1604921,16,3,1602701,12,1604985,14,1585311,3,26,1, -10,3,6,10,4,8,1585289,9,10,3,6,10,4,8,1585291,1585311, -1592287,12,10,3,6,10,4,8,1,1604985,14,1,1310721,2,7,26, -1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1605033,16,1966081, -1310721,4,1579223,12,3,1310721,2,4,1587515,2,1605373,16,1585289,1587517,1,26, -2,10,3,6,10,4,8,1585291,1587525,1,26,2,10,3,6,10, -4,8,1585293,1587533,1,26,2,10,3,6,10,4,8,1585295,1587541,1, -26,2,10,3,6,10,4,8,1310721,2,2,1587515,2,40,1605339,16, -1587517,1310721,2,2,3,28,26,1587517,1310721,2,2,26,2,10,3,6, -10,4,8,1587525,1310721,2,2,3,28,26,1587525,1310721,2,2,26,2, -10,3,6,10,4,8,1587533,1310721,2,2,3,28,26,1587533,1310721,2, -2,26,2,10,3,6,10,4,8,1587541,1310721,2,2,3,28,26, -1587541,1310721,2,2,26,2,10,3,6,10,4,8,1310721,2,1,6, -2,1,6,3,26,5,6,4,10,8,8,1605137,14,1587515,1,6, -2,1,6,-1,26,5,6,4,10,8,8,1,1605383,14,1605919,12, -1605383,14,1,1310721,2,3,26,1310721,4,18,1310721,2,11,28,1310721,4, -1310721,2,1835009,40,1605431,16,1966081,1310721,4,1579223,12,1310721,2,4,1587515,2, -1310721,2,2,10,40,3,36,1605785,16,1310721,2,3,26,1585289,2,10, -3,6,10,4,8,1310721,2,5,26,1585291,2,10,3,6,10,4, -8,1310721,2,7,26,1585293,2,10,3,6,10,4,8,1310721,2,9, -26,1585295,2,10,3,6,10,4,8,1605919,12,8,1587517,1587515,2,26, -1585289,2,10,3,6,10,4,8,1587525,1587515,2,26,1585291,2,10,3, -6,10,4,8,1587533,1587515,2,26,1585293,2,10,3,6,10,4,8, -1587541,1587515,2,26,1585295,2,10,3,6,10,4,8,1587515,1,6,2, -1,6,3,26,5,6,4,10,8,8,1585289,1310721,2,3,26,2, -10,3,6,10,4,8,1585291,1310721,2,5,26,2,10,3,6,10, -4,8,1585293,1310721,2,7,26,2,10,3,6,10,4,8,1585295,1310721, -2,9,26,2,10,3,6,10,4,8,1605437,14,1587511,1587517,1310721,2, -2,26,2,10,3,6,10,4,8,1587513,1587525,1310721,2,2,26,2, -10,3,6,10,4,8,1,1605845,14,1,1310721,2,11,26,1310721,4, -18,1310721,2,1,28,1310721,4,1310721,2,1835009,40,1605893,16,1966081,1310721,4, -1579223,12,1,1605397,12,1605905,14,1,1310721,2,1,26,1310721,4,18,1310721, -2,7,28,1310721,4,1310721,2,1835009,40,1605953,16,1966081,1310721,4,1579223,12, -1310721,2,1540609,1585309,2,65,30,26,10,3,6,10,4,8,1310721,2, -2,1,26,2,3,28,1,6,1,10,28,34,63,38,1,10, -28,1606035,16,1602991,12,8,1,1606411,14,1310721,2,5,26,1310721,2,2, -5,26,2,10,3,6,10,4,8,1310721,2,5,26,2,1310721,2, -2,7,26,2,40,1606323,16,1310721,2,3,26,1310721,2,2,3,26, -2,10,3,6,10,4,8,1585289,1310721,2,3,26,2,3,1310721,2, -5,26,2,7,30,26,26,2,10,3,6,10,4,8,1585291,1310721, -2,3,26,2,5,1310721,2,5,26,2,7,30,26,26,2,10, -3,6,10,4,8,1585295,1310721,2,3,26,2,7,1310721,2,5,26, -2,7,30,26,26,2,10,3,6,10,4,8,1585293,1,10,3, -6,10,4,8,1310721,2,2,5,26,1310721,2,5,26,2,3,26, -10,3,6,10,4,8,1,1606411,14,1310721,2,2,9,26,2,1, -6,1,10,28,34,63,38,3,26,1606397,16,1585289,1,10,3,6, -10,4,8,1585291,1,10,3,6,10,4,8,1,1606411,14,1600299,12, -8,1,1606411,14,1,1310721,2,7,26,1310721,4,18,1310721,2,3,28, -1310721,4,1310721,2,1835009,40,1606459,16,1966081,1310721,4,1579223,12,1310721,2,4, -1585289,2,9,28,1,6,1,10,28,34,63,38,3,26,1606555,16, -1585291,2,1310721,2,2,28,1,6,1,10,28,34,63,38,3,26, -1,6,1,10,28,34,63,38,1,10,28,1606557,14,1,1606563,14, -1,1310721,2,3,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2, -1835009,40,1606611,16,1966081,1310721,4,1579223,12,1310721,2,4,1585289,2,5,28, -1,6,1,10,28,34,63,38,3,26,1606707,16,1585291,2,1310721,2, -2,28,1,6,1,10,28,34,63,38,3,26,1,6,1,10, -28,34,63,38,1,10,28,1606709,14,1,1606715,14,1,1310721,2,3, -26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1606763,16, -1966081,1310721,4,1579223,12,1310721,2,4,1585289,2,9,28,1,6,1,10, -28,34,63,38,3,26,1606807,16,3,1606857,14,1585289,2,5,28,1, -6,1,10,28,34,63,38,3,26,1,6,1,10,28,34,63, -38,1,10,28,1606919,16,1585291,2,1310721,2,2,28,1,6,1,10, -28,34,63,38,3,26,1,6,1,10,28,34,63,38,1,10, -28,1606921,14,1,1606937,16,1604999,12,8,3,1606945,14,1,1606945,14,1, -1310721,2,3,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009, -40,1606993,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2,1606729,12, -1,6,1,10,28,34,63,38,3,26,1607227,16,1590585,2,1,6, -1,10,28,34,63,38,3,26,1607111,16,1587703,2,1,6,1,10, -28,34,63,38,3,26,1,6,1,10,28,34,63,38,1,10, -28,1607113,14,1,1607173,16,1590587,12,8,1607147,14,101,120,112,101,99, -116,101,100,32,0,1607127,1573495,12,8,1310721,2,2,1573495,12,8,1590731, -12,8,1590585,3,10,3,6,10,4,8,1585289,2,1,28,1,6, -1,10,28,34,63,38,3,26,1607227,16,1590891,12,8,1,1607235,14, -1,1310721,2,3,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2, -1835009,40,1607283,16,1966081,1310721,4,1579223,12,1585291,2,1310721,2,4,1585289,2, -5,28,1,6,1,10,28,34,63,38,1,10,28,1607371,16,1607363, -14,101,120,112,101,99,116,101,100,32,97,32,110,97,109,101, -0,1607331,1591557,12,8,1604999,12,8,1310721,2,2,1607389,14,1,1310721,2, -3,26,1310721,4,18,1310721,2,15,28,1310721,4,1310721,2,1835009,40,1607437, -16,1966081,1310721,4,1579223,12,1310721,2,4,1585237,2,1310721,2,3,26,4, -3,1608511,16,1310721,2,2,2,65,28,1,6,1,10,28,34,63, -38,3,26,1607533,16,1310721,2,1,6,2,1,6,3,26,5,6, -4,10,8,8,1607463,14,1310721,2,2,2,1,6,1,10,28,34, -63,38,3,26,1607569,16,1608511,14,1310721,2,5,26,1,10,3,6, -10,4,8,1310721,2,2,1310721,2,5,26,2,26,2,1607687,16,1310721, -2,2,1310721,2,5,26,2,26,2,65,28,1,6,1,10,28, -34,63,38,1,10,28,1,6,1,10,28,34,63,38,1,10, -28,1607689,14,1,1607777,16,1585311,1310721,2,5,26,2,26,1310721,2,2, -1310721,2,5,26,2,26,2,10,3,6,10,4,8,1310721,2,5, -26,1,6,2,1,6,3,26,5,6,4,10,8,8,1607591,14, -1585311,1310721,2,5,26,2,26,1,10,3,6,10,4,8,1310721,2, -1310721,2,2,1310721,2,5,26,2,26,10,3,6,10,4,8,1310721, -2,7,26,1585311,1,26,2,91,28,1,6,1,10,28,34,63, -38,3,26,1607921,16,1585311,3,26,2,1601689,12,1,6,1,10,28, -34,63,38,1,10,28,1607923,14,1,10,3,6,10,4,8,1585311, -1310721,2,7,26,2,26,2,1601689,12,1608251,16,1310721,2,9,26,1, -10,3,6,10,4,8,1310721,2,11,26,1310721,2,7,26,2,10, -3,6,10,4,8,1585311,1310721,2,11,26,2,26,2,1608125,16,1310721, -2,9,26,1310721,2,9,26,2,21,30,1585311,1310721,2,11,26,2, -26,2,26,97,28,10,3,6,10,4,8,1310721,2,11,26,1, -6,2,1,6,3,26,5,6,4,10,8,8,1608011,14,1310721,2, -7,26,2,1608173,16,1310721,2,9,26,1,1310721,2,9,26,2,28, -10,3,6,10,4,8,1542657,1585237,2,26,1310721,2,9,26,2,1310721, -2,9,26,2,26,3,26,10,3,6,10,4,8,1585237,1,6, -2,1,6,3,26,5,6,4,10,8,8,1608507,14,1310721,2,5, -26,2,3,28,1,6,1,10,28,34,63,38,3,26,1608353,16, -1310721,2,13,26,1585311,1,26,2,1608541,12,10,3,6,10,4,1, -40,3,36,1,6,1,10,28,34,63,38,1,10,28,1608355,14, -1,1608433,16,1542657,1585237,2,26,1310721,2,13,26,2,1310721,2,13,26, -2,26,10,3,6,10,4,8,1585237,1,6,2,1,6,3,26, -5,6,4,10,8,8,1608507,14,1542657,1585237,2,26,-3,10,3,6, -10,4,8,1542657,1585237,2,3,26,26,1585311,1592287,12,10,3,6,10, -4,8,1585237,1585237,2,5,26,10,3,6,10,4,8,1607457,14,1310721, -2,3,26,2,1608527,14,1,1310721,2,15,26,1310721,4,18,1310721,2, -5,28,1310721,4,1310721,2,1835009,40,1608575,16,1966081,1310721,4,1579223,12,1310721, -2,4,1,1310721,2,3,26,4,1585239,2,1310721,2,3,26,2,26, -2,1608717,16,1585239,2,1310721,2,3,26,2,26,2,1310721,2,2,28, -1,6,1,10,28,34,63,38,3,26,1608679,16,1310721,2,3,26, -2,1608731,14,1310721,2,3,26,1,6,2,1,6,3,26,5,6, -4,10,8,8,1608593,14,3,1,10,28,1608731,14,1,1310721,2,5, -26,1310721,4,18,1310721,2,9,28,1310721,4,1310721,2,1835009,40,1608779,16, -1966081,1310721,4,1579223,12,1310721,2,3,26,4,1310721,2,4,1310721,2,2, -1310721,2,3,26,2,26,1310721,2,5,26,4,1310721,2,2,1310721,2, -5,26,2,40,1609225,16,1542657,1310721,2,2,26,2,-3,28,1,6, -1,10,28,34,63,38,3,26,1609173,16,1310721,2,7,26,1542657,1310721, -2,2,3,26,26,2,1593303,12,10,3,6,10,4,8,1310721,2, -7,26,2,1,40,1608983,16,1310721,2,7,26,1542657,1310721,2,2,3, -26,26,2,1595111,12,10,3,6,10,4,8,1417729,1310721,2,7,26, -2,26,2,3,28,1,6,1,10,28,34,63,38,3,26,1609047, -16,1310721,2,7,26,2,1595235,12,8,1609143,14,1417729,1310721,2,7,26, -2,26,2,13,28,1,6,1,10,28,34,63,38,3,26,1609121, -16,45,1425921,1310721,2,7,26,2,26,2,26,1594729,12,8,1609143,14, -1425921,1310721,2,7,26,2,26,2,1594643,12,8,1310721,2,1310721,2,2, -5,26,10,3,6,10,4,8,1609221,14,1542657,1310721,2,2,26,2, -1594449,12,8,1310721,2,1,6,2,1,6,3,26,5,6,4,10, -8,8,1608823,14,1,1609233,14,1,1310721,2,9,26,1310721,4,18,1310721, -2,5,28,1310721,4,1310721,2,1835009,40,1609281,16,1966081,1310721,4,1579223,12, -1310721,2,4,1,1310721,2,3,26,4,1310721,2,3,26,2,1585235,2, -40,1609411,16,1547777,1310721,2,3,26,2,26,2,1310721,2,2,28,1, -6,1,10,28,34,63,38,3,26,1609373,16,1,1609473,14,1310721,2, -3,26,1,6,2,1,6,3,26,5,6,4,10,8,8,1609299, -14,1547777,1585235,2,26,1310721,2,2,10,3,6,10,4,8,1585235,1, -6,2,1,6,3,26,5,6,4,10,8,8,1,1609473,14,1, -1310721,2,5,26,1310721,4,18,1310721,2,5,28,1310721,4,1310721,2,1835009, -40,1609521,16,1966081,1310721,4,1579223,12,1310721,2,4,1585229,2,1310721,2,3, -26,4,1310721,2,3,26,2,1609655,16,1310721,2,3,26,1,6,2, -1,6,-1,26,5,6,4,10,8,8,1546753,1310721,2,3,26,2, -26,2,1310721,2,2,28,1,6,1,10,28,34,63,38,3,26, -1609651,16,1310721,2,3,26,2,1609669,14,1609541,14,3,1,10,28,1609669, -14,1,1310721,2,5,26,1310721,4,18,1310721,2,5,28,1310721,4,1310721, -2,1835009,40,1609717,16,1966081,1310721,4,1579223,12,1310721,2,4,1585231,2,1310721, -2,3,26,4,1310721,2,3,26,2,1609851,16,1310721,2,3,26,1, -6,2,1,6,-1,26,5,6,4,10,8,8,1547265,1310721,2,3, -26,2,26,2,1310721,2,2,28,1,6,1,10,28,34,63,38, -3,26,1609847,16,1310721,2,3,26,2,1609865,14,1609737,14,3,1,10, -28,1609865,14,1,1310721,2,5,26,1310721,4,18,1310721,2,5,28,1310721, -4,1310721,2,1835009,40,1609913,16,1966081,1310721,4,1579223,12,1310721,2,4,1585233, -2,1310721,2,3,26,4,1310721,2,3,26,2,1610047,16,1310721,2,3, -26,1,6,2,1,6,-1,26,5,6,4,10,8,8,1547457,1310721, -2,3,26,2,26,2,1310721,2,2,28,1,6,1,10,28,34, -63,38,3,26,1610043,16,1310721,2,3,26,2,1610061,14,1609933,14,3, -1,10,28,1610061,14,1,1310721,2,5,26,1310721,4,18,1310721,2,15, -28,1310721,4,1310721,2,1835009,40,1610109,16,1966081,1310721,4,1579223,12,1310721,2, -5,26,4,1310721,2,3,26,4,1310721,2,4,1310721,2,2,1592287,12, -1310721,2,7,26,4,1310721,2,7,26,2,1609487,12,1310721,2,9,26, -4,1310721,2,9,26,2,1,40,1610249,16,1310721,2,9,26,1585229,2, -10,3,6,10,4,8,1585229,1,6,2,1,6,3,26,5,6, -4,10,8,8,1546753,1310721,2,9,26,2,26,1310721,2,7,26,2, -10,3,6,10,4,8,1546881,1310721,2,9,26,2,26,1310721,2,3, -26,2,10,3,6,10,4,8,1310721,2,3,26,2,1,40,1610473, -16,1546881,1310721,2,9,26,2,26,1,1310721,2,3,26,2,28,10, -3,6,10,4,8,1547137,1310721,2,9,26,2,26,1310721,2,3,26, -2,10,3,6,10,4,8,1547009,1310721,2,9,26,2,26,1,10, -3,6,10,4,8,1310721,2,7,26,2,1609247,12,8,1310721,2,9, -26,2,1611101,14,1547009,1310721,2,9,26,2,26,1310721,2,5,26,2, -1607403,12,10,3,6,10,4,8,1547137,1310721,2,9,26,2,26,1585237, -2,1547009,1310721,2,9,26,2,26,2,28,10,3,6,10,4,8, -1310721,2,7,26,2,1609247,12,8,1310721,2,13,26,1310721,2,2,1574039, -12,10,3,6,10,4,8,1585311,2001,26,1310721,2,2,1310721,2,13, -26,2,1574491,12,8,1585311,2001,1310721,2,13,26,2,26,26,123,10, -3,6,10,4,8,1585311,2003,1310721,2,13,26,2,26,26,1,10, -3,6,10,4,8,1310721,2,11,26,1585311,2001,26,1592287,12,10,3, -6,10,4,8,1310721,2,3,26,2,17,40,3,36,1610757,16,3, -1610813,14,1310721,2,3,26,2,11,28,1,6,1,10,28,34,63, -38,3,26,1,6,1,10,28,34,63,38,1,10,28,1610823,16, -3,1610879,14,1310721,2,3,26,2,9,28,1,6,1,10,28,34, -63,38,3,26,1,6,1,10,28,34,63,38,1,10,28,1610889, -16,3,1610945,14,1310721,2,3,26,2,7,28,1,6,1,10,28, -34,63,38,3,26,1,6,1,10,28,34,63,38,1,10,28, -1611085,16,1310721,2,11,26,2,1609879,12,1,40,1611029,16,1547457,1585233,2, -26,1310721,2,11,26,2,10,3,6,10,4,8,1585233,1,6,2, -1,6,3,26,5,6,4,10,8,8,1547585,1310721,2,11,26,2, -1609879,12,26,1310721,2,9,26,2,10,3,6,10,4,8,1310721,2, -11,26,2,1609247,12,8,1310721,2,9,26,2,1611101,14,1,1310721,2, -15,26,1310721,4,18,1310721,2,9,28,1310721,4,1310721,2,1835009,40,1611149, -16,1966081,1310721,4,1579223,12,1310721,2,3,26,4,1310721,2,4,1310721,2, -2,1592287,12,1310721,2,5,26,4,1310721,2,5,26,2,1609683,12,1310721, -2,7,26,4,1310721,2,7,26,2,1,40,1611279,16,1310721,2,7, -26,1585231,2,10,3,6,10,4,8,1585231,1,6,2,1,6,3, -26,5,6,4,10,8,8,1547265,1310721,2,7,26,2,26,1310721,2, -5,26,2,10,3,6,10,4,8,1547329,1310721,2,7,26,2,26, -1310721,2,3,26,2,1607403,12,10,3,6,10,4,8,1547393,1310721,2, -7,26,2,26,1585237,2,1547329,1310721,2,7,26,2,26,2,28,10, -3,6,10,4,8,1310721,2,5,26,2,1609247,12,8,1310721,2,7, -26,2,1611435,14,1,1310721,2,9,26,1310721,4,18,1310721,2,9,28, -1310721,4,1310721,2,1835009,40,1611483,16,1966081,1310721,4,1579223,12,1310721,2,5, -26,4,1310721,2,3,26,4,1310721,2,4,1310721,2,2,1592287,12,11, -1310721,2,3,26,2,1592805,12,1310721,2,7,26,4,1442305,1310721,2,7, -26,2,26,3,1310721,2,5,26,2,34,10,3,6,10,4,8, -1310721,2,7,26,2,1611601,14,1,1310721,2,9,26,1310721,4,18,1310721, -2,5,28,1310721,4,1310721,2,1835009,40,1611649,16,1966081,1310721,4,1579223,12, -1310721,2,4,1587557,2,1310721,2,3,26,4,1310721,2,3,26,2,1587559, -2,10,40,1611791,16,1310721,2,3,26,1,6,2,1,6,-1,26, -5,6,4,10,8,8,1466881,1310721,2,3,26,2,26,2,1310721,2, -2,28,1,6,1,10,28,34,63,38,3,26,1611787,16,1310721,2, -3,26,2,1611805,14,1611669,14,3,1,10,28,1611805,14,1,1310721,2, -5,26,1310721,4,18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1611853, -16,1966081,1310721,4,1579223,12,1310721,2,4,1587557,2,1310721,2,3,26,4, -1587557,2,1025,40,3,36,1611933,16,1611925,14,116,111,111,32,109,97, -110,121,32,108,111,99,97,108,115,0,1611893,1591079,12,8,1587557,1, -6,2,1,6,3,26,5,6,4,10,8,8,1466881,1310721,2,3, -26,2,26,1310721,2,2,10,3,6,10,4,8,1467905,1310721,2,3, -26,2,26,1587563,2,10,3,6,10,4,8,1468929,1310721,2,3,26, -2,26,1587561,2,10,3,6,10,4,8,1469953,1310721,2,3,26,2, -26,1,10,3,6,10,4,8,1470977,1310721,2,3,26,2,26,1, -10,3,6,10,4,8,1472001,1310721,2,3,26,2,26,1,10,3, -6,10,4,8,1473025,1310721,2,3,26,2,26,1,10,3,6,10, -4,8,1474049,1310721,2,3,26,2,26,1,10,3,6,10,4,8, -1556993,1310721,2,3,26,2,26,1587687,2,10,3,6,10,4,8,1558017, -1310721,2,3,26,2,26,1,10,3,6,10,4,8,1589487,1310721,2, -3,26,2,26,1,10,3,6,10,4,8,1310721,2,3,26,2, -1612295,14,1,1310721,2,5,26,1310721,4,18,1310721,2,3,28,1310721,4, -1310721,2,1835009,40,1612343,16,1966081,1310721,4,1579223,12,1310721,2,4,1469953,1310721, -2,2,26,2,11,28,1,6,1,10,28,34,63,38,3,26, -1612421,16,1310721,2,1470977,1310721,2,2,26,2,10,3,6,10,4,8, -1612349,14,1310721,2,2,1612433,14,1,1310721,2,3,26,1310721,4,18,1310721, -2,3,28,1310721,4,1310721,2,1835009,40,1612481,16,1966081,1310721,4,1579223,12, -1310721,2,4,1469953,1310721,2,2,26,2,1,28,1,6,1,10,28, -34,63,38,1,10,28,1612531,14,1,1310721,2,3,26,1310721,4,18, -1310721,2,5,28,1310721,4,1310721,2,1835009,40,1612579,16,1966081,1310721,4,1579223, -12,1310721,2,4,1472001,1310721,2,2,26,3,10,3,6,10,4,8, -1587565,2,1,6,1,10,28,34,63,38,3,26,1612643,16,1,1613019, -14,1310721,2,3,26,1310721,2,2,1612309,12,10,3,6,10,4,8, -1472001,1310721,2,3,26,2,26,3,10,3,6,10,4,8,1469953,1310721, -2,3,26,2,26,2,9,28,1,6,1,10,28,34,63,38, -3,26,1612827,16,1310721,2,2,1612813,14,117,115,101,100,32,97,102, -116,101,114,32,105,116,32,119,97,115,32,103,105,118,101,110, -32,97,119,97,121,0,1612755,1591963,12,8,1,1613019,14,1469953,1310721,2, -3,26,2,26,2,7,28,1,6,1,10,28,34,63,38,3, -26,1612919,16,1468929,1310721,2,3,26,2,26,2,1587561,2,40,1,6, -1,10,28,34,63,38,1,10,28,1612921,14,1,1613011,16,1468929,1310721, -2,3,26,2,26,1587561,2,10,3,6,10,4,8,1469953,1310721,2, -3,26,2,26,3,10,3,6,10,4,8,1474049,1310721,2,3,26, -2,26,3,10,3,6,10,4,8,1,1613019,14,1,1310721,2,5, -26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1613067,16, -1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2,3,28,1,6,1, -10,28,34,63,38,3,26,1613257,16,1613249,14,97,32,110,101,119, -32,111,98,106,101,99,116,32,99,97,110,39,116,32,98,101, -32,117,115,101,100,32,97,115,32,97,32,112,108,97,105,110, -32,118,97,108,117,101,59,32,98,105,110,100,32,105,116,32, -116,111,32,97,32,110,97,109,101,32,102,105,114,115,116,0, -1613111,1591845,12,8,1310721,2,2,5,40,3,36,1613291,16,1310721,2,2, -5,28,1612545,12,8,1,1613299,14,1,1310721,2,3,26,1310721,4,18, -1310721,2,3,28,1310721,4,1310721,2,1835009,40,1613347,16,1966081,1310721,4,1579223, -12,1310721,2,4,1467905,1310721,2,2,26,2,1595563,12,8,3,1594729,12, -8,1587671,2,1595409,12,8,9,1594729,12,8,1,1613405,14,1,1310721,2, -3,26,1310721,4,18,1310721,2,9,28,1310721,4,1310721,2,1835009,40,1613453, -16,1966081,1310721,4,1579223,12,1310721,2,3,26,4,1310721,2,4,1587557,2, -1310721,2,5,26,4,1587565,2,1,6,1,10,28,34,63,38,3, -26,1613517,16,3,1613563,14,1587569,2,1,6,1,10,28,34,63,38, -3,26,1,6,1,10,28,34,63,38,1,10,28,1613573,16,1, -1614133,14,1310721,2,5,26,2,1587559,2,10,40,1614125,16,1310721,2,5, -26,1,6,2,1,6,-1,26,5,6,4,10,8,8,1468929,1310721, -2,5,26,2,26,2,1310721,2,2,40,1613661,16,1613573,14,1310721,2, -7,26,1469953,1310721,2,5,26,2,26,2,10,3,6,10,4,8, -1310721,2,7,26,2,3,28,1,6,1,10,28,34,63,38,3, -26,1613755,16,1310721,2,5,26,2,1613313,12,8,1614121,14,1310721,2,7, -26,2,5,28,1,6,1,10,28,34,63,38,3,26,1614001,16, -1310721,2,5,26,2,1613989,14,117,32,111,98,106,101,99,116,32, -109,117,115,116,32,108,101,97,118,101,32,116,104,105,115,32, -98,108,111,99,107,32,40,98,108,111,99,107,32,118,97,108, -117,101,44,32,97,115,115,105,103,110,109,101,110,116,32,116, -111,32,116,104,101,32,101,110,99,108,111,115,105,110,103,32, -98,108,111,99,107,44,32,111,114,32,114,101,116,117,114,110, -41,0,1613807,1591963,12,8,1614121,14,1310721,2,7,26,2,7,28,1, -6,1,10,28,34,63,38,3,26,1614121,16,1310721,2,5,26,2, -1614113,14,100,32,111,98,106,101,99,116,32,119,97,115,32,110, -101,118,101,114,32,103,105,118,101,110,32,97,119,97,121,0, -1614053,1591963,12,8,1613573,14,1,1614133,14,1,1310721,2,9,26,1310721,4, -18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1614181,16,1966081,1310721,4, -1579223,12,1310721,2,4,1310721,2,2,1587557,2,40,1614423,16,1587565,2,1614249, -16,1474049,1310721,2,2,26,2,1,6,1,10,28,34,63,38,1, -10,28,1614251,14,1,1614313,16,1472001,1310721,2,2,26,2,1,6,1, -10,28,34,63,38,3,26,1,6,1,10,28,34,63,38,1, -10,28,1614315,14,1,1614389,16,1466881,1310721,2,2,26,2,1614381,14,109, -32,111,98,106,101,99,116,32,105,115,32,110,101,118,101,114, -32,117,115,101,100,0,1614335,1591343,12,8,1310721,2,1,6,2,1, -6,3,26,5,6,4,10,8,8,1614187,14,1,1614431,14,1,1310721, -2,3,26,1310721,4,18,1310721,2,7,28,1310721,4,1310721,2,1835009,40, -1614479,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2,1310721,2,3, -26,4,1587769,2,1614775,16,1310721,2,3,26,2,1587557,2,40,1614775,16, -1310721,2,5,26,1558017,1310721,2,3,26,2,26,2,17,38,15,32, -10,3,6,10,4,8,1558017,1310721,2,3,26,2,26,2,33,32, -1614633,16,1310721,2,5,26,2,1,6,1,10,28,34,63,38,1, -10,28,1614635,14,1,1614673,16,1589483,2,17,40,1,6,1,10,28, -34,63,38,1,10,28,1614675,14,1,1614737,16,1589467,1589483,2,26,1310721, -2,5,26,2,10,3,6,10,4,8,1589483,1,6,2,1,6, -3,26,5,6,4,10,8,8,1310721,2,3,26,1,6,2,1, -6,3,26,5,6,4,10,8,8,1614509,14,1310721,2,3,26,1587559, -2,10,3,6,10,4,8,1310721,2,2,1614147,12,8,1587561,2,3, -1613419,12,8,1310721,2,3,26,2,1310721,2,2,40,1614975,16,1468929,1310721, -2,3,26,2,26,2,1587561,2,40,3,36,1614937,16,1469953,1310721,2, -3,26,2,26,9,10,3,6,10,4,8,1468929,1310721,2,3,26, -2,26,1587561,2,3,28,10,3,6,10,4,8,1310721,2,3,26, -1,6,2,1,6,3,26,5,6,4,10,8,8,1614823,14,1587557, -1310721,2,2,10,3,6,10,4,8,1,1615003,14,1,1310721,2,7, -26,1310721,4,18,1310721,2,7,28,1310721,4,1310721,2,1835009,40,1615051,16, -1966081,1310721,4,1579223,12,1587585,2,1310721,2,4,1587559,2,1310721,2,3,26, -4,1310721,2,5,26,1507841,1310721,2,2,26,10,3,6,10,4,8, -1310721,2,5,26,2,1,26,1587559,2,10,3,6,10,4,8,1310721, -2,5,26,2,3,26,1587557,2,10,3,6,10,4,8,1310721,2, -5,26,1310721,2,5,26,2,5,26,10,3,6,10,4,8,1310721, -2,3,26,2,1587557,2,40,1615417,16,1310721,2,5,26,2,1,26, -1469953,1310721,2,3,26,2,26,2,10,3,6,10,4,8,1310721,2, -5,26,2,3,26,1470977,1310721,2,3,26,2,26,2,10,3,6, -10,4,8,1310721,2,5,26,2,5,26,1468929,1310721,2,3,26,2, -26,2,10,3,6,10,4,8,1310721,2,5,26,1310721,2,5,26, -2,7,26,10,3,6,10,4,8,1310721,2,3,26,1,6,2, -1,6,3,26,5,6,4,10,8,8,1615199,14,1587585,1310721,2,5, -26,2,1507841,28,10,3,6,10,4,8,1587585,2,16001,40,3,36, -1615541,16,1615533,14,110,101,115,116,105,110,103,32,116,111,111,32, -100,101,101,112,32,102,111,114,32,116,104,101,32,97,110,97, -108,121,122,101,114,0,1615465,1591079,12,8,1310721,2,2,1615553,14,1, -1310721,2,7,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009, -40,1615601,16,1966081,1310721,4,1579223,12,1310721,2,4,1587585,1310721,2,2,10, -3,6,10,4,8,1,1615635,14,1,1310721,2,3,26,1310721,4,18, -1310721,2,9,28,1310721,4,1310721,2,1835009,40,1615683,16,1966081,1310721,4,1579223, -12,1310721,2,4,1507841,1310721,2,2,26,1310721,2,3,26,4,1310721,2, -3,26,2,1,26,2,1310721,2,5,26,4,1310721,2,3,26,2, -3,26,2,1310721,2,7,26,4,1310721,2,7,26,2,1587557,2,10, -40,1615807,16,1310721,2,7,26,1587557,2,10,3,6,10,4,8,1310721, -2,3,26,1310721,2,3,26,2,5,26,10,3,6,10,4,8, -1310721,2,5,26,2,1310721,2,7,26,2,40,1616065,16,1469953,1310721,2, -5,26,2,26,1310721,2,3,26,2,1,26,2,10,3,6,10, -4,8,1470977,1310721,2,5,26,2,26,1310721,2,3,26,2,3,26, -2,10,3,6,10,4,8,1468929,1310721,2,5,26,2,26,1310721,2, -3,26,2,5,26,2,10,3,6,10,4,8,1310721,2,3,26, -1310721,2,3,26,2,7,26,10,3,6,10,4,8,1310721,2,5, -26,1,6,2,1,6,3,26,5,6,4,10,8,8,1615841,14, -1,1616073,14,1,1310721,2,9,26,1310721,4,18,1310721,2,3,28,1310721, -4,1310721,2,1835009,40,1616121,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721, -2,2,1,28,1,6,1,10,28,34,63,38,3,26,1616167,16, -3,1616219,14,1310721,2,2,9,28,1,6,1,10,28,34,63,38, -3,26,1,6,1,10,28,34,63,38,1,10,28,1616225,14,1, -1310721,2,3,26,1310721,4,18,1310721,2,11,28,1310721,4,1310721,2,1835009, -40,1616273,16,1966081,1310721,4,1579223,12,1310721,2,4,1507841,1310721,2,2,26, -1310721,2,3,26,4,1310721,2,3,26,2,1,26,2,1310721,2,5, -26,4,1310721,2,3,26,2,3,26,2,1310721,2,7,26,4,1310721, -2,7,26,2,1587557,2,10,40,1616397,16,1310721,2,7,26,1587557,2, -10,3,6,10,4,8,1310721,2,3,26,1310721,2,3,26,2,5, -26,10,3,6,10,4,8,1310721,2,5,26,2,1310721,2,7,26, -2,40,1617021,16,1310721,2,9,26,1469953,1310721,2,5,26,2,26,2, -10,3,6,10,4,8,1310721,2,9,26,2,1616087,12,1616557,16,1310721, -2,3,26,2,1,26,2,1616087,12,1,6,1,10,28,34,63, -38,1,10,28,1616559,14,1,1616639,16,1310721,2,3,26,2,1,26, -2,9,28,1,6,1,10,28,34,63,38,3,26,1616635,16,1469953, -1310721,2,5,26,2,26,9,10,3,6,10,4,8,1616949,14,1310721, -2,9,26,2,1310721,2,3,26,2,1,26,2,28,1,6,1, -10,28,34,63,38,1,10,28,1616699,16,3,1616777,14,1468929,1310721,2, -5,26,2,26,2,1310721,2,3,26,2,5,26,2,28,1,6, -1,10,28,34,63,38,1,10,28,1,6,1,10,28,34,63, -38,1,10,28,1616787,16,3,1616931,14,1310721,2,9,26,2,11,28, -1,6,1,10,28,34,63,38,3,26,1616907,16,1470977,1310721,2,5, -26,2,26,2,1310721,2,3,26,2,3,26,2,28,1,6,1, -10,28,34,63,38,1,10,28,1,6,1,10,28,34,63,38, -1,10,28,1616909,14,1,1,6,1,10,28,34,63,38,1,10, -28,1616949,16,1310721,2,5,26,2,1617035,14,1310721,2,3,26,1310721,2, -3,26,2,7,26,10,3,6,10,4,8,1310721,2,5,26,1, -6,2,1,6,3,26,5,6,4,10,8,8,1616431,14,3,1, -10,28,1617035,14,1,1310721,2,11,26,1310721,4,18,1310721,2,3,28, -1310721,4,1310721,2,1835009,40,1617083,16,1966081,1310721,4,1579223,12,1310721,2,4, -1310721,2,2,1,28,1,6,1,10,28,34,63,38,3,26,1617145, -16,1617139,14,101,109,112,116,121,0,1617127,1617471,14,1310721,2,2,3, -28,1,6,1,10,28,34,63,38,3,26,1617193,16,1617187,14,109, -0,1617183,1617471,14,1310721,2,2,5,28,1,6,1,10,28,34,63, -38,3,26,1617241,16,1617235,14,117,0,1617231,1617471,14,1310721,2,2,7, -28,1,6,1,10,28,34,63,38,3,26,1617289,16,1617283,14,100, -0,1617279,1617471,14,1310721,2,2,9,28,1,6,1,10,28,34,63, -38,3,26,1617355,16,1617349,14,103,105,118,101,110,32,97,119,97, -121,0,1617327,1617471,14,1310721,2,2,11,28,1,6,1,10,28,34, -63,38,3,26,1617441,16,1617435,14,111,119,110,101,100,32,98,121, -32,97,32,99,111,110,116,97,105,110,101,114,0,1617393,1617471,14, -1617463,14,98,111,114,114,111,119,101,100,0,1617445,1617471,14,1,1310721, -2,3,26,1310721,4,18,1310721,2,7,28,1310721,4,1310721,2,1835009,40, -1617519,16,1966081,1310721,4,1579223,12,1310721,2,5,26,4,1310721,2,3,26, -4,1310721,2,4,1587565,2,1,6,1,10,28,34,63,38,3,26, -1617579,16,3,1617605,14,1590585,2,1,6,1,10,28,34,63,38,1, -10,28,1617615,16,3,1617641,14,1587703,2,1,6,1,10,28,34,63, -38,1,10,28,1617651,16,1,1617871,14,1590587,12,8,1466881,1310721,2,2, -26,2,1573495,12,8,1617685,14,58,32,0,1617679,1573495,12,8,1310721,2, -5,26,2,1573495,12,8,1617757,14,32,40,111,110,101,32,112,97, -116,104,32,108,101,97,118,101,115,32,105,116,32,0,1617713,1573495, -12,8,1310721,2,3,26,2,1617049,12,1573495,12,8,1617811,14,44,32, -97,110,111,116,104,101,114,32,0,1617789,1573495,12,8,1469953,1310721,2, -2,26,2,1617049,12,1573495,12,8,1617849,14,41,0,1617845,1573495,12,8, -1590731,12,8,1,1617871,14,1,1310721,2,7,26,1310721,4,18,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1310721,2,5,28,1310721,4,1310721,2,1835009,40,1618051,16,1966081,1310721,4,1579223, -12,1310721,2,3,26,4,1310721,2,4,1310721,2,3,26,2,1310721,2, -2,3,26,2,40,3,36,1618105,16,1,1618153,14,1310721,2,2,5, -7,1310721,2,3,26,2,1310721,2,2,1,26,2,28,30,26,26, -2,1618153,14,1,1310721,2,5,26,1310721,4,18,1310721,2,5,28,1310721, -4,1310721,2,1835009,40,1618201,16,1966081,1310721,4,1579223,12,1310721,2,3,26, -4,1310721,2,4,1310721,2,2,7,7,1310721,2,3,26,2,1310721,2, -2,1,26,2,28,30,26,26,2,1618265,14,1,1310721,2,5,26, -1310721,4,18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1618313,16,1966081, -1310721,4,1579223,12,1310721,2,3,26,4,1310721,2,4,1310721,2,2,9, -7,1310721,2,3,26,2,1310721,2,2,1,26,2,28,30,26,26, -2,1618377,14,1,1310721,2,5,26,1310721,4,18,1310721,2,9,28,1310721, -4,1310721,2,1835009,40,1618425,16,1966081,1310721,4,1579223,12,1310721,2,4,1567233, -1617885,2,26,1310721,2,3,26,4,1587559,2,1310721,2,5,26,4,1617885, -2,7,26,7,1587557,2,1587559,2,28,30,26,1572353,1567233,28,40,3, -36,1618581,16,1618573,14,116,111,111,32,109,97,110,121,32,98,114, -101,97,107,115,32,102,111,114,32,116,104,101,32,97,110,97, -108,121,122,101,114,0,1618507,1591079,12,8,1310721,2,3,26,2,1, -26,1310721,2,2,10,3,6,10,4,8,1310721,2,3,26,2,3, -26,1587559,2,10,3,6,10,4,8,1310721,2,3,26,2,5,26, -1587557,2,10,3,6,10,4,8,1310721,2,7,26,1310721,2,3,26, -2,7,26,10,3,6,10,4,8,1310721,2,5,26,2,1587557,2, -40,1618925,16,1310721,2,7,26,2,1,26,1469953,1310721,2,5,26,2, -26,2,10,3,6,10,4,8,1310721,2,7,26,2,3,26,1470977, -1310721,2,5,26,2,26,2,10,3,6,10,4,8,1310721,2,7, -26,2,5,26,1468929,1310721,2,5,26,2,26,2,10,3,6,10, -4,8,1310721,2,7,26,1310721,2,7,26,2,7,26,10,3,6, -10,4,8,1310721,2,5,26,1,6,2,1,6,3,26,5,6, -4,10,8,8,1618707,14,1617885,1310721,2,7,26,2,1567233,28,10,3, -6,10,4,8,1310721,2,3,26,2,1618969,14,1,1310721,2,9,26, -1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1619017,16,1966081, -1310721,4,1579223,12,1310721,2,4,1618015,2,129,40,3,36,1619115,16,1619107, -14,116,111,111,32,109,97,110,121,32,112,97,116,104,115,32, -102,111,114,32,116,104,101,32,97,110,97,108,121,122,101,114, -0,1619043,1591079,12,8,1617887,1618015,2,26,1310721,2,2,10,3,6,10, -4,8,1618015,1,6,2,1,6,3,26,5,6,4,10,8,8, -1,1619177,14,1,1310721,2,3,26,1310721,4,18,1310721,2,11,28,1310721, -4,1310721,2,1835009,40,1619225,16,1966081,1310721,4,1579223,12,1310721,2,5,26, -4,1310721,2,3,26,4,1310721,2,4,1310721,2,2,1310721,2,5,26, -2,1618017,12,1310721,2,7,26,4,1310721,2,3,26,2,1310721,2,5, -26,2,1618017,12,1310721,2,9,26,4,1310721,2,7,26,2,1616087,12, -1619373,16,1310721,2,9,26,2,1616087,12,1,6,1,10,28,34,63, -38,1,10,28,1619375,14,1,1619385,16,3,1619697,14,1310721,2,7,26, -2,1310721,2,9,26,2,28,1,6,1,10,28,34,63,38,3, -26,1619523,16,1310721,2,2,1310721,2,5,26,2,1618279,12,1310721,2,3, -26,2,1310721,2,5,26,2,1618279,12,28,1,6,1,10,28,34, -63,38,3,26,1,6,1,10,28,34,63,38,1,10,28,1619525, -14,1,1619689,16,1310721,2,7,26,2,11,28,1,6,1,10,28, -34,63,38,1,10,28,1619575,16,3,1619663,14,1310721,2,2,1310721,2, -5,26,2,1618167,12,1310721,2,3,26,2,1310721,2,5,26,2,1618167, -12,28,1,6,1,10,28,34,63,38,3,26,1,6,1,10, -28,34,63,38,1,10,28,1,6,1,10,28,34,63,38,1, -10,28,1619691,14,1,1619697,14,1,1310721,2,11,26,1310721,4,18,1310721, -2,21,28,1310721,4,1310721,2,1835009,40,1619745,16,1966081,1310721,4,1579223,12, -1310721,2,3,26,4,1310721,2,4,1587559,2,1310721,2,5,26,4,1618015, -2,1,6,1,10,28,34,63,38,3,26,1619809,16,1,1621281,14, -1310721,2,5,26,2,1310721,2,2,40,1621273,16,1310721,2,9,26,1617887, -1,26,2,10,3,6,10,4,8,1310721,2,13,26,1310721,2,9, -26,2,1310721,2,5,26,2,1618017,12,10,3,6,10,4,8,1310721, -2,15,26,1,10,3,6,10,4,8,1310721,2,17,26,3,10, -3,6,10,4,8,1310721,2,19,26,3,1,10,28,10,3,6, -10,4,8,1310721,2,7,26,1,10,3,6,10,4,8,1310721,2, -7,26,2,1618015,2,40,1620451,16,1310721,2,11,26,1617887,1310721,2,7, -26,2,26,2,1310721,2,5,26,2,1618017,12,10,3,6,10,4, -8,1310721,2,11,26,2,9,28,1,6,1,10,28,34,63,38, -3,26,1620111,16,3,1620167,14,1310721,2,11,26,2,7,28,1,6, -1,10,28,34,63,38,3,26,1,6,1,10,28,34,63,38, -1,10,28,1620193,16,1310721,2,15,26,3,10,3,6,10,4,8, -1310721,2,11,26,2,5,28,1,6,1,10,28,34,63,38,3, -26,1620237,16,3,1620293,14,1310721,2,11,26,2,13,28,1,6,1, -10,28,34,63,38,3,26,1,6,1,10,28,34,63,38,1, -10,28,1620319,16,1310721,2,17,26,1,10,3,6,10,4,8,1310721, -2,9,26,2,1617887,1310721,2,7,26,2,26,2,1310721,2,5,26, -2,1619191,12,1,6,1,10,28,34,63,38,3,26,1620413,16,1310721, -2,19,26,1310721,2,7,26,2,10,3,6,10,4,8,1310721,2, -7,26,1,6,2,1,6,3,26,5,6,4,10,8,8,1619997, -14,1469953,1310721,2,5,26,2,26,1310721,2,13,26,2,10,3,6, -10,4,8,1470977,1310721,2,5,26,2,26,1310721,2,9,26,2,1310721, -2,5,26,2,1618167,12,10,3,6,10,4,8,1468929,1310721,2,5, -26,2,26,1310721,2,9,26,2,1310721,2,5,26,2,1618279,12,10, -3,6,10,4,8,1310721,2,19,26,2,1,40,1620793,16,1310721,2, -13,26,2,1616087,12,1620789,16,1310721,2,7,26,1,10,3,6,10, -4,8,1310721,2,7,26,2,1618015,2,40,1620789,16,1617887,1310721,2,7, -26,2,26,2,1310721,2,5,26,2,1618017,12,9,28,1,6,1, -10,28,34,63,38,3,26,1620751,16,1469953,1310721,2,5,26,2,26, -9,10,3,6,10,4,8,1310721,2,7,26,1,6,2,1,6, -3,26,5,6,4,10,8,8,1620645,14,1621235,14,1310721,2,15,26, -2,1620843,16,1310721,2,17,26,2,1,6,1,10,28,34,63,38, -1,10,28,1620845,14,1,1620881,16,1469953,1310721,2,5,26,2,26,9, -10,3,6,10,4,8,1621235,14,1587565,2,1620939,16,1590585,2,1,6, -1,10,28,34,63,38,3,26,1,6,1,10,28,34,63,38, -1,10,28,1620941,14,1,1620995,16,1587703,2,1,6,1,10,28,34, -63,38,3,26,1,6,1,10,28,34,63,38,1,10,28,1620997, -14,1,1621235,16,1590587,12,8,1466881,1310721,2,5,26,2,26,2,1573495, -12,8,1621039,14,58,32,0,1621033,1573495,12,8,1310721,2,3,26,2, -1573495,12,8,1621111,14,32,40,111,110,101,32,112,97,116,104,32, -108,101,97,118,101,115,32,105,116,32,0,1621067,1573495,12,8,1310721, -2,13,26,2,1617049,12,1573495,12,8,1621165,14,44,32,97,110,111, -116,104,101,114,32,0,1621143,1573495,12,8,1617887,1310721,2,19,26,2, -26,2,1310721,2,5,26,2,1618017,12,1617049,12,1573495,12,8,1621221,14, -41,0,1621217,1573495,12,8,1590731,12,8,1310721,2,5,26,1,6,2, -1,6,3,26,5,6,4,10,8,8,1619809,14,1,1621281,14,1, -1310721,2,21,26,1310721,4,18,1310721,2,13,28,1310721,4,1310721,2,1835009, -40,1621329,16,1966081,1310721,4,1579223,12,1310721,2,5,26,4,1310721,2,3, -26,4,1310721,2,4,1587559,2,1310721,2,7,26,4,1,1310721,2,9, -26,4,1587565,2,1,6,1,10,28,34,63,38,3,26,1621415,16, -1,1621775,14,1310721,2,7,26,2,1310721,2,3,26,2,40,1621759,16, -1310721,2,11,26,1310721,2,2,1310721,2,7,26,2,1618017,12,10,3, -6,10,4,8,1469953,1310721,2,7,26,2,26,2,9,28,1,6, -1,10,28,34,63,38,3,26,1621651,16,1310721,2,11,26,2,3, -28,1,6,1,10,28,34,63,38,3,26,1621569,16,3,1621625,14, -1310721,2,11,26,2,7,28,1,6,1,10,28,34,63,38,3, -26,1,6,1,10,28,34,63,38,1,10,28,1,6,1,10, -28,34,63,38,1,10,28,1621653,14,1,1621721,16,1310721,2,9,26, -1,6,2,1,6,3,26,5,6,4,10,8,8,1310721,2,5, -26,2,1621721,16,1310721,2,7,26,2,1613313,12,8,1310721,2,7,26, -1,6,2,1,6,3,26,5,6,4,10,8,8,1621415,14,1310721, -2,9,26,2,1621775,14,1,1310721,2,13,26,1310721,4,18,1310721,2, -11,28,1310721,4,1310721,2,1835009,40,1621823,16,1966081,1310721,4,1579223,12,1310721, -2,4,1507841,1310721,2,2,26,1310721,2,3,26,4,1310721,2,3,26, -2,1,26,2,1310721,2,5,26,4,1310721,2,3,26,2,3,26, -2,1310721,2,7,26,4,1587565,2,1,6,1,10,28,34,63,38, -3,26,1621935,16,3,1621981,14,1587569,2,1,6,1,10,28,34,63, -38,3,26,1,6,1,10,28,34,63,38,1,10,28,1621991,16, -1,1623357,14,1310721,2,7,26,2,1587557,2,10,40,1622037,16,1310721,2, -7,26,1587557,2,10,3,6,10,4,8,1310721,2,5,26,2,1310721, -2,7,26,2,40,1623349,16,1310721,2,9,26,1469953,1310721,2,5,26, -2,26,2,10,3,6,10,4,8,1310721,2,9,26,2,1616087,12, -1622171,16,1310721,2,3,26,2,1310721,2,5,26,2,1618017,12,1616087,12, -1,6,1,10,28,34,63,38,1,10,28,1622173,14,1,1622261,16, -1310721,2,3,26,2,1310721,2,5,26,2,1618017,12,9,28,1,6, -1,10,28,34,63,38,3,26,1622257,16,1469953,1310721,2,5,26,2, -26,9,10,3,6,10,4,8,1623311,14,1310721,2,9,26,2,1310721, -2,3,26,2,1310721,2,5,26,2,1618017,12,28,1,6,1,10, -28,34,63,38,1,10,28,1622329,16,3,1622415,14,1468929,1310721,2,5, -26,2,26,2,1310721,2,3,26,2,1310721,2,5,26,2,1618279,12, -28,1,6,1,10,28,34,63,38,1,10,28,1,6,1,10, -28,34,63,38,1,10,28,1622425,16,3,1622577,14,1310721,2,9,26, -2,11,28,1,6,1,10,28,34,63,38,3,26,1622553,16,1470977, -1310721,2,5,26,2,26,2,1310721,2,3,26,2,1310721,2,5,26, -2,1618167,12,28,1,6,1,10,28,34,63,38,1,10,28,1, -6,1,10,28,34,63,38,1,10,28,1622555,14,1,1,6,1, -10,28,34,63,38,1,10,28,1623311,16,1310721,2,9,26,2,9, -28,1,6,1,10,28,34,63,38,3,26,1622625,16,3,1622681,14, -1310721,2,9,26,2,7,28,1,6,1,10,28,34,63,38,3, -26,1,6,1,10,28,34,63,38,1,10,28,1622915,16,1310721,2, -5,26,2,1622903,14,105,115,32,103,105,118,101,110,32,97,119, -97,121,32,105,110,115,105,100,101,32,97,32,108,111,111,112, -32,116,104,97,116,32,99,111,109,101,115,32,98,97,99,107, -32,97,114,111,117,110,100,32,116,111,32,105,116,59,32,103, -105,118,101,32,105,116,32,97,119,97,121,32,111,110,32,97, -32,112,97,116,104,32,116,104,97,116,32,108,101,97,118,101, -115,32,116,104,101,32,108,111,111,112,0,1622699,1591963,12,8,1623311, -14,1590585,2,1,6,1,10,28,34,63,38,3,26,1622993,16,1587703, -2,1,6,1,10,28,34,63,38,3,26,1,6,1,10,28, -34,63,38,1,10,28,1622995,14,1,1623311,16,1590587,12,8,1466881,1310721, -2,5,26,2,26,2,1573495,12,8,1623205,14,58,32,99,104,97, -110,103,101,115,32,115,116,97,116,101,32,105,110,115,105,100, -101,32,97,32,108,111,111,112,59,32,101,97,99,104,32,112, -97,115,115,32,104,97,115,32,116,111,32,108,101,97,118,101, -32,105,116,32,97,115,32,105,116,32,102,111,117,110,100,32, -105,116,32,40,105,116,32,119,101,110,116,32,102,114,111,109, -32,0,1623031,1573495,12,8,1310721,2,3,26,2,1310721,2,5,26,2, -1618017,12,1617049,12,1573495,12,8,1623261,14,32,116,111,32,0,1623251,1573495, -12,8,1310721,2,9,26,2,1617049,12,1573495,12,8,1623297,14,41,0, -1623293,1573495,12,8,1590731,12,8,1310721,2,5,26,1,6,2,1,6, -3,26,5,6,4,10,8,8,1622037,14,1,1623357,14,1,1310721,2, -11,26,1310721,4,18,1310721,2,19,28,1310721,4,1310721,2,1835009,40,1623405, -16,1966081,1310721,4,1579223,12,1310721,2,11,26,4,1310721,2,9,26,4, -1310721,2,7,26,4,1310721,2,5,26,4,1310721,2,3,26,4,1310721, -2,4,1310721,2,13,26,1615017,12,10,3,6,10,4,8,1618015,1, -10,3,6,10,4,8,1310721,2,3,26,2,1623531,16,1507841,1310721,2, -2,26,1618983,12,8,1310721,2,7,26,2,1623565,16,1507841,1310721,2,13, -26,2,26,1618983,12,8,1310721,2,9,26,2,1310721,2,11,26,2, -1619711,12,8,1310721,2,7,26,2,1623637,16,1507841,1310721,2,13,26,2, -26,1310721,2,9,26,2,3,1621295,12,8,1310721,2,15,26,1,10, -3,6,10,4,8,1310721,2,3,26,2,1623719,16,1310721,2,15,26, -1507841,1310721,2,2,26,1310721,2,9,26,2,1,1621295,12,10,3,6, -10,4,8,1310721,2,15,26,2,1623837,16,1310721,2,17,26,1595029,12, -10,3,6,10,4,8,15,1594729,12,8,1310721,2,5,26,2,1587549, -2,1594811,12,8,1507841,1310721,2,2,26,1310721,2,9,26,2,3,1621295, -12,8,1310721,2,17,26,2,1587549,2,1594811,12,8,1623857,14,1310721,2, -5,26,2,1587549,2,1594811,12,8,1587569,1310721,2,3,26,2,1623879,16, -3,1623911,14,1310721,2,7,26,2,1,6,1,10,28,34,63,38, -1,10,28,10,3,6,10,4,8,1,1623931,14,1,1310721,2,19, -26,1310721,4,18,1310721,2,9,28,1310721,4,1310721,2,1835009,40,1623979,16, -1966081,1310721,4,1579223,12,1310721,2,3,26,4,1310721,2,4,1587565,2,1, -6,1,10,28,34,63,38,3,26,1624033,16,1310721,2,2,1625003,14, -1310721,2,2,5,40,1624149,16,1624131,14,111,110,108,121,32,97,32, -110,97,109,101,100,32,111,119,110,101,100,32,111,98,106,101, -99,116,32,99,97,110,32,98,101,32,114,101,99,97,115,116, -0,1624051,1591845,12,8,1310721,2,2,1625003,14,1310721,2,5,26,1310721,2, -2,5,28,10,3,6,10,4,8,1310721,2,7,26,1469953,1310721,2, -5,26,2,26,2,10,3,6,10,4,8,1472001,1310721,2,5,26, -2,26,3,10,3,6,10,4,8,1310721,2,7,26,2,11,28, -1,6,1,10,28,34,63,38,3,26,1624413,16,1310721,2,5,26, -2,1624401,14,98,101,108,111,110,103,115,32,116,111,32,97,32, -99,111,110,116,97,105,110,101,114,59,32,114,101,99,97,115, -116,32,116,104,101,32,99,111,110,116,97,105,110,101,114,32, -105,110,115,116,101,97,100,0,1624295,1591963,12,8,1624991,14,1310721,2, -7,26,2,13,28,1,6,1,10,28,34,63,38,3,26,1624541, -16,1310721,2,5,26,2,1624529,14,105,115,32,98,111,114,114,111, -119,101,100,32,97,110,100,32,99,97,110,39,116,32,98,101, -32,114,101,99,97,115,116,0,1624465,1591963,12,8,1624991,14,1310721,2, -7,26,2,1,28,1,6,1,10,28,34,63,38,3,26,1624649, -16,1310721,2,5,26,2,1624637,14,105,115,110,39,116,32,97,110, -32,111,119,110,101,100,32,111,98,106,101,99,116,0,1624593,1591963, -12,8,1624991,14,1310721,2,7,26,2,9,28,1,6,1,10,28, -34,63,38,3,26,1624771,16,1310721,2,5,26,2,1624759,14,117,115, -101,100,32,97,102,116,101,114,32,105,116,32,119,97,115,32, -103,105,118,101,110,32,97,119,97,121,0,1624701,1591963,12,8,1624991, -14,1310721,2,3,26,2,3,28,1,6,1,10,28,34,63,38, -3,26,1624871,16,1310721,2,7,26,2,3,28,1,6,1,10,28, -34,63,38,1,10,28,1,6,1,10,28,34,63,38,1,10, -28,1624873,14,1,1624955,16,1310721,2,5,26,2,1624943,14,99,97,110, -39,116,32,98,101,32,114,101,99,97,115,116,32,98,97,99, -107,32,116,111,32,109,0,1624891,1591963,12,8,1624991,14,1469953,1310721,2, -5,26,2,26,1310721,2,3,26,2,10,3,6,10,4,8,1310721, -2,2,1625003,14,1,1310721,2,9,26,1310721,4,18,1310721,2,9,28, -1310721,4,1310721,2,1835009,40,1625051,16,1966081,1310721,4,1579223,12,1310721,2,3, -26,4,1310721,2,4,1587565,2,1,6,1,10,28,34,63,38,3, -26,1625101,16,1,1626535,14,1310721,2,2,3,28,1,6,1,10,28, -34,63,38,3,26,1625345,16,1310721,2,3,26,2,5,28,1,6, -1,10,28,34,63,38,1,10,28,1625339,16,1625331,14,97,32,110, -101,119,32,111,98,106,101,99,116,32,99,97,110,32,111,110, -108,121,32,103,111,32,115,116,114,97,105,103,104,116,32,116, -111,32,97,32,100,32,112,97,114,97,109,101,116,101,114,59, -32,98,105,110,100,32,105,116,32,116,111,32,97,32,110,97, -109,101,32,102,105,114,115,116,0,1625179,1591845,12,8,1,1626535,14, -1310721,2,2,5,40,1625365,16,3,1625421,14,1310721,2,2,5,28,1612447, -12,1,6,1,10,28,34,63,38,3,26,1,6,1,10,28, -34,63,38,1,10,28,1625431,16,1,1626535,14,1310721,2,5,26,1310721, -2,2,5,28,10,3,6,10,4,8,1310721,2,7,26,1469953,1310721, -2,5,26,2,26,2,10,3,6,10,4,8,1469953,1310721,2,5, -26,2,1612309,12,26,2,9,28,1,6,1,10,28,34,63,38, -3,26,1625631,16,1310721,2,5,26,2,1625617,14,117,115,101,100,32, -97,102,116,101,114,32,105,116,32,119,97,115,32,103,105,118, -101,110,32,97,119,97,121,0,1625559,1591963,12,8,1,1626535,14,1310721, -2,3,26,2,3,10,40,3,36,1625859,16,1310721,2,7,26,2, -7,28,1,6,1,10,28,34,63,38,3,26,1625837,16,1310721,2, -5,26,2,1625823,14,105,115,32,100,59,32,112,97,115,115,32, -105,116,32,116,111,32,97,32,100,32,112,97,114,97,109,101, -116,101,114,32,40,108,101,110,100,105,110,103,32,105,116,32, -119,111,117,108,100,32,108,111,115,101,32,105,116,41,0,1625707, -1591963,12,8,1,1626535,14,1310721,2,5,26,2,1612545,12,8,1,1626535, -14,1310721,2,7,26,2,7,28,1,6,1,10,28,34,63,38, -3,26,1625959,16,1469953,1310721,2,5,26,2,26,9,10,3,6,10, -4,8,1472001,1310721,2,5,26,2,26,3,10,3,6,10,4,8, -1,1626535,14,1310721,2,7,26,2,3,28,1,6,1,10,28,34, -63,38,3,26,1626087,16,1310721,2,5,26,2,1626075,14,105,115,32, -109,59,32,119,114,105,116,101,32,100,42,120,32,116,111,32, -103,105,118,101,32,105,116,32,97,119,97,121,0,1626011,1591963,12, -8,1626527,14,1310721,2,7,26,2,5,28,1,6,1,10,28,34, -63,38,3,26,1626263,16,1310721,2,5,26,2,1626251,14,105,115,32, -117,59,32,119,114,105,116,101,32,100,42,120,32,116,111,32, -103,105,118,101,32,105,116,32,97,119,97,121,32,105,110,115, -116,101,97,100,32,111,102,32,114,101,116,117,114,110,105,110, -103,32,105,116,0,1626139,1591963,12,8,1626527,14,1310721,2,7,26,2, -11,28,1,6,1,10,28,34,63,38,3,26,1626433,16,1310721,2, -5,26,2,1626421,14,98,101,108,111,110,103,115,32,116,111,32, -97,32,99,111,110,116,97,105,110,101,114,32,97,110,100,32, -99,97,110,39,116,32,98,101,32,103,105,118,101,110,32,97, -119,97,121,32,97,108,111,110,101,0,1626315,1591963,12,8,1626527,14, -1310721,2,5,26,2,1626519,14,105,115,32,98,111,114,114,111,119, -101,100,32,97,110,100,32,99,97,110,39,116,32,98,101,32, -103,105,118,101,110,32,97,119,97,121,0,1626447,1591963,12,8,1, -1626535,14,1,1310721,2,9,26,1310721,4,18,1310721,2,3,28,1310721,4, -1310721,2,1835009,40,1626583,16,1966081,1310721,4,1579223,12,1310721,2,4,1467905,1310721, -2,2,26,2,1595563,12,8,3,1594729,12,8,1556993,1310721,2,2,26, -2,1,26,2,23,28,1,6,1,10,28,34,63,38,3,26, -1626685,16,5,1594643,12,8,27,1594729,12,8,3,1594729,12,8,1587673,2, -1595409,12,8,1587769,2,1626737,16,1587699,2,1658673,12,1,6,1,10,28, -34,63,38,1,10,28,1626739,14,1,1626763,16,1587699,2,1594643,12,8, -1590517,2,1595409,12,8,1,1626771,14,1,1310721,2,3,26,1310721,4,18, -1310721,2,15,28,1310721,4,1310721,2,1835009,40,1626819,16,1966081,1310721,4,1579223, -12,1310721,2,5,26,4,1310721,2,3,26,4,1310721,2,4,1587565,2, -1,6,1,10,28,34,63,38,3,26,1626879,16,1,1630325,14,1310721, -2,9,26,3,1,10,28,10,3,6,10,4,8,1310721,2,5, -26,2,5,40,3,36,1626973,16,1310721,2,5,26,2,5,28,1612447, -12,1,6,1,10,28,34,63,38,1,10,28,1626975,14,1,1627013, -16,1310721,2,9,26,1310721,2,5,26,2,5,28,10,3,6,10, -4,8,1310721,2,9,26,2,1,40,3,36,1627105,16,1469953,1310721,2, -9,26,2,1612309,12,26,2,9,28,1,6,1,10,28,34,63, -38,3,26,1,6,1,10,28,34,63,38,1,10,28,1627107,14, -1,1627197,16,1310721,2,9,26,2,1627183,14,117,115,101,100,32,97, -102,116,101,114,32,105,116,32,119,97,115,32,103,105,118,101, -110,32,97,119,97,121,0,1627125,1591963,12,8,1,1630325,14,1310721,2, -2,3,28,1,6,1,10,28,34,63,38,3,26,1628669,16,1310721, -2,7,26,1469953,1310721,2,3,26,2,26,2,10,3,6,10,4, -8,1310721,2,9,26,2,1,40,1627347,16,1310721,2,5,26,2,3, -28,1,6,1,10,28,34,63,38,1,10,28,1,6,1,10, -28,34,63,38,1,10,28,1627349,14,1,1627553,16,1310721,2,7,26, -2,1616087,12,1,6,1,10,28,34,63,38,3,26,1627519,16,1310721, -2,3,26,2,1627507,14,115,116,105,108,108,32,111,119,110,115, -32,97,110,32,111,98,106,101,99,116,59,32,111,118,101,114, -119,114,105,116,105,110,103,32,105,116,32,119,111,117,108,100, -32,108,101,97,107,32,105,116,0,1627405,1591963,12,8,1627547,14,1469953, -1310721,2,3,26,2,26,1,10,3,6,10,4,8,1,1630325,14, -1310721,2,7,26,2,1616087,12,1,6,1,10,28,34,63,38,3, -26,1627721,16,1310721,2,3,26,2,1627707,14,115,116,105,108,108,32, -111,119,110,115,32,97,110,32,111,98,106,101,99,116,59,32, -111,118,101,114,119,114,105,116,105,110,103,32,105,116,32,119, -111,117,108,100,32,108,101,97,107,32,105,116,0,1627605,1591963,12, -8,1,1630325,14,1310721,2,5,26,2,3,28,1,6,1,10,28, -34,63,38,3,26,1627919,16,1469953,1310721,2,3,26,2,26,3,10, -3,6,10,4,8,1472001,1310721,2,3,26,2,26,1,10,3,6, -10,4,8,1474049,1310721,2,3,26,2,26,3,10,3,6,10,4, -8,1558017,1310721,2,3,26,2,26,2,31,32,1627913,16,1469953,1310721,2, -3,26,2,26,1558017,1310721,2,3,26,2,26,2,31,32,10,3, -6,10,4,8,1,1630325,14,1310721,2,13,26,1469953,1310721,2,9,26, -2,26,2,10,3,6,10,4,8,1310721,2,13,26,2,5,28, -1,6,1,10,28,34,63,38,3,26,1628077,16,1468929,1310721,2,3, -26,2,26,2,1468929,1310721,2,9,26,2,26,2,3,28,28,1, -6,1,10,28,34,63,38,3,26,1,6,1,10,28,34,63, -38,1,10,28,1628079,14,1,1628299,16,1469953,1310721,2,3,26,2,26, -3,10,3,6,10,4,8,1472001,1310721,2,3,26,2,26,1,10, -3,6,10,4,8,1474049,1310721,2,3,26,2,26,3,10,3,6, -10,4,8,1469953,1310721,2,9,26,2,26,9,10,3,6,10,4, -8,1472001,1310721,2,9,26,2,26,3,10,3,6,10,4,8,1558017, -1310721,2,3,26,2,26,2,31,32,1628293,16,1469953,1310721,2,3,26, -2,26,1558017,1310721,2,3,26,2,26,2,31,32,10,3,6,10, -4,8,1,1630325,14,1310721,2,13,26,2,5,28,1,6,1,10, -28,34,63,38,3,26,1628519,16,1310721,2,9,26,2,1628507,14,105, -115,32,117,59,32,105,116,32,99,97,110,32,111,110,108,121, -32,98,101,32,104,97,110,100,101,100,32,116,111,32,97,32, -118,97,114,105,97,98,108,101,32,111,102,32,116,104,101,32, -101,110,99,108,111,115,105,110,103,32,98,108,111,99,107,44, -32,111,114,32,114,101,116,117,114,110,101,100,0,1628351,1591963,12, -8,1628663,14,1310721,2,9,26,2,1628655,14,105,115,32,97,110,32, -111,119,110,101,100,32,111,98,106,101,99,116,32,97,110,100, -32,99,97,110,39,116,32,98,101,32,99,111,112,105,101,100, -32,105,110,116,111,32,97,110,111,116,104,101,114,32,118,97, -114,105,97,98,108,101,0,1628533,1591963,12,8,1,1630325,14,1310721,2, -2,7,28,1,6,1,10,28,34,63,38,3,26,1629993,16,1310721, -2,11,26,1310721,2,3,26,2,1612309,12,10,3,6,10,4,8, -1310721,2,7,26,1469953,1310721,2,11,26,2,26,2,10,3,6,10, -4,8,1310721,2,3,26,2,1612545,12,8,1310721,2,5,26,2,3, -28,1,6,1,10,28,34,63,38,3,26,1628849,16,1310721,2,3, -26,2,1626549,12,8,1,1630325,14,1310721,2,9,26,2,1,40,1628873, -16,1,1630325,14,1310721,2,13,26,1469953,1310721,2,9,26,2,26,2, -10,3,6,10,4,8,1310721,2,13,26,2,11,28,1,6,1, -10,28,34,63,38,3,26,1629035,16,1310721,2,9,26,2,1629023,14, -97,108,114,101,97,100,121,32,98,101,108,111,110,103,115,32, -116,111,32,97,32,99,111,110,116,97,105,110,101,114,0,1628961, -1591963,12,8,1629987,14,1310721,2,13,26,2,13,28,1,6,1,10, -28,34,63,38,3,26,1629163,16,1310721,2,9,26,2,1629151,14,105, -115,32,98,111,114,114,111,119,101,100,32,97,110,100,32,99, -97,110,39,116,32,98,101,32,115,116,111,114,101,100,0,1629087, -1591963,12,8,1629987,14,1310721,2,7,26,2,13,28,1,6,1,10, -28,34,63,38,3,26,1629489,16,1310721,2,13,26,2,5,28,1, -6,1,10,28,34,63,38,3,26,1629413,16,1310721,2,9,26,2, -1629401,14,105,115,32,117,59,32,105,116,32,104,97,115,32,116, -111,32,108,101,97,118,101,32,116,104,114,111,117,103,104,32, -116,104,101,32,98,108,111,99,107,32,97,98,111,118,101,44, -32,110,111,116,32,105,110,116,111,32,97,32,98,111,114,114, -111,119,101,100,32,111,98,106,101,99,116,0,1629253,1591963,12,8, -1629485,14,1469953,1310721,2,9,26,2,26,9,10,3,6,10,4,8, -1472001,1310721,2,9,26,2,26,3,10,3,6,10,4,8,1310721,2, -3,26,2,1626549,12,8,1629987,14,1310721,2,13,26,2,1310721,2,7, -26,2,28,1,6,1,10,28,34,63,38,1,10,28,1629695,16, -1310721,2,9,26,2,1629683,14,105,116,115,32,116,97,103,32,100, -111,101,115,110,39,116,32,109,97,116,99,104,32,105,116,115, -32,99,111,110,116,97,105,110,101,114,39,115,32,40,98,111, -116,104,32,104,97,118,101,32,116,111,32,98,101,32,109,44, -32,117,32,111,114,32,100,41,0,1629551,1591963,12,8,1629987,14,1468929, -1310721,2,9,26,2,26,2,1468929,1310721,2,11,26,2,26,2,40, -1629879,16,1310721,2,9,26,2,1629867,14,108,105,118,101,115,32,105, -110,32,97,110,32,111,117,116,101,114,32,98,108,111,99,107, -32,116,104,97,110,32,116,104,101,32,99,111,110,116,97,105, -110,101,114,32,105,116,39,115,32,115,116,111,114,101,100,32, -105,110,116,111,0,1629747,1591963,12,8,1629987,14,1469953,1310721,2,9,26, -2,26,11,10,3,6,10,4,8,1470977,1310721,2,9,26,2,26, -1310721,2,3,26,2,10,3,6,10,4,8,1472001,1310721,2,9,26, -2,26,3,10,3,6,10,4,8,1310721,2,3,26,2,1626549,12, -8,1,1630325,14,1310721,2,9,26,2,1,40,3,36,1630317,16,1469953, -1310721,2,9,26,2,26,2,7,28,1,6,1,10,28,34,63, -38,3,26,1630119,16,1469953,1310721,2,9,26,2,26,9,10,3,6, -10,4,8,1472001,1310721,2,9,26,2,26,3,10,3,6,10,4, -8,1630317,14,1310721,2,9,26,2,1630309,14,109,117,115,116,32,98, -101,32,100,32,116,111,32,98,101,32,115,116,111,114,101,100, -32,105,110,32,97,32,103,108,111,98,97,108,32,111,114,32, -105,110,32,117,110,116,114,97,99,107,101,100,32,109,101,109, -111,114,121,32,40,116,104,101,32,99,111,108,108,101,99,116, -111,114,32,116,97,107,101,115,32,105,116,32,111,118,101,114, -41,0,1630133,1591963,12,8,1,1630325,14,1,1310721,2,15,26,1310721,4, -18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1630373,16,1966081,1310721,4, -1579223,12,1310721,2,4,1587565,2,1,6,1,10,28,34,63,38,3, -26,1630413,16,1,1631339,14,1310721,2,3,26,3,1,10,28,10,3, -6,10,4,8,1310721,2,2,5,40,3,36,1630499,16,1310721,2,2, -5,28,1612447,12,1,6,1,10,28,34,63,38,1,10,28,1630501, -14,1,1630535,16,1310721,2,3,26,1310721,2,2,5,28,10,3,6, -10,4,8,1310721,2,3,26,2,1,40,3,36,1630627,16,1469953,1310721, -2,3,26,2,1612309,12,26,2,9,28,1,6,1,10,28,34, -63,38,3,26,1,6,1,10,28,34,63,38,1,10,28,1630629, -14,1,1630719,16,1310721,2,3,26,2,1630705,14,117,115,101,100,32, -97,102,116,101,114,32,105,116,32,119,97,115,32,103,105,118, -101,110,32,97,119,97,121,0,1630647,1591963,12,8,1,1631339,14,1587567, -2,1630975,16,1310721,2,3,26,2,1,40,3,36,1630969,16,1469953,1310721, -2,3,26,2,26,2,5,28,1,6,1,10,28,34,63,38, -3,26,1630853,16,1469953,1310721,2,3,26,2,26,9,10,3,6,10, -4,8,1472001,1310721,2,3,26,2,26,3,10,3,6,10,4,8, -1630969,14,1310721,2,3,26,2,1630961,14,104,97,115,32,116,111,32, -98,101,32,117,32,116,111,32,98,101,32,114,101,116,117,114, -110,101,100,59,32,119,114,105,116,101,32,39,114,101,116,117, -114,110,32,117,42,120,39,0,1630867,1591963,12,8,1,1631339,14,1310721, -2,2,3,28,1,6,1,10,28,34,63,38,3,26,1631139,16, -1631127,14,114,101,116,117,114,110,115,32,97,32,110,101,119,32, -111,98,106,101,99,116,59,32,103,105,118,101,32,116,104,101, -32,102,117,110,99,116,105,111,110,32,97,32,46,117,32,114, -101,116,117,114,110,32,116,121,112,101,0,1631013,1591845,12,8,1631331, -14,1310721,2,3,26,2,1,40,3,36,1631331,16,1310721,2,3,26, -2,1631323,14,105,115,32,111,119,110,101,100,32,97,110,100,32, -99,97,110,39,116,32,98,101,32,114,101,116,117,114,110,101, -100,32,102,114,111,109,32,97,32,102,117,110,99,116,105,111, -110,32,119,104,111,115,101,32,114,101,116,117,114,110,32,116, -121,112,101,32,105,115,110,39,116,32,46,117,0,1631175,1591963,12, -8,1,1631339,14,1,1310721,2,5,26,1310721,4,18,1310721,2,5,28, -1310721,4,1310721,2,1835009,40,1631387,16,1966081,1310721,4,1579223,12,1310721,2,4, -1587565,2,1,6,1,10,28,34,63,38,3,26,1631427,16,1,1632055, -14,1310721,2,2,3,28,1,6,1,10,28,34,63,38,3,26, -1631467,16,3,1632055,14,1310721,2,2,5,40,1631487,16,3,1631543,14,1310721, -2,2,5,28,1612447,12,1,6,1,10,28,34,63,38,3,26, -1,6,1,10,28,34,63,38,1,10,28,1631553,16,1,1632055,14, -1310721,2,3,26,1310721,2,2,5,28,10,3,6,10,4,8,1469953, -1310721,2,3,26,2,26,2,5,28,1,6,1,10,28,34,63, -38,3,26,1631695,16,1468929,1310721,2,3,26,2,26,2,1587561,2,28, -1,6,1,10,28,34,63,38,3,26,1,6,1,10,28,34, -63,38,1,10,28,1631697,14,1,1631763,16,1469953,1310721,2,3,26,2, -26,9,10,3,6,10,4,8,1472001,1310721,2,3,26,2,26,3, -10,3,6,10,4,8,3,1632055,14,1469953,1310721,2,3,26,2,26, -2,5,28,1,6,1,10,28,34,63,38,3,26,1631927,16,1310721, -2,3,26,2,1631915,14,111,110,108,121,32,97,32,117,32,111, -98,106,101,99,116,32,111,102,32,116,104,105,115,32,98,108, -111,99,107,32,99,97,110,32,98,101,32,105,116,115,32,118, -97,108,117,101,0,1631821,1591963,12,8,1632047,14,1310721,2,3,26,2, -1632039,14,104,97,115,32,116,111,32,98,101,32,117,32,116,111, -32,98,101,32,104,97,110,100,101,100,32,117,112,32,97,115, -32,116,104,101,32,98,108,111,99,107,39,115,32,118,97,108, -117,101,0,1631941,1591963,12,8,1,1632055,14,1,1310721,2,5,26,1310721, -4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1632103,16,1966081,1310721, -4,1579223,12,1310721,2,4,1310721,2,2,3,28,1,6,1,10,28, -34,63,38,3,26,1632259,16,1632247,14,97,32,110,101,119,32,111, -98,106,101,99,116,32,40,111,114,32,97,32,117,32,114,101, -115,117,108,116,41,32,99,97,110,39,116,32,98,101,32,116, -104,114,111,119,110,32,97,119,97,121,0,1632147,1591845,12,8,1632293, -14,1310721,2,2,5,40,3,36,1632293,16,1310721,2,2,5,28,1612545, -12,8,1,1632301,14,1,1310721,2,3,26,1310721,4,18,1310721,2,5, -28,1310721,4,1310721,2,1835009,40,1632349,16,1966081,1310721,4,1579223,12,1310721,2, -4,1587683,2,1310721,2,3,26,4,1587683,2,1310721,2,2,26,1310721,40, -3,36,1632449,16,1632441,14,116,104,101,32,116,121,112,101,32,97, -114,101,97,32,105,115,32,102,117,108,108,0,1632397,1591079,12,8, -1587683,1587683,2,1310721,2,2,26,10,3,6,10,4,8,1310721,2,3, -26,2,1,1310721,2,2,1574703,12,8,1310721,2,3,26,2,1632515,14, -1,1310721,2,5,26,1310721,4,18,1310721,2,11,28,1310721,4,1310721,2, -1835009,40,1632563,16,1966081,1310721,4,1579223,12,1310721,2,7,26,4,1310721,2, -5,26,4,1310721,2,3,26,4,1310721,2,4,15,1310721,2,7,26, -2,26,1632315,12,1310721,2,9,26,4,1310721,2,9,26,2,1,26, -1310721,2,2,10,3,6,10,4,8,1310721,2,9,26,2,3,26, -1310721,2,3,26,2,10,3,6,10,4,8,1310721,2,9,26,2, -5,26,1310721,2,5,26,2,10,3,6,10,4,8,1587685,2,2049, -40,3,36,1632789,16,1632781,14,116,111,111,32,109,97,110,121,32, -116,121,112,101,115,0,1632751,1591079,12,8,1277953,1587685,2,26,1310721,2, -9,26,2,10,3,6,10,4,8,1587685,1,6,2,1,6,3, -26,5,6,4,10,8,8,1310721,2,9,26,2,1632863,14,1,1310721, -2,11,26,1310721,4,18,1310721,2,7,28,1310721,4,1310721,2,1835009,40, -1632911,16,1966081,1310721,4,1579223,12,1310721,2,4,1,1310721,2,3,26,4, -1310721,2,3,26,2,1587685,2,40,1633157,16,1310721,2,5,26,1277953,1310721, -2,3,26,2,26,2,10,3,6,10,4,8,1310721,2,5,26, -2,1,26,2,11,28,1,6,1,10,28,34,63,38,3,26, -1633099,16,1310721,2,5,26,2,9,26,2,1310721,2,2,28,1,6, -1,10,28,34,63,38,3,26,1,6,1,10,28,34,63,38, -1,10,28,1633101,14,1,1633119,16,1310721,2,5,26,2,1633237,14,1310721, -2,3,26,1,6,2,1,6,3,26,5,6,4,10,8,8, -1632929,14,1310721,2,5,26,11,3,1,1,1632529,12,10,3,6,10, -4,8,1310721,2,5,26,2,9,26,1310721,2,2,10,3,6,10, -4,8,1310721,2,5,26,2,1633237,14,1,1310721,2,7,26,1310721,4, -18,1310721,2,9,28,1310721,4,1310721,2,1835009,40,1633285,16,1966081,1310721,4, -1579223,12,1310721,2,3,26,4,1310721,2,4,1,1310721,2,5,26,4, -1310721,2,5,26,2,1587685,2,40,1633621,16,1310721,2,7,26,1277953,1310721, -2,5,26,2,26,2,10,3,6,10,4,8,1310721,2,7,26, -2,1,26,2,13,28,1,6,1,10,28,34,63,38,3,26, -1633483,16,1310721,2,7,26,2,9,26,2,1310721,2,2,28,1,6, -1,10,28,34,63,38,3,26,1,6,1,10,28,34,63,38, -1,10,28,1633485,14,1,1633563,16,1310721,2,7,26,2,7,26,2, -1310721,2,3,26,2,28,1,6,1,10,28,34,63,38,3,26, -1,6,1,10,28,34,63,38,1,10,28,1633565,14,1,1633583,16, -1310721,2,7,26,2,1633757,14,1310721,2,5,26,1,6,2,1,6, -3,26,5,6,4,10,8,8,1633313,14,1310721,2,7,26,13,1310721, -2,3,26,2,1310721,2,2,1637519,12,30,1,1,1632529,12,10,3, -6,10,4,8,1310721,2,7,26,2,9,26,1310721,2,2,10,3, -6,10,4,8,1310721,2,7,26,2,7,26,1310721,2,3,26,2, -10,3,6,10,4,8,1310721,2,7,26,2,1633757,14,1,1310721,2, -9,26,1310721,4,18,1310721,2,15,28,1310721,4,1310721,2,1835009,40,1633805, -16,1966081,1310721,4,1579223,12,1310721,2,7,26,4,1310721,2,5,26,4, -1310721,2,3,26,4,1310721,2,4,1,1310721,2,9,26,4,1310721,2, -9,26,2,1587685,2,40,1634479,16,1310721,2,13,26,1277953,1310721,2,9, -26,2,26,2,10,3,6,10,4,8,1310721,2,13,26,2,1, -26,2,15,28,1,6,1,10,28,34,63,38,3,26,1634023,16, -1310721,2,13,26,2,9,26,2,1310721,2,2,28,1,6,1,10, -28,34,63,38,3,26,1,6,1,10,28,34,63,38,1,10, -28,1634025,14,1,1634103,16,1310721,2,13,26,2,7,26,2,1310721,2, -3,26,2,28,1,6,1,10,28,34,63,38,3,26,1,6, -1,10,28,34,63,38,1,10,28,1634105,14,1,1634183,16,1310721,2, -13,26,2,11,26,2,1310721,2,7,26,2,28,1,6,1,10, -28,34,63,38,3,26,1,6,1,10,28,34,63,38,1,10, -28,1634185,14,1,1634441,16,1310721,2,11,26,1,10,3,6,10,4, -8,1310721,2,11,26,2,1310721,2,3,26,2,40,1634337,16,1310721,2, -13,26,2,15,1310721,2,11,26,2,26,26,2,1310721,2,5,26, -2,1310721,2,11,26,2,26,2,28,1,6,1,10,28,34,63, -38,3,26,1,6,1,10,28,34,63,38,1,10,28,1634339,14, -1,1634381,16,1310721,2,11,26,1,6,2,1,6,3,26,5,6, -4,10,8,8,1634211,14,1310721,2,11,26,2,1310721,2,3,26,2, -28,1,6,1,10,28,34,63,38,3,26,1634441,16,1310721,2,13, -26,2,1634679,14,1310721,2,9,26,1,6,2,1,6,3,26,5, -6,4,10,8,8,1633853,14,1310721,2,13,26,15,3,1,1310721,2, -3,26,2,1632529,12,10,3,6,10,4,8,1310721,2,13,26,2, -9,26,1310721,2,2,10,3,6,10,4,8,1310721,2,13,26,2, -7,26,1310721,2,3,26,2,10,3,6,10,4,8,1310721,2,13, -26,2,11,26,1310721,2,7,26,2,10,3,6,10,4,8,1310721, -2,13,26,2,15,26,1310721,2,5,26,2,1310721,2,3,26,2, -1574491,12,8,1310721,2,13,26,2,1634679,14,1,1310721,2,15,26,1310721, -4,18,1310721,2,9,28,1310721,4,1310721,2,1835009,40,1634727,16,1966081,1310721, -4,1579223,12,1310721,2,3,26,4,1310721,2,4,1,1310721,2,5,26, -4,1310721,2,5,26,2,1587685,2,40,1635063,16,1310721,2,7,26,1277953, -1310721,2,5,26,2,26,2,10,3,6,10,4,8,1310721,2,7, -26,2,1,26,2,23,28,1,6,1,10,28,34,63,38,3, -26,1634925,16,1310721,2,7,26,2,9,26,2,1310721,2,2,28,1, -6,1,10,28,34,63,38,3,26,1,6,1,10,28,34,63, -38,1,10,28,1634927,14,1,1635005,16,1310721,2,7,26,2,7,26, -2,1310721,2,3,26,2,28,1,6,1,10,28,34,63,38,3, -26,1,6,1,10,28,34,63,38,1,10,28,1635007,14,1,1635025, -16,1310721,2,7,26,2,1635179,14,1310721,2,5,26,1,6,2,1, -6,3,26,5,6,4,10,8,8,1634755,14,1310721,2,7,26,23, -3,1,1,1632529,12,10,3,6,10,4,8,1310721,2,7,26,2, -9,26,1310721,2,2,10,3,6,10,4,8,1310721,2,7,26,2, -7,26,1310721,2,3,26,2,10,3,6,10,4,8,1310721,2,7, -26,2,1635179,14,1,1310721,2,9,26,1310721,4,18,1310721,2,9,28, -1310721,4,1310721,2,1835009,40,1635227,16,1966081,1310721,4,1579223,12,1310721,2,3, -26,4,1310721,2,4,1,1310721,2,5,26,4,1310721,2,5,26,2, -1587685,2,40,1635483,16,1310721,2,7,26,1277953,1310721,2,5,26,2,26, -2,10,3,6,10,4,8,1310721,2,7,26,2,1,26,2,19, -28,1,6,1,10,28,34,63,38,3,26,1635425,16,1310721,2,7, -26,2,7,26,2,1310721,2,2,28,1,6,1,10,28,34,63, -38,3,26,1,6,1,10,28,34,63,38,1,10,28,1635427,14, -1,1635445,16,1310721,2,7,26,2,1635571,14,1310721,2,5,26,1,6, -2,1,6,3,26,5,6,4,10,8,8,1635255,14,1310721,2,7, -26,19,3,1310721,2,3,26,2,1,1632529,12,10,3,6,10,4, -8,1310721,2,7,26,2,7,26,1310721,2,2,10,3,6,10,4, -8,1310721,2,7,26,2,1635571,14,1,1310721,2,9,26,1310721,4,18, -1310721,2,15,28,1310721,4,1310721,2,1835009,40,1635619,16,1966081,1310721,4,1579223, -12,1310721,2,5,26,4,1310721,2,3,26,4,1310721,2,4,1,1310721, -2,7,26,4,1310721,2,7,26,2,1587685,2,40,1636159,16,1310721,2, -11,26,1277953,1310721,2,7,26,2,26,2,10,3,6,10,4,8, -1310721,2,11,26,2,1,26,2,17,28,1,6,1,10,28,34, -63,38,3,26,1635827,16,1310721,2,11,26,2,11,26,2,1310721,2, -2,28,1,6,1,10,28,34,63,38,3,26,1,6,1,10, -28,34,63,38,1,10,28,1635829,14,1,1636121,16,1310721,2,13,26, -1310721,2,11,26,2,13,26,2,10,3,6,10,4,8,1310721,2, -9,26,1,10,3,6,10,4,8,1310721,2,9,26,2,1310721,2, -5,26,2,40,1636017,16,1310721,2,13,26,2,3,1310721,2,9,26, -2,26,26,2,1310721,2,3,26,2,1310721,2,9,26,2,26,2, -28,1,6,1,10,28,34,63,38,3,26,1,6,1,10,28, -34,63,38,1,10,28,1636019,14,1,1636061,16,1310721,2,9,26,1, -6,2,1,6,3,26,5,6,4,10,8,8,1635891,14,1310721,2, -9,26,2,1310721,2,5,26,2,28,1,6,1,10,28,34,63, -38,3,26,1636121,16,1310721,2,11,26,2,1636433,14,1310721,2,7,26, -1,6,2,1,6,3,26,5,6,4,10,8,8,1635657,14,1310721, -2,13,26,1310721,2,5,26,2,3,26,1632315,12,10,3,6,10, -4,8,1310721,2,13,26,2,1,26,1310721,2,5,26,2,10,3, -6,10,4,8,1310721,2,13,26,2,3,26,1310721,2,3,26,2, -1310721,2,5,26,2,1574491,12,8,1310721,2,11,26,17,1,1310721,2, -2,5,26,2,1,1632529,12,10,3,6,10,4,8,1310721,2,11, -26,2,7,26,3,1,10,28,10,3,6,10,4,8,1310721,2, -11,26,2,11,26,1310721,2,2,10,3,6,10,4,8,1310721,2, -11,26,2,13,26,1310721,2,13,26,2,10,3,6,10,4,8, -1310721,2,11,26,2,1636433,14,1,1310721,2,15,26,1310721,4,18,1310721, -2,33,28,1310721,4,1310721,2,1835009,40,1636481,16,1966081,1310721,4,1579223,12, -1310721,2,4,1,1310721,2,13,26,4,1310721,2,2,1,26,2,17, -28,1,6,1,10,28,34,63,38,1,10,28,1636547,16,3,1636589, -14,1310721,2,2,7,26,2,1,40,3,36,1,6,1,10,28, -34,63,38,1,10,28,1636603,16,1310721,2,2,1637505,14,1310721,2,2, -7,26,2,5,1,10,28,28,1,6,1,10,28,34,63,38, -3,26,1636773,16,1636731,14,97,32,115,116,114,117,99,116,32,99, -97,110,39,116,32,99,111,110,116,97,105,110,32,105,116,115, -101,108,102,32,98,121,32,118,97,108,117,101,0,1636653,1591173,12, -8,1310721,2,2,7,26,1,10,3,6,10,4,8,1310721,2,2, -1637505,14,1310721,2,2,7,26,5,1,10,28,10,3,6,10,4, -8,1310721,2,3,26,1310721,2,2,11,26,2,10,3,6,10,4, -8,1310721,2,7,26,1310721,2,3,26,2,11,26,2,10,3,6, -10,4,8,1310721,2,5,26,1310721,2,3,26,2,9,26,2,10, -3,6,10,4,8,1310721,2,17,26,1,17,1574703,12,8,1310721,2, -17,26,1310721,2,2,13,26,2,3,26,1310721,2,2,13,26,2, -1,26,2,1574491,12,8,1310721,2,11,26,1310721,2,7,26,2,7, -30,3,26,1632315,12,10,3,6,10,4,8,1310721,2,9,26,1, -10,3,6,10,4,8,1310721,2,9,26,2,1310721,2,7,26,2, -40,1637397,16,1310721,2,15,26,1310721,2,5,26,2,1310721,2,9,26, -2,1310721,2,9,26,2,26,3,26,26,2,1310721,2,17,26,1637691, -12,10,3,6,10,4,8,1310721,2,11,26,2,1310721,2,9,26, -2,7,30,26,1310721,2,5,26,2,1310721,2,9,26,2,1310721,2, -9,26,2,26,26,2,10,3,6,10,4,8,1310721,2,11,26, -2,1310721,2,9,26,2,7,30,3,26,26,1310721,2,15,26,2, -10,3,6,10,4,8,1310721,2,11,26,2,1310721,2,9,26,2, -7,30,5,26,26,1310721,2,13,26,2,10,3,6,10,4,8, -1310721,2,13,26,1310721,2,13,26,2,1310721,2,15,26,2,1637519,12, -26,10,3,6,10,4,8,1310721,2,9,26,1,6,2,1,6, -3,26,5,6,4,10,8,8,1637037,14,1310721,2,2,9,26,1310721, -2,11,26,2,10,3,6,10,4,8,1310721,2,2,3,26,1310721, -2,13,26,2,10,3,6,10,4,8,1310721,2,2,7,26,1310721, -2,7,26,2,10,3,6,10,4,8,1310721,2,2,1637505,14,1, -1310721,2,33,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009, -40,1637553,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2,1,26, -2,17,28,1,6,1,10,28,34,63,38,3,26,1637641,16,1310721, -2,2,7,26,2,1,40,1,6,1,10,28,34,63,38,1, -10,28,1637643,14,1,1637659,16,1310721,2,2,1636447,12,8,1310721,2,2, -3,26,2,1637677,14,1,1310721,2,3,26,1310721,4,18,1310721,2,61, -28,1310721,4,1310721,2,1835009,40,1637725,16,1966081,1310721,4,1579223,12,1310721,2, -3,26,4,1310721,2,4,1310721,2,2,1,26,2,1310721,2,5,26, -4,1310721,2,5,26,2,19,28,1,6,1,10,28,34,63,38, -3,26,1637869,16,1310721,2,3,26,2,1310721,2,2,7,26,2,26, -2,1637861,16,1310721,2,3,26,2,1310721,2,2,7,26,2,26,2, -1638675,14,1587687,2,1638675,14,1310721,2,5,26,2,11,28,1,6,1, -10,28,34,63,38,3,26,1637941,16,1310721,2,2,9,26,2,1310721, -2,3,26,2,1637691,12,1632877,12,1638675,14,1310721,2,5,26,2,13, -28,1,6,1,10,28,34,63,38,3,26,1638025,16,1310721,2,2, -9,26,2,1310721,2,3,26,2,1637691,12,1310721,2,2,7,26,2, -1633251,12,1638675,14,1310721,2,5,26,2,15,28,1,6,1,10,28, -34,63,38,3,26,1638315,16,1310721,2,9,26,1310721,2,2,7,26, -2,10,3,6,10,4,8,1310721,2,7,26,1,10,3,6,10, -4,8,1310721,2,7,26,2,1310721,2,9,26,2,40,1638251,16,1310721, -2,11,26,1310721,2,7,26,2,26,1310721,2,2,15,1310721,2,7, -26,2,26,26,2,1310721,2,3,26,2,1637691,12,10,3,6,10, -4,8,1310721,2,7,26,1,6,2,1,6,3,26,5,6,4, -10,8,8,1638117,14,1310721,2,2,9,26,2,1310721,2,3,26,2, -1637691,12,1310721,2,9,26,2,1310721,2,11,26,1310721,2,2,11,26, -2,1633771,12,1638675,14,1310721,2,5,26,2,17,28,1,6,1,10, -28,34,63,38,3,26,1638391,16,1310721,2,2,11,26,2,1,6, -1,10,28,34,63,38,1,10,28,1638393,14,1,1638663,16,1310721,2, -59,26,1310721,2,2,13,26,2,10,3,6,10,4,8,1310721,2, -9,26,1310721,2,59,26,2,1,26,2,10,3,6,10,4,8, -1310721,2,7,26,1,10,3,6,10,4,8,1310721,2,7,26,2, -1310721,2,9,26,2,40,1638625,16,1310721,2,11,26,1310721,2,7,26, -2,26,1310721,2,59,26,2,3,1310721,2,7,26,2,26,26,2, -1310721,2,3,26,2,1637691,12,10,3,6,10,4,8,1310721,2,7, -26,1,6,2,1,6,3,26,5,6,4,10,8,8,1638487,14, -1310721,2,2,11,26,2,1310721,2,11,26,1310721,2,9,26,2,1635585, -12,1638675,14,1310721,2,2,1638675,14,1,1310721,2,61,26,1310721,4,18, -1310721,2,3,28,1310721,4,1310721,2,1835009,40,1638723,16,1966081,1310721,4,1579223, -12,1310721,2,4,1310721,2,2,1,26,2,3,28,1,6,1,10, -28,34,63,38,3,26,1638775,16,3,1638833,14,1310721,2,2,1,26, -2,5,28,1,6,1,10,28,34,63,38,3,26,1,6,1, -10,28,34,63,38,1,10,28,1638843,16,3,1638901,14,1310721,2,2, -1,26,2,7,28,1,6,1,10,28,34,63,38,3,26,1, -6,1,10,28,34,63,38,1,10,28,1638907,14,1,1310721,2,3, -26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1638955,16, -1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2,1,26,2,13,28, -1,6,1,10,28,34,63,38,3,26,1639007,16,3,1639065,14,1310721, -2,2,1,26,2,17,28,1,6,1,10,28,34,63,38,3, -26,1,6,1,10,28,34,63,38,1,10,28,1639071,14,1,1310721, -2,3,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40, -1639119,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2,1,26,2, -11,28,1,6,1,10,28,34,63,38,3,26,1639171,16,3,1639229, -14,1310721,2,2,1,26,2,13,28,1,6,1,10,28,34,63, -38,3,26,1,6,1,10,28,34,63,38,1,10,28,1639235,14, -1,1310721,2,3,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2, -1835009,40,1639283,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2,1, -26,2,13,28,1,6,1,10,28,34,63,38,3,26,1639349,16, -1310721,2,2,9,26,2,1632877,12,1639361,14,1310721,2,2,1639361,14,1, -1310721,2,3,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009, -40,1639409,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2,1,26, -2,11,28,1,6,1,10,28,34,63,38,3,26,1639461,16,3, -1639519,14,1310721,2,2,1,26,2,13,28,1,6,1,10,28,34, -63,38,3,26,1,6,1,10,28,34,63,38,1,10,28,1639539, -16,1310721,2,2,9,26,2,1639549,14,1587687,2,1639549,14,1,1310721,2, -3,26,1310721,4,18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1639597, -16,1966081,1310721,4,1579223,12,1310721,2,3,26,4,1310721,2,4,1310721,2, -2,1310721,2,3,26,2,28,1,6,1,10,28,34,63,38,3, -26,1639661,16,3,1639715,14,1310721,2,2,1587687,2,28,1,6,1,10, -28,34,63,38,3,26,1,6,1,10,28,34,63,38,1,10, -28,1639725,16,3,1639783,14,1310721,2,3,26,2,1587687,2,28,1,6, -1,10,28,34,63,38,3,26,1,6,1,10,28,34,63,38, -1,10,28,1639793,16,3,1640865,14,1310721,2,2,1638689,12,1639847,16,1310721, -2,3,26,2,1638689,12,1,6,1,10,28,34,63,38,1,10, -28,1639849,14,1,1639859,16,3,1640865,14,1310721,2,3,26,1310721,2,3, -26,2,1639249,12,10,3,6,10,4,8,1310721,2,2,1,26,2, -11,28,1,6,1,10,28,34,63,38,3,26,1639999,16,1310721,2, -3,26,2,1,26,2,11,28,1,6,1,10,28,34,63,38, -3,26,1,6,1,10,28,34,63,38,1,10,28,1640001,14,1, -1640325,16,1310721,2,2,9,26,2,1587687,2,28,1,6,1,10,28, -34,63,38,3,26,1640053,16,3,1640117,14,1310721,2,3,26,2,9, -26,2,1587687,2,28,1,6,1,10,28,34,63,38,3,26,1, -6,1,10,28,34,63,38,1,10,28,1640127,16,3,1640187,14,1310721, -2,2,9,26,2,1587695,2,28,1,6,1,10,28,34,63,38, -3,26,1,6,1,10,28,34,63,38,1,10,28,1640197,16,3, -1640261,14,1310721,2,3,26,2,9,26,2,1587695,2,28,1,6,1, -10,28,34,63,38,3,26,1,6,1,10,28,34,63,38,1, -10,28,1640271,16,3,1640865,14,1310721,2,2,9,26,2,1310721,2,3, -26,2,9,26,2,28,1,6,1,10,28,34,63,38,3,26, -1640865,14,1310721,2,2,1,26,2,11,28,1,6,1,10,28,34, -63,38,3,26,1640371,16,3,1640429,14,1310721,2,2,1,26,2,15, -28,1,6,1,10,28,34,63,38,3,26,1,6,1,10,28, -34,63,38,1,10,28,1640439,16,3,1640497,14,1310721,2,2,1,26, -2,23,28,1,6,1,10,28,34,63,38,3,26,1,6,1, -10,28,34,63,38,1,10,28,1640531,16,1587701,2,1,6,1,10, -28,34,63,38,1,10,28,1640533,14,1,1640543,16,3,1640865,14,1310721, -2,2,1,26,2,23,28,1,6,1,10,28,34,63,38,3, -26,1640649,16,1310721,2,3,26,2,1,26,2,23,28,1,6,1, -10,28,34,63,38,3,26,1,6,1,10,28,34,63,38,1, -10,28,1640651,14,1,1640731,16,1310721,2,2,9,26,2,1310721,2,3, -26,2,9,26,2,28,1,6,1,10,28,34,63,38,3,26, -1,6,1,10,28,34,63,38,1,10,28,1640733,14,1,1640821,16, -1310721,2,2,7,26,2,1640759,16,3,1640817,14,1310721,2,3,26,2, -7,26,2,1,6,1,10,28,34,63,38,3,26,1,6,1, -10,28,34,63,38,1,10,28,1640865,14,1310721,2,2,1310721,2,3, -26,2,28,1,6,1,10,28,34,63,38,3,26,1640865,14,1, -1310721,2,5,26,1310721,4,18,1310721,2,15,28,1310721,4,1310721,2,1835009, -40,1640913,16,1966081,1310721,4,1579223,12,1310721,2,5,26,4,1310721,2,3, -26,4,1310721,2,4,1310721,2,2,1,26,2,19,28,1,6,1, -10,28,34,63,38,3,26,1641151,16,1310721,2,7,26,1310721,2,2, -7,26,2,10,3,6,10,4,8,1310721,2,5,26,2,1310721,2, -7,26,2,26,2,1,6,1,10,28,34,63,38,3,26,1641109, -16,1310721,2,5,26,2,1310721,2,7,26,2,26,1310721,2,3,26, -2,10,3,6,10,4,8,3,1641955,14,1310721,2,5,26,2,1310721, -2,7,26,2,26,2,1310721,2,3,26,2,1639563,12,1641955,14,1310721, -2,3,26,1310721,2,3,26,2,1639249,12,10,3,6,10,4,8, -1310721,2,2,1,26,2,11,28,1,6,1,10,28,34,63,38, -3,26,1641291,16,1310721,2,3,26,2,1,26,2,11,28,1,6, -1,10,28,34,63,38,3,26,1,6,1,10,28,34,63,38, -1,10,28,1641293,14,1,1641395,16,1310721,2,3,26,2,9,26,2, -1587687,2,28,1,6,1,10,28,34,63,38,3,26,1641349,16,3, -1641955,14,1310721,2,2,9,26,2,1310721,2,3,26,2,9,26,2, -1310721,2,5,26,2,1640879,12,1641955,14,1310721,2,2,1,26,2,17, -28,1,6,1,10,28,34,63,38,3,26,1641473,16,1310721,2,2, -11,26,2,1,6,1,10,28,34,63,38,1,10,28,1641475,14, -1,1641545,16,1310721,2,3,26,2,1,26,2,17,28,1,6,1, -10,28,34,63,38,3,26,1,6,1,10,28,34,63,38,1, -10,28,1641547,14,1,1641627,16,1310721,2,3,26,2,11,26,2,1310721, -2,2,11,26,2,28,1,6,1,10,28,34,63,38,3,26, -1,6,1,10,28,34,63,38,1,10,28,1641629,14,1,1641929,16, -1310721,2,11,26,1310721,2,2,13,26,2,10,3,6,10,4,8, -1310721,2,13,26,1310721,2,3,26,2,13,26,2,10,3,6,10, -4,8,1310721,2,9,26,1310721,2,11,26,2,1,26,2,10,3, -6,10,4,8,1310721,2,7,26,1,10,3,6,10,4,8,1310721, -2,7,26,2,1310721,2,9,26,2,40,1641923,16,1310721,2,11,26, -2,3,1310721,2,7,26,2,26,26,2,1310721,2,13,26,2,3, -1310721,2,7,26,2,26,26,2,1310721,2,5,26,2,1640879,12,1, -6,1,10,28,34,63,38,3,26,1641885,16,1,1641955,14,1310721,2, -7,26,1,6,2,1,6,3,26,5,6,4,10,8,8,1641759, -14,3,1641955,14,1310721,2,2,1310721,2,3,26,2,1639563,12,1641955,14, -1,1310721,2,15,26,1310721,4,18,1310721,2,9,28,1310721,4,1310721,2, -1835009,40,1642003,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2,1, -26,2,1310721,2,3,26,4,1310721,2,3,26,2,11,28,1,6, -1,10,28,34,63,38,3,26,1642097,16,85,1573255,12,8,1310721,2, -2,9,26,2,1641969,12,1643211,14,1310721,2,3,26,2,23,28,1, -6,1,10,28,34,63,38,3,26,1642215,16,1310721,2,2,7,26, -2,1642177,16,1642169,14,102,105,120,101,100,32,0,1642155,1573495,12,8, -1642187,14,91,93,0,1642181,1573495,12,8,1310721,2,2,9,26,2,1641969, -12,1643211,14,1310721,2,3,26,2,13,28,1,6,1,10,28,34, -63,38,3,26,1642307,16,183,1573255,12,8,1310721,2,2,7,26,2, -1573657,12,8,187,1573255,12,8,1310721,2,2,9,26,2,1641969,12,1643211, -14,1310721,2,3,26,2,15,28,1,6,1,10,28,34,63,38, -3,26,1642861,16,1310721,2,2,9,26,2,1587687,2,28,1,6,1, -10,28,34,63,38,3,26,1642409,16,1642397,14,102,110,0,1642391,1573495, -12,8,1642427,14,1310721,2,2,9,26,2,1641969,12,8,1310721,2,2, -11,26,2,3,32,1642465,16,1642457,14,46,117,0,1642451,1573495,12,8, -81,1573255,12,8,1310721,2,5,26,1,10,3,6,10,4,8,1310721, -2,5,26,2,1310721,2,2,7,26,2,40,1642847,16,1310721,2,5, -26,2,1642555,16,1642547,14,44,32,0,1642541,1573495,12,8,1310721,2,2, -15,1310721,2,5,26,2,26,26,2,1641969,12,8,1310721,2,5,26, -2,25,40,1642673,16,1310721,2,2,1310721,2,5,26,2,1662085,12,3, -28,1,6,1,10,28,34,63,38,3,26,1,6,1,10,28, -34,63,38,1,10,28,1642675,14,1,1642697,16,1642689,14,46,109,0, -1642683,1573495,12,8,1310721,2,5,26,2,25,40,1642785,16,1310721,2,2, -1310721,2,5,26,2,1662085,12,5,28,1,6,1,10,28,34,63, -38,3,26,1,6,1,10,28,34,63,38,1,10,28,1642787,14, -1,1642809,16,1642801,14,46,100,0,1642795,1573495,12,8,1310721,2,5,26, -1,6,2,1,6,3,26,5,6,4,10,8,8,1642495,14,83, -1573255,12,8,1,1643211,14,1310721,2,2,5,26,2,1642899,16,1310721,2, -2,5,26,2,1573495,12,8,1642915,14,1642907,14,63,0,1642903,1573495,12, -8,1310721,2,3,26,2,17,28,1,6,1,10,28,34,63,38, -3,26,1642991,16,1310721,2,2,11,26,2,1,6,1,10,28,34, -63,38,1,10,28,1642993,14,1,1643203,16,1310721,2,7,26,1310721,2, -2,13,26,2,10,3,6,10,4,8,121,1573255,12,8,1310721,2, -5,26,1,10,3,6,10,4,8,1310721,2,5,26,2,1310721,2, -7,26,2,1,26,2,40,1643195,16,1310721,2,5,26,2,1643123,16, -1643115,14,44,32,0,1643109,1573495,12,8,1310721,2,7,26,2,3,1310721, -2,5,26,2,26,26,2,1641969,12,8,1310721,2,5,26,1,6, -2,1,6,3,26,5,6,4,10,8,8,1643059,14,125,1573255,12, -8,1,1643211,14,1,1310721,2,9,26,1310721,4,18,1310721,2,7,28, -1310721,4,1310721,2,1835009,40,1643259,16,1966081,1310721,4,1579223,12,1310721,2,5, -26,4,1310721,2,3,26,4,1310721,2,4,1587697,2,1,6,1,10, -28,34,63,38,3,26,1643319,16,3,1643365,14,1587569,2,1,6,1, -10,28,34,63,38,3,26,1,6,1,10,28,34,63,38,1, -10,28,1643375,16,3,1643401,14,1587703,2,1,6,1,10,28,34,63, -38,1,10,28,1643411,16,3,1643437,14,1590585,2,1,6,1,10,28, -34,63,38,1,10,28,1643447,16,1,1643611,14,1590587,12,8,1643483,14, -116,121,112,101,32,101,114,114,111,114,58,32,0,1643457,1573495,12, -8,1310721,2,2,1573495,12,8,1643531,14,58,32,101,120,112,101,99, -116,101,100,32,0,1643507,1573495,12,8,1310721,2,3,26,2,1641969,12, -8,1643573,14,44,32,103,111,116,32,0,1643559,1573495,12,8,1310721,2, -5,26,2,1641969,12,8,1590731,12,8,1,1643611,14,1,1310721,2,7, -26,1310721,4,18,1310721,2,7,28,1310721,4,1310721,2,1835009,40,1643659,16, -1966081,1310721,4,1579223,12,1310721,2,5,26,4,1310721,2,3,26,4,1310721, -2,4,1310721,2,2,1643701,16,3,1643747,14,1587697,2,1,6,1,10, -28,34,63,38,3,26,1,6,1,10,28,34,63,38,1,10, -28,1643757,16,3,1643803,14,1587569,2,1,6,1,10,28,34,63,38, -3,26,1,6,1,10,28,34,63,38,1,10,28,1643813,16,3, -1643839,14,1587703,2,1,6,1,10,28,34,63,38,1,10,28,1643849, -16,3,1643875,14,1590585,2,1,6,1,10,28,34,63,38,1,10, -28,1643885,16,1,1644001,14,1590587,12,8,1643921,14,116,121,112,101,32, -101,114,114,111,114,58,32,0,1643895,1573495,12,8,1310721,2,3,26, -2,1573495,12,8,1643963,14,44,32,103,111,116,32,0,1643949,1573495,12, -8,1310721,2,5,26,2,1641969,12,8,1590731,12,8,1,1644001,14,1, -1310721,2,7,26,1310721,4,18,1310721,2,5,28,1310721,4,1310721,2,1835009, -40,1644049,16,1966081,1310721,4,1579223,12,1310721,2,4,1587721,2,1310721,2,3, -26,4,1310721,2,3,26,2,1644183,16,1310721,2,3,26,1,6,2, -1,6,-1,26,5,6,4,10,8,8,1587705,1310721,2,3,26,2, -26,2,1310721,2,2,28,1,6,1,10,28,34,63,38,3,26, -1644179,16,1310721,2,3,26,2,1644197,14,1644069,14,3,1,10,28,1644197, -14,1,1310721,2,5,26,1310721,4,18,1310721,2,5,28,1310721,4,1310721, -2,1835009,40,1644245,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2, -1590545,2,28,1,6,1,10,28,34,63,38,3,26,1644293,16,3, -1644475,14,1310721,2,2,1644015,12,1,40,3,36,1644321,16,3,1644475,14, -1310721,2,2,1611615,12,1,40,3,36,1644349,16,1,1644475,14,1310721,2, -3,26,1310721,2,2,1593303,12,10,3,6,10,4,8,1310721,2,3, -26,2,1,40,3,36,1644467,16,1417729,1310721,2,3,26,2,26,2, -15,28,1,6,1,10,28,34,63,38,3,26,1,6,1,10, -28,34,63,38,1,10,28,1644469,14,1,1644475,14,1,1310721,2,5, -26,1310721,4,18,1310721,2,1,28,1310721,4,1310721,2,1835009,40,1644523,16, -1966081,1310721,4,1579223,12,1587733,2,1606425,12,1644559,16,1585291,1587731,2,10,3, -6,10,4,8,1,1644577,14,1587731,2,1606959,12,8,1,1644577,14,1, -1310721,2,1,26,1310721,4,18,1310721,2,53,28,1310721,4,1310721,2,1835009, -40,1644625,16,1966081,1310721,4,1579223,12,1645003,12,1310721,2,4,1587599,2,1606425, -12,1644977,16,1604999,12,8,1310721,2,3,26,1,10,3,6,10,4, -8,1587601,2,1606425,12,1,6,1,10,28,34,63,38,3,26,1644897, -16,3,1644897,16,1310721,2,3,26,2,49,40,3,36,1644787,16,1644779, -14,116,111,111,32,109,97,110,121,32,112,97,114,97,109,101, -116,101,114,115,0,1644739,1591079,12,8,1310721,2,5,26,1310721,2,3, -26,2,26,1644591,12,10,3,6,10,4,8,1310721,2,3,26,1, -6,2,1,6,3,26,5,6,4,10,8,8,1587611,2,1606729,12, -1,6,1,10,28,34,63,38,3,26,1644893,16,1644897,14,1644707,14, -1587601,2,1606959,12,8,1310721,2,1310721,2,2,1310721,2,3,26,2,1310721, -2,5,26,1310721,2,3,26,2,1310721,2,3,26,2,26,1633771,12, -10,3,6,10,4,8,1644635,14,1310721,2,2,1644989,14,1,1310721,2, -53,26,1310721,4,18,1310721,2,27,28,1310721,4,1310721,2,1835009,40,1645037, -16,1966081,1310721,4,1579223,12,1,1310721,2,23,26,4,1587623,2,1606729,12, -1645073,16,1645003,12,1632877,12,1646967,14,1587607,2,1606729,12,1645263,16,1587609,2, -1606729,12,1645111,16,1645003,12,1,1634693,12,1646967,14,1310721,2,1685483,12,10, -3,6,10,4,8,1587609,2,1606959,12,8,1310721,2,5,26,1645003,12, -10,3,6,10,4,8,1310721,2,2,1,40,1645239,16,1645231,14,97, -32,110,101,103,97,116,105,118,101,32,97,114,114,97,121,32, -108,101,110,103,116,104,0,1645183,1591173,12,8,1310721,2,5,26,2, -1310721,2,2,1633251,12,1646967,14,1590545,2,1606577,12,1645497,16,1604999,12,8, -1310721,2,5,26,1645003,12,10,3,6,10,4,8,1310721,2,5,26, -2,1,26,2,23,28,1,6,1,10,28,34,63,38,3,26, -1645375,16,1310721,2,5,26,2,9,26,2,3,1634693,12,1646967,14,1310721, -2,5,26,2,1,26,2,13,28,1,6,1,10,28,34,63, -38,1,10,28,1645483,16,1645475,14,111,110,108,121,32,97,114,114, -97,121,115,32,99,97,110,32,98,101,32,102,105,120,101,100, -0,1645425,1591173,12,8,1310721,2,5,26,2,1646967,14,1587639,2,1606577,12, -1645653,16,1604999,12,8,1587599,2,1606425,12,1,6,1,10,28,34,63, -38,3,26,1645645,16,1645637,14,102,110,32,97,115,32,97,32,116, -121,112,101,32,110,101,101,100,115,32,105,116,115,32,112,97, -114,97,109,101,116,101,114,115,58,32,102,110,40,105,110,116, -41,0,1645551,1591557,12,8,1587687,2,1646967,14,1585289,2,5,28,1,6, -1,10,28,34,63,38,1,10,28,1645739,16,1645723,14,101,120,112, -101,99,116,101,100,32,97,32,116,121,112,101,0,1645691,1591557,12, -8,1587687,2,1646967,14,1310721,2,1585291,2,10,3,6,10,4,8,1310721, -2,25,26,1310721,2,2,1644015,12,10,3,6,10,4,8,1310721,2, -25,26,2,1,40,3,36,1645841,16,1604999,12,8,1310721,2,25,26, -2,1310721,2,2,1635193,12,1646967,14,1310721,2,3,26,1310721,2,2,1593303, -12,10,3,6,10,4,8,1587723,2,1645993,16,1310721,2,3,26,2, -1,40,1645903,16,3,1645967,14,1417729,1310721,2,3,26,2,26,2,15, -28,1,6,1,10,28,34,63,38,1,10,28,1,6,1,10, -28,34,63,38,1,10,28,1,6,1,10,28,34,63,38,1, -10,28,1645995,14,1,1646033,16,1587721,2,17,40,1,6,1,10,28, -34,63,38,1,10,28,1646035,14,1,1646121,16,1587705,1587721,2,26,1310721, -2,2,10,3,6,10,4,8,1587721,1,6,2,1,6,3,26, -5,6,4,10,8,8,1604999,12,8,1587721,2,3,28,1310721,2,2, -1635193,12,1646967,14,1310721,2,3,26,2,1,40,1646145,16,3,1646209,14, -1417729,1310721,2,3,26,2,26,2,15,28,1,6,1,10,28,34, -63,38,1,10,28,1,6,1,10,28,34,63,38,1,10,28, -1646265,16,1310721,2,2,1646249,14,105,115,110,39,116,32,97,32,116, -121,112,101,0,1646223,1591691,12,8,1587687,2,1646967,14,1604999,12,8,1310721, -2,5,26,1425921,1310721,2,3,26,2,26,2,10,3,6,10,4, -8,1310721,2,5,26,2,1,26,2,21,28,1,6,1,10,28, -34,63,38,1,10,28,1646367,16,1310721,2,5,26,2,1646967,14,1587729, -2,1606959,12,8,3,1646789,16,1310721,2,23,26,2,17,40,3,36, -1646465,16,1646457,14,116,111,111,32,109,97,110,121,32,116,121,112, -101,32,97,114,103,117,109,101,110,116,115,0,1646409,1591557,12,8, -1310721,2,7,26,1310721,2,23,26,2,26,1644591,12,10,3,6,10, -4,8,1310721,2,7,26,1310721,2,23,26,2,26,2,1637519,12,3, -28,1,6,1,10,28,34,63,38,1,10,28,1646715,16,1646707,14, -116,121,112,101,32,97,114,103,117,109,101,110,116,115,32,104, -97,118,101,32,116,111,32,98,101,32,111,110,101,32,119,111, -114,100,32,40,97,32,112,111,105,110,116,101,114,44,32,97, -32,110,117,109,98,101,114,44,32,111,114,32,97,32,112,97, -114,97,109,101,116,101,114,41,0,1646561,1591173,12,8,1310721,2,23, -26,1,6,2,1,6,3,26,5,6,4,10,8,8,1587611,2, -1606729,12,1,6,1,10,28,34,63,38,3,26,1646785,16,1646789,14, -1646377,14,1644489,12,8,1310721,2,23,26,2,1310721,2,5,26,2,7, -26,2,28,1,6,1,10,28,34,63,38,1,10,28,1646929,16, -1310721,2,2,1646921,14,119,114,111,110,103,32,110,117,109,98,101, -114,32,111,102,32,116,121,112,101,32,97,114,103,117,109,101, -110,116,115,0,1646859,1591343,12,8,1310721,2,5,26,2,1310721,2,7, -26,1310721,2,23,26,2,1635585,12,1646967,14,1,1310721,2,27,26,1310721, -4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1647015,16,1966081,1310721, -4,1579223,12,1585289,2,9,28,1,6,1,10,28,34,63,38,3, -26,1647653,16,1585291,2,1587607,2,28,1,6,1,10,28,34,63,38, -3,26,1647087,16,3,1647139,14,1585291,2,1587637,2,28,1,6,1,10, -28,34,63,38,3,26,1,6,1,10,28,34,63,38,1,10, -28,1647149,16,3,1647769,14,1585291,2,1587623,2,28,1,6,1,10,28, -34,63,38,3,26,1647647,16,1310721,2,1,10,3,6,10,4,8, -1310721,2,2,7,40,1647379,16,1310721,2,2,1605397,12,8,1587511,2,9, -28,1,6,1,10,28,34,63,38,3,26,1647315,16,1587513,2,1587623, -2,28,1,6,1,10,28,34,63,38,3,26,1,6,1,10, -28,34,63,38,1,10,28,1647317,14,1,1,6,1,10,28,34, -63,38,3,26,1647345,16,1647379,14,1310721,2,1,6,2,1,6,3, -26,5,6,4,10,8,8,1647201,14,1310721,2,2,1605397,12,8,1587511, -2,5,28,1,6,1,10,28,34,63,38,3,26,1647519,16,1587513, -2,1644211,12,1647441,16,3,1647493,14,1587513,2,1587639,2,28,1,6,1, -10,28,34,63,38,3,26,1,6,1,10,28,34,63,38,1, -10,28,1,6,1,10,28,34,63,38,1,10,28,1647521,14,1, -1647531,16,3,1647643,14,1587511,2,9,28,1,6,1,10,28,34,63, -38,3,26,1647619,16,1587513,2,1587607,2,28,1,6,1,10,28,34, -63,38,3,26,1,6,1,10,28,34,63,38,1,10,28,1647621, -14,1,1,6,1,10,28,34,63,38,1,10,28,1647769,14,1, -1647769,14,1585289,2,5,28,1,6,1,10,28,34,63,38,1,10, -28,1647693,16,1,1647769,14,1585291,2,1587639,2,28,1,6,1,10,28, -34,63,38,3,26,1647733,16,3,1647763,14,1585291,2,1644211,12,1,6, -1,10,28,34,63,38,1,10,28,1647769,14,1,1310721,2,3,26, -1310721,4,18,1310721,2,1,28,1310721,4,1310721,2,1835009,40,1647817,16,1966081, -1310721,4,1579223,12,1587725,1,10,3,6,10,4,8,1587727,1,10,3, -6,10,4,8,1587637,2,1606425,12,1,6,1,10,28,34,63,38, -3,26,1647899,16,1587725,1644591,12,10,3,6,10,4,8,1587637,2,1606729, -12,1648135,16,1585291,2,1587653,2,28,1,6,1,10,28,34,63,38, -3,26,1647965,16,1587727,3,10,3,6,10,4,8,1648129,14,1585291,2, -1587657,2,28,1,6,1,10,28,34,63,38,3,26,1648019,16,1587727, -5,10,3,6,10,4,8,1648129,14,1585291,2,1587655,2,28,1,6, -1,10,28,34,63,38,3,26,1648073,16,1587727,7,10,3,6,10, -4,8,1648129,14,1648121,14,97,32,116,97,103,32,105,115,32,46, -117,44,32,46,109,32,111,114,32,46,100,0,1648077,1591557,12,8, -1604999,12,8,1,1648143,14,1,1310721,2,1,26,1310721,4,18,1310721,2, -21,28,1310721,4,1310721,2,1835009,40,1648191,16,1966081,1310721,4,1579223,12,1, -1310721,2,7,26,4,1524225,1310721,2,9,26,4,1,1310721,2,15,26, -4,1,1310721,2,17,26,4,1604999,12,8,1310721,2,1607249,12,10,3, -6,10,4,8,1587729,2,1606425,12,1648659,16,1604999,12,8,1587721,1,10, -3,6,10,4,8,3,1648475,16,1587721,2,17,40,3,36,1648383,16, -1648375,14,116,111,111,32,109,97,110,121,32,116,121,112,101,32, -112,97,114,97,109,101,116,101,114,115,0,1648325,1591557,12,8,1587705, -1587721,2,26,1607249,12,10,3,6,10,4,8,1587721,1,6,2,1, -6,3,26,5,6,4,10,8,8,1587611,2,1606729,12,1,6,1, -10,28,34,63,38,3,26,1648471,16,1648475,14,1648299,14,1644489,12,8, -1310721,2,17,26,3,10,3,6,10,4,8,1310721,2,3,26,21, -1,1310721,2,2,1,1632529,12,10,3,6,10,4,8,1310721,2,3, -26,2,7,26,1587721,2,10,3,6,10,4,8,1310721,2,13,26, -1587721,2,1632315,12,10,3,6,10,4,8,1310721,2,13,26,2,1587705, -1587721,2,1574491,12,8,1310721,2,3,26,2,13,26,1310721,2,13,26, -2,10,3,6,10,4,8,1648729,14,1310721,2,3,26,17,1,1310721, -2,2,1,1632529,12,10,3,6,10,4,8,1310721,2,3,26,2, -7,26,5,1,10,28,10,3,6,10,4,8,1310721,2,5,26, -1310721,2,2,15,1310721,2,3,26,2,1592805,12,10,3,6,10,4, -8,1587603,2,1606959,12,8,1587605,2,1606425,12,1,6,1,10,28,34, -63,38,3,26,1649107,16,1310721,2,19,26,1644591,12,10,3,6,10, -4,8,3,1649093,16,1310721,2,7,26,2,2001,40,3,36,1648909,16, -1648901,14,116,111,111,32,109,97,110,121,32,102,105,101,108,100, -115,0,1648869,1591079,12,8,1310721,2,9,26,2,1310721,2,7,26,2, -1310721,2,7,26,2,26,26,1607249,12,10,3,6,10,4,8,1310721, -2,9,26,2,1310721,2,7,26,2,1310721,2,7,26,2,26,3, -26,26,1310721,2,19,26,2,10,3,6,10,4,8,1310721,2,7, -26,1,6,2,1,6,3,26,5,6,4,10,8,8,1587611,2, -1606729,12,1,6,1,10,28,34,63,38,3,26,1649089,16,1649093,14, -1648837,14,1587613,2,1606959,12,8,1648781,14,1604999,12,8,1310721,2,17,26, -2,1649313,16,1310721,2,13,26,1310721,2,7,26,2,1310721,2,7,26, -2,26,1632315,12,10,3,6,10,4,8,1310721,2,13,26,2,1310721, -2,9,26,2,1310721,2,7,26,2,1310721,2,7,26,2,26,1574491, -12,8,1310721,2,3,26,2,9,26,1310721,2,13,26,2,10,3, -6,10,4,8,1310721,2,3,26,2,11,26,1310721,2,7,26,2, -10,3,6,10,4,8,1587721,1,10,3,6,10,4,8,1650023,14, -1310721,2,13,26,1310721,2,7,26,2,7,30,3,26,1632315,12,10, -3,6,10,4,8,1310721,2,11,26,1,10,3,6,10,4,8, -1310721,2,11,26,2,1310721,2,7,26,2,40,1649915,16,1310721,2,19, -26,1310721,2,9,26,2,1310721,2,11,26,2,1310721,2,11,26,2, -26,3,26,26,2,10,3,6,10,4,8,1310721,2,19,26,2, -1310721,2,3,26,2,28,1,6,1,10,28,34,63,38,3,26, -1649653,16,1649621,14,97,32,115,116,114,117,99,116,32,99,97,110, -39,116,32,99,111,110,116,97,105,110,32,105,116,115,101,108, -102,32,98,121,32,118,97,108,117,101,59,32,117,115,101,32, -97,32,112,111,105,110,116,101,114,0,1649513,1591173,12,8,1310721,2, -19,26,1587687,2,10,3,6,10,4,8,1310721,2,13,26,2,1310721, -2,11,26,2,7,30,26,1310721,2,9,26,2,1310721,2,11,26, -2,1310721,2,11,26,2,26,26,2,10,3,6,10,4,8,1310721, -2,13,26,2,1310721,2,11,26,2,7,30,3,26,26,1310721,2, -19,26,2,10,3,6,10,4,8,1310721,2,13,26,2,1310721,2, -11,26,2,7,30,5,26,26,1310721,2,15,26,2,10,3,6, -10,4,8,1310721,2,15,26,1310721,2,15,26,2,1310721,2,19,26, -2,1637519,12,26,10,3,6,10,4,8,1310721,2,11,26,1,6, -2,1,6,3,26,5,6,4,10,8,8,1649377,14,1310721,2,3, -26,2,9,26,1310721,2,13,26,2,10,3,6,10,4,8,1310721, -2,3,26,2,3,26,1310721,2,15,26,2,10,3,6,10,4, -8,1310721,2,3,26,2,7,26,1310721,2,7,26,2,10,3,6, -10,4,8,1587613,2,1606729,12,8,1310721,2,5,26,2,1650049,14,1, -1310721,2,21,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009, -40,1650097,16,1966081,1310721,4,1579223,12,1604999,12,8,1310721,2,1607249,12,10, -3,6,10,4,8,1587615,2,1606959,12,8,1310721,2,2,15,1644591,12, -1592805,12,8,1587613,2,1606959,12,8,1,1650169,14,1,1310721,2,3,26, -1310721,4,18,1310721,2,1,28,1310721,4,1310721,2,1835009,40,1650217,16,1966081, -1310721,4,1579223,12,1604999,12,8,1587751,2,1606577,12,1650255,16,1587697,3,10, -3,6,10,4,8,1650359,14,1587753,2,1606577,12,1650287,16,1587697,1,10, -3,6,10,4,8,1650359,14,1650351,14,116,121,112,101,99,104,101, -99,107,32,111,110,32,111,114,32,116,121,112,101,99,104,101, -99,107,32,111,102,102,0,1650291,1591557,12,8,1604999,12,8,1587613,2, -1606959,12,8,1,1650383,14,1,1310721,2,1,26,1310721,4,18,1310721,2, -7,28,1310721,4,1310721,2,1835009,40,1650431,16,1966081,1310721,4,1579223,12,1310721, -2,3,26,4,1310721,2,4,1,1310721,2,5,26,4,1310721,2,2, -1636447,12,8,1310721,2,5,26,2,1310721,2,2,7,26,2,40,1650617, -16,1310721,2,2,9,26,2,1310721,2,5,26,2,7,30,26,2, -1310721,2,3,26,2,28,1,6,1,10,28,34,63,38,3,26, -1650579,16,1310721,2,5,26,2,1650631,14,1310721,2,5,26,1,6,2, -1,6,3,26,5,6,4,10,8,8,1650471,14,3,1,10,28, -1650631,14,1,1310721,2,7,26,1310721,4,18,1310721,2,7,28,1310721,4, -1310721,2,1835009,40,1650679,16,1966081,1310721,4,1579223,12,1587599,2,1606959,12,8, -1646981,12,1650751,16,1587637,2,1606425,12,1,6,1,10,28,34,63,38, -3,26,1,6,1,10,28,34,63,38,1,10,28,1650753,14,1, -1650781,16,1310721,2,1644591,12,10,3,6,10,4,8,1650943,14,1310721,2, -3,26,1615017,12,10,3,6,10,4,8,1587703,1,6,2,1,6, -3,26,5,6,4,10,8,8,1310721,2,5,26,1681059,12,10,3, -6,10,4,8,1663385,12,8,1310721,2,1587699,2,10,3,6,10,4, -8,1587703,1,6,2,1,6,-1,26,5,6,4,10,8,8,1310721, -2,3,26,2,1615649,12,8,1310721,2,3,26,2,1615567,12,8,1587601, -2,1606959,12,8,1310721,2,2,1650965,14,1,1310721,2,7,26,1310721,4, -18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1651013,16,1966081,1310721,4, -1579223,12,1587599,2,1606959,12,8,1310721,2,1681059,12,10,3,6,10,4, -8,1590511,3,1,10,28,10,3,6,10,4,8,1587769,2,1651103,16, -1587587,2,1,6,1,10,28,34,63,38,1,10,28,1651105,14,1, -1651163,16,1587589,2,3,28,1,6,1,10,28,34,63,38,3,26, -1,6,1,10,28,34,63,38,1,10,28,1651165,14,1,1651205,16, -1589487,1587591,2,26,2,1,6,1,10,28,34,63,38,1,10,28, -1651207,14,1,1651229,16,1590511,1587591,2,10,3,6,10,4,8,1663385,12, -8,1310721,2,2,1613033,12,8,1587699,2,1651257,14,1,1310721,2,3,26, -1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1651305,16,1966081, -1310721,4,1579223,12,1310721,2,4,1310721,2,2,1,26,2,23,28,1, -6,1,10,28,34,63,38,3,26,1651389,16,1310721,2,2,7,26, -2,1,6,1,10,28,34,63,38,1,10,28,1651391,14,1,1651477, -16,1651469,14,97,32,102,105,120,101,100,32,97,114,114,97,121, -32,99,97,110,39,116,32,103,114,111,119,32,111,114,32,115, -104,114,105,110,107,0,1651399,1591173,12,8,1,1651485,14,1,1310721,2, -3,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1651533, -16,1966081,1310721,4,1579223,12,1604999,12,8,1310721,2,1650979,12,10,3,6, -10,4,8,1587601,2,1606959,12,8,1310721,2,2,1,26,2,13,28, -1,6,1,10,28,34,63,38,3,26,1651639,16,9,1594729,12,8, -1310721,2,2,7,26,2,1594643,12,8,1651949,14,1310721,2,2,1,26, -2,23,28,1,6,1,10,28,34,63,38,3,26,1651685,16,3, -1651739,14,1310721,2,2,1587687,2,28,1,6,1,10,28,34,63,38, -3,26,1,6,1,10,28,34,63,38,1,10,28,1651781,14,108, -101,110,32,110,101,101,100,115,32,97,110,32,97,114,114,97, -121,0,1651743,1310721,2,2,1643625,12,8,1590511,2,1,40,3,36,1651851, -16,9,1594729,12,8,1589487,1590511,2,26,2,3,26,1595671,12,8,3, -1594729,12,8,1651949,14,1587769,2,1651921,16,1310721,2,2,1,26,2,23, -28,1,6,1,10,28,34,63,38,3,26,1,6,1,10,28, -34,63,38,1,10,28,1651923,14,1,1651939,16,3,1594729,12,8,1651949, -14,1590547,2,1595409,12,8,1587699,1587689,2,10,3,6,10,4,8,1, -1651975,14,1,1310721,2,3,26,1310721,4,18,1310721,2,3,28,1310721,4, -1310721,2,1835009,40,1652023,16,1966081,1310721,4,1579223,12,1604999,12,8,1310721,2, -1650979,12,10,3,6,10,4,8,1587601,2,1606959,12,8,1310721,2,2, -1,26,2,23,28,1,6,1,10,28,34,63,38,3,26,1652105, -16,3,1652159,14,1310721,2,2,1587687,2,28,1,6,1,10,28,34, -63,38,3,26,1,6,1,10,28,34,63,38,1,10,28,1652195, -14,99,97,112,32,110,101,101,100,115,32,97,32,91,93,84, -0,1652163,1310721,2,2,1643625,12,8,1590549,2,1595409,12,8,1587699,1587689,2, -10,3,6,10,4,8,1,1652245,14,1,1310721,2,3,26,1310721,4, -18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1652293,16,1966081,1310721,4, -1579223,12,1604999,12,8,1310721,2,1650979,12,10,3,6,10,4,8,1310721, -2,2,1651271,12,8,1310721,2,2,1,26,2,23,28,1,6,1, -10,28,34,63,38,3,26,1652439,16,1310721,2,2,9,26,2,1637519, -12,3,28,1,6,1,10,28,34,63,38,1,10,28,1,6, -1,10,28,34,63,38,1,10,28,1652441,14,1,1652563,16,1652555,14, -112,117,115,104,32,116,97,107,101,115,32,111,110,101,45,119, -111,114,100,32,101,108,101,109,101,110,116,115,59,32,117,115, -101,32,114,101,115,105,122,101,32,102,111,114,32,115,116,114, -117,99,116,115,0,1652449,1591173,12,8,1587611,2,1606959,12,8,1310721,2, -3,26,1681059,12,10,3,6,10,4,8,1663385,12,8,1310721,2,3, -26,2,5,1625017,12,8,1310721,2,2,1,26,2,23,28,1,6, -1,10,28,34,63,38,3,26,1652727,16,1310721,2,2,9,26,2, -1587699,2,1639563,12,1,6,1,10,28,34,63,38,3,26,1,6, -1,10,28,34,63,38,1,10,28,1652729,14,1,1652771,16,1652747,14, -112,117,115,104,0,1652737,1310721,2,2,9,26,2,1587699,2,1643225,12, -8,1587769,2,1652841,16,1310721,2,2,1,26,2,23,28,1,6,1, -10,28,34,63,38,3,26,1,6,1,10,28,34,63,38,1, -10,28,1652843,14,1,1652889,16,1310721,2,2,9,26,2,1658673,12,1, -6,1,10,28,34,63,38,1,10,28,1652891,14,1,1652923,16,1310721, -2,2,9,26,2,1594643,12,8,1590517,2,1595409,12,8,1587601,2,1606959, -12,8,1590555,2,1595409,12,8,1587699,1587689,2,10,3,6,10,4,8, -1,1652969,14,1,1310721,2,5,26,1310721,4,18,1310721,2,3,28,1310721, -4,1310721,2,1835009,40,1653017,16,1966081,1310721,4,1579223,12,1604999,12,8,1310721, -2,1650979,12,10,3,6,10,4,8,1310721,2,2,1651271,12,8,1587601, -2,1606959,12,8,1590557,2,1595409,12,8,1587699,1310721,2,2,1639375,12,10, -3,6,10,4,8,1310721,2,2,1,26,2,23,28,1,6,1, -10,28,34,63,38,3,26,1653165,16,1587699,1310721,2,2,9,26,2, -10,3,6,10,4,8,1,1653173,14,1,1310721,2,3,26,1310721,4, -18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1653221,16,1966081,1310721,4, -1579223,12,1604999,12,8,1310721,2,1650979,12,10,3,6,10,4,8,1310721, -2,2,1651271,12,8,1587611,2,1606959,12,8,1310721,2,3,26,1681059,12, -10,3,6,10,4,8,1663385,12,8,1310721,2,3,26,2,1613033,12, -8,1587601,2,1606959,12,8,1590559,2,1595409,12,8,1587699,1587689,2,10,3, -6,10,4,8,1,1653361,14,1,1310721,2,5,26,1310721,4,18,1310721, -2,3,28,1310721,4,1310721,2,1835009,40,1653409,16,1966081,1310721,4,1579223,12, -1604999,12,8,1310721,2,1650645,12,10,3,6,10,4,8,1310721,2,2, -1637519,12,1594643,12,8,1587699,1587689,2,10,3,6,10,4,8,1,1653477, -14,1,1310721,2,3,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721, -2,1835009,40,1653525,16,1966081,1310721,4,1579223,12,1604999,12,8,1310721,2,1650645, -12,10,3,6,10,4,8,1310721,2,2,1594643,12,8,1587699,1587687,2, -10,3,6,10,4,8,1,1653589,14,1,1310721,2,3,26,1310721,4, -18,1310721,2,1,28,1310721,4,1310721,2,1835009,40,1653637,16,1966081,1310721,4, -1579223,12,1587683,1277953,2049,26,10,3,6,10,4,8,1587685,1,10,3, -6,10,4,8,1587687,1,3,1653693,14,119,111,114,100,0,1653683,1592287, -12,1,1632529,12,10,3,6,10,4,8,1587689,3,3,1653735,14,105, -110,116,0,1653727,1592287,12,1,1632529,12,10,3,6,10,4,8,1587691, -5,3,1653779,14,99,104,97,114,0,1653769,1592287,12,1,1632529,12,10, -3,6,10,4,8,1587693,7,3,1653823,14,98,111,111,108,0,1653813, -1592287,12,1,1632529,12,10,3,6,10,4,8,1587695,9,1,1653867,14, -118,111,105,100,0,1653857,1592287,12,1,1632529,12,10,3,6,10,4, -8,1587687,2,5,26,2,15,1587687,2,1592805,12,8,1587689,2,5,26, -2,15,1587689,2,1592805,12,8,1587691,2,5,26,2,15,1587691,2,1592805, -12,8,1587693,2,5,26,2,15,1587693,2,1592805,12,8,1587695,2,5, -26,2,15,1587695,2,1592805,12,8,1587729,1654011,14,60,0,1654007,1592287,12, -10,3,6,10,4,8,1587731,1654039,14,62,0,1654035,1592287,12,10,3, -6,10,4,8,1587733,1654069,14,62,62,0,1654063,1592287,12,10,3,6, -10,4,8,1587735,1654099,14,60,61,0,1654093,1592287,12,10,3,6,10, -4,8,1587737,1654129,14,62,61,0,1654123,1592287,12,10,3,6,10,4, -8,1587739,1654159,14,61,61,0,1654153,1592287,12,10,3,6,10,4,8, -1587741,1654189,14,33,61,0,1654183,1592287,12,10,3,6,10,4,8,1587743, -1654217,14,43,0,1654213,1592287,12,10,3,6,10,4,8,1587745,1654255,14, -115,116,114,117,99,116,0,1654241,1592287,12,10,3,6,10,4,8, -1587747,1654289,14,116,121,112,101,0,1654279,1592287,12,10,3,6,10,4, -8,1587749,1654333,14,116,121,112,101,99,104,101,99,107,0,1654313,1592287, -12,10,3,6,10,4,8,1587751,1654363,14,111,110,0,1654357,1592287,12, -10,3,6,10,4,8,1587753,1654395,14,111,102,102,0,1654387,1592287,12, -10,3,6,10,4,8,1587755,1654427,14,110,101,119,0,1654419,1592287,12, -10,3,6,10,4,8,1587757,1654463,14,110,101,119,95,116,0,1654451, -1592287,12,10,3,6,10,4,8,1590513,1654501,14,35,105,116,101,109, -115,0,1654487,1592287,12,10,3,6,10,4,8,1590515,1654535,14,35,108, -101,110,0,1654525,1592287,12,10,3,6,10,4,8,1590517,1654573,14,102, -97,116,116,101,110,0,1654559,1592287,12,10,3,6,10,4,8,1587759, -1654603,14,111,51,0,1654597,1592287,12,10,3,6,10,4,8,1587761,1654635, -14,108,102,97,0,1654627,1592287,12,10,3,6,10,4,8,1587763,1654675, -14,111,117,116,115,105,100,101,0,1654659,1592287,12,10,3,6,10, -4,8,1587765,1654715,14,110,101,119,95,114,97,119,0,1654699,1592287,12, -10,3,6,10,4,8,1587767,1654747,14,111,111,98,0,1654739,1592287,12, -10,3,6,10,4,8,1590545,1654783,14,102,105,120,101,100,0,1654771, -1592287,12,10,3,6,10,4,8,1590547,1654817,14,100,108,101,110,0, -1654807,1592287,12,10,3,6,10,4,8,1590549,1654851,14,100,99,97,112, -0,1654841,1592287,12,10,3,6,10,4,8,1590551,1654885,14,100,110,101, -119,0,1654875,1592287,12,10,3,6,10,4,8,1590553,1654917,14,100,97, -116,0,1654909,1592287,12,10,3,6,10,4,8,1590555,1654953,14,100,112, -117,115,104,0,1654941,1592287,12,10,3,6,10,4,8,1590557,1654987,14, -100,112,111,112,0,1654977,1592287,12,10,3,6,10,4,8,1590559,1655027, -14,100,114,101,115,105,122,101,0,1655011,1592287,12,10,3,6,10, -4,8,1590519,1,26,1655059,14,42,0,1655055,1592287,12,10,3,6,10, -4,8,1590519,3,26,1655091,14,47,0,1655087,1592287,12,10,3,6,10, -4,8,1590519,5,26,1655123,14,37,0,1655119,1592287,12,10,3,6,10, -4,8,1590519,7,26,1655155,14,38,0,1655151,1592287,12,10,3,6,10, -4,8,1590519,9,26,1655187,14,124,0,1655183,1592287,12,10,3,6,10, -4,8,1590519,11,26,1655219,14,94,0,1655215,1592287,12,10,3,6,10, -4,8,1590519,13,26,1655253,14,60,60,0,1655247,1592287,12,10,3,6, -10,4,8,1590519,15,26,1587733,2,10,3,6,10,4,8,1590543,17, -10,3,6,10,4,8,1,1655317,14,1,1310721,2,1,26,1310721,4, -18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1655365,16,1966081,1310721,4, -1579223,12,1310721,2,4,1,1310721,2,3,26,4,1310721,2,3,26,2, -1590543,2,40,1655495,16,1590519,1310721,2,3,26,2,26,2,1310721,2,2, -28,1,6,1,10,28,34,63,38,3,26,1655457,16,3,1655503,14, -1310721,2,3,26,1,6,2,1,6,3,26,5,6,4,10,8, -8,1655383,14,1,1655503,14,1,1310721,2,5,26,1310721,4,18,1310721,2, -9,28,1310721,4,1310721,2,1835009,40,1655551,16,1966081,1310721,4,1579223,12,1310721, -2,5,26,4,1310721,2,3,26,4,1310721,2,4,1546753,1310721,2,2, -26,2,1310721,2,7,26,4,1310721,2,3,26,1310721,2,3,26,2, -1639249,12,10,3,6,10,4,8,1310721,2,5,26,1310721,2,5,26, -2,1639249,12,10,3,6,10,4,8,1547137,1310721,2,2,26,2,1, -40,1655863,16,1310721,2,3,26,2,1638921,12,1,6,1,10,28,34, -63,38,3,26,1655785,16,1310721,2,5,26,2,1638921,12,1,6,1, -10,28,34,63,38,3,26,1,6,1,10,28,34,63,38,1, -10,28,1655787,14,1,1655837,14,38,38,32,97,110,100,32,124,124, -32,110,101,101,100,32,115,99,97,108,97,114,115,0,1655791,1310721, -2,3,26,2,1643625,12,8,1587693,2,1658289,14,1310721,2,7,26,2, -1587739,2,28,1,6,1,10,28,34,63,38,3,26,1655909,16,3, -1655967,14,1310721,2,7,26,2,1587741,2,28,1,6,1,10,28,34, -63,38,3,26,1,6,1,10,28,34,63,38,1,10,28,1656157, -16,1310721,2,3,26,2,1310721,2,5,26,2,1639563,12,1,6,1, -10,28,34,63,38,3,26,1656089,16,1310721,2,5,26,2,1310721,2, -3,26,2,1639563,12,1,6,1,10,28,34,63,38,3,26,1, -6,1,10,28,34,63,38,1,10,28,1656091,14,1,1656149,16,1656121, -14,99,111,109,112,97,114,105,115,111,110,0,1656099,1310721,2,3, -26,2,1310721,2,5,26,2,1643225,12,8,1587693,2,1658289,14,1310721,2, -7,26,2,1587729,2,28,1,6,1,10,28,34,63,38,3,26, -1656203,16,3,1656261,14,1310721,2,7,26,2,1587731,2,28,1,6,1, -10,28,34,63,38,3,26,1,6,1,10,28,34,63,38,1, -10,28,1656271,16,3,1656329,14,1310721,2,7,26,2,1587735,2,28,1, -6,1,10,28,34,63,38,3,26,1,6,1,10,28,34,63, -38,1,10,28,1656339,16,3,1656397,14,1310721,2,7,26,2,1587737,2, -28,1,6,1,10,28,34,63,38,3,26,1,6,1,10,28, -34,63,38,1,10,28,1656827,16,1310721,2,3,26,2,1587687,2,28, -1,6,1,10,28,34,63,38,3,26,1656447,16,3,1656505,14,1310721, -2,5,26,2,1587687,2,28,1,6,1,10,28,34,63,38,3, -26,1,6,1,10,28,34,63,38,1,10,28,1656515,16,3,1656597, -14,1310721,2,3,26,2,1638689,12,1656573,16,1310721,2,5,26,2,1638689, -12,1,6,1,10,28,34,63,38,1,10,28,1656575,14,1,1, -6,1,10,28,34,63,38,1,10,28,1656607,16,3,1656741,14,1310721, -2,3,26,2,1,26,2,11,28,1,6,1,10,28,34,63, -38,3,26,1656717,16,1310721,2,5,26,2,1,26,2,11,28,1, -6,1,10,28,34,63,38,3,26,1,6,1,10,28,34,63, -38,1,10,28,1656719,14,1,1,6,1,10,28,34,63,38,1, -10,28,1,6,1,10,28,34,63,38,3,26,1656819,16,1656791,14, -99,111,109,112,97,114,105,115,111,110,0,1656769,1310721,2,3,26, -2,1310721,2,5,26,2,1643225,12,8,1587693,2,1658289,14,1310721,2,7, -26,2,1587743,2,28,1,6,1,10,28,34,63,38,3,26,1657375, -16,1310721,2,3,26,2,1,26,2,11,28,1,6,1,10,28, -34,63,38,3,26,1657019,16,1310721,2,5,26,2,1638689,12,1656935,16, -3,1656993,14,1310721,2,5,26,2,1587687,2,28,1,6,1,10,28, -34,63,38,3,26,1,6,1,10,28,34,63,38,1,10,28, -1,6,1,10,28,34,63,38,1,10,28,1657021,14,1,1657039,16, -1310721,2,3,26,2,1658289,14,1310721,2,5,26,2,1,26,2,11, -28,1,6,1,10,28,34,63,38,3,26,1657123,16,1310721,2,3, -26,2,1638689,12,1,6,1,10,28,34,63,38,1,10,28,1657125, -14,1,1657143,16,1310721,2,5,26,2,1658289,14,1310721,2,3,26,2, -1587687,2,28,1,6,1,10,28,34,63,38,3,26,1657189,16,3, -1657247,14,1310721,2,5,26,2,1587687,2,28,1,6,1,10,28,34, -63,38,3,26,1,6,1,10,28,34,63,38,1,10,28,1657259, -16,1587687,2,1658289,14,1310721,2,3,26,2,1638689,12,1657317,16,1310721,2, -5,26,2,1638689,12,1,6,1,10,28,34,63,38,1,10,28, -1657319,14,1,1657331,16,1587689,2,1658289,14,1657339,14,43,0,1657335,1310721,2, -3,26,2,1310721,2,5,26,2,1643225,12,8,1587687,2,1658289,14,1310721, -2,7,26,2,1587631,2,28,1,6,1,10,28,34,63,38,3, -26,1657943,16,1310721,2,3,26,2,1,26,2,11,28,1,6,1, -10,28,34,63,38,3,26,1657525,16,1310721,2,5,26,2,1,26, -2,11,28,1,6,1,10,28,34,63,38,3,26,1,6,1, -10,28,34,63,38,1,10,28,1657527,14,1,1657539,16,1587689,2,1658289, -14,1310721,2,3,26,2,1,26,2,11,28,1,6,1,10,28, -34,63,38,3,26,1657691,16,1310721,2,5,26,2,1638689,12,1657607,16, -3,1657665,14,1310721,2,5,26,2,1587687,2,28,1,6,1,10,28, -34,63,38,3,26,1,6,1,10,28,34,63,38,1,10,28, -1,6,1,10,28,34,63,38,1,10,28,1657693,14,1,1657711,16, -1310721,2,3,26,2,1658289,14,1310721,2,3,26,2,1587687,2,28,1, -6,1,10,28,34,63,38,3,26,1657757,16,3,1657815,14,1310721,2, -5,26,2,1587687,2,28,1,6,1,10,28,34,63,38,3,26, -1,6,1,10,28,34,63,38,1,10,28,1657827,16,1587687,2,1658289, -14,1310721,2,3,26,2,1638689,12,1657885,16,1310721,2,5,26,2,1638689, -12,1,6,1,10,28,34,63,38,1,10,28,1657887,14,1,1657899, -16,1587689,2,1658289,14,1657907,14,45,0,1657903,1310721,2,3,26,2,1310721, -2,5,26,2,1643225,12,8,1587687,2,1658289,14,1310721,2,7,26,2, -1655331,12,1658279,16,1310721,2,3,26,2,1587687,2,28,1,6,1,10, -28,34,63,38,3,26,1658007,16,3,1658065,14,1310721,2,5,26,2, -1587687,2,28,1,6,1,10,28,34,63,38,3,26,1,6,1, -10,28,34,63,38,1,10,28,1658077,16,1587687,2,1658289,14,1310721,2, -3,26,2,1638689,12,1658135,16,1310721,2,5,26,2,1638689,12,1,6, -1,10,28,34,63,38,1,10,28,1658137,14,1,1658149,16,1587689,2, -1658289,14,1310721,2,3,26,2,1638689,12,1658197,16,1310721,2,3,26,1310721, -2,5,26,2,10,3,6,10,4,8,1,1658253,14,97,114,105, -116,104,109,101,116,105,99,32,110,101,101,100,115,32,110,117, -109,98,101,114,115,0,1658203,1310721,2,3,26,2,1643625,12,8,1587687, -2,1658289,14,1587687,2,1658289,14,1,1310721,2,9,26,1310721,4,18,1310721, -2,3,28,1310721,4,1310721,2,1835009,40,1658337,16,1966081,1310721,4,1579223,12, -1310721,2,4,1310721,2,2,1,26,2,1658361,14,1,1310721,2,3,26, -1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1658409,16,1966081, -1310721,4,1579223,12,1310721,2,4,1310721,2,2,1637519,12,1658431,14,1,1310721, -2,3,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40, -1658479,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2,5,26,2, -1658503,14,1,1310721,2,3,26,1310721,4,18,1310721,2,3,28,1310721,4, -1310721,2,1835009,40,1658551,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2, -2,7,26,2,1658575,14,1,1310721,2,3,26,1310721,4,18,1310721,2, -3,28,1310721,4,1310721,2,1835009,40,1658623,16,1966081,1310721,4,1579223,12,1310721, -2,4,1310721,2,2,1636447,12,8,1310721,2,2,7,26,2,1658659,14, -1,1310721,2,3,26,1310721,4,18,1310721,2,9,28,1310721,4,1310721,2, -1835009,40,1658707,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2,1, -26,2,1310721,2,3,26,4,1310721,2,3,26,2,11,28,1,6, -1,10,28,34,63,38,3,26,1658779,16,3,1658835,14,1310721,2,3, -26,2,23,28,1,6,1,10,28,34,63,38,3,26,1,6, -1,10,28,34,63,38,1,10,28,1658845,16,3,1659163,14,1310721,2, -3,26,2,13,28,1,6,1,10,28,34,63,38,3,26,1658903, -16,1310721,2,2,9,26,2,1658673,12,1659163,14,1310721,2,3,26,2, -17,28,1,6,1,10,28,34,63,38,3,26,1658999,16,1310721,2, -2,11,26,2,1,6,1,10,28,34,63,38,3,26,1,6, -1,10,28,34,63,38,1,10,28,1659001,14,1,1659155,16,1310721,2, -7,26,1310721,2,2,1658589,12,10,3,6,10,4,8,1310721,2,5, -26,1,10,3,6,10,4,8,1310721,2,5,26,2,1310721,2,7, -26,2,40,1659155,16,1310721,2,2,1310721,2,5,26,2,1661615,12,1658673, -12,1659117,16,3,1659163,14,1310721,2,5,26,1,6,2,1,6,3, -26,5,6,4,10,8,8,1659057,14,1,1659163,14,1,1310721,2,9, -26,1310721,4,18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1659211,16, -1966081,1310721,4,1579223,12,1310721,2,3,26,4,1310721,2,4,1310721,2,2, -1310721,2,3,26,2,65,1659277,12,8,1310721,2,2,1659263,14,1,1310721, -2,5,26,1310721,4,18,1310721,2,17,28,1310721,4,1310721,2,1835009,40, -1659311,16,1966081,1310721,4,1579223,12,1310721,2,5,26,4,1310721,2,3,26, -4,1310721,2,4,1310721,2,5,26,2,1,10,40,3,36,1659367,16, -3,1659419,14,1310721,2,3,26,2,1,6,1,10,28,34,63,38, -3,26,1,6,1,10,28,34,63,38,1,10,28,1659429,16,3, -1659481,14,1310721,2,2,1578965,12,1,6,1,10,28,34,63,38,3, -26,1,6,1,10,28,34,63,38,1,10,28,1659491,16,1,1660611, -14,1310721,2,3,26,2,1,26,2,23,28,1,6,1,10,28, -34,63,38,3,26,1659795,16,1310721,2,3,26,2,9,26,2,1658673, -12,1659789,16,1310721,2,15,26,1310721,2,3,26,2,9,26,2,1637519, -12,10,3,6,10,4,8,1310721,2,9,26,1310721,2,2,1,26, -2,10,3,6,10,4,8,1310721,2,13,26,1,10,3,6,10, -4,8,1310721,2,13,26,2,1310721,2,9,26,2,40,1659789,16,1310721, -2,2,5,26,2,1310721,2,13,26,2,1310721,2,15,26,2,30, -26,1310721,2,3,26,2,9,26,2,1310721,2,5,26,2,3,28, -1660625,12,8,1310721,2,13,26,1,6,2,1,6,3,26,5,6, -4,10,8,8,1659653,14,1,1660611,14,1310721,2,3,26,2,1,26, -2,11,28,1,6,1,10,28,34,63,38,1,10,28,1659847,16, -3,1659895,14,1310721,2,2,3,1,10,28,26,2,1,40,3,36, -1,6,1,10,28,34,63,38,1,10,28,1659905,16,1,1660611,14, -1310721,2,7,26,1310721,2,3,26,2,9,26,2,10,3,6,10, -4,8,1310721,2,9,26,1,1310721,2,2,3,1,10,28,26,2, -28,3,28,10,3,6,10,4,8,1310721,2,15,26,1310721,2,7, -26,2,1637519,12,10,3,6,10,4,8,1310721,2,15,26,2,3, -40,1660061,16,1310721,2,15,26,3,10,3,6,10,4,8,1310721,2, -7,26,2,1587687,2,28,1,6,1,10,28,34,63,38,3,26, -1660107,16,3,1660169,14,1310721,2,7,26,2,1,26,2,19,28,1, -6,1,10,28,34,63,38,3,26,1,6,1,10,28,34,63, -38,1,10,28,1660207,16,1310721,2,2,3,1,10,28,26,1,10, -3,6,10,4,8,1660321,14,1310721,2,9,26,2,1310721,2,15,26, -2,10,40,1660283,16,1310721,2,2,3,1,10,28,26,1310721,2,7, -26,2,1,1633251,12,10,3,6,10,4,8,1660321,14,1310721,2,2, -3,1,10,28,26,1310721,2,7,26,2,10,3,6,10,4,8, -1310721,2,2,1580291,12,1310721,2,9,26,2,10,40,1660397,16,1310721,2, -2,1310721,2,9,26,2,26,1,1310721,2,2,1580291,12,1310721,2,9, -26,2,28,1574703,12,8,1310721,2,7,26,2,1658673,12,1660603,16,1310721, -2,11,26,1310721,2,9,26,2,1310721,2,15,26,2,44,10,3, -6,10,4,8,1310721,2,13,26,1,10,3,6,10,4,8,1310721, -2,13,26,2,1310721,2,11,26,2,40,1660603,16,1310721,2,2,1310721, -2,13,26,2,1310721,2,15,26,2,30,26,1310721,2,7,26,2, -1310721,2,5,26,2,3,28,1660625,12,8,1310721,2,13,26,1,6, -2,1,6,3,26,5,6,4,10,8,8,1660479,14,1,1660611,14, -1,1310721,2,17,26,1310721,4,18,1310721,2,19,28,1310721,4,1310721,2, -1835009,40,1660659,16,1966081,1310721,4,1579223,12,1310721,2,5,26,4,1310721,2, -3,26,4,1310721,2,4,1310721,2,3,26,2,1,26,2,1310721,2, -7,26,4,1310721,2,7,26,2,11,28,1,6,1,10,28,34, -63,38,3,26,1660755,16,3,1660811,14,1310721,2,7,26,2,23,28, -1,6,1,10,28,34,63,38,3,26,1,6,1,10,28,34, -63,38,1,10,28,1660855,16,1310721,2,2,1,26,2,1310721,2,3, -26,2,1310721,2,5,26,2,1659277,12,1661489,14,1310721,2,7,26,2, -13,28,1,6,1,10,28,34,63,38,3,26,1661123,16,1310721,2, -11,26,1310721,2,3,26,2,7,26,2,10,3,6,10,4,8, -1310721,2,17,26,1310721,2,3,26,2,9,26,2,1637519,12,10,3, -6,10,4,8,1310721,2,9,26,1,10,3,6,10,4,8,1310721, -2,9,26,2,1310721,2,11,26,2,40,1661117,16,1310721,2,2,1310721, -2,9,26,2,1310721,2,17,26,2,30,26,1310721,2,3,26,2, -9,26,2,1310721,2,5,26,2,1660625,12,8,1310721,2,9,26,1, -6,2,1,6,3,26,5,6,4,10,8,8,1660991,14,1,1661489, -14,1310721,2,7,26,2,17,28,1,6,1,10,28,34,63,38, -3,26,1661223,16,1310721,2,3,26,2,11,26,2,1,6,1,10, -28,34,63,38,3,26,1,6,1,10,28,34,63,38,1,10, -28,1661225,14,1,1661481,16,1310721,2,11,26,1310721,2,3,26,2,1658589, -12,10,3,6,10,4,8,1310721,2,9,26,1,10,3,6,10, -4,8,1310721,2,9,26,2,1310721,2,11,26,2,40,1661481,16,1310721, -2,13,26,1310721,2,3,26,2,1310721,2,9,26,2,1661731,12,10, -3,6,10,4,8,1310721,2,15,26,1310721,2,3,26,2,1310721,2, -9,26,2,1661615,12,10,3,6,10,4,8,1310721,2,2,1310721,2, -13,26,2,26,1310721,2,15,26,2,1310721,2,5,26,2,1660625,12, -8,1310721,2,9,26,1,6,2,1,6,3,26,5,6,4,10, -8,8,1661285,14,1,1661489,14,1,1310721,2,19,26,1310721,4,18,1310721, -2,5,28,1310721,4,1310721,2,1835009,40,1661537,16,1966081,1310721,4,1579223,12, -1310721,2,3,26,4,1310721,2,4,1310721,2,2,1636447,12,8,1310721,2, -2,9,26,2,1310721,2,3,26,2,7,30,26,2,1661601,14,1, -1310721,2,5,26,1310721,4,18,1310721,2,5,28,1310721,4,1310721,2,1835009, -40,1661649,16,1966081,1310721,4,1579223,12,1310721,2,3,26,4,1310721,2,4, -1310721,2,2,1636447,12,8,1310721,2,2,9,26,2,1310721,2,3,26, -2,7,30,3,26,26,2,1661717,14,1,1310721,2,5,26,1310721,4, -18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1661765,16,1966081,1310721,4, -1579223,12,1310721,2,3,26,4,1310721,2,4,1310721,2,2,1636447,12,8, -1310721,2,2,9,26,2,1310721,2,3,26,2,7,30,5,26,26, -2,1661833,14,1,1310721,2,5,26,1310721,4,18,1310721,2,3,28,1310721, -4,1310721,2,1835009,40,1661881,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721, -2,2,9,26,2,1661905,14,1,1310721,2,3,26,1310721,4,18,1310721, -2,3,28,1310721,4,1310721,2,1835009,40,1661953,16,1966081,1310721,4,1579223,12, -1310721,2,4,1310721,2,2,7,26,2,1661977,14,1,1310721,2,3,26, -1310721,4,18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1662025,16,1966081, -1310721,4,1579223,12,1310721,2,3,26,4,1310721,2,4,1310721,2,2,15, -1310721,2,3,26,2,26,26,2,1662071,14,1,1310721,2,5,26,1310721, -4,18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1662119,16,1966081,1310721, -4,1579223,12,1310721,2,3,26,4,1310721,2,4,1310721,2,2,11,26, -2,13,38,1310721,2,3,26,2,1310721,2,3,26,2,26,38,7, -32,1662185,14,1,1310721,2,5,26,1310721,4,18,1310721,2,3,28,1310721, -4,1310721,2,1835009,40,1662233,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721, -2,2,11,26,2,3,32,1662261,14,1,1310721,2,3,26,1310721,4, -18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1662309,16,1966081,1310721,4, -1579223,12,1310721,2,4,1310721,2,2,1,26,2,17,28,1,6,1, -10,28,34,63,38,1,10,28,1662363,16,3,1662417,14,1310721,2,2, -11,26,2,1,6,1,10,28,34,63,38,3,26,1,6,1, -10,28,34,63,38,1,10,28,1662427,16,1,1662451,14,1310721,2,2, -13,26,2,1,26,2,1662451,14,1,1310721,2,3,26,1310721,4,18, -1310721,2,5,28,1310721,4,1310721,2,1835009,40,1662499,16,1966081,1310721,4,1579223, -12,1310721,2,3,26,4,1310721,2,4,1310721,2,2,13,26,2,3, -1310721,2,3,26,2,26,26,2,1662551,14,1,1310721,2,5,26,1310721, -4,18,1310721,2,59,28,1310721,4,1310721,2,1835009,40,1662599,16,1966081,1310721, -4,1579223,12,1310721,2,4,1585219,2,1310721,2,3,26,4,3,1,10, -28,1310721,2,5,26,4,1310721,2,3,26,2,1662895,16,1310721,2,3, -26,1,6,2,1,6,-1,26,5,6,4,10,8,8,1417729,1310721, -2,3,26,2,26,2,3,28,1,6,1,10,28,34,63,38, -3,26,1662799,16,1425921,1310721,2,3,26,2,26,2,1310721,2,2,28, -1,6,1,10,28,34,63,38,3,26,1,6,1,10,28,34, -63,38,1,10,28,1662801,14,1,1662851,16,1442305,1310721,2,3,26,2, -26,2,3,32,1,6,1,10,28,34,63,38,1,10,28,1662853, -14,1,1662891,16,1310721,2,5,26,1310721,2,3,26,2,10,3,6, -10,4,8,1662895,14,1662637,14,1310721,2,5,26,2,1,40,1662919,16, -1,1663173,14,1559041,1310721,2,5,26,2,26,2,1662959,16,1559041,1310721,2, -5,26,2,26,2,1663173,14,1310721,2,55,26,1434113,1310721,2,5,26, -2,26,2,3,38,63,32,10,3,6,10,4,8,1310721,2,57, -26,1,10,3,6,10,4,8,1310721,2,57,26,2,1310721,2,55, -26,2,40,1663125,16,1310721,2,7,26,1310721,2,57,26,2,26,1587687, -2,10,3,6,10,4,8,1310721,2,57,26,1,6,2,1,6, -3,26,5,6,4,10,8,8,1663025,14,1587687,2,1310721,2,55,26, -2,1310721,2,7,26,1434113,1310721,2,5,26,2,26,2,1633771,12,1663173, -14,1,1310721,2,59,26,1310721,4,18,1310721,2,5,28,1310721,4,1310721, -2,1835009,40,1663221,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2, -1593805,12,1310721,2,3,26,4,1310721,2,3,26,2,1,40,1663271,16, -3,1663335,14,1417729,1310721,2,3,26,2,26,2,3,28,1,6,1, -10,28,34,63,38,1,10,28,1,6,1,10,28,34,63,38, -1,10,28,1663345,16,1,1663371,14,1425921,1310721,2,3,26,2,26,2, -1662565,12,1663371,14,1,1310721,2,5,26,1310721,4,18,1310721,2,1,28, -1310721,4,1310721,2,1835009,40,1663419,16,1966081,1310721,4,1579223,12,1587587,2,1663483, -16,1587699,2,1638921,12,1,6,1,10,28,34,63,38,3,26,1663467, -16,3,1594729,12,8,1587587,1,10,3,6,10,4,8,1,1663491,14, -1,1310721,2,1,26,1310721,4,18,1310721,2,11,28,1310721,4,1310721,2, -1835009,40,1663539,16,1966081,1310721,4,1579223,12,1310721,2,3,26,4,1310721,2, -4,1425921,1310721,2,2,26,2,1310721,2,5,26,4,1587593,2,1310721,2, -7,26,4,1587593,1310721,2,3,26,2,10,3,6,10,4,8,1587595, -1,10,3,6,10,4,8,1587699,1587687,2,10,3,6,10,4,8, -1587701,1,10,3,6,10,4,8,1310721,2,5,26,2,1,6,12, -10,8,8,1587593,1310721,2,7,26,2,10,3,6,10,4,8,1310721, -2,9,26,1587595,2,10,3,6,10,4,8,1587587,1,10,3,6, -10,4,8,1587589,1,10,3,6,10,4,8,1310721,2,9,26,2, -1663783,14,1,1310721,2,11,26,1310721,4,18,1310721,2,1,28,1310721,4, -1310721,2,1835009,40,1663831,16,1966081,1310721,4,1579223,12,1587593,2,1663931,16,1663923, -14,116,104,105,115,32,99,97,110,39,116,32,98,101,32,117, -115,101,100,32,105,110,115,105,100,101,32,97,110,32,101,120, -112,114,101,115,115,105,111,110,0,1663843,1591173,12,8,1,1663939,14, -1,1310721,2,1,26,1310721,4,18,1310721,2,17,28,1310721,4,1310721,2, -1835009,40,1663987,16,1966081,1310721,4,1579223,12,1310721,2,7,26,4,1310721,2, -5,26,4,1310721,2,3,26,4,1310721,2,4,1,1310721,2,9,26, -4,1587599,2,1606959,12,8,1587601,2,1606425,12,1,6,1,10,28,34, -63,38,3,26,1664603,16,3,1664603,16,1310721,2,11,26,1681059,12,10, -3,6,10,4,8,1663385,12,8,1310721,2,15,26,1587699,2,10,3, -6,10,4,8,1310721,2,11,26,2,1310721,2,2,1310721,2,9,26, -2,1310721,2,9,26,2,26,38,7,32,1625017,12,8,1310721,2,7, -26,2,1664241,16,1310721,2,15,26,2,1658673,12,1,6,1,10,28, -34,63,38,1,10,28,1664243,14,1,1664297,16,1310721,2,15,26,2, -1594643,12,8,1590517,2,1595409,12,8,1587699,1310721,2,15,26,2,10,3, -6,10,4,8,1310721,2,3,26,2,1664365,16,1310721,2,9,26,2, -1310721,2,3,26,2,7,26,2,40,1,6,1,10,28,34,63, -38,1,10,28,1664367,14,1,1664529,16,1310721,2,13,26,1310721,2,3, -26,2,15,1310721,2,9,26,2,26,26,2,10,3,6,10,4, -8,1310721,2,13,26,2,1587699,2,1310721,2,5,26,2,1640879,12,1, -6,1,10,28,34,63,38,3,26,1664529,16,1664493,14,97,114,103, -117,109,101,110,116,0,1664475,1310721,2,13,26,2,1310721,2,5,26, -2,1637691,12,1587699,2,1643225,12,8,1310721,2,9,26,1,6,2,1, -6,3,26,5,6,4,10,8,8,1587611,2,1606729,12,1,6,1, -10,28,34,63,38,3,26,1664599,16,1664603,14,1664077,14,1587601,2,1606959, -12,8,1310721,2,9,26,2,1664629,14,1,1310721,2,17,26,1310721,4, -18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1664677,16,1966081,1310721,4, -1579223,12,1310721,2,1644591,12,10,3,6,10,4,8,1310721,2,2,1, -26,2,23,28,1,6,1,10,28,34,63,38,3,26,1665063,16, -1310721,2,2,9,26,2,1637519,12,1594643,12,8,1587611,2,1606729,12,1664821, -16,1310721,2,3,26,1681059,12,10,3,6,10,4,8,1663385,12,8, -1310721,2,3,26,2,1613033,12,8,1664957,14,1,1594643,12,8,1310721,2, -2,7,26,2,1664957,16,1664949,14,97,32,102,105,120,101,100,32, -97,114,114,97,121,32,110,101,101,100,115,32,105,116,115,32, -108,101,110,103,116,104,58,32,110,101,119,40,102,105,120,101, -100,32,91,93,84,44,32,110,41,0,1664849,1591173,12,8,1310721,2, -2,1594643,12,8,1587601,2,1606959,12,8,1590551,2,1595409,12,8,1587587,1, -10,3,6,10,4,8,1587589,1,10,3,6,10,4,8,1587699,1310721, -2,2,10,3,6,10,4,8,1587701,1,10,3,6,10,4,8, -3,1665583,14,1587769,2,1665311,16,1587611,2,1606729,12,1665197,16,1310721,2,3, -26,1681059,12,10,3,6,10,4,8,1663385,12,8,1310721,2,3,26, -2,1613033,12,8,1310721,2,2,1637519,12,3,28,1,6,1,10,28, -34,63,38,1,10,28,1665193,16,1310721,2,2,1637519,12,1594643,12,8, -31,1594729,12,8,1665213,14,1310721,2,2,1637519,12,1594643,12,8,1587601,2, -1606959,12,8,1587765,2,1595409,12,8,1587587,1,10,3,6,10,4,8, -1587589,1,10,3,6,10,4,8,1587699,1310721,2,2,1632877,12,10,3, -6,10,4,8,1587701,1,10,3,6,10,4,8,3,1665583,14,1587611, -2,1606729,12,1665455,16,1310721,2,3,26,1681059,12,10,3,6,10,4, -8,1663385,12,8,1310721,2,3,26,2,1613033,12,8,1310721,2,2,1637519, -12,3,28,1,6,1,10,28,34,63,38,1,10,28,1665433,16, -1310721,2,2,1637519,12,1594643,12,8,31,1594729,12,8,1310721,2,2,1, -1633251,12,1594643,12,8,1665483,14,1310721,2,2,1637519,12,1594643,12,8,1310721, -2,2,1594643,12,8,1587601,2,1606959,12,8,1587757,2,1595409,12,8,1587587, -1,10,3,6,10,4,8,1587589,1,10,3,6,10,4,8,1587699, -1310721,2,2,1632877,12,10,3,6,10,4,8,1587701,1,10,3,6, -10,4,8,3,1665583,14,1,1310721,2,5,26,1310721,4,18,1310721,2, -27,28,1310721,4,1310721,2,1835009,40,1665631,16,1966081,1310721,4,1579223,12,1310721, -2,4,1,1310721,2,5,26,4,1,1310721,2,7,26,4,1559041,1310721, -2,2,26,2,1310721,2,9,26,4,1409537,1310721,2,2,26,2,1587755, -2,28,1,6,1,10,28,34,63,38,3,26,1665787,16,1417729,1310721, -2,2,26,2,3,28,1,6,1,10,28,34,63,38,3,26, -1,6,1,10,28,34,63,38,1,10,28,1665789,14,1,1666117,16, -1605859,12,8,1587511,2,9,28,1,6,1,10,28,34,63,38,3, -26,1665949,16,1587513,2,1587623,2,28,1,6,1,10,28,34,63,38, -3,26,1665871,16,3,1665923,14,1587513,2,1587607,2,28,1,6,1,10, -28,34,63,38,3,26,1,6,1,10,28,34,63,38,1,10, -28,1,6,1,10,28,34,63,38,1,10,28,1665951,14,1,1665969, -16,1604999,12,8,1664643,12,1667095,14,1587511,2,5,28,1,6,1,10, -28,34,63,38,3,26,1666097,16,1587513,2,1644211,12,1666019,16,3,1666071, -14,1587513,2,1587639,2,28,1,6,1,10,28,34,63,38,3,26, -1,6,1,10,28,34,63,38,1,10,28,1,6,1,10,28, -34,63,38,1,10,28,1666099,14,1,1666117,16,1604999,12,8,1664643,12, -1667095,14,1587769,2,1666189,16,1409537,1310721,2,2,26,2,1587755,2,28,1, -6,1,10,28,34,63,38,3,26,1,6,1,10,28,34,63, -38,1,10,28,1666191,14,1,1666293,16,1310721,2,5,26,1587765,2,1593303, -12,10,3,6,10,4,8,1310721,2,5,26,2,1,40,3,36, -1666271,16,1310721,2,1310721,2,5,26,2,10,3,6,10,4,8,1310721, -2,5,26,1,10,3,6,10,4,8,1442305,1310721,2,2,26,2, -5,32,1666389,16,1310721,2,5,26,1434113,1310721,2,2,26,2,13,38, -10,3,6,10,4,8,1310721,2,7,26,1434113,1310721,2,2,26,2, -3,32,10,3,6,10,4,8,1666427,14,1442305,1310721,2,2,26,1442305, -1310721,2,2,26,2,9,34,10,3,6,10,4,8,1310721,2,11, -26,1,17,1574703,12,8,1590581,2,1666489,16,1310721,2,11,26,1590565,1590581, -2,1574491,12,8,1590581,1,10,3,6,10,4,8,1310721,2,3,26, -1,10,3,6,10,4,8,1587769,2,1666581,16,1442305,1310721,2,2,26, -2,1025,32,1,6,1,10,28,34,63,38,3,26,1,6,1, -10,28,34,63,38,1,10,28,1666583,14,1,1666653,16,1409537,1310721,2, -2,26,2,1587671,2,28,1,6,1,10,28,34,63,38,1,10, -28,1,6,1,10,28,34,63,38,1,10,28,1666655,14,1,1666681, -16,1310721,2,3,26,3,10,3,6,10,4,8,1310721,2,3,26, -1310721,2,5,26,2,1310721,2,9,26,2,1310721,2,11,26,1310721,2, -3,26,2,1663953,12,10,3,6,10,4,8,1442305,1310721,2,2,26, -2,5,32,1666843,16,1310721,2,3,26,2,1434113,1310721,2,2,26,2, -3,38,63,32,28,1,6,1,10,28,34,63,38,1,10,28, -1,6,1,10,28,34,63,38,1,10,28,1666845,14,1,1666925,16, -1409537,1310721,2,2,26,2,1666917,14,119,114,111,110,103,32,110,117, -109,98,101,114,32,111,102,32,97,114,103,117,109,101,110,116, -115,0,1666865,1591343,12,8,1310721,2,2,1595235,12,8,13,1594729,12,8, -1587587,1,10,3,6,10,4,8,1587589,1,10,3,6,10,4,8, -1587701,1,10,3,6,10,4,8,1587699,1587687,2,10,3,6,10,4, -8,1310721,2,9,26,2,1667067,16,1587699,1310721,2,9,26,2,9,26, -2,1310721,2,11,26,1637691,12,10,3,6,10,4,8,1310721,2,7, -26,2,1667087,16,3,1667095,14,1,1667095,14,1,1310721,2,27,26,1310721, -4,18,1310721,2,11,28,1310721,4,1310721,2,1835009,40,1667143,16,1966081,1310721, -4,1579223,12,1310721,2,4,1434113,1310721,2,2,26,2,31,32,1310721,2, -3,26,4,1434113,1310721,2,2,26,2,9,38,31,32,1310721,2,5, -26,4,1,1310721,2,7,26,4,1587599,2,1606959,12,8,1587601,2,1606425, -12,1,6,1,10,28,34,63,38,3,26,1667385,16,3,1667385,16, -1310721,2,9,26,1681059,12,10,3,6,10,4,8,1663385,12,8,1310721, -2,9,26,2,1613033,12,8,1310721,2,7,26,1,6,2,1,6, -3,26,5,6,4,10,8,8,1587611,2,1606729,12,1,6,1,10, -28,34,63,38,3,26,1667381,16,1667385,14,1667259,14,1587601,2,1606959,12, -8,1310721,2,7,26,2,1310721,2,3,26,2,28,1,6,1,10, -28,34,63,38,1,10,28,1667513,16,1409537,1310721,2,2,26,2,1667505, -14,119,114,111,110,103,32,110,117,109,98,101,114,32,111,102, -32,105,110,112,117,116,115,0,1667459,1591343,12,8,1587587,1,10,3, -6,10,4,8,1587589,1,10,3,6,10,4,8,1587699,1587687,2,10, -3,6,10,4,8,1587701,1,10,3,6,10,4,8,1442305,1310721,2, -2,26,2,129,32,1667635,16,1450497,1310721,2,2,26,2,3,28,1595235, -12,8,13,1594729,12,8,1,1667833,14,45,1425921,1310721,2,2,26,2, -26,1594729,12,8,1310721,2,5,26,2,1,28,1,6,1,10,28, -34,63,38,3,26,1667703,16,1,1594643,12,8,1310721,2,5,26,2, -3,10,40,1667825,16,1409537,1310721,2,2,26,2,1667817,14,108,101,97, -118,101,115,32,115,101,118,101,114,97,108,32,118,97,108,117, -101,115,59,32,117,115,101,32,105,116,32,102,114,111,109,32, -97,115,109,0,1667739,1591343,12,8,1,1667833,14,1,1310721,2,11,26, -1310721,4,18,1310721,2,9,28,1310721,4,1310721,2,1835009,40,1667881,16,1966081, -1310721,4,1579223,12,1587587,1,10,3,6,10,4,8,1587589,1,10,3, -6,10,4,8,1587701,1,10,3,6,10,4,8,1590561,1,10,3, -6,10,4,8,1585289,2,3,28,1,6,1,10,28,34,63,38, -3,26,1668093,16,1585291,2,1594643,12,8,1587701,1585291,2,1,28,1,6, -1,10,28,34,63,38,3,26,10,3,6,10,4,8,1590561,3, -10,3,6,10,4,8,1590563,1585291,2,10,3,6,10,4,8,1587699, -1587689,2,10,3,6,10,4,8,1604999,12,8,1,1670763,14,1585289,2, -7,28,1,6,1,10,28,34,63,38,3,26,1668169,16,1585291,2, -1598105,12,8,1604999,12,8,1587699,1587691,2,1632877,12,10,3,6,10,4, -8,1,1670763,14,1585289,2,9,28,1,6,1,10,28,34,63,38, -3,26,1668421,16,1585291,2,1587599,2,28,1,6,1,10,28,34,63, -38,3,26,1668289,16,1604999,12,8,1310721,2,7,26,1681059,12,10,3, -6,10,4,8,1587601,2,1606959,12,8,1310721,2,7,26,2,1670763,14, -1585291,2,1587603,2,28,1,6,1,10,28,34,63,38,3,26,1668331, -16,1683915,12,1670763,14,1668381,14,101,120,112,101,99,116,101,100,32, -97,110,32,101,120,112,114,101,115,115,105,111,110,0,1668335,1591557, -12,8,1,1594643,12,8,1587699,1587687,2,10,3,6,10,4,8,1, -1670763,14,1585289,2,5,28,1,6,1,10,28,34,63,38,1,10, -28,1668545,16,1668505,14,101,120,112,101,99,116,101,100,32,97,110, -32,101,120,112,114,101,115,115,105,111,110,0,1668459,1591557,12,8, -1,1594643,12,8,1587699,1587687,2,10,3,6,10,4,8,1,1670763,14, -1310721,2,1585291,2,10,3,6,10,4,8,1310721,2,3,26,1310721,2, -2,1611615,12,10,3,6,10,4,8,1310721,2,3,26,2,1,40, -3,36,1669011,16,1604999,12,8,1587565,2,1,6,1,10,28,34,63, -38,3,26,1668691,16,1310721,2,3,26,2,1612447,12,1,6,1,10, -28,34,63,38,1,10,28,1668693,14,1,1668841,16,1310721,2,2,1668833, -14,105,115,32,116,114,97,99,107,101,100,32,98,121,32,116, -104,101,32,97,110,97,108,121,122,101,114,32,97,110,100,32, -99,97,110,39,116,32,98,101,32,117,115,101,100,32,105,110, -32,117,110,99,104,101,99,107,101,100,32,99,111,100,101,0, -1668707,1591343,12,8,1310721,2,3,26,2,1595671,12,8,1587699,1556993,1310721,2, -3,26,2,26,2,10,3,6,10,4,8,1473025,1310721,2,3,26, -2,26,2,1668913,16,1,1670763,14,1587587,3,10,3,6,10,4,8, -1587589,3,10,3,6,10,4,8,1587591,1310721,2,3,26,2,10,3, -6,10,4,8,1310721,2,3,26,2,1612447,12,1669005,16,5,1310721,2, -3,26,2,26,1670763,14,1,1670763,14,1310721,2,5,26,1310721,2,2, -1593303,12,10,3,6,10,4,8,1310721,2,5,26,2,1,40,3, -36,1669129,16,1417729,1310721,2,5,26,2,26,2,11,28,1,6,1, -10,28,34,63,38,3,26,1,6,1,10,28,34,63,38,1, -10,28,1669131,14,1,1669287,16,1442305,1310721,2,5,26,2,26,2,33, -32,1,6,1,10,28,34,63,38,3,26,1669267,16,1310721,2,2, -1669259,14,99,97,110,39,116,32,98,101,32,117,115,101,100,32, -105,110,115,105,100,101,32,97,110,32,101,120,112,114,101,115, -115,105,111,110,0,1669189,1591691,12,8,1310721,2,5,26,2,3,1663505, -12,1670763,14,1310721,2,5,26,2,1,40,3,36,1669375,16,1417729,1310721, -2,5,26,2,26,2,15,28,1,6,1,10,28,34,63,38, -3,26,1,6,1,10,28,34,63,38,1,10,28,1669377,14,1, -1669477,16,1310721,2,2,1669437,14,105,115,32,97,32,116,121,112,101, -44,32,110,111,116,32,97,32,118,97,108,117,101,0,1669391,1591691, -12,8,1,1594643,12,8,1587699,1587687,2,10,3,6,10,4,8,1, -1670763,14,1604999,12,8,1587699,1587687,2,10,3,6,10,4,8,1310721,2, -5,26,2,1,40,3,36,1669589,16,1417729,1310721,2,5,26,2,26, -2,9,28,1,6,1,10,28,34,63,38,3,26,1,6,1, -10,28,34,63,38,1,10,28,1669591,14,1,1669741,16,1425921,1310721,2, -5,26,2,26,2,1594643,12,8,1587699,1587689,2,10,3,6,10,4, -8,1587701,1425921,1310721,2,5,26,2,26,2,1,28,1,6,1,10, -28,34,63,38,3,26,10,3,6,10,4,8,1590561,3,10,3, -6,10,4,8,1590563,1425921,1310721,2,5,26,2,26,2,10,3,6, -10,4,8,1,1670763,14,1310721,2,5,26,2,1,40,3,36,1669829, -16,1417729,1310721,2,5,26,2,26,2,5,28,1,6,1,10,28, -34,63,38,3,26,1,6,1,10,28,34,63,38,1,10,28, -1669831,14,1,1669945,16,1425921,1310721,2,5,26,2,26,2,1594643,12,8, -1559041,1310721,2,5,26,2,26,2,1669907,16,1587699,1559041,1310721,2,5,26, -2,26,2,10,3,6,10,4,8,1587587,3,10,3,6,10,4, -8,1587589,5,10,3,6,10,4,8,1,1670763,14,1310721,2,5,26, -2,1,40,3,36,1670033,16,1417729,1310721,2,5,26,2,26,2,7, -28,1,6,1,10,28,34,63,38,3,26,1,6,1,10,28, -34,63,38,1,10,28,1670035,14,1,1670117,16,1425921,1310721,2,5,26, -2,26,2,1594643,12,8,1559041,1310721,2,5,26,2,26,2,1670111,16, -1587699,1559041,1310721,2,5,26,2,26,2,10,3,6,10,4,8,1, -1670763,14,1310721,2,5,26,2,1,40,3,36,1670205,16,1417729,1310721,2, -5,26,2,26,2,13,28,1,6,1,10,28,34,63,38,3, -26,1,6,1,10,28,34,63,38,1,10,28,1670207,14,1,1670229, -16,1310721,2,5,26,2,1667109,12,1670763,14,1310721,2,5,26,2,1, -40,1670277,16,1310721,2,5,26,1310721,2,2,1595111,12,10,3,6,10, -4,8,1587729,2,1606425,12,1670335,16,1442305,1310721,2,5,26,2,26,2, -257,32,1,6,1,10,28,34,63,38,1,10,28,1670337,14,1, -1670659,16,1604999,12,8,1590581,1,10,3,6,10,4,8,3,1670537,16, -1590581,2,17,40,3,36,1670445,16,1670437,14,116,111,111,32,109,97, -110,121,32,116,121,112,101,32,97,114,103,117,109,101,110,116, -115,0,1670389,1591557,12,8,1590565,1590581,2,26,1644591,12,10,3,6,10, -4,8,1590581,1,6,2,1,6,3,26,5,6,4,10,8,8, -1587611,2,1606729,12,1,6,1,10,28,34,63,38,3,26,1670533,16, -1670537,14,1670363,14,1644489,12,8,1587599,2,1606425,12,1,6,1,10,28, -34,63,38,3,26,1670659,16,1670651,14,101,120,112,101,99,116,101, -100,32,40,32,97,102,116,101,114,32,116,104,101,32,116,121, -112,101,32,97,114,103,117,109,101,110,116,115,0,1670579,1591557,12, -8,1587599,2,1606425,12,1670689,16,1310721,2,5,26,2,1665597,12,1670763,14, -1310721,2,5,26,2,1595235,12,8,1559041,1310721,2,5,26,2,26,2, -1670755,16,1587699,1559041,1310721,2,5,26,2,26,2,10,3,6,10,4, -8,1,1670763,14,1,1310721,2,9,26,1310721,4,18,1310721,2,5,28, -1310721,4,1310721,2,1835009,40,1670811,16,1966081,1310721,4,1579223,12,1310721,2,3, -26,4,1310721,2,4,1587587,2,1,6,1,10,28,34,63,38,3, -26,1670943,16,1670935,14,43,43,32,97,110,100,32,45,45,32,110, -101,101,100,32,115,111,109,101,116,104,105,110,103,32,116,111, -32,97,115,115,105,103,110,32,116,111,0,1670859,1591557,12,8,1587589, -2,3,28,1,6,1,10,28,34,63,38,3,26,1671005,16,1587565, -2,1,6,1,10,28,34,63,38,1,10,28,1671007,14,1,1671045, -16,1587591,2,1612447,12,1,6,1,10,28,34,63,38,1,10,28, -1671047,14,1,1671147,16,1587591,2,1671139,14,111,119,110,115,32,97,110, -32,111,98,106,101,99,116,32,97,110,100,32,99,97,110,39, -116,32,98,101,32,105,110,99,114,101,109,101,110,116,101,100, -0,1671059,1591963,12,8,1587699,2,1638689,12,1671165,16,3,1671221,14,1587699,2, -1,26,2,11,28,1,6,1,10,28,34,63,38,3,26,1, -6,1,10,28,34,63,38,1,10,28,1671231,16,3,1671283,14,1587699, -2,1587687,2,28,1,6,1,10,28,34,63,38,3,26,1,6, -1,10,28,34,63,38,1,10,28,1671361,14,43,43,32,97,110, -100,32,45,45,32,110,101,101,100,32,97,32,110,117,109,98, -101,114,32,111,114,32,97,32,112,111,105,110,116,101,114,0, -1671287,1587699,2,1643625,12,8,1587587,1,10,3,6,10,4,8,1587589,1, -10,3,6,10,4,8,1587701,1,10,3,6,10,4,8,1,1594643, -12,8,7,1594729,12,8,3,1594729,12,8,1310721,2,2,1671523,16,1, -1594643,12,8,7,1594729,12,8,1310721,2,3,26,2,1594643,12,8,27, -1594729,12,8,5,1594643,12,8,7,1594729,12,8,5,1594729,12,8,1671587, -14,1310721,2,3,26,2,1594643,12,8,27,1594729,12,8,1,1594643,12, -8,7,1594729,12,8,5,1594643,12,8,7,1594729,12,8,5,1594729,12, -8,11,1594729,12,8,9,1594729,12,8,1,1671611,14,1,1310721,2,5, -26,1310721,4,18,1310721,2,11,28,1310721,4,1310721,2,1835009,40,1671659,16, -1966081,1310721,4,1579223,12,1310721,2,4,3,1,10,28,1310721,2,9,26, -4,1604999,12,8,1310721,2,3,26,1607249,12,10,3,6,10,4,8, -1663385,12,8,1310721,2,2,3,28,1,6,1,10,28,34,63,38, -3,26,1671889,16,1671877,14,117,115,101,32,97,32,102,105,101,108, -100,32,111,102,32,97,32,110,101,119,32,111,98,106,101,99, -116,32,111,110,108,121,32,97,102,116,101,114,32,98,105,110, -100,105,110,103,32,105,116,32,116,111,32,97,32,110,97,109, -101,0,1671757,1591845,12,8,1671953,14,1310721,2,2,5,40,3,36,1671953, -16,1310721,2,2,5,28,1612545,12,8,1310721,2,9,26,1310721,2,2, -5,28,10,3,6,10,4,8,1310721,2,5,26,1587699,2,10,3, -6,10,4,8,1310721,2,5,26,2,1,26,2,11,28,1,6, -1,10,28,34,63,38,3,26,1672057,16,1310721,2,5,26,1310721,2, -5,26,2,9,26,2,10,3,6,10,4,8,1310721,2,5,26, -2,1,26,2,17,28,1,6,1,10,28,34,63,38,1,10, -28,1672407,16,1590585,2,1,6,1,10,28,34,63,38,3,26,1672181, -16,1587703,2,1,6,1,10,28,34,63,38,3,26,1,6,1, -10,28,34,63,38,1,10,28,1672183,14,1,1672351,16,1590587,12,8, -93,1573255,12,8,1310721,2,3,26,2,1573495,12,8,1672245,14,58,32, -116,104,97,116,39,115,32,97,32,0,1672221,1573495,12,8,1587699,2, -1641969,12,8,1672337,14,44,32,110,111,116,32,97,32,115,116,114, -117,99,116,32,111,114,32,97,32,112,111,105,110,116,101,114, -32,116,111,32,111,110,101,0,1672267,1573495,12,8,1590731,12,8,1587699, -1587687,2,10,3,6,10,4,8,1587587,3,10,3,6,10,4,8, -1587589,9,10,3,6,10,4,8,1,1672963,14,1310721,2,7,26,1310721, -2,5,26,2,1310721,2,3,26,2,1650397,12,10,3,6,10,4, -8,1310721,2,7,26,2,1,40,1672695,16,1590585,2,1,6,1,10, -28,34,63,38,3,26,1672547,16,1587703,2,1,6,1,10,28,34, -63,38,3,26,1,6,1,10,28,34,63,38,1,10,28,1672549, -14,1,1672639,16,1590587,12,8,1310721,2,5,26,2,1641969,12,8,1672609, -14,32,104,97,115,32,110,111,32,102,105,101,108,100,32,0, -1672579,1573495,12,8,1310721,2,3,26,2,1573495,12,8,1590731,12,8,1587699, -1587687,2,10,3,6,10,4,8,1587587,3,10,3,6,10,4,8, -1587589,9,10,3,6,10,4,8,1,1672963,14,1310721,2,5,26,2, -9,26,2,1310721,2,7,26,2,7,30,5,26,26,2,1672789,16, -1310721,2,5,26,2,9,26,2,1310721,2,7,26,2,7,30,5, -26,26,2,1594643,12,8,27,1594729,12,8,1587699,1310721,2,5,26,2, -9,26,2,1310721,2,7,26,2,7,30,3,26,26,2,10,3, -6,10,4,8,1587587,3,10,3,6,10,4,8,1587701,1,10,3, -6,10,4,8,1310721,2,9,26,2,1,40,3,36,1672939,16,1587589, -7,10,3,6,10,4,8,1587591,1310721,2,9,26,2,10,3,6, -10,4,8,1672955,14,1587589,9,10,3,6,10,4,8,1,1672963,14, -1,1310721,2,11,26,1310721,4,18,1310721,2,33,28,1310721,4,1310721,2, -1835009,40,1673011,16,1966081,1310721,4,1579223,12,1667847,12,1310721,2,4,3,1676731, -16,1585289,2,5,28,1,6,1,10,28,34,63,38,3,26,1673115, -16,1585291,2,1587647,2,28,1,6,1,10,28,34,63,38,3,26, -1,6,1,10,28,34,63,38,1,10,28,1673117,14,1,1673201,16, -1604999,12,8,1310721,2,7,26,1644591,12,10,3,6,10,4,8,1663385, -12,8,1587699,1310721,2,7,26,2,10,3,6,10,4,8,1587589,1, -10,3,6,10,4,8,1673021,14,1585289,2,9,28,1,6,1,10, -28,34,63,38,1,10,28,1673245,16,1310721,2,2,1676743,14,1585291,2, -1587607,2,28,1,6,1,10,28,34,63,38,3,26,1675947,16,1310721, -2,31,26,1,10,3,6,10,4,8,1587769,2,1673339,16,1587587,2, -1,6,1,10,28,34,63,38,1,10,28,1673341,14,1,1673399,16, -1587589,2,3,28,1,6,1,10,28,34,63,38,3,26,1,6, -1,10,28,34,63,38,1,10,28,1673401,14,1,1673441,16,1589487,1587591, -2,26,2,1,6,1,10,28,34,63,38,1,10,28,1673443,14, -1,1673477,16,1310721,2,31,26,1589487,1587591,2,26,2,10,3,6,10, -4,8,1604999,12,8,1663385,12,8,1310721,2,3,26,3,1,10,28, -10,3,6,10,4,8,1310721,2,2,3,28,1,6,1,10,28, -34,63,38,3,26,1673669,16,1673657,14,105,110,100,101,120,32,97, -32,110,101,119,32,111,98,106,101,99,116,32,111,110,108,121, -32,97,102,116,101,114,32,98,105,110,100,105,110,103,32,105, -116,32,116,111,32,97,32,110,97,109,101,0,1673555,1591845,12,8, -1673733,14,1310721,2,2,5,40,3,36,1673733,16,1310721,2,2,5,28, -1612545,12,8,1310721,2,3,26,1310721,2,2,5,28,10,3,6,10, -4,8,1587699,2,1,26,2,23,28,1,6,1,10,28,34,63, -38,3,26,1674921,16,1310721,2,9,26,1587699,2,9,26,2,10,3, -6,10,4,8,1310721,2,31,26,2,1673857,16,1587763,2,1593303,12,1, -40,3,36,1,6,1,10,28,34,63,38,1,10,28,1673859,14, -1,1673871,16,9,1594729,12,8,1310721,2,1681059,12,10,3,6,10,4, -8,1663385,12,8,1310721,2,2,1613033,12,8,1587699,2,1638689,12,1673927,16, -3,1673979,14,1587699,2,1587687,2,28,1,6,1,10,28,34,63,38, -3,26,1,6,1,10,28,34,63,38,1,10,28,1674039,14,97, -110,32,105,110,100,101,120,32,104,97,115,32,116,111,32,98, -101,32,97,32,110,117,109,98,101,114,0,1673983,1587699,2,1643625,12, -8,1587609,2,1606959,12,8,1310721,2,29,26,1587763,2,1593303,12,10,3, -6,10,4,8,1310721,2,31,26,2,1674147,16,1310721,2,29,26,2, -1,40,3,36,1,6,1,10,28,34,63,38,1,10,28,1674149, -14,1,1674219,16,1417729,1310721,2,29,26,2,26,2,13,28,1,6, -1,10,28,34,63,38,3,26,1,6,1,10,28,34,63,38, -1,10,28,1674221,14,1,1674501,16,1,1594643,12,8,7,1594729,12,8, -1310721,2,31,26,2,3,26,1595671,12,8,3,1594729,12,8,45,1425921, -1310721,2,29,26,2,26,2,26,1594729,12,8,1310721,2,29,26,1595029, -12,10,3,6,10,4,8,17,1594729,12,8,1310721,2,31,26,2, -3,26,1595671,12,8,3,1594729,12,8,1587767,2,1595409,12,8,1310721,2, -29,26,2,1587549,2,1594811,12,8,1310721,2,31,26,2,1595671,12,8, -3,1594729,12,8,11,1594729,12,8,1310721,2,9,26,2,1637519,12,3, -28,1,6,1,10,28,34,63,38,1,10,28,1674489,16,1310721,2, -9,26,2,1637519,12,1594643,12,8,31,1594729,12,8,27,1594729,12,8, -1674917,14,1587769,2,1674553,16,1310721,2,29,26,2,1,40,3,36,1, -6,1,10,28,34,63,38,1,10,28,1674555,14,1,1674625,16,1417729, -1310721,2,29,26,2,26,2,13,28,1,6,1,10,28,34,63, -38,3,26,1,6,1,10,28,34,63,38,1,10,28,1674627,14, -1,1674907,16,1,1594643,12,8,7,1594729,12,8,5,1594643,12,8,7, -1594729,12,8,3,1594729,12,8,45,1425921,1310721,2,29,26,2,26,2, -26,1594729,12,8,1310721,2,29,26,1595029,12,10,3,6,10,4,8, -17,1594729,12,8,3,1594643,12,8,7,1594729,12,8,3,1594729,12,8, -1587767,2,1595409,12,8,1310721,2,29,26,2,1587549,2,1594811,12,8,11, -1594729,12,8,5,1594643,12,8,27,1594729,12,8,3,1594729,12,8,11, -1594729,12,8,1310721,2,9,26,2,1637519,12,3,28,1,6,1,10, -28,34,63,38,1,10,28,1674895,16,1310721,2,9,26,2,1637519,12, -1594643,12,8,31,1594729,12,8,27,1594729,12,8,1674917,14,1590553,2,1595409, -12,8,1675787,14,1587699,2,1639085,12,1674939,16,3,1674991,14,1587699,2,1587687, -2,28,1,6,1,10,28,34,63,38,3,26,1,6,1,10, -28,34,63,38,1,10,28,1675075,14,111,110,108,121,32,112,111, -105,110,116,101,114,115,32,97,110,100,32,97,114,114,97,121, -115,32,99,97,110,32,98,101,32,105,110,100,101,120,101,100, -0,1674995,1587699,2,1643625,12,8,1310721,2,9,26,1587699,2,1639375,12,10, -3,6,10,4,8,1310721,2,5,26,1,3,28,10,3,6,10, -4,8,1587699,2,1,26,2,13,28,1,6,1,10,28,34,63, -38,3,26,1675221,16,1587699,2,7,26,2,1,10,40,1,6,1, -10,28,34,63,38,1,10,28,1675223,14,1,1675257,16,1310721,2,5, -26,1587699,2,7,26,2,10,3,6,10,4,8,1590561,1,10,3, -6,10,4,8,1310721,2,1681059,12,10,3,6,10,4,8,1663385,12, -8,1310721,2,2,1613033,12,8,1310721,2,5,26,2,1,40,3,36, -1675363,16,1590561,2,1,6,1,10,28,34,63,38,1,10,28,1675365, -14,1,1675455,16,1590563,2,1,40,1675387,16,3,1675429,14,1590563,2,1310721, -2,5,26,2,40,3,36,1,6,1,10,28,34,63,38,1, -10,28,1,6,1,10,28,34,63,38,1,10,28,1675457,14,1, -1675555,16,1675547,14,116,104,101,32,105,110,100,101,120,32,105,115, -32,111,117,116,32,111,102,32,114,97,110,103,101,32,102,111, -114,32,116,104,105,115,32,97,114,114,97,121,0,1675465,1591173,12, -8,1587699,2,1638689,12,1675573,16,3,1675625,14,1587699,2,1587687,2,28,1, -6,1,10,28,34,63,38,3,26,1,6,1,10,28,34,63, -38,1,10,28,1675685,14,97,110,32,105,110,100,101,120,32,104, -97,115,32,116,111,32,98,101,32,97,32,110,117,109,98,101, -114,0,1675629,1587699,2,1643625,12,8,1587609,2,1606959,12,8,1310721,2,9, -26,2,1637519,12,3,28,1,6,1,10,28,34,63,38,1,10, -28,1675779,16,1310721,2,9,26,2,1637519,12,1594643,12,8,31,1594729,12, -8,27,1594729,12,8,1587587,3,10,3,6,10,4,8,1587699,1310721,2, -9,26,2,10,3,6,10,4,8,1587701,1,10,3,6,10,4, -8,1310721,2,3,26,2,1,40,3,36,1675909,16,1587589,7,10,3, -6,10,4,8,1587591,1310721,2,3,26,2,10,3,6,10,4,8, -1675925,14,1587589,9,10,3,6,10,4,8,1310721,2,1,10,3,6, -10,4,8,1673021,14,1585291,2,1587637,2,28,1,6,1,10,28,34, -63,38,3,26,1675987,16,3,1676039,14,1585291,2,1587617,2,28,1,6, -1,10,28,34,63,38,3,26,1,6,1,10,28,34,63,38, -1,10,28,1676073,16,1310721,2,1310721,2,2,1671625,12,10,3,6,10, -4,8,1673021,14,1585291,2,1587599,2,28,1,6,1,10,28,34,63, -38,3,26,1676575,16,1663385,12,8,1310721,2,2,1613033,12,8,1310721,2, -11,26,1,10,3,6,10,4,8,1587699,2,1,26,2,15,28, -1,6,1,10,28,34,63,38,3,26,1676213,16,1310721,2,11,26, -1587699,2,10,3,6,10,4,8,1676317,14,1587699,2,1587687,2,28,1, -6,1,10,28,34,63,38,3,26,1676305,14,111,110,108,121,32, -102,117,110,99,116,105,111,110,115,32,99,97,110,32,98,101, -32,99,97,108,108,101,100,0,1676247,1587699,2,1643625,12,8,1310721,2, -13,26,1,17,1574703,12,8,1310721,2,5,26,1,1310721,2,11,26, -2,1310721,2,13,26,1587769,2,1663953,12,10,3,6,10,4,8,1310721, -2,5,26,2,1594643,12,8,7,1594729,12,8,13,1594729,12,8,11, -1594729,12,8,9,1594729,12,8,1587587,1,10,3,6,10,4,8,1587589, -1,10,3,6,10,4,8,1310721,2,1,10,3,6,10,4,8, -1587701,1,10,3,6,10,4,8,1587699,1587687,2,10,3,6,10,4, -8,1310721,2,11,26,2,1676571,16,1587699,1310721,2,11,26,2,9,26, -2,1310721,2,13,26,1637691,12,10,3,6,10,4,8,1673021,14,1585291, -2,1587619,2,28,1,6,1,10,28,34,63,38,3,26,1676643,16, -1604999,12,8,1310721,2,3,3,1670777,12,10,3,6,10,4,8,1673021, -14,1585291,2,1587621,2,28,1,6,1,10,28,34,63,38,3,26, -1676717,16,1604999,12,8,1310721,2,3,3,1,10,28,1670777,12,10,3, -6,10,4,8,1673021,14,1310721,2,2,1676743,14,1673021,14,1310721,2,2, -1676743,14,1,1310721,2,33,26,1310721,4,18,1310721,2,7,28,1310721,4, -1310721,2,1835009,40,1676791,16,1966081,1310721,4,1579223,12,1585289,2,5,28,1, -6,1,10,28,34,63,38,3,26,1677003,16,1585291,2,1587657,2,28, -1,6,1,10,28,34,63,38,3,26,1676863,16,3,1676915,14,1585291, -2,1587653,2,28,1,6,1,10,28,34,63,38,3,26,1,6, -1,10,28,34,63,38,1,10,28,1676925,16,3,1676977,14,1585291,2, -1587655,2,28,1,6,1,10,28,34,63,38,3,26,1,6,1, -10,28,34,63,38,1,10,28,1,6,1,10,28,34,63,38, -1,10,28,1677005,14,1,1677225,16,1310721,2,5,26,3,10,3,6, -10,4,8,1585291,2,1587657,2,28,1,6,1,10,28,34,63,38, -3,26,1677087,16,1310721,2,5,26,5,10,3,6,10,4,8,1585291, -2,1587655,2,28,1,6,1,10,28,34,63,38,3,26,1677143,16, -1310721,2,5,26,7,10,3,6,10,4,8,1604999,12,8,1587623,2, -1606959,12,8,1310721,2,1676757,12,10,3,6,10,4,8,1663385,12,8, -1587589,1,10,3,6,10,4,8,1310721,2,2,1310721,2,5,26,2, -1623945,12,1678623,14,1585289,2,9,28,1,6,1,10,28,34,63,38, -3,26,1678613,16,1585291,2,1587623,2,28,1,6,1,10,28,34,63, -38,3,26,1677591,16,1604999,12,8,1310721,2,1676757,12,10,3,6,10, -4,8,1663385,12,8,1310721,2,2,1613033,12,8,1587699,2,1,26,2, -11,28,1,6,1,10,28,34,63,38,3,26,1677379,16,3,1677431, -14,1587699,2,1587687,2,28,1,6,1,10,28,34,63,38,3,26, -1,6,1,10,28,34,63,38,1,10,28,1677503,14,111,110,108, -121,32,112,111,105,110,116,101,114,115,32,99,97,110,32,98, -101,32,100,101,114,101,102,101,114,101,110,99,101,100,0,1677435, -1587699,2,1643625,12,8,1587699,1587699,2,1639375,12,10,3,6,10,4,8, -1587587,3,10,3,6,10,4,8,1587589,9,10,3,6,10,4,8, -1587701,1,10,3,6,10,4,8,1,1678623,14,1585291,2,1587625,2,28, -1,6,1,10,28,34,63,38,3,26,1678107,16,1604999,12,8,1310721, -2,1676757,12,10,3,6,10,4,8,1587587,2,1,6,1,10,28, -34,63,38,3,26,1677733,16,1587699,2,1638921,12,1,6,1,10,28, -34,63,38,3,26,1,6,1,10,28,34,63,38,1,10,28, -1677735,14,1,1677811,16,1677803,14,38,32,110,101,101,100,115,32,115, -111,109,101,116,104,105,110,103,32,97,100,100,114,101,115,115, -97,98,108,101,0,1677743,1591557,12,8,1587587,2,1677873,16,1587589,2,3, -28,1,6,1,10,28,34,63,38,3,26,1,6,1,10,28, -34,63,38,1,10,28,1677875,14,1,1677919,16,1558017,1587591,2,26,2, -33,32,1,6,1,10,28,34,63,38,1,10,28,1677921,14,1, -1677997,16,1677989,14,97,110,32,111,51,32,118,97,114,105,97,98, -108,101,32,104,97,115,32,110,111,32,97,100,100,114,101,115, -115,0,1677929,1591173,12,8,1310721,2,2,5,40,3,36,1678031,16,1310721, -2,2,5,28,1612545,12,8,1587587,1,10,3,6,10,4,8,1587589, -1,10,3,6,10,4,8,1587701,1,10,3,6,10,4,8,1587699, -1587699,2,1632877,12,10,3,6,10,4,8,1,1678623,14,1585291,2,1587619, -2,28,1,6,1,10,28,34,63,38,3,26,1678165,16,1604999,12, -8,1676757,12,8,1,3,1670777,12,1678623,14,1585291,2,1587621,2,28,1, -6,1,10,28,34,63,38,3,26,1678229,16,1604999,12,8,1676757,12, -8,1,3,1,10,28,1670777,12,1678623,14,1310721,2,3,26,1585291,2, -1609683,12,10,3,6,10,4,8,1310721,2,3,26,2,1,40,3, -36,1678613,16,1604999,12,8,1310721,2,1676757,12,10,3,6,10,4,8, -1663385,12,8,1310721,2,2,1613033,12,8,1547329,1310721,2,3,26,2,26, -2,1547393,1310721,2,3,26,2,26,2,1608745,12,8,1590561,1,10,3, -6,10,4,8,1310721,2,3,26,2,3,10,40,3,36,1678423,16, -1587699,1587693,2,10,3,6,10,4,8,1678559,14,1587699,2,1587687,2,28, -1,6,1,10,28,34,63,38,1,10,28,1678559,16,1587699,2,1638689, -12,1678529,14,116,104,105,115,32,111,112,101,114,97,116,111,114, -32,110,101,101,100,115,32,97,32,110,117,109,98,101,114,0, -1678471,1587699,2,1643625,12,8,1587699,1587689,2,10,3,6,10,4,8,1587587, -1,10,3,6,10,4,8,1587589,1,10,3,6,10,4,8,1587701, -1,10,3,6,10,4,8,1,1678623,14,1672977,12,1678623,14,1,1310721, -2,7,26,1310721,4,18,1310721,2,15,28,1310721,4,1310721,2,1835009,40, -1678671,16,1966081,1310721,4,1579223,12,1310721,2,4,1676757,12,1310721,2,3,26, -4,1585289,2,9,28,1,6,1,10,28,34,63,38,3,26,1679633, -16,1310721,2,5,26,1585291,2,1609487,12,10,3,6,10,4,8,1310721, -2,5,26,2,1,40,1678783,16,1310721,2,3,26,2,1679649,14,1310721, -2,7,26,1546881,1310721,2,5,26,2,26,2,10,3,6,10,4, -8,1310721,2,7,26,2,1310721,2,2,40,1678855,16,1310721,2,3,26, -2,1679649,14,1604999,12,8,1663385,12,8,1310721,2,3,26,2,1613033,12, -8,1310721,2,13,26,1587699,2,10,3,6,10,4,8,1547137,1310721,2, -5,26,2,26,2,3,1,10,28,28,1,6,1,10,28,34, -63,38,3,26,1679155,16,1310721,2,9,26,1595029,12,10,3,6,10, -4,8,17,1594729,12,8,1310721,2,3,26,1310721,2,7,26,2,3, -26,1678637,12,10,3,6,10,4,8,1663385,12,8,1310721,2,3,26, -2,1613033,12,8,1547329,3,26,2,1547393,3,26,2,1608745,12,8,1310721, -2,11,26,1595029,12,10,3,6,10,4,8,15,1594729,12,8,1310721, -2,9,26,2,1587549,2,1594811,12,8,1,1594643,12,8,1310721,2,11, -26,2,1587549,2,1594811,12,8,1679501,14,1547137,1310721,2,5,26,2,26, -2,5,1,10,28,28,1,6,1,10,28,34,63,38,3,26, -1679403,16,1310721,2,9,26,1595029,12,10,3,6,10,4,8,17,1594729, -12,8,3,1594643,12,8,1310721,2,11,26,1595029,12,10,3,6,10, -4,8,15,1594729,12,8,1310721,2,9,26,2,1587549,2,1594811,12,8, -1310721,2,3,26,1310721,2,7,26,2,3,26,1678637,12,10,3,6, -10,4,8,1663385,12,8,1310721,2,3,26,2,1613033,12,8,1547329,3, -26,2,1547393,3,26,2,1608745,12,8,1310721,2,11,26,2,1587549,2, -1594811,12,8,1679501,14,1310721,2,3,26,1310721,2,7,26,2,3,26, -1678637,12,10,3,6,10,4,8,1663385,12,8,1310721,2,3,26,2, -1613033,12,8,1547009,1310721,2,5,26,2,26,2,1547137,1310721,2,5,26, -2,26,2,1608745,12,8,1587699,1310721,2,5,26,2,1310721,2,13,26, -2,1587699,2,1655517,12,10,3,6,10,4,8,1587587,1,10,3,6, -10,4,8,1587589,1,10,3,6,10,4,8,1310721,2,3,26,1, -10,3,6,10,4,8,1587701,1,10,3,6,10,4,8,1590561,1, -10,3,6,10,4,8,1678691,14,1310721,2,3,26,2,1679649,14,1, -1310721,2,15,26,1310721,4,18,1310721,2,1,28,1310721,4,1310721,2,1835009, -40,1679697,16,1966081,1310721,4,1579223,12,11,1594729,12,8,3,1594643,12,8, -7,1594729,12,8,11,1594729,12,8,5,1594729,12,8,1,1679745,14,1, -1310721,2,1,26,1310721,4,18,1310721,2,23,28,1310721,4,1310721,2,1835009, -40,1679793,16,1966081,1310721,4,1579223,12,1310721,2,4,1587569,2,1310721,2,13, -26,4,1587557,2,1310721,2,15,26,4,1663385,12,8,1310721,2,2,1613033, -12,8,1604999,12,8,1310721,2,3,26,1595029,12,10,3,6,10,4, -8,17,1594729,12,8,1310721,2,7,26,1615017,12,10,3,6,10,4, -8,1310721,2,17,26,1681059,12,10,3,6,10,4,8,1663385,12,8, -1310721,2,21,26,1587699,2,10,3,6,10,4,8,1310721,2,17,26, -2,3,28,1,6,1,10,28,34,63,38,1,10,28,1680017,16, -1310721,2,17,26,2,1613033,12,8,1310721,2,11,26,1587569,2,10,3, -6,10,4,8,1310721,2,9,26,1615017,12,10,3,6,10,4,8, -1310721,2,5,26,1595029,12,10,3,6,10,4,8,15,1594729,12,8, -1587627,2,1606959,12,8,1310721,2,3,26,2,1587549,2,1594811,12,8,1310721, -2,7,26,2,1615649,12,8,1587569,1310721,2,13,26,2,10,3,6, -10,4,8,1310721,2,19,26,1681059,12,10,3,6,10,4,8,1663385, -12,8,1310721,2,19,26,2,3,28,1,6,1,10,28,34,63, -38,1,10,28,1680253,16,1310721,2,19,26,2,1613033,12,8,1310721,2, -9,26,2,1310721,2,11,26,2,1310721,2,5,26,2,1587569,2,1310721, -2,15,26,2,1680391,14,101,110,100,115,32,116,104,101,32,116, -119,111,32,115,105,100,101,115,32,111,102,32,63,58,32,105, -110,32,100,105,102,102,101,114,101,110,116,32,115,116,97,116, -101,115,0,1680301,1623371,12,8,1310721,2,7,26,2,1615567,12,8,1310721, -2,21,26,2,1587699,2,1639563,12,1,6,1,10,28,34,63,38, -3,26,1680521,16,1587699,2,1310721,2,21,26,2,1639563,12,1,6,1, -10,28,34,63,38,3,26,1,6,1,10,28,34,63,38,1, -10,28,1680523,14,1,1680593,16,1680571,14,116,104,101,32,116,119,111, -32,115,105,100,101,115,32,111,102,32,63,58,0,1680531,1310721,2, -21,26,2,1587699,2,1643225,12,8,1310721,2,21,26,2,1587687,2,28, -1,6,1,10,28,34,63,38,1,10,28,1680659,16,1587699,1310721,2, -21,26,2,10,3,6,10,4,8,1587587,1,10,3,6,10,4, -8,1587589,1,10,3,6,10,4,8,1587701,1,10,3,6,10,4, -8,1310721,2,17,26,2,3,28,1,6,1,10,28,34,63,38, -3,26,1680805,16,1310721,2,19,26,2,3,28,1,6,1,10,28, -34,63,38,3,26,1,6,1,10,28,34,63,38,1,10,28, -1680807,14,1,1680817,16,3,1681045,14,1310721,2,17,26,2,3,28,1, -6,1,10,28,34,63,38,3,26,1680861,16,3,1680917,14,1310721,2, -19,26,2,3,28,1,6,1,10,28,34,63,38,3,26,1, -6,1,10,28,34,63,38,1,10,28,1681037,16,1681029,14,98,111, -116,104,32,115,105,100,101,115,32,111,102,32,63,58,32,104, -97,118,101,32,116,111,32,98,101,32,110,101,119,32,111,98, -106,101,99,116,115,44,32,111,114,32,110,101,105,116,104,101, -114,0,1680925,1591845,12,8,1,1681045,14,1,1310721,2,23,26,1310721,4, -18,1310721,2,13,28,1310721,4,1310721,2,1835009,40,1681093,16,1966081,1310721,4, -1579223,12,3,1678637,12,1310721,2,4,1585289,2,9,28,1,6,1,10, -28,34,63,38,1,10,28,1681149,16,1310721,2,2,1683407,14,1585291,2, -1587659,2,28,1,6,1,10,28,34,63,38,3,26,1681197,16,1310721, -2,2,1679759,12,1683407,14,1585291,2,1587615,2,28,1,6,1,10,28, -34,63,38,3,26,1682243,16,1587587,2,1,6,1,10,28,34,63, -38,3,26,1681323,16,1681315,14,116,104,105,115,32,99,97,110,39, -116,32,98,101,32,97,115,115,105,103,110,101,100,32,116,111, -0,1681263,1591557,12,8,1310721,2,3,26,1587589,2,10,3,6,10,4, -8,1310721,2,5,26,1587591,2,10,3,6,10,4,8,1310721,2,11, -26,1587699,2,10,3,6,10,4,8,1310721,2,11,26,2,1638921,12, -1681547,16,1681539,14,97,32,119,104,111,108,101,32,115,116,114,117, -99,116,32,111,114,32,97,114,114,97,121,32,99,97,110,39, -116,32,98,101,32,97,115,115,105,103,110,101,100,59,32,97, -115,115,105,103,110,32,105,116,115,32,102,105,101,108,100,115, -0,1681417,1591173,12,8,1604999,12,8,1310721,2,7,26,1587769,2,1681629,16, -1310721,2,3,26,2,3,28,1,6,1,10,28,34,63,38,3, -26,1,6,1,10,28,34,63,38,1,10,28,1681631,14,1,1681681, -16,1558017,1310721,2,5,26,2,26,2,33,32,1,6,1,10,28, -34,63,38,1,10,28,1681683,14,1,1681749,16,1473025,1310721,2,5,26, -2,26,2,1,6,1,10,28,34,63,38,3,26,1,6,1, -10,28,34,63,38,1,10,28,1681751,14,1,10,3,6,10,4, -8,1310721,2,7,26,2,1681785,16,9,1594729,12,8,1310721,2,9,26, -1681059,12,10,3,6,10,4,8,1663385,12,8,1310721,2,11,26,2, -1587699,2,1639563,12,1,6,1,10,28,34,63,38,3,26,1681905,16, -1681883,14,97,115,115,105,103,110,109,101,110,116,0,1681861,1310721,2, -11,26,2,1587699,2,1643225,12,8,1310721,2,7,26,2,1681979,16,1, -1594643,12,8,7,1594729,12,8,1310721,2,5,26,2,1595671,12,8,5, -1594729,12,8,1310721,2,5,26,2,1597105,12,8,1682133,14,1587769,2,1682049, -16,1310721,2,3,26,2,7,28,1,6,1,10,28,34,63,38, -1,10,28,1,6,1,10,28,34,63,38,1,10,28,1682051,14, -1,1682095,16,1310721,2,11,26,2,1658673,12,1,6,1,10,28,34, -63,38,1,10,28,1682097,14,1,1682127,16,1310721,2,11,26,2,1594643, -12,8,1590517,2,1595409,12,8,1679663,12,8,1587587,1,10,3,6,10, -4,8,1587589,1,10,3,6,10,4,8,1587699,1310721,2,11,26,2, -10,3,6,10,4,8,1587701,1,10,3,6,10,4,8,1310721,2, -3,26,2,1310721,2,5,26,2,1310721,2,9,26,2,1626785,12,1683407, -14,1310721,2,7,26,1585291,2,1609879,12,10,3,6,10,4,8,1310721, -2,7,26,2,1,40,3,36,1683395,16,1587587,2,1,6,1,10, -28,34,63,38,3,26,1682385,16,1682377,14,116,104,105,115,32,99, -97,110,39,116,32,98,101,32,97,115,115,105,103,110,101,100, -32,116,111,0,1682325,1591557,12,8,1587589,2,3,28,1,6,1,10, -28,34,63,38,3,26,1682447,16,1587565,2,1,6,1,10,28,34, -63,38,1,10,28,1682449,14,1,1682487,16,1587591,2,1612447,12,1,6, -1,10,28,34,63,38,1,10,28,1682489,14,1,1682609,16,1587591,2, -1682601,14,111,119,110,115,32,97,110,32,111,98,106,101,99,116, -59,32,99,111,109,112,111,117,110,100,32,97,115,115,105,103, -110,109,101,110,116,32,119,111,117,108,100,32,108,111,115,101, -32,105,116,0,1682501,1591963,12,8,1310721,2,11,26,1587699,2,10,3, -6,10,4,8,1604999,12,8,1310721,2,5,26,1587769,2,1682709,16,1587589, -2,3,28,1,6,1,10,28,34,63,38,3,26,1,6,1, -10,28,34,63,38,1,10,28,1682711,14,1,1682755,16,1558017,1587591,2, -26,2,33,32,1,6,1,10,28,34,63,38,1,10,28,1682757, -14,1,1682817,16,1473025,1587591,2,26,2,1,6,1,10,28,34,63, -38,3,26,1,6,1,10,28,34,63,38,1,10,28,1682819,14, -1,10,3,6,10,4,8,1310721,2,5,26,2,1682939,16,1310721,2, -5,26,1587591,2,10,3,6,10,4,8,9,1594729,12,8,1310721,2, -5,26,2,1595671,12,8,3,1594729,12,8,1310721,2,5,26,1310721,2, -5,26,2,3,26,10,3,6,10,4,8,1682963,14,1,1594643,12, -8,7,1594729,12,8,3,1594729,12,8,1587587,1,10,3,6,10,4, -8,1310721,2,9,26,1681059,12,10,3,6,10,4,8,1663385,12,8, -1310721,2,9,26,2,1613033,12,8,1547009,1547585,1310721,2,7,26,2,26, -2,26,2,1547137,1547585,1310721,2,7,26,2,26,2,26,2,1608745,12, -8,1310721,2,3,26,1547585,1310721,2,7,26,2,26,2,1310721,2,11, -26,2,1587699,2,1655517,12,10,3,6,10,4,8,1310721,2,11,26, -2,1310721,2,3,26,2,1639563,12,1,6,1,10,28,34,63,38, -3,26,1683249,16,1683221,14,99,111,109,112,111,117,110,100,32,97, -115,115,105,103,110,109,101,110,116,0,1683181,1310721,2,11,26,2, -1310721,2,3,26,2,1643225,12,8,1310721,2,5,26,2,1683311,16,1, -1594643,12,8,7,1594729,12,8,1310721,2,5,26,2,3,28,1595671,12, -8,5,1594729,12,8,1683317,14,1679663,12,8,1587587,1,10,3,6,10, -4,8,1587589,1,10,3,6,10,4,8,1587699,1310721,2,11,26,2, -10,3,6,10,4,8,1587701,1,10,3,6,10,4,8,1,1683407, -14,1310721,2,2,1683407,14,1,1310721,2,13,26,1310721,4,18,1310721,2, -3,28,1310721,4,1310721,2,1835009,40,1683455,16,1966081,1310721,4,1579223,12,1585289, -2,9,28,1,6,1,10,28,34,63,38,3,26,1683619,16,1585291, -2,1587613,2,28,1,6,1,10,28,34,63,38,3,26,1683527,16, -3,1683579,14,1585291,2,1587603,2,28,1,6,1,10,28,34,63,38, -3,26,1,6,1,10,28,34,63,38,1,10,28,1683589,16,3, -1683615,14,1646981,12,1,6,1,10,28,34,63,38,1,10,28,1683901, -14,1585289,2,5,28,1,6,1,10,28,34,63,38,1,10,28, -1683659,16,3,1683697,14,1585291,2,1611615,12,1,40,3,36,1,6,1, -10,28,34,63,38,1,10,28,1683707,16,1,1683901,14,1646981,12,1683721, -16,3,1683901,14,1310721,2,1585291,2,1593303,12,10,3,6,10,4,8, -1310721,2,2,1,40,3,36,1683825,16,1417729,1310721,2,2,26,2,11, -28,1,6,1,10,28,34,63,38,3,26,1,6,1,10,28, -34,63,38,1,10,28,1683827,14,1,1683893,16,1442305,1310721,2,2,26, -2,33,32,1,6,1,10,28,34,63,38,3,26,1,6,1, -10,28,34,63,38,1,10,28,1683895,14,1,1683901,14,1,1310721,2, -3,26,1310721,4,18,1310721,2,9,28,1310721,4,1310721,2,1835009,40,1683949, -16,1966081,1310721,4,1579223,12,1587557,2,1310721,2,4,1,1310721,2,3,26, -4,1,1310721,2,5,26,4,1587689,2,1310721,2,7,26,4,1604999,12, -8,1587561,1,6,2,1,6,3,26,5,6,4,10,8,8,1587571, -1,6,2,1,6,3,26,5,6,4,10,8,8,1587605,2,1606425, -12,1,6,1,10,28,34,63,38,3,26,1684431,16,1585289,2,1, -28,1,6,1,10,28,34,63,38,3,26,1684155,16,1684147,14,109, -105,115,115,105,110,103,32,125,0,1684127,1591557,12,8,1683421,12,1684173, -16,1686451,12,8,1684059,14,1310721,2,3,26,1681059,12,10,3,6,10, -4,8,1663385,12,8,1587613,2,1606729,12,1684265,16,9,1594729,12,8,1310721, -2,3,26,2,1632069,12,8,1310721,2,3,26,1,10,3,6,10, -4,8,1684059,14,1587605,2,1606425,12,1,6,1,10,28,34,63,38, -3,26,1684381,16,1684373,14,101,120,112,101,99,116,101,100,32,59, -32,111,114,32,125,32,97,102,116,101,114,32,97,110,32,101, -120,112,114,101,115,115,105,111,110,0,1684301,1591557,12,8,1310721,2, -5,26,3,10,3,6,10,4,8,1310721,2,7,26,1587699,2,10, -3,6,10,4,8,1684059,14,1604999,12,8,1310721,2,5,26,2,1684489, -16,1310721,2,3,26,1310721,2,3,26,2,1631353,12,10,3,6,10, -4,8,1684497,14,1,1594643,12,8,1310721,2,2,1614445,12,8,1587561,1, -6,2,1,6,-1,26,5,6,4,10,8,8,1587571,1,6,2, -1,6,-1,26,5,6,4,10,8,8,1587587,1,10,3,6,10, -4,8,1587589,1,10,3,6,10,4,8,1587699,1310721,2,7,26,2, -10,3,6,10,4,8,1587701,1,10,3,6,10,4,8,1310721,2, -3,26,2,1684653,14,1,1310721,2,9,26,1310721,4,18,1310721,2,5, -28,1310721,4,1310721,2,1835009,40,1684701,16,1966081,1310721,4,1579223,12,1585289,2, -3,28,1,6,1,10,28,34,63,38,3,26,1684769,16,1310721,2, -1585291,2,10,3,6,10,4,8,1604999,12,8,1310721,2,2,1685469,14, -1587631,2,1606729,12,1684793,16,1,1684667,12,28,1685469,14,1585289,2,9,28, -1,6,1,10,28,34,63,38,3,26,1684885,16,1585291,2,1547265,5, -26,2,28,1,6,1,10,28,34,63,38,3,26,1,6,1, -10,28,34,63,38,1,10,28,1684887,14,1,1684909,16,1604999,12,8, -1684667,12,-1,36,1685469,14,1587599,2,1606729,12,1684961,16,1310721,2,1685483,12, -10,3,6,10,4,8,1587601,2,1606959,12,8,1310721,2,2,1685469,14, -1585289,2,5,28,1,6,1,10,28,34,63,38,3,26,1685409,16, -1310721,2,3,26,1585291,2,1593303,12,10,3,6,10,4,8,1310721,2, -3,26,2,1,40,3,36,1685377,16,1417729,1310721,2,3,26,2,26, -2,9,28,1,6,1,10,28,34,63,38,3,26,1685093,16,3, -1685155,14,1417729,1310721,2,3,26,2,26,2,7,28,1,6,1,10, -28,34,63,38,3,26,1,6,1,10,28,34,63,38,1,10, -28,1685165,16,3,1685279,14,1417729,1310721,2,3,26,2,26,2,3,28, -1,6,1,10,28,34,63,38,3,26,1685255,16,1442305,1310721,2,3, -26,2,26,2,3,32,1,6,1,10,28,34,63,38,1,10, -28,1685257,14,1,1,6,1,10,28,34,63,38,1,10,28,1685289, -16,3,1685351,14,1417729,1310721,2,3,26,2,26,2,5,28,1,6, -1,10,28,34,63,38,3,26,1,6,1,10,28,34,63,38, -1,10,28,1,6,1,10,28,34,63,38,1,10,28,1685379,14, -1,1685409,16,1604999,12,8,1425921,1310721,2,3,26,2,26,2,1685469,14, -1685453,14,101,120,112,101,99,116,101,100,32,97,32,99,111,110, -115,116,97,110,116,0,1685413,1591557,12,8,1,1685469,14,1,1310721,2, -5,26,1310721,4,18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1685517, -16,1966081,1310721,4,1579223,12,1684667,12,1310721,2,4,1585289,2,9,28,1, -6,1,10,28,34,63,38,3,26,1686171,16,1310721,2,3,26,1585291, -2,10,3,6,10,4,8,1310721,2,3,26,2,1546753,7,26,2, -28,1,6,1,10,28,34,63,38,3,26,1685665,16,1604999,12,8, -1310721,2,1310721,2,2,1684667,12,26,10,3,6,10,4,8,1686167,14, -1310721,2,3,26,2,1546753,9,26,2,28,1,6,1,10,28,34, -63,38,3,26,1685747,16,1604999,12,8,1310721,2,1310721,2,2,1684667,12, -28,10,3,6,10,4,8,1686167,14,1310721,2,3,26,2,1546753,1, -26,2,28,1,6,1,10,28,34,63,38,3,26,1685829,16,1604999, -12,8,1310721,2,1310721,2,2,1684667,12,30,10,3,6,10,4,8, -1686167,14,1310721,2,3,26,2,1546753,31,26,2,28,1,6,1,10, -28,34,63,38,3,26,1685911,16,1604999,12,8,1310721,2,1310721,2,2, -1684667,12,34,10,3,6,10,4,8,1686167,14,1310721,2,3,26,2, -1546753,27,26,2,28,1,6,1,10,28,34,63,38,3,26,1685993, -16,1604999,12,8,1310721,2,1310721,2,2,1684667,12,32,10,3,6,10, -4,8,1686167,14,1310721,2,3,26,2,1546753,11,26,2,28,1,6, -1,10,28,34,63,38,3,26,1686075,16,1604999,12,8,1310721,2,1310721, -2,2,1684667,12,48,10,3,6,10,4,8,1686167,14,1310721,2,3, -26,2,1546753,13,26,2,28,1,6,1,10,28,34,63,38,3, -26,1686157,16,1604999,12,8,1310721,2,1310721,2,2,1684667,12,38,10,3, -6,10,4,8,1686167,14,1310721,2,2,1686183,14,1685527,14,1310721,2,2, -1686183,14,1,1310721,2,5,26,1310721,4,18,1310721,2,1,28,1310721,4, -1310721,2,1835009,40,1686231,16,1966081,1310721,4,1579223,12,1585289,2,1,28,1, -6,1,10,28,34,63,38,1,10,28,1686319,16,1587613,2,1606425,12, -1,6,1,10,28,34,63,38,3,26,1,6,1,10,28,34, -63,38,1,10,28,1686321,14,1,1686379,16,1587605,2,1606425,12,1,6, -1,10,28,34,63,38,3,26,1,6,1,10,28,34,63,38, -1,10,28,1686381,14,1,1686395,16,1604999,12,8,1686231,14,1587613,2,1606425, -12,1686413,16,1604999,12,8,1590585,1,10,3,6,10,4,8,1,1686437, -14,1,1310721,2,1,26,1310721,4,18,1310721,2,5,28,1310721,4,1310721, -2,1835009,40,1686485,16,1966081,1310721,4,1579223,12,1590585,2,1686501,16,1686197,12, -1686973,14,1585289,2,5,28,1,6,1,10,28,34,63,38,3,26, -1686571,16,1585291,2,1611615,12,1,40,1,6,1,10,28,34,63,38, -1,10,28,1686573,14,1,1686755,16,1310721,2,1585291,2,1593303,12,10,3, -6,10,4,8,1310721,2,2,1,40,3,36,1686681,16,1417729,1310721,2, -2,26,2,11,28,1,6,1,10,28,34,63,38,3,26,1, -6,1,10,28,34,63,38,1,10,28,1686683,14,1,1686729,16,1442305, -1310721,2,2,26,2,17,32,1,6,1,10,28,34,63,38,1, -10,28,1686731,14,1,1686755,16,1310721,2,2,1,1663505,12,8,1,1686973, -14,1646981,12,1686777,16,3,1687403,12,8,1,1686973,14,1585289,2,9,28, -1,6,1,10,28,34,63,38,3,26,1686901,16,1585291,2,1587613,2, -28,1,6,1,10,28,34,63,38,3,26,1686855,16,1604999,12,8, -1,1686973,14,1585291,2,1587603,2,28,1,6,1,10,28,34,63,38, -3,26,1686901,16,1686987,12,8,1,1686973,14,1310721,2,3,26,1681059,12, -10,3,6,10,4,8,1663385,12,8,9,1594729,12,8,1587613,2,1606959, -12,8,1310721,2,3,26,2,1632069,12,8,1,1686973,14,1,1310721,2, -5,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1687021, -16,1966081,1310721,4,1579223,12,1587557,2,1310721,2,4,1587603,2,1606959,12,8, -1587561,1,6,2,1,6,3,26,5,6,4,10,8,8,1587605,2, -1606425,12,1,6,1,10,28,34,63,38,3,26,1687175,16,1585289,2, -1,28,1,6,1,10,28,34,63,38,3,26,1687165,16,1687157,14, -109,105,115,115,105,110,103,32,125,0,1687137,1591557,12,8,1686451,12, -8,1687069,14,1310721,2,2,1614445,12,8,1604999,12,8,1587561,1,6,2, -1,6,-1,26,5,6,4,10,8,8,1,1687229,14,1,1310721,2, -3,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1687277, -16,1966081,1310721,4,1579223,12,1587557,2,1310721,2,4,1587603,2,1606425,12,1687307, -16,1686987,12,1687389,14,1587561,1,6,2,1,6,3,26,5,6,4, -10,8,8,1686451,12,8,1310721,2,2,1614445,12,8,1587561,1,6,2, -1,6,-1,26,5,6,4,10,8,8,1,1687389,14,1,1310721,2, -3,26,1310721,4,18,1310721,2,15,28,1310721,4,1310721,2,1835009,40,1687437, -16,1966081,1310721,4,1579223,12,1310721,2,4,1,1310721,2,11,26,4,1, -1310721,2,13,26,4,1310721,2,2,1687633,16,1647783,12,8,1310721,2,11, -26,1587725,2,10,3,6,10,4,8,1310721,2,13,26,1587727,2,10, -3,6,10,4,8,1310721,2,11,26,2,1587695,2,28,1,6,1, -10,28,34,63,38,3,26,1687633,16,1687625,14,97,32,118,97,114, -105,97,98,108,101,32,99,97,110,39,116,32,98,101,32,118, -111,105,100,0,1687575,1591173,12,8,1587769,2,1687647,16,3,1687673,14,1587773, -2,1,6,1,10,28,34,63,38,1,10,28,1687729,16,1310721,2, -2,1,6,1,10,28,34,63,38,3,26,1,6,1,10,28, -34,63,38,1,10,28,1687731,14,1,1687797,16,1687789,14,111,51,32, -118,97,114,105,97,98,108,101,115,32,110,101,101,100,32,97, -32,116,121,112,101,0,1687739,1591173,12,8,3,1688939,16,1310721,2,3, -26,1607249,12,10,3,6,10,4,8,1310721,2,5,26,1310721,2,3, -26,2,1611819,12,10,3,6,10,4,8,1558017,1310721,2,5,26,2, -26,1310721,2,13,26,2,10,3,6,10,4,8,1587769,2,1687911,16, -3,1687937,14,1587773,2,1,6,1,10,28,34,63,38,1,10,28, -1687981,16,1558017,1310721,2,5,26,2,26,1310721,2,13,26,2,33,34, -10,3,6,10,4,8,1587607,2,1606729,12,1688207,16,1310721,2,9,26, -1685483,12,10,3,6,10,4,8,1587609,2,1606959,12,8,1310721,2,11, -26,2,1,6,1,10,28,34,63,38,3,26,1688085,16,1310721,2, -11,26,1587687,2,10,3,6,10,4,8,1473025,1310721,2,5,26,2, -26,3,10,3,6,10,4,8,1556993,1310721,2,5,26,2,26,1310721, -2,11,26,2,1310721,2,9,26,2,1633251,12,10,3,6,10,4, -8,1587563,1587563,2,1556993,1310721,2,5,26,2,26,2,1637519,12,26,10, -3,6,10,4,8,1688487,14,1310721,2,11,26,2,1688261,16,1310721,2, -11,26,2,1638921,12,1,6,1,10,28,34,63,38,1,10,28, -1688263,14,1,1688369,16,1473025,1310721,2,5,26,2,26,3,10,3,6, -10,4,8,1556993,1310721,2,5,26,2,26,1310721,2,11,26,2,10, -3,6,10,4,8,1587563,1587563,2,1310721,2,11,26,2,1637519,12,26, -10,3,6,10,4,8,1688487,14,1587563,1,6,2,1,6,3,26, -5,6,4,10,8,8,1310721,2,11,26,2,1688447,16,1556993,1310721,2, -5,26,2,26,1310721,2,11,26,2,10,3,6,10,4,8,1587769, -2,1688487,16,1310721,2,5,26,2,1596201,12,8,1310721,2,5,26,2, -1596641,12,8,1587615,2,1606729,12,1688899,16,1473025,1310721,2,5,26,2,26, -2,1688629,16,1688621,14,97,110,32,97,114,114,97,121,32,111,114, -32,97,32,115,116,114,117,99,116,32,99,97,110,39,116,32, -98,101,32,105,110,105,116,105,97,108,105,122,101,100,32,119, -105,116,104,32,61,0,1688523,1591173,12,8,1310721,2,7,26,1681059,12, -10,3,6,10,4,8,1663385,12,8,1310721,2,5,26,2,1595671,12, -8,5,1594729,12,8,1310721,2,5,26,2,1597105,12,8,1310721,2,11, -26,2,1688809,16,1310721,2,11,26,2,1587699,2,1639563,12,1,6,1, -10,28,34,63,38,3,26,1688805,16,1688783,14,105,110,105,116,105, -97,108,105,122,101,114,0,1688759,1310721,2,11,26,2,1587699,2,1643225, -12,8,1688871,14,1587699,2,1638689,12,1,6,1,10,28,34,63,38, -3,26,1688871,16,1556993,1310721,2,5,26,2,26,1587699,2,10,3,6, -10,4,8,3,1310721,2,5,26,2,1310721,2,7,26,2,1626785,12, -8,1587611,2,1606729,12,1,6,1,10,28,34,63,38,3,26,1688935, -16,1688939,14,1687797,14,1587613,2,1606959,12,8,1,1688957,14,1,1310721,2, -15,26,1310721,4,18,1310721,2,1,28,1310721,4,1310721,2,1835009,40,1689005, -16,1966081,1310721,4,1579223,12,1663797,12,8,1604999,12,8,1,1687403,12,1689029, -14,1,1310721,2,1,26,1310721,4,18,1310721,2,21,28,1310721,4,1310721, -2,1835009,40,1689077,16,1966081,1310721,4,1579223,12,1587557,2,1310721,2,15,26, -4,1663797,12,8,1604999,12,8,1587599,2,1606959,12,8,1310721,2,5,26, -1681059,12,10,3,6,10,4,8,1663385,12,8,1310721,2,5,26,2, -1613033,12,8,1587601,2,1606959,12,8,1310721,2,1595029,12,10,3,6,10, -4,8,17,1594729,12,8,1310721,2,11,26,1587569,2,10,3,6,10, -4,8,1310721,2,7,26,1615017,12,10,3,6,10,4,8,1687243,12, -8,1310721,2,13,26,1587569,2,10,3,6,10,4,8,1310721,2,9, -26,1615017,12,10,3,6,10,4,8,1587645,2,1606577,12,1689565,16,1604999, -12,8,1310721,2,3,26,1595029,12,10,3,6,10,4,8,15,1594729, -12,8,1310721,2,2,1587549,2,1594811,12,8,1310721,2,7,26,2,1615649, -12,8,1587569,1310721,2,11,26,2,10,3,6,10,4,8,1687243,12, -8,1310721,2,9,26,2,1310721,2,13,26,2,1310721,2,3,26,2, -1587569,2,1310721,2,15,26,2,1689553,14,101,110,100,115,32,116,104, -101,32,98,114,97,110,99,104,101,115,32,111,102,32,97,110, -32,105,102,32,105,110,32,100,105,102,102,101,114,101,110,116, -32,115,116,97,116,101,115,0,1689459,1623371,12,8,1690097,14,1618015,1, -10,3,6,10,4,8,1310721,2,13,26,2,1689615,16,1507841,1310721,2, -9,26,2,26,1618983,12,8,1310721,2,11,26,2,1689649,16,1507841,1310721, -2,7,26,2,26,1618983,12,8,1310721,2,15,26,2,1689757,14,101, -110,100,115,32,116,104,101,32,98,114,97,110,99,104,101,115, -32,111,102,32,97,110,32,105,102,32,105,110,32,100,105,102, -102,101,114,101,110,116,32,115,116,97,116,101,115,0,1689663,1619711, -12,8,1310721,2,13,26,2,1689811,16,1507841,1310721,2,9,26,2,26, -1310721,2,15,26,2,3,1621295,12,8,1310721,2,17,26,1,10,3, -6,10,4,8,1310721,2,11,26,2,1689897,16,1310721,2,17,26,1507841, -1310721,2,7,26,2,26,1310721,2,15,26,2,1,1621295,12,10,3, -6,10,4,8,1310721,2,17,26,2,1690015,16,1310721,2,19,26,1595029, -12,10,3,6,10,4,8,15,1594729,12,8,1310721,2,2,1587549,2, -1594811,12,8,1507841,1310721,2,7,26,2,26,1310721,2,15,26,2,3, -1621295,12,8,1310721,2,19,26,2,1587549,2,1594811,12,8,1690031,14,1310721, -2,2,1587549,2,1594811,12,8,1587569,1310721,2,13,26,2,1690053,16,3, -1690085,14,1310721,2,11,26,2,1,6,1,10,28,34,63,38,1, -10,28,10,3,6,10,4,8,1310721,2,7,26,2,1615567,12,8, -1,1690121,14,1,1310721,2,21,26,1310721,4,18,1310721,2,7,28,1310721, -4,1310721,2,1835009,40,1690169,16,1966081,1310721,4,1579223,12,1310721,2,3,26, -4,1310721,2,4,1552897,1587579,2,17,30,26,1310721,2,5,26,4,1587579, -2,121,40,3,36,1690283,16,1690275,14,108,111,111,112,115,32,110, -101,115,116,101,100,32,116,111,111,32,100,101,101,112,108,121, -0,1690227,1591079,12,8,1310721,2,5,26,2,1,26,1310721,2,2,10, -3,6,10,4,8,1310721,2,5,26,2,3,26,1,10,3,6, -10,4,8,1310721,2,5,26,2,5,26,1587561,2,10,3,6,10, -4,8,1310721,2,5,26,2,7,26,1310721,2,3,26,2,10,3, -6,10,4,8,1310721,2,5,26,2,9,26,1587571,2,10,3,6, -10,4,8,1310721,2,5,26,2,11,26,1587557,2,10,3,6,10, -4,8,1310721,2,5,26,2,13,26,1617885,2,10,3,6,10,4, -8,1587579,1,6,2,1,6,3,26,5,6,4,10,8,8,1, -1690535,14,1,1310721,2,7,26,1310721,4,18,1310721,2,15,28,1310721,4, -1310721,2,1835009,40,1690583,16,1966081,1310721,4,1579223,12,1310721,2,3,26,4, -1310721,2,4,1,1310721,2,13,26,4,1587579,1,6,2,1,6,-1, -26,5,6,4,10,8,8,1310721,2,5,26,1552897,1587579,2,17,30, -26,10,3,6,10,4,8,1310721,2,11,26,1310721,2,5,26,2, -11,26,2,10,3,6,10,4,8,1618015,1,10,3,6,10,4, -8,1310721,2,3,26,2,1,40,3,36,1690765,16,1507841,1310721,2,3, -26,2,26,1618983,12,8,1310721,2,7,26,1567233,1310721,2,5,26,2, -13,26,2,26,10,3,6,10,4,8,1310721,2,9,26,1567233,1617885, -2,26,10,3,6,10,4,8,1310721,2,7,26,2,1310721,2,9, -26,2,40,1690957,16,1310721,2,7,26,2,3,26,1618983,12,8,1310721, -2,7,26,1310721,2,7,26,2,7,26,7,1310721,2,7,26,2, -5,26,2,1310721,2,7,26,2,3,26,2,28,30,26,10,3, -6,10,4,8,1690833,14,1310721,2,11,26,2,1691081,14,108,101,97, -118,101,115,32,116,104,101,32,108,111,111,112,32,105,110,32, -100,105,102,102,101,114,101,110,116,32,115,116,97,116,101,115, -32,111,110,32,100,105,102,102,101,114,101,110,116,32,112,97, -116,104,115,0,1690971,1619711,12,8,1587569,1618015,2,1,10,40,10,3, -6,10,4,8,1310721,2,7,26,1567233,1310721,2,5,26,2,13,26, -2,26,10,3,6,10,4,8,1310721,2,7,26,2,1310721,2,9, -26,2,40,1691449,16,1310721,2,7,26,2,3,26,1310721,2,11,26, -2,1,1621295,12,1691321,16,1310721,2,7,26,2,1,26,2,1587549,2, -1594811,12,8,1310721,2,7,26,2,3,26,1310721,2,11,26,2,3, -1621295,12,8,1310721,2,13,26,1595029,12,1310721,2,13,26,2,1593879,12, -10,3,6,10,4,8,15,1594729,12,8,1691371,14,1310721,2,13,26, -1310721,2,7,26,2,1,26,2,1310721,2,13,26,2,1593879,12,10, -3,6,10,4,8,1310721,2,7,26,1310721,2,7,26,2,7,26, -7,1310721,2,7,26,2,5,26,2,1310721,2,7,26,2,3,26, -2,28,30,26,10,3,6,10,4,8,1691153,14,1310721,2,2,1, -40,3,36,1691483,16,1310721,2,2,1587549,2,1594811,12,8,1310721,2,3, -26,2,1,40,3,36,1691537,16,1507841,1310721,2,3,26,2,26,1310721, -2,11,26,2,3,1621295,12,8,1310721,2,13,26,2,1587549,2,1594231, -12,8,1617885,1310721,2,5,26,2,13,26,2,10,3,6,10,4, -8,1,1691595,14,1,1310721,2,15,26,1310721,4,18,1310721,2,13,28, -1310721,4,1310721,2,1835009,40,1691643,16,1966081,1310721,4,1579223,12,1587549,2,1310721, -2,4,3,1,10,28,1310721,2,7,26,4,1,1310721,2,11,26, -4,1663797,12,8,1604999,12,8,1310721,2,5,26,1615017,12,10,3,6, -10,4,8,1587599,2,1606959,12,8,1585289,2,3,28,1,6,1,10, -28,34,63,38,3,26,1691791,16,1585291,2,1,6,1,10,28,34, -63,38,1,10,28,1691793,14,1,1691919,16,1605859,12,8,1587511,2,9, -28,1,6,1,10,28,34,63,38,3,26,1691891,16,1587513,2,1587601, -2,28,1,6,1,10,28,34,63,38,3,26,1,6,1,10, -28,34,63,38,1,10,28,1691893,14,1,1691919,16,1310721,2,11,26, -3,10,3,6,10,4,8,1310721,2,9,26,1681059,12,10,3,6, -10,4,8,1663385,12,8,1310721,2,9,26,2,1613033,12,8,1587601,2, -1606959,12,8,1310721,2,3,26,1595029,12,10,3,6,10,4,8,17, -1594729,12,8,1310721,2,11,26,2,1,6,1,10,28,34,63,38, -3,26,1692071,16,1587569,2,1,6,1,10,28,34,63,38,1,10, -28,1692073,14,1,1692101,16,1310721,2,7,26,1615017,12,10,3,6,10, -4,8,1310721,2,2,1310721,2,5,26,2,1690135,12,8,1687243,12,8, -1310721,2,5,26,2,1621789,12,8,1310721,2,2,1594947,12,8,1310721,2, -3,26,2,1310721,2,7,26,2,1690549,12,8,1310721,2,5,26,2, -1615567,12,8,1,1692207,14,1,1310721,2,13,26,1310721,4,18,1310721,2, -19,28,1310721,4,1310721,2,1835009,40,1692255,16,1966081,1310721,4,1579223,12,1587557, -2,1310721,2,4,3,1,10,28,1310721,2,5,26,4,1,1310721,2, -17,26,4,1663797,12,8,1604999,12,8,1587599,2,1606959,12,8,1587561,1, -6,2,1,6,3,26,5,6,4,10,8,8,1587641,2,1606577,12, -1692367,16,1688971,12,8,1692483,14,1646981,12,1692387,16,3,1687403,12,8,1692483, -14,1587613,2,1606425,12,1,6,1,10,28,34,63,38,3,26,1692473, -16,1310721,2,15,26,1681059,12,10,3,6,10,4,8,1663385,12,8, -9,1594729,12,8,1310721,2,15,26,2,1632069,12,8,1587613,2,1606959,12, -8,1310721,2,3,26,1615017,12,10,3,6,10,4,8,1310721,2,7, -26,1587549,2,10,3,6,10,4,8,1587613,2,1606425,12,1,6,1, -10,28,34,63,38,3,26,1692803,16,1585289,2,3,28,1,6,1, -10,28,34,63,38,3,26,1692625,16,1585291,2,1,6,1,10,28, -34,63,38,1,10,28,1692627,14,1,1692753,16,1605859,12,8,1587511,2, -9,28,1,6,1,10,28,34,63,38,3,26,1692725,16,1587513,2, -1587613,2,28,1,6,1,10,28,34,63,38,3,26,1,6,1, -10,28,34,63,38,1,10,28,1692727,14,1,1692753,16,1310721,2,17, -26,3,10,3,6,10,4,8,1310721,2,15,26,1681059,12,10,3, -6,10,4,8,1663385,12,8,1310721,2,15,26,2,1613033,12,8,1692833, -14,3,1594643,12,8,1310721,2,17,26,3,10,3,6,10,4,8, -1587613,2,1606959,12,8,1310721,2,9,26,1595029,12,10,3,6,10,4, -8,17,1594729,12,8,1310721,2,17,26,2,1,6,1,10,28,34, -63,38,3,26,1692939,16,1587569,2,1,6,1,10,28,34,63,38, -1,10,28,1692941,14,1,1692969,16,1310721,2,5,26,1615017,12,10,3, -6,10,4,8,1310721,2,11,26,1595029,12,10,3,6,10,4,8, -15,1594729,12,8,1310721,2,13,26,1587549,2,10,3,6,10,4,8, -1587601,2,1606425,12,1,6,1,10,28,34,63,38,3,26,1693111,16, -1310721,2,15,26,1681059,12,10,3,6,10,4,8,1663385,12,8,9, -1594729,12,8,1310721,2,15,26,2,1632069,12,8,1587601,2,1606959,12,8, -1310721,2,7,26,2,1594947,12,8,1310721,2,11,26,2,1587549,2,1594811, -12,8,1310721,2,13,26,2,1310721,2,3,26,2,1690135,12,8,1687243, -12,8,1310721,2,3,26,2,1621789,12,8,1310721,2,13,26,2,1594947, -12,8,1310721,2,9,26,2,1310721,2,5,26,2,1690549,12,8,1310721, -2,3,26,2,1615567,12,8,1310721,2,2,1614445,12,8,1587561,1,6, -2,1,6,-1,26,5,6,4,10,8,8,1,1693311,14,1,1310721, -2,19,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40, -1693359,16,1966081,1310721,4,1579223,12,1663797,12,8,1604999,12,8,1587613,2,1606959, -12,8,1587579,2,1587581,2,10,40,3,36,1693485,16,1693471,14,98,114, -101,97,107,32,111,117,116,115,105,100,101,32,97,32,108,111, -111,112,32,111,114,32,97,32,115,119,105,116,99,104,0,1693405, -1591173,12,8,1,1693737,14,1310721,2,1552897,1587579,2,3,28,17,30,26, -10,3,6,10,4,8,1310721,2,2,9,26,2,1587571,2,28,1, -6,1,10,28,34,63,38,1,10,28,1693653,16,1693639,14,98,114, -101,97,107,32,99,97,110,39,116,32,108,101,97,118,101,32, -97,32,98,108,111,99,107,32,101,120,112,114,101,115,115,105, -111,110,0,1693565,1591173,12,8,1,1693737,14,1310721,2,2,5,26,2, -3,26,1,1613419,12,8,1587569,2,1693699,16,1595029,12,1618391,12,8,1693705, -14,1595029,12,8,15,1594729,12,8,1587569,1,10,3,6,10,4,8, -1,1693737,14,1,1310721,2,3,26,1310721,4,18,1310721,2,5,28,1310721, -4,1310721,2,1835009,40,1693785,16,1966081,1310721,4,1579223,12,1587579,2,3,28, -1310721,2,4,1663797,12,8,1604999,12,8,1587613,2,1606959,12,8,1310721,2, -2,1587581,2,40,3,36,1693913,16,1552897,1310721,2,2,17,30,26,2, -3,1,10,28,28,1,6,1,10,28,34,63,38,3,26,1, -6,1,10,28,34,63,38,1,10,28,1693915,14,1,1693953,16,1310721, -2,1,6,2,1,6,-1,26,5,6,4,10,8,8,1693821,14, -1310721,2,2,1587581,2,40,1694035,16,1694021,14,99,111,110,116,105,110, -117,101,32,111,117,116,115,105,100,101,32,97,32,108,111,111, -112,0,1693973,1591173,12,8,1,1694311,14,1310721,2,3,26,1552897,1310721,2, -2,17,30,26,10,3,6,10,4,8,1310721,2,3,26,2,9, -26,2,1587571,2,28,1,6,1,10,28,34,63,38,1,10,28, -1694215,16,1694201,14,99,111,110,116,105,110,117,101,32,99,97,110, -39,116,32,108,101,97,118,101,32,97,32,98,108,111,99,107, -32,101,120,112,114,101,115,115,105,111,110,0,1694121,1591173,12,8, -1,1694311,14,1310721,2,3,26,2,7,26,2,1621789,12,8,1310721,2, -3,26,2,5,26,2,3,26,1,1613419,12,8,1310721,2,3,26, -2,1,26,2,1594947,12,8,1587569,1,10,3,6,10,4,8,1, -1694311,14,1,1310721,2,5,26,1310721,4,18,1310721,2,7,28,1310721,4, -1310721,2,1835009,40,1694359,16,1966081,1310721,4,1579223,12,1310721,2,3,26,4, -1310721,2,4,1587557,2,1310721,2,5,26,4,1310721,2,2,1615649,12,8, -1587569,1310721,2,3,26,2,10,3,6,10,4,8,1587561,1,6,2, -1,6,3,26,5,6,4,10,8,8,1587605,2,1606425,12,1,6, -1,10,28,34,63,38,3,26,1694539,16,1587661,2,1606577,12,1,6, -1,10,28,34,63,38,3,26,1,6,1,10,28,34,63,38, -1,10,28,1694541,14,1,1694599,16,1587663,2,1606577,12,1,6,1,10, -28,34,63,38,3,26,1,6,1,10,28,34,63,38,1,10, -28,1694601,14,1,1694683,16,1585289,2,1,28,1,6,1,10,28,34, -63,38,3,26,1694673,16,1694661,14,109,105,115,115,105,110,103,32, -125,0,1694641,1591557,12,8,1694683,14,1686451,12,8,1694453,14,1310721,2,5, -26,2,1614445,12,8,1587561,1,6,2,1,6,-1,26,5,6,4, -10,8,8,1587569,2,1694753,16,1595029,12,1618391,12,8,15,1594729,12,8, -1587569,1,10,3,6,10,4,8,1,1694777,14,1,1310721,2,7,26, -1310721,4,18,1310721,2,23,28,1310721,4,1310721,2,1835009,40,1694825,16,1966081, -1310721,4,1579223,12,1587557,2,1310721,2,4,3,1,10,28,1310721,2,11, -26,4,3,1,10,28,1310721,2,21,26,4,1663797,12,8,1604999,12, -8,1587599,2,1606959,12,8,1310721,2,5,26,1681059,12,10,3,6,10, -4,8,1663385,12,8,1310721,2,5,26,2,1613033,12,8,1587601,2,1606959, -12,8,1587561,1,6,2,1,6,3,26,5,6,4,10,8,8, -1310721,2,3,26,1,1611819,12,10,3,6,10,4,8,1587563,1,6, -2,1,6,3,26,5,6,4,10,8,8,1467905,1310721,2,3,26, -2,26,2,1595563,12,8,5,1594729,12,8,1310721,2,9,26,1587569,2, -10,3,6,10,4,8,1310721,2,7,26,1615017,12,10,3,6,10, -4,8,3,1,10,28,1310721,2,7,26,2,1690135,12,8,1587603,2, -1606959,12,8,1587605,2,1606425,12,1,6,1,10,28,34,63,38,3, -26,1695849,16,1585289,2,1,28,1,6,1,10,28,34,63,38,3, -26,1695243,16,1695231,14,109,105,115,115,105,110,103,32,125,0,1695211, -1591557,12,8,1695849,14,1587661,2,1606577,12,1695565,16,1604999,12,8,1310721,2, -17,26,1,10,3,6,10,4,8,3,1695453,16,1310721,2,19,26, -1685483,12,10,3,6,10,4,8,1467905,1310721,2,3,26,2,26,2, -1595563,12,8,3,1594729,12,8,1310721,2,19,26,2,1594643,12,8,29, -1594729,12,8,1310721,2,17,26,1595029,12,1310721,2,17,26,2,1593879,12, -10,3,6,10,4,8,17,1594729,12,8,1587611,2,1606729,12,1,6, -1,10,28,34,63,38,3,26,1695449,16,1695453,14,1695283,14,1587627,2, -1606959,12,8,1310721,2,15,26,1595029,12,10,3,6,10,4,8,15, -1594729,12,8,1310721,2,17,26,2,1587549,2,1594231,12,8,1310721,2,7, -26,2,1310721,2,9,26,2,1694325,12,8,1310721,2,15,26,2,1587549, -2,1594811,12,8,1695845,14,1587663,2,1606577,12,1695783,16,1604999,12,8,1587627, -2,1606959,12,8,1310721,2,11,26,2,1,40,3,36,1695677,16,1695669, -14,97,32,115,119,105,116,99,104,32,104,97,115,32,111,110, -101,32,100,101,102,97,117,108,116,0,1695619,1591173,12,8,1310721,2, -13,26,1595029,12,10,3,6,10,4,8,15,1594729,12,8,1310721,2, -11,26,1587549,2,10,3,6,10,4,8,1310721,2,7,26,2,1310721, -2,9,26,2,1694325,12,8,1310721,2,13,26,2,1587549,2,1594811,12, -8,1695845,14,1695837,14,101,120,112,101,99,116,101,100,32,99,97, -115,101,32,111,114,32,100,101,102,97,117,108,116,0,1695787,1591557, -12,8,1695143,14,1604999,12,8,1310721,2,7,26,2,1615649,12,8,1587569, -1310721,2,9,26,2,10,3,6,10,4,8,1310721,2,11,26,2, -1,40,3,36,1695959,16,1310721,2,11,26,2,1594947,12,8,3,1, -10,28,3,1,10,28,1690549,12,8,1696017,14,1310721,2,21,26,1595029, -12,10,3,6,10,4,8,15,1594729,12,8,1310721,2,21,26,2, -1310721,2,7,26,2,1690549,12,8,1310721,2,7,26,2,1615567,12,8, -1310721,2,2,1614445,12,8,1587561,1,6,2,1,6,-1,26,5,6, -4,10,8,8,1,1696081,14,1,1310721,2,23,26,1310721,4,18,1310721, -2,3,28,1310721,4,1310721,2,1835009,40,1696129,16,1966081,1310721,4,1579223,12, -1663797,12,8,1604999,12,8,1587577,2,1,6,1,10,28,34,63,38, -3,26,1696233,16,1696225,14,114,101,116,117,114,110,32,111,117,116, -115,105,100,101,32,97,32,102,117,110,99,116,105,111,110,0, -1696173,1591173,12,8,1587571,2,1696329,16,1696321,14,114,101,116,117,114,110, -32,99,97,110,39,116,32,108,101,97,118,101,32,97,32,98, -108,111,99,107,32,101,120,112,114,101,115,115,105,111,110,0, -1696245,1591173,12,8,1587613,2,1606425,12,1696371,16,1,1594643,12,8,1310721,2, -1,10,3,6,10,4,8,1696703,14,1310721,2,1681059,12,10,3,6, -10,4,8,1663385,12,8,1587597,2,1587695,2,28,1,6,1,10,28, -34,63,38,3,26,1696481,16,1696461,14,114,101,116,117,114,110,32, -118,97,108,117,101,0,1696435,1587695,2,1587699,2,1643225,12,8,1696599,14, -1587597,2,1696547,16,1587597,2,1587699,2,1639563,12,1,6,1,10,28,34, -63,38,3,26,1,6,1,10,28,34,63,38,1,10,28,1696549, -14,1,1696599,16,1696583,14,114,101,116,117,114,110,32,118,97,108, -117,101,0,1696557,1587597,2,1587699,2,1643225,12,8,1587769,2,1696637,16,1587597, -2,1,6,1,10,28,34,63,38,1,10,28,1696639,14,1,1696677, -16,1587597,2,1658673,12,1,6,1,10,28,34,63,38,1,10,28, -1696679,14,1,1696703,16,1587597,2,1594643,12,8,1590517,2,1595409,12,8,1587613, -2,1606959,12,8,1310721,2,2,1630339,12,8,3,1,1613419,12,8,1587573, -1587549,2,1587573,2,1593879,12,10,3,6,10,4,8,2097153,3,28,1594643, -12,8,15,1594729,12,8,1587569,1,10,3,6,10,4,8,1,1696805, -14,1,1310721,2,3,26,1310721,4,18,1310721,2,11,28,1310721,4,1310721, -2,1835009,40,1696853,16,1966081,1310721,4,1579223,12,1663797,12,8,1604999,12,8, -1587603,2,1606425,12,1,6,1,10,28,34,63,38,3,26,1696943,16, -1587773,3,10,3,6,10,4,8,3,1687403,12,8,1587773,1,10,3, -6,10,4,8,1,1697879,14,1587769,2,1696957,16,3,1697003,14,1587577,2, -1,6,1,10,28,34,63,38,3,26,1,6,1,10,28,34, -63,38,1,10,28,1697015,16,1686987,12,1697879,14,1310721,2,1587549,2,5, -26,10,3,6,10,4,8,1310721,2,2,1594643,12,8,15,1594729,12, -8,1587769,3,10,3,6,10,4,8,1595939,12,8,1310721,2,7,26, -1587557,2,10,3,6,10,4,8,1310721,2,9,26,1587557,2,10,3, -6,10,4,8,1310721,2,3,26,1587559,2,10,3,6,10,4,8, -1310721,2,3,26,2,1310721,2,9,26,2,40,1697289,16,1558017,1310721,2, -3,26,2,26,2,33,32,1697251,16,1310721,2,3,26,2,1596201,12, -8,1310721,2,3,26,2,1596641,12,8,1310721,2,3,26,2,1597105,12, -8,1310721,2,3,26,1,6,2,1,6,3,26,5,6,4,10, -8,8,1697153,14,1686987,12,8,1587769,1,10,3,6,10,4,8,1589305, -2,21,40,1697527,16,1310721,2,5,26,1587905,1589305,2,135,30,26,10, -3,6,10,4,8,1310721,2,5,26,2,1,26,1310721,2,2,10, -3,6,10,4,8,1310721,2,5,26,2,3,26,1587549,2,10,3, -6,10,4,8,1310721,2,5,26,2,5,26,1587903,2,10,3,6, -10,4,8,1310721,2,5,26,2,7,26,1587775,1587903,2,1574491,12,8, -1310721,2,5,26,2,71,26,1587839,1587903,2,1574491,12,8,1589305,1,6, -2,1,6,3,26,5,6,4,10,8,8,1587557,1310721,2,7,26, -2,10,3,6,10,4,8,1310721,2,3,26,1587559,2,10,3,6, -10,4,8,1310721,2,3,26,2,1310721,2,9,26,2,40,1697871,16, -1558017,1310721,2,3,26,2,26,1558017,1310721,2,3,26,2,26,2,1558017, -1310721,2,3,26,2,26,2,3585,32,28,10,3,6,10,4,8, -1589487,1310721,2,3,26,2,26,1,10,3,6,10,4,8,1558017,1310721, -2,3,26,2,26,2,33,32,1697763,16,1556993,1310721,2,3,26,2, -26,2,1658673,12,1,6,1,10,28,34,63,38,1,10,28,1697765, -14,1,1697833,16,1310721,2,3,26,2,1595671,12,8,3,1594729,12,8, -1556993,1310721,2,3,26,2,26,2,1594643,12,8,1590517,2,1595409,12,8, -9,1594729,12,8,1310721,2,3,26,1,6,2,1,6,3,26,5, -6,4,10,8,8,1697575,14,1,1697879,14,1,1310721,2,11,26,1310721, -4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1697927,16,1966081,1310721, -4,1579223,12,1587565,2,1310721,2,4,1663797,12,8,1604999,12,8,1587565,1, -10,3,6,10,4,8,1687243,12,8,1587565,1310721,2,2,10,3,6, -10,4,8,1,1697999,14,1,1310721,2,3,26,1310721,4,18,1310721,2, -21,28,1310721,4,1310721,2,1835009,40,1698047,16,1966081,1310721,4,1579223,12,1, -1310721,2,4,1,1310721,2,3,26,4,1554945,1310721,2,13,26,4,1554945, -129,26,1310721,2,15,26,4,1554945,257,26,1310721,2,17,26,4,1554945, -769,26,1310721,2,19,26,4,1587603,2,1606959,12,8,1587605,2,1606425,12, -1,6,1,10,28,34,63,38,3,26,1700323,16,1585289,2,1,28, -1,6,1,10,28,34,63,38,3,26,1698259,16,1698251,14,117,110, -116,101,114,109,105,110,97,116,101,100,32,97,115,109,32,98, -108,111,99,107,0,1698205,1591557,12,8,1585289,2,3,28,1,6,1, -10,28,34,63,38,3,26,1698311,16,1585291,2,1594643,12,8,1604999,12, -8,1698137,14,1585289,2,7,28,1,6,1,10,28,34,63,38,3, -26,1698363,16,1585291,2,1598105,12,8,1604999,12,8,1698137,14,1587629,2,1606425, -12,1698481,16,1604999,12,8,1585289,2,3,28,1,6,1,10,28,34, -63,38,1,10,28,1698461,16,1698453,14,35,32,110,101,101,100,115, -32,97,32,110,117,109,98,101,114,0,1698419,1591557,12,8,1585291,2, -1594449,12,8,1604999,12,8,1698137,14,1587631,2,1606425,12,1698603,16,1604999,12, -8,1585289,2,3,28,1,6,1,10,28,34,63,38,3,26,1698561, -16,1585293,2,1,6,1,10,28,34,63,38,1,10,28,1698563,14, -1,1698591,16,1,1585291,2,28,1594643,12,8,1604999,12,8,1698599,14,29, -1594729,12,8,1698137,14,1587627,2,1606425,12,1698793,16,1604999,12,8,1310721,2, -2,129,40,3,36,1698691,16,1698683,14,116,111,111,32,109,97,110, -121,32,97,115,109,32,108,97,98,101,108,115,0,1698643,1591079,12, -8,1310721,2,13,26,2,1310721,2,2,26,1607249,12,10,3,6,10, -4,8,1310721,2,15,26,2,1310721,2,2,26,1587549,2,10,3,6, -10,4,8,1310721,2,1,6,2,1,6,3,26,5,6,4,10, -8,8,1698137,14,1585291,2,1,26,2,1698863,16,1585291,2,3,26,2, -1,6,1,10,28,34,63,38,3,26,1,6,1,10,28,34, -63,38,1,10,28,1698865,14,1,1698935,16,1310721,2,9,26,1585291,2, -1,26,2,1608541,12,10,3,6,10,4,1,40,3,36,1,6, -1,10,28,34,63,38,1,10,28,1698937,14,1,1698967,16,1310721,2, -9,26,2,1594729,12,8,1604999,12,8,1698137,14,1585289,2,5,28,1, -6,1,10,28,34,63,38,1,10,28,1699047,16,1699039,14,98,97, -100,32,116,111,107,101,110,32,105,110,32,97,115,109,0,1699005, -1591557,12,8,1310721,2,5,26,1585291,2,1611615,12,10,3,6,10,4, -8,1310721,2,5,26,2,1,40,3,36,1699143,16,1558017,1310721,2,5, -26,2,26,2,33,32,1,6,1,10,28,34,63,38,1,10, -28,1699145,14,1,1699211,16,1473025,1310721,2,5,26,2,26,2,1,6, -1,10,28,34,63,38,3,26,1,6,1,10,28,34,63,38, -1,10,28,1699213,14,1,1699291,16,1699283,14,97,115,109,32,99,97, -110,39,116,32,114,101,97,99,104,32,97,110,32,111,51,32, -118,97,114,105,97,98,108,101,0,1699221,1591173,12,8,1310721,2,5, -26,2,1,40,3,36,1699373,16,1472001,1310721,2,5,26,2,26,3, -10,3,6,10,4,8,1467905,1310721,2,5,26,2,26,2,1595563,12, -8,1604999,12,8,1698137,14,1310721,2,7,26,3,1,10,28,10,3, -6,10,4,8,1310721,2,5,26,1,10,3,6,10,4,8,1310721, -2,5,26,2,1310721,2,2,40,1699567,16,1310721,2,13,26,2,1310721, -2,5,26,2,26,2,1585291,2,28,1,6,1,10,28,34,63, -38,3,26,1699529,16,1310721,2,7,26,1310721,2,5,26,2,10,3, -6,10,4,8,1310721,2,5,26,1,6,2,1,6,3,26,5, -6,4,10,8,8,1699423,14,1310721,2,7,26,2,1,40,3,36, -1699629,16,1310721,2,15,26,2,1310721,2,7,26,2,26,2,1594643,12, -8,1604999,12,8,1698137,14,1310721,2,11,26,1585291,2,1593303,12,10,3, -6,10,4,8,1310721,2,11,26,2,1,40,3,36,1699745,16,1417729, -1310721,2,11,26,2,26,2,13,28,1,6,1,10,28,34,63, -38,3,26,1,6,1,10,28,34,63,38,1,10,28,1699747,14, -1,1699787,16,45,1425921,1310721,2,11,26,2,26,2,26,1594729,12,8, -1604999,12,8,1698137,14,1310721,2,11,26,2,1,40,3,36,1699877,16, -1417729,1310721,2,11,26,2,26,2,3,28,1,6,1,10,28,34, -63,38,1,10,28,1,6,1,10,28,34,63,38,1,10,28, -1699879,14,1,1699951,16,1417729,1310721,2,11,26,2,26,2,11,28,1, -6,1,10,28,34,63,38,1,10,28,1,6,1,10,28,34, -63,38,1,10,28,1699953,14,1,1699989,16,1425921,1310721,2,11,26,2, -26,2,1594643,12,8,1604999,12,8,1698137,14,1310721,2,11,26,2,1, -40,3,36,1700077,16,1417729,1310721,2,11,26,2,26,2,3,28,1, -6,1,10,28,34,63,38,3,26,1,6,1,10,28,34,63, -38,1,10,28,1700079,14,1,1700109,16,1310721,2,11,26,2,1595235,12, -8,1604999,12,8,1698137,14,1310721,2,3,26,2,501,40,3,36,1700203, -16,1700195,14,116,111,111,32,109,97,110,121,32,97,115,109,32, -108,97,98,101,108,32,114,101,102,101,114,101,110,99,101,115, -0,1700135,1591079,12,8,1310721,2,17,26,2,1310721,2,3,26,2,26, -1585291,2,10,3,6,10,4,8,1310721,2,19,26,2,1310721,2,3, -26,2,26,1595029,12,10,3,6,10,4,8,1310721,2,3,26,1, -6,2,1,6,3,26,5,6,4,10,8,8,1604999,12,8,1698137, -14,1604999,12,8,1310721,2,5,26,1,10,3,6,10,4,8,1310721, -2,5,26,2,1310721,2,3,26,2,40,1700777,16,1310721,2,7,26, -3,1,10,28,10,3,6,10,4,8,1310721,2,9,26,1,10, -3,6,10,4,8,1310721,2,9,26,2,1310721,2,2,40,1700591,16, -1310721,2,13,26,2,1310721,2,9,26,2,26,2,1310721,2,17,26, -2,1310721,2,5,26,2,26,2,28,1,6,1,10,28,34,63, -38,3,26,1700553,16,1310721,2,7,26,1310721,2,9,26,2,10,3, -6,10,4,8,1310721,2,9,26,1,6,2,1,6,3,26,5, -6,4,10,8,8,1700427,14,1310721,2,7,26,2,1,40,1700685,16, -1310721,2,17,26,2,1310721,2,5,26,2,26,2,1700677,14,117,110, -107,110,111,119,110,32,110,97,109,101,32,105,110,32,97,115, -109,0,1700637,1591343,12,8,1310721,2,19,26,2,1310721,2,5,26,2, -26,2,1310721,2,15,26,2,1310721,2,7,26,2,26,2,1594811,12, -8,1310721,2,5,26,1,6,2,1,6,3,26,5,6,4,10, -8,8,1700351,14,1,1700785,14,1,1310721,2,21,26,1310721,4,18,1310721, -2,1,28,1310721,4,1310721,2,1835009,40,1700833,16,1966081,1310721,4,1579223,12, -1604999,12,8,1698013,12,8,1587595,1,10,3,6,10,4,8,1,1700869, -14,1,1310721,2,1,26,1310721,4,18,1310721,2,7,28,1310721,4,1310721, -2,1835009,40,1700917,16,1966081,1310721,4,1579223,12,1,1310721,2,4,1,1310721, -2,3,26,4,1587603,2,1606425,12,1,6,1,10,28,34,63,38, -3,26,1701003,16,1700995,14,101,120,112,101,99,116,101,100,32,123, -0,1700973,1591557,12,8,1604999,12,8,3,1701425,16,1585289,2,1,28,1, -6,1,10,28,34,63,38,3,26,1701097,16,1701089,14,117,110,116, -101,114,109,105,110,97,116,101,100,32,113,117,111,116,101,0, -1701051,1591557,12,8,1587603,2,1606425,12,1701143,16,1310721,2,3,26,1,6, -2,1,6,3,26,5,6,4,10,8,8,1587605,2,1606425,12,1701227, -16,1310721,2,3,26,2,1,6,1,10,28,34,63,38,3,26, -1701193,16,1701425,14,1310721,2,3,26,1,6,2,1,6,-1,26,5, -6,4,10,8,8,1310721,2,2,5401,40,3,36,1701287,16,1701279,14, -113,117,111,116,101,32,116,111,111,32,108,111,110,103,0,1701249, -1591079,12,8,1524225,1310721,2,2,7,30,26,1585289,2,10,3,6,10, -4,8,1524225,1310721,2,2,7,30,3,26,26,1585291,2,10,3,6, -10,4,8,1524225,1310721,2,2,7,30,5,26,26,1585295,2,10,3, -6,10,4,8,1310721,2,1,6,2,1,6,3,26,5,6,4, -10,8,8,1604999,12,8,1701009,14,1604999,12,8,1310721,2,5,26,1310721, -2,2,7,30,3,26,1580219,12,10,3,6,10,4,8,1310721,2, -5,26,2,1,26,1310721,2,2,10,3,6,10,4,8,1310721,2, -5,26,2,3,26,1524225,1310721,2,2,7,30,1574491,12,8,1310721,2, -5,26,2,1701549,14,1,1310721,2,7,26,1310721,4,18,1310721,2,7, -28,1310721,4,1310721,2,1835009,40,1701597,16,1966081,1310721,4,1579223,12,1310721,2, -4,1310721,2,2,1,26,2,7,30,3,26,1310721,2,3,26,4, -1310721,2,3,26,2,1580219,12,1310721,2,5,26,4,1310721,2,5,26, -2,1310721,2,2,1310721,2,3,26,2,1574491,12,8,1310721,2,5,26, -2,1701705,14,1,1310721,2,7,26,1310721,4,18,1310721,2,7,28,1310721, -4,1310721,2,1835009,40,1701753,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721, -2,2,1,26,2,7,30,3,26,1310721,2,3,26,4,1310721,2, -3,26,2,1580219,12,1310721,2,5,26,4,1310721,2,5,26,2,1310721, -2,2,1310721,2,3,26,2,1574491,12,8,1310721,2,5,26,2,1701861, -14,1,1310721,2,7,26,1310721,4,18,1310721,2,7,28,1310721,4,1310721, -2,1835009,40,1701909,16,1966081,1310721,4,1579223,12,1310721,2,3,26,4,1310721, -2,4,1,1310721,2,5,26,4,1310721,2,5,26,2,1310721,2,3, -26,2,40,1702027,16,1310721,2,2,1310721,2,5,26,2,26,2,1594449, -12,8,1310721,2,5,26,1,6,2,1,6,3,26,5,6,4, -10,8,8,1701937,14,1,1702035,14,1,1310721,2,7,26,1310721,4,18, -1310721,2,9,28,1310721,4,1310721,2,1835009,40,1702083,16,1966081,1310721,4,1579223, -12,1604999,12,8,1310721,2,1700883,12,10,3,6,10,4,8,1310721,2, -3,26,1595029,12,10,3,6,10,4,8,15,1594729,12,8,1310721,2, -5,26,1587549,2,10,3,6,10,4,8,1310721,2,7,26,1310721,2, -2,1,26,2,7,30,3,26,10,3,6,10,4,8,1310721,2, -2,1310721,2,7,26,2,1701875,12,8,1310721,2,2,1580973,12,8,1310721, -2,3,26,2,1587549,2,1594811,12,8,1310721,2,5,26,2,1594643,12, -8,1587675,2,1595409,12,8,1587595,3,10,3,6,10,4,8,1,1702309, -14,1,1310721,2,9,26,1310721,4,18,1310721,2,7,28,1310721,4,1310721, -2,1835009,40,1702357,16,1966081,1310721,4,1579223,12,1310721,2,4,1,1310721,2, -3,26,4,5,1310721,2,2,1,1,1598871,12,8,1604999,12,8,1585289, -2,1,28,1,6,1,10,28,34,63,38,1,10,28,1702653,16, -1310721,2,3,26,2,5401,40,3,36,1702499,16,1702491,14,116,111,111, -32,109,97,110,121,32,116,111,107,101,110,115,0,1702459,1591079,12, -8,1524225,1310721,2,3,26,2,7,30,26,1585289,2,10,3,6,10, -4,8,1524225,1310721,2,3,26,2,7,30,3,26,26,1585291,2,10, -3,6,10,4,8,1524225,1310721,2,3,26,2,7,30,5,26,26, -1585295,2,10,3,6,10,4,8,1310721,2,3,26,1,6,2,1, -6,3,26,5,6,4,10,8,8,1604999,12,8,1702399,14,1600299,12, -8,1310721,2,5,26,1310721,2,3,26,2,7,30,3,26,1580219,12, -10,3,6,10,4,8,1310721,2,5,26,2,1,26,1310721,2,3, -26,2,10,3,6,10,4,8,1310721,2,5,26,2,3,26,1524225, -1310721,2,3,26,2,7,30,1574491,12,8,1310721,2,5,26,2,1702789, -14,1,1310721,2,7,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721, -2,1835009,40,1702837,16,1966081,1310721,4,1579223,12,1310721,2,4,3,1310721,2, -2,3,3,1598871,12,8,1604999,12,8,1,1702875,14,1,1310721,2,3, -26,1310721,4,18,1310721,2,13,28,1310721,4,1310721,2,1835009,40,1702923,16, -1966081,1310721,4,1579223,12,8181,1310721,2,4,8181,1580219,12,1310721,2,3,26, -4,1,1310721,2,5,26,4,1573381,12,1,6,1,10,28,34,63, -38,3,26,1703481,16,1310721,2,7,26,1573325,12,511,32,10,3,6, -10,4,8,1310721,2,7,26,2,193,28,1,6,1,10,28,34, -63,38,3,26,1703057,16,1703481,14,1310721,2,5,26,2,5,38,5, -26,1310721,2,2,40,3,36,1703245,16,1310721,2,9,26,1310721,2,2, -1310721,2,2,26,13,26,1580219,12,10,3,6,10,4,8,1310721,2, -9,26,2,1310721,2,3,26,2,1310721,2,2,1574491,12,8,1310721,2, -3,26,2,1580973,12,8,1310721,2,3,26,1310721,2,9,26,2,10, -3,6,10,4,8,1310721,2,1310721,2,2,1310721,2,2,26,13,26, -10,3,6,10,4,8,1310721,2,11,26,1310721,2,5,26,2,5, -38,10,3,6,10,4,8,1310721,2,5,26,2,7,32,1,6, -1,10,28,34,63,38,3,26,1703353,16,1310721,2,3,26,2,1310721, -2,11,26,2,26,1,10,3,6,10,4,8,1310721,2,3,26, -2,1310721,2,11,26,2,26,1310721,2,3,26,2,1310721,2,11,26, -2,26,2,1310721,2,7,26,2,1310721,2,5,26,2,7,32,17, -30,48,34,10,3,6,10,4,8,1310721,2,5,26,1,6,2, -1,6,3,26,5,6,4,10,8,8,1702959,14,1310721,2,3,26, -2,1310721,2,5,26,2,5,38,26,1310721,2,3,26,2,1310721,2, -5,26,2,5,38,26,2,1574901,1310721,2,5,26,2,7,32,17, -30,26,2,3,28,32,10,3,6,10,4,8,1310721,2,5,26, -2,7,32,1,28,1,6,1,10,28,34,63,38,3,26,1703659, -16,1310721,2,3,26,2,1310721,2,5,26,2,5,38,26,1,10, -3,6,10,4,8,1310721,2,3,26,2,1310721,2,5,26,2,5, -38,3,26,26,1,10,3,6,10,4,8,1310721,2,3,26,2, -1703719,14,1,1310721,2,13,26,1310721,4,18,1310721,2,3,28,1310721,4, -1310721,2,1835009,40,1703767,16,1966081,1310721,4,1579223,12,1,1310721,2,4,1585289, -2,1,28,1,6,1,10,28,34,63,38,1,10,28,1703975,16, -1587729,2,1606425,12,1703855,16,1310721,2,1,6,2,1,6,3,26,5, -6,4,10,8,8,1703939,14,1587731,2,1606425,12,1703901,16,1310721,2,1, -6,2,1,6,-1,26,5,6,4,10,8,8,1703939,14,1587733,2, -1606425,12,1703939,16,1310721,2,1310721,2,2,5,28,10,3,6,10,4, -8,1604999,12,8,1310721,2,2,1,10,40,3,36,1703971,16,1,1703983, -14,1703775,14,1,1703983,14,1,1310721,2,3,26,1310721,4,18,1310721,2, -17,28,1310721,4,1310721,2,1835009,40,1704031,16,1966081,1310721,4,1579223,12,1310721, -2,5,26,4,1310721,2,3,26,4,1310721,2,4,1,1310721,2,7, -26,4,1,1310721,2,9,26,4,1,1310721,2,11,26,4,1604999,12, -8,1587601,2,1606425,12,1,6,1,10,28,34,63,38,3,26,1704843, -16,1310721,2,7,26,3,10,3,6,10,4,8,1310721,2,13,26, -3,10,3,6,10,4,8,1585289,2,1,28,1,6,1,10,28, -34,63,38,1,10,28,1704749,16,1587599,2,1606425,12,1704259,16,1310721,2, -13,26,1,6,2,1,6,3,26,5,6,4,10,8,8,1704739, -14,1587601,2,1606425,12,1704347,16,1310721,2,13,26,1,6,2,1,6, --1,26,5,6,4,10,8,8,1310721,2,13,26,2,1,6,1, -10,28,34,63,38,3,26,1704343,16,1704749,14,1704739,14,1310721,2,13, -26,2,3,28,1,6,1,10,28,34,63,38,3,26,1704419,16, -1587611,2,1606425,12,1,6,1,10,28,34,63,38,1,10,28,1704421, -14,1,1704579,16,1310721,2,7,26,2,25,10,40,3,36,1704519,16, -1310721,2,9,26,1310721,2,9,26,2,1310721,2,11,26,2,1310721,2, -7,26,2,1310721,2,7,26,2,26,5,28,48,26,10,3,6, -10,4,8,1310721,2,7,26,1,6,2,1,6,3,26,5,6, -4,10,8,8,1310721,2,11,26,1,10,3,6,10,4,8,1704739, -14,1310721,2,13,26,2,3,28,1,6,1,10,28,34,63,38, -3,26,1704651,16,1587637,2,1606425,12,1,6,1,10,28,34,63,38, -1,10,28,1704653,14,1,1704739,16,1604999,12,8,1587653,2,1606577,12,1704701, -16,1310721,2,11,26,3,10,3,6,10,4,8,1704735,14,1587655,2, -1606577,12,1704735,16,1310721,2,11,26,5,10,3,6,10,4,8,1704175, -14,1604999,12,8,1704175,14,1310721,2,7,26,2,25,10,40,3,36, -1704843,16,1310721,2,9,26,1310721,2,9,26,2,1310721,2,11,26,2, -1310721,2,7,26,2,1310721,2,7,26,2,26,5,28,48,26,10, -3,6,10,4,8,1604999,12,8,1587603,2,1606425,12,1,6,1,10, -28,34,63,38,3,26,1704935,16,1587613,2,1606425,12,1,6,1,10, -28,34,63,38,3,26,1,6,1,10,28,34,63,38,1,10, -28,1704937,14,1,1704947,16,1,1705441,14,1310721,2,15,26,1310721,2,3, -26,2,1593303,12,10,3,6,10,4,8,1310721,2,15,26,2,1, -40,1705005,16,3,1705043,14,1310721,2,15,26,2,1585221,2,40,1,6, -1,10,28,34,63,38,1,10,28,1705053,16,3,1705117,14,1417729,1310721, -2,15,26,2,26,2,3,28,1,6,1,10,28,34,63,38, -1,10,28,1,6,1,10,28,34,63,38,1,10,28,1705127,16, -3,1705169,14,1442305,1310721,2,15,26,2,26,2,3,32,1,6,1, -10,28,34,63,38,1,10,28,1705207,16,1310721,2,15,26,1310721,2, -3,26,2,1595111,12,10,3,6,10,4,8,1442305,1310721,2,15,26, -2,26,2,5,32,1,6,1,10,28,34,63,38,3,26,1705373, -16,1434113,1310721,2,15,26,2,26,1310721,2,2,1310721,2,7,26,2, -26,1310721,2,7,26,2,26,1310721,2,9,26,2,129,30,26,10, -3,6,10,4,8,1442305,1310721,2,15,26,2,26,1442305,1310721,2,15, -26,2,26,2,5,34,513,34,10,3,6,10,4,8,1310721,2, -5,26,2,1705433,16,1442305,1310721,2,15,26,2,26,1442305,1310721,2,15, -26,2,26,2,1025,34,10,3,6,10,4,8,1,1705441,14,1, -1310721,2,17,26,1310721,4,18,1310721,2,19,28,1310721,4,1310721,2,1835009, -40,1705489,16,1966081,1310721,4,1579223,12,1310721,2,3,26,4,1310721,2,4, -1,1310721,2,5,26,4,1590585,2,1310721,2,7,26,4,1590583,2,1310721, -2,9,26,4,1,1310721,2,11,26,4,1,1310721,2,13,26,4, -1587703,1,6,2,1,6,3,26,5,6,4,10,8,8,1310721,2, -2,1310721,2,3,26,2,1,1,1598871,12,8,1604999,12,8,1585289,2, -1,28,1,6,1,10,28,34,63,38,1,10,28,1706783,16,1587603, -2,1606425,12,1705713,16,1310721,2,5,26,1,6,2,1,6,3,26, -5,6,4,10,8,8,1706773,14,1587605,2,1606425,12,1705807,16,1310721,2, -5,26,1,6,2,1,6,-1,26,5,6,4,10,8,8,1310721, -2,11,26,1,10,3,6,10,4,8,1310721,2,13,26,1,10, -3,6,10,4,8,1706773,14,1310721,2,5,26,2,1,10,40,3, -36,1706773,16,1587613,2,1606425,12,1705891,16,1310721,2,11,26,1,10,3, -6,10,4,8,1310721,2,13,26,1,10,3,6,10,4,8,1706773, -14,1587637,2,1606425,12,1706029,16,1605859,12,8,1587511,2,5,28,1,6, -1,10,28,34,63,38,3,26,1705997,16,1587513,2,1587657,2,28,1, -6,1,10,28,34,63,38,3,26,1,6,1,10,28,34,63, -38,1,10,28,1705999,14,1,1706025,16,1310721,2,11,26,3,10,3, -6,10,4,8,1706773,14,1587759,2,1606577,12,1706067,16,1310721,2,13,26, -3,10,3,6,10,4,8,1706773,14,1585289,2,5,28,1,6,1, -10,28,34,63,38,3,26,1706773,16,1605859,12,8,1587511,2,9,28, -1,6,1,10,28,34,63,38,3,26,1706193,16,1587513,2,1587599,2, -28,1,6,1,10,28,34,63,38,3,26,1,6,1,10,28, -34,63,38,1,10,28,1706195,14,1,1706313,16,1310721,2,15,26,1585291, -2,10,3,6,10,4,8,1604999,12,8,1310721,2,11,26,2,1310721, -2,15,26,2,1310721,2,13,26,2,1703997,12,8,1310721,2,11,26, -1,10,3,6,10,4,8,1310721,2,13,26,1,10,3,6,10, -4,8,1705629,14,1587511,2,9,28,1,6,1,10,28,34,63,38, -3,26,1706401,16,1587513,2,1587729,2,28,1,6,1,10,28,34,63, -38,3,26,1,6,1,10,28,34,63,38,1,10,28,1706403,14, -1,1706773,16,1310721,2,15,26,1585291,2,10,3,6,10,4,8,1604999, -12,8,1310721,2,17,26,1,10,3,6,10,4,8,1585289,2,1, -28,1,6,1,10,28,34,63,38,1,10,28,1706677,16,1587729,2, -1606425,12,1706543,16,1310721,2,17,26,1,6,2,1,6,3,26,5, -6,4,10,8,8,1706639,14,1587731,2,1606425,12,1706593,16,1310721,2,17, -26,1,6,2,1,6,-1,26,5,6,4,10,8,8,1706639,14, -1587733,2,1606425,12,1706639,16,1310721,2,17,26,1310721,2,17,26,2,5, -28,10,3,6,10,4,8,1604999,12,8,1310721,2,17,26,2,1, -10,40,3,36,1706673,16,1706677,14,1706459,14,1587599,2,1606425,12,1706769,16, -1310721,2,11,26,2,1310721,2,15,26,2,1310721,2,13,26,2,1703997, -12,8,1310721,2,11,26,1,10,3,6,10,4,8,1310721,2,13, -26,1,10,3,6,10,4,8,1705629,14,1604999,12,8,1705629,14,1600299, -12,8,1587703,1,6,2,1,6,-1,26,5,6,4,10,8,8, -1590585,1310721,2,7,26,2,10,3,6,10,4,8,1590583,1310721,2,9, -26,2,10,3,6,10,4,8,1,1706873,14,1,1310721,2,19,26, -1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1706921,16,1966081, -1310721,4,1579223,12,1702889,12,1310721,2,4,7,1310721,2,2,1705455,12,8, -7,1310721,2,2,1,1,1598871,12,8,1604999,12,8,1722469,12,8,1585221, -2,1722569,12,8,1600299,12,8,1310721,2,2,1580973,12,8,1,1707011,14, -1,1310721,2,3,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2, -1835009,40,1707059,16,1966081,1310721,4,1579223,12,1548801,1587583,2,49,30,26,1310721, -2,4,1587583,2,61,40,3,36,1707159,16,1707151,14,99,111,109,112, -105,108,101,115,32,110,101,115,116,101,100,32,116,111,111,32, -100,101,101,112,108,121,0,1707097,1591079,12,8,1587583,1,6,2,1, -6,3,26,5,6,4,10,8,8,1310721,2,2,1,26,1587557,2, -10,3,6,10,4,8,1310721,2,2,3,26,1587559,2,10,3,6, -10,4,8,1310721,2,2,5,26,1587561,2,10,3,6,10,4,8, -1310721,2,2,7,26,1587563,2,10,3,6,10,4,8,1310721,2,2, -9,26,1587565,2,10,3,6,10,4,8,1310721,2,2,11,26,1587567, -2,10,3,6,10,4,8,1310721,2,2,13,26,1587569,2,10,3, -6,10,4,8,1310721,2,2,15,26,1587571,2,10,3,6,10,4, -8,1310721,2,2,17,26,1587573,2,10,3,6,10,4,8,1310721,2, -2,19,26,1587575,2,10,3,6,10,4,8,1310721,2,2,21,26, -1587577,2,10,3,6,10,4,8,1310721,2,2,23,26,1587579,2,10, -3,6,10,4,8,1310721,2,2,25,26,1587581,2,10,3,6,10, -4,8,1310721,2,2,27,26,1587587,2,10,3,6,10,4,8,1310721, -2,2,29,26,1587589,2,10,3,6,10,4,8,1310721,2,2,31, -26,1587591,2,10,3,6,10,4,8,1310721,2,2,33,26,1587593,2, -10,3,6,10,4,8,1310721,2,2,35,26,1587595,2,10,3,6, -10,4,8,1310721,2,2,37,26,1587585,2,10,3,6,10,4,8, -1310721,2,2,39,26,1587597,2,10,3,6,10,4,8,1310721,2,2, -41,26,1587721,2,10,3,6,10,4,8,1310721,2,2,43,26,1587699, -2,10,3,6,10,4,8,1310721,2,2,45,26,1587705,5,1574491,12, -8,1,1707787,14,1,1310721,2,3,26,1310721,4,18,1310721,2,3,28, -1310721,4,1310721,2,1835009,40,1707835,16,1966081,1310721,4,1579223,12,1587583,1,6, -2,1,6,-1,26,5,6,4,10,8,8,1310721,2,1548801,1587583,2, -49,30,26,10,3,6,10,4,8,1587557,1310721,2,2,1,26,2, -10,3,6,10,4,8,1587559,1310721,2,2,3,26,2,10,3,6, -10,4,8,1587561,1310721,2,2,5,26,2,10,3,6,10,4,8, -1587563,1310721,2,2,7,26,2,10,3,6,10,4,8,1587565,1310721,2, -2,9,26,2,10,3,6,10,4,8,1587567,1310721,2,2,11,26, -2,10,3,6,10,4,8,1587569,1310721,2,2,13,26,2,10,3, -6,10,4,8,1587571,1310721,2,2,15,26,2,10,3,6,10,4, -8,1587573,1310721,2,2,17,26,2,10,3,6,10,4,8,1587575,1310721, -2,2,19,26,2,10,3,6,10,4,8,1587577,1310721,2,2,21, -26,2,10,3,6,10,4,8,1587579,1310721,2,2,23,26,2,10, -3,6,10,4,8,1587581,1310721,2,2,25,26,2,10,3,6,10, -4,8,1587587,1310721,2,2,27,26,2,10,3,6,10,4,8,1587589, -1310721,2,2,29,26,2,10,3,6,10,4,8,1587591,1310721,2,2, -31,26,2,10,3,6,10,4,8,1587593,1310721,2,2,33,26,2, -10,3,6,10,4,8,1587595,1310721,2,2,35,26,2,10,3,6, -10,4,8,1587585,1310721,2,2,37,26,2,10,3,6,10,4,8, -1587597,1310721,2,2,39,26,2,10,3,6,10,4,8,1587721,1310721,2, -2,41,26,2,10,3,6,10,4,8,1587699,1310721,2,2,43,26, -2,10,3,6,10,4,8,1587705,1310721,2,2,45,26,5,1574491,12, -8,1,1708491,14,1,1310721,2,3,26,1310721,4,18,1310721,2,5,28, -1310721,4,1310721,2,1835009,40,1708539,16,1966081,1310721,4,1579223,12,1310721,2,3, -26,4,1310721,2,4,1587559,1587557,2,10,3,6,10,4,8,1587561,3, -10,3,6,10,4,8,1587563,1,10,3,6,10,4,8,1587565,1310721, -2,2,1708647,16,1585287,2,1,6,1,10,28,34,63,38,1,10, -28,1708649,14,1,10,3,6,10,4,8,1587567,1310721,2,3,26,2, -10,3,6,10,4,8,1587597,1,10,3,6,10,4,8,1587569,3, -10,3,6,10,4,8,1587571,1,10,3,6,10,4,8,1587573,1, -10,3,6,10,4,8,1587577,3,10,3,6,10,4,8,1587581,1587579, -2,10,3,6,10,4,8,1587587,1,10,3,6,10,4,8,1587589, -1,10,3,6,10,4,8,1,1708823,14,1,1310721,2,5,26,1310721, -4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1708871,16,1966081,1310721, -4,1579223,12,1310721,1594643,12,8,3,1594729,12,8,1587575,1595029,12,10,3, -6,10,4,8,29,1594729,12,8,1310721,1594643,12,8,5,1594729,12,8, -1587769,2,1708943,16,1,1709061,14,1310721,1594643,12,8,3,1594729,12,8,1835009, -1594643,12,8,41,1594729,12,8,1310721,2,1595029,12,10,3,6,10,4, -8,17,1594729,12,8,1966081,1594643,12,8,1310721,1594643,12,8,5,1594729,12, -8,1587665,2,1595409,12,8,1310721,2,2,1587549,2,1594811,12,8,1,1709061, -14,1,1310721,2,3,26,1310721,4,18,1310721,2,1,28,1310721,4,1310721, -2,1835009,40,1709109,16,1966081,1310721,4,1579223,12,1,1594643,12,8,1587573,2, -1587549,2,1594231,12,8,1310721,1594643,12,8,3,1594729,12,8,1587563,2,1594643, -12,8,27,1594729,12,8,1310721,1594643,12,8,5,1594729,12,8,19,1594729, -12,8,1587575,2,1587563,2,1594811,12,8,1587577,1,10,3,6,10,4, -8,1587557,1587559,2,10,3,6,10,4,8,1,1709245,14,1,1310721,2, -1,26,1310721,4,18,1310721,2,1,28,1310721,4,1310721,2,1835009,40,1709293, -16,1966081,1310721,4,1579223,12,1587603,2,1606959,12,8,1587605,2,1606425,12,1, -6,1,10,28,34,63,38,3,26,1709459,16,1585289,2,1,28,1, -6,1,10,28,34,63,38,3,26,1709449,16,1709441,14,109,105,115, -115,105,110,103,32,125,32,97,116,32,116,104,101,32,101,110, -100,32,111,102,32,97,32,102,117,110,99,116,105,111,110,0, -1709371,1591557,12,8,1686451,12,8,1709303,14,1587559,2,1614147,12,8,1587565,2, -1709507,16,1587569,2,1,6,1,10,28,34,63,38,1,10,28,1709509, -14,1,1709641,16,3,3,1613419,12,8,1587567,2,1709641,16,1709633,14,97, -32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110, -105,110,103,32,46,117,32,104,97,115,32,116,111,32,101,110, -100,32,119,105,116,104,32,97,32,114,101,116,117,114,110,0, -1709535,1591845,12,8,1604999,12,8,1,1709655,14,1,1310721,2,1,26,1310721, -4,18,1310721,2,175,28,1310721,4,1310721,2,1835009,40,1709703,16,1966081,1310721, -4,1579223,12,1310721,2,7,26,4,1310721,2,5,26,4,1310721,2,3, -26,4,1310721,2,4,1,1310721,2,11,26,4,1,1310721,2,13,26, -4,1,1310721,2,165,26,4,1587771,2,1310721,2,169,26,4,1587771,1, -10,3,6,10,4,8,1310721,2,3,26,2,1709825,16,3,1709851,14, -1587721,2,1,6,1,10,28,34,63,38,1,10,28,1709877,16,1310721, -2,165,26,3,10,3,6,10,4,8,1310721,2,9,26,1310721,2, -7,26,2,1593303,12,10,3,6,10,4,8,1310721,2,9,26,2, -1,40,1709935,16,3,1709973,14,1310721,2,9,26,2,1585221,2,40,1, -6,1,10,28,34,63,38,1,10,28,1709983,16,3,1710047,14,1417729, -1310721,2,9,26,2,26,2,3,28,1,6,1,10,28,34,63, -38,1,10,28,1,6,1,10,28,34,63,38,1,10,28,1710057, -16,3,1710099,14,1442305,1310721,2,9,26,2,26,2,3,32,1,6, -1,10,28,34,63,38,1,10,28,1710169,16,1310721,2,9,26,1310721, -2,7,26,2,3,1,1592805,12,10,3,6,10,4,8,1442305,1310721, -2,9,26,2,26,1,10,3,6,10,4,8,1587599,2,1606959,12, -8,1587601,2,1606425,12,1,6,1,10,28,34,63,38,3,26,1711671, -16,3,1711671,16,1310721,2,15,26,1,10,3,6,10,4,8,1310721, -2,117,26,1310721,2,11,26,2,26,1587687,2,10,3,6,10,4, -8,1587637,2,1606425,12,1,6,1,10,28,34,63,38,3,26,1710647, -16,1585289,2,9,28,1,6,1,10,28,34,63,38,3,26,1710457, -16,1585291,2,1587623,2,28,1,6,1,10,28,34,63,38,3,26, -1710379,16,3,1710431,14,1585291,2,1587607,2,28,1,6,1,10,28,34, -63,38,3,26,1,6,1,10,28,34,63,38,1,10,28,1, -6,1,10,28,34,63,38,1,10,28,1710459,14,1,1710469,16,3, -1710621,14,1585289,2,5,28,1,6,1,10,28,34,63,38,3,26, -1710597,16,1585291,2,1587639,2,28,1,6,1,10,28,34,63,38,3, -26,1710541,16,3,1710571,14,1585291,2,1644211,12,1,6,1,10,28,34, -63,38,1,10,28,1,6,1,10,28,34,63,38,1,10,28, -1710599,14,1,1,6,1,10,28,34,63,38,1,10,28,1,6, -1,10,28,34,63,38,1,10,28,1710649,14,1,1710835,16,1310721,2, -117,26,1310721,2,11,26,2,26,1644591,12,10,3,6,10,4,8, -1310721,2,165,26,3,10,3,6,10,4,8,1310721,2,117,26,1310721, -2,11,26,2,26,2,1638921,12,1710835,16,1710827,14,115,116,114,117, -99,116,115,32,97,110,100,32,97,114,114,97,121,115,32,97, -114,101,32,112,97,115,115,101,100,32,98,121,32,112,111,105, -110,116,101,114,0,1710745,1591173,12,8,1587637,2,1606729,12,1711041,16,1585291, -2,1587653,2,28,1,6,1,10,28,34,63,38,3,26,1710907,16, -1310721,2,15,26,3,10,3,6,10,4,8,1711035,14,1585291,2,1587655, -2,28,1,6,1,10,28,34,63,38,3,26,1710967,16,1310721,2, -15,26,5,10,3,6,10,4,8,1711035,14,1711027,14,97,32,112, -97,114,97,109,101,116,101,114,32,116,97,103,32,105,115,32, -46,109,32,111,114,32,46,100,0,1710971,1591557,12,8,1604999,12,8, -1310721,2,21,26,1310721,2,11,26,2,26,1607249,12,10,3,6,10, -4,8,1310721,2,169,26,2,1711165,16,1310721,2,117,26,1310721,2,11, -26,2,26,2,1587687,2,28,1,6,1,10,28,34,63,38,3, -26,1,6,1,10,28,34,63,38,1,10,28,1711167,14,1,1711235, -16,1711227,14,111,51,32,112,97,114,97,109,101,116,101,114,115, -32,110,101,101,100,32,97,32,116,121,112,101,0,1711175,1591173,12, -8,1310721,2,11,26,2,25,40,3,36,1711293,16,1310721,2,15,26, -2,1,6,1,10,28,34,63,38,1,10,28,1711295,14,1,1711397, -16,1711389,14,111,110,108,121,32,116,104,101,32,102,105,114,115, -116,32,49,50,32,112,97,114,97,109,101,116,101,114,115,32, -99,97,110,32,98,101,32,116,97,103,103,101,100,0,1711303,1591557, -12,8,1310721,2,69,26,1310721,2,11,26,2,26,1310721,2,15,26, -2,10,3,6,10,4,8,1310721,2,11,26,2,25,40,1711523,16, -1310721,2,13,26,1310721,2,13,26,2,1310721,2,15,26,2,1310721,2, -11,26,2,1310721,2,11,26,2,26,48,26,10,3,6,10,4, -8,1310721,2,11,26,1,6,2,1,6,3,26,5,6,4,10, -8,8,1310721,2,11,26,2,49,40,3,36,1711631,16,1711623,14,116, -111,111,32,109,97,110,121,32,112,97,114,97,109,101,116,101, -114,115,0,1711583,1591557,12,8,1587611,2,1606729,12,1,6,1,10,28, -34,63,38,3,26,1711667,16,1711671,14,1710211,14,1587601,2,1606959,12,8, -1310721,2,17,26,1310721,2,5,26,2,1310721,2,11,26,2,26,1310721, -2,11,26,2,26,1310721,2,13,26,2,129,30,26,10,3,6, -10,4,8,1442305,1310721,2,9,26,2,26,2,5,32,1711841,16,1442305, -1310721,2,9,26,2,26,2,513,32,1,6,1,10,28,34,63, -38,3,26,1,6,1,10,28,34,63,38,1,10,28,1711843,14, -1,1712003,16,1434113,1310721,2,9,26,2,26,2,1310721,2,17,26,2, -28,1,6,1,10,28,34,63,38,1,10,28,1711999,16,1310721,2, -7,26,2,1711991,14,100,111,101,115,110,39,116,32,109,97,116, -99,104,32,105,116,115,32,101,97,114,108,105,101,114,32,100, -101,99,108,97,114,97,116,105,111,110,0,1711915,1591343,12,8,1712291, -14,1442305,1310721,2,9,26,2,26,2,9,32,1712105,16,1310721,2,13, -26,2,1712047,16,3,1712079,14,1310721,2,5,26,2,1,6,1,10, -28,34,63,38,1,10,28,1,6,1,10,28,34,63,38,1, -10,28,1712107,14,1,1712291,16,1310721,2,7,26,2,1712283,14,119,97, -115,32,99,97,108,108,101,100,32,98,101,102,111,114,101,32, -105,116,115,32,116,97,103,115,32,119,101,114,101,32,100,101, -99,108,97,114,101,100,59,32,112,117,116,32,97,32,112,114, -111,116,111,116,121,112,101,32,97,98,111,118,101,32,116,104, -101,32,102,105,114,115,116,32,99,97,108,108,0,1712125,1591343,12, -8,1434113,1310721,2,9,26,2,26,1310721,2,17,26,2,10,3,6, -10,4,8,1442305,1310721,2,9,26,2,26,1442305,1310721,2,9,26,2, -26,2,5,34,1442305,1310721,2,9,26,2,26,2,513,32,28,10, -3,6,10,4,8,1587721,2,1712449,16,1442305,1310721,2,9,26,2,26, -1442305,1310721,2,9,26,2,26,2,257,34,10,3,6,10,4,8, -1310721,2,165,26,2,1712819,16,1310721,2,3,26,2,1,6,1,10, -28,34,63,38,3,26,1712521,16,1310721,2,3,26,1587687,2,10,3, -6,10,4,8,1310721,2,167,26,1310721,2,3,26,2,1310721,2,11, -26,2,1310721,2,117,26,1310721,2,17,26,2,1633771,12,10,3,6, -10,4,8,1559041,1310721,2,9,26,2,26,2,1712679,16,1559041,1310721,2, -9,26,2,26,2,1310721,2,167,26,2,28,1,6,1,10,28, -34,63,38,1,10,28,1,6,1,10,28,34,63,38,1,10, -28,1712681,14,1,1712783,16,1310721,2,7,26,2,1712775,14,100,111,101, -115,110,39,116,32,109,97,116,99,104,32,105,116,115,32,101, -97,114,108,105,101,114,32,100,101,99,108,97,114,97,116,105, -111,110,0,1712699,1591343,12,8,1559041,1310721,2,9,26,2,26,1310721,2, -167,26,2,10,3,6,10,4,8,1587613,2,1606729,12,1712861,16,1587721, -1,10,3,6,10,4,8,1310721,2,9,26,2,1714221,14,1442305,1310721, -2,9,26,2,26,2,3,32,1712941,16,1310721,2,7,26,2,1712933, -14,105,115,32,100,101,102,105,110,101,100,32,116,119,105,99, -101,0,1712899,1591343,12,8,1425921,1310721,2,9,26,2,26,1587549,2,10, -3,6,10,4,8,1442305,1310721,2,9,26,2,26,1442305,1310721,2,9, -26,2,26,2,3,34,10,3,6,10,4,8,1450497,1310721,2,9, -26,2,26,2,1587549,2,1594231,12,8,1450497,1310721,2,9,26,2,26, -1,10,3,6,10,4,8,1310721,2,2,1310721,2,5,26,2,1708505, -12,8,1310721,2,165,26,2,1713131,16,1587597,1310721,2,3,26,2,10, -3,6,10,4,8,1589305,1,10,3,6,10,4,8,1310721,2,169, -26,2,1713229,16,1587769,3,10,3,6,10,4,8,1595939,12,8,1442305, -1310721,2,9,26,2,26,1442305,1310721,2,9,26,2,26,2,1025,34, -10,3,6,10,4,8,1708837,12,8,1310721,2,19,26,1,10,3, -6,10,4,8,1310721,2,19,26,2,1310721,2,11,26,2,40,1713757, -16,1310721,2,15,26,1310721,2,21,26,1310721,2,19,26,2,26,2, -1611819,12,10,3,6,10,4,8,1587563,1,6,2,1,6,3,26, -5,6,4,10,8,8,1556993,1310721,2,15,26,2,26,1310721,2,117, -26,1310721,2,19,26,2,26,2,10,3,6,10,4,8,1310721,2, -169,26,2,1713463,16,1558017,1310721,2,15,26,2,26,33,10,3,6, -10,4,8,1310721,2,15,26,2,1596201,12,8,1587565,2,1713543,16,1310721, -2,69,26,1310721,2,19,26,2,26,2,3,28,1,6,1,10, -28,34,63,38,3,26,1,6,1,10,28,34,63,38,1,10, -28,1713545,14,1,1713577,16,1469953,1310721,2,15,26,2,26,13,10,3, -6,10,4,8,1587565,2,1713657,16,1310721,2,69,26,1310721,2,19,26, -2,26,2,5,28,1,6,1,10,28,34,63,38,3,26,1, -6,1,10,28,34,63,38,1,10,28,1713659,14,1,1713719,16,1469953, -1310721,2,15,26,2,26,3,10,3,6,10,4,8,1474049,1310721,2, -15,26,2,26,3,10,3,6,10,4,8,1310721,2,19,26,1, -6,2,1,6,3,26,5,6,4,10,8,8,1713257,14,1310721,2, -19,26,1310721,2,11,26,2,10,3,6,10,4,8,1310721,2,19, -26,2,1713863,16,1310721,2,19,26,1,6,2,1,6,-1,26,5, -6,4,10,8,8,1310721,2,19,26,2,1595563,12,8,5,1594729,12, -8,1713787,14,1310721,2,169,26,2,1714083,16,1310721,2,171,26,1587549,2, -5,26,10,3,6,10,4,8,1310721,2,171,26,2,1594643,12,8, -15,1594729,12,8,1310721,2,19,26,1,10,3,6,10,4,8,1310721, -2,19,26,2,1310721,2,11,26,2,40,1714083,16,1310721,2,15,26, -1587559,2,1310721,2,19,26,2,26,10,3,6,10,4,8,1310721,2, -15,26,2,1596641,12,8,1310721,2,15,26,2,1597105,12,8,1310721,2, -19,26,1,6,2,1,6,3,26,5,6,4,10,8,8,1713951, -14,1709259,12,8,1310721,2,173,26,1587549,2,10,3,6,10,4,8, -1709075,12,8,1310721,2,169,26,2,1714183,16,1587769,1,10,3,6,10, -4,8,1310721,2,171,26,2,1310721,2,173,26,2,1587775,1587839,1587903,2, -1597353,12,8,1597859,12,8,1587721,1,10,3,6,10,4,8,1310721,2, -9,26,2,1714221,14,1,1310721,2,175,26,1310721,4,18,1310721,2,3, -28,1310721,4,1310721,2,1835009,40,1714269,16,1966081,1310721,4,1579223,12,1310721,2, -4,1604999,12,8,1,1,1607249,12,1714313,12,1714299,14,1,1310721,2,3, -26,1310721,4,18,1310721,2,13,28,1310721,4,1310721,2,1835009,40,1714347,16, -1966081,1310721,4,1579223,12,1310721,2,5,26,4,1310721,2,3,26,4,1310721, -2,4,1310721,2,3,26,2,1714491,16,1714483,14,116,97,103,115,32, -103,111,32,111,110,32,108,111,99,97,108,115,32,97,110,100, -32,112,97,114,97,109,101,116,101,114,115,44,32,110,111,116, -32,103,108,111,98,97,108,115,0,1714391,1591173,12,8,1310721,2,2, -1587695,2,28,1,6,1,10,28,34,63,38,3,26,1714589,16,1714581, -14,97,32,118,97,114,105,97,98,108,101,32,99,97,110,39, -116,32,98,101,32,118,111,105,100,0,1714531,1591173,12,8,3,1715505, -16,1587607,2,1606729,12,1714881,16,1310721,2,9,26,1685483,12,10,3,6, -10,4,8,1587609,2,1606959,12,8,1310721,2,11,26,1310721,2,5,26, -2,7,1587549,2,1592805,12,10,3,6,10,4,8,1310721,2,2,1, -6,1,10,28,34,63,38,3,26,1714731,16,1310721,2,1587687,2,10, -3,6,10,4,8,1559041,1310721,2,11,26,2,26,1310721,2,2,1310721, -2,9,26,2,1633251,12,10,3,6,10,4,8,1310721,2,9,26, -1559041,1310721,2,11,26,2,26,2,1637519,12,10,3,6,10,4,8, -1310721,2,9,26,2,1714877,16,1,1594449,12,8,1310721,2,9,26,1, -6,2,1,6,-1,26,5,6,4,10,8,8,1714817,14,1715441,14, -1310721,2,2,1714927,16,1310721,2,2,1638921,12,1,6,1,10,28,34, -63,38,1,10,28,1714929,14,1,1715099,16,1310721,2,11,26,1310721,2, -5,26,2,7,1587549,2,1592805,12,10,3,6,10,4,8,1559041,1310721, -2,11,26,2,26,1310721,2,2,10,3,6,10,4,8,1310721,2, -9,26,1310721,2,2,1637519,12,10,3,6,10,4,8,1310721,2,9, -26,2,1715095,16,1,1594449,12,8,1310721,2,9,26,1,6,2,1, -6,-1,26,5,6,4,10,8,8,1715035,14,1715441,14,1310721,2,7, -26,1587549,2,10,3,6,10,4,8,1310721,2,11,26,1310721,2,5, -26,2,5,1310721,2,7,26,2,1592805,12,10,3,6,10,4,8, -1310721,2,2,1715211,16,1559041,1310721,2,11,26,2,26,1310721,2,2,10, -3,6,10,4,8,1,1594449,12,8,1587615,2,1606729,12,1715441,16,1585289, -2,7,28,1,6,1,10,28,34,63,38,3,26,1715409,16,1310721, -2,7,26,2,1587551,2,26,1587549,2,10,3,6,10,4,8,1310721, -2,9,26,1585291,2,10,3,6,10,4,8,1310721,2,9,26,2, -2,1715391,16,1310721,2,9,26,2,2,1594449,12,8,1310721,2,9,26, -1,6,2,1,6,3,26,5,6,4,10,8,8,1715319,14,1, -1594449,12,8,1604999,12,8,1715441,14,1310721,2,7,26,2,1587551,2,26, -1685483,12,10,3,6,10,4,8,1587611,2,1606729,12,1,6,1,10, -28,34,63,38,3,26,1715477,16,1715505,14,1310721,2,5,26,1607249,12, -10,3,6,10,4,8,1714589,14,1587613,2,1606959,12,8,1,1715523,14, -1,1310721,2,13,26,1310721,4,18,1310721,2,3,28,1310721,4,1310721,2, -1835009,40,1715571,16,1966081,1310721,4,1579223,12,1604999,12,8,3,1715671,16,1310721, -2,1607249,12,10,3,6,10,4,8,1587615,2,1606959,12,8,1310721,2, -2,9,1685483,12,1592805,12,8,1587611,2,1606729,12,1,6,1,10,28, -34,63,38,3,26,1715667,16,1715671,14,1715577,14,1587613,2,1606959,12,8, -1,1715689,14,1,1310721,2,3,26,1310721,4,18,1310721,2,43,28,1310721, -4,1310721,2,1835009,40,1715737,16,1966081,1310721,4,1579223,12,1,1310721,2,3, -26,4,3,1310721,2,5,26,4,1,1310721,2,13,26,4,1,1310721, -2,15,26,4,1604999,12,8,1585289,2,3,28,1,6,1,10,28, -34,63,38,3,26,1715993,16,1585291,2,1,40,1715841,16,3,1715873,14, -1585291,2,17,10,40,1,6,1,10,28,34,63,38,1,10,28, -1715963,16,1715955,14,97,110,32,101,110,104,97,110,99,101,109,101, -110,116,32,104,97,115,32,97,116,32,109,111,115,116,32,56, -32,111,117,116,112,117,116,115,0,1715881,1591173,12,8,1310721,2,5, -26,1585291,2,10,3,6,10,4,8,1604999,12,8,1310721,2,1607249,12, -10,3,6,10,4,8,1587599,2,1606959,12,8,1587601,2,1606425,12,1, -6,1,10,28,34,63,38,3,26,1716297,16,3,1716297,16,1310721,2, -3,26,2,17,28,1,6,1,10,28,34,63,38,3,26,1716187, -16,1716179,14,97,110,32,101,110,104,97,110,99,101,109,101,110, -116,32,116,97,107,101,115,32,97,116,32,109,111,115,116,32, -56,32,105,110,112,117,116,115,0,1716103,1591557,12,8,1310721,2,27, -26,1310721,2,3,26,2,26,1607249,12,10,3,6,10,4,8,1310721, -2,3,26,1,6,2,1,6,3,26,5,6,4,10,8,8, -1587611,2,1606729,12,1,6,1,10,28,34,63,38,3,26,1716293,16, -1716297,14,1716055,14,1587601,2,1606959,12,8,1310721,2,7,26,1587549,2,10, -3,6,10,4,8,1310721,2,17,26,1,10,3,6,10,4,8, -1310721,2,17,26,2,15,40,1716417,16,1,1594449,12,8,1310721,2,17, -26,1,6,2,1,6,3,26,5,6,4,10,8,8,1716353,14, -1310721,2,9,26,1587549,2,10,3,6,10,4,8,1310721,2,17,26, -1,10,3,6,10,4,8,1310721,2,17,26,2,1310721,2,3,26, -2,40,1716535,16,1,1594449,12,8,1310721,2,17,26,1,6,2,1, -6,3,26,5,6,4,10,8,8,1716463,14,1310721,2,17,26,1, -10,3,6,10,4,8,1310721,2,17,26,2,1310721,2,3,26,2, -40,1716787,16,1310721,2,9,26,2,1310721,2,17,26,2,26,1587551,2, -26,1587549,2,10,3,6,10,4,8,1310721,2,19,26,1310721,2,27, -26,1310721,2,17,26,2,26,2,10,3,6,10,4,8,1310721,2, -19,26,2,2,1716741,16,1310721,2,19,26,2,2,1594449,12,8,1310721, -2,19,26,1,6,2,1,6,3,26,5,6,4,10,8,8, -1716669,14,1,1594449,12,8,1310721,2,17,26,1,6,2,1,6,3, -26,5,6,4,10,8,8,1716557,14,1587679,2,1606729,12,1717083,16,1310721, -2,11,26,1587549,2,10,3,6,10,4,8,1585289,2,7,28,1, -6,1,10,28,34,63,38,1,10,28,1716933,16,1716925,14,101,120, -112,101,99,116,101,100,32,116,104,101,32,114,101,99,105,112, -101,32,97,115,32,97,32,115,116,114,105,110,103,0,1716861,1591557, -12,8,1585289,2,7,28,1,6,1,10,28,34,63,38,3,26, -1717071,16,1310721,2,19,26,1585291,2,10,3,6,10,4,8,1310721,2, -19,26,2,2,1717061,16,1310721,2,19,26,2,2,1594449,12,8,1310721, -2,19,26,1,6,2,1,6,3,26,5,6,4,10,8,8, -1716989,14,1604999,12,8,1716933,14,1,1594449,12,8,1717249,14,1587681,2,1606729, -12,1717195,16,1310721,2,11,26,1587549,2,10,3,6,10,4,8,1698013, -12,8,19,1594729,12,8,1310721,2,13,26,1587549,2,1310721,2,11,26, -2,28,10,3,6,10,4,8,1310721,2,15,26,3,10,3,6, -10,4,8,1717249,14,1717241,14,101,120,112,101,99,116,101,100,32, -109,105,99,114,111,32,111,114,32,118,109,0,1717199,1591557,12,8, -1310721,2,23,26,1585215,2,10,3,6,10,4,8,1310721,2,23,26, -2,1025,40,3,36,1717379,16,1717371,14,97,108,108,32,53,49,50, -32,101,110,104,97,110,99,101,109,101,110,116,32,115,108,111, -116,115,32,97,114,101,32,116,97,107,101,110,0,1717299,1591079,12, -8,1585215,1,6,2,1,6,3,26,5,6,4,10,8,8,1310721, -2,19,26,1310721,2,7,26,2,1587551,2,26,10,3,6,10,4, -8,1310721,2,19,26,2,1,26,1310721,2,23,26,2,10,3,6, -10,4,8,1310721,2,19,26,2,3,26,1310721,2,15,26,2,10, -3,6,10,4,8,1310721,2,19,26,2,5,26,1310721,2,3,26, -2,10,3,6,10,4,8,1310721,2,19,26,2,7,26,1310721,2, -5,26,2,10,3,6,10,4,8,1310721,2,19,26,2,9,26, -1310721,2,11,26,2,10,3,6,10,4,8,1310721,2,19,26,2, -11,26,1310721,2,13,26,2,10,3,6,10,4,8,1310721,2,19, -26,2,13,26,1310721,2,9,26,2,10,3,6,10,4,8,1310721, -2,21,26,1310721,2,2,13,1310721,2,23,26,2,1592805,12,10,3, -6,10,4,8,1434113,1310721,2,21,26,2,26,1310721,2,3,26,2, -1310721,2,5,26,2,33,30,26,1310721,2,7,26,2,513,30,26, -10,3,6,10,4,8,1587645,2,1606729,12,1717937,16,1310721,2,25,26, -1585291,2,1593303,12,10,3,6,10,4,8,1310721,2,25,26,2,1, -40,1717891,16,1310721,2,25,26,1585291,2,1595111,12,10,3,6,10,4, -8,1604999,12,8,1450497,1310721,2,21,26,2,26,1310721,2,25,26,2, -3,26,10,3,6,10,4,8,1587613,2,1606959,12,8,1587551,2,1, -6,1,10,28,34,63,38,3,26,1718257,16,1310721,2,25,26,1310721, -2,7,26,2,1572879,12,10,3,6,10,4,8,1310721,2,25,26, -2,1,40,1718257,16,1450497,1310721,2,21,26,2,26,2,1,6,1, -10,28,34,63,38,3,26,1718211,16,1310721,2,2,1718203,14,116,104, -101,32,101,110,104,97,110,99,101,109,101,110,116,32,100,105, -100,110,39,116,32,105,110,115,116,97,108,108,32,40,115,101, -101,32,105,110,115,116,97,108,108,39,115,32,99,111,100,101, -115,32,105,110,32,99,111,114,101,46,99,41,0,1718077,1591343,12, -8,1442305,1310721,2,21,26,2,26,1442305,1310721,2,21,26,2,26,2, -129,34,10,3,6,10,4,8,1,1718265,14,1,1310721,2,43,26, -1310721,4,18,1310721,2,3,28,1310721,4,1310721,2,1835009,40,1718313,16,1966081, -1310721,4,1579223,12,1,1310721,2,4,1585289,2,1,28,1,6,1,10, -28,34,63,38,1,10,28,1719203,16,1587603,2,1606425,12,1718401,16,1310721, -2,1,6,2,1,6,3,26,5,6,4,10,8,8,1719193,14, -1587605,2,1606425,12,1718479,16,1310721,2,1,6,2,1,6,-1,26,5, -6,4,10,8,8,1310721,2,2,1,40,1718475,16,1310721,2,1,10, -3,6,10,4,8,1719193,14,1310721,2,2,1,6,1,10,28,34, -63,38,3,26,1718563,16,1585289,2,5,28,1,6,1,10,28,34, -63,38,3,26,1,6,1,10,28,34,63,38,1,10,28,1718565, -14,1,1719183,16,1585291,2,1587639,2,28,1,6,1,10,28,34,63, -38,3,26,1718609,16,3,1718661,14,1585291,2,1587641,2,28,1,6,1, -10,28,34,63,38,3,26,1,6,1,10,28,34,63,38,1, -10,28,1718671,16,3,1718723,14,1585291,2,1587643,2,28,1,6,1,10, -28,34,63,38,3,26,1,6,1,10,28,34,63,38,1,10, -28,1718733,16,3,1718785,14,1585291,2,1587745,2,28,1,6,1,10,28, -34,63,38,3,26,1,6,1,10,28,34,63,38,1,10,28, -1718795,16,3,1718847,14,1585291,2,1587747,2,28,1,6,1,10,28,34, -63,38,3,26,1,6,1,10,28,34,63,38,1,10,28,1718857, -16,3,1718909,14,1585291,2,1587677,2,28,1,6,1,10,28,34,63, -38,3,26,1,6,1,10,28,34,63,38,1,10,28,1718919,16, -3,1718971,14,1585291,2,1587749,2,28,1,6,1,10,28,34,63,38, -3,26,1,6,1,10,28,34,63,38,1,10,28,1718981,16,3, -1719033,14,1585291,2,1587649,2,28,1,6,1,10,28,34,63,38,3, -26,1,6,1,10,28,34,63,38,1,10,28,1719043,16,3,1719095, -14,1585291,2,1587651,2,28,1,6,1,10,28,34,63,38,3,26, -1,6,1,10,28,34,63,38,1,10,28,1719105,16,3,1719157,14, -1585291,2,1587759,2,28,1,6,1,10,28,34,63,38,3,26,1, -6,1,10,28,34,63,38,1,10,28,1,6,1,10,28,34, -63,38,1,10,28,1719185,14,1,1719193,16,1719203,14,1604999,12,8,1718321, -14,1590585,1,10,3,6,10,4,8,1,1719227,14,1,1310721,2,3, -26,1310721,4,18,1310721,2,39,28,1310721,4,1310721,2,1835009,40,1719275,16, -1966081,1310721,4,1579223,12,1,1310721,2,5,26,4,1587729,2,1606425,12,1, -6,1,10,28,34,63,38,3,26,1719395,16,1587721,2,1719373,16,1587705, -1,26,2,1719365,14,105,115,110,39,116,32,97,32,116,121,112, -101,0,1719339,1591343,12,8,1587721,1,10,3,6,10,4,8,1,1720165, -14,1604999,12,8,3,1719601,16,1310721,2,5,26,2,17,40,3,36, -1719491,16,1719483,14,116,111,111,32,109,97,110,121,32,116,121,112, -101,32,112,97,114,97,109,101,116,101,114,115,0,1719433,1591079,12, -8,1310721,2,7,26,1310721,2,5,26,2,26,1607249,12,10,3,6, -10,4,8,1310721,2,5,26,1,6,2,1,6,3,26,5,6, -4,10,8,8,1587611,2,1606729,12,1,6,1,10,28,34,63,38, -3,26,1719597,16,1719601,14,1719401,14,1644489,12,8,1310721,2,23,26,1, -17,1574703,12,8,1310721,2,1,10,3,6,10,4,8,1310721,2,2, -1587721,2,40,1720033,16,1310721,2,3,26,1,10,3,6,10,4,8, -1310721,2,3,26,2,1310721,2,5,26,2,40,1719791,16,1310721,2,7, -26,1310721,2,3,26,2,26,2,1587705,1310721,2,2,26,2,28,1, -6,1,10,28,34,63,38,1,10,28,1,6,1,10,28,34, -63,38,1,10,28,1719793,14,1,1719835,16,1310721,2,3,26,1,6, -2,1,6,3,26,5,6,4,10,8,8,1719681,14,1310721,2,3, -26,2,1310721,2,5,26,2,28,1,6,1,10,28,34,63,38, -3,26,1719935,16,1587705,1310721,2,2,26,2,1719923,14,105,115,110,39, -116,32,97,32,116,121,112,101,0,1719897,1591343,12,8,1719999,14,1310721, -2,23,26,1310721,2,2,26,1310721,2,3,26,2,1310721,2,7,26, -1310721,2,3,26,2,26,2,1635193,12,10,3,6,10,4,8,1310721, -2,1,6,2,1,6,3,26,5,6,4,10,8,8,1719643,14, -1587721,2,1720071,16,1587725,2,1,6,1,10,28,34,63,38,1,10, -28,1720073,14,1,1720107,16,1587725,1587725,2,1310721,2,23,26,1637691,12,10, -3,6,10,4,8,1587705,1310721,2,7,26,1310721,2,5,26,2,1574491, -12,8,1587721,1310721,2,5,26,2,10,3,6,10,4,8,1,1720165, -14,1,1310721,2,39,26,1310721,4,18,1310721,2,1,28,1310721,4,1310721, -2,1835009,40,1720213,16,1966081,1310721,4,1579223,12,1587723,3,10,3,6,10, -4,8,1647783,12,8,1587723,1,10,3,6,10,4,8,1,1720259,14, -1,1310721,2,1,26,1310721,4,18,1310721,2,7,28,1310721,4,1310721,2, -1835009,40,1720307,16,1966081,1310721,4,1579223,12,1310721,2,3,26,4,1310721,2, -4,1587721,1,10,3,6,10,4,8,1310721,2,3,26,2,1720569,16, -1587551,2,1720479,16,1720471,14,112,97,114,115,101,32,119,111,114,100, -115,32,99,97,110,39,116,32,98,101,32,100,101,102,105,110, -101,100,32,119,104,105,108,101,32,98,117,105,108,100,105,110, -103,32,97,110,32,105,109,97,103,101,0,1720365,1591173,12,8,1310721, -2,5,26,1409537,1310721,2,2,26,2,11,1425921,1310721,2,2,26,2, -1592805,12,10,3,6,10,4,8,1442305,1310721,2,5,26,2,26,3, -17,34,33,34,65,34,10,3,6,10,4,8,1,1720577,14,1, -1310721,2,7,26,1310721,4,18,1310721,2,11,28,1310721,4,1310721,2,1835009, -40,1720625,16,1966081,1310721,4,1579223,12,3,1310721,2,4,1,1310721,2,3, -26,4,1590585,2,1720661,16,1718279,12,1722455,14,1587649,2,1606577,12,1720731,16, -1604999,12,8,1587613,2,1606729,12,1720713,16,1585287,1,10,3,6,10,4, -8,1,1722455,14,1310721,2,1,10,3,6,10,4,8,1587651,2,1606577, -12,1720771,16,1604999,12,8,1310721,2,3,26,3,10,3,6,10,4, -8,1587771,1,10,3,6,10,4,8,1587759,2,1606577,12,1720821,16,1604999, -12,8,1587771,3,10,3,6,10,4,8,1587721,1,10,3,6,10, -4,8,1587639,2,1606577,12,1721063,16,1605859,12,8,1587511,2,9,28,1, -6,1,10,28,34,63,38,3,26,1720943,16,1587513,2,1587599,2,28, -1,6,1,10,28,34,63,38,3,26,1,6,1,10,28,34, -63,38,1,10,28,1720945,14,1,1,6,1,10,28,34,63,38, -3,26,1721063,16,1604999,12,8,1310721,2,9,26,1607249,12,10,3,6, -10,4,8,1587725,1,10,3,6,10,4,8,1719241,12,8,1310721,2, -2,1,1,1310721,2,9,26,2,1709669,12,1310721,2,3,26,2,1720273, -12,1722455,14,1310721,2,2,1,6,1,10,28,34,63,38,3,26, -1721099,16,3,1721131,14,1310721,2,3,26,2,1,6,1,10,28,34, -63,38,1,10,28,1721141,16,3,1721167,14,1587771,2,1,6,1,10, -28,34,63,38,1,10,28,1721501,16,1720179,12,8,1310721,2,9,26, -1607249,12,10,3,6,10,4,8,1719241,12,8,1587727,2,1721271,16,1587727, -2,5,28,1,6,1,10,28,34,63,38,1,10,28,1,6, -1,10,28,34,63,38,1,10,28,1721273,14,1,1721341,16,1721333,14, -116,104,101,32,111,110,108,121,32,114,101,116,117,114,110,32, -116,97,103,32,105,115,32,46,117,0,1721281,1591173,12,8,1587599,2, -1606425,12,1,6,1,10,28,34,63,38,3,26,1721431,16,1721417,14, -101,120,112,101,99,116,101,100,32,97,32,102,117,110,99,116, -105,111,110,0,1721377,1591557,12,8,1,1722455,14,1310721,2,2,1587725,2, -1587727,2,5,28,1,6,1,10,28,34,63,38,3,26,1310721,2, -9,26,2,1709669,12,1310721,2,3,26,2,1720273,12,1722455,14,1587641,2, -1606577,12,1721523,16,1,1714235,12,1722455,14,1587745,2,1606577,12,1721547,16,1648157, -12,8,1,1722455,14,1587747,2,1606577,12,1721567,16,1650063,12,1722455,14,1587749, -2,1606577,12,1721587,16,1650183,12,1722455,14,1587677,2,1606577,12,1721607,16,1715703, -12,1722455,14,1587643,2,1606577,12,1721627,16,1715537,12,1722455,14,1585289,2,5, -28,1,6,1,10,28,34,63,38,3,26,1721857,16,1310721,2,5, -26,1585291,2,1593303,12,10,3,6,10,4,8,1310721,2,5,26,2, -1,40,3,36,1721775,16,1417729,1310721,2,5,26,2,26,2,11,28, -1,6,1,10,28,34,63,38,3,26,1,6,1,10,28,34, -63,38,1,10,28,1721777,14,1,1721827,16,1442305,1310721,2,5,26,2, -26,2,65,32,1,6,1,10,28,34,63,38,1,10,28,1721829, -14,1,1721857,16,1310721,2,5,26,2,1,1663505,12,8,1,1722455,14, -1646981,12,1721871,16,3,1721901,14,1587623,2,1606425,12,1,6,1,10,28, -34,63,38,1,10,28,1721911,16,3,1722005,14,1585289,2,5,28,1, -6,1,10,28,34,63,38,3,26,1721981,16,1585291,2,1593303,12,1, -40,1,6,1,10,28,34,63,38,1,10,28,1721983,14,1,1, -6,1,10,28,34,63,38,1,10,28,1722389,16,1720179,12,8,1310721, -2,9,26,1607249,12,10,3,6,10,4,8,1587599,2,1606425,12,1722057, -16,3,1722087,14,1587729,2,1606425,12,1,6,1,10,28,34,63,38, -1,10,28,1722293,16,1719241,12,8,1587727,2,1722161,16,1587727,2,5,28, -1,6,1,10,28,34,63,38,1,10,28,1,6,1,10,28, -34,63,38,1,10,28,1722163,14,1,1722231,16,1722223,14,116,104,101, -32,111,110,108,121,32,114,101,116,117,114,110,32,116,97,103, -32,105,115,32,46,117,0,1722171,1591173,12,8,1310721,2,2,1587725,2, -1587727,2,5,28,1,6,1,10,28,34,63,38,3,26,1310721,2, -9,26,2,1709669,12,1,1720273,12,1722455,14,1587721,2,1722363,16,1587705,1, -26,2,1722339,14,105,115,110,39,116,32,97,32,116,121,112,101, -0,1722313,1591343,12,8,1587721,1,10,3,6,10,4,8,1587725,2,1587727, -2,1310721,2,9,26,2,1714313,12,1722455,14,1722439,14,101,120,112,101, -99,116,101,100,32,97,32,100,101,99,108,97,114,97,116,105, -111,110,0,1722393,1591557,12,8,1,1722455,14,1,1310721,2,11,26,1310721, -4,18,1310721,2,1,28,1310721,4,1310721,2,1835009,40,1722503,16,1966081,1310721, -4,1579223,12,1585289,2,1,28,1,6,1,10,28,34,63,38,1, -10,28,1722547,16,1720591,12,8,1722503,14,1,1722555,14,1,1310721,2,1, -26,1310721,4,18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1722603,16, -1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2,1310721,2,3,26,4, -1590585,1,10,3,6,10,4,8,1310721,2,3,26,2,1585219,2,40, -1722973,16,1417729,1310721,2,3,26,2,26,2,3,28,1,6,1,10, -28,34,63,38,3,26,1722771,16,1442305,1310721,2,3,26,2,26,2, -3,32,1,6,1,10,28,34,63,38,3,26,1,6,1,10, -28,34,63,38,1,10,28,1722773,14,1,1722819,16,1450497,1310721,2,3, -26,2,26,2,1,6,1,10,28,34,63,38,1,10,28,1722821, -14,1,1722935,16,1585295,1425921,1310721,2,3,26,2,26,2,10,3,6, -10,4,8,1409537,1310721,2,3,26,2,26,2,1722927,14,105,115,32, -117,115,101,100,32,98,117,116,32,110,101,118,101,114,32,100, -101,102,105,110,101,100,0,1722875,1591343,12,8,1310721,2,3,26,1, -6,2,1,6,3,26,5,6,4,10,8,8,1722641,14,1590583,2, -1722987,16,1590891,12,8,1,1722995,14,1,1310721,2,5,26,1310721,4,18, -1310721,2,11,28,1310721,4,1310721,2,1835009,40,1723043,16,1966081,1310721,4,1579223, -12,1310721,2,3,26,4,1310721,2,4,3,1,10,28,1310721,2,5, -26,4,1,1310721,2,7,26,4,1585219,2,1310721,2,9,26,4,1707025, -12,8,1587577,2,1723149,16,1310721,2,5,26,1595029,12,10,3,6,10, -4,8,15,1594729,12,8,1310721,2,3,26,2,1723177,16,3,1310721,2, -2,1705455,12,8,3,1310721,2,2,1,1,1598871,12,8,1604999,12,8, -1310721,2,3,26,2,1723225,16,1722469,12,8,1723379,14,1310721,2,7,26, -1587549,2,10,3,6,10,4,8,3,1,1708505,12,8,1708837,12,8, -1585289,2,1,28,1,6,1,10,28,34,63,38,1,10,28,1723309, -16,1686451,12,8,1723265,14,1587559,2,1614147,12,8,1587565,2,1723357,16,1587569, -2,1,6,1,10,28,34,63,38,1,10,28,1723359,14,1,1723373, -16,3,3,1613419,12,8,1709075,12,8,1600299,12,8,1310721,2,9,26, -2,1722569,12,8,1310721,2,5,26,2,1,40,3,36,1723443,16,1310721, -2,5,26,2,1587549,2,1594811,12,8,1587549,2,1587555,2,10,40,1723477, -16,1587555,1587549,2,10,3,6,10,4,8,1707801,12,8,1310721,2,7, -26,2,1723499,14,1,1310721,2,11,26,1310721,4,18,1310721,2,3,28, -1310721,4,1310721,2,1835009,40,1723547,16,1966081,1310721,4,1579223,12,1310721,2,4, -1310721,2,2,1,1723009,12,1723571,14,1,1310721,2,3,26,1310721,4,18, -1310721,2,3,28,1310721,4,1310721,2,1835009,40,1723619,16,1966081,1310721,4,1579223, -12,1310721,2,4,1310721,2,2,3,1723009,12,8,1,1723647,14,1,1310721, -2,3,26,1310721,4,18,1310721,2,5,28,1310721,4,1310721,2,1835009,40, -1723695,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2,1,1723009,12, -1310721,2,3,26,4,1310721,2,3,26,2,1,6,12,10,8,1723749, -14,1,1310721,2,5,26,1310721,4,18,1310721,2,7,28,1310721,4,1310721, -2,1835009,40,1723797,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2,2, -1702323,12,1310721,2,3,26,4,1310721,2,3,26,2,1723661,12,1310721,2, -5,26,4,1310721,2,3,26,2,1580973,12,8,1310721,2,5,26,2, -1723879,14,1,1310721,2,7,26,1310721,4,18,1310721,2,7,28,1310721,4, -1310721,2,1835009,40,1723927,16,1966081,1310721,4,1579223,12,1310721,2,4,1310721,2, -2,1310721,2,3,26,4,1310721,2,3,26,2,1585219,2,40,1724347,16, -1417729,1310721,2,3,26,2,26,2,3,40,3,36,1724049,16,1417729,1310721, -2,3,26,2,26,2,9,10,40,3,36,1,6,1,10,28, -34,63,38,1,10,28,1724051,14,1,1724061,16,3,1724123,14,1417729,1310721, -2,3,26,2,26,2,13,28,1,6,1,10,28,34,63,38, -3,26,1,6,1,10,28,34,63,38,1,10,28,1724309,16,1417729, -1310721,2,3,26,2,26,2,1594449,12,8,1425921,1310721,2,3,26,2, -26,2,1594449,12,8,1434113,1310721,2,3,26,2,26,2,1594449,12,8, -1310721,2,5,26,1409537,1310721,2,3,26,2,26,2,10,3,6,10, -4,8,1310721,2,5,26,2,2,1724301,16,1310721,2,5,26,2,2, -1594449,12,8,1310721,2,5,26,1,6,2,1,6,3,26,5,6, -4,10,8,8,1724229,14,1,1594449,12,8,1310721,2,3,26,1,6, -2,1,6,3,26,5,6,4,10,8,8,1723949,14,1,1594449,12, -8,1,1724363,14,1,1310721,2,7,26,1310721,4,18,1310721,2,7,28, -1310721,4,1310721,2,1835009,40,1724411,16,1966081,1310721,4,1579223,12,1310721,2,4, -1310721,2,2,2,1724759,16,1310721,2,5,26,1310721,2,2,7,26,1592287, -12,10,3,6,10,4,8,1310721,2,3,26,1310721,2,5,26,2, -1310721,2,2,1,26,2,1310721,2,2,3,26,2,1592805,12,10,3, -6,10,4,8,1434113,1310721,2,3,26,2,26,1310721,2,2,5,26, -2,10,3,6,10,4,8,1442305,1310721,2,3,26,2,26,3,5, -34,10,3,6,10,4,8,1310721,2,2,1,26,2,13,28,1, -6,1,10,28,34,63,38,3,26,1724709,16,1310721,2,2,3,26, -2,1585215,2,40,3,36,1724687,16,1585215,1310721,2,2,3,26,2,3, -26,10,3,6,10,4,8,1310721,2,2,5,26,2,17,38,1572879, -12,8,1310721,2,1310721,2,2,7,26,1310721,2,2,7,26,1574039,12, -26,3,26,10,3,6,10,4,8,1724417,14,1,1724767,14,1,1310721, -2,7,26,1310721,4,18,1310721,2,21,28,1310721,4,1310721,2,1835009,40, -1724815,16,1966081,1310721,4,1579223,12,1310721,2,3,26,4,1310721,2,4,1587549, -2,1310721,2,5,26,4,1587551,2,1310721,2,7,26,4,1587553,2,1310721, -2,9,26,4,1585221,2,1310721,2,11,26,4,1585223,2,1310721,2,13, -26,4,1585219,2,1310721,2,15,26,4,1585215,2,1310721,2,17,26,4, -1585221,1585219,2,10,3,6,10,4,8,1585223,1585219,2,10,3,6,10, -4,8,1585215,1,10,3,6,10,4,8,1587549,1310721,2,2,10,3, -6,10,4,8,1587551,1310721,2,3,26,2,1310721,2,2,28,10,3, -6,10,4,8,1587553,1310721,2,2,393217,26,10,3,6,10,4,8, -1966081,1594643,12,8,1310721,1594643,12,8,5,1594729,12,8,1587667,2,1595111,12, -1595235,12,8,15,1594729,12,8,1,1594449,12,8,1,1594449,12,8,1706887, -12,8,1310721,2,3,26,2,11,26,1587549,2,10,3,6,10,4, -8,1585221,2,1723893,12,8,1310721,2,3,26,2,13,26,1587549,2,10, -3,6,10,4,8,1310721,2,19,26,1587549,2,1310721,2,2,28,10, -3,6,10,4,8,1310721,2,15,26,2,1593651,12,8,1585221,1310721,2, -11,26,2,10,3,6,10,4,8,1585223,1310721,2,13,26,2,10, -3,6,10,4,8,1587549,1310721,2,5,26,2,10,3,6,10,4, -8,1587551,1310721,2,7,26,2,10,3,6,10,4,8,1587553,1310721,2, -9,26,2,10,3,6,10,4,8,1585215,1310721,2,17,26,2,10, -3,6,10,4,8,1310721,2,19,26,2,1725403,14,1,1310721,2,21, -26,1310721,4,18,1310721,2,1,28,1310721,4,1310721,2,1835009,40,1725451,16, -1966081,1310721,4,1579223,12,1,1587555,2,1583851,12,8,1587551,2,1,6,1, -10,28,34,63,38,3,26,1725529,16,1587549,2,1587555,2,10,40,1, -6,1,10,28,34,63,38,1,10,28,1725531,14,1,1725549,16,1587555, -2,1587549,2,1583851,12,8,1572865,1572865,13,26,2,1583851,12,8,1540609,1540609, -2049,26,1583851,12,8,1310721,2,1966081,1583851,12,8,2064385,2097121,1583851,12,8, -1,1725609,14,1,1310721,2,1,26,1310721,4,18,1310721,2,1,28,1310721, -4,1310721,2,1835009,40,1725657,16,1966081,1310721,4,1579223,12,1585217,1327617,10,3, -6,10,4,8,1311233,1,16385,1574703,12,8,1585219,1,10,3,6,10, -4,8,1585225,1,10,3,6,10,4,8,1585227,1,10,3,6,10, -4,8,1585229,1,10,3,6,10,4,8,1585231,1,10,3,6,10, -4,8,1585233,1,10,3,6,10,4,8,1585235,1,10,3,6,10, -4,8,1585237,1,10,3,6,10,4,8,1587579,1,10,3,6,10, -4,8,1587583,1,10,3,6,10,4,8,1587585,1,10,3,6,10, -4,8,1587557,1,10,3,6,10,4,8,1587559,1,10,3,6,10, -4,8,1587599,1725903,14,40,0,1725899,1592287,12,10,3,6,10,4,8, -1587601,1725931,14,41,0,1725927,1592287,12,10,3,6,10,4,8,1587603,1725959, -14,123,0,1725955,1592287,12,10,3,6,10,4,8,1587605,1725987,14,125, -0,1725983,1592287,12,10,3,6,10,4,8,1587607,1726015,14,91,0,1726011, -1592287,12,10,3,6,10,4,8,1587609,1726043,14,93,0,1726039,1592287,12, -10,3,6,10,4,8,1587611,1726071,14,44,0,1726067,1592287,12,10,3, -6,10,4,8,1587613,1726099,14,59,0,1726095,1592287,12,10,3,6,10, -4,8,1587615,1726127,14,61,0,1726123,1592287,12,10,3,6,10,4,8, -1587617,1726157,14,45,62,0,1726151,1592287,12,10,3,6,10,4,8,1587619, -1726187,14,43,43,0,1726181,1592287,12,10,3,6,10,4,8,1587621,1726217, -14,45,45,0,1726211,1592287,12,10,3,6,10,4,8,1587623,1726245,14, -42,0,1726241,1592287,12,10,3,6,10,4,8,1587625,1726273,14,38,0, -1726269,1592287,12,10,3,6,10,4,8,1587627,1726301,14,58,0,1726297,1592287, -12,10,3,6,10,4,8,1587629,1726329,14,35,0,1726325,1592287,12,10, -3,6,10,4,8,1587631,1726357,14,45,0,1726353,1592287,12,10,3,6, -10,4,8,1587637,1726385,14,46,0,1726381,1592287,12,10,3,6,10,4, -8,1587659,1726413,14,63,0,1726409,1592287,12,10,3,6,10,4,8,1587661, -1726447,14,99,97,115,101,0,1726437,1592287,12,10,3,6,10,4,8, -1587663,1726487,14,100,101,102,97,117,108,116,0,1726471,1592287,12,10,3, -6,10,4,8,1587633,1726517,14,38,38,0,1726511,1592287,12,10,3,6, -10,4,8,1587635,1726547,14,124,124,0,1726541,1592287,12,10,3,6,10, -4,8,1587639,1726577,14,102,110,0,1726571,1592287,12,10,3,6,10,4, -8,1587641,1726609,14,108,101,116,0,1726601,1592287,12,10,3,6,10,4, -8,1587643,1726645,14,99,111,110,115,116,0,1726633,1592287,12,10,3,6, -10,4,8,1587645,1726679,14,101,108,115,101,0,1726669,1592287,12,10,3, -6,10,4,8,1587647,1726709,14,97,115,0,1726703,1592287,12,10,3,6, -10,4,8,1587649,1726753,14,117,110,99,104,101,99,107,101,100,0, -1726733,1592287,12,10,3,6,10,4,8,1587651,1726797,14,105,109,109,101, -100,105,97,116,101,0,1726777,1592287,12,10,3,6,10,4,8,1587653, -1726825,14,109,0,1726821,1592287,12,10,3,6,10,4,8,1587655,1726853,14, -100,0,1726849,1592287,12,10,3,6,10,4,8,1587657,1726881,14,117,0, -1726877,1592287,12,10,3,6,10,4,8,1587667,1726917,14,115,116,97,114, -116,0,1726905,1592287,12,10,3,6,10,4,8,1587669,1726951,14,109,97, -105,110,0,1726941,1592287,12,10,3,6,10,4,8,1587671,1726985,14,102, -114,101,101,0,1726975,1592287,12,10,3,6,10,4,8,1587673,1727017,14, -111,119,110,0,1727009,1592287,12,10,3,6,10,4,8,1587675,1727051,14, -113,110,101,119,0,1727041,1592287,12,10,3,6,10,4,8,1587665,1727105, -14,102,114,97,109,101,95,111,118,101,114,102,108,111,119,0, -1727075,1592287,12,10,3,6,10,4,8,1587677,1727145,14,101,110,104,97, -110,99,101,0,1727129,1592287,12,10,3,6,10,4,8,1587679,1727181,14, -109,105,99,114,111,0,1727169,1592287,12,10,3,6,10,4,8,1587681, -1727211,14,118,109,0,1727205,1592287,12,10,3,6,10,4,8,1,1727237, -14,1,1310721,2,1,26,1310721,4,18,1310721,2,1,28,1310721,4,1310721, -2,1835009,40,1727285,16,1966081,1310721,4,1579223,12,1727293,14,33,0,1727289,1727341, -14,48,32,36,32,48,32,126,32,45,32,124,32,51,49,32, -62,32,49,32,43,0,1727299,1611115,12,8,1727359,14,33,33,0,1727353, -1727411,14,48,32,36,32,48,32,126,32,45,32,124,32,51,49, -32,62,32,48,32,126,32,45,0,1727365,1611115,12,8,1727427,14,126, -0,1727423,1727443,14,45,49,32,94,0,1727433,1611115,12,8,1727459,14,45, -0,1727455,1727477,14,48,32,126,32,45,0,1727465,1611115,12,8,1727493,14, -42,0,1727489,21,1727505,14,42,0,1727501,1610075,12,8,1727521,14,47,0, -1727517,21,1727539,14,105,100,105,118,0,1727529,1610075,12,8,1727555,14,37, -0,1727551,21,1727573,14,105,109,111,100,0,1727563,1610075,12,8,1727589,14, -43,0,1727585,19,1727601,14,43,0,1727597,1610075,12,8,1727617,14,45,0, -1727613,19,1727629,14,45,0,1727625,1610075,12,8,1727647,14,60,60,0,1727641, -17,1727665,14,105,115,104,108,0,1727655,1610075,12,8,1727683,14,62,62, -0,1727677,17,1727695,14,62,0,1727691,1610075,12,8,1727711,14,60,0,1727707, -15,1727723,14,60,0,1727719,1610075,12,8,1727739,14,62,0,1727735,15,1727755, -14,126,32,60,0,1727747,1610075,12,8,1727773,14,60,61,0,1727767,15, -1727797,14,126,32,60,32,49,32,94,0,1727781,1610075,12,8,1727815,14, -62,61,0,1727809,15,1727835,14,60,32,49,32,94,0,1727823,1610075,12, -8,1727853,14,61,61,0,1727847,13,1727907,14,45,32,48,32,36,32, -48,32,126,32,45,32,124,32,51,49,32,62,32,49,32,43, -0,1727861,1610075,12,8,1727925,14,33,61,0,1727919,13,1727983,14,45,32, -48,32,36,32,48,32,126,32,45,32,124,32,51,49,32,62, -32,48,32,126,32,45,0,1727933,1610075,12,8,1727999,14,38,0,1727995, -11,1728011,14,38,0,1728007,1610075,12,8,1728027,14,94,0,1728023,9,1728039, -14,94,0,1728035,1610075,12,8,1728055,14,124,0,1728051,7,1728067,14,124, -0,1728063,1610075,12,8,1728085,14,38,38,0,1728079,3,1,10,28,1, -1610075,12,8,1728113,14,124,124,0,1728107,5,1,10,28,1,1610075,12, -8,1587615,2,1609247,12,8,1587617,2,1609247,12,8,1587619,2,1609247,12,8, -1587621,2,1609247,12,8,1728183,14,108,101,116,0,1728175,1688971,17,1611449,12, -8,1728205,14,105,102,0,1728199,1689043,17,1611449,12,8,1728233,14,119,104, -105,108,101,0,1728221,1691609,17,1611449,12,8,1728257,14,102,111,114,0, -1728249,1692221,17,1611449,12,8,1728287,14,115,119,105,116,99,104,0,1728273, -1694791,17,1611449,12,8,1728315,14,98,114,101,97,107,0,1728303,1693325,17, -1611449,12,8,1728349,14,99,111,110,116,105,110,117,101,0,1728331,1693751, -17,1611449,12,8,1728379,14,114,101,116,117,114,110,0,1728365,1696095,17, -1611449,12,8,1728415,14,117,110,99,104,101,99,107,101,100,0,1728395, -1697893,17,1611449,12,8,1728439,14,97,115,109,0,1728431,1700799,17,33,34, -1611449,12,8,1728471,14,113,117,111,116,101,0,1728459,1702049,33,1611449,12, -8,1728501,14,115,105,122,101,111,102,0,1728487,1653375,33,1611449,12,8, -1728531,14,116,121,112,101,111,102,0,1728517,1653491,33,1611449,12,8,1728553, -14,111,51,0,1728547,1696819,17,1611449,12,8,1728577,14,108,101,110,0, -1728569,1651499,33,1611449,12,8,1728601,14,99,97,112,0,1728593,1651989,33,1611449, -12,8,1728627,14,112,117,115,104,0,1728617,1652259,33,1611449,12,8,1728651, -14,112,111,112,0,1728643,1652983,33,1611449,12,8,1728681,14,114,101,115, -105,122,101,0,1728667,1653187,33,1611449,12,8,1,1728701,14,1,1310721,2, -1,26,1310721,4,18,1310721,2,5,28,1310721,4,1310721,2,1835009,40,1728749, -16,1966081,1310721,4,1579223,12,1577233,12,8,1725623,12,8,1572865,11,26,2, -1724377,12,8,1727251,12,8,1653603,12,8,1587549,1,10,3,6,10,4, -8,1587551,1,10,3,6,10,4,8,1587553,524289,10,3,6,10,4, -8,1587555,1,10,3,6,10,4,8,1585221,1585219,2,10,3,6,10, -4,8,1585223,1,10,3,6,10,4,8,1706887,12,8,1587549,2,1587555, -2,10,40,1728925,16,1587555,1587549,2,10,3,6,10,4,8,1310721,2, -1587669,2,1593303,12,10,3,6,10,4,8,1310721,2,2,1,40,3, -36,1729029,16,1417729,1310721,2,2,26,2,3,28,1,6,1,10,28, -34,63,38,3,26,1,6,1,10,28,34,63,38,1,10,28, -1729031,14,1,1729077,16,1442305,1310721,2,2,26,2,3,32,1,6,1, -10,28,34,63,38,1,10,28,1729079,14,1,1729137,16,1310721,2,3, -26,1425921,1310721,2,2,26,2,10,3,6,10,4,8,1310721,2,3, -26,2,1,6,12,10,8,8,1573437,12,8,1,1729151,14,1,1310721, -2,5,26,1310721,4,18,1,864357,0,115,116,97,114,116,0,1, -786439,2,105,110,115,116,97,108,108,0,1,786627,2,112,117,116, -99,0,1,786662,0,103,101,116,99,0,1,786690,0,101,111,102, -0,1,786718,0,104,97,108,116,0,1,786747,2,112,117,116,115, -0,1,786828,2,112,117,116,110,0,1,787019,2,115,116,114,108, -101,110,0,1,787091,4,115,116,114,101,113,0,1,787245,6,119, -99,111,112,121,0,1,787351,6,119,102,105,108,108,0,1,787483, -4,122,117,100,105,118,0,1,787714,4,122,100,105,118,0,1, -787902,4,122,109,111,100,0,1,787997,4,122,115,104,108,0,1, -788082,2,116,111,112,115,105,122,101,0,1,788258,4,102,112,117, -115,104,0,1,788382,4,102,117,110,108,105,110,107,0,1,788495, -4,109,107,98,108,111,99,107,0,1,788616,0,104,101,97,112, -95,105,110,105,116,0,1,788847,2,98,97,108,108,111,99,0, -1,789084,2,98,102,114,101,101,0,1,789482,2,105,115,111,98, -106,0,1,789611,0,102,114,97,109,101,95,111,118,101,114,102, -108,111,119,0,1,789674,0,111,111,109,0,1,789735,3,110,101, -119,95,114,97,119,0,1,790016,5,110,101,119,95,116,0,1, -790109,3,110,101,119,0,1,790145,2,111,115,105,122,101,0,1, -790206,2,116,121,112,101,111,102,95,111,98,106,0,1,790292,2, -114,101,108,101,97,115,101,0,1,790486,130,102,114,101,101,0, -1,790530,4,111,119,110,0,1,790594,7,100,110,101,119,0,1, -790780,4,100,103,114,111,119,0,1,791136,4,111,111,98,0,1, -791244,4,100,97,116,0,1,791351,516,100,112,117,115,104,0,1, -791458,2,100,112,111,112,0,1,791547,4,100,114,101,115,105,122, -101,0,1,791703,2,100,108,101,110,0,1,791739,2,100,99,97, -112,0,1,791779,2,109,97,114,107,0,1,791925,4,109,97,114, -107,114,97,110,103,101,0,1,791996,0,100,114,97,105,110,0, -1,862708,0,103,99,95,114,111,111,116,115,0,1,792078,0,103, -99,0,1,792396,0,108,105,118,101,95,111,98,106,101,99,116, -115,0,1,792492,0,108,97,114,103,101,115,116,95,102,114,101, -101,0,1,795293,0,101,114,114,97,116,0,1,795365,0,101,114, -114,101,110,100,0,1,795445,0,103,105,118,101,117,112,0,1, -795539,2,102,97,116,97,108,0,1,795586,2,115,101,114,114,0, -1,795671,4,115,101,114,114,110,0,1,795778,2,100,105,101,0, -1,795845,4,100,105,101,110,0,1,795922,2,99,101,114,114,0, -1,795981,4,99,101,114,114,110,0,1,796053,2,104,97,115,104, -115,0,1,796143,2,105,110,116,101,114,110,0,1,796402,6,97, -100,100,115,121,109,0,1,796651,2,108,111,111,107,117,112,0, -1,796825,2,112,111,112,115,121,109,115,0,1,796902,2,108,111, -111,107,117,112,115,0,1,796939,4,102,105,120,110,101,119,0, -1,797115,4,102,105,120,97,108,108,0,1,797224,2,101,109,105, -116,0,1,797321,2,108,105,116,0,1,797364,2,111,112,0,1, -797405,4,115,101,116,108,105,116,0,1,797473,2,106,109,112,0, -1,797514,0,104,111,108,101,0,1,797555,2,102,119,100,102,110, -0,1,797617,2,102,110,114,101,102,0,1,797704,2,99,97,108, -108,110,97,109,101,0,1,797781,2,108,97,100,100,114,0,1, -797835,2,118,97,100,100,114,0,1,797969,0,111,51,114,101,115, -101,116,0,1,798021,0,111,51,116,97,107,101,0,1,798100,2, -111,51,112,114,111,109,111,116,101,0,1,798320,2,111,51,109, -107,99,97,99,104,101,0,1,798552,2,111,51,114,101,102,114, -101,115,104,0,1,798676,10,111,51,114,101,103,105,111,110,0, -1,798929,0,111,51,102,108,117,115,104,0,1,799052,2,115,116, -114,108,105,116,0,1,799158,0,110,101,120,116,99,104,0,1, -799435,8,115,114,99,95,112,117,115,104,0,1,800149,0,115,114, -99,95,112,111,112,0,1,800490,2,105,115,111,112,99,104,0, -1,800601,4,111,112,112,114,101,102,105,120,0,1,800844,2,105, -115,100,105,103,0,1,800905,2,105,115,97,108,0,1,801044,2, -104,101,120,118,0,1,801176,0,101,115,99,99,104,0,1,801350, -2,111,112,108,101,120,0,1,801495,0,108,101,120,0,1,802499, -0,110,101,120,116,0,1,802698,2,112,101,101,107,97,116,0, -1,802929,0,112,101,101,107,0,1,802959,0,110,101,120,116,48, -0,1,803212,2,105,115,95,111,112,0,1,803288,2,105,115,95, -105,100,0,1,803364,2,97,99,99,101,112,116,0,1,803479,2, -101,120,112,101,99,116,0,1,803624,0,110,97,109,101,0,1, -803701,2,115,101,113,97,115,109,0,1,804270,2,109,110,101,109, -105,100,120,0,1,804372,4,101,109,105,116,115,101,113,0,1, -804623,2,97,100,100,107,111,112,0,1,804743,2,98,105,110,102, -105,110,100,0,1,804841,2,117,110,102,105,110,100,0,1,804939, -2,97,115,103,102,105,110,100,0,1,805037,6,97,100,100,95, -98,105,110,111,112,0,1,805557,4,97,100,100,95,117,110,111, -112,0,1,805724,6,97,100,100,95,107,119,0,1,805807,2,102, -105,110,100,108,111,99,0,1,805909,2,110,101,119,108,111,99, -0,1,806154,2,108,114,111,111,116,0,1,806223,2,116,114,97, -99,107,101,100,0,1,806272,2,116,111,117,99,104,0,1,806516, -2,112,108,97,105,110,117,115,101,0,1,806656,2,102,114,101, -101,118,97,114,0,1,806709,4,101,120,105,116,95,118,97,114, -115,0,1,807073,2,117,110,117,115,101,100,95,99,104,101,99, -107,0,1,807222,2,98,108,111,99,107,95,99,108,111,115,101, -0,1,807508,0,115,110,97,112,95,112,117,115,104,0,1,807783, -2,115,110,97,112,95,112,111,112,0,1,807824,2,115,110,97, -112,95,114,101,115,116,111,114,101,0,1,808043,2,101,109,112, -116,121,0,1,808119,2,115,110,97,112,95,99,109,112,0,1, -808524,2,115,116,97,116,101,110,97,109,101,0,1,808742,6,109, -101,114,103,101,95,101,114,114,0,1,809008,4,106,115,116,0, -1,809083,4,106,111,119,0,1,809139,4,106,104,109,0,1,809195, -2,101,120,105,116,95,114,101,99,0,1,809491,2,106,97,100, -100,0,1,809595,6,106,115,97,109,101,0,1,809855,4,106,111, -105,110,0,1,810647,6,102,105,120,117,112,115,0,1,810894,2, -98,97,99,107,101,100,103,101,0,1,811685,12,106,111,105,110, -50,0,1,811972,4,114,101,99,97,115,116,0,1,812508,4,97, -114,103,99,104,101,99,107,0,1,813274,2,101,109,105,116,111, -119,110,0,1,813392,6,97,115,115,105,103,110,99,104,101,99, -107,0,1,815169,2,114,101,116,99,104,101,99,107,0,1,815676, -2,104,97,110,100,117,112,0,1,816034,2,100,105,115,99,97, -114,100,0,1,816157,2,116,97,108,108,111,99,0,1,816264,8, -116,110,101,119,0,1,816438,2,116,112,116,114,0,1,816625,4, -116,97,114,114,0,1,816885,8,116,102,110,0,1,817346,4,116, -100,121,110,0,1,817596,4,116,118,97,114,0,1,817792,6,116, -105,110,115,116,0,1,818223,2,116,114,101,115,111,108,118,101, -0,1,818759,2,116,115,122,0,1,818845,4,115,117,98,115,116, -0,1,819344,2,105,115,110,117,109,0,1,819460,2,105,115,97, -103,103,0,1,819542,2,105,115,112,116,114,0,1,819624,2,100, -101,99,97,121,0,1,819687,2,116,101,108,101,109,0,1,819781, -4,99,111,109,112,97,116,0,1,820439,6,117,110,105,102,121, -0,1,820984,2,116,112,114,105,110,116,0,1,821612,6,116,99, -101,114,114,0,1,821812,6,116,99,110,101,101,100,0,1,822007, -2,116,112,102,105,110,100,0,1,822105,2,105,115,116,121,112, -101,110,97,109,101,0,1,822244,0,99,108,111,115,101,97,110, -103,108,101,0,1,822295,0,112,116,121,112,101,0,1,822501,0, -112,116,121,112,101,48,0,1,823490,0,116,115,116,97,114,116, -0,1,823891,0,100,116,121,112,101,0,1,824078,0,107,119,95, -115,116,114,117,99,116,0,1,825031,0,107,119,95,116,121,112, -101,0,1,825091,0,107,119,95,116,121,112,101,99,104,101,99, -107,0,1,825198,4,116,102,105,110,100,102,105,101,108,100,0, -1,825322,0,116,121,112,101,97,114,103,0,1,825489,0,97,114, -114,97,114,103,0,1,825635,2,110,111,103,114,111,119,0,1, -825749,0,107,119,95,108,101,110,0,1,825994,0,107,119,95,99, -97,112,0,1,826129,0,107,119,95,112,117,115,104,0,1,826491, -0,107,119,95,112,111,112,0,1,826593,0,107,119,95,114,101, -115,105,122,101,0,1,826687,0,107,119,95,115,105,122,101,111, -102,0,1,826745,0,107,119,95,116,121,112,101,111,102,0,1, -826801,0,116,121,112,101,115,95,105,110,105,116,0,1,827665,2, -105,115,110,117,109,111,112,0,1,827758,6,98,105,110,116,121, -112,101,0,1,829151,2,116,107,105,110,100,0,1,829187,2,116, -115,105,122,101,0,1,829222,2,116,110,97,109,101,0,1,829258, -2,116,108,101,110,0,1,829294,2,116,110,102,105,101,108,100, -115,0,1,829336,2,104,97,115,112,116,114,0,1,829588,4,102, -97,116,116,101,110,0,1,829638,6,102,97,116,49,0,1,830312, -6,102,97,116,105,110,0,1,830751,4,116,102,110,97,109,101, -0,1,830807,4,116,102,116,121,112,101,0,1,830865,4,116,102, -111,102,102,0,1,830923,2,116,114,101,116,0,1,830959,2,116, -110,112,97,114,97,109,115,0,1,830995,4,116,112,97,114,97, -109,0,1,831042,4,116,112,97,114,97,109,116,97,103,0,1, -831099,2,116,114,101,116,117,0,1,831137,2,116,110,97,114,103, -115,0,1,831232,4,116,97,114,103,0,1,831282,2,115,105,103, -111,102,0,1,831593,2,115,105,103,111,102,115,0,1,831692,0, -114,118,97,108,0,1,831752,4,107,119,99,97,108,108,0,1, -831898,0,115,116,109,116,111,110,108,121,0,1,831976,8,97,114, -103,115,0,1,832321,0,110,101,119,116,121,112,101,100,0,1, -832798,2,99,97,108,108,0,1,833554,2,101,110,104,99,97,108, -108,0,1,833923,0,112,114,105,109,97,114,121,0,1,835388,4, -105,110,99,100,101,99,0,1,835812,2,102,105,101,108,100,0, -1,836488,0,112,111,115,116,102,105,120,0,1,838378,0,117,110, -97,114,121,0,1,839318,2,98,105,110,0,1,839831,0,115,116, -111,114,101,107,101,101,112,0,1,839879,2,116,101,114,110,97, -114,121,0,1,840529,0,101,120,112,114,0,1,841710,0,115,116, -109,116,115,116,97,114,116,0,1,841957,0,98,108,111,99,107, -101,120,112,114,0,1,842333,0,99,112,114,105,109,0,1,842741, -0,99,101,120,112,114,0,1,843098,0,114,101,115,121,110,99, -0,1,843225,0,115,116,109,116,0,1,843493,0,98,108,111,99, -107,0,1,843621,0,115,117,98,115,116,109,116,0,1,843701,2, -108,111,99,97,108,100,101,99,108,0,1,844485,0,107,119,95, -118,97,114,0,1,844521,0,107,119,95,105,102,0,1,845067,4, -108,111,111,112,95,112,117,115,104,0,1,845274,4,108,111,111, -112,95,101,110,100,0,1,845804,0,107,119,95,119,104,105,108, -101,0,1,846110,0,107,119,95,102,111,114,0,1,846662,0,107, -119,95,98,114,101,97,107,0,1,846875,0,107,119,95,99,111, -110,116,105,110,117,101,0,1,847162,4,99,97,115,101,98,111, -100,121,0,1,847395,0,107,119,95,115,119,105,116,99,104,0, -1,848047,0,107,119,95,114,101,116,117,114,110,0,1,848409,0, -107,119,95,111,51,0,1,848946,0,107,119,95,117,110,99,104, -101,99,107,101,100,0,1,849006,0,97,115,109,98,108,111,99, -107,0,1,850399,0,107,119,95,97,115,109,0,1,850441,1,103, -114,97,98,0,1,850781,3,113,110,101,119,0,1,850859,67,113, -100,117,112,0,1,850937,68,119,99,111,112,121,116,111,0,1, -851024,0,107,119,95,113,117,111,116,101,0,1,851161,3,116,111, -107,101,110,115,0,1,851401,130,102,101,101,100,0,1,851444,0, -114,101,97,100,115,114,99,0,1,851866,0,112,115,107,105,112, -97,110,103,108,101,0,1,851998,6,112,114,101,115,99,97,110, -95,102,110,0,1,852727,4,112,114,101,115,99,97,110,0,1, -853443,0,117,110,105,116,95,115,116,100,105,110,0,1,853512,0, -99,116,120,95,112,117,115,104,0,1,853900,0,99,116,120,95, -112,111,112,0,1,854252,4,102,110,95,98,101,103,105,110,0, -1,854418,0,112,114,111,108,111,103,117,101,0,1,854537,0,101, -112,105,108,111,103,117,101,0,1,854629,0,98,111,100,121,0, -1,854834,8,102,110,100,101,102,0,1,857117,2,103,100,101,99, -108,0,1,857156,6,103,100,101,99,108,50,0,1,857768,0,103, -99,111,110,115,116,0,1,857851,0,101,110,104,100,101,102,0, -1,859139,0,116,111,112,115,121,110,99,0,1,859620,0,103,101, -110,112,97,114,97,109,115,0,1,860089,0,114,101,116,116,121, -112,101,0,1,860136,4,102,110,100,111,110,101,0,1,860295,0, -116,111,112,105,116,101,109,0,1,861234,0,117,110,105,116,95, -116,111,112,0,1,861284,2,117,110,105,116,95,101,110,100,0, -1,861504,4,99,111,109,112,105,108,101,95,108,105,115,116,0, -1,861756,2,99,111,109,112,105,108,101,0,1,861792,2,108,111, -97,100,0,1,861830,2,101,118,97,108,0,1,861881,2,101,118, -97,108,115,0,1,861946,2,98,108,111,98,95,101,109,105,116, -0,1,862188,2,98,108,111,98,95,108,111,97,100,0,1,862390, -4,98,117,105,108,100,95,105,109,97,103,101,0,1,862811,0, -122,99,95,105,110,105,116,0,1,863625,0,122,99,95,116,97, -98,108,101,115,0,4,1048576,0,77,87,0,4,262144,0,72,69, -65,80,95,76,79,0,4,655360,0,72,69,65,80,95,72,73, -0,4,655360,0,90,70,80,0,4,786432,0,71,79,82,71,0, -4,917504,0,70,66,79,84,0,4,983040,0,70,84,79,80,0, -4,983040,0,82,83,48,0,4,1015808,0,77,65,82,75,48,0, -4,16384,0,77,65,82,75,78,0,4,1032192,0,68,83,76,79, -0,4,1048560,0,68,83,72,73,0,4,729683222,0,77,65,71,73, -67,0,6,0,201337106,105,100,105,118,0,6,1,201343762,105,109,111, -100,0,6,2,201350418,105,115,104,108,0,6,3,201356817,108,102,97, -0,6,4,201366802,111,117,116,115,105,100,101,0,3,787450,0,112, -111,119,50,0,2,787482,0,122,114,101,109,0,4,6,0,72, -68,82,0,2,788046,0,104,98,117,109,112,0,3,788047,0,102, -114,101,101,108,0,2,788079,0,103,99,95,114,117,110,115,0, -2,788080,0,103,99,95,102,114,101,101,100,0,2,788081,0,103, -99,95,97,117,116,111,0,2,789083,0,102,101,110,100,0,2, -791775,0,109,115,95,116,111,112,0,2,791776,0,109,115,95,111, -118,101,114,0,2,791777,0,103,99,95,108,111,0,2,791778,0, -103,99,95,104,105,0,4,8192,0,73,72,78,0,4,655616,0, -82,95,73,72,0,4,663808,0,82,95,80,79,79,76,0,4, -704512,0,82,95,80,79,79,76,69,78,68,0,4,4096,0,78, -83,0,4,704768,0,82,95,83,89,77,0,4,704768,0,115,110, -97,109,101,0,4,708864,0,115,107,105,110,100,0,4,712960,0, -115,118,97,108,0,4,717056,0,115,115,105,103,0,4,721152,0, -115,102,108,97,103,0,4,725248,0,115,102,105,120,0,4,729344, -0,115,110,101,120,116,0,4,512,0,78,76,0,4,733440,0, -108,110,97,109,101,0,4,733952,0,108,115,108,111,116,0,4, -734464,0,108,104,111,109,101,0,4,734976,0,108,115,116,97,116, -101,0,4,735488,0,108,111,119,110,101,114,0,4,736000,0,108, -117,115,101,100,0,4,736512,0,108,97,114,114,0,4,737024,0, -108,111,119,110,0,4,8192,0,78,70,0,4,737536,0,102,115, -105,116,101,0,4,745728,0,102,110,101,120,116,0,4,753920,0, -82,95,83,78,65,80,0,4,762112,0,82,95,81,66,85,70, -0,4,770304,0,82,95,83,82,67,0,4,771328,0,82,95,83, -69,81,0,4,773376,0,98,110,97,109,101,0,4,773440,0,98, -112,114,101,99,0,4,773504,0,98,115,101,113,0,4,773568,0, -98,108,101,110,0,4,773632,0,117,110,97,109,101,0,4,773664, -0,117,115,101,113,0,4,773696,0,117,108,101,110,0,4,773728, -0,97,110,97,109,101,0,4,773792,0,97,98,105,110,0,4, -773888,0,107,111,112,115,0,4,774400,0,82,95,67,84,88,0, -4,776448,0,82,95,76,79,79,80,0,4,777472,0,82,95,65, -83,77,0,4,0,0,84,95,69,79,70,0,4,1,0,84, -95,78,85,77,0,4,2,0,84,95,73,68,0,4,3,0, -84,95,83,84,82,0,4,4,0,84,95,79,80,0,4,1, -0,75,95,70,78,0,4,2,0,75,95,71,86,65,82,0, -4,3,0,75,95,71,65,82,82,0,4,4,0,75,95,67, -79,78,83,84,0,4,5,0,75,95,75,87,0,4,6,0, -75,95,69,78,72,0,4,7,0,75,95,84,89,80,69,0, -4,1,0,70,95,68,69,70,0,4,2,0,70,95,83,73, -71,0,4,4,0,70,95,85,78,84,89,80,69,68,0,4, -8,0,70,95,83,84,77,84,0,4,16,0,70,95,69,88, -80,82,0,4,32,0,70,95,84,79,80,0,4,64,0,70, -95,70,65,76,76,66,65,67,75,0,4,128,0,70,95,71, -69,78,0,4,256,0,70,95,80,82,69,0,4,512,0,70, -95,79,51,0,4,0,0,83,95,80,76,65,73,78,0,4, -1,0,83,95,77,0,4,2,0,83,95,85,0,4,3,0, -83,95,68,0,4,4,0,83,95,68,69,65,68,0,4,5, -0,83,95,67,72,73,76,68,0,4,6,0,83,95,66,79, -82,82,79,87,0,4,0,0,67,95,80,76,65,73,78,0, -4,1,0,67,95,70,82,69,83,72,0,4,2,0,67,95, -86,65,82,0,4,0,0,76,86,95,78,79,78,69,0,4, -1,0,76,86,95,76,79,67,65,76,0,4,2,0,76,86, -95,71,76,79,66,65,76,0,4,3,0,76,86,95,69,76, -69,77,0,4,4,0,76,86,95,79,84,72,69,82,0,4, -0,0,79,95,81,0,4,1,0,79,95,76,68,0,4,2, -0,79,95,83,84,0,4,3,0,79,95,80,73,67,75,0, -4,4,0,79,95,68,82,79,80,0,4,5,0,79,95,83, -87,65,80,0,4,6,0,79,95,67,65,76,76,0,4,7, -0,79,95,74,77,80,0,4,8,0,79,95,74,90,0,4, -9,0,79,95,82,69,84,0,4,13,0,79,95,65,68,68, -0,4,14,0,79,95,83,85,66,0,4,20,0,79,95,76, -84,0,4,22,0,88,79,80,48,0,4,-2,0,83,69,81, -82,69,70,0,2,792607,0,110,101,110,104,0,2,792608,0,112, -111,111,108,116,111,112,0,2,792609,0,110,115,121,109,0,2, -792610,0,117,98,97,115,101,0,2,792611,0,118,105,115,108,111, -0,2,792612,0,110,102,105,120,117,0,2,792613,0,102,105,120, -102,114,101,101,0,2,792614,0,110,98,105,110,0,2,792615,0, -110,117,110,0,2,792616,0,110,97,115,103,0,2,792617,0,110, -107,111,112,0,2,792618,0,115,101,113,116,111,112,0,2,792619, -0,109,110,101,109,0,2,792643,0,99,104,101,99,107,95,111, -110,0,2,792644,0,116,107,0,2,792645,0,116,118,0,2,792646, -0,116,103,108,117,101,0,2,792647,0,116,108,105,110,101,0, -2,792648,0,108,105,110,101,0,2,792649,0,99,104,0,2,792650, -0,99,104,107,105,110,100,0,2,792651,0,99,104,112,116,114, -0,2,792652,0,99,104,98,97,115,101,0,2,792653,0,113,100, -111,110,101,0,2,792654,0,105,115,112,0,3,792655,0,116,98, -117,102,0,2,793755,0,112,107,95,116,107,0,2,793756,0,112, -107,95,116,118,0,2,793757,0,112,113,95,110,0,3,793758,0, -112,113,95,116,107,0,3,793762,0,112,113,95,116,118,0,3, -793766,0,112,113,95,103,108,0,3,793770,0,112,113,95,108,110, -0,2,793774,0,104,101,114,101,0,2,793775,0,104,100,101,108, -116,97,0,2,793776,0,104,108,105,109,105,116,0,2,793777,0, -112,116,111,112,0,2,793778,0,110,108,111,99,0,2,793779,0, -108,98,97,115,101,0,2,793780,0,102,100,101,112,116,104,0, -2,793781,0,102,115,108,111,116,115,0,2,793782,0,102,99,104, -107,0,2,793783,0,102,114,101,116,0,2,793784,0,108,105,118, -101,0,2,793785,0,98,120,100,101,112,116,104,0,2,793786,0, -101,112,105,99,104,97,105,110,0,2,793787,0,102,102,114,97, -109,101,0,2,793788,0,105,110,102,110,0,2,793789,0,108,115, -112,0,2,793790,0,108,111,111,112,98,97,115,101,0,2,793791, -0,99,116,120,115,112,0,2,793792,0,115,110,97,112,116,111, -112,0,2,793793,0,108,118,0,2,793794,0,108,118,107,0,2, -793795,0,108,118,105,0,2,793796,0,107,119,95,101,120,112,114, -0,2,793797,0,120,99,108,115,0,2,793798,0,102,116,121,0, -2,793799,0,115,95,108,112,0,2,793800,0,115,95,114,112,0, -2,793801,0,115,95,108,98,0,2,793802,0,115,95,114,98,0, -2,793803,0,115,95,108,107,0,2,793804,0,115,95,114,107,0, -2,793805,0,115,95,99,111,109,109,97,0,2,793806,0,115,95, -115,101,109,105,0,2,793807,0,115,95,101,113,0,2,793808,0, -115,95,97,114,114,111,119,0,2,793809,0,115,95,105,110,99, -0,2,793810,0,115,95,100,101,99,0,2,793811,0,115,95,115, -116,97,114,0,2,793812,0,115,95,97,109,112,0,2,793813,0, -115,95,99,111,108,111,110,0,2,793814,0,115,95,104,97,115, -104,0,2,793815,0,115,95,109,105,110,117,115,0,2,793816,0, -115,95,97,110,100,97,110,100,0,2,793817,0,115,95,111,114, -111,114,0,2,793818,0,115,95,100,111,116,0,2,793819,0,115, -95,102,110,0,2,793820,0,115,95,118,97,114,0,2,793821,0, -115,95,99,111,110,115,116,0,2,793822,0,115,95,101,108,115, -101,0,2,793823,0,115,95,97,115,0,2,793824,0,115,95,117, -110,99,104,101,99,107,101,100,0,2,793825,0,115,95,105,109, -109,101,100,105,97,116,101,0,2,793826,0,115,95,109,0,2, -793827,0,115,95,100,0,2,793828,0,115,95,117,0,2,793829,0, -115,95,113,0,2,793830,0,115,95,99,97,115,101,0,2,793831, -0,115,95,100,101,102,97,117,108,116,0,2,793832,0,115,95, -102,111,118,102,0,2,793833,0,115,95,115,116,97,114,116,0, -2,793834,0,115,95,109,97,105,110,0,2,793835,0,115,95,102, -114,101,101,0,2,793836,0,115,95,111,119,110,0,2,793837,0, -115,95,113,110,101,119,0,2,793838,0,115,95,101,110,104,97, -110,99,101,0,2,793839,0,115,95,109,105,99,114,111,0,2, -793840,0,115,95,118,109,0,4,0,0,84,89,95,87,79,82, -68,0,4,1,0,84,89,95,73,78,84,0,4,2,0,84, -89,95,67,72,65,82,0,4,3,0,84,89,95,66,79,79, -76,0,4,4,0,84,89,95,86,79,73,68,0,4,5,0, -84,89,95,80,84,82,0,4,6,0,84,89,95,65,82,82, -0,4,7,0,84,89,95,70,78,0,4,8,0,84,89,95, -83,84,82,85,67,84,0,4,9,0,84,89,95,86,65,82, -0,4,10,0,84,89,95,71,69,78,0,4,11,0,84,89, -95,68,89,78,0,4,638976,0,82,95,84,89,0,4,655360,0, -82,95,84,89,69,78,68,0,4,1024,0,78,84,76,0,4, -778496,0,108,116,121,112,101,0,4,779008,0,108,116,97,103,0, -4,779520,0,115,116,121,112,101,0,2,793841,0,116,121,116,111, -112,0,2,793842,0,110,116,108,0,2,793843,0,116,119,111,114, -100,0,2,793844,0,116,105,110,116,0,2,793845,0,116,99,104, -97,114,0,2,793846,0,116,98,111,111,108,0,2,793847,0,116, -118,111,105,100,0,2,793848,0,116,99,95,111,110,0,2,793849, -0,120,116,121,0,2,793850,0,120,122,101,114,111,0,2,793851, -0,100,114,121,0,3,793852,0,116,112,110,0,2,793860,0,110, -116,112,0,2,793861,0,116,118,97,117,116,111,0,2,793862,0, -100,116,121,0,2,793863,0,100,116,97,103,0,2,793864,0,115, -95,108,116,0,2,793865,0,115,95,103,116,0,2,793866,0,115, -95,115,104,114,0,2,793867,0,115,95,108,101,0,2,793868,0, -115,95,103,101,0,2,793869,0,115,95,101,113,101,113,0,2, -793870,0,115,95,110,101,0,2,793871,0,115,95,112,108,117,115, -0,2,793872,0,115,95,115,116,114,117,99,116,0,2,793873,0, -115,95,116,121,112,101,0,2,793874,0,115,95,116,121,112,101, -99,104,101,99,107,0,2,793875,0,115,95,111,110,0,2,793876, -0,115,95,111,102,102,0,2,793877,0,115,95,110,101,119,0, -2,793878,0,115,95,110,101,119,95,116,0,2,793879,0,115,95, -111,51,0,2,793880,0,115,95,108,102,97,0,2,793881,0,115, -95,111,117,116,115,105,100,101,0,2,793882,0,115,95,110,101, -119,95,114,97,119,0,2,793883,0,115,95,111,111,98,0,2, -793884,0,111,51,111,110,0,2,793885,0,111,51,110,120,116,0, -2,793886,0,111,51,111,110,101,0,3,793887,0,111,51,115,108, -0,3,793919,0,111,51,114,103,0,2,793951,0,110,111,51,115, -108,0,3,793952,0,111,51,112,101,110,100,0,2,794652,0,110, -111,51,112,101,110,100,0,3,794653,0,111,51,100,115,99,0, -3,794733,0,111,51,102,114,101,101,0,2,794741,0,110,111,51, -102,114,101,101,0,2,794742,0,111,51,110,114,101,103,0,3, -794743,0,111,51,99,97,99,104,101,0,2,795255,0,97,114,103, -108,111,99,0,2,795256,0,115,95,104,105,116,101,109,115,0, -2,795257,0,115,95,104,108,101,110,0,2,795258,0,115,95,102, -97,116,116,101,110,0,3,795259,0,110,117,109,111,112,115,0, -2,795271,0,110,110,117,109,111,112,115,0,2,795272,0,115,95, -102,105,120,101,100,0,2,795273,0,115,95,100,108,101,110,0, -2,795274,0,115,95,100,99,97,112,0,2,795275,0,115,95,100, -110,101,119,0,2,795276,0,115,95,100,97,116,0,2,795277,0, -115,95,100,112,117,115,104,0,2,795278,0,115,95,100,112,111, -112,0,2,795279,0,115,95,100,114,101,115,105,122,101,0,2, -795280,0,120,99,111,110,115,116,0,2,795281,0,120,99,118,97, -108,0,3,795282,0,103,98,105,110,100,0,2,795290,0,110,103, -98,105,110,100,0,2,795291,0,110,101,114,114,0,2,795292,0, -112,97,110,105,99,0,4,783616,0,82,95,69,88,73,84,0, -4,786176,0,82,95,69,88,73,84,69,78,68,0,2,808942,0, -101,120,116,111,112,0,3,808943,0,106,112,115,0,2,809007,0, -110,106,112,115,0,0 -}; -#define GLEN 84118 diff --git a/docs/history/17-o3-boundaries/code/io_linux.c b/docs/history/17-o3-boundaries/code/io_linux.c deleted file mode 100644 index 7ea34e0..0000000 --- a/docs/history/17-o3-boundaries/code/io_linux.c +++ /dev/null @@ -1,6 +0,0 @@ -#include <stdio.h> -int J; -static int pk(void){int c=getchar();ungetc(c,stdin);return c==EOF;} -char Q(void){int c=getchar();J=pk();return c;} -void G(char c){putchar(c);} -__attribute__((constructor)) static void init(void){J=pk();} diff --git a/docs/history/17-o3-boundaries/code/mkgenome.c b/docs/history/17-o3-boundaries/code/mkgenome.c deleted file mode 100644 index 8fb2cc5..0000000 --- a/docs/history/17-o3-boundaries/code/mkgenome.c +++ /dev/null @@ -1,16 +0,0 @@ -/* turns a genome image (little-endian 32-bit words on stdin, as written by - tools/build.zc) into genome.h */ -#include <stdio.h> -#define GORG 0xC0000 -int main(void) -{ - unsigned char b[4]; int n = 0; - printf("#define GORG %d\nstatic const int genome[] = {", GORG); - while (fread(b, 1, 4, stdin) == 4) { - int w = (int)(b[0] | b[1] << 8 | b[2] << 16 | (unsigned)b[3] << 24); - printf("%s%d", !n ? "\n" : n % 16 ? "," : ",\n", w); - n++; - } - printf("\n};\n#define GLEN %d\n", n); - return n ? 0 : 1; -} diff --git a/docs/history/17-o3-boundaries/code/src/compiler.zc b/docs/history/17-o3-boundaries/code/src/compiler.zc deleted file mode 100644 index 1ac0c4b..0000000 --- a/docs/history/17-o3-boundaries/code/src/compiler.zc +++ /dev/null @@ -1,2980 +0,0 @@ -// ============================================================================ -// compiler.zc: the resident zc compiler. it lives in the genome next to the -// runtime, compiles source straight to vm words in memory, and is visible to -// the programs it compiles: every function and global here can be called or -// patched by name, and parse words (immediate fns) run inside it. -// ============================================================================ - -// ---- compiler data region (fixed addresses, 0xA0100 .. 0xBE100) ---- -const IHN = 8192; -const R_IH = 0xA0100; // intern hash table -const R_POOL = 0xA2100; // interned strings: [symbol head] chars 0 -const R_POOLEND = 0xAC000; -const NS = 4096; // symbol table, one array per field -const R_SYM = 0xAC100; -const sname = 0xAC100, skind = 0xAD100, sval = 0xAE100, ssig = 0xAF100; -const sflag = 0xB0100, sfix = 0xB1100, snext = 0xB2100; -const NL = 512; // locals, one array per field -const lname = 0xB3100, lslot = 0xB3300, lhome = 0xB3500, lstate = 0xB3700; -const lowner = 0xB3900, lused = 0xB3B00, larr = 0xB3D00, lown = 0xB3F00; // lown: has owned an object -const NF = 8192; // patch nodes: a site and a link -const fsite = 0xB4100, fnext = 0xB6100; -const R_SNAP = 0xB8100; // analyzer snapshots -const R_QBUF = 0xBA100; // token buffer for quote and grab -const R_SRC = 0xBC100; // input source stack, 32 words per frame -const R_SEQ = 0xBC500; // operator code sequences -const bname = 0xBCD00, bprec = 0xBCD40, bseq = 0xBCD80, blen = 0xBCDC0; // binary operators -const uname = 0xBCE00, useq = 0xBCE20, ulen = 0xBCE40; // unary operators -const aname = 0xBCE60, abin = 0xBCEA0; // compound assignment -const kops = 0xBCF00; // every operator spelling the lexer knows -const R_CTX = 0xBD100; // saved compiler contexts for nested compiles -const R_LOOP = 0xBD900; // loop stack, 8 words per loop or switch -const R_ASM = 0xBDD00; // asm block labels - -// ---- token kinds, symbol kinds and flags ---- -const T_EOF = 0, T_NUM = 1, T_ID = 2, T_STR = 3, T_OP = 4; -const K_FN = 1, K_GVAR = 2, K_GARR = 3, K_CONST = 4, K_KW = 5, K_ENH = 6, K_TYPE = 7; -const F_DEF = 1, F_SIG = 2, F_UNTYPED = 4, F_STMT = 8, F_EXPR = 16, F_TOP = 32, F_FALLBACK = 64, F_GEN = 128, F_PRE = 256, F_O3 = 512; -// variable states for the lifetime analyzer -const S_PLAIN = 0, S_M = 1, S_U = 2, S_D = 3, S_DEAD = 4, S_CHILD = 5, S_BORROW = 6; -// expression classes: plain word, a new object, or a bare variable (C_VAR + index) -const C_PLAIN = 0, C_FRESH = 1, C_VAR = 2; -// lvalue kinds -const LV_NONE = 0, LV_LOCAL = 1, LV_GLOBAL = 2, LV_ELEM = 3, LV_OTHER = 4; -// opcodes -const O_Q = 0, O_LD = 1, O_ST = 2, O_PICK = 3, O_DROP = 4, O_SWAP = 5, O_CALL = 6, O_JMP = 7; -const O_JZ = 8, O_RET = 9, O_ADD = 13, O_SUB = 14, O_LT = 20; -const XOP0 = 22; // first enhancement opcode -const SEQREF = -2; // in an operator sequence: the next word names a symbol - -// ---- state ---- -let nenh, pooltop, nsym, ubase, vislo, nfixu, fixfree; -let nbin, nun, nasg, nkop, seqtop; -let mnem = "q@!$_~cjzr,?.+-*&|^><%"; -let check_on = 1; // set to 0 to switch the analyzer off for what follows -let tk, tv, tglue, tline, line = 1, ch, chkind, chptr, chbase, qdone, isp = -1; -let tbuf[1100]; -let pk_tk, pk_tv, pq_n, pq_tk[4], pq_tv[4], pq_gl[4], pq_ln[4]; // up to 4 tokens of lookahead -let here, hdelta, hlimit, ptop; -let nloc, lbase, fdepth, fslots, fchk, fret, live, bxdepth, epichain, fframe, infn; -let lsp, loopbase, ctxsp, snaptop; -let lv, lvk, lvi, kw_expr, xcls, fty; -// interned spellings the parser compares against -let s_lp, s_rp, s_lb, s_rb, s_lk, s_rk, s_comma, s_semi, s_eq, s_arrow, s_inc, s_dec; -let s_star, s_amp, s_colon, s_hash, s_minus, s_andand, s_oror; -let s_dot, s_fn, s_var, s_const, s_else, s_as, s_unchecked, s_immediate, s_m, s_d, s_u; -let s_q, s_case, s_default, s_fovf, s_start, s_main, s_free, s_own, s_qnew, s_enhance, s_micro, s_vm; - -// ---- types: kinds, tables and parser state (see the types section) ---- -const TY_WORD = 0, TY_INT = 1, TY_CHAR = 2, TY_BOOL = 3, TY_VOID = 4, TY_PTR = 5, TY_ARR = 6; -const TY_FN = 7, TY_STRUCT = 8, TY_VAR = 9, TY_GEN = 10, TY_DYN = 11; // dyn: []T, a = element, n = 1 if fixed -const R_TY = 0x9C000, R_TYEND = 0xA0000, NTL = 1024; // the first NTL words list every record -const ltype = 0xBE100, ltag = 0xBE300, stype = 0xBE500; // type per local, declared tag per local, type per symbol -let tytop, ntl, tword, tint, tchar, tbool, tvoid; -let tc_on; // the optional typechecker, off unless a program says typecheck on; -let xty, xzero, dry; // type of the last expression, was it a literal 0, and dry runs (typeof) -let tpn[8], ntp; // type parameters in scope -let tvauto; // reading a return type: unknown names are type parameters declared after the function's name -let dty, dtag; // result of dtype() -let s_lt, s_gt, s_shr, s_le, s_ge, s_eqeq, s_ne, s_plus, s_struct, s_type, s_typecheck, s_on, s_off, s_new, s_new_t; -let s_o3, s_lfa, s_outside, s_new_raw, s_oob; -let o3on, o3nxt, o3one, o3sl[32], o3rg[32], no3sl, o3pend[700], no3pend, o3dsc[80]; -let o3free[8], no3free, o3nreg, o3cache[512], argloc, s_hitems, s_hlen, s_fatten; // registers freed by closed scopes; local -> its fixed array's cached items (len next to it) // o3: in an o3 region; the promoted slots; o3 blocks waiting for the function's end -let numops[12], nnumops, s_fixed, s_dlen, s_dcap, s_dnew, s_dat, s_dpush, s_dpop, s_dresize, xconst, xcval; -let gbind[8], ngbind; // explicit type arguments for the next call: f<int>(...) - -// ---- errors ---- -// the compiler reports up to 20 errors before it stops. a syntax error -// (die) skips the token it happened on and sets panic, which skips ahead to -// the next ; or } (or the next top-level item) and keeps quiet until then. -// other errors (serr) just report: the parse is still in step. -let nerr, panic; -fn errat() { puts("zc: line "); putn(tline); puts(": "); nerr++; return 0; } -fn errend() { putc(10); if (nerr >= 20) { puts("zc: too many errors, stopping\n"); halt(); } return 0; } -fn giveup() { puts("zc: "); putn(nerr); if (nerr == 1) puts(" error\n"); else puts(" errors\n"); halt(); return 0; } -fn fatal(msg) { errat(); puts(msg); putc(10); halt(); return 0; } -fn serr(msg) { if (!panic && !dry) { errat(); puts(msg); errend(); } return 0; } -fn serrn(name, msg) { if (!panic && !dry) { errat(); puts(name); puts(": "); puts(msg); errend(); } return 0; } -fn die(msg) { serr(msg); panic = 1; if (tk == T_EOF) giveup(); next(); return 0; } -fn dien(name, msg) { serrn(name, msg); panic = 1; if (tk == T_EOF) giveup(); next(); return 0; } -// analyzer errors only count in checked, reachable code -fn cerr(msg) { if (fchk && live) serr(msg); return 0; } -fn cerrn(i, msg) { if (fchk && live) serrn(lname[i], msg); return 0; } - -// ---- interning ---- -fn hashs(s) { let h = 0; while (*s) { h = h * 31 + *s; s++; } return h & (IHN - 1); } -fn intern(s) -{ - let h = hashs(s), p, n; - while (1) { - p = R_IH[h]; - if (!p) break; - if (streq(p, s)) return p; - h = (h + 1) & (IHN - 1); - } - n = strlen(s); - if (pooltop + n + 2 >= R_POOLEND) fatal("string pool full"); - pooltop[0] = 0; - p = pooltop + 1; - wcopy(p, s, n + 1); - pooltop = pooltop + n + 2; - R_IH[h] = p; - return p; -} - -// ---- symbols ---- -// each interned name keeps the index (+1) of its newest symbol in p[-1], and -// each symbol links to the one it shadows, so lookup is one step. -fn addsym(name, kind, val) -{ - let i = nsym; - if (nsym >= NS) fatal("symbol table full"); - nsym++; - sname[i] = name; skind[i] = kind; sval[i] = val; ssig[i] = 0; sflag[i] = F_DEF; sfix[i] = 0; stype[i] = 0; - snext[i] = name[-1]; - name[-1] = i + 1; - return i; -} -// while an image builds, names below vislo are hidden, except keywords -fn lookup(name) -{ - let i = name[-1] - 1; - while (i >= 0) { - if (i >= vislo || skind[i] == K_KW || skind[i] == K_TYPE) return i; - i = snext[i] - 1; - } - return -1; -} -fn popsyms(to) { while (nsym > to) { nsym--; sname[nsym][-1] = snext[nsym]; } return 0; } -fn lookups(s) { return lookup(intern(s)); } - -// patch nodes -fn fixnew(site, link) -{ - let i = fixfree; - if (i) fixfree = fnext[i]; - else { nfixu++; i = nfixu; if (i >= NF) fatal("too many forward references"); } - fsite[i] = site; fnext[i] = link; - return i; -} -// patch every lit in a chain to point at v, and recycle the nodes -fn fixall(head, v) -{ - let n; - while (head) { setlit(fsite[head], v); n = fnext[head]; fnext[head] = fixfree; fixfree = head; head = n; } - return 0; -} - -// ---- code emission ---- -fn emit(w) { if (dry) return 0; if (here >= hlimit) fatal("program too big"); *(here + hdelta) = w; here++; return 0; } -fn lit(v) { emit(v + v + 1); return 0; } -fn op(k) { emit(k + k); return 0; } -fn setlit(at, v) { if (dry) return 0; *(at + hdelta) = v + v + 1; return 0; } -fn jmp(t) { lit(t); op(O_JMP); return 0; } -// a lit that will be patched later; returns its address -fn hole() { let a = here; lit(MW - 1); return a; } -fn fwdfn(name) { let s = addsym(name, K_FN, tline); sflag[s] = 0; return s; } // the line of the first use, until it's defined -fn fnref(s) -{ - if (sflag[s] & F_DEF) { lit(sval[s]); return 0; } - if (dry) return 0; - sfix[s] = fixnew(here, sfix[s]); - lit(MW - 1); // a jump to MW-1 halts if it ever runs unpatched - return 0; -} -fn callname(name) { let s = lookup(name); if (s < 0) s = fwdfn(name); fnref(s); op(O_CALL); return 0; } -fn laddr(k) { lit(ZFP); op(O_LD); if (k) { lit(k); op(O_ADD); } return 0; } -// an o3 variable's address: lfa(k) is fp + k as one enhancement, which the -// jit specializes on the literal k -fn vaddr(i) -{ - let s; - if (ltag[i] & 16) { s = lookup(s_lfa); if (s >= 0 && skind[s] == K_ENH) { lit(lslot[i]); op(XOP0 + sval[s]); return 0; } } - return laddr(lslot[i]); -} -// registers for an o3 region's variables: the cpu has 7. a variable takes the -// one its region freed last (when a scope closed), or the next unused one -fn o3reset() { no3free = 0; o3nreg = 1; no3sl = 0; return 0; } -fn o3take() { if (no3free) { no3free--; return o3free[no3free]; } if (o3nreg < 8) { o3nreg++; return o3nreg - 1; } return 0; } -fn o3promote(i) -{ - let r; - ltag[i] = ltag[i] - (ltag[i] & 1792); - if (!o3on || larr[i] || no3sl >= 32) return 0; - r = o3take(); - if (!r) return 0; - ltag[i] = ltag[i] + r * 256; - o3sl[no3sl] = lslot[i]; o3rg[no3sl] = r; no3sl++; - return 0; -} -// a fixed []T can't change its items or its length, so o3 code keeps both in -// two hidden variables, loaded when the array variable is set (or when the -// region starts), and indexes through them -fn o3mkcache(i) -{ - let k; - if (!o3on || ltype[i][0] != TY_DYN || !ltype[i][3]) return 0; - k = newloc(s_hitems); fslots++; ltag[k] = 16; o3promote(k); - newloc(s_hlen); fslots++; ltag[k + 1] = 16; o3promote(k + 1); - o3cache[i] = k; - return 0; -} -fn o3refresh(i) -{ - let k = o3cache[i]; - if (!k) return 0; - vaddr(i); op(O_LD); lit(2); op(O_ADD); op(O_LD); vaddr(k); op(O_ST); - vaddr(i); op(O_LD); op(O_LD); vaddr(k + 1); op(O_ST); - return 0; -} -// hands a region to the cpu: install kind 2 is [-, 2, lo, hi, n, slot, register, ...] -fn o3region(lo, hi, sl, rg, n) -{ - let i = 0; - if (hdelta || lo >= hi) return 0; - o3dsc[0] = 0; o3dsc[1] = 2; o3dsc[2] = lo; o3dsc[3] = hi; o3dsc[4] = n; - while (i < n) { o3dsc[5 + i + i] = sl[i]; o3dsc[6 + i + i] = rg[i]; i++; } - install(o3dsc); - return 0; -} -// o3 blocks go to the cpu once their function is done, so every jump in them is final -fn o3flush() -{ - let i = 0, p; - while (i < no3pend) { p = o3pend + i * 67; o3region(p[0], p[1], p + 3, p + 35, p[2]); i++; } - no3pend = 0; - return 0; -} -fn strlit(s) -{ - let j = hole(), a; - op(O_JMP); - a = here; - while (*s) { emit(*s); s++; } - emit(0); - setlit(j, here); - lit(a); - return 0; -} - -// ---- input sources ---- -// frame: 0 kind (0 stdin, 1 token list, 2 string) 1 object 2 index 3 end -// 4 transparent 5..7 saved token 8..10 saved char state 11 owned 12 saved line -// 13 saved token line 14 saved lookahead count 15..30 saved lookahead 31 saved char buffer -fn nextch() -{ - if (chkind == 0) { - if (qdone || eof()) { ch = -1; return 0; } - ch = getc() & 255; - if (ch == 96) { qdone = 1; ch = -1; return 0; } // a backtick ends the source - } else if (chkind == 3) { - ch = (chbase[chptr >> 2] >> ((chptr & 3) * 8)) & 255; - if (ch) chptr++; else ch = -1; - } else { - ch = *chptr & 255; - if (ch) chptr++; else ch = -1; - } - if (ch == 10) line++; - return 0; -} -fn src_push(kind, obj, trans, owned) -{ - let f, i; - isp++; - if (isp >= 32) fatal("sources nested too deeply"); - f = R_SRC + isp * 32; - f[0] = kind; f[1] = obj; f[2] = 0; f[3] = 0; f[4] = trans; f[11] = owned; - f[5] = tk; f[6] = tv; f[7] = tglue; f[8] = ch; f[9] = chkind; f[10] = chptr; - f[12] = line; f[13] = tline; f[14] = pq_n; f[31] = chbase; - i = 0; while (i < pq_n) { f[15 + i * 4] = pq_tk[i]; f[16 + i * 4] = pq_tv[i]; f[17 + i * 4] = pq_gl[i]; f[18 + i * 4] = pq_ln[i]; i++; } - pq_n = 0; - if (kind == 1) f[3] = obj[0]; - if (kind == 0) { chkind = 0; qdone = 0; line = 1; nextch(); } - if (kind == 2) { chkind = 2; chptr = obj; line = 1; nextch(); } - if (kind == 3) { chkind = 3; chbase = obj; chptr = 0; line = 1; nextch(); } - return 0; -} -fn src_pop() -{ - let f = R_SRC + isp * 32, i = 0; - tk = f[5]; tv = f[6]; tglue = f[7]; ch = f[8]; chkind = f[9]; chptr = f[10]; - line = f[12]; tline = f[13]; pq_n = f[14]; chbase = f[31]; - while (i < pq_n) { pq_tk[i] = f[15 + i * 4]; pq_tv[i] = f[16 + i * 4]; pq_gl[i] = f[17 + i * 4]; pq_ln[i] = f[18 + i * 4]; i++; } - isp--; - if (f[11]) free(f[1]); - return 0; -} -fn isopch(c) -{ - let s = "+-*/%=<>!&|^~?:.@#$"; - while (*s) { if (*s == c) return 1; s++; } - return 0; -} -// is buf[0..n) followed by c the start of some operator the lexer knows? -fn opprefix(n, c) -{ - let i = 0, k, j; - while (i < nkop) { - k = kops[i]; - j = 0; - while (j < n && k[j] == tbuf[j]) j++; - if (j == n && k[n] == c) return 1; - i++; - } - return 0; -} -fn isdig(c) { return c >= '0' && c <= '9'; } -fn isal(c) { return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_'; } -fn hexv(c) -{ - if (isdig(c)) return c - '0'; - if (c >= 'a' && c <= 'f') return c - 'a' + 10; - if (c >= 'A' && c <= 'F') return c - 'A' + 10; - return -1; -} -fn escch() -{ - let c = ch; - nextch(); - if (c != 92) return c; - c = ch; - nextch(); - if (c == 'n') return 10; - if (c == 't') return 9; - if (c == 'r') return 13; - if (c == '0') return 0; - if (c == 'e') return 27; - return c; -} -fn oplex(n) -{ - while (ch >= 0 && isopch(ch) && opprefix(n, ch)) { tbuf[n] = ch; n++; nextch(); } - tbuf[n] = 0; - tk = T_OP; tv = intern(tbuf); - return 0; -} -fn lex() -{ - let n = 0, v, dg; - tglue = 1; - while (1) { - while (ch == 32 || ch == 9 || ch == 10 || ch == 13) { nextch(); tglue = 0; } - if (ch != '/') break; - nextch(); - if (ch == '/') { while (ch >= 0 && ch != 10) nextch(); tglue = 0; continue; } - if (ch == '*') { - nextch(); - while (ch >= 0) { if (ch == '*') { nextch(); if (ch == '/') break; } else nextch(); } - nextch(); tglue = 0; continue; - } - tline = line; tbuf[0] = '/'; oplex(1); return 0; - } - tline = line; - if (ch < 0) { tk = T_EOF; tv = 0; return 0; } - if (isdig(ch)) { - v = 0; - if (ch == '0') { - nextch(); - if (ch == 'x' || ch == 'X') { - nextch(); - while ((dg = hexv(ch)) >= 0) { v = v * 16 + dg; nextch(); } - tk = T_NUM; tv = v; return 0; - } - } - while (isdig(ch)) { v = v * 10 + ch - '0'; nextch(); } - tk = T_NUM; tv = v; return 0; - } - if (isal(ch)) { - while (isal(ch) || isdig(ch)) { if (n < 1000) { tbuf[n] = ch; n++; } nextch(); } - tbuf[n] = 0; - tk = T_ID; tv = intern(tbuf); return 0; - } - if (ch == 39) { nextch(); tv = escch(); if (ch != 39) die("bad character literal"); nextch(); tk = T_NUM; return 0; } - if (ch == 34) { - nextch(); - while (ch >= 0 && ch != 34) { v = escch(); if (n < 1000) { tbuf[n] = v; n++; } } - nextch(); - tbuf[n] = 0; - tk = T_STR; tv = intern(tbuf); return 0; - } - tbuf[0] = ch; - nextch(); - if (isopch(tbuf[0])) return oplex(1); - tbuf[1] = 0; - tk = T_OP; tv = intern(tbuf); - return 0; -} -// one token of lookahead: peek() fills pk_*, next() takes it first -fn next() -{ - let i = 1; - if (pq_n) { - tk = pq_tk[0]; tv = pq_tv[0]; tglue = pq_gl[0]; tline = pq_ln[0]; - while (i < pq_n) { pq_tk[i - 1] = pq_tk[i]; pq_tv[i - 1] = pq_tv[i]; pq_gl[i - 1] = pq_gl[i]; pq_ln[i - 1] = pq_ln[i]; i++; } - pq_n--; - return 0; - } - return next0(); -} -// the k-th token after the current one (k from 0 to 3), into pk_tk and pk_tv -fn peekat(k) -{ - let a, b, c, e; - while (pq_n <= k) { - a = tk; b = tv; c = tglue; e = tline; - next0(); - pq_tk[pq_n] = tk; pq_tv[pq_n] = tv; pq_gl[pq_n] = tglue; pq_ln[pq_n] = tline; pq_n++; - tk = a; tv = b; tglue = c; tline = e; - } - pk_tk = pq_tk[k]; pk_tv = pq_tv[k]; - return 0; -} -fn peek() { return peekat(0); } -fn next0() -{ - let f, q, i; - f = R_SRC + isp * 32; - if (f[0] != 1) { lex(); return 0; } - i = f[2]; - if (i < f[3]) { q = f[1]; tk = q[1 + i * 3]; tv = q[2 + i * 3]; tline = q[3 + i * 3]; tglue = 0; f[2] = i + 1; return 0; } - if (!f[4]) { tk = T_EOF; tv = 0; return 0; } - src_pop(); // a fed list ran out: continue with the token that followed it - return 0; -} -fn is_op(s) { return tk == T_OP && tv == s; } -fn is_id(s) { return tk == T_ID && tv == s; } -fn accept(s) { if ((tk == T_OP || tk == T_ID) && tv == s) { next(); return 1; } return 0; } -fn expect(s) { if (!accept(s)) { if (!panic && !dry) { errat(); puts("expected "); puts(s); errend(); } panic = 1; if (tk == T_EOF) giveup(); } return 0; } -fn name() -{ - let n = tv; - if (tk != T_ID) die("expected a name"); - next(); - return n; -} - -// ---- operator tables ---- -// a sequence is written like asm: one-char mnemonics, numbers, and names -// (resolved when the operator is used, so image builds stay self-contained) -fn seqasm(s) -{ - let start = seqtop, n, neg, v, k, c; - while (1) { - while (*s == 32) s++; - if (!*s) break; - n = 0; - while (s[n] && s[n] != 32) { tbuf[n] = s[n]; n++; } - tbuf[n] = 0; - s = s + n; - neg = tbuf[0] == '-' && isdig(tbuf[1]); - if (isdig(tbuf[neg])) { - v = 0; k = neg; - while (tbuf[k]) { v = v * 10 + tbuf[k] - '0'; k++; } - if (neg) v = 0 - v; - R_SEQ[seqtop] = v + v + 1; seqtop++; - } else if (n == 1 && (c = mnemidx(tbuf[0])) >= 0) { - R_SEQ[seqtop] = c + c; seqtop++; - } else { - R_SEQ[seqtop] = SEQREF; R_SEQ[seqtop + 1] = intern(tbuf); seqtop = seqtop + 2; - } - } - return start; -} -fn mnemidx(c) { let i = 0; while (mnem[i]) { if (mnem[i] == c) return i; i++; } return -1; } -fn emitseq(a, n) -{ - let e = a + n, s; - while (a < e) { - if (R_SEQ[a] == SEQREF) { - s = lookup(R_SEQ[a + 1]); - if (s < 0) s = fwdfn(R_SEQ[a + 1]); - if (skind[s] == K_FN) fnref(s); else if (skind[s] == K_ENH) op(XOP0 + sval[s]); else lit(sval[s]); - a = a + 2; - } else { emit(R_SEQ[a]); a++; } - } - return 0; -} -fn addkop(p) { let i = 0; while (i < nkop) { if (kops[i] == p) return 0; i++; } kops[nkop] = p; nkop++; return 0; } -fn binfind(p) { let i = nbin; while (i) { i--; if (bname[i] == p) return i; } return -1; } -fn unfind(p) { let i = nun; while (i) { i--; if (uname[i] == p) return i; } return -1; } -fn asgfind(p) { let i = nasg; while (i) { i--; if (aname[i] == p) return i; } return -1; } -// add or replace a binary operator. code is a sequence string, or 0 for the -// built-in && (prec 2) and || (prec 1) behaviour, chosen by -1 / -2 in prec. -fn add_binop(nm, prec, code) -{ - let p = intern(nm), i = binfind(p), a, n; - if (i < 0) { i = nbin; nbin++; } - bname[i] = p; bprec[i] = prec; - if (prec < 0) { bprec[i] = 0 - prec; blen[i] = prec; bseq[i] = 0; addkop(p); return i; } - bseq[i] = seqasm(code); blen[i] = seqtop - bseq[i]; - addkop(p); - // and its compound assignment, x op= y - n = strlen(nm); - wcopy(tbuf + 1000, nm, n); - tbuf[1000 + n] = '='; tbuf[1001 + n] = 0; - a = intern(tbuf + 1000); - if (prec >= 8 || prec == 5 || prec == 4 || prec == 3) { - if (asgfind(a) < 0) { aname[nasg] = a; nasg++; } - abin[asgfind(a)] = i; - addkop(a); - } - return i; -} -fn add_unop(nm, code) -{ - let p = intern(nm), i = unfind(p); - if (i < 0) { i = nun; nun++; } - uname[i] = p; useq[i] = seqasm(code); ulen[i] = seqtop - useq[i]; - addkop(p); - return i; -} -fn add_kw(nm, handler, flags) { let s = addsym(intern(nm), K_KW, handler); sflag[s] = F_DEF | flags; return s; } - -// ---- locals and the analyzer's view of them ---- -fn findloc(n) { let i = nloc; while (i > lbase) { i--; if (lname[i] == n) return i; } return -1; } -fn newloc(n) -{ - let i = nloc; - if (nloc >= NL) fatal("too many locals"); - nloc++; - lname[i] = n; lslot[i] = fslots; lhome[i] = fdepth; lstate[i] = S_PLAIN; - lowner[i] = 0; lused[i] = 0; larr[i] = 0; lown[i] = 0; ltype[i] = tword; ltag[i] = 0; o3cache[i] = 0; - return i; -} -fn lroot(i) { while (lstate[i] == S_CHILD) i = lowner[i]; return i; } -fn tracked(i) { return lstate[i] != S_PLAIN; } -// a use that doesn't give the object away -fn touch(i) -{ - let r; - lused[i] = 1; - if (!fchk) return 0; - r = lroot(i); - lused[r] = 1; - if (lstate[r] == S_DEAD) { cerrn(i, "used after it was given away"); return 0; } - // a d object that shows up in a deeper block is given to that block - if (lstate[r] == S_D && lhome[r] < fdepth) { lhome[r] = fdepth; lstate[r] = S_M; lown[r] = 1; } - return 0; -} -fn plainuse(c) -{ - if (c == C_FRESH) cerr("a new object can't be used as a plain value; bind it to a name first"); - if (c >= C_VAR) touch(c - C_VAR); - return C_PLAIN; -} -fn freevar(i) { laddr(lslot[i]); op(O_LD); callname(s_free); op(O_DROP); return 0; } -// leaving every block deeper than or equal to dep: free what is owned, and -// complain about what should have left already. final means the block really -// ends here rather than an early exit. -fn exit_vars(dep, final) -{ - let i = nloc, st; - if (!fchk || !live) return 0; - while (i > lbase) { - i--; - if (lhome[i] < dep) continue; - st = lstate[i]; - if (st == S_M) freevar(i); else if (st == S_U) cerrn(i, "u object must leave this block (block value, assignment to the enclosing block, or return)"); - else if (st == S_D) cerrn(i, "d object was never given away"); - } - return 0; -} -// an m object has to be used somewhere in the block that owns it, on any path -fn unused_check(from) -{ - while (from < nloc) { if (fchk && lown[from] && !lused[from]) serrn(lname[from], "m object is never used"); from++; } - return 0; -} -fn block_close(save) -{ - let i = save, k; - if (o3on) while (i < nloc) { k = (ltag[i] >> 8) & 7; if ((ltag[i] & 16) && k && no3free < 8) { o3free[no3free] = k; no3free++; } i++; } - i = lbase; - unused_check(save); - exit_vars(fdepth, 1); - while (i < save) { if (lhome[i] >= fdepth) { lstate[i] = S_DEAD; lhome[i] = fdepth - 1; } i++; } - nloc = save; - return 0; -} - -// snapshots: [lbase] [nloc] then state, owner, home per local -fn snap_push() -{ - let b = snaptop, i = lbase, p; - p = R_SNAP + b; - p[0] = lbase; p[1] = nloc; - p = p + 2; - while (i < nloc) { p[0] = lstate[i]; p[1] = lowner[i]; p[2] = lhome[i]; p = p + 3; i++; } - snaptop = p - R_SNAP; - if (snaptop >= 8000) fatal("nesting too deep for the analyzer"); - return b; -} -fn snap_pop(b) { snaptop = b; return 0; } -fn snap_restore(b) -{ - let p = R_SNAP + b, i = p[0], e = p[1]; - if (e > nloc) e = nloc; - p = p + 2; - while (i < e) { lstate[i] = p[0]; lowner[i] = p[1]; lhome[i] = p[2]; p = p + 3; i++; } - return 0; -} -fn empty(s) { return s == S_PLAIN || s == S_DEAD; } -// compare the current states with a snapshot: -1 if they agree, else the -// first local that differs. plain and dead agree and merge to dead. -fn snap_cmp(b) -{ - let p = R_SNAP + b, i = p[0], e = p[1], s; - if (e > nloc) e = nloc; - p = p + 2; - while (i < e) { - s = lstate[i]; - if (empty(s) && empty(p[0])) { if (p[0] == S_DEAD) lstate[i] = S_DEAD; } - else if (s != p[0] || lhome[i] != p[2] || (s == S_CHILD && lowner[i] != p[1])) return i; - p = p + 3; i++; - } - return -1; -} -fn statename(s) -{ - if (s == S_PLAIN) return "empty"; - if (s == S_M) return "m"; - if (s == S_U) return "u"; - if (s == S_D) return "d"; - if (s == S_DEAD) return "given away"; - if (s == S_CHILD) return "owned by a container"; - return "borrowed"; -} -fn merge_err(i, sa, what) -{ - if (!fchk || panic || dry) return 0; - errat(); puts(lname[i]); puts(": "); puts(what); - puts(" (one path leaves it "); puts(statename(sa)); puts(", another "); puts(statename(lstate[i])); puts(")"); - errend(); - return 0; -} -// after an if: the current state is the else path, sa is the then path - -// ---- joins ---- -// where control flow comes back together (after an if, a loop, a switch or -// ?:) every variable has to agree across the paths that reach the join. one -// exception: a variable that became d, or was given away, on some path is dead -// after the join, and the paths where it's still alive free it on the way in -// (fixups). u objects and borrows don't get this treatment: a u object still -// has to leave, and a borrow never changes. -const R_EXIT = 0xBF500, R_EXITEND = 0xBFF00; // exit records: the states at each break -let extop, jps[64], njps; // the paths being joined: [lbase, nloc, triples] -fn jst(p, i) { if (i >= p[1]) return S_PLAIN; return p[2 + 3 * (i - p[0])]; } -fn jow(p, i) { return p[3 + 3 * (i - p[0])]; } -fn jhm(p, i) { return p[4 + 3 * (i - p[0])]; } -// the states at a break, with the jump to patch: [site] then a snapshot -fn exit_rec(site) -{ - let p = R_EXIT + extop, i = lbase, q; - if (extop + 3 + 3 * (nloc - lbase) >= R_EXITEND - R_EXIT) fatal("too many breaks for the analyzer"); - p[0] = site; p[1] = lbase; p[2] = nloc; - q = p + 3; - while (i < nloc) { q[0] = lstate[i]; q[1] = lowner[i]; q[2] = lhome[i]; q = q + 3; i++; } - extop = q - R_EXIT; - return p; -} -fn jadd(p) { if (njps >= 64) fatal("too many paths for the analyzer"); jps[njps] = p; njps++; return 0; } -fn jsame(p, q, i) -{ - let s = jst(p, i), t = jst(q, i); - if (empty(s) && empty(t)) return 1; - return s == t && jhm(p, i) == jhm(q, i) && (s != S_CHILD || jow(p, i) == jow(q, i)); -} -// join the paths in jps over the locals [lbase, n0) into the current states -fn join(n0, what) -{ - let i = lbase, j, p, s, s0, dead, okdead, bad; - if (!njps) return 0; - while (i < n0) { - p = jps[0]; s0 = jst(p, i); - dead = 0; okdead = 1; bad = -1; - j = 0; - while (j < njps) { - s = jst(jps[j], i); - if (s == S_DEAD || s == S_D) dead = 1; - if (s == S_U || s == S_BORROW) okdead = 0; - if (!jsame(p, jps[j], i)) bad = j; - j++; - } - lstate[i] = s0; lowner[i] = jow(p, i); lhome[i] = jhm(p, i); - if (bad < 0) { - if (empty(s0)) { j = 0; while (j < njps) { if (jst(jps[j], i) == S_DEAD) lstate[i] = S_DEAD; j++; } } - } else if (dead && okdead) lstate[i] = S_DEAD; - else if (fchk && !panic && !dry) { - errat(); puts(lname[i]); puts(": "); puts(what); - puts(" (one path leaves it "); puts(statename(s0)); puts(", another "); puts(statename(jst(jps[bad], i))); puts(")"); - errend(); - } - i++; - } - return 0; -} -// on path p: count (and with doit, emit) the frees for what the join made dead but p still owns -fn fixups(p, n0, doit) -{ - let i = lbase, n = 0, s; - if (!fchk) return 0; - while (i < n0) { - s = jst(p, i); - if (lstate[i] == S_DEAD && (s == S_M || s == S_D)) { n++; if (doit) freevar(i); } - i++; - } - return n; -} -// a jump back to the top of a loop: whatever the loop owns has to be as it was -fn backedge(s0) -{ - let p = R_SNAP + s0, i = p[0], e = p[1], s; - if (!fchk || !live) return 0; - if (e > nloc) e = nloc; - while (i < e) { - s = lstate[i]; - if (empty(s) && empty(jst(p, i))) { if (jst(p, i) == S_DEAD) lstate[i] = S_DEAD; } - else if (s != jst(p, i) || lhome[i] != jhm(p, i) || (s == S_CHILD && lowner[i] != jow(p, i))) { - if (s == S_DEAD || s == S_D) cerrn(i, "is given away inside a loop that comes back around to it; give it away on a path that leaves the loop"); - else if (!panic && !dry) { - errat(); puts(lname[i]); puts(": changes state inside a loop; each pass has to leave it as it found it (it went from "); - puts(statename(jst(p, i))); puts(" to "); puts(statename(s)); puts(")"); errend(); - } - } - i++; - } - return 0; -} -// joins two paths that end at the same point, like the branches of if/else: -// path a jumped (through the hole at ja) and path b falls through to here -fn join2(sa, livea, ja, livebv, n0, what) -{ - let sb, nt, cj; - sb = snap_push(); - njps = 0; if (livea) jadd(R_SNAP + sa); if (livebv) jadd(R_SNAP + sb); - join(n0, what); - if (livebv) fixups(R_SNAP + sb, n0, 1); - nt = 0; if (livea) nt = fixups(R_SNAP + sa, n0, 0); - if (nt) { cj = hole(); op(O_JMP); setlit(ja, here); fixups(R_SNAP + sa, n0, 1); setlit(cj, here); } - else setlit(ja, here); - live = livea || livebv; - return 0; -} - -// ---- analyzer rules for the places values flow ---- -// recast: x as u / x as d / x as m -fn recast(c, t) -{ - let i, st; - if (!fchk) return c; - if (c < C_VAR) { cerr("only a named owned object can be recast"); return c; } - i = c - C_VAR; - st = lstate[i]; - lused[i] = 1; - if (st == S_CHILD) cerrn(i, "belongs to a container; recast the container instead"); - else if (st == S_BORROW) cerrn(i, "is borrowed and can't be recast"); - else if (st == S_PLAIN) cerrn(i, "isn't an owned object"); - else if (st == S_DEAD) cerrn(i, "used after it was given away"); - else if (t == S_M && st != S_M) cerrn(i, "can't be recast back to m"); - else lstate[i] = t; - return c; -} -// an argument for a parameter tagged t (0 plain, 1 m, 2 d) -fn argcheck(c, t) -{ - let i, st; - if (!fchk) return 0; - if (c == C_FRESH) { if (t != 2) cerr("a new object can only go straight to a d parameter; bind it to a name first"); return 0; } - if (c < C_VAR || !tracked(c - C_VAR)) return 0; - i = c - C_VAR; - st = lstate[i]; - if (lstate[lroot(i)] == S_DEAD) { cerrn(i, "used after it was given away"); return 0; } - if (t <= 1) { // untagged parameters are m: a lend - if (st == S_D) { cerrn(i, "is d; pass it to a d parameter (lending it would lose it)"); return 0; } - touch(i); - return 0; - } - if (st == S_D) { lstate[i] = S_DEAD; lused[i] = 1; return 0; } - if (st == S_M) cerrn(i, "is m; write d*x to give it away"); - else if (st == S_U) cerrn(i, "is u; write d*x to give it away instead of returning it"); - else if (st == S_CHILD) cerrn(i, "belongs to a container and can't be given away alone"); - else cerrn(i, "is borrowed and can't be given away"); - return 0; -} -fn emitown(p) -{ - laddr(lslot[p]); op(O_LD); - if (ltype[p][0] == TY_DYN) { lit(2); op(O_ADD); op(O_LD); } // a []T's elements live in its items object - callname(s_own); - if (o3on && hasptr(xty)) { lit(xty); callname(s_fatten); } - return 0; -} -// a store of class rc into an lvalue of kind k (local or container index i) -fn assigncheck(k, i, rc) -{ - let st, j, r, js; - if (!fchk) return C_PLAIN; - j = -1; - if (rc >= C_VAR && tracked(rc - C_VAR)) j = rc - C_VAR; - if (j >= 0 && lstate[lroot(j)] == S_DEAD) { cerrn(j, "used after it was given away"); return C_PLAIN; } - if (k == LV_LOCAL) { - st = lstate[i]; - if (j < 0 && rc != C_FRESH) { - if (!empty(st)) cerrn(i, "still owns an object; overwriting it would leak it"); - else lstate[i] = S_PLAIN; - return C_PLAIN; - } - if (!empty(st)) { cerrn(i, "still owns an object; overwriting it would leak it"); return C_PLAIN; } - if (rc == C_FRESH) { lstate[i] = S_M; lused[i] = 0; lown[i] = 1; if (ltag[i] & 15) lstate[i] = ltag[i] & 15; return C_PLAIN; } - js = lstate[j]; - if (js == S_U && lhome[i] == lhome[j] - 1) { // handing a u object up one block - lstate[i] = S_M; lused[i] = 0; lown[i] = 1; lstate[j] = S_DEAD; lused[j] = 1; if (ltag[i] & 15) lstate[i] = ltag[i] & 15; - return C_PLAIN; - } - if (js == S_U) cerrn(j, "is u; it can only be handed to a variable of the enclosing block, or returned"); - else cerrn(j, "is an owned object and can't be copied into another variable"); - return C_PLAIN; - } - if (k == LV_ELEM) { - r = lroot(i); - st = lstate[r]; - touch(i); - if (rc == C_FRESH) { emitown(i); return C_PLAIN; } - if (j < 0) return C_PLAIN; - js = lstate[j]; - if (js == S_CHILD) cerrn(j, "already belongs to a container"); - else if (js == S_BORROW) cerrn(j, "is borrowed and can't be stored"); - else if (st == S_BORROW) { - if (js == S_U) cerrn(j, "is u; it has to leave through the block above, not into a borrowed object"); - else { lstate[j] = S_DEAD; lused[j] = 1; emitown(i); } // storing it gives it away - } else if (js != st) cerrn(j, "its tag doesn't match its container's (both have to be m, u or d)"); - else if (lhome[j] < lhome[r]) cerrn(j, "lives in an outer block than the container it's stored into"); - else { lstate[j] = S_CHILD; lowner[j] = i; lused[j] = 1; emitown(i); } - return C_PLAIN; - } - // a global, or memory the analyzer doesn't track: the collector takes it - if (j >= 0) { - if (lstate[j] == S_D) { lstate[j] = S_DEAD; lused[j] = 1; } - else cerrn(j, "must be d to be stored in a global or in untracked memory (the collector takes it over)"); - } - return C_PLAIN; -} -fn retcheck(c) -{ - let i; - if (!fchk) return 0; - i = -1; - if (c >= C_VAR && tracked(c - C_VAR)) i = c - C_VAR; - if (i >= 0 && lstate[lroot(i)] == S_DEAD) { cerrn(i, "used after it was given away"); return 0; } - if (fret) { - if (i >= 0) { - if (lstate[i] == S_U) { lstate[i] = S_DEAD; lused[i] = 1; } - else cerrn(i, "has to be u to be returned; write 'return u*x'"); - } - return 0; - } - if (c == C_FRESH) cerr("returns a new object; give the function a .u return type"); - else if (i >= 0) cerrn(i, "is owned and can't be returned from a function whose return type isn't .u"); - return 0; -} -// the last expression of a block expression -fn handup(c) -{ - let i; - if (!fchk) return C_PLAIN; - if (c == C_FRESH) return C_FRESH; - if (c < C_VAR || !tracked(c - C_VAR)) return C_PLAIN; - i = c - C_VAR; - if (lstate[i] == S_U && lhome[i] == fdepth) { lstate[i] = S_DEAD; lused[i] = 1; return C_FRESH; } - if (lstate[i] == S_U) cerrn(i, "only a u object of this block can be its value"); - else cerrn(i, "has to be u to be handed up as the block's value"); - return C_PLAIN; -} -fn discard(c) -{ - if (c == C_FRESH) cerr("a new object (or a u result) can't be thrown away"); - else if (c >= C_VAR) touch(c - C_VAR); - return 0; -} - -// ---- types ---- -// types are a compiler primitive: records in the type area, hash-consed so -// the same type is always the same pointer and comparing types is comparing -// words. untyped code is typed word, which goes with anything. the records -// stay in memory after compiling, so programs can inspect them. -// t[0] kind t[1] size in words t[2] name t[3] n t[4] a t[5] b t[6] c t[7..] extra -// ptr: a = element arr: a = element, n = length -// fn: a = return type, n = parameter count, b = signature (u m d tags), extra = parameter types -// struct: n = field count (-1 until laid out), a = fields (name, type, offset), -// b = generic template, c = type arguments [n, t1, t2 ...] -// var: a type parameter, n = its index -// gen: a generic struct: n = parameter count, a = fields (name, type), b = field count, c = parameter names - - -fn talloc(n) { let p = tytop; if (tytop + n >= R_TYEND) fatal("the type area is full"); tytop = tytop + n; wfill(p, 0, n); return p; } -fn tnew(kind, size, nm, extra) -{ - let t = talloc(7 + extra); - t[0] = kind; t[1] = size; t[2] = nm; - if (ntl >= NTL) fatal("too many types"); - R_TY[ntl] = t; ntl++; - return t; -} -fn tptr(e) -{ - let i = 0, t; - while (i < ntl) { t = R_TY[i]; if (t[0] == TY_PTR && t[4] == e) return t; i++; } - t = tnew(TY_PTR, 1, 0, 0); t[4] = e; - return t; -} -fn tarr(e, n) -{ - let i = 0, t; - while (i < ntl) { t = R_TY[i]; if (t[0] == TY_ARR && t[4] == e && t[3] == n) return t; i++; } - t = tnew(TY_ARR, n * tsz(e), 0, 0); t[4] = e; t[3] = n; - return t; -} -fn tfn(ret, np, ps, sig) -{ - let i = 0, j, t; - while (i < ntl) { - t = R_TY[i]; - if (t[0] == TY_FN && t[4] == ret && t[3] == np && t[5] == sig) { - j = 0; while (j < np && t[7 + j] == ps[j]) j++; - if (j == np) return t; - } - i++; - } - t = tnew(TY_FN, 1, 0, np); t[4] = ret; t[3] = np; t[5] = sig; - wcopy(t + 7, ps, np); - return t; -} -// []T, or fixed []T -fn tdyn(e, f) -{ - let i = 0, t; - while (i < ntl) { t = R_TY[i]; if (t[0] == TY_DYN && t[4] == e && t[3] == f) return t; i++; } - t = tnew(TY_DYN, 1, 0, 0); t[4] = e; t[3] = f; - return t; -} -fn tvar(i, nm) -{ - let k = 0, t; - while (k < ntl) { t = R_TY[k]; if (t[0] == TY_VAR && t[3] == i) return t; k++; } - t = tnew(TY_VAR, 1, nm, 0); t[3] = i; - return t; -} -fn tinst(g, args, n) -{ - let i = 0, j, t, v; - while (i < ntl) { - t = R_TY[i]; - if (t[0] == TY_STRUCT && t[5] == g) { - v = t[6]; j = 0; while (j < n && v[1 + j] == args[j]) j++; - if (j == n) return t; - } - i++; - } - v = talloc(n + 1); v[0] = n; wcopy(v + 1, args, n); - t = tnew(TY_STRUCT, 0, g[2], 0); t[3] = -1; t[5] = g; t[6] = v; - return t; -} -// lay out a generic instance on first use -fn tresolve(t) -{ - let g, f, n, i, fs, off = 0, ft, bs[8]; - if (t[0] != TY_STRUCT || t[3] >= 0) return t; - if (t[3] == -2) { serr("a struct can't contain itself by value"); t[3] = 0; return t; } - t[3] = -2; - g = t[5]; n = g[5]; f = g[4]; - wfill(bs, 0, 8); wcopy(bs, t[6] + 1, t[6][0]); - fs = talloc(n * 3 + 1); - i = 0; - while (i < n) { - ft = subst(f[i + i + 1], bs); - fs[i * 3] = f[i + i]; fs[i * 3 + 1] = ft; fs[i * 3 + 2] = off; - off = off + tsz(ft); - i++; - } - t[4] = fs; t[1] = off; t[3] = n; - return t; -} -fn tsz(t) { if (t[0] == TY_STRUCT && t[3] < 0) tresolve(t); return t[1]; } -// replace type parameters with what they were bound to (unbound ones become word) -fn subst(t, bs) -{ - let k = t[0], i, n, v[24], vec; - if (k == TY_VAR) { if (bs[t[3]]) return bs[t[3]]; return tword; } - if (k == TY_PTR) return tptr(subst(t[4], bs)); - if (k == TY_ARR) return tarr(subst(t[4], bs), t[3]); - if (k == TY_FN) { n = t[3]; i = 0; while (i < n) { v[i] = subst(t[7 + i], bs); i++; } return tfn(subst(t[4], bs), n, v, t[5]); } - if (k == TY_STRUCT && t[5]) { vec = t[6]; n = vec[0]; i = 0; while (i < n) { v[i] = subst(vec[1 + i], bs); i++; } return tinst(t[5], v, n); } - return t; -} -fn isnum(t) { return t[0] == TY_INT || t[0] == TY_CHAR || t[0] == TY_BOOL; } -fn isagg(t) { return t[0] == TY_ARR || t[0] == TY_STRUCT; } -fn isptr(t) { return t[0] == TY_PTR || t[0] == TY_ARR; } -fn decay(t) { if (t[0] == TY_ARR) return tptr(t[4]); return t; } -fn telem(t) { if (t[0] == TY_PTR || t[0] == TY_ARR) return t[4]; return tword; } -// can a value of type src go where dst is expected? -fn compat(dst, src) -{ - if (dst == src || dst == tword || src == tword) return 1; - if (isnum(dst) && isnum(src)) return 1; - src = decay(src); - if (dst[0] == TY_PTR && src[0] == TY_PTR) { - if (dst[4] == tword || src[4] == tword || dst[4] == tvoid || src[4] == tvoid) return 1; - return dst[4] == src[4]; - } - if ((dst[0] == TY_PTR || dst[0] == TY_FN || dst[0] == TY_DYN) && xzero) return 1; // a literal 0 is a null pointer - if (dst[0] == TY_DYN && src[0] == TY_DYN && dst[4] == src[4]) return dst[3] || !src[3]; // a growable array can't hold a fixed one - return dst == src; -} -fn unify(p, a, bs) -{ - let i, n, pv, av; - if (p[0] == TY_VAR) { i = p[3]; if (!bs[i]) { bs[i] = a; return 1; } return compat(bs[i], a); } - a = decay(a); - if (p[0] == TY_PTR && a[0] == TY_PTR) { if (a[4] == tword) return 1; return unify(p[4], a[4], bs); } - if (p[0] == TY_STRUCT && p[5] && a[0] == TY_STRUCT && a[5] == p[5]) { - pv = p[6]; av = a[6]; n = pv[0]; i = 0; - while (i < n) { if (!unify(pv[1 + i], av[1 + i], bs)) return 0; i++; } - return 1; - } - return compat(p, a); -} -fn tprint(t) -{ - let k = t[0], i, v; - if (k == TY_PTR) { putc('*'); return tprint(t[4]); } - if (k == TY_DYN) { if (t[3]) puts("fixed "); puts("[]"); return tprint(t[4]); } - if (k == TY_ARR) { putc('['); putn(t[3]); putc(']'); return tprint(t[4]); } - if (k == TY_FN) { - if (t[4] == tword) puts("fn"); else tprint(t[4]); - if (t[5] & 1) puts(".u"); - putc('('); - i = 0; - while (i < t[3]) { - if (i) puts(", "); - tprint(t[7 + i]); - if (i < 12 && tparamtag(t, i) == 1) puts(".m"); - if (i < 12 && tparamtag(t, i) == 2) puts(".d"); - i++; - } - putc(')'); - return 0; - } - if (t[2]) puts(t[2]); else puts("?"); - if (k == TY_STRUCT && t[5]) { - v = t[6]; putc('<'); - i = 0; while (i < v[0]) { if (i) puts(", "); tprint(v[1 + i]); i++; } - putc('>'); - } - return 0; -} -fn tcerr(what, want, got) -{ - if (!tc_on || !live || dry || panic) return 0; - errat(); puts("type error: "); puts(what); - puts(": expected "); tprint(want); puts(", got "); tprint(got); - errend(); - return 0; -} -fn tcneed(ok, what, got) -{ - if (ok || !tc_on || !live || dry || panic) return 0; - errat(); puts("type error: "); puts(what); puts(", got "); tprint(got); - errend(); - return 0; -} -fn tpfind(n) { let i = ntp; while (i) { i--; if (tpn[i] == n) return i; } return -1; } -fn istypename(n) -{ - let s; - if (n == s_fixed) return 1; - if (tpfind(n) >= 0) return 1; - if (findloc(n) >= 0) return 0; - s = lookup(n); - return s >= 0 && skind[s] == K_TYPE; -} -// the closing > of a type argument list; splits >> in two -fn closeangle() -{ - if (is_op(s_shr)) { tv = s_gt; return 0; } - expect(s_gt); - return 0; -} -// a type, then any number of (params) after it: int(int, int) is a function -// returning int, fn(int) one returning a plain word -fn ptype() -{ - let t = ptype0(), np, ps[24]; - while (is_op(s_lp)) { - next(); np = 0; - if (!is_op(s_rp)) { while (1) { if (np >= 24) fatal("too many parameters"); ps[np] = ptype(); np++; if (!accept(s_comma)) break; } } - expect(s_rp); - t = tfn(t, np, ps, np + np); - } - return t; -} -fn ptype0() -{ - let n, s, t, args[8], na = 0, i; - if (accept(s_star)) return tptr(ptype0()); - if (accept(s_lk)) { - if (accept(s_rk)) return tdyn(ptype0(), 0); // []T: grows - n = cexpr(); expect(s_rk); t = ptype0(); if (n < 0) serr("a negative array length"); return tarr(t, n); - } - if (is_id(s_fixed)) { // fixed []T can't grow; fixed [n]T says what [n]T already means - next(); t = ptype0(); - if (t[0] == TY_DYN) return tdyn(t[4], 1); - if (t[0] != TY_ARR) serr("only arrays can be fixed"); - return t; - } - if (is_id(s_fn)) { next(); if (!is_op(s_lp)) die("fn as a type needs its parameters: fn(int)"); return tword; } - if (tk != T_ID) { die("expected a type"); return tword; } - n = tv; - i = tpfind(n); - if (i >= 0) { next(); return tvar(i, n); } - s = lookup(n); - if (tvauto && (s < 0 || skind[s] != K_TYPE) && ntp < 8) { tpn[ntp] = n; ntp++; next(); return tvar(ntp - 1, n); } // T in T first<T>(...) - if (s < 0 || skind[s] != K_TYPE) { dien(n, "isn't a type"); return tword; } - next(); - t = sval[s]; - if (t[0] != TY_GEN) return t; - expect(s_lt); - while (1) { - if (na >= 8) die("too many type arguments"); - args[na] = ptype(); - if (tsz(args[na]) != 1) serr("type arguments have to be one word (a pointer, a number, or a parameter)"); - na++; - if (!accept(s_comma)) break; - } - closeangle(); - if (na != t[3]) serrn(n, "wrong number of type arguments"); - return tinst(t, args, na); -} -// does a declaration start here? (a type, or a bare .tag) -fn tstart() -{ - let k; - if (tk == T_OP) { - if (tv == s_lk || tv == s_dot) return 1; - if (tv == s_star) { // *T name, **T name ...: look past the stars - k = 0; - while (k < 3) { peekat(k); if (!(pk_tk == T_OP && pk_tv == s_star)) break; k++; } - peekat(k); - return (pk_tk == T_ID && (istypename(pk_tv) || pk_tv == s_fn)) || (pk_tk == T_OP && pk_tv == s_lk); - } - return 0; - } - if (tk != T_ID) return 0; - return tv == s_fn || istypename(tv); -} -// [type] [.tag] -fn dtype() -{ - dty = 0; dtag = 0; - if (!is_op(s_dot)) dty = ptype(); - if (accept(s_dot)) { - if (tv == s_m) dtag = S_M; else if (tv == s_u) dtag = S_U; else if (tv == s_d) dtag = S_D; else die("a tag is .u, .m or .d"); - next(); - } - return 0; -} -// struct name { type field, ... } or struct name<A, B> { ... } -fn kw_struct() -{ - let n, t, s, nf = 0, buf = R_QBUF, i, fs, off = 0, gen = 0, ft; - next(); - n = name(); - if (is_op(s_lt)) { // generic - next(); ntp = 0; - while (1) { if (ntp >= 8) die("too many type parameters"); tpn[ntp] = name(); ntp++; if (!accept(s_comma)) break; } - closeangle(); - gen = 1; - t = tnew(TY_GEN, 0, n, 0); t[3] = ntp; - fs = talloc(ntp); wcopy(fs, tpn, ntp); t[6] = fs; - } else { t = tnew(TY_STRUCT, 0, n, 0); t[3] = -2; } // -2 while its fields are read - s = addsym(n, K_TYPE, t); - expect(s_lb); - while (!is_op(s_rb)) { - ft = ptype(); - while (1) { - if (nf >= 1000) fatal("too many fields"); - buf[nf + nf] = name(); buf[nf + nf + 1] = ft; nf++; - if (!accept(s_comma)) break; - } - expect(s_semi); - } - next(); - if (gen) { - fs = talloc(nf + nf); wcopy(fs, buf, nf + nf); - t[4] = fs; t[5] = nf; - ntp = 0; - } else { - fs = talloc(nf * 3 + 1); - i = 0; - while (i < nf) { - ft = buf[i + i + 1]; - if (ft == t) { serr("a struct can't contain itself by value; use a pointer"); ft = tword; } - fs[i * 3] = buf[i + i]; fs[i * 3 + 1] = ft; fs[i * 3 + 2] = off; - off = off + tsz(ft); - i++; - } - t[4] = fs; t[1] = off; t[3] = nf; - } - accept(s_semi); - return s; -} -// type name = T; -fn kw_type() { let n; next(); n = name(); expect(s_eq); addsym(n, K_TYPE, ptype()); expect(s_semi); return 0; } -// typecheck on; / typecheck off; -fn kw_typecheck() -{ - next(); - if (is_id(s_on)) tc_on = 1; else if (is_id(s_off)) tc_on = 0; else die("typecheck on or typecheck off"); - next(); expect(s_semi); - return 0; -} -// the field of a struct type, or -1 -fn tfindfield(t, n) { let i = 0; tresolve(t); while (i < t[3]) { if (t[4][i * 3] == n) return i; i++; } return -1; } -// sizeof(T or expr), typeof(T or expr): the expression form is compiled dry, so it never runs -fn typearg() -{ - let t, sb, c; - expect(s_lp); - if (tstart() && !is_op(s_dot)) t = ptype(); - else { - sb = snap_push(); dry++; - c = expr(); rval(); - t = xty; - dry--; snap_restore(sb); snap_pop(sb); - } - expect(s_rp); - return t; -} -// len(a), cap(a), push(a, x), pop(a), resize(a, n): growable arrays. -// len of a [n]T is just n. -fn arrarg() -{ - let c; - expect(s_lp); c = expr(); - argloc = -1; - if (o3on && lv && lvk == LV_LOCAL && o3cache[lvi]) argloc = lvi; - rval(); plainuse(c); - return xty; -} -fn nogrow(t) { if (t[0] == TY_DYN && t[3]) serr("a fixed array can't grow or shrink"); return 0; } -fn kw_len() -{ - let t; - next(); t = arrarg(); expect(s_rp); - if (t[0] == TY_ARR) { op(O_DROP); lit(t[3]); } - else { tcneed(t[0] == TY_DYN || t == tword, "len needs an array", t); if (argloc >= 0) { op(O_DROP); vaddr(o3cache[argloc] + 1); op(O_LD); } else if (o3on && t[0] == TY_DYN) op(O_LD); else callname(s_dlen); } - xty = tint; - return 0; -} -fn kw_cap() { let t; next(); t = arrarg(); expect(s_rp); tcneed(t[0] == TY_DYN || t == tword, "cap needs a []T", t); callname(s_dcap); xty = tint; return 0; } -fn kw_push() -{ - let t, c; - next(); t = arrarg(); nogrow(t); - if (t[0] == TY_DYN && tsz(t[4]) != 1) serr("push takes one-word elements; use resize for structs"); - expect(s_comma); c = expr(); rval(); argcheck(c, 2); - if (t[0] == TY_DYN && !compat(t[4], xty)) tcerr("push", t[4], xty); - if (o3on && t[0] == TY_DYN && hasptr(t[4])) { lit(t[4]); callname(s_fatten); } - expect(s_rp); - callname(s_dpush); xty = tint; - return 0; -} -fn kw_pop() { let t; next(); t = arrarg(); nogrow(t); expect(s_rp); callname(s_dpop); xty = telem(t); if (t[0] == TY_DYN) xty = t[4]; return 0; } -fn kw_resize() { let t, c; next(); t = arrarg(); nogrow(t); expect(s_comma); c = expr(); rval(); plainuse(c); expect(s_rp); callname(s_dresize); xty = tint; return 0; } -fn kw_sizeof() { let t; next(); t = typearg(); lit(tsz(t)); xty = tint; return 0; } -fn kw_typeof() { let t; next(); t = typearg(); lit(t); xty = tword; return 0; } -fn types_init() -{ - tytop = R_TY + NTL; ntl = 0; - tword = tnew(TY_WORD, 1, intern("word"), 0); - tint = tnew(TY_INT, 1, intern("int"), 0); - tchar = tnew(TY_CHAR, 1, intern("char"), 0); - tbool = tnew(TY_BOOL, 1, intern("bool"), 0); - tvoid = tnew(TY_VOID, 0, intern("void"), 0); - addsym(tword[2], K_TYPE, tword); addsym(tint[2], K_TYPE, tint); addsym(tchar[2], K_TYPE, tchar); - addsym(tbool[2], K_TYPE, tbool); addsym(tvoid[2], K_TYPE, tvoid); - s_lt = intern("<"); s_gt = intern(">"); s_shr = intern(">>"); s_le = intern("<="); s_ge = intern(">="); - s_eqeq = intern("=="); s_ne = intern("!="); s_plus = intern("+"); - s_struct = intern("struct"); s_type = intern("type"); s_typecheck = intern("typecheck"); - s_on = intern("on"); s_off = intern("off"); s_new = intern("new"); s_new_t = intern("new_t"); - s_hitems = intern("#items"); s_hlen = intern("#len"); s_fatten = intern("fatten"); - s_o3 = intern("o3"); s_lfa = intern("lfa"); s_outside = intern("outside"); s_new_raw = intern("new_raw"); s_oob = intern("oob"); - s_fixed = intern("fixed"); s_dlen = intern("dlen"); s_dcap = intern("dcap"); s_dnew = intern("dnew"); s_dat = intern("dat"); - s_dpush = intern("dpush"); s_dpop = intern("dpop"); s_dresize = intern("dresize"); - numops[0] = intern("*"); numops[1] = intern("/"); numops[2] = intern("%"); numops[3] = intern("&"); - numops[4] = intern("|"); numops[5] = intern("^"); numops[6] = intern("<<"); numops[7] = s_shr; nnumops = 8; - return 0; -} -fn isnumop(o) { let i = 0; while (i < nnumops) { if (numops[i] == o) return 1; i++; } return 0; } -// the type of a binary operation, checking it when the typechecker is on -fn bintype(b, lt, rt) -{ - let o = bname[b]; - lt = decay(lt); rt = decay(rt); - if (blen[b] < 0) { tcneed(!isagg(lt) && !isagg(rt), "&& and || need scalars", lt); return tbool; } - if (o == s_eqeq || o == s_ne) { if (!compat(lt, rt) && !compat(rt, lt)) tcerr("comparison", lt, rt); return tbool; } - if (o == s_lt || o == s_gt || o == s_le || o == s_ge) { - if (!(lt == tword || rt == tword || (isnum(lt) && isnum(rt)) || (lt[0] == TY_PTR && rt[0] == TY_PTR))) tcerr("comparison", lt, rt); - return tbool; - } - if (o == s_plus) { - if (lt[0] == TY_PTR && (isnum(rt) || rt == tword)) return lt; - if (rt[0] == TY_PTR && isnum(lt)) return rt; - if (lt == tword || rt == tword) return tword; - if (isnum(lt) && isnum(rt)) return tint; - tcerr("+", lt, rt); return tword; - } - if (o == s_minus) { - if (lt[0] == TY_PTR && rt[0] == TY_PTR) return tint; - if (lt[0] == TY_PTR && (isnum(rt) || rt == tword)) return lt; - if (lt == tword || rt == tword) return tword; - if (isnum(lt) && isnum(rt)) return tint; - tcerr("-", lt, rt); return tword; - } - if (isnumop(o)) { - if (lt == tword || rt == tword) return tword; - if (isnum(lt) && isnum(rt)) return tint; - if (isnum(lt)) lt = rt; - tcneed(0, "arithmetic needs numbers", lt); return tword; - } - return tword; // operators a program added -} - -// ---- reflection ---- -// for programs (and parse words) looking at types at runtime -fn tkind(t) { return t[0]; } -fn tsize(t) { return tsz(t); } -fn tname(t) { return t[2]; } -fn tlen(t) { return t[3]; } -fn tnfields(t) { tresolve(t); return t[3]; } -// ---- fattening ---- -// o3's new_raw stamps no type: the header's type word holds -(n + 1), n the -// words asked for. where o3 data reaches normal code (a store outside o3 -// variables, an argument to a normal function, a return, the end of an o3 -// block) the compiler knows its static type t and calls fatten(p, t), which -// stamps the type, zeroes the slack, and does the same for every object p -// reaches through typed pointers. it returns p. -fn hasptr(t) -{ - let k = t[0], i, n; - if (k == TY_PTR || k == TY_DYN) return 1; - if (k == TY_ARR) return hasptr(t[4]); - if (k == TY_STRUCT && !t[5]) { n = tnfields(t); i = 0; while (i < n) { if (hasptr(tftype(t, i))) return 1; i++; } } - return 0; -} -fn fatten(p, t) { fat1(p, t, 32); return p; } -fn fat1(p, t, dl) -{ - let e, n, k, i, es; - if (dl <= 0 || !t || !isobj(p)) return 0; - if (t[0] == TY_DYN) { // a handle is always fat; what it holds may not be - if (hasptr(t[4])) { es = tsz(t[4]); n = p[0]; i = 0; while (i < n) { fatin(p[2] + i * es, t[4], dl - 1); i++; } } - return 0; - } - if (t[0] != TY_PTR || p[-1] >= 0) return 0; - e = t[4]; n = 0 - p[-1] - 1; es = tsz(e); - if (es < 1) es = 1; - if (e == tword || e[0] == TY_VAR) p[-1] = 0; - else if (n > es) p[-1] = tarr(e, 0); - else p[-1] = e; - if (osize(p) > n) wfill(p + n, 0, osize(p) - n); - if (hasptr(e)) { k = n / es; i = 0; while (i < k) { fatin(p + i * es, e, dl - 1); i++; } } - return 0; -} -fn fatin(a, t, dl) -{ - let k = t[0], i, n, o, ft, es; - if (k == TY_PTR || k == TY_DYN) return fat1(a[0], t, dl); - if (k == TY_ARR) { n = t[3]; es = tsz(t[4]); i = 0; while (i < n) { fatin(a + i * es, t[4], dl); i++; } return 0; } - if (k == TY_STRUCT && !t[5]) { n = tnfields(t); i = 0; while (i < n) { o = tfoff(t, i); ft = tftype(t, i); fatin(a + o, ft, dl); i++; } } - return 0; -} -fn tfname(t, i) { tresolve(t); return t[4][i * 3]; } -fn tftype(t, i) { tresolve(t); return t[4][i * 3 + 1]; } -fn tfoff(t, i) { tresolve(t); return t[4][i * 3 + 2]; } -fn tret(t) { return t[4]; } -fn tnparams(t) { return t[3]; } -fn tparam(t, i) { return t[7 + i]; } -fn tparamtag(t, i) { return ((t[5] >> 6) >> (i + i)) & 3; } // 0 untagged (m), 1 .m, 2 .d -fn tretu(t) { return t[5] & 1; } -fn tnargs(t) { if (t[0] != TY_STRUCT || !t[5]) return 0; return t[6][0]; } -fn targ(t, i) { return t[6][1 + i]; } -// the type of a function, by address. untyped functions get one made from their signature -fn sigof(f) -{ - let i = nsym, s = -1, ws[24], n, k; - while (i) { i--; if (skind[i] == K_FN && sval[i] == f && (sflag[i] & F_DEF)) { s = i; break; } } - if (s < 0) return 0; - if (stype[s]) return stype[s]; - n = (ssig[s] >> 1) & 31; k = 0; - while (k < n) { ws[k] = tword; k++; } - return tfn(tword, n, ws, ssig[s]); -} -fn sigofs(nm) { let s = lookups(nm); if (s < 0 || skind[s] != K_FN) return 0; return sigof(sval[s]); } - -// ---- expressions ---- -// every expression leaves its value on the stack, returns its analyzer class, -// and sets xty to its type. lv means the stack holds an address that hasn't -// been loaded yet; structs and arrays are never loaded, their address is -// their value. -fn rval() { if (lv) { if (!isagg(xty)) op(O_LD); lv = 0; } return 0; } -fn kwcall(s, e) -{ - let f = sval[s], old = kw_expr, c; - kw_expr = e; xcls = C_PLAIN; xty = tword; xzero = 0; - f(); - kw_expr = old; - c = xcls; - lv = 0; lvk = LV_NONE; - return c; -} -fn stmtonly() { if (kw_expr) serr("this can't be used inside an expression"); return 0; } -// the arguments of a call. ft is the callee's type (or 0), bs the generic bindings -fn args(tags, ft, bs, fat) -{ - let np = 0, c, pt, t; - expect(s_lp); - if (!is_op(s_rp)) { - while (1) { - c = expr(); rval(); t = xty; - argcheck(c, (tags >> (np + np)) & 3); - if (fat && hasptr(t)) { lit(t); callname(s_fatten); xty = t; } // o3 data handed to normal code - if (ft && np < ft[3]) { pt = ft[7 + np]; if (!unify(pt, xty, bs)) tcerr("argument", subst(pt, bs), xty); } - np++; - if (!accept(s_comma)) break; - } - } - expect(s_rp); - return np; -} -// new(T) and new(T, count): a typed object, its type stamped into the header -fn newtyped() -{ - let t, c; - t = ptype(); - if (t[0] == TY_DYN) { // a growable array: element size, length, type - lit(tsz(t[4])); - if (accept(s_comma)) { c = expr(); rval(); plainuse(c); } - else { lit(0); if (t[3]) serr("a fixed array needs its length: new(fixed []T, n)"); } - lit(t); - expect(s_rp); - callname(s_dnew); - lv = 0; lvk = LV_NONE; xty = t; xzero = 0; - return C_FRESH; - } - if (o3on) { // o3: new_raw(words), no stamp, no zeroing - if (accept(s_comma)) { c = expr(); rval(); plainuse(c); if (tsz(t) != 1) { lit(tsz(t)); op(15); } } - else lit(tsz(t)); - expect(s_rp); - callname(s_new_raw); - lv = 0; lvk = LV_NONE; xty = tptr(t); xzero = 0; - return C_FRESH; - } - if (accept(s_comma)) { - c = expr(); rval(); plainuse(c); - if (tsz(t) != 1) { lit(tsz(t)); op(15); } - lit(tarr(t, 0)); - } else { lit(tsz(t)); lit(t); } - expect(s_rp); - callname(s_new_t); - lv = 0; lvk = LV_NONE; xty = tptr(t); xzero = 0; - return C_FRESH; -} -fn call(s) -{ - let np, tags = 0, ret = 0, ft = stype[s], bs[8]; - if (sname[s] == s_new && skind[s] == K_FN) { - peek(); - if (pk_tk == T_OP && (pk_tv == s_star || pk_tv == s_lk)) { next(); return newtyped(); } - if (pk_tk == T_ID && (istypename(pk_tv) || pk_tv == s_fn)) { next(); return newtyped(); } - } - if (o3on && sname[s] == s_new) { tags = lookup(s_new_raw); if (tags >= 0) s = tags; tags = 0; } - if (sflag[s] & F_SIG) { tags = ssig[s] >> 6; ret = ssig[s] & 1; } - else sflag[s] = sflag[s] | F_UNTYPED; - wfill(bs, 0, 8); - if (ngbind) { wcopy(bs, gbind, ngbind); ngbind = 0; } - np = 0; - if (o3on && !(sflag[s] & F_O3) && sname[s] != s_free) np = 1; // o3 calling normal code: fatten the arguments - np = args(tags, ft, bs, np); - if ((sflag[s] & F_SIG) && np != ((ssig[s] >> 1) & 31)) serrn(sname[s], "wrong number of arguments"); - fnref(s); op(O_CALL); - lv = 0; lvk = LV_NONE; xzero = 0; - xty = tword; - if (ft) xty = subst(ft[4], bs); - if (ret) return C_FRESH; - return C_PLAIN; -} -// an enhancement used like a function: the arguments, then its one opcode -fn enhcall(s) -{ - let nin = ssig[s] & 15, nout = (ssig[s] >> 4) & 15, n = 0, c; - expect(s_lp); - if (!is_op(s_rp)) { while (1) { c = expr(); rval(); plainuse(c); n++; if (!accept(s_comma)) break; } } - expect(s_rp); - if (n != nin) serrn(sname[s], "wrong number of inputs"); - lv = 0; lvk = LV_NONE; xty = tword; xzero = 0; - if (sflag[s] & F_FALLBACK) { fnref(sfix[s] - 1); op(O_CALL); return C_PLAIN; } - op(XOP0 + sval[s]); - if (nout == 0) lit(0); - if (nout > 1) serrn(sname[s], "leaves several values; use it from asm"); - return C_PLAIN; -} -fn primary() -{ - let n, i, s, c; - lv = 0; lvk = LV_NONE; xzero = 0; - xconst = 0; - if (tk == T_NUM) { lit(tv); xzero = tv == 0; xconst = 1; xcval = tv; xty = tint; next(); return C_PLAIN; } - if (tk == T_STR) { strlit(tv); next(); xty = tptr(tchar); return C_PLAIN; } - if (tk == T_OP) { - if (tv == s_lp) { next(); c = expr(); expect(s_rp); return c; } - if (tv == s_lb) return blockexpr(); - die("expected an expression"); lit(0); xty = tword; return C_PLAIN; - } - if (tk != T_ID) { die("expected an expression"); lit(0); xty = tword; return C_PLAIN; } - n = tv; - i = findloc(n); - if (i >= 0) { - next(); - if (!fchk && tracked(i)) serrn(n, "is tracked by the analyzer and can't be used in unchecked code"); - vaddr(i); - xty = ltype[i]; - if (larr[i]) return C_PLAIN; - lv = 1; lvk = LV_LOCAL; lvi = i; - if (tracked(i)) return C_VAR + i; - return C_PLAIN; - } - s = lookup(n); - if (s >= 0 && skind[s] == K_KW) { - if (!(sflag[s] & F_EXPR)) dien(n, "can't be used inside an expression"); - return kwcall(s, 1); - } - if (s >= 0 && skind[s] == K_TYPE) { dien(n, "is a type, not a value"); lit(0); xty = tword; return C_PLAIN; } - next(); - xty = tword; - if (s >= 0 && skind[s] == K_CONST) { lit(sval[s]); xty = tint; xzero = sval[s] == 0; xconst = 1; xcval = sval[s]; return C_PLAIN; } - if (s >= 0 && skind[s] == K_GVAR) { lit(sval[s]); if (stype[s]) xty = stype[s]; lv = 1; lvk = LV_GLOBAL; return C_PLAIN; } - if (s >= 0 && skind[s] == K_GARR) { lit(sval[s]); if (stype[s]) xty = stype[s]; return C_PLAIN; } - if (s >= 0 && skind[s] == K_ENH) return enhcall(s); - if (s < 0) s = fwdfn(n); - if (is_op(s_lt) && (sflag[s] & F_GEN)) { // f<int, *char>(...) - next(); ngbind = 0; - while (1) { if (ngbind >= 8) die("too many type arguments"); gbind[ngbind] = ptype(); ngbind++; if (!accept(s_comma)) break; } - closeangle(); - if (!is_op(s_lp)) die("expected ( after the type arguments"); - } - if (is_op(s_lp)) return call(s); - fnref(s); - if (stype[s]) xty = stype[s]; - return C_PLAIN; -} -// ++ and -- on the address at the top of the stack -fn incdec(post, dlt) -{ - if (!lv) die("++ and -- need something to assign to"); - if (lvk == LV_LOCAL && fchk && tracked(lvi)) cerrn(lvi, "owns an object and can't be incremented"); - tcneed(isnum(xty) || xty[0] == TY_PTR || xty == tword, "++ and -- need a number or a pointer", xty); - lv = 0; lvk = LV_NONE; xzero = 0; - lit(0); op(O_PICK); op(O_LD); - if (post) { lit(0); op(O_PICK); lit(dlt); op(O_ADD); lit(2); op(O_PICK); op(O_ST); } - else { lit(dlt); op(O_ADD); lit(0); op(O_PICK); lit(2); op(O_PICK); op(O_ST); } - op(O_SWAP); op(O_DROP); - return C_PLAIN; -} -// p.x and p->x: a field of a struct, or of the struct a pointer points at -fn field(c) -{ - let n, st, i, b = -1; - next(); - n = name(); - rval(); - if (c == C_FRESH) cerr("use a field of a new object only after binding it to a name"); - else if (c >= C_VAR) { touch(c - C_VAR); b = c - C_VAR; } - st = xty; - if (st[0] == TY_PTR) st = st[4]; - if (st[0] != TY_STRUCT) { - if (!panic && !dry) { errat(); putc('.'); puts(n); puts(": that's a "); tprint(xty); puts(", not a struct or a pointer to one"); errend(); } - xty = tword; lv = 1; lvk = LV_OTHER; return C_PLAIN; - } - i = tfindfield(st, n); - if (i < 0) { - if (!panic && !dry) { errat(); tprint(st); puts(" has no field "); puts(n); errend(); } - xty = tword; lv = 1; lvk = LV_OTHER; return C_PLAIN; - } - if (st[4][i * 3 + 2]) { lit(st[4][i * 3 + 2]); op(O_ADD); } - xty = st[4][i * 3 + 1]; - lv = 1; xzero = 0; - if (b >= 0) { lvk = LV_ELEM; lvi = b; } else lvk = LV_OTHER; - return C_PLAIN; -} -fn postfix() -{ - let c = primary(), b, n, t, et, ft, bs[8], k, ci; - while (1) { - if (tk == T_ID && tv == s_as) { // e as T: same bits, another type - next(); t = ptype(); rval(); xty = t; lvk = LV_NONE; - continue; - } - if (tk != T_OP) return c; - if (tv == s_lk) { - ci = 0; - if (o3on && lv && lvk == LV_LOCAL && o3cache[lvi]) ci = o3cache[lvi]; - next(); - rval(); - b = -1; - if (c == C_FRESH) cerr("index a new object only after binding it to a name"); - else if (c >= C_VAR) { touch(c - C_VAR); b = c - C_VAR; } - if (xty[0] == TY_DYN) { // a growable array: bounds-checked, through the runtime - et = xty[4]; - if (ci && lookup(s_outside) >= 0) op(O_DROP); - c = expr(); rval(); plainuse(c); - tcneed(isnum(xty) || xty == tword, "an index has to be a number", xty); - expect(s_rk); - k = lookup(s_outside); - if (ci && k >= 0 && skind[k] == K_ENH) { // a fixed array in o3: through its cached length and items - lit(0); op(O_PICK); vaddr(ci + 1); op(O_LD); op(XOP0 + sval[k]); - k = hole(); op(O_JZ); - vaddr(ci + 1); op(O_LD); callname(s_oob); - setlit(k, here); - vaddr(ci); op(O_LD); op(O_SWAP); - if (tsz(et) != 1) { lit(tsz(et)); op(15); } - op(O_ADD); - } else if (o3on && k >= 0 && skind[k] == K_ENH) { // h i: check i against h[0], then h[2] + i * size - lit(0); op(O_PICK); lit(2); op(O_PICK); op(O_LD); op(XOP0 + sval[k]); - k = hole(); op(O_JZ); - lit(1); op(O_PICK); op(O_LD); callname(s_oob); - setlit(k, here); - op(O_SWAP); lit(2); op(O_ADD); op(O_LD); op(O_SWAP); - if (tsz(et) != 1) { lit(tsz(et)); op(15); } - op(O_ADD); - } else callname(s_dat); - } else { - tcneed(isptr(xty) || xty == tword, "only pointers and arrays can be indexed", xty); - et = telem(xty); - n = 0 - 1; if (xty[0] == TY_ARR && xty[3] > 0) n = xty[3]; - xconst = 0; - c = expr(); rval(); plainuse(c); - if (n >= 0 && xconst && (xcval < 0 || xcval >= n)) serr("the index is out of range for this array"); - tcneed(isnum(xty) || xty == tword, "an index has to be a number", xty); - expect(s_rk); - if (tsz(et) != 1) { lit(tsz(et)); op(15); } - op(O_ADD); - } - lv = 1; xty = et; xzero = 0; - if (b >= 0) { lvk = LV_ELEM; lvi = b; } else lvk = LV_OTHER; - c = C_PLAIN; - continue; - } - if (tv == s_dot || tv == s_arrow) { c = field(c); continue; } - if (tv == s_lp) { // call through a value - rval(); plainuse(c); - ft = 0; - if (xty[0] == TY_FN) ft = xty; - else tcneed(xty == tword, "only functions can be called", xty); - wfill(bs, 0, 8); - n = args(0, ft, bs, o3on); - lit(n); op(O_PICK); op(O_CALL); op(O_SWAP); op(O_DROP); - lv = 0; lvk = LV_NONE; c = C_PLAIN; xzero = 0; - xty = tword; - if (ft) xty = subst(ft[4], bs); - continue; - } - if (tv == s_inc) { next(); c = incdec(1, 1); continue; } - if (tv == s_dec) { next(); c = incdec(1, -1); continue; } - return c; - } - return c; -} -fn unary() -{ - let c, un, t; - if (tk == T_ID && (tv == s_u || tv == s_m || tv == s_d)) { // u*x, d*x, m*x: recast - t = S_M; if (tv == s_u) t = S_U; if (tv == s_d) t = S_D; - next(); expect(s_star); - c = unary(); rval(); - lvk = LV_NONE; - return recast(c, t); - } - if (tk == T_OP) { - if (tv == s_star) { - next(); c = unary(); rval(); plainuse(c); - tcneed(xty[0] == TY_PTR || xty == tword, "only pointers can be dereferenced", xty); - xty = telem(xty); - lv = 1; lvk = LV_OTHER; xzero = 0; - return C_PLAIN; - } - if (tv == s_amp) { - next(); c = unary(); - if (!lv && !isagg(xty)) die("& needs something addressable"); - if (lv && lvk == LV_LOCAL && (ltag[lvi] & 16)) serr("an o3 variable has no address"); - if (c >= C_VAR) touch(c - C_VAR); - lv = 0; lvk = LV_NONE; xzero = 0; - xty = tptr(xty); - return C_PLAIN; - } - if (tv == s_inc) { next(); unary(); return incdec(0, 1); } - if (tv == s_dec) { next(); unary(); return incdec(0, -1); } - un = unfind(tv); - if (un >= 0) { - next(); c = unary(); rval(); plainuse(c); - emitseq(useq[un], ulen[un]); - xconst = 0; - if (un <= 1) xty = tbool; - else if (xty != tword) { tcneed(isnum(xty), "this operator needs a number", xty); xty = tint; } - lv = 0; lvk = LV_NONE; xzero = 0; - return C_PLAIN; - } - } - return postfix(); -} -fn bin(minp) -{ - let c = unary(), b, p, a, j, lt; - while (tk == T_OP) { - b = binfind(tv); - if (b < 0) return c; - p = bprec[b]; - if (p < minp) return c; - next(); rval(); plainuse(c); - lt = xty; - if (blen[b] == -1) { // && : 0 if the left side is 0, else the right side as 0 or 1 - a = hole(); op(O_JZ); - c = bin(p + 1); rval(); plainuse(c); - emitseq(useq[1], ulen[1]); // !! normalizes - j = hole(); op(O_JMP); - setlit(a, here); lit(0); setlit(j, here); - } else if (blen[b] == -2) { // || : 1 if the left side isn't 0, else the right side as 0 or 1 - a = hole(); op(O_JZ); - lit(1); j = hole(); op(O_JMP); - setlit(a, here); - c = bin(p + 1); rval(); plainuse(c); - emitseq(useq[1], ulen[1]); - setlit(j, here); - } else { - c = bin(p + 1); rval(); plainuse(c); - emitseq(bseq[b], blen[b]); - } - xty = bintype(b, lt, xty); - lv = 0; lvk = LV_NONE; c = C_PLAIN; xzero = 0; xconst = 0; - } - return c; -} -// [addr v] -> [v], storing v at addr -fn storekeep() { op(O_SWAP); lit(1); op(O_PICK); op(O_SWAP); op(O_ST); return 0; } -// c ? a : b -fn ternary(c) -{ - let a, b, s0, sa, livea, live0 = live, n0 = nloc, ca, cb, ta; - rval(); plainuse(c); - next(); - a = hole(); op(O_JZ); - s0 = snap_push(); - ca = expr(); rval(); ta = xty; - if (ca != C_FRESH) plainuse(ca); - livea = live; sa = snap_push(); - b = hole(); op(O_JMP); - expect(s_colon); - setlit(a, here); - snap_restore(s0); live = live0; - cb = expr(); rval(); - if (cb != C_FRESH) plainuse(cb); - join2(sa, livea, b, live, n0, "ends the two sides of ?: in different states"); - snap_pop(s0); - if (!compat(ta, xty) && !compat(xty, ta)) tcerr("the two sides of ?:", ta, xty); - if (ta != tword) xty = ta; - lv = 0; lvk = LV_NONE; xzero = 0; - if (ca == C_FRESH && cb == C_FRESH) return C_FRESH; - if (ca == C_FRESH || cb == C_FRESH) cerr("both sides of ?: have to be new objects, or neither"); - return C_PLAIN; -} -fn expr() -{ - let c = bin(1), k, i, a, rc, lt; - if (tk != T_OP) return c; - if (tv == s_q) return ternary(c); - if (tv == s_eq) { - if (!lv) die("this can't be assigned to"); - k = lvk; i = lvi; lt = xty; - if (isagg(lt)) serr("a whole struct or array can't be assigned; assign its fields"); - next(); - a = o3on && k == LV_LOCAL && (ltag[i] & 16) && !larr[i]; - if (a) op(O_DROP); // an o3 variable: its address comes after the value, so it never waits on the stack across a branch - rc = expr(); rval(); - if (!compat(lt, xty)) tcerr("assignment", lt, xty); - if (a) { lit(0); op(O_PICK); vaddr(i); op(O_ST); o3refresh(i); } - else { - if (o3on && k != LV_ELEM && hasptr(lt)) { lit(lt); callname(s_fatten); } // o3 data going somewhere normal code can see - storekeep(); - } - lv = 0; lvk = LV_NONE; xty = lt; xzero = 0; - return assigncheck(k, i, rc); - } - a = asgfind(tv); - if (a >= 0) { - if (!lv) die("this can't be assigned to"); - if (lvk == LV_LOCAL && fchk && tracked(lvi)) cerrn(lvi, "owns an object; compound assignment would lose it"); - lt = xty; - next(); - i = o3on && lvk == LV_LOCAL && (ltag[lvi] & 16) && !larr[lvi]; - if (i) { i = lvi; op(O_DROP); vaddr(i); op(O_LD); i = i + 1; } - else { lit(0); op(O_PICK); op(O_LD); } - lv = 0; - rc = expr(); rval(); plainuse(rc); - emitseq(bseq[abin[a]], blen[abin[a]]); - k = bintype(abin[a], lt, xty); - if (!compat(lt, k)) tcerr("compound assignment", lt, k); - if (i) { lit(0); op(O_PICK); vaddr(i - 1); op(O_ST); } else storekeep(); - lv = 0; lvk = LV_NONE; xty = lt; xzero = 0; - return C_PLAIN; - } - return c; -} -// does the current token start a statement rather than an expression? -fn stmtstart() -{ - let s; - if (tk == T_OP) return tv == s_semi || tv == s_lb || tstart(); - if (tk != T_ID || findloc(tv) >= 0) return 0; - if (tstart()) return 1; - s = lookup(tv); - return s >= 0 && skind[s] == K_KW && !(sflag[s] & F_EXPR); -} -// { stmts; tail } as an expression: its value is the tail, or 0 -fn blockexpr() -{ - let save = nloc, c = C_PLAIN, tail = 0, t = tint; - next(); - fdepth++; bxdepth++; - while (!is_op(s_rb)) { - if (tk == T_EOF) die("missing }"); - if (stmtstart()) { stmt(); continue; } - c = expr(); rval(); - if (accept(s_semi)) { op(O_DROP); discard(c); c = C_PLAIN; continue; } - if (!is_op(s_rb)) die("expected ; or } after an expression"); - tail = 1; t = xty; - } - next(); - if (tail) c = handup(c); else lit(0); - block_close(save); - fdepth--; bxdepth--; - lv = 0; lvk = LV_NONE; xty = t; xzero = 0; - return c; -} - -// ---- constant expressions ---- -fn cprim() -{ - let v, s; - if (tk == T_NUM) { v = tv; next(); return v; } - if (accept(s_minus)) return 0 - cprim(); - if (tk == T_OP && tv == uname[2]) { next(); return ~cprim(); } - if (accept(s_lp)) { v = cexpr(); expect(s_rp); return v; } - if (tk == T_ID) { - s = lookup(tv); - if (s >= 0 && (skind[s] == K_CONST || skind[s] == K_GARR || (skind[s] == K_FN && (sflag[s] & F_DEF)) || skind[s] == K_GVAR)) { next(); return sval[s]; } - } - die("expected a constant"); - return 0; -} -fn cexpr() -{ - let v = cprim(), o; - while (tk == T_OP) { - o = tv; - if (o == bname[3]) { next(); v = v + cprim(); } - else if (o == bname[4]) { next(); v = v - cprim(); } - else if (o == bname[0]) { next(); v = v * cprim(); } - else if (o == bname[15]) { next(); v = v | cprim(); } - else if (o == bname[13]) { next(); v = v & cprim(); } - else if (o == bname[5]) { next(); v = v << cprim(); } - else if (o == bname[6]) { next(); v = v >> cprim(); } - else return v; - } - return v; -} - -// ---- statements ---- -// after a syntax error: skip to the end of the statement -fn resync() -{ - while (tk != T_EOF && !is_op(s_semi) && !is_op(s_rb)) next(); - if (is_op(s_semi)) next(); - panic = 0; - return 0; -} -fn stmt() -{ - let s, c; - if (panic) return resync(); - if (tk == T_ID && findloc(tv) < 0) { - s = lookup(tv); - if (s >= 0 && skind[s] == K_KW && (sflag[s] & F_STMT)) { kwcall(s, 0); return 0; } - } - if (tstart()) { localdecl(1); return 0; } - if (tk == T_OP) { - if (tv == s_semi) { next(); return 0; } - if (tv == s_lb) { block(); return 0; } - } - c = expr(); rval(); op(O_DROP); - expect(s_semi); - discard(c); - return 0; -} -fn block() -{ - let save = nloc; - expect(s_lb); - fdepth++; - while (!is_op(s_rb)) { if (tk == T_EOF) die("missing }"); stmt(); } - block_close(save); // before the }, so its line is the one reported - next(); - fdepth--; - return 0; -} -// the body of if/while/for: its own block, even without braces -fn substmt() -{ - let save = nloc; - if (is_op(s_lb)) return block(); - fdepth++; - stmt(); - block_close(save); - fdepth--; - return 0; -} -// let a = e, b[10]; or, typed: int a = 1, b; *node.m p = new(node); .u r; -// let infers pointer, struct and function types from the initializer and -// keeps numbers as plain words. -fn localdecl(typed) -{ - let n, i, c, k, t = 0, tg = 0; - if (typed) { dtype(); t = dty; tg = dtag; if (t == tvoid) serr("a variable can't be void"); } - if ((o3on || o3one) && !typed) serr("o3 variables need a type"); - while (1) { - n = name(); - i = newloc(n); - ltag[i] = tg; - if (o3on || o3one) ltag[i] = tg | 16; - if (accept(s_lk)) { - k = cexpr(); expect(s_rk); - if (!t) t = tword; - larr[i] = 1; ltype[i] = tarr(t, k); fslots = fslots + tsz(ltype[i]); - } else if (t && isagg(t)) { larr[i] = 1; ltype[i] = t; fslots = fslots + tsz(t); } - else { fslots++; if (t) ltype[i] = t; if (o3on) { o3promote(i); o3mkcache(i); } } - if (accept(s_eq)) { - if (larr[i]) serr("an array or a struct can't be initialized with ="); - c = expr(); rval(); vaddr(i); op(O_ST); o3refresh(i); - if (t) { if (!compat(t, xty)) tcerr("initializer", t, xty); } - else if (!isnum(xty)) ltype[i] = xty; - assigncheck(LV_LOCAL, i, c); - } - if (!accept(s_comma)) break; - } - expect(s_semi); - return 0; -} -fn kw_var() { stmtonly(); next(); return localdecl(0); } -fn kw_if() -{ - let a, b, c, s0, sa, live0, livea, n0 = nloc, nt, cj; - stmtonly(); - next(); - expect(s_lp); c = expr(); rval(); plainuse(c); expect(s_rp); - a = hole(); op(O_JZ); - live0 = live; - s0 = snap_push(); - substmt(); - livea = live; sa = snap_push(); - if (is_id(s_else)) { - next(); - b = hole(); op(O_JMP); - setlit(a, here); - snap_restore(s0); live = live0; - substmt(); - join2(sa, livea, b, live, n0, "ends the branches of an if in different states"); - } else { - // the path that skips the then branch still has the states from before it - njps = 0; if (livea) jadd(R_SNAP + sa); if (live0) jadd(R_SNAP + s0); - join(n0, "ends the branches of an if in different states"); - if (livea) fixups(R_SNAP + sa, n0, 1); - nt = 0; if (live0) nt = fixups(R_SNAP + s0, n0, 0); - if (nt) { cj = hole(); op(O_JMP); setlit(a, here); fixups(R_SNAP + s0, n0, 1); setlit(cj, here); } - else setlit(a, here); - live = livea || live0; - } - snap_pop(s0); - return 0; -} -// loop frame: 0 continue target 1 break chain 2 depth 3 snapshot 4 block-expression depth -// loop frame: 0 continue target (-1 for a switch) 2 depth 3 snapshot at the top -// 4 block-expression depth 5 locals at the start 6 its first exit record -fn loop_push(cont, s0) -{ - let f = R_LOOP + lsp * 8; - if (lsp >= 60) fatal("loops nested too deeply"); - f[0] = cont; f[1] = 0; f[2] = fdepth; f[3] = s0; f[4] = bxdepth; f[5] = nloc; f[6] = extop; - lsp++; - return 0; -} -// the end of a loop or switch: join its exits (the fall-out path sc through -// the jump at a, if there is one, and every break) and lay out each path's -// fixups on its way to the end -fn loop_end(a, sc) -{ - let f, p, e, n0, outs = 0; - lsp--; - f = R_LOOP + lsp * 8; - n0 = f[5]; - njps = 0; - if (sc >= 0) jadd(R_SNAP + sc); - p = R_EXIT + f[6]; e = R_EXIT + extop; - while (p < e) { jadd(p + 1); p = p + 3 + 3 * (p[2] - p[1]); } - join(n0, "leaves the loop in different states on different paths"); - live = njps > 0; - p = R_EXIT + f[6]; - while (p < e) { - if (fixups(p + 1, n0, 0)) { setlit(p[0], here); fixups(p + 1, n0, 1); outs = fixnew(hole(), outs); op(O_JMP); } - else outs = fixnew(p[0], outs); - p = p + 3 + 3 * (p[2] - p[1]); - } - if (a >= 0) setlit(a, here); - if (sc >= 0) fixups(R_SNAP + sc, n0, 1); - fixall(outs, here); - extop = f[6]; - return 0; -} -fn kw_while() -{ - let c0 = here, a, s0, sc = -1, c, inf = 0; - stmtonly(); - next(); - s0 = snap_push(); - expect(s_lp); - if (tk == T_NUM && tv) { peek(); if (pk_tk == T_OP && pk_tv == s_rp) inf = 1; } // while (1): no way out but break - c = expr(); rval(); plainuse(c); expect(s_rp); - a = hole(); op(O_JZ); - if (!inf && live) sc = snap_push(); - loop_push(c0, s0); - substmt(); - backedge(s0); - jmp(c0); - loop_end(a, sc); - snap_pop(s0); - return 0; -} -fn kw_for() -{ - let save = nloc, s0, sc = -1, c0, a, b, st, c, inf = 0; - stmtonly(); - next(); - expect(s_lp); - fdepth++; - if (is_id(s_var)) kw_var(); - else if (tstart()) localdecl(1); - else { if (!is_op(s_semi)) { c = expr(); rval(); op(O_DROP); discard(c); } expect(s_semi); } - s0 = snap_push(); - c0 = here; - if (!is_op(s_semi)) { - if (tk == T_NUM && tv) { peek(); if (pk_tk == T_OP && pk_tv == s_semi) inf = 1; } - c = expr(); rval(); plainuse(c); - } else { lit(1); inf = 1; } - expect(s_semi); - a = hole(); op(O_JZ); - if (!inf && live) sc = snap_push(); - b = hole(); op(O_JMP); - st = here; - if (!is_op(s_rp)) { c = expr(); rval(); op(O_DROP); discard(c); } - expect(s_rp); - jmp(c0); - setlit(b, here); - loop_push(st, s0); - substmt(); - backedge(s0); - jmp(st); - loop_end(a, sc); - snap_pop(s0); - block_close(save); - fdepth--; - return 0; -} -fn kw_break() -{ - let f; - stmtonly(); - next(); expect(s_semi); - if (lsp <= loopbase) { serr("break outside a loop or a switch"); return 0; } - f = R_LOOP + (lsp - 1) * 8; - if (f[4] != bxdepth) { serr("break can't leave a block expression"); return 0; } - exit_vars(f[2] + 1, 0); - if (live) exit_rec(hole()); else hole(); - op(O_JMP); - live = 0; - return 0; -} -fn kw_continue() -{ - let j = lsp - 1, f; - stmtonly(); - next(); expect(s_semi); - while (j >= loopbase && R_LOOP[j * 8] == -1) j--; // past any switch - if (j < loopbase) { serr("continue outside a loop"); return 0; } - f = R_LOOP + j * 8; - if (f[4] != bxdepth) { serr("continue can't leave a block expression"); return 0; } - backedge(f[3]); - exit_vars(f[2] + 1, 0); - jmp(f[0]); - live = 0; - return 0; -} -// switch (e) { case 1, 2: ... case 'x': ... default: ... } -// cases don't fall through: each one ends where the next begins, and break -// leaves the switch early. case labels are constants. -fn casebody(s0, live0) -{ - let save = nloc; - snap_restore(s0); live = live0; - fdepth++; - while (!is_op(s_rb) && !is_id(s_case) && !is_id(s_default)) { if (tk == T_EOF) { die("missing }"); break; } stmt(); } - block_close(save); - fdepth--; - if (live) { exit_rec(hole()); op(O_JMP); } // the end of a case leaves the switch - live = 0; - return 0; -} -fn kw_switch() -{ - let save = nloc, tmp, c, s0, live0, defent = -1, skip, nxt, bj, v, a = -1; - stmtonly(); - next(); - expect(s_lp); c = expr(); rval(); plainuse(c); expect(s_rp); - fdepth++; - tmp = newloc(0); fslots++; // a hidden local holds the value - laddr(lslot[tmp]); op(O_ST); - live0 = live; - s0 = snap_push(); - loop_push(-1, s0); - expect(s_lb); - while (!is_op(s_rb)) { - if (tk == T_EOF) { die("missing }"); break; } - if (is_id(s_case)) { - next(); - bj = 0; - while (1) { - v = cexpr(); - laddr(lslot[tmp]); op(O_LD); lit(v); op(O_SUB); - bj = fixnew(hole(), bj); op(O_JZ); - if (!accept(s_comma)) break; - } - expect(s_colon); - nxt = hole(); op(O_JMP); - fixall(bj, here); - casebody(s0, live0); - setlit(nxt, here); - } else if (is_id(s_default)) { - next(); expect(s_colon); - if (defent >= 0) serr("a switch has one default"); - skip = hole(); op(O_JMP); // only reached when nothing matched - defent = here; - casebody(s0, live0); - setlit(skip, here); - } else die("expected case or default"); - } - next(); - snap_restore(s0); live = live0; - if (defent >= 0) { jmp(defent); loop_end(-1, -1); } - else { a = hole(); op(O_JMP); loop_end(a, s0); } // nothing matched: out with the states from the top - snap_pop(s0); - block_close(save); - fdepth--; - return 0; -} -fn kw_return() -{ - let c; - stmtonly(); - next(); - if (!infn) serr("return outside a function"); - if (bxdepth) serr("return can't leave a block expression"); - if (is_op(s_semi)) { lit(0); c = C_PLAIN; } - else { - c = expr(); rval(); - if (fty == tvoid) tcerr("return value", tvoid, xty); - else if (fty && !compat(fty, xty)) tcerr("return value", fty, xty); - if (o3on && fty && hasptr(fty)) { lit(fty); callname(s_fatten); } - } - expect(s_semi); - retcheck(c); - exit_vars(1, 0); - epichain = fixnew(here, epichain); - lit(MW - 1); op(O_JMP); - live = 0; - return 0; -} -// o3 { ... }: an optimized region. o3 T x = e;: one o3 variable -fn kw_o3() -{ - let lo, i, p, save, outer; - stmtonly(); - next(); - if (!is_op(s_lb)) { o3one = 1; localdecl(1); o3one = 0; return 0; } - if (o3on || !infn) return block(); - lo = here + 2; lit(lo); op(O_JMP); - o3on = 1; o3reset(); - save = nloc; outer = nloc; - i = lbase; - while (i < outer) { if (ltag[i] & 16) { o3promote(i); o3mkcache(i); o3refresh(i); } i++; } // o3 variables declared outside - block(); - o3on = 0; - if (no3pend < 10) { - p = o3pend + no3pend * 67; p[0] = lo; p[1] = here; p[2] = no3sl; - wcopy(p + 3, o3sl, no3sl); wcopy(p + 35, o3rg, no3sl); no3pend++; - } - nloc = save; // the hidden cache variables - i = lbase; - while (i < outer) { - ltag[i] = ltag[i] - (ltag[i] & 1792); o3cache[i] = 0; - if ((ltag[i] & 16) && hasptr(ltype[i])) { vaddr(i); op(O_LD); lit(ltype[i]); callname(s_fatten); op(O_DROP); } // leaving o3: fatten what they hold - i++; - } - return 0; -} -fn kw_unchecked() -{ - let old = fchk; - stmtonly(); - next(); - fchk = 0; - substmt(); - fchk = old; - return 0; -} - -// ---- asm blocks: raw vm words, one per token ---- -// numbers push, -n pushes a negative number, #n emits a raw word, one-char -// tokens from the mnemonic table are opcodes, names push the address of a -// variable or function, :name defines a label for this block. -fn asmblock() -{ - let nl = 0, nr = 0, i, k, c, s, ln = R_ASM, la = R_ASM + 64, rn = R_ASM + 128, ra = R_ASM + 384; - expect(s_lb); - while (!is_op(s_rb)) { - if (tk == T_EOF) die("unterminated asm block"); - if (tk == T_NUM) { lit(tv); next(); continue; } - if (tk == T_STR) { strlit(tv); next(); continue; } - if (is_op(s_hash)) { next(); if (tk != T_NUM) die("# needs a number"); emit(tv); next(); continue; } - if (is_op(s_minus)) { next(); if (tk == T_NUM && tglue) { lit(0 - tv); next(); } else op(O_SUB); continue; } - if (is_op(s_colon)) { next(); if (nl >= 64) fatal("too many asm labels"); ln[nl] = name(); la[nl] = here; nl++; continue; } - if (tv[0] && !tv[1] && (c = mnemidx(tv[0])) >= 0) { op(c); next(); continue; } - if (tk != T_ID) die("bad token in asm"); - i = findloc(tv); - if (i >= 0 && (ltag[i] & 16) && !larr[i]) serr("asm can't reach an o3 variable"); - if (i >= 0) { lused[i] = 1; laddr(lslot[i]); next(); continue; } - k = -1; i = 0; - while (i < nl) { if (ln[i] == tv) k = i; i++; } - if (k >= 0) { lit(la[k]); next(); continue; } - s = lookup(tv); - if (s >= 0 && skind[s] == K_ENH) { op(XOP0 + sval[s]); next(); continue; } - if (s >= 0 && skind[s] != K_FN && skind[s] != K_KW) { lit(sval[s]); next(); continue; } - if (s >= 0 && skind[s] == K_FN) { fnref(s); next(); continue; } - if (nr >= 250) fatal("too many asm label references"); - rn[nr] = tv; ra[nr] = hole(); nr++; next(); // a label further down this block - } - next(); - i = 0; - while (i < nr) { - k = -1; c = 0; - while (c < nl) { if (ln[c] == rn[i]) k = c; c++; } - if (k < 0) serrn(rn[i], "unknown name in asm"); - setlit(ra[i], la[k]); - i++; - } - return 0; -} -fn kw_asm() { next(); asmblock(); xcls = C_PLAIN; return 0; } - -// ---- quote: code as data ---- -// a token list is an object: [n] then kind, value, line for each token. names, -// strings and operators are interned pointers. -.u grab() -{ - let n = 0, depth = 0, q; - if (!is_op(s_lb)) die("expected {"); - next(); - while (1) { - if (tk == T_EOF) die("unterminated quote"); - if (is_op(s_lb)) depth++; - if (is_op(s_rb)) { if (!depth) break; depth--; } - if (n >= 2700) fatal("quote too long"); - R_QBUF[n * 3] = tk; R_QBUF[n * 3 + 1] = tv; R_QBUF[n * 3 + 2] = tline; n++; - next(); - } - next(); - q = new(n * 3 + 1); - q[0] = n; - wcopy(q + 1, R_QBUF, n * 3); - return u*q; -} -unchecked .u qnew(src) { let n = src[0] * 3 + 1, q = new(n); wcopy(q, src, n); return q; } -.u qdup(.m q) { let n = q[0] * 3 + 1, r = new(n); wcopy(r, q, n); return u*r; } -fn wcopyto(.m q, n) { let i = 0; while (i < n) { emit(q[i]); i++; } return 0; } -fn kw_quote() -{ - let q, j, a, n; - next(); - q = grab(); - j = hole(); op(O_JMP); - a = here; - n = q[0] * 3 + 1; - wcopyto(q, n); - free(d*q); - setlit(j, here); - lit(a); - callname(s_qnew); - xcls = C_FRESH; - return 0; -} -// tokens of a string, as a token list -.u tokens(s) -{ - let n = 0, q; - src_push(2, s, 0, 0); - next(); - while (tk != T_EOF) { - if (n >= 2700) fatal("too many tokens"); - R_QBUF[n * 3] = tk; R_QBUF[n * 3 + 1] = tv; R_QBUF[n * 3 + 2] = tline; n++; - next(); - } - src_pop(); - q = new(n * 3 + 1); - q[0] = n; - wcopy(q + 1, R_QBUF, n * 3); - return u*q; -} -// feed a token list into the input: the parser reads it next, then carries -// on where it was. the list is freed once it has been read. -unchecked fn feed(.d q) { src_push(1, q, 1, 1); next(); return 0; } - -// ---- reading a unit and scanning it for signatures ---- -// a unit from stdin is read whole first (4 chars to a word), then scanned -// once for function signatures, so a function's tags are known before its first -// call even when it's defined further down. -unchecked fn readsrc() -{ - let cap = 4090, b = new(4090), n = 0, c, nb, w; - while (!eof()) { - c = getc() & 255; - if (c == 96) break; - if ((n >> 2) + 2 >= cap) { nb = new(cap + cap + 6); wcopy(nb, b, cap); free(b); b = nb; cap = cap + cap + 6; } - w = n >> 2; - if (!(n & 3)) b[w] = 0; - b[w] = b[w] | (c << ((n & 3) * 8)); - n++; - } - b[n >> 2] = b[n >> 2] & (pow2[(n & 3) * 8] - 1); // the 0 at the end - if ((n & 3) == 0) b[n >> 2] = 0; - b[(n >> 2) + 1] = 0; - return b; -} -// skip a <...> group (type parameters) -fn pskipangle() -{ - let dp = 0; - while (tk != T_EOF) { - if (is_op(s_lt)) dp++; - else if (is_op(s_gt)) dp--; - else if (is_op(s_shr)) dp = dp - 2; - next(); - if (dp <= 0) return 0; - } - return 0; -} -// at the name after fn: read the signature's tags and record them -fn prescan_fn(ret, n, o3) -{ - let np = 0, tags = 0, t = 0, dp, s; - next(); // the ( - if (!is_op(s_rp)) { - np = 1; dp = 1; - while (tk != T_EOF) { - if (is_op(s_lp)) dp++; - else if (is_op(s_rp)) { dp--; if (!dp) break; } - else if (dp == 1 && is_op(s_comma)) { if (np <= 12) tags = tags + (t << (np + np - 2)); np++; t = 0; } - else if (dp == 1 && is_op(s_dot)) { next(); if (is_id(s_m)) t = 1; else if (is_id(s_d)) t = 2; continue; } - next(); - } - if (np <= 12) tags = tags + (t << (np + np - 2)); - } - next(); - if (!is_op(s_lb) && !is_op(s_semi)) return 0; // not a function: an enhancement, a call in a parse word... - s = lookup(n); - if (s < 0 || s < ubase || skind[s] != K_FN || (sflag[s] & F_DEF)) s = fwdfn(n); - if (!(sflag[s] & F_SIG)) { ssig[s] = ret + np + np + tags * 64; sflag[s] = sflag[s] | F_SIG | F_PRE; } - if (o3) sflag[s] = sflag[s] | F_O3; - return 0; -} -fn prescan(kind, obj) -{ - let depth = 0, sp = panic, sn = nerr, pend = 0, po3 = 0, n, dep; - dry++; - src_push(kind, obj, 0, 0); - next(); - while (tk != T_EOF) { - if (is_op(s_lb)) depth++; - else if (is_op(s_rb)) { depth--; pend = 0; po3 = 0; } - else if (depth <= 0) { - if (is_op(s_semi)) { pend = 0; po3 = 0; } - else if (is_op(s_dot)) { peek(); if (pk_tk == T_ID && pk_tv == s_u) pend = 1; } - else if (is_id(s_o3)) po3 = 1; - else if (tk == T_ID) { - peek(); - if (pk_tk == T_OP && pk_tv == s_lp) { n = tv; next(); prescan_fn(pend, n, po3); pend = 0; po3 = 0; continue; } - if (pk_tk == T_OP && pk_tv == s_lt) { // list<T> in a type, or first<T>( a generic function - n = tv; next(); dep = 0; - while (tk != T_EOF) { - if (is_op(s_lt)) dep++; else if (is_op(s_gt)) dep--; else if (is_op(s_shr)) dep = dep - 2; - next(); - if (dep <= 0) break; - } - if (is_op(s_lp)) { prescan_fn(pend, n, po3); pend = 0; po3 = 0; } - continue; - } - } - } - next(); - } - src_pop(); - dry--; panic = sp; nerr = sn; - return 0; -} -// compile a whole unit from stdin -fn unit_stdin() -{ - let src = readsrc(); - prescan(3, src); - src_push(3, src, 0, 0); - next(); - unit_top(); - unit_end(ubase); - src_pop(); - free(src); - return 0; -} - -// ---- nested compiles ---- -// compile() and load() can run while another function is being compiled (from -// a parse word). the function context is saved, the new code is emitted in -// place with a jump around it, and then everything is put back. -fn ctx_push() -{ - let f = R_CTX + ctxsp * 24; - if (ctxsp >= 30) fatal("compiles nested too deeply"); - ctxsp++; - f[0] = nloc; f[1] = lbase; f[2] = fdepth; f[3] = fslots; f[4] = fchk; f[5] = fret; f[6] = live; - f[7] = bxdepth; f[8] = epichain; f[9] = fframe; f[10] = infn; f[11] = lsp; f[12] = loopbase; - f[13] = lv; f[14] = lvk; f[15] = lvi; f[16] = kw_expr; f[17] = xcls; f[18] = snaptop; - f[19] = fty; f[20] = ntp; f[21] = xty; wcopy(f + 22, tpn, 2); - return 0; -} -fn ctx_pop() -{ - let f; - ctxsp--; - f = R_CTX + ctxsp * 24; - nloc = f[0]; lbase = f[1]; fdepth = f[2]; fslots = f[3]; fchk = f[4]; fret = f[5]; live = f[6]; - bxdepth = f[7]; epichain = f[8]; fframe = f[9]; infn = f[10]; lsp = f[11]; loopbase = f[12]; - lv = f[13]; lvk = f[14]; lvi = f[15]; kw_expr = f[16]; xcls = f[17]; snaptop = f[18]; - fty = f[19]; ntp = f[20]; xty = f[21]; wcopy(tpn, f + 22, 2); - return 0; -} - -// ---- functions and the top level ---- -fn fn_begin(chk, ret) -{ - lbase = nloc; fdepth = 1; fslots = 0; fchk = chk && check_on; fret = ret; fty = 0; - live = 1; bxdepth = 0; epichain = 0; infn = 1; loopbase = lsp; lv = 0; lvk = LV_NONE; - return 0; -} -// fp -= frame size, then check the frame stack: past FBOT, reset fp and stop -fn prologue() -{ - let k; - lit(ZFP); op(O_LD); fframe = hole(); op(O_SUB); lit(ZFP); op(O_ST); - if (o3on) return 0; // o3 gave up the frame check - lit(ZFP); op(O_LD); lit(FBOT); op(O_LT); k = hole(); op(O_JZ); - lit(FTOP); lit(ZFP); op(O_ST); callname(s_fovf); - setlit(k, here); - return 0; -} -fn epilogue() -{ - lit(0); - fixall(epichain, here); - lit(ZFP); op(O_LD); lit(fslots); op(O_ADD); lit(ZFP); op(O_ST); op(O_RET); - setlit(fframe, fslots); - infn = 0; - nloc = lbase; - return 0; -} -fn body() -{ - expect(s_lb); - while (!is_op(s_rb)) { if (tk == T_EOF) die("missing } at the end of a function"); stmt(); } - unused_check(lbase); - if (fchk && live) { exit_vars(1, 1); if (fret) cerr("a function returning .u has to end with a return"); } - next(); - return 0; -} -// the rest of a function, after its return type and name: -// int f(int a, *node.m n, .d x, b) { ... } <T> *list<T>.u mk(int n) { ... } -// rty is 0 for fn (a plain word), ret is 1 for a .u return -fn fndef(chk, rty, ret, n) -{ - let s, np = 0, tags = 0, t, sig, i, pn[24], pt[24], pty[24], typed = 0, ft, o3f = o3nxt, lo, hi; - o3nxt = 0; - if (rty || ntp) typed = 1; - s = lookup(n); - if (s < 0 || s < ubase || skind[s] != K_FN || (sflag[s] & F_DEF)) { s = addsym(n, K_FN, 0); sflag[s] = 0; } - expect(s_lp); - if (!is_op(s_rp)) { - while (1) { - t = 0; - pty[np] = tword; - if (!is_op(s_dot) && ((tk == T_OP && (tv == s_star || tv == s_lk)) || (tk == T_ID && (tv == s_fn || istypename(tv))))) { - pty[np] = ptype(); typed = 1; - if (isagg(pty[np])) serr("structs and arrays are passed by pointer"); - } - if (accept(s_dot)) { // .m lends, .d takes over - if (tv == s_m) t = 1; else if (tv == s_d) t = 2; else die("a parameter tag is .m or .d"); - next(); - } - pn[np] = name(); - if (o3f && pty[np] == tword) serr("o3 parameters need a type"); - if (np >= 12 && t) die("only the first 12 parameters can be tagged"); - pt[np] = t; - if (np < 12) tags = tags + (t << (np + np)); - np++; - if (np >= 24) die("too many parameters"); - if (!accept(s_comma)) break; - } - } - expect(s_rp); - sig = ret + np + np + tags * 64; - if ((sflag[s] & F_SIG) && !(sflag[s] & F_PRE)) { if (ssig[s] != sig) serrn(n, "doesn't match its earlier declaration"); } - else if ((sflag[s] & F_UNTYPED) && (tags || ret)) serrn(n, "was called before its tags were declared; put a prototype above the first call"); - ssig[s] = sig; - sflag[s] = (sflag[s] | F_SIG) - (sflag[s] & F_PRE); - if (ntp) sflag[s] = sflag[s] | F_GEN; - if (typed) { - if (!rty) rty = tword; - ft = tfn(rty, np, pty, sig); - if (stype[s] && stype[s] != ft) serrn(n, "doesn't match its earlier declaration"); - stype[s] = ft; - } - if (accept(s_semi)) { ntp = 0; return s; } - if (sflag[s] & F_DEF) serrn(n, "is defined twice"); - sval[s] = here; - sflag[s] = sflag[s] | F_DEF; - fixall(sfix[s], here); sfix[s] = 0; - fn_begin(chk, ret); - if (typed) fty = rty; - no3pend = 0; - if (o3f) { o3on = 1; o3reset(); sflag[s] = sflag[s] | F_O3; } - prologue(); - i = 0; - while (i < np) { - t = newloc(pn[i]); fslots++; - ltype[t] = pty[i]; - if (o3f) { ltag[t] = 16; o3promote(t); } - if (fchk && pt[i] == 1) lstate[t] = S_BORROW; - if (fchk && pt[i] == 2) { lstate[t] = S_M; lown[t] = 1; } - i++; - } - i = np; - while (i) { i--; laddr(i); op(O_ST); } - if (o3f) { // the region starts here: a jump, so the cpu enters it - lo = here + 2; lit(lo); op(O_JMP); - i = 0; while (i < np) { t = lbase + i; o3mkcache(t); o3refresh(t); i++; } - } - body(); - hi = here; - epilogue(); - if (o3f) { o3on = 0; o3region(lo, hi, o3sl, o3rg, no3sl); } - o3flush(); - ntp = 0; - return s; -} -// let g = 1, buf[10]; int g = 3; [10]int buf; point origin; -fn gdecl(typed) { next(); return gdecl2(0, 0, name()); } -fn gdecl2(t, tg, n) -{ - let a, k, s; - if (tg) serr("tags go on locals and parameters, not globals"); - if (t == tvoid) serr("a variable can't be void"); - while (1) { - if (accept(s_lk)) { - k = cexpr(); expect(s_rk); - s = addsym(n, K_GARR, here); - if (!t) t = tword; - stype[s] = tarr(t, k); - k = tsz(stype[s]); - while (k) { emit(0); k--; } - } else if (t && isagg(t)) { - s = addsym(n, K_GARR, here); stype[s] = t; - k = tsz(t); - while (k) { emit(0); k--; } - } else { - a = here; - s = addsym(n, K_GVAR, a); - if (t) stype[s] = t; - emit(0); - if (accept(s_eq)) { - if (tk == T_STR) { *(a + hdelta) = here; k = tv; while (*k) { emit(*k); k++; } emit(0); next(); } - else *(a + hdelta) = cexpr(); - } - } - if (!accept(s_comma)) break; - n = name(); - } - expect(s_semi); - return 0; -} -fn gconst() -{ - let n; - next(); - while (1) { n = name(); expect(s_eq); addsym(n, K_CONST, cexpr()); if (!accept(s_comma)) break; } - expect(s_semi); - return 0; -} -// enhance [n] name(a, b) micro "recipe" [else fn]; n outputs, 1 if left out -// enhance [n] name(a, b) vm { asm } [else fn]; -// lays out the descriptor the install opcode reads, and wires it in right -// away (an image wires its own in when it boots). -fn enhdef() -{ - let n, np = 0, nout = 1, dsc, na, pay, len = 0, kind = 0, i, p, s, slot, r, pn[8]; - next(); - if (tk == T_NUM) { if (tv < 0 || tv > 8) serr("an enhancement has at most 8 outputs"); nout = tv; next(); } // enhance 2 divmod(a, b) - n = name(); - expect(s_lp); - if (!is_op(s_rp)) { while (1) { if (np == 8) die("an enhancement takes at most 8 inputs"); pn[np] = name(); np++; if (!accept(s_comma)) break; } } - expect(s_rp); - dsc = here; i = 0; while (i < 7) { emit(0); i++; } - na = here; i = 0; while (i < np) { emit(0); i++; } - i = 0; - while (i < np) { *(na + i + hdelta) = here; p = pn[i]; while (*p) { emit(*p); p++; } emit(0); i++; } - if (accept(s_micro)) { - pay = here; - if (tk != T_STR) die("expected the recipe as a string"); - while (tk == T_STR) { p = tv; while (*p) { emit(*p); p++; } next(); } - emit(0); - } else if (accept(s_vm)) { pay = here; asmblock(); op(O_RET); len = here - pay; kind = 1; } - else die("expected micro or vm"); - slot = nenh; - if (slot >= 512) fatal("all 512 enhancement slots are taken"); - nenh++; - p = dsc + hdelta; - p[0] = slot; p[1] = kind; p[2] = np; p[3] = nout; p[4] = pay; p[5] = len; p[6] = na; - s = addsym(n, K_ENH, slot); - ssig[s] = np + nout * 16 + dsc * 256; - if (accept(s_else)) { r = lookup(tv); if (r < 0) r = fwdfn(tv); next(); sfix[s] = r + 1; } - expect(s_semi); - if (!hdelta) { - r = install(dsc); - if (r < 0) { - if (!sfix[s]) serrn(n, "the enhancement didn't install (see install's codes in core.c)"); - sflag[s] = sflag[s] | F_FALLBACK; - } - } - return 0; -} -// after a syntax error at the top level: skip to something that starts a declaration -fn topsync() -{ - let depth = 0; - while (tk != T_EOF) { - if (is_op(s_lb)) depth++; - else if (is_op(s_rb)) { depth--; if (depth < 0) depth = 0; } - else if (!depth && tk == T_ID && (tv == s_fn || tv == s_var || tv == s_const || tv == s_struct || tv == s_type - || tv == s_enhance || tv == s_typecheck || tv == s_unchecked || tv == s_immediate || tv == s_o3)) break; - next(); - } - panic = 0; - return 0; -} -// after a function's name: <T, U> declares its type parameters. any the return -// type used were taken on trust; now they get their real numbers -fn genparams() -{ - let i, j, n = 0, ps[8], bs[8]; - if (!is_op(s_lt)) { if (ntp) serrn(tpn[0], "isn't a type"); ntp = 0; return 0; } - next(); - while (1) { if (n >= 8) fatal("too many type parameters"); ps[n] = name(); n++; if (!accept(s_comma)) break; } - closeangle(); - wfill(bs, 0, 8); - i = 0; - while (i < ntp) { - j = 0; - while (j < n && ps[j] != tpn[i]) j++; - if (j == n) serrn(tpn[i], "isn't a type"); else bs[i] = tvar(j, ps[j]); - i++; - } - if (ntp && dty) dty = subst(dty, bs); - wcopy(tpn, ps, n); ntp = n; - return 0; -} -// the return type of a function or the type of a global, with unknown names allowed for now -fn rettype() { tvauto = 1; dtype(); tvauto = 0; return 0; } -fn fndone(s, imm) -{ - let k; - ntp = 0; - if (imm) { - if (hdelta) serr("parse words can't be defined while building an image"); - k = addsym(sname[s], K_KW, sval[s]); - sflag[k] = F_DEF | F_STMT | F_EXPR | F_TOP; - } - return 0; -} -fn topitem() -{ - let chk = 1, imm = 0, s, k, n; - if (panic) return topsync(); - if (is_id(s_unchecked)) { - next(); - if (accept(s_semi)) { check_on = 0; return 0; } // unchecked; switches the analyzer off from here on - chk = 0; - } - if (is_id(s_immediate)) { next(); imm = 1; } - o3nxt = 0; - if (is_id(s_o3)) { next(); o3nxt = 1; } - ntp = 0; - if (is_id(s_fn)) { peek(); if (!(pk_tk == T_OP && pk_tv == s_lp)) { next(); n = name(); dty = 0; genparams(); return fndone(fndef(chk, 0, 0, n), imm); } } - if (!chk || imm || o3nxt) { // has to be a function, with a return type - rettype(); n = name(); genparams(); - if (dtag && dtag != S_U) serr("the only return tag is .u"); - if (!is_op(s_lp)) { die("expected a function"); return 0; } - return fndone(fndef(chk, dty, dtag == S_U, n), imm); - } - if (is_id(s_var)) return gdecl(0); - if (is_id(s_struct)) { kw_struct(); return 0; } - if (is_id(s_type)) return kw_type(); - if (is_id(s_typecheck)) return kw_typecheck(); - if (is_id(s_enhance)) return enhdef(); - if (is_id(s_const)) return gconst(); - if (tk == T_ID) { - s = lookup(tv); - if (s >= 0 && skind[s] == K_KW && (sflag[s] & F_TOP)) { kwcall(s, 0); return 0; } - } - if (tstart() || is_op(s_star) || (tk == T_ID && lookup(tv) < 0)) { // int f(...) { }, T first<T>(...) { }, int g = 1; - rettype(); n = name(); - if (is_op(s_lp) || is_op(s_lt)) { - genparams(); - if (dtag && dtag != S_U) serr("the only return tag is .u"); - return fndone(fndef(chk, dty, dtag == S_U, n), 0); - } - if (ntp) { serrn(tpn[0], "isn't a type"); ntp = 0; } - return gdecl2(dty, dtag, n); - } - die("expected a declaration"); - return 0; -} -fn unit_top() { while (tk != T_EOF) topitem(); return 0; } -fn unit_end(from) -{ - let i = from; - panic = 0; - while (i < nsym) { - if (skind[i] == K_FN && !(sflag[i] & F_DEF) && sfix[i]) { tline = sval[i]; serrn(sname[i], "is used but never defined"); } - i++; - } - if (nerr) giveup(); - return 0; -} - -// compile a token list as the body of a new function, or (top) as top-level -// declarations. returns the entry address of the function. -unchecked fn compile_list(q, top) -{ - let hop = -1, entry = 0, from = nsym; - ctx_push(); - if (infn) { hop = hole(); op(O_JMP); } - if (top) prescan(1, q); - src_push(1, q, 0, 0); - next(); - if (top) unit_top(); - else { - entry = here; - fn_begin(1, 0); - prologue(); - while (tk != T_EOF) stmt(); - unused_check(lbase); - if (fchk && live) exit_vars(1, 1); - epilogue(); - } - src_pop(); - unit_end(from); - if (hop >= 0) setlit(hop, here); - if (here > ptop) ptop = here; - ctx_pop(); - return entry; -} -fn compile(q) { return compile_list(q, 0); } -fn load(q) { compile_list(q, 1); return 0; } -fn eval(q) { let f = compile_list(q, 0); return f(); } -fn evals(s) { let q = tokens(s), r = eval(q); free(d*q); return r; } - -// ---- symbol blob ---- -// an image ends with its own symbol table so the genome knows its names: -// kind, value, signature, name chars, 0 ... then a 0 kind. -fn blob_emit(from) -{ - let i = from, p; - while (i < nsym) { - if ((skind[i] >= K_FN && skind[i] <= K_CONST) || skind[i] == K_ENH) { - emit(skind[i]); emit(sval[i]); emit(ssig[i]); - p = sname[i]; - while (*p) { emit(*p); p++; } - emit(0); - } - i++; - } - emit(0); - return 0; -} -fn blob_load(p) -{ - let s, n; - while (*p) { - n = intern(p + 3); - s = addsym(n, p[0], p[1]); - ssig[s] = p[2]; - sflag[s] = F_DEF | F_SIG; - if (p[0] == K_ENH) { if (p[1] >= nenh) nenh = p[1] + 1; install(p[2] >> 8); } - p = p + 3 + strlen(p + 3) + 1; - } - return 0; -} -// compile the rest of stdin as a genome image that will run at org, writing -// it to dst. only the source's own names are visible while it compiles. -// returns the image length in words. -fn build_image(org, dst) -{ - let sh = here, sd = hdelta, sl = hlimit, sub = ubase, svl = vislo, sns = nsym, sen = nenh, n; - ubase = nsym; vislo = nsym; nenh = 0; - here = org; hdelta = dst - org; hlimit = org + 0x30000; - lit(FTOP); lit(ZFP); op(O_ST); fnref(fwdfn(s_start)); op(O_JMP); emit(0); emit(0); - unit_stdin(); - *(dst + 5) = here; - blob_emit(ubase); - *(dst + 6) = here; - n = here - org; - popsyms(sns); - ubase = sub; vislo = svl; here = sh; hdelta = sd; hlimit = sl; nenh = sen; - return n; -} - -// ---- setup ---- -fn gc_roots() -{ - markrange(0, ptop); - if (!hdelta && here > ptop) markrange(ptop, here); // globals of a unit still compiling - markrange(GORG, GORG[6]); - markrange(R_SRC, R_SRC + 1024); - markrange(*ZFP, FTOP); - markrange(DSLO, DSHI); - return 0; -} -fn zc_init() -{ - pooltop = R_POOL; - wfill(R_IH, 0, IHN); - nsym = 0; nfixu = 0; fixfree = 0; nbin = 0; nun = 0; nasg = 0; nkop = 0; seqtop = 0; - lsp = 0; ctxsp = 0; snaptop = 0; nloc = 0; lbase = 0; - s_lp = intern("("); s_rp = intern(")"); s_lb = intern("{"); s_rb = intern("}"); - s_lk = intern("["); s_rk = intern("]"); s_comma = intern(","); s_semi = intern(";"); - s_eq = intern("="); s_arrow = intern("->"); s_inc = intern("++"); s_dec = intern("--"); - s_star = intern("*"); s_amp = intern("&"); s_colon = intern(":"); s_hash = intern("#"); - s_minus = intern("-"); s_dot = intern("."); s_q = intern("?"); s_case = intern("case"); s_default = intern("default"); s_andand = intern("&&"); s_oror = intern("||"); - s_fn = intern("fn"); s_var = intern("let"); s_const = intern("const"); s_else = intern("else"); - s_as = intern("as"); s_unchecked = intern("unchecked"); s_immediate = intern("immediate"); - s_m = intern("m"); s_d = intern("d"); s_u = intern("u"); - s_start = intern("start"); s_main = intern("main"); s_free = intern("free"); - s_own = intern("own"); s_qnew = intern("qnew"); s_fovf = intern("frame_overflow"); - s_enhance = intern("enhance"); s_micro = intern("micro"); s_vm = intern("vm"); - return 0; -} -// operators and keywords. these are plain tables in memory: a program can -// add operators, change precedences or replace keywords with its own. -fn zc_tables() -{ - add_unop("!", "0 $ 0 ~ - | 31 > 1 +"); // index 0 - add_unop("!!", "0 $ 0 ~ - | 31 > 0 ~ -"); // index 1: normalize to 0 or 1 - add_unop("~", "-1 ^"); // index 2 - add_unop("-", "0 ~ -"); - add_binop("*", 10, "*"); // the first few indexes are used by cexpr - add_binop("/", 10, "idiv"); // native divide, wired in by rt.zc - add_binop("%", 10, "imod"); - add_binop("+", 9, "+"); // 3 - add_binop("-", 9, "-"); // 4 - add_binop("<<", 8, "ishl"); // 5 - add_binop(">>", 8, ">"); // 6 - add_binop("<", 7, "<"); - add_binop(">", 7, "~ <"); - add_binop("<=", 7, "~ < 1 ^"); - add_binop(">=", 7, "< 1 ^"); - add_binop("==", 6, "- 0 $ 0 ~ - | 31 > 1 +"); - add_binop("!=", 6, "- 0 $ 0 ~ - | 31 > 0 ~ -"); - add_binop("&", 5, "&"); // 13 - add_binop("^", 4, "^"); - add_binop("|", 3, "|"); // 15 - add_binop("&&", -1, 0); - add_binop("||", -2, 0); - addkop(s_eq); addkop(s_arrow); addkop(s_inc); addkop(s_dec); - add_kw("let", kw_var, F_STMT); - add_kw("if", kw_if, F_STMT); - add_kw("while", kw_while, F_STMT); - add_kw("for", kw_for, F_STMT); - add_kw("switch", kw_switch, F_STMT); - add_kw("break", kw_break, F_STMT); - add_kw("continue", kw_continue, F_STMT); - add_kw("return", kw_return, F_STMT); - add_kw("unchecked", kw_unchecked, F_STMT); - add_kw("asm", kw_asm, F_STMT | F_EXPR); - add_kw("quote", kw_quote, F_EXPR); - add_kw("sizeof", kw_sizeof, F_EXPR); - add_kw("typeof", kw_typeof, F_EXPR); - add_kw("o3", kw_o3, F_STMT); - add_kw("len", kw_len, F_EXPR); - add_kw("cap", kw_cap, F_EXPR); - add_kw("push", kw_push, F_EXPR); - add_kw("pop", kw_pop, F_EXPR); - add_kw("resize", kw_resize, F_EXPR); - return 0; -} -fn start() -{ - let s, f; - heap_init(); - zc_init(); - blob_load(GORG[5]); - zc_tables(); - types_init(); - here = 0; hdelta = 0; hlimit = HEAP_LO; ptop = 0; - ubase = nsym; vislo = 0; - unit_stdin(); - if (here > ptop) ptop = here; - s = lookup(s_main); - if (s >= 0 && skind[s] == K_FN && (sflag[s] & F_DEF)) { f = sval[s]; f(); } - halt(); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/src/rt.zc b/docs/history/17-o3-boundaries/code/src/rt.zc deleted file mode 100644 index 63409b3..0000000 --- a/docs/history/17-o3-boundaries/code/src/rt.zc +++ /dev/null @@ -1,291 +0,0 @@ -// ============================================================================ -// rt.zc: the runtime half of the genome. memory map, i/o, arithmetic helpers, -// the heap (size-class free lists) and the mark-sweep collector. -// ============================================================================ - -// ---- memory map (words) ---- -const MW = 0x100000; // 1m words of memory -const HEAP_LO = 0x40000; // heap: 0x40000 .. 0xA0000 -const HEAP_HI = 0xA0000; -const ZFP = 0xA0000; // frame pointer word, used by every prologue -const GORG = 0xC0000; // the genome (this code) lives here -const FBOT = 0xE0000; // frame stack: FBOT .. FTOP, grows down -const FTOP = 0xF0000; -const RS0 = 0xF0000; // return stack grows up from here -const MARK0 = 0xF8000; // mark stack for the collector -const MARKN = 0x4000; -const DSLO = 0xFC000; // data stack: DSLO .. MW-16, grows down -const DSHI = 0xFFFF0; -const MAGIC = 0x2B7E1516; - -// ---- virtual enhancements ---- -// install(desc) wires a custom opcode into the cpu (the % opcode). these three -// give the language native division and left shift (zdiv, zmod and zshl -// below are the same thing done in software). they come first, since the -// compiler resolves / % and << to them by name. -fn install(desc) { return asm { desc @ % }; } -enhance idiv(a, b) micro "a = sdiv a b"; -enhance imod(a, b) micro "a = srem a b"; -enhance ishl(a, b) micro "a = shl a b"; -// for o3: an o3 variable's address (fp + k), and a bounds check (1 if i isn't in 0..n-1) -enhance lfa(k) micro "r1 = ld 655360; k = add r1 k"; -enhance outside(i, n) micro "i = ltu i n; i = xor i 1"; - -// ---- i/o ---- -fn putc(ch) { asm { ch @ . } return 0; } -fn getc() { return asm { , }; } -fn eof() { return asm { ? }; } -fn halt() { asm { q } return 0; } -fn puts(s) { let i = 0; while (s[i]) { putc(s[i]); i++; } return 0; } -fn putn(n) -{ - let b[12], i = 0; - if (n < 0) { putc('-'); n = 0 - n; } - if (n < 0) { puts("2147483648"); return 0; } - while (1) { b[i++] = '0' + n % 10; n = n / 10; if (!n) break; } - while (i) putc(b[--i]); - return 0; -} -fn strlen(s) { let n = 0; while (s[n]) n++; return n; } -fn streq(a, b) { let i = 0; while (a[i] && a[i] == b[i]) i++; return a[i] == b[i]; } -fn wcopy(dst, src, n) { let i = 0; while (i < n) { dst[i] = src[i]; i++; } return 0; } -fn wfill(dst, v, n) { let i = 0; while (i < n) { dst[i] = v; i++; } return 0; } - -// ---- arithmetic the hardware doesn't have ---- -let pow2[32]; -let zrem; -fn zudiv(n, dv) -{ - let q = 0, r = 0, i = 30; - if (n < dv) { zrem = n; return 0; } - while (i >= 0) { - r = r + r + ((n >> i) & 1); - q = q + q; - if (r >= dv) { r = r - dv; q++; } - i--; - } - zrem = r; - return q; -} -fn zdiv(a, b) -{ - let s = 0, q; - if (b == 0) { zrem = a; return 0; } - if (a < 0) { a = 0 - a; s = 1; } - if (b < 0) { b = 0 - b; s = s ^ 1; } - q = zudiv(a, b); - if (s) return 0 - q; - return q; -} -fn zmod(a, b) { let neg = a < 0; if (b == 0) return a; zdiv(a, b); if (neg) return 0 - zrem; return zrem; } -fn zshl(a, b) { return a * pow2[b & 31]; } - -// ---- heap ---- -// a buddy allocator. the heap is cut into aligned power-of-two chunks, every -// block is a power of two words, and a freed block merges with its buddy -// (the other half of the block they were split from) whenever that one is -// free too, so freed space can be reused at any size. every block has a 6 -// word header before the pointer the program sees: -// p[-6] block size p[-5] size class p[-4] flags (0 free, 1 live, 3 marked) -// p[-3] p ^ MAGIC p[-2] owner (the container that owns it, or 0) -// p[-1] its type (a type record from new(T), 0 from new(n), -(n + 1) from o3's new_raw) -// free blocks sit on a doubly linked list per class, linked through p[0], p[1]. -const HDR = 6; -let hbump, freel[32], gc_runs, gc_freed, gc_auto = 1; - -// the size of the top-level chunk holding heap offset off -fn topsize(off) -{ - let h = HEAP_HI - HEAP_LO, base = 0, sz; - while (h) { - sz = 1; - while (sz + sz <= h) sz = sz + sz; - if (off < base + sz) return sz; - base = base + sz; h = h - sz; - } - return 0; -} -fn fpush(b, k) { b[2] = 0; b[6] = freel[k]; b[7] = 0; if (freel[k]) freel[k][7] = b; freel[k] = b; return 0; } -fn funlink(b, k) -{ - if (b[7]) b[7][6] = b[6]; else freel[k] = b[6]; - if (b[6]) b[6][7] = b[7]; - return 0; -} -fn mkblock(b, k) { b[0] = pow2[k]; b[1] = k; b[2] = 0; b[3] = 0; b[4] = 0; b[5] = 0; return b; } -fn heap_init() -{ - let i = 1, b = HEAP_LO, sz, k; - pow2[0] = 1; - while (i < 32) { pow2[i] = pow2[i - 1] + pow2[i - 1]; i++; } - hbump = HEAP_HI; - wfill(freel, 0, 32); - while (b < HEAP_HI) { - sz = topsize(b - HEAP_LO); k = 0; - while (pow2[k] < sz) k++; - fpush(mkblock(b, k), k); - b = b + sz; - } - return 0; -} -// a free block of class k, split down from a bigger one if needed; 0 if none -fn balloc(k) -{ - let j = k, b, h; - while (j < 32 && !freel[j]) j++; - if (j >= 32) return 0; - b = freel[j]; - funlink(b, j); - while (j > k) { j--; h = b + pow2[j]; fpush(mkblock(h, j), j); } - mkblock(b, k); - return b; -} -let fend; // end of the block bfree last made, for the sweep -// put block b back, merging it with its buddy as long as it can -fn bfree(b) -{ - let k = b[1], sz = pow2[k], off, bud; - while (1) { - off = b - HEAP_LO; - if (sz >= topsize(off)) break; - bud = HEAP_LO + (off ^ sz); - if (bud[2] != 0 || bud[1] != k || bud[0] != sz) break; - funlink(bud, k); - if (bud < b) { b[0] = 0; b[3] = 0; b = bud; } // the upper header is inside the merged block now - else { bud[0] = 0; bud[3] = 0; } - k++; sz = sz + sz; - mkblock(b, k); - } - fpush(mkblock(b, k), k); - fend = b + sz; - return 0; -} -fn isobj(x) { return x >= HEAP_LO + HDR && x < hbump && x[-3] == (x ^ MAGIC) && (x[-4] & 1); } - -// every prologue checks the frame stack; on overflow it resets the frame -// pointer (so this can run at all) and stops -fn frame_overflow() { puts("zy: frame stack overflow\n"); halt(); return 0; } -fn oom() { puts("zc: out of heap memory\n"); halt(); return 0; } -// n words, untyped and not zeroed: what new gives o3 code. the type word -// keeps -(n + 1), so fatten (in the compiler) can type it later -unchecked .u new_raw(n) -{ - let need = n + HDR, k = 3, b, p; - if (n < 0) need = HDR; - while (pow2[k] < need) k++; - b = balloc(k); - if (!b && gc_auto) { gc(); b = balloc(k); } - if (!b) oom(); - p = b + HDR; - b[2] = 1; b[3] = p ^ MAGIC; b[4] = 0; b[5] = 0 - n - 1; - return p; -} -// n words typed t, zeroed -unchecked .u new_t(n, t) -{ - let p = new_raw(n); - p[-1] = t; - wfill(p, 0, p[-6] - HDR); - return p; -} -unchecked .u new(n) { return new_t(n, 0); } -fn osize(p) { if (!isobj(p)) return 0; return p[-6] - HDR; } -fn typeof_obj(p) { if (!isobj(p) || p[-1] < 0) return 0; return p[-1]; } - -// frees p and, recursively, every object p owns -fn release(p) -{ - let b = p - HDR, n = b[0] - HDR, i = 0, w; - b[2] = 2; // going: not live, and not free yet either, so a child's buddy check can't merge into it - while (i < n) { w = p[i]; if (isobj(w) && w[-2] == p) release(w); i++; } - bfree(b); - return 0; -} -unchecked fn free(.d p) { if (isobj(p)) release(p); return 0; } -fn own(c, p) { if (isobj(c)) c[-2] = p; return c; } - -// ---- growable arrays ---- -// a []T is a handle: [len, cap, items, element size]. items is an object the -// handle owns; growing swaps it for a bigger one and moves its children over. -unchecked .u dnew(es, n, t) -{ - let h = new_t(4, t), c = n, it; - if (c < 4) c = 4; - it = new(c * es); - h[0] = n; h[1] = c; h[2] = own(it, h); h[3] = es; - return h; -} -unchecked fn dgrow(h, need) -{ - let c = h[1], it, old = h[2], i = 0, w, n; - if (need <= c) return 0; - while (c < need) c = c + c; - it = new(c * h[3]); - n = h[0] * h[3]; - wcopy(it, old, n); - while (i < n) { w = it[i]; if (isobj(w) && w[-2] == old) w[-2] = it; i++; } // the children move with the elements - h[2] = own(it, h); h[1] = c; - free(old); - return 0; -} -fn oob(i, n) { puts("zy: index "); putn(i); puts(" out of range (length "); putn(n); puts(")\n"); halt(); return 0; } -unchecked fn dat(h, i) { if (i < 0 || i >= h[0]) oob(i, h[0]); return h[2] + i * h[3]; } -unchecked fn dpush(h, .d x) { dgrow(h, h[0] + 1); h[2][h[0]] = x; own(x, h[2]); h[0] = h[0] + 1; return 0; } -unchecked fn dpop(h) { if (!h[0]) oob(-1, 0); h[0] = h[0] - 1; return h[2][h[0]]; } -unchecked fn dresize(h, n) -{ - let old = h[0] * h[3]; - if (n < 0) n = 0; - dgrow(h, n); - if (n * h[3] > old) wfill(h[2] + old, 0, n * h[3] - old); - h[0] = n; - return 0; -} -fn dlen(h) { return h[0]; } -fn dcap(h) { return h[1]; } - -// ---- mark-sweep ---- -// conservative and non-moving. roots: the program area (globals live -// between functions), the genome's globals, the compiler's input stack, -// the live part of the frame stack and the whole data stack region. -let ms_top, ms_over, gc_lo, gc_hi; -fn mark(w) -{ - if (!isobj(w) || (w[-4] & 2)) return 0; - w[-4] = w[-4] | 2; - if (ms_top < MARKN) { MARK0[ms_top] = w; ms_top++; } else ms_over = 1; - return 0; -} -fn markrange(a, b) { while (a < b) { mark(*a); a++; } return 0; } -fn drain() -{ - let p; - while (ms_top) { ms_top--; p = MARK0[ms_top]; markrange(p, p + p[-6] - HDR); } - return 0; -} -fn gc_roots(); -unchecked fn gc() -{ - let b, sz, n = 0; - ms_top = 0; ms_over = 0; - gc_roots(); - drain(); - while (ms_over) { // the mark stack overflowed: rescan marked objects - ms_over = 0; - b = HEAP_LO; - while (b < HEAP_HI) { if (b[2] == 3) markrange(b + HDR, b + b[0]); b = b + b[0]; drain(); } - } - b = HEAP_LO; - while (b < HEAP_HI) { - sz = b[0]; - if (b[2] == 1) { bfree(b); n++; b = fend; } // merging may swallow what follows - else { if (b[2] == 3) b[2] = 1; b = b + sz; } - } - gc_runs++; - gc_freed = gc_freed + n; - return n; -} -// number of live objects, for tests -fn live_objects() { let b = HEAP_LO, n = 0; while (b < HEAP_HI) { if (b[2] & 1) n++; b = b + b[0]; } return n; } -// the biggest block that's free right now, in words -fn largest_free() { let k = 31; while (k > 0 && !freel[k]) k--; if (!freel[k]) return 0; return pow2[k]; } diff --git a/docs/history/17-o3-boundaries/code/test.sh b/docs/history/17-o3-boundaries/code/test.sh deleted file mode 100755 index 533042d..0000000 --- a/docs/history/17-o3-boundaries/code/test.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash -# full check: bootstraps the compiler from zc0, verifies the fixpoint, then runs -# the examples and tests on the portable interpreter (host), the arm64 jit under -# qemu, and the llvm backend. needs gcc; the jit half needs aarch64-linux-gnu-gcc -# and qemu-aarch64, the llvm half needs llvm-config and libLLVM (each is skipped -# if missing). -cd "$(dirname "$0")"; T=$(mktemp -d); trap 'rm -rf $T' EXIT -ok=0; bad=0 -chk(){ if [ "$1" = "$2" ]; then echo "ok $3"; ok=$((ok+1)); else echo "FAIL $3: got [$1]"; bad=$((bad+1)); fi; } -src(){ cat src/rt.zc src/compiler.zc; } -selfc(){ (cat tools/build.zc; printf '`'; src) | $1 > $2; } - -# bootstrap: zc0 (c) -> g0, g0 compiles compiler.zc -> g1, g1 compiles it -> g2 -gcc -O1 -w zc0.c -o $T/zc0 && gcc -O1 -w mkgenome.c -o $T/mkg || exit 1 -mkdir $T/s0 $T/s1 -cp core.c io_linux.c $T/s0/; cp core.c io_linux.c $T/s1/ -src | $T/zc0 > $T/s0/genome.h || exit 1 -gcc -O2 -w -DJTYPE=int $T/s0/core.c $T/s0/io_linux.c -o $T/zy0 -selfc $T/zy0 $T/g1.bin; $T/mkg < $T/g1.bin > $T/s1/genome.h -gcc -O2 -w -DJTYPE=int $T/s1/core.c $T/s1/io_linux.c -o $T/zy1 -selfc $T/zy1 $T/g2.bin -cmp -s $T/g1.bin $T/g2.bin && chk 1 1 "fixpoint: the compiler compiles itself to the same $(($(stat -c %s $T/g1.bin) / 4)) words" || chk 0 1 "fixpoint" -cmp -s $T/s1/genome.h genome.h && chk 1 1 "genome.h is up to date" || chk 0 1 "genome.h is stale (cp the bootstrap output over it)" - -run(){ # $1 = vm command, $2 = label - local vm="$1" l="$2" - chk "$($vm < examples/hello.zc)" "hello, world!" "$l hello" - chk "$($vm < examples/fact.zc | tr '\n' '/')" "1101110101111100000000/3628800/" "$l factorial" - chk "$( (cat examples/echo.zc; printf '`abc\n') | $vm)" "abc" "$l echo after the backtick" - chk "$($vm < examples/selfpatch.zc)" "ABC" "$l self-patching code" - chk "$($vm < examples/lists.zc | tr '\n' '/')" "[0 1 4 9 16 25]/live: 7/after the block: 0/" "$l ownership frees everything" - chk "$( (cat examples/repl.zc; printf '`fn sq(x) { return x * x; }`putn(sq(7)); putc(10);`puts("hi\\n");') | $vm | tr '\n' '/')" "49/hi/" "$l repl on the resident compiler" - chk "$($vm < examples/typed.zc | tr '\n' '/')" "last: 4/point is 2 words: x int, y int/vec<*point> is 3 words: len int, cap int, items **point/push is bool(*vec<T>, T.d)/the heap says v is a vec<T>, and v.items[0] is a point/" "$l typed example" - chk "$($vm < examples/wiring.zc)" "16 1234 25 4/9" "$l enhancement example" - chk "$($vm < tests/basics.zc | tr '\n' '/')" "285 610 42 512/hey 65 -3 -2 1024 -8/12456/757/9 100-101/5/ok/" "$l language basics" - chk "$($vm < tests/umd.zc)" "100 6 0 15 99 5 5" "$l u m d lifetimes" - chk "$($vm < tests/gc.zc)" "1000 1 900 1 199900" "$l mark-sweep collector" - chk "$($vm < tests/meta.zc | tr '\n' '/')" "1024 19/unless ok/rrr/15 42/7/42/7/144/" "$l parse words, quote, eval, load, operator tables" - chk "$($vm < tests/misc.zc | tr '\n' '/')" "45/54321/ok/" "$l compile-time eval, patched mnemonics, unchecked" - chk "$($vm < tests/types.zc | tr '\n' '/')" "12 5 2 15 56 42 7 14 3/rect *rect *list<int> *list<T>.u(int) T(*list<T>) fn(word.d)/a:point@0 b:point@2 tag:int@4 /point 1 1/" "$l types, generics, reflection" - chk "$($vm < tests/typeok.zc)" "14" "$l a program the typechecker accepts" - chk "$($vm < tests/typeoff.zc)" "6" "$l the typechecker is off by default" - chk "$($vm < tests/enhance.zc)" "100 0 343 3,2 5 -2 0" "$l virtual enhancements" - chk "$($vm < tests/joins.zc)" "0 0 5 80 8 3 9 0" "$l joins free what one path gave away; switch, ?:, no prototypes" - chk "$($vm < tests/buddy.zc)" "131072 262144 1 0" "$l buddy allocator merges freed blocks" - chk "$($vm < tests/borrowmove.zc)" "6" "$l storing into a borrowed object moves it" - chk "$($vm < tests/manyerrors.zc | tr '\n' '/')" "zc: line 3: expected an expression/zc: line 4: x: m object is never used/zc: line 5: type error: initializer: expected *char, got int/zc: line 6: expected ;/zc: 4 errors/" "$l several errors in one run" - chk "$($vm < tests/overflow_return.zc 2>&1)" "zy: return stack overflow" "$l return stack overflow is caught" - chk "$($vm < tests/overflow_data.zc 2>&1)" "zy: data stack overflow" "$l data stack overflow is caught" - chk "$($vm < tests/overflow_frame.zc 2>&1)" "zy: frame stack overflow" "$l frame stack overflow is caught" - chk "$($vm < examples/mandel.zc 2>&1 | md5sum | cut -c1-32)" "f41aecbf2c844168050413cfa832db0e" "$l example: mandelbrot with a fixed-point enhancement" - chk "$($vm < examples/bf.zc 2>&1 | md5sum | cut -c1-32)" "223570983752b17f7ece32e93d5e19e4" "$l example: brainfuck compiled at runtime" - chk "$($vm < examples/dump.zc 2>&1 | md5sum | cut -c1-32)" "757774b00f6b3cd0bfbcba66448a8619" "$l example: struct printer through reflection" - chk "$($vm < examples/tree.zc 2>&1 | md5sum | cut -c1-32)" "b86a2e4e9e31acc294a4ddf86be863f2" "$l example: owning tree frees itself" - chk "$($vm < examples/lang.zc 2>&1 | md5sum | cut -c1-32)" "aa1a18c78b5200129c7c2b315f163d28" "$l example: pipe operator, unless, assert, times" - chk "$($vm < examples/staged.zc 2>&1 | md5sum | cut -c1-32)" "6f790a125c48b0cc7a897cee73ee5627" "$l example: staged code compiled while running" - chk "$($vm < examples/quine.zc 2>&1 | md5sum | cut -c1-32)" "c868ecb9dd7b05224a1bd8a4c32ae788" "$l example: quine" - chk "$($vm < examples/primes.zc 2>&1 | md5sum | cut -c1-32)" "814faffc70dad0ae520c0671c33e73d4" "$l example: o3 prime sieve" - chk "$($vm < examples/life.zc 2>&1 | md5sum | cut -c1-32)" "aefb036b6f9ad1dadfc3e6bb47a6885d" "$l example: game of life" - chk "$($vm < tests/arrays.zc | tr '\n' '/')" "100 128 9801 9801 99 3 4 12 19 8 19 28/0/" "$l growable and fixed arrays" - chk "$($vm < tests/o3.zc)" "3142 42 43 9 57 98781 520625 10192 -18782 1152" "$l o3 regions: loops, calls, recursion, switch, arrays, more vars than registers" - chk "$($vm < tests/o3scopes.zc)" "116" "$l o3 registers shared by scopes, cached fixed arrays" - chk "$($vm < tests/o3fat.zc)" "node node 3 box node [0]int" "$l o3 data gets fattened on the way out" - chk "$($vm < tests/o3_bounds.zc 2>&1)" "zy: index 7 out of range (length 5)" "$l o3 bounds check" - local r; r=$(tests/runerr.sh "$vm" tests/errors | tail -1) - chk "$r" "rejected: $(ls tests/errors/*.zc | wc -l) passed, 0 failed" "$l analyzer rejects every bad program" - r=$(tests/runerr.sh "$vm" tests/typeerrors | tail -1) - chk "$r" "rejected: $(ls tests/typeerrors/*.zc | wc -l) passed, 0 failed" "$l typechecker rejects every bad program" - r=$(tests/runerr.sh "$vm" tests/langerrors | tail -1) - chk "$r" "rejected: $(ls tests/langerrors/*.zc | wc -l) passed, 0 failed" "$l o3 and array misuse is rejected" -} -gcc -O2 -w -DJTYPE=int core.c io_linux.c -o $T/zy -run $T/zy "interp" -chk "$(ZYTRACE=1 $T/zy < tests/o3.zc 2>&1 | grep -c 'micro-ops$')" "8" "every o3 region lifts" -if command -v aarch64-linux-gnu-gcc >/dev/null && command -v qemu-aarch64 >/dev/null; then - aarch64-linux-gnu-gcc -O2 -w -DJTYPE=int -static core.c io_linux.c -o $T/zyj || exit 1 - printf '#!/bin/sh\nexec qemu-aarch64 %s "$@"\n' $T/zyj > $T/jit; chmod +x $T/jit - run $T/jit "jit" - chk "$(ZYTRACE=1 $T/jit < tests/o3.zc 2>&1 | grep -c 'bytes of arm64')" "8" "jit compiles every o3 region to arm64" - selfc $T/jit $T/gj.bin; cmp -s $T/g1.bin $T/gj.bin && chk 1 1 "jit self-compile matches" || chk 0 1 "jit self-compile matches" -else echo "skip jit (no aarch64 toolchain or qemu)"; fi -if command -v llvm-config >/dev/null; then - gcc -O2 -w -DJTYPE=int -DZYLLVM $(llvm-config --cflags) core.c io_linux.c -o $T/zyl $(llvm-config --ldflags --libs) || exit 1 - run $T/zyl "llvm" - chk "$(ZYTRACE=1 $T/zyl < tests/o3.zc 2>&1 | grep -c 'compiled by llvm')" "8" "llvm compiles every o3 region" - printf '#!/bin/sh\nZYHOT=1 exec %s "$@"\n' $T/zyl > $T/llall; chmod +x $T/llall - chk "$($T/llall < tests/types.zc | md5sum)" "$($T/zy < tests/types.zc | md5sum)" "llvm compiling every block agrees" - selfc $T/zyl $T/gl.bin; cmp -s $T/g1.bin $T/gl.bin && chk 1 1 "llvm self-compile matches" || chk 0 1 "llvm self-compile matches" -else echo "skip llvm (no llvm-config)"; fi -echo "$ok passed, $bad failed"; [ $bad = 0 ] diff --git a/docs/history/17-o3-boundaries/code/tests/arrays.zc b/docs/history/17-o3-boundaries/code/tests/arrays.zc deleted file mode 100644 index f8d46d8..0000000 --- a/docs/history/17-o3-boundaries/code/tests/arrays.zc +++ /dev/null @@ -1,24 +0,0 @@ -// growable arrays and fixed ones -struct point { int x, y; }; -fn main() -{ - let before = live_objects(); - { - []int a = new([]int); - for (int i = 0; i < 100; i++) push(a, i * i); - putn(len(a)); putc(' '); putn(cap(a)); putc(' '); putn(a[99]); putc(' '); - putn(pop(a)); putc(' '); putn(len(a)); putc(' '); - resize(a, 3); putn(len(a)); putc(' '); putn(a[2]); putc(' '); - fixed []int f = new(fixed []int, 5); - f[4] = 7; putn(f[4] + len(f)); putc(' '); - []point ps = new([]point, 2); - ps[1].y = 9; resize(ps, 10); putn(ps[1].y + len(ps)); putc(' '); - [8]int st; putn(len(st)); putc(' '); - []*point owned = new([]*point); - for (int i = 0; i < 20; i++) { *point p = new(point); p.x = i; push(owned, d*p); } - putn(owned[19].x); putc(' '); - putn(live_objects() - before); putc(10); - } - putn(live_objects() - before); putc(10); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/tests/basics.zc b/docs/history/17-o3-boundaries/code/tests/basics.zc deleted file mode 100644 index c1f1faf..0000000 --- a/docs/history/17-o3-boundaries/code/tests/basics.zc +++ /dev/null @@ -1,22 +0,0 @@ -let table[10]; -let greeting = "hey"; -const N = 10, BIG = 0x100 * 2; -fn fib(n) { if (n < 2) return n; return fib(n - 1) + fib(n - 2); } -fn twice(f, x) { return f(f(x)); } -fn inc(x) { return x + 1; } -fn main() -{ - let i, s = 0, a[5]; - for (i = 0; i < N; i++) table[i] = i * i; - for (let j = 0; j < N; j++) s += table[j]; - putn(s); putc(' '); putn(fib(15)); putc(' '); putn(twice(inc, 40)); putc(' '); putn(BIG); putc(10); - puts(greeting); putc(' '); putn('A'); putc(' '); putn(-17 / 5); putc(' '); putn(-17 % 5); putc(' '); putn(1 << 10); putc(' '); putn(-64 >> 3); putc(10); - i = 0; while (1) { i++; if (i == 3) continue; if (i > 6) break; putn(i); } putc(10); - a[0] = 5; a[1] = a[0]++; a[2] = ++a[0]; putn(a[0]); putn(a[1]); putn(a[2]); putc(10); - let b = { let t = 3; t * t }; - putn(b); putc(' '); putn(3 > 2 && 2 > 1); putn(0 || 0); putn(!5); putn(~0); putn(5 != 5); putn(4 >= 4); putc(10); - let x = asm { 2 3 + }; - putn(x); putc(10); - asm { 'o' . 'k' . 10 . } - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/tests/bench.zc b/docs/history/17-o3-boundaries/code/tests/bench.zc deleted file mode 100644 index a7e53f5..0000000 --- a/docs/history/17-o3-boundaries/code/tests/bench.zc +++ /dev/null @@ -1,30 +0,0 @@ -// four kernels with and without o3; bench.sh runs each one on each backend -int csum(int lim) { int s = 0; for (int n = 1; n < lim; n++) { int x = n; while (x != 1) { if (x & 1) x = 3 * x + 1; else x = x / 2; s++; } } return s; } -o3 int csum3(int lim) { int s = 0; for (int n = 1; n < lim; n++) { int x = n; while (x != 1) { if (x & 1) x = 3 * x + 1; else x = x / 2; s++; } } return s; } -int sieve(fixed []int f) { int c = 0, n = len(f); for (int i = 0; i < n; i++) f[i] = 1; for (int i = 2; i < n; i++) if (f[i]) { c++; for (int j = i + i; j < n; j += i) f[j] = 0; } return c; } -o3 int sieve3(fixed []int f) { int c = 0, n = len(f); for (int i = 0; i < n; i++) f[i] = 1; for (int i = 2; i < n; i++) if (f[i]) { c++; for (int j = i + i; j < n; j += i) f[j] = 0; } return c; } -int digits(int n) { int s = 0; for (int i = 0; i < n; i++) { int x = i; while (x) { s = s + x % 10; x = x / 10; } } return s; } -o3 int digits3(int n) { int s = 0; for (int i = 0; i < n; i++) { int x = i; while (x) { s = s + x % 10; x = x / 10; } } return s; } -int fib(int n) { if (n < 2) return n; return fib(n - 1) + fib(n - 2); } -o3 int fib3(int n) { if (n < 2) return n; return fib3(n - 1) + fib3(n - 2); } -// input: a letter (the kernel; z runs none) and how many times to run it -fn main() -{ - fixed []int f = new(fixed []int, 50000); - let which = getc(), reps = 0, ch = getc(), r = 0; - while (ch >= '0' && ch <= '9') { reps = reps * 10 + ch - '0'; ch = getc(); } - while (reps > 0) { - if (which == 'a') r = csum(30000); - if (which == 'b') r = csum3(30000); - if (which == 'c') r = sieve(f); - if (which == 'd') r = sieve3(f); - if (which == 'e') r = digits(300000); - if (which == 'f') r = digits3(300000); - if (which == 'g') r = fib(22); - if (which == 'h') r = fib3(22); - reps--; - } - putn(r); putc(10); - free(d*f); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/tests/borrowmove.zc b/docs/history/17-o3-boundaries/code/tests/borrowmove.zc deleted file mode 100644 index 43f27b2..0000000 --- a/docs/history/17-o3-boundaries/code/tests/borrowmove.zc +++ /dev/null @@ -1,2 +0,0 @@ -fn put(.m box, int v) { *int c = new(int); *c = v; box[0] = c; return 0; } -fn main() { let b = new(1); put(b, 6); putn(*(b[0] as *int)); putc(10); return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/buddy.zc b/docs/history/17-o3-boundaries/code/tests/buddy.zc deleted file mode 100644 index 2000598..0000000 --- a/docs/history/17-o3-boundaries/code/tests/buddy.zc +++ /dev/null @@ -1,15 +0,0 @@ -// the buddy allocator: 20000 small blocks, freed, merge back into one big one -let keep[20000]; -fn main() -{ - let i = 0, p; - while (i < 20000) { keep[i] = new(2); i++; } // 20000 8-word blocks - putn(largest_free()); putc(' '); - i = 0; while (i < 20000) { free(keep[i]); i++; } - putn(largest_free()); putc(' '); - p = new(200000); // only possible if the small blocks merged back - putn(osize(p) >= 200000); putc(' '); - free(d*p); - putn(live_objects()); putc(10); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/tests/enhance.zc b/docs/history/17-o3-boundaries/code/tests/enhance.zc deleted file mode 100644 index 33eb85b..0000000 --- a/docs/history/17-o3-boundaries/code/tests/enhance.zc +++ /dev/null @@ -1,29 +0,0 @@ -// custom opcodes: recipes, lifted vm code, several outputs, and a fallback -enhance clampadd(a, b) micro "a = add a b; a = min a 100; a = max a 0"; -enhance cube(x) vm { 0 $ 0 $ * * }; -enhance 2 divmod(a, b) micro "r2 = sdiv a b" "\n r1 = srem a b\n r0 = r2"; -enhance div7(a) micro "a = sdiv a 7"; -enhance urem10(a) micro "a = urem a 10"; -enhance hi(a, b) micro "a = mulhu a b"; -enhance noisy(x) vm { 0 $ . } else soft_noisy; // i/o can't be lifted, so calls use the fallback -fn soft_noisy(x) { return x + 1; } -let qq, rr, seed = 7; -fn rnd() { seed = seed * 1103515245 + 12345; return seed ^ (seed >> 11); } -fn main() -{ - let i = 0, a, bad = 0; - putn(clampadd(70, 50)); putc(' '); putn(clampadd(-50, 2)); putc(' '); putn(cube(7)); putc(' '); - asm { 17 5 divmod rr ! qq ! } - putn(qq); putc(','); putn(rr); putc(' '); - putn(noisy(4)); putc(' '); - putn(hi(-1, -1)); putc(' '); - while (i < 5000) { - a = rnd(); - if (div7(a) != zdiv(a, 7)) bad++; - if (urem10(a) < 0 || urem10(a) > 9) bad++; - if (a / (i + 1) != zdiv(a, i + 1)) bad++; - i++; - } - putn(bad); putc(10); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/tests/errors/back_to_m.zc b/docs/history/17-o3-boundaries/code/tests/errors/back_to_m.zc deleted file mode 100644 index b8c160f..0000000 --- a/docs/history/17-o3-boundaries/code/tests/errors/back_to_m.zc +++ /dev/null @@ -1,2 +0,0 @@ -// expect: x: can't be recast back to m -fn main() { let x = new(3); d*x; m*x; return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/errors/borrow_escape.zc b/docs/history/17-o3-boundaries/code/tests/errors/borrow_escape.zc deleted file mode 100644 index ce24480..0000000 --- a/docs/history/17-o3-boundaries/code/tests/errors/borrow_escape.zc +++ /dev/null @@ -1,3 +0,0 @@ -// expect: p: is owned and can't be returned -fn f(.m p) { return p; } -fn main() { let x = new(1); f(x); return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/errors/branch_mismatch.zc b/docs/history/17-o3-boundaries/code/tests/errors/branch_mismatch.zc deleted file mode 100644 index bd19968..0000000 --- a/docs/history/17-o3-boundaries/code/tests/errors/branch_mismatch.zc +++ /dev/null @@ -1,3 +0,0 @@ -// expect: x: ends the branches of an if in different states -fn take(.d p) { return p[0]; } -fn main() { let x = new(1); if (x[0]) take(d*x); else u*x; return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/errors/child_dies.zc b/docs/history/17-o3-boundaries/code/tests/errors/child_dies.zc deleted file mode 100644 index 67caca9..0000000 --- a/docs/history/17-o3-boundaries/code/tests/errors/child_dies.zc +++ /dev/null @@ -1,3 +0,0 @@ -// expect: c: used after it was given away -fn take(.d p) { return p[0]; } -fn main() { let p = new(2), c = new(1); p[0] = c; take(d*p); return c[0]; } diff --git a/docs/history/17-o3-boundaries/code/tests/errors/child_recast.zc b/docs/history/17-o3-boundaries/code/tests/errors/child_recast.zc deleted file mode 100644 index c9ccd62..0000000 --- a/docs/history/17-o3-boundaries/code/tests/errors/child_recast.zc +++ /dev/null @@ -1,2 +0,0 @@ -// expect: c: belongs to a container; recast the container instead -fn main() { let p = new(2), c = new(1); p[0] = c; d*c; return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/errors/copy_owned.zc b/docs/history/17-o3-boundaries/code/tests/errors/copy_owned.zc deleted file mode 100644 index 862c7ef..0000000 --- a/docs/history/17-o3-boundaries/code/tests/errors/copy_owned.zc +++ /dev/null @@ -1,2 +0,0 @@ -// expect: x: is an owned object and can't be copied -fn main() { let x = new(1); let y = x; return y[0]; } diff --git a/docs/history/17-o3-boundaries/code/tests/errors/d_into_block.zc b/docs/history/17-o3-boundaries/code/tests/errors/d_into_block.zc deleted file mode 100644 index 2d7f526..0000000 --- a/docs/history/17-o3-boundaries/code/tests/errors/d_into_block.zc +++ /dev/null @@ -1,2 +0,0 @@ -// expect: x: used after it was given away -fn main() { let x = new(1); d*x; { x[0] = 5; } return x[0]; } diff --git a/docs/history/17-o3-boundaries/code/tests/errors/d_kept.zc b/docs/history/17-o3-boundaries/code/tests/errors/d_kept.zc deleted file mode 100644 index dcbfb86..0000000 --- a/docs/history/17-o3-boundaries/code/tests/errors/d_kept.zc +++ /dev/null @@ -1,2 +0,0 @@ -// expect: x: d object was never given away -fn main() { let x = new(3); d*x; x[0] = 1; return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/errors/discard_u.zc b/docs/history/17-o3-boundaries/code/tests/errors/discard_u.zc deleted file mode 100644 index 9293378..0000000 --- a/docs/history/17-o3-boundaries/code/tests/errors/discard_u.zc +++ /dev/null @@ -1,3 +0,0 @@ -// expect: can't be thrown away -.u mk() { let p = new(1); return u*p; } -fn main() { mk(); return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/errors/give_m.zc b/docs/history/17-o3-boundaries/code/tests/errors/give_m.zc deleted file mode 100644 index cd67896..0000000 --- a/docs/history/17-o3-boundaries/code/tests/errors/give_m.zc +++ /dev/null @@ -1,3 +0,0 @@ -// expect: x: is m; write d*x -fn take(.d p) { return p[0]; } -fn main() { let x = new(3); take(x); return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/errors/global_store.zc b/docs/history/17-o3-boundaries/code/tests/errors/global_store.zc deleted file mode 100644 index dc0e546..0000000 --- a/docs/history/17-o3-boundaries/code/tests/errors/global_store.zc +++ /dev/null @@ -1,3 +0,0 @@ -// expect: x: must be d to be stored in a global -let g; -fn main() { let x = new(1); g = x; return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/errors/leak_overwrite.zc b/docs/history/17-o3-boundaries/code/tests/errors/leak_overwrite.zc deleted file mode 100644 index d19b5fd..0000000 --- a/docs/history/17-o3-boundaries/code/tests/errors/leak_overwrite.zc +++ /dev/null @@ -1,2 +0,0 @@ -// expect: x: still owns an object -fn main() { let x = new(1); x = new(2); return x[0]; } diff --git a/docs/history/17-o3-boundaries/code/tests/errors/lend_d.zc b/docs/history/17-o3-boundaries/code/tests/errors/lend_d.zc deleted file mode 100644 index 55ac7e0..0000000 --- a/docs/history/17-o3-boundaries/code/tests/errors/lend_d.zc +++ /dev/null @@ -1,4 +0,0 @@ -// expect: x: is d; pass it to a d parameter -fn look(.m p) { return p[0]; } -fn take(.d p) { return p[0]; } -fn main() { let x = new(3); d*x; look(x); take(x); return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/errors/loop_move.zc b/docs/history/17-o3-boundaries/code/tests/errors/loop_move.zc deleted file mode 100644 index df3c94a..0000000 --- a/docs/history/17-o3-boundaries/code/tests/errors/loop_move.zc +++ /dev/null @@ -1,3 +0,0 @@ -// expect: x: is given away inside a loop that comes back around to it -fn take(.d p) { return p[0]; } -fn main() { let x = new(1); let i = 0; d*x; while (i < 3) { take(x); i++; } return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/errors/plain_return.zc b/docs/history/17-o3-boundaries/code/tests/errors/plain_return.zc deleted file mode 100644 index 45fb545..0000000 --- a/docs/history/17-o3-boundaries/code/tests/errors/plain_return.zc +++ /dev/null @@ -1,3 +0,0 @@ -// expect: returns a new object; give the function a .u return type -fn mk() { return new(1); } -fn main() { return mk(); } diff --git a/docs/history/17-o3-boundaries/code/tests/errors/return_m.zc b/docs/history/17-o3-boundaries/code/tests/errors/return_m.zc deleted file mode 100644 index b5ef519..0000000 --- a/docs/history/17-o3-boundaries/code/tests/errors/return_m.zc +++ /dev/null @@ -1,3 +0,0 @@ -// expect: x: has to be u to be returned -.u mk() { let x = new(1); return x; } -fn main() { let y = mk(); return y[0]; } diff --git a/docs/history/17-o3-boundaries/code/tests/errors/tag_mismatch.zc b/docs/history/17-o3-boundaries/code/tests/errors/tag_mismatch.zc deleted file mode 100644 index 079f249..0000000 --- a/docs/history/17-o3-boundaries/code/tests/errors/tag_mismatch.zc +++ /dev/null @@ -1,2 +0,0 @@ -// expect: c: its tag doesn't match its container's -fn main() { let p = new(2), c = new(1); u*p; p[0] = c; return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/errors/u_dropped.zc b/docs/history/17-o3-boundaries/code/tests/errors/u_dropped.zc deleted file mode 100644 index e1ca68a..0000000 --- a/docs/history/17-o3-boundaries/code/tests/errors/u_dropped.zc +++ /dev/null @@ -1,2 +0,0 @@ -// expect: x: u object must leave this block -fn main() { let x = new(3); u*x; return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/errors/u_skip_level.zc b/docs/history/17-o3-boundaries/code/tests/errors/u_skip_level.zc deleted file mode 100644 index 6caeeb3..0000000 --- a/docs/history/17-o3-boundaries/code/tests/errors/u_skip_level.zc +++ /dev/null @@ -1,2 +0,0 @@ -// expect: t: is u; it can only be handed to a variable of the enclosing block -fn main() { let r; { { let t = new(1); u*t; r = t; } } return r[0]; } diff --git a/docs/history/17-o3-boundaries/code/tests/errors/unchecked_touch.zc b/docs/history/17-o3-boundaries/code/tests/errors/unchecked_touch.zc deleted file mode 100644 index 141639d..0000000 --- a/docs/history/17-o3-boundaries/code/tests/errors/unchecked_touch.zc +++ /dev/null @@ -1,2 +0,0 @@ -// expect: x: is tracked by the analyzer and can't be used in unchecked code -fn main() { let x = new(1); unchecked { x[0] = 1; } return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/errors/unused.zc b/docs/history/17-o3-boundaries/code/tests/errors/unused.zc deleted file mode 100644 index 64aff1f..0000000 --- a/docs/history/17-o3-boundaries/code/tests/errors/unused.zc +++ /dev/null @@ -1,2 +0,0 @@ -// expect: x: m object is never used -fn main() { let x = new(3); return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/errors/use_after_give.zc b/docs/history/17-o3-boundaries/code/tests/errors/use_after_give.zc deleted file mode 100644 index 8a10922..0000000 --- a/docs/history/17-o3-boundaries/code/tests/errors/use_after_give.zc +++ /dev/null @@ -1,3 +0,0 @@ -// expect: x: used after it was given away -fn take(.d p) { return p[0]; } -fn main() { let x = new(3); take(d*x); return x[0]; } diff --git a/docs/history/17-o3-boundaries/code/tests/gc.zc b/docs/history/17-o3-boundaries/code/tests/gc.zc deleted file mode 100644 index 41f14a0..0000000 --- a/docs/history/17-o3-boundaries/code/tests/gc.zc +++ /dev/null @@ -1,20 +0,0 @@ -let keep; -unchecked fn churn(n) -{ - let i = 0, p; - while (i < n) { p = new(10); p[0] = i; if (i % 100 == 0) keep = p; i++; } - return 0; -} -fn main() -{ - let base = live_objects(), f; - churn(1000); - putn(live_objects() - base); putc(' '); - f = gc(); - putn(f >= 990); putc(' '); // conservative: a stale word or two may keep one alive - putn(keep[0]); putc(' '); // the one a global still points at survives - churn(200000); // 3.2m words through a 393k word heap: needs the automatic collector - putn(gc_runs > 1); putc(' '); - putn(keep[0]); putc(10); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/tests/joins.zc b/docs/history/17-o3-boundaries/code/tests/joins.zc deleted file mode 100644 index 913929b..0000000 --- a/docs/history/17-o3-boundaries/code/tests/joins.zc +++ /dev/null @@ -1,32 +0,0 @@ -// joins: something given away on one path is dead afterwards, and the paths -// that still own it free it on the way in. nothing here leaks. -fn take(.d p) { return p[0]; } -fn later(.d p); // not needed any more, but still allowed -*int.u mk(int v) { *int p = new(int); *p = v; return u*p; } -fn count(int n) { let s = 0; switch (n % 4) { case 0: s = 10; case 1, 2: s = 20; break; default: s = 30; } return s; } -fn main() -{ - let base = live_objects(), i = 0, hits = 0, k; - while (i < 50) { - let x = mk(i); - if (i % 3 == 0) take(d*x); // else: freed here by the fixup - i++; - } - putn(live_objects() - base); putc(' '); - // give away and break: fine now; the normal exit frees it - i = 0; - let y = mk(7); - while (i < 10) { if (i == 4) { take(d*y); break; } i++; } - putn(live_objects() - base); putc(' '); - let z = mk(5); - while (1) { if (z[0] == 5) { hits = take(d*z); break; } } - putn(hits); putc(' '); - putn(count(0) + count(1) + count(2) + count(3)); putc(' '); - k = i > 3 ? i * 2 : 0 - 1; - putn(k); putc(' '); - putn(forward(new(int))); putc(' '); // tagged and defined below: the prescan knows .d - **int pp; *int q = new(int); *q = 9; pp = &q; putn(**pp); free(d*q); putc(' '); - putn(live_objects() - base); putc(10); - return 0; -} -fn forward(*int.d p) { return 3 + *p; } diff --git a/docs/history/17-o3-boundaries/code/tests/langerrors/const_index.zc b/docs/history/17-o3-boundaries/code/tests/langerrors/const_index.zc deleted file mode 100644 index 03e927b..0000000 --- a/docs/history/17-o3-boundaries/code/tests/langerrors/const_index.zc +++ /dev/null @@ -1,2 +0,0 @@ -// expect: the index is out of range for this array -fn main() { [4]int a; a[4] = 1; return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/langerrors/fixed_nolen.zc b/docs/history/17-o3-boundaries/code/tests/langerrors/fixed_nolen.zc deleted file mode 100644 index b79c31e..0000000 --- a/docs/history/17-o3-boundaries/code/tests/langerrors/fixed_nolen.zc +++ /dev/null @@ -1,2 +0,0 @@ -// expect: a fixed array needs its length -fn main() { fixed []int f = new(fixed []int); free(d*f); return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/langerrors/fixed_push.zc b/docs/history/17-o3-boundaries/code/tests/langerrors/fixed_push.zc deleted file mode 100644 index a19bcb4..0000000 --- a/docs/history/17-o3-boundaries/code/tests/langerrors/fixed_push.zc +++ /dev/null @@ -1,2 +0,0 @@ -// expect: a fixed array can't grow or shrink -fn main() { fixed []int f = new(fixed []int, 3); push(f, 1); free(d*f); return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/langerrors/fixed_to_dyn.zc b/docs/history/17-o3-boundaries/code/tests/langerrors/fixed_to_dyn.zc deleted file mode 100644 index 483f62f..0000000 --- a/docs/history/17-o3-boundaries/code/tests/langerrors/fixed_to_dyn.zc +++ /dev/null @@ -1,4 +0,0 @@ -// expect: type error: argument: expected []int, got fixed []int -typecheck on; -int take([]int.m g) { return len(g); } -fn main() { fixed []int f = new(fixed []int, 3); take(f); free(d*f); return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/langerrors/gen_undeclared.zc b/docs/history/17-o3-boundaries/code/tests/langerrors/gen_undeclared.zc deleted file mode 100644 index 919fb51..0000000 --- a/docs/history/17-o3-boundaries/code/tests/langerrors/gen_undeclared.zc +++ /dev/null @@ -1,3 +0,0 @@ -// expect: T: isn't a type -T first(*int l) { return l[0]; } -fn main() { return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/langerrors/o3_addr.zc b/docs/history/17-o3-boundaries/code/tests/langerrors/o3_addr.zc deleted file mode 100644 index 815253d..0000000 --- a/docs/history/17-o3-boundaries/code/tests/langerrors/o3_addr.zc +++ /dev/null @@ -1,2 +0,0 @@ -// expect: an o3 variable has no address -fn main() { o3 int z = 2; *int q = &z; return *q; } diff --git a/docs/history/17-o3-boundaries/code/tests/langerrors/o3_asm.zc b/docs/history/17-o3-boundaries/code/tests/langerrors/o3_asm.zc deleted file mode 100644 index c8afb44..0000000 --- a/docs/history/17-o3-boundaries/code/tests/langerrors/o3_asm.zc +++ /dev/null @@ -1,2 +0,0 @@ -// expect: asm can't reach an o3 variable -fn main() { o3 int zz = 2; asm { zz @ _ } return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/langerrors/o3_let.zc b/docs/history/17-o3-boundaries/code/tests/langerrors/o3_let.zc deleted file mode 100644 index d2aff9a..0000000 --- a/docs/history/17-o3-boundaries/code/tests/langerrors/o3_let.zc +++ /dev/null @@ -1,2 +0,0 @@ -// expect: o3 variables need a type -fn main() { o3 { let x = 1; x++; } return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/langerrors/o3_param.zc b/docs/history/17-o3-boundaries/code/tests/langerrors/o3_param.zc deleted file mode 100644 index 5694720..0000000 --- a/docs/history/17-o3-boundaries/code/tests/langerrors/o3_param.zc +++ /dev/null @@ -1,3 +0,0 @@ -// expect: o3 parameters need a type -o3 int f(x) { return x; } -fn main() { return f(1); } diff --git a/docs/history/17-o3-boundaries/code/tests/manyerrors.zc b/docs/history/17-o3-boundaries/code/tests/manyerrors.zc deleted file mode 100644 index f4c0c68..0000000 --- a/docs/history/17-o3-boundaries/code/tests/manyerrors.zc +++ /dev/null @@ -1,6 +0,0 @@ -// several errors in one run: a syntax error, an analyzer error, a type error -typecheck on; -fn f() { let a = ; return 0; } -fn g() { let x = new(3); return 0; } -int h() { *char s = 5; return 1; } -fn main() { return 0 } diff --git a/docs/history/17-o3-boundaries/code/tests/meta.zc b/docs/history/17-o3-boundaries/code/tests/meta.zc deleted file mode 100644 index bc89454..0000000 --- a/docs/history/17-o3-boundaries/code/tests/meta.zc +++ /dev/null @@ -1,46 +0,0 @@ -fn ipow(a, b) { let r = 1; while (b > 0) { r *= a; b--; } return r; } -// a parse word that adds an operator to the compiler's tables -immediate fn pow_op() { next(); add_binop("**", 11, "ipow c"); return 0; } -pow_op - -// unless (cond) stmt: a parse word that emits code itself -immediate fn unless() -{ - let a; - next(); - expect(intern("(")); rval(); plainuse(expr()); rval(); expect(intern(")")); - emitseq(useq[0], ulen[0]); // not - a = hole(); op(O_JZ); // skip the body when the condition was true - substmt(); - setlit(a, here); - return 0; -} -// repeat N { body }: a macro, built from token lists -immediate fn repeat() -{ - let n, body, i = 0; - next(); n = tv; next(); - body = grab(); - while (i < n) { feed(qdup(body)); i++; } - free(d*body); - return 0; -} -fn main() -{ - putn(2 ** 10); putc(' '); putn(3 + 2 ** 3 * 2); putc(10); - unless (1 > 2) puts("unless ok\n"); - unless (2 > 1) puts("wrong\n"); - repeat 3 { putc('r'); } - putc(10); - let q = quote { putn(40 + 2); putc(10); return 7; }; - putn(q[0]); putc(' '); - putn(eval(q)); putc(10); - let f = compile(q); - putn(f()); putc(10); - free(d*q); - let defs = quote { fn sq(x) { return x * x; } }; - load(defs); - free(d*defs); - putn(evals("return sq(12);")); putc(10); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/tests/misc.zc b/docs/history/17-o3-boundaries/code/tests/misc.zc deleted file mode 100644 index 25fc53b..0000000 --- a/docs/history/17-o3-boundaries/code/tests/misc.zc +++ /dev/null @@ -1,30 +0,0 @@ -// ct { ... } runs a block while compiling and leaves its result as a constant -immediate fn ct() -{ - let q, v; - next(); - q = grab(); - v = eval(q); - free(d*q); - lit(v); - return 0; -} -// teach the asm syntax that p means out, like the old repl demo -immediate fn teach() { next(); mnem[12] = 'p'; return 0; } -teach - -fn countdown() -{ - asm { 5 :top 0 $ '0' + p 1 - 0 $ done z top j :done _ 10 p } - return 0; -} -fn main() -{ - putn(ct { let i = 0, s = 0; while (i < 10) { s += i; i++; } return s; }); putc(10); - countdown(); - puts(lazy()); putc(10); - return 0; -} -// the analyzer is off from here on -unchecked; -fn lazy() { let p = new(3); p[0] = 'o'; p[1] = 'k'; return p; } diff --git a/docs/history/17-o3-boundaries/code/tests/o3.zc b/docs/history/17-o3-boundaries/code/tests/o3.zc deleted file mode 100644 index 296d1d5..0000000 --- a/docs/history/17-o3-boundaries/code/tests/o3.zc +++ /dev/null @@ -1,83 +0,0 @@ -// o3 regions: every kind of control flow, against the same code without o3 -struct pt { int x; int y; }; -int g = 3; -int sq(int x) { return x * x; } -o3 int collatz(int n) -{ - int steps = 0; - while (n != 1) { if (n % 2 == 0) n = n / 2; else n = 3 * n + 1; steps++; } - return steps; -} -o3 int ack(int am, int n) -{ - if (am == 0) return n + 1; - if (n == 0) return ack(am - 1, 1); - return ack(am - 1, ack(am, n - 1)); -} -o3 int many(int a, int b, int c) -{ - int dd = a + b, e = b + c, f = c + a, h = dd * e, i2 = e * f, j = f * dd, k = h + i2 + j, l = k / 7; - for (int t = 0; t < 5; t++) { dd += t; e -= t; f = f ^ t; l = l + dd * e - f; } - return dd + e + f + h + i2 + j + k + l; -} -o3 int mix(int n) -{ - int acc = 0; - for (int i = 0; i < n; i++) { - if (i % 3 == 0 && i % 5 == 0) acc += 15; - else if (i % 3 == 0 || i > 90) acc += 3; - else acc = acc + (i & 1 ? sq(i) : g); - switch (i % 4) { case 0: acc += 1; case 1: acc -= 2; default: acc = acc ^ 1; } - if (acc > 100000) break; - if (i == 7) continue; - acc = acc + i / 10 - i % 7 + (i << 2) - (i >> 1); - } - return acc; -} -o3 int dyn(int n) -{ - []int a = new([]int, n); - fixed []int f = new(fixed []int, n); - int s = 0; - for (int i = 0; i < len(a); i++) { a[i] = i * i; f[i] = n - i; } - for (int i = 0; i < n; i++) s = s + a[i] * f[i]; - free(d*a); free(d*f); - return s; -} -o3 int pts(int n) -{ - *pt p = new(pt); - int s = 0; - p->x = 1; p->y = 2; - for (int i = 0; i < n; i++) { p->x = p->x + p->y; p->y = p->x - p->y; s = s + p->x % 1000; } - free(d*p); - return s; -} -o3 int divs(int x) -{ - int s = 0; - for (int i = -50; i < 50; i++) s = s + (x + i) / 7 + (x + i) % 7 + (x - i) / -3 + i / 16 + i % 16; - return s; -} -fn main() -{ - o3 int lone = 2; - let r = 0; - lone = lone * 21; - o3 { - int i = 0, s = 0; - while (i < 100) { s = s + collatz(i + 1); i++; } - putn(s); putc(' '); - putn(lone); putc(' '); - lone++; - } - putn(lone); putc(' '); - putn(ack(2, 3)); putc(' '); - putn(many(1, 2, 3)); putc(' '); - putn(mix(100)); putc(' '); - putn(dyn(50)); putc(' '); - putn(pts(30)); putc(' '); - putn(divs(1000)); putc(' '); - putn(divs(-77)); putc(10); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/tests/o3_bounds.zc b/docs/history/17-o3-boundaries/code/tests/o3_bounds.zc deleted file mode 100644 index fb347c0..0000000 --- a/docs/history/17-o3-boundaries/code/tests/o3_bounds.zc +++ /dev/null @@ -1,2 +0,0 @@ -// an index outside a []T inside o3 code: caught by the inline check -fn main() { []int a = new([]int, 5); o3 { int i = 7; a[i] = 1; } free(d*a); return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/o3fat.zc b/docs/history/17-o3-boundaries/code/tests/o3fat.zc deleted file mode 100644 index 313c87c..0000000 --- a/docs/history/17-o3-boundaries/code/tests/o3fat.zc +++ /dev/null @@ -1,22 +0,0 @@ -// o3 objects reaching normal code get their types: through a return (all the way down the list), an assignment, a store into a field -struct node { int v; *node next; }; -struct box { [3]*node slots; int n; }; -unchecked o3 *node build(int n) -{ - *node head = 0; - for (int i = 0; i < n; i++) { *node k = new(node); k.v = i; k.next = head; head = k; } - return head; -} -unchecked fn main() -{ - *node l = build(5); - tprint(typeof_obj(l)); putc(' '); tprint(typeof_obj(l.next.next.next)); putc(' '); - putn(l.next.v); putc(' '); - *box b = 0; - o3 { b = new(box); b.slots[1] = new(node); b.n = 2; } - tprint(typeof_obj(b)); putc(' '); tprint(typeof_obj(b.slots[1])); putc(' '); - *int raw = 0; - o3 { raw = new(int, 6); } - tprint(typeof_obj(raw)); putc(10); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/tests/o3scopes.zc b/docs/history/17-o3-boundaries/code/tests/o3scopes.zc deleted file mode 100644 index 9457c77..0000000 --- a/docs/history/17-o3-boundaries/code/tests/o3scopes.zc +++ /dev/null @@ -1,19 +0,0 @@ -// registers reused by scopes that never overlap, and a fixed array read through its cached items and length -o3 int scopes(fixed []int f) -{ - int total = 0; - for (int a = 0; a < 3; a++) { int x = a * 2; total += x; } - for (int b = 0; b < 3; b++) { int y = b * 3; total += y; } - for (int c = 0; c < 3; c++) { int z = c * 5; total += z; } - for (int e = 0; e < len(f); e++) { int w = f[e]; total += w; } - for (int g = 0; g < 4; g++) { int h = g + 1, q = h * h, r = q - 1; total += r; } - return total; -} -fn main() -{ - fixed []int f = new(fixed []int, 4); - for (int i = 0; i < 4; i++) f[i] = 10 * i; - putn(scopes(f)); putc(10); - free(d*f); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/tests/overflow_data.zc b/docs/history/17-o3-boundaries/code/tests/overflow_data.zc deleted file mode 100644 index 3042f0a..0000000 --- a/docs/history/17-o3-boundaries/code/tests/overflow_data.zc +++ /dev/null @@ -1 +0,0 @@ -fn main() { while (1) asm { 1 } return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/overflow_frame.zc b/docs/history/17-o3-boundaries/code/tests/overflow_frame.zc deleted file mode 100644 index 3897bf4..0000000 --- a/docs/history/17-o3-boundaries/code/tests/overflow_frame.zc +++ /dev/null @@ -1,2 +0,0 @@ -fn big(n) { let a[500]; a[0] = n; return big(n + 1) + a[0]; } -fn main() { return big(0); } diff --git a/docs/history/17-o3-boundaries/code/tests/overflow_return.zc b/docs/history/17-o3-boundaries/code/tests/overflow_return.zc deleted file mode 100644 index 9d5c622..0000000 --- a/docs/history/17-o3-boundaries/code/tests/overflow_return.zc +++ /dev/null @@ -1,2 +0,0 @@ -fn deep(n) { return deep(n + 1) + 1; } -fn main() { return deep(0); } diff --git a/docs/history/17-o3-boundaries/code/tests/runerr.sh b/docs/history/17-o3-boundaries/code/tests/runerr.sh deleted file mode 100755 index 23ea054..0000000 --- a/docs/history/17-o3-boundaries/code/tests/runerr.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -# runs every .zc in a folder (tests/errors by default) and checks the compiler -# rejects it with the message on its first line: // expect: ... -vm=${1:-zy}; dir=${2:-$(dirname "$0")/errors}; pass=0; fail=0 -for f in "$dir"/*.zc; do - want=$(head -1 "$f" | sed 's#^// expect: ##') - got=$($vm < "$f" 2>&1 | head -1) - if [[ "$got" == *"$want"* ]]; then pass=$((pass+1)); else fail=$((fail+1)); echo "FAIL $(basename $f): got [$got]"; fi -done -echo "rejected: $pass passed, $fail failed" diff --git a/docs/history/17-o3-boundaries/code/tests/typeerrors/arg.zc b/docs/history/17-o3-boundaries/code/tests/typeerrors/arg.zc deleted file mode 100644 index 909672a..0000000 --- a/docs/history/17-o3-boundaries/code/tests/typeerrors/arg.zc +++ /dev/null @@ -1,5 +0,0 @@ -// expect: type error: argument: expected *point, got *int -typecheck on; -struct point { int x, y; }; -int f(*point p) { return p.x; } -fn main() { *int q = new(int); f(q); free(d*q); return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/typeerrors/arith.zc b/docs/history/17-o3-boundaries/code/tests/typeerrors/arith.zc deleted file mode 100644 index 76e3111..0000000 --- a/docs/history/17-o3-boundaries/code/tests/typeerrors/arith.zc +++ /dev/null @@ -1,3 +0,0 @@ -// expect: type error: arithmetic needs numbers, got *int -typecheck on; -fn main() { *int p = 0; int x = p * 2; return x; } diff --git a/docs/history/17-o3-boundaries/code/tests/typeerrors/assign.zc b/docs/history/17-o3-boundaries/code/tests/typeerrors/assign.zc deleted file mode 100644 index 8b8a888..0000000 --- a/docs/history/17-o3-boundaries/code/tests/typeerrors/assign.zc +++ /dev/null @@ -1,3 +0,0 @@ -// expect: type error: initializer: expected *char, got int -typecheck on; -fn main() { *char s = 5; return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/typeerrors/call.zc b/docs/history/17-o3-boundaries/code/tests/typeerrors/call.zc deleted file mode 100644 index 7b03dbf..0000000 --- a/docs/history/17-o3-boundaries/code/tests/typeerrors/call.zc +++ /dev/null @@ -1,3 +0,0 @@ -// expect: type error: only functions can be called, got int -typecheck on; -fn main() { int k = 3; return k(1); } diff --git a/docs/history/17-o3-boundaries/code/tests/typeerrors/deref.zc b/docs/history/17-o3-boundaries/code/tests/typeerrors/deref.zc deleted file mode 100644 index ed030f5..0000000 --- a/docs/history/17-o3-boundaries/code/tests/typeerrors/deref.zc +++ /dev/null @@ -1,3 +0,0 @@ -// expect: type error: only pointers can be dereferenced, got int -typecheck on; -fn main() { int x = 3; return *x; } diff --git a/docs/history/17-o3-boundaries/code/tests/typeerrors/field.zc b/docs/history/17-o3-boundaries/code/tests/typeerrors/field.zc deleted file mode 100644 index ba03697..0000000 --- a/docs/history/17-o3-boundaries/code/tests/typeerrors/field.zc +++ /dev/null @@ -1,3 +0,0 @@ -// expect: point has no field z -struct point { int x, y; }; -fn main() { point p; return p.z; } diff --git a/docs/history/17-o3-boundaries/code/tests/typeerrors/generic.zc b/docs/history/17-o3-boundaries/code/tests/typeerrors/generic.zc deleted file mode 100644 index 49f2c10..0000000 --- a/docs/history/17-o3-boundaries/code/tests/typeerrors/generic.zc +++ /dev/null @@ -1,4 +0,0 @@ -// expect: type error: argument: expected int, got *char -typecheck on; -T same<T>(T a, T b) { return a; } -fn main() { return same(1, "x"); } diff --git a/docs/history/17-o3-boundaries/code/tests/typeerrors/notstruct.zc b/docs/history/17-o3-boundaries/code/tests/typeerrors/notstruct.zc deleted file mode 100644 index 0dff6bd..0000000 --- a/docs/history/17-o3-boundaries/code/tests/typeerrors/notstruct.zc +++ /dev/null @@ -1,2 +0,0 @@ -// expect: .x: that's a int, not a struct or a pointer to one -fn main() { int n = 1; return n.x; } diff --git a/docs/history/17-o3-boundaries/code/tests/typeerrors/ret.zc b/docs/history/17-o3-boundaries/code/tests/typeerrors/ret.zc deleted file mode 100644 index be951d5..0000000 --- a/docs/history/17-o3-boundaries/code/tests/typeerrors/ret.zc +++ /dev/null @@ -1,4 +0,0 @@ -// expect: type error: return value: expected bool, got *char -typecheck on; -bool f() { return "no"; } -fn main() { return f(); } diff --git a/docs/history/17-o3-boundaries/code/tests/typeerrors/voidret.zc b/docs/history/17-o3-boundaries/code/tests/typeerrors/voidret.zc deleted file mode 100644 index 86c9c17..0000000 --- a/docs/history/17-o3-boundaries/code/tests/typeerrors/voidret.zc +++ /dev/null @@ -1,4 +0,0 @@ -// expect: type error: return value: expected void, got int -typecheck on; -void f() { return 3; } -fn main() { f(); return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/typeoff.zc b/docs/history/17-o3-boundaries/code/tests/typeoff.zc deleted file mode 100644 index e44e450..0000000 --- a/docs/history/17-o3-boundaries/code/tests/typeoff.zc +++ /dev/null @@ -1,2 +0,0 @@ -// the typechecker is off unless asked for: this mismatch compiles and runs -fn main() { *char s = 5; putn(s as int + 1); putc(10); return 0; } diff --git a/docs/history/17-o3-boundaries/code/tests/typeok.zc b/docs/history/17-o3-boundaries/code/tests/typeok.zc deleted file mode 100644 index 93462bd..0000000 --- a/docs/history/17-o3-boundaries/code/tests/typeok.zc +++ /dev/null @@ -1,21 +0,0 @@ -// passes the typechecker: words mix with everything, literal 0 is null, -// arrays decay to pointers, generic calls bind their parameters -typecheck on; -struct pair<A, B> { A a; B b; }; -*pair<A, B>.u mk<A, B>(A x, B y) { *pair<A, B> p = new(pair<A, B>); p.a = x; p.b = y; return u*p; } -A left<A, B>(*pair<A, B> p) { return p.a; } -int strlen2(*char s) { int n = 0; while (s[n]) n++; return n; } -int main() { - *pair<int, *char> p = mk(3, "four"); - int a = left(p); - *char s = p.b; - [8]char buf; - *char q = buf; - *int nothing = 0; - let w = 5; - int mixed = w + 1; - q[0] = 'h'; q[1] = 0; - putn(a + strlen2(s) + strlen2(buf) + mixed); putc(10); - free(d*p); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/tests/types.zc b/docs/history/17-o3-boundaries/code/tests/types.zc deleted file mode 100644 index c988499..0000000 --- a/docs/history/17-o3-boundaries/code/tests/types.zc +++ /dev/null @@ -1,56 +0,0 @@ -struct point { int x, y; }; -struct rect { point a, b; int tag; }; -struct list<T> { int len; *T items; }; -struct node { int v; *node next; }; -type num = int; - -int counter = 5; -[4]int squares; -point origin; - -int area(*rect r) { return (r.b.x - r.a.x) * (r.b.y - r.a.y); } -*list<T>.u mklist<T>(int cap) { - *list<T> l = new(list<T>); - l.len = 0; - l.items = new(T, cap) as *T; - return u*l; -} -T first<T>(*list<T> l) { return l.items[0]; } -int sum(*node n) { int s = 0; while (n) { s += n.v; n = n.next; } return s; } - -fn main() -{ - rect r; - r.a.x = 1; r.a.y = 2; r.b.x = 4; r.b.y = 6; - putn(area(&r)); putc(' '); - putn(sizeof(rect)); putc(' '); putn(sizeof(point)); putc(' '); putn(sizeof([3]rect)); putc(' '); - let p = new(point); // let infers *point - p.x = 7; p->y = 8; - putn(p.x * p.y); putc(' '); - free(d*p); - *list<int> l = mklist<int>(4); - l.items[0] = 42; l.len = 1; - putn(first(l)); putc(' '); - free(d*l); - *node a = new(node), b = new(node); - a.v = 3; b.v = 4; a.next = b; - putn(sum(a)); putc(' '); - free(d*a); // b went with it: a.next = b made a its owner - [3]point pts; - pts[2].y = 9; - putn(pts[2].y + counter); putc(' '); - num k = 3; - putn(k); putc(10); - - // reflection - tprint(typeof(r)); putc(' '); tprint(typeof(&r)); putc(' '); tprint(typeof(l)); putc(' '); - tprint(sigof(mklist)); putc(' '); tprint(sigof(first)); putc(' '); tprint(sigofs("free")); putc(10); - let t = typeof(r), i = 0; - while (i < tnfields(t)) { puts(tfname(t, i)); putc(':'); tprint(tftype(t, i)); putc('@'); putn(tfoff(t, i)); putc(' '); i++; } - putc(10); - *point q = new(point); - tprint(typeof_obj(q)); putc(' '); putn(typeof_obj(q) == typeof(point)); putc(' '); putn(tkind(typeof_obj(q)) == TY_STRUCT); - free(d*q); - putc(10); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/tests/umd.zc b/docs/history/17-o3-boundaries/code/tests/umd.zc deleted file mode 100644 index 497c9fc..0000000 --- a/docs/history/17-o3-boundaries/code/tests/umd.zc +++ /dev/null @@ -1,51 +0,0 @@ -// lists as [len, items...], items owned by the list -.u mklist(n) { - let l = new(n + 1); - l[0] = 0; - return u*l; -} -fn push(.m l, .d item) { l[l[0] + 1] = d*item; l[0] = l[0] + 1; return 0; } -fn sum(.m l) { let s = 0, i = 1; while (i <= l[0]) { s += l[i][0]; i++; } return s; } -.u box(v) { let b = new(1); b[0] = v; return u*b; } -fn consume(.d b) { return b[0]; } - -fn main() -{ - let base = live_objects(); - { - let l = mklist(8); // u from mklist arrives m*here - let i = 0; - while (i < 5) { - let b = box(i * 10); // m in the loop body - d*b; // give it down - push(l, b); - i++; - } - putn(sum(l)); putc(' '); - putn(live_objects() - base); putc(' '); // list + 5 boxes - } - putn(live_objects() - base); putc(' '); // freed at the block's end, children too - - // u handed up one block by assignment, and as a block value - let outer; - { - let t = box(7); - u*t; - outer = t; - } - let v = { let w = box(8); u*w }; - putn(outer[0] + v[0]); putc(' '); - - // d given away to a callee - let g = box(99); - putn(consume(d*g)); putc(' '); - - // containers: child takes its parent's tag - let p = new(2), c = new(1); - c[0] = 5; - p[0] = c; - p[1] = new(3); - putn(p[0][0]); putc(' '); - putn(live_objects() - base); putc(10); - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/tools/build.zc b/docs/history/17-o3-boundaries/code/tools/build.zc deleted file mode 100644 index a38e97f..0000000 --- a/docs/history/17-o3-boundaries/code/tools/build.zc +++ /dev/null @@ -1,13 +0,0 @@ -// compiles the rest of stdin (after the backtick) as a genome image at GORG -// and writes it to stdout as little-endian 32-bit words. -const OUT = 0x10000; -fn main() -{ - let n = build_image(GORG, OUT), i = 0, w; - while (i < n) { - w = OUT[i]; - putc(w); putc(w >> 8); putc(w >> 16); putc(w >> 24); - i++; - } - return 0; -} diff --git a/docs/history/17-o3-boundaries/code/zc0.c b/docs/history/17-o3-boundaries/code/zc0.c deleted file mode 100644 index 7615cd7..0000000 --- a/docs/history/17-o3-boundaries/code/zc0.c +++ /dev/null @@ -1,461 +0,0 @@ -/* zc0: stage 0 of the bootstrap. a small c compiler for the subset of zc that - compiler.zc is written in. it reads zc source on stdin and writes a genome - header (vm words placed at GORG) on stdout, in the same image layout the - resident compiler's image mode produces. no lifetime analysis, no quote, no - parse words, no block expressions: those only exist in compiler.zc. tags - (m, d, -> u) and casts (as u, as d) are parsed and recorded in signatures - but not checked. */ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> - -#define GORG 0xC0000 -#define ZFP 0xA0000 /* frame pointer word */ -#define FTOP 0xF0000 /* frame stack grows down from here */ -#define MAXW 0x40000 - -enum { T_EOF, T_NUM, T_ID, T_STR, T_OP }; -enum { K_FN = 1, K_GVAR, K_GARR, K_CONST, K_KW, K_ENH }; -enum { O_Q, O_LD, O_ST, O_PICK, O_DROP, O_SWAP, O_CALL, O_JMP, O_JZ, O_RET, - O_IN, O_EMPTY, O_OUT, O_ADD, O_SUB, O_MUL, O_AND, O_OR, O_XOR, O_SHR, O_LT }; -static const char *mn = "q@!$_~cjzr,?.+-*&|^><%"; - -static char *src; static int pos, line = 1; -static int tk, tv, glue; static char ts[4096]; /* current token */ - -static int img[MAXW], here = GORG; -static void emit(int w) { if (here - GORG >= MAXW) { fprintf(stderr, "image too big\n"); exit(1); } img[here++ - GORG] = w; } -static void lit(int v) { emit((int)((unsigned)v * 2 + 1)); } -static void op(int k) { emit(k * 2); } -static void setlit(int at, int v) { img[at - GORG] = (int)((unsigned)v * 2 + 1); } - -static void die(const char *m) { fprintf(stderr, "zc0: line %d: %s (at '%s')\n", line, m, ts); exit(1); } - -/* ---- lexer ---- */ -static const char *ops3[] = { "<<=", ">>=", 0 }; -static const char *ops2[] = { "==", "!=", "<=", ">=", "<<", ">>", "&&", "||", "++", "--", "+=", "-=", "*=", "/=", "%=", "&=", "|=", "^=", "->", 0 }; -static int esc(void) -{ - int c = src[pos++]; - if (c != '\\') return c; - c = src[pos++]; - switch (c) { case 'n': return 10; case 't': return 9; case 'r': return 13; case '0': return 0; case 'e': return 27; } - return c; -} -static void next(void) -{ - int ws = 0, i; - for (;;) { - while (src[pos] && isspace((unsigned char)src[pos])) { if (src[pos] == '\n') line++; pos++; ws = 1; } - if (src[pos] == '/' && src[pos + 1] == '/') { while (src[pos] && src[pos] != '\n') pos++; ws = 1; continue; } - if (src[pos] == '/' && src[pos + 1] == '*') { pos += 2; while (src[pos] && !(src[pos] == '*' && src[pos + 1] == '/')) { if (src[pos] == '\n') line++; pos++; } if (src[pos]) pos += 2; ws = 1; continue; } - break; - } - glue = !ws; - if (!src[pos] || src[pos] == '`') { tk = T_EOF; strcpy(ts, "<eof>"); return; } - if (isdigit((unsigned char)src[pos])) { - char *e; tv = (int)strtoul(src + pos, &e, 0); memcpy(ts, src + pos, e - src - pos); ts[e - src - pos] = 0; pos = e - src; tk = T_NUM; return; - } - if (isalpha((unsigned char)src[pos]) || src[pos] == '_') { - i = 0; while (isalnum((unsigned char)src[pos]) || src[pos] == '_') ts[i++] = src[pos++]; - ts[i] = 0; tk = T_ID; return; - } - if (src[pos] == '\'') { pos++; tv = esc(); if (src[pos++] != '\'') die("bad char literal"); tk = T_NUM; strcpy(ts, "'c'"); return; } - if (src[pos] == '"') { pos++; i = 0; while (src[pos] && src[pos] != '"') ts[i++] = (char)esc(); ts[i] = 0; pos++; tk = T_STR; return; } - tk = T_OP; - for (i = 0; ops3[i]; i++) if (!strncmp(src + pos, ops3[i], 3)) { strcpy(ts, ops3[i]); pos += 3; return; } - for (i = 0; ops2[i]; i++) if (!strncmp(src + pos, ops2[i], 2)) { strcpy(ts, ops2[i]); pos += 2; return; } - ts[0] = src[pos++]; ts[1] = 0; -} -static int is(const char *s) { return (tk == T_OP || tk == T_ID) && !strcmp(ts, s); } -static int accept(const char *s) { if (is(s)) { next(); return 1; } return 0; } -static void expect(const char *s) { if (!accept(s)) { char b[64]; sprintf(b, "expected '%s'", s); die(b); } } -static char *ident(void) { static char b[8][256]; static int k; char *r = b[k++ & 7]; if (tk != T_ID) die("expected a name"); strcpy(r, ts); next(); return r; } - -/* ---- symbols ---- */ -typedef struct { char name[64]; int kind, val, sig, defd; } Sym; -static Sym sy[4096]; static int nsy; -typedef struct { int at, sym; } Fix; -static Fix fx[65536]; static int nfx; -static Sym *find(const char *n) { int i; for (i = nsy; i--;) if (!strcmp(sy[i].name, n)) return &sy[i]; return 0; } -static Sym *add(const char *n, int kind, int val) -{ - Sym *s = find(n); - if (s && s->kind == K_FN && kind == K_FN && !s->defd) { s->val = val; return s; } /* prototype or forward use */ - s = &sy[nsy++]; strncpy(s->name, n, 63); s->kind = kind; s->val = val; s->defd = 1; s->sig = 0; return s; -} -static void fnref(const char *n) /* push a function address, fixing it up later if needed */ -{ - Sym *s = find(n); - if (!s) { s = add(n, K_FN, 0); s->defd = 0; } - if (s->kind != K_FN) die("not a function"); - if (s->defd) { lit(s->val); return; } - fx[nfx].at = here; fx[nfx++].sym = (int)(s - sy); lit(0); -} - -/* ---- locals ---- */ -typedef struct { char name[64]; int slot, arr; } Loc; -static Loc lo[1024]; static int nlo, nslot, infn; -static Loc *findl(const char *n) { int i; for (i = nlo; i--;) if (!strcmp(lo[i].name, n)) return &lo[i]; return 0; } -static void laddr(int k) { lit(ZFP); op(O_LD); if (k) { lit(k); op(O_ADD); } } - -/* ---- operator tables ---- */ -static void seq_isz(void) { lit(0); op(O_PICK); lit(0); op(O_SWAP); op(O_SUB); op(O_OR); lit(31); op(O_SHR); lit(1); op(O_ADD); } -static void seq_nz(void) { lit(0); op(O_PICK); lit(0); op(O_SWAP); op(O_SUB); op(O_OR); lit(31); op(O_SHR); lit(0); op(O_SWAP); op(O_SUB); } -static int binprec(void) -{ - static const char *n[] = { "*", "/", "%", "+", "-", "<<", ">>", "<", ">", "<=", ">=", "==", "!=", "&", "^", "|", "&&", "||", 0 }; - static int p[] = { 10, 10, 10, 9, 9, 8, 8, 7, 7, 7, 7, 6, 6, 5, 4, 3, 2, 1 }; - int i; - if (tk != T_OP) return 0; - for (i = 0; n[i]; i++) if (!strcmp(ts, n[i])) return p[i]; - return 0; -} -static void binop(const char *o) -{ - if (!strcmp(o, "*")) op(O_MUL); - else if (!strcmp(o, "/")) { fnref("zdiv"); op(O_CALL); } - else if (!strcmp(o, "%")) { fnref("zmod"); op(O_CALL); } - else if (!strcmp(o, "+")) op(O_ADD); - else if (!strcmp(o, "-")) op(O_SUB); - else if (!strcmp(o, "<<")) { fnref("zshl"); op(O_CALL); } - else if (!strcmp(o, ">>")) op(O_SHR); - else if (!strcmp(o, "<")) op(O_LT); - else if (!strcmp(o, ">")) { op(O_SWAP); op(O_LT); } - else if (!strcmp(o, "<=")) { op(O_SWAP); op(O_LT); lit(1); op(O_XOR); } - else if (!strcmp(o, ">=")) { op(O_LT); lit(1); op(O_XOR); } - else if (!strcmp(o, "==")) { op(O_SUB); seq_isz(); } - else if (!strcmp(o, "!=")) { op(O_SUB); seq_nz(); } - else if (!strcmp(o, "&")) op(O_AND); - else if (!strcmp(o, "^")) op(O_XOR); - else if (!strcmp(o, "|")) op(O_OR); - else die("bad operator"); -} - -/* ---- constant expressions (globals, array sizes, const) ---- */ -static int cexpr(void); -static int cprim(void) -{ - int v; Sym *s; - if (tk == T_NUM) { v = tv; next(); return v; } - if (accept("-")) return -cprim(); - if (accept("~")) return ~cprim(); - if (accept("(")) { v = cexpr(); expect(")"); return v; } - if (tk == T_ID && (s = find(ts)) && (s->kind == K_CONST || (s->kind != K_GVAR && s->defd))) { next(); return s->val; } - die("constant expected"); return 0; -} -static int cexpr(void) -{ - int v = cprim(); - for (;;) { - if (accept("+")) v += cprim(); else if (accept("-")) v -= cprim(); - else if (accept("*")) v *= cprim(); else if (accept("|")) v |= cprim(); - else if (accept("&")) v &= cprim(); else if (accept("<<")) v <<= cprim(); - else if (accept(">>")) v >>= cprim(); else return v; - } -} - -/* ---- expressions ---- */ -static int lv; /* the stack top is an address not yet loaded */ -static void rval(void) { if (lv) { op(O_LD); lv = 0; } } -static void expr(void); -static void strlit(void) /* inline string: jump over it, push its address */ -{ - int j = here, a, i, n = (int)strlen(ts); - lit(0); op(O_JMP); a = here; - for (i = 0; i < n; i++) emit((unsigned char)ts[i]); - emit(0); setlit(j, here); lit(a); next(); -} -static int args(void) { int n = 0; expect("("); if (!accept(")")) { do { expr(); rval(); n++; } while (accept(",")); expect(")"); } return n; } -static void asmblock(void); -static void primary(void) -{ - char *n; Loc *l; Sym *s; - lv = 0; - if (tk == T_NUM) { lit(tv); next(); return; } - if (tk == T_STR) { strlit(); return; } - if (accept("(")) { expr(); expect(")"); return; } - if (is("asm")) { next(); asmblock(); return; } - n = ident(); - if ((l = findl(n))) { laddr(l->slot); lv = !l->arr; return; } - s = find(n); - if (s && s->kind == K_CONST) { lit(s->val); return; } - if (s && s->kind == K_GVAR) { lit(s->val); lv = 1; return; } - if (s && s->kind == K_GARR) { lit(s->val); return; } - if (is("(")) { args(); fnref(n); op(O_CALL); return; } - fnref(n); -} -static void incdec(int post, int d) -{ - if (!lv) die("++/-- needs an lvalue"); - lv = 0; - if (post) { lit(0); op(O_PICK); op(O_LD); lit(0); op(O_PICK); lit(d); op(O_ADD); lit(2); op(O_PICK); op(O_ST); op(O_SWAP); op(O_DROP); } - else { lit(0); op(O_PICK); op(O_LD); lit(d); op(O_ADD); lit(0); op(O_PICK); lit(2); op(O_PICK); op(O_ST); op(O_SWAP); op(O_DROP); } -} -static void postfix(void) -{ - int n; - primary(); - for (;;) { - if (accept("[")) { rval(); expr(); rval(); expect("]"); op(O_ADD); lv = 1; } - else if (is("(")) { rval(); n = args(); lit(n); op(O_PICK); op(O_CALL); op(O_SWAP); op(O_DROP); } - else if (accept("++")) incdec(1, 1); - else if (accept("--")) incdec(1, -1); - else if (accept("as")) ident(); - else return; - } -} -static void unary(void) -{ - if (accept("-")) { unary(); rval(); lit(0); op(O_SWAP); op(O_SUB); } - else if (accept("!")) { unary(); rval(); seq_isz(); } - else if (accept("~")) { unary(); rval(); lit(-1); op(O_XOR); } - else if (accept("*")) { unary(); rval(); lv = 1; } - else if (accept("&")) { unary(); if (!lv) die("& needs an lvalue"); lv = 0; } - else if (accept("++")) { unary(); incdec(0, 1); } - else if (accept("--")) { unary(); incdec(0, -1); } - else if (tk == T_ID && (!strcmp(ts, "u") || !strcmp(ts, "m") || !strcmp(ts, "d"))) { next(); expect("*"); unary(); } /* u*x: a recast, no code */ - else postfix(); -} -static void bin(int minp) -{ - int p, a, b; char o[8]; - unary(); - while ((p = binprec()) && p >= minp) { - strcpy(o, ts); next(); rval(); - if (!strcmp(o, "&&")) { - a = here; lit(0); op(O_JZ); bin(p + 1); rval(); seq_nz(); - b = here; lit(0); op(O_JMP); setlit(a, here); lit(0); setlit(b, here); - } else if (!strcmp(o, "||")) { - a = here; lit(0); op(O_JZ); lit(1); b = here; lit(0); op(O_JMP); - setlit(a, here); bin(p + 1); rval(); seq_nz(); setlit(b, here); - } else { bin(p + 1); rval(); binop(o); } - lv = 0; - } -} -static void expr(void) -{ - char o[8]; - bin(1); - if (is("=")) { - if (!lv) die("assignment needs an lvalue"); - next(); expr(); rval(); - op(O_SWAP); lit(1); op(O_PICK); op(O_SWAP); op(O_ST); lv = 0; - } else if (tk == T_OP && strlen(ts) >= 2 && ts[strlen(ts) - 1] == '=' && strcmp(ts, "==") && strcmp(ts, "!=") && strcmp(ts, "<=") && strcmp(ts, ">=")) { - if (!lv) die("assignment needs an lvalue"); - strcpy(o, ts); o[strlen(o) - 1] = 0; next(); - lit(0); op(O_PICK); op(O_LD); lv = 0; expr(); rval(); binop(o); - op(O_SWAP); lit(1); op(O_PICK); op(O_SWAP); op(O_ST); lv = 0; - } -} - -/* ---- asm blocks: raw vm words ---- */ -static void asmblock(void) -{ - char ln[128][64], rn[256][64]; int la[128], nl = 0, ra[256], nr = 0, i, k; const char *c; - Loc *l; Sym *s; - expect("{"); - while (!accept("}")) { - if (tk == T_EOF) die("unterminated asm"); - if (tk == T_NUM) { lit(tv); next(); continue; } - if (tk == T_STR) { strlit(); continue; } - if (accept("#")) { if (tk != T_NUM) die("# needs a number"); emit(tv); next(); continue; } - if (is("-")) { next(); if (tk == T_NUM && glue) { lit(-tv); next(); } else op(O_SUB); continue; } - if (accept(":")) { strcpy(ln[nl], ident()); la[nl++] = here; continue; } - if (strlen(ts) == 1 && (c = strchr(mn, ts[0]))) { op((int)(c - mn)); next(); continue; } - if (tk != T_ID) die("bad asm token"); - if ((l = findl(ts))) { laddr(l->slot); next(); continue; } - if ((s = find(ts)) && s->kind != K_FN) { lit(s->val); next(); continue; } - if (s) { fnref(ts); next(); continue; } - strcpy(rn[nr], ts); ra[nr++] = here; lit(0); next(); /* a label of this block */ - } - for (i = 0; i < nr; i++) { - for (k = -1; ++k < nl && strcmp(ln[k], rn[i]);) ; - if (k == nl) die("unknown asm label"); - setlit(ra[i], la[k]); - } -} - -/* ---- statements ---- */ -static int brk[256][64], nbrk[256], cont[256], nloop; -static int epi[1024], nepi; -static void stmt(void); -static void block(void) -{ - int save = nlo; - expect("{"); - while (!accept("}")) { if (tk == T_EOF) die("missing }"); stmt(); } - nlo = save; -} -static void jmp_to(int t) { lit(t); op(O_JMP); } -static void loopbody(int contaddr) -{ - nbrk[nloop] = 0; cont[nloop++] = contaddr; - stmt(); - nloop--; -} -static void patchbreaks(void) { int i; for (i = 0; i < nbrk[nloop]; i++) setlit(brk[nloop][i], here); } -static void stmt(void) -{ - int a, b, c, d; - if (accept(";")) return; - if (is("{")) { block(); return; } - if (accept("let") || accept("var")) { - do { - Loc *l = &lo[nlo++]; strcpy(l->name, ident()); l->arr = 0; - if (accept("[")) { int n = cexpr(); expect("]"); nslot += n; l->slot = nslot - n; l->arr = 1; } - else l->slot = nslot++; - if (accept("=")) { expr(); rval(); laddr(l->slot); op(O_ST); } - } while (accept(",")); - expect(";"); return; - } - if (accept("unchecked")) { stmt(); return; } - if (accept("if")) { - expect("("); expr(); rval(); expect(")"); - a = here; lit(0); op(O_JZ); stmt(); - if (accept("else")) { b = here; lit(0); op(O_JMP); setlit(a, here); stmt(); setlit(b, here); } - else setlit(a, here); - return; - } - if (accept("while")) { - c = here; expect("("); expr(); rval(); expect(")"); - a = here; lit(0); op(O_JZ); - loopbody(c); jmp_to(c); setlit(a, here); patchbreaks(); return; - } - if (accept("for")) { - int save = nlo; - expect("("); - if (!is(";")) { if (is("let") || is("var")) { stmt(); goto cond; } expr(); rval(); op(O_DROP); } - expect(";"); - cond: c = here; - if (!is(";")) { expr(); rval(); } else lit(1); - expect(";"); - a = here; lit(0); op(O_JZ); b = here; lit(0); op(O_JMP); - d = here; - if (!is(")")) { expr(); rval(); op(O_DROP); } - expect(")"); jmp_to(c); - setlit(b, here); - loopbody(d); jmp_to(d); setlit(a, here); patchbreaks(); - nlo = save; return; - } - if (accept("break")) { if (!nloop) die("break outside a loop"); brk[nloop - 1][nbrk[nloop - 1]++] = here; lit(0); op(O_JMP); expect(";"); return; } - if (accept("continue")) { if (!nloop) die("continue outside a loop"); jmp_to(cont[nloop - 1]); expect(";"); return; } - if (accept("return")) { - if (!is(";")) { expr(); rval(); } else lit(0); - expect(";"); epi[nepi++] = here; lit(0); op(O_JMP); return; - } - if (is("asm")) { next(); asmblock(); return; } - expr(); rval(); op(O_DROP); expect(";"); -} - -/* ---- top level ---- */ -static void fndef(int ret) -{ - char *n = ident(); Sym *s; int np = 0, tags = 0, t, frame, i; - char pn[16][64]; - s = find(n); - if (!s || s->kind != K_FN) { s = add(n, K_FN, 0); s->defd = 0; } - expect("("); - if (!accept(")")) { - do { - t = 0; - if (accept(".")) { /* .m name, .d name */ - if (is("m")) t = 1; else if (is("d")) t = 2; else die("a parameter tag is .m or .d"); - next(); - } - if (np < 12) tags += t << (2 * np); - strcpy(pn[np++], ident()); - } while (accept(",")); - expect(")"); - } - s->sig = ret + 2 * np + 64 * tags; - if (accept(";")) return; /* prototype */ - if (s->defd) die("function defined twice"); - s->val = here; s->defd = 1; - nlo = 0; nslot = 0; nepi = 0; infn = 1; - for (i = 0; i < np; i++) { strcpy(lo[nlo].name, pn[i]); lo[nlo].arr = 0; lo[nlo++].slot = nslot++; } - /* prologue: fp -= frame, then pop the arguments into their slots */ - lit(ZFP); op(O_LD); frame = here; lit(0); op(O_SUB); lit(ZFP); op(O_ST); - for (i = np; i--;) { laddr(i); op(O_ST); } - block(); - lit(0); - for (i = 0; i < nepi; i++) setlit(epi[i], here); - lit(ZFP); op(O_LD); lit(nslot); op(O_ADD); lit(ZFP); op(O_ST); op(O_RET); - setlit(frame, nslot); - infn = 0; -} -/* enhance name(params) [-> n] micro "recipe"; or ... vm { asm }; - emits the install descriptor; the booted genome installs it */ -static int nenh; -static void enhdef(void) -{ - char *n, pn[8][64]; int np = 0, nout = 1, d, na, pay, len = 0, i, j; Sym *s; - if (tk == T_NUM) { nout = tv; next(); } /* enhance 2 name(...) */ - n = ident(); - expect("("); - if (!accept(")")) { do { if (np == 8) die("at most 8 inputs"); strcpy(pn[np++], ident()); } while (accept(",")); expect(")"); } - d = here; for (i = 0; i < 7; i++) emit(0); - na = here; for (i = 0; i < np; i++) emit(0); - for (i = 0; i < np; i++) { img[na + i - GORG] = here; for (j = 0; pn[i][j]; j++) emit((unsigned char)pn[i][j]); emit(0); } - if (accept("micro")) { pay = here; while (tk == T_STR) { for (j = 0; ts[j]; j++) emit((unsigned char)ts[j]); next(); } emit(0); } - else if (accept("vm")) { pay = here; asmblock(); op(O_RET); len = here - pay; img[d + 1 - GORG] = 1; } - else die("expected micro or vm"); - img[d - GORG] = nenh; img[d + 2 - GORG] = np; img[d + 3 - GORG] = nout; - img[d + 4 - GORG] = pay; img[d + 5 - GORG] = len; img[d + 6 - GORG] = na; - s = add(n, K_ENH, nenh++); s->sig = np + nout * 16 + d * 256; - expect(";"); -} -static void top(void) -{ - while (tk != T_EOF) { - if (accept("unchecked")) continue; - if (accept("fn")) { fndef(0); continue; } - if (accept(".")) { if (strcmp(ident(), "u")) die("the only return tag is .u"); fndef(1); continue; } /* .u name(...) */ - if (accept("const")) { do { char *n = ident(); expect("="); add(n, K_CONST, cexpr()); } while (accept(",")); expect(";"); continue; } - if (accept("enhance")) { enhdef(); continue; } - if (accept("let") || accept("var")) { - do { - char *n = ident(); - if (accept("[")) { int k = cexpr(), a = here; expect("]"); while (k--) emit(0); add(n, K_GARR, a); } - else { - int a = here; add(n, K_GVAR, a); emit(0); - if (accept("=")) { - if (tk == T_STR) { int i, l = (int)strlen(ts); img[a - GORG] = here; for (i = 0; i < l; i++) emit((unsigned char)ts[i]); emit(0); next(); } - else img[a - GORG] = cexpr(); - } - } - } while (accept(",")); - expect(";"); continue; - } - die("expected fn, var or const"); - } -} - -int main(void) -{ - static char buf[1 << 22]; int n = (int)fread(buf, 1, sizeof buf - 1, stdin), i, j; Sym *st; - buf[n] = 0; src = buf; next(); - /* image header: set the frame pointer, jump to start, then the symbol blob pointer and image end */ - lit(FTOP); lit(ZFP); op(O_ST); fnref("start"); op(O_JMP); emit(0); emit(0); - top(); - for (i = 0; i < nfx; i++) { - Sym *s = &sy[fx[i].sym]; - if (!s->defd) { fprintf(stderr, "zc0: undefined function %s\n", s->name); return 1; } - setlit(fx[i].at, s->val); - } - if (!(st = find("start")) || !st->defd) { fprintf(stderr, "zc0: no start\n"); return 1; } - /* symbol blob: kind, value, sig, name chars, 0 ... then a 0 kind */ - img[5] = here; - for (i = 0; i < nsy; i++) { - emit(sy[i].kind); emit(sy[i].val); emit(sy[i].sig); - for (j = 0; sy[i].name[j]; j++) emit((unsigned char)sy[i].name[j]); - emit(0); - } - emit(0); - img[6] = here; - printf("#define GORG %d\n#define GLEN %d\nstatic const int genome[] = {", GORG, here - GORG); - for (i = 0; i < here - GORG; i++) printf("%s%d", !i ? "\n" : i % 16 ? "," : ",\n", img[i]); - printf("\n};\n"); - return 0; -} diff --git a/docs/history/17-o3-boundaries/notes.md b/docs/history/17-o3-boundaries/notes.md deleted file mode 100644 index d2f27b4..0000000 --- a/docs/history/17-o3-boundaries/notes.md +++ /dev/null @@ -1,48 +0,0 @@ -# generics after the name, leaving o3, registers by scope, cached fixed arrays - -code/ next to this file is the tree at the end of this stage. - -## message 17 - -> generics should go after fn name and before parens -> we also need some machinery for converting values to/from o3. to is pretty easy, we just hand over the data, and o3 ignores the fat metadata. from is a bit harder, there needs to be a system to get type hints and fatten the metadata for the packed data -> variables just get the latest free register, it's fine for now -> add the fixed array once per region thing -> -> also if you have any tips on how to make the memory system better (aka avoiding gc and leaks/uaf as much as possible) do tell - -## working notes - -**generics after the name.** the reason they had moved in front last stage was that `T first<T>(...)` uses T before declaring it. the fix: while a top-level return type is read, an unknown name becomes a provisional type parameter (numbered by first use), and the `<...>` after the name renumbers them with subst. a provisional one that the list doesn't confirm, or a global whose type used one, is "T: isn't a type". the prescan learned that `NAME<...>(` is a function too: at depth 0 it skips a balanced `<...>` and checks for `(`, which also steps over `list<T>` in return types harmlessly. - -**registers by scope.** the compiler keeps a free list of the 7 registers per region. a declaration takes the one freed last, or the next unused one; block_close gives back the registers of its scope's o3 locals. so the descriptor became (slot, register) pairs, several slots can share a register, and the core spills a register to every slot it stands for (harmless, the dead ones are never read again) and loads it from the first. the bits live in ltag (8..10), next to the o3 flag (16) and the tag (low 4). - -**cached fixed arrays.** two hidden o3 locals per `fixed []T` variable (`#items`, `#len`, names a program can't write), created when the variable is declared in o3 code, or at the start of the region for parameters and for o3 variables from outside an o3 block. refreshed after every assignment to the array variable in o3 code and at region start. indexing compares against the len variable and adds to the items variable. careful with o3 function parameters: their caches can't be created in the parameter loop, since the prologue stores parameter i to slot i and a hidden local there would shift them; they're made after the `jmp lo`, inside the region. - -**fattening.** "packed data" here is o3's new_raw object: header, no type, no zeroing. the hint that survives is the size asked for, kept as -(n + 1) in the type word (typeof_obj reads that as 0). everything else comes from the compiler's static types at the boundary. the boundaries picked: stores of pointer-typed values anywhere but an o3 local, arguments to functions not known to be o3 (F_O3, also set by the prescan when `o3` comes before a function), returns from o3 code, push, container stores (after own), and the end of an o3 block for outer o3 variables. fatten is in compiler.zc, not rt.zc, because it walks type records with tnfields/tftype/tfoff. it stops at fat objects, so walks are cheap after the first, and dyn handles (always fat) are walked with a depth limit. - -zc0 bug found on the way: `fatin(a + tfoff(t, i), tftype(t, i), dl)` (calls nested in an argument list next to arithmetic) made zc0 report "undefined function dl". rewritten with temporaries rather than fixing zc0. also `d` is reserved in zc0 too (`d*x`), so a local named d is a parse error there. - -**numbers** after this stage (ms per run, start-up removed): - -``` -backend kernel plain ms o3 ms speedup -interp collatz 324.90 240.61 1.4x -interp sieve 47.08 21.71 2.2x -interp digits 160.89 100.82 1.6x -interp fib 3.48 4.09 0.8x -llvm collatz 47.03 3.34 14.1x -llvm sieve 10.77 0.28 38.9x -llvm digits 18.93 1.45 13.1x -llvm fib 0.87 1.01 0.9x -arm64 (qemu) collatz 323.89 13.04 24.8x -arm64 (qemu) sieve 56.84 1.74 32.6x -arm64 (qemu) digits 147.06 4.17 35.3x -arm64 (qemu) fib 5.19 5.71 0.9x -``` - -the sieve got about 2x on arm64 from the cache (3.85 -> 1.74 ms). fib is flat: each call exits and re-enters the region, and that costs what the body saves. the earlier "3.9x" for fib was noise; bench.sh now grows the run count until a timing difference is over a second. - -## memory tips (answered in chat, not built) - -arenas per block for m objects that provably don't escape; borrowed-from marks on derived pointers so aliases are checked; a quarantine for freed blocks plus a debug mode that checks the header on every deref; allocation sites in a debug header so leaks report where they came from; explicit shared ownership (a counted tag) instead of the collector for the cases that really need sharing; and making unchecked code the only way into the collector. |
