diff options
| author | Marshall Lochbaum <mwlochbaum@gmail.com> | 2021-09-27 21:21:29 -0400 |
|---|---|---|
| committer | Marshall Lochbaum <mwlochbaum@gmail.com> | 2021-09-27 21:21:29 -0400 |
| commit | 8480fd5393721e57ec3bc0171513f3239d193f6d (patch) | |
| tree | 4b4d62999dc49af946f19142e64bf4391de608ea | |
| parent | 747024f4151cca8013be6b13d2adc83849a55198 (diff) | |
Add support for ? predicates
| -rw-r--r-- | docs/bqn.js | 12 | ||||
| -rw-r--r-- | docs/implementation/vm.html | 6 | ||||
| -rw-r--r-- | implementation/vm.md | 8 | ||||
| -rw-r--r-- | src/c.bqn | 35 | ||||
| -rwxr-xr-x | src/pr.bqn | 2 | ||||
| -rw-r--r-- | test/cases/header.bqn | 14 |
6 files changed, 51 insertions, 26 deletions
diff --git a/docs/bqn.js b/docs/bqn.js index 9862a1f4..a4b9bae2 100644 --- a/docs/bqn.js +++ b/docs/bqn.js @@ -100,6 +100,7 @@ let genjs = (B, p, L) => { // Bytecode -> Javascript compiler case 22: { r+= "if(undefined==="+rV(rD-1)+")throw Error('Left argument required');"; break; } case 32:case 34: { r+= rP("getv("+ge(num())+","+num()+")"); break; } case 33: { r+= rP("{e:"+ge(num())+",p:"+num()+"}"); break; } + case 42: { let p=rG(); r+="if(1!=="+p+")break;"; break; } case 43: { let m=rG(); r+=rP("{match:1,v:"+m+"}"); break; } case 47: { let i=rG(), v=rG(); r+="try{set(1,"+i+","+v+");}catch(e){break;}"; break; } case 48: { let i=rG(), v=rG(); r+=rP("set(1,"+i+","+v +")"); break; } @@ -138,7 +139,7 @@ let run = (B,O,F,S,L,T,src,env) => { // Bytecode, Objects, Blocks, Bodies, Locat c="do {"+c+"} while (0);\n"; def = useenv ? "env" : ("new Array("+vid.length+").fill(null)"); } else { - if (imm || ind.length<2) throw "Internal error: malformed block info"; + if (imm !== +(ind.length<2)) throw "Internal error: malformed block info"; let cache=[]; // Avoid generating a shared case twice let l=0; vid=[]; let g = j => { @@ -156,7 +157,8 @@ let run = (B,O,F,S,L,T,src,env) => { // Bytecode, Objects, Blocks, Bodies, Locat + "if (w===undefined) {\n"+mon+"} else {\n"+dy+"}\n" + "};"; def = "new Array("+sp+").fill(null)"; - c = "const fn="+combine(cases)+repdf[type]+(type===0?"fn.inverse="+combine(cases.slice(2)):"")+"return fn;"; + if (imm) c = "const e1=[...e2];"+cases[0]; + else c = "const fn="+combine(cases)+repdf[type]+(type===0?"fn.inverse="+combine(cases.slice(2)):"")+"return fn;"; } let de2 = "let e2="+def+";" @@ -421,10 +423,10 @@ let glyph = x => { // Compiler runtime[42] = assertFn("Compiler"); let compgen_raw = run( - [1,1,7,34,0,1,33,0,3,33,0,4,33,0,5,12,3,48,6,0,58,0,0,0,87,17,33,0,6,48,6,34,0,3,32,0,4,34,0,5,32,0,6,0,21,0,93,17,0,94,0,95,0,96,0,97,0,98,0,99,0,20,0,60,0,50,11,2,17,0,43,0,33,26,0,59,17,0,100,0,58,0,25,16,0,0,0,88,17,0,61,33,0,7,48,0,25,16,0,45,0,0,26,0,102,17,0,20,16,0,42,0,21,26,0,101,17,0,62,0,0,0,87,17,0,21,0,105,17,0,21,0,104,0,24,0,59,17,17,0,21,0,103,17,0,106,11,15,0,44,0,13,26,0,11,0,51,0,22,27,0,21,21,16,33,0,8,33,0,9,12,2,48,6,32,0,9,0,49,0,0,26,0,27,0,63,21,0,53,0,42,0,44,0,22,26,26,27,16,33,0,10,33,0,11,33,0,12,33,0,13,33,0,14,33,0,15,33,0,16,33,0,17,33,0,18,33,0,19,33,0,20,33,0,21,33,0,22,33,0,23,33,0,24,12,15,48,6,0,34,0,53,0,1,27,0,12,0,9,0,15,0,52,0,63,27,21,0,34,0,52,0,64,27,21,33,0,25,48,6,32,0,13,0,34,16,33,0,26,48,6,0,65,0,1,0,53,0,22,27,16,0,0,32,0,19,17,33,0,27,48,6,32,0,19,0,34,16,0,0,0,66,17,33,0,28,48,6,0,13,0,11,0,64,21,0,42,0,30,26,0,107,21,0,53,0,21,27,33,0,29,48,6,1,2,33,0,30,48,6,1,3,32,0,8,26,33,0,31,48,6,0,110,0,30,0,52,34,0,4,0,53,0,37,27,27,16,32,0,31,16,33,0,32,48,6,32,0,20,0,34,16,33,0,33,48,0,0,0,64,17,33,0,34,48,6,0,64,0,68,0,69,0,59,0,59,0,70,0,59,0,63,11,2,0,71,0,63,0,65,0,72,11,2,0,30,16,0,8,16,11,10,0,41,34,0,9,26,0,23,0,13,21,0,53,0,42,0,44,0,20,26,26,27,16,0,21,16,0,42,0,21,26,0,67,17,33,0,35,48,6,0,2,0,49,0,6,26,20,33,0,36,48,6,32,0,36,0,52,0,13,0,50,0,25,27,27,33,0,37,48,6,32,0,36,0,52,0,13,0,50,0,25,27,0,0,0,64,21,27,33,0,38,48,6,0,18,0,30,0,10,21,0,42,0,21,26,0,30,0,21,21,0,64,21,33,0,39,48,6,1,4,33,0,40,48,6,1,5,33,0,41,48,6,1,6,33,0,42,48,6,1,7,33,0,43,48,7,34,0,1,0,11,16,0,44,1,8,26,34,0,4,17,0,21,16,7,32,1,30,32,1,29,0,52,0,108,27,0,109,0,19,11,3,26,0,40,20,33,0,2,48,6,32,0,1,0,53,0,33,27,0,53,0,17,0,57,0,18,0,30,0,13,21,0,50,34,0,2,27,27,27,0,18,0,19,21,33,0,3,48,6,32,0,1,0,31,16,33,0,4,48,6,0,19,0,31,34,0,1,0,33,32,0,4,17,21,0,6,0,64,21,0,42,0,1,26,0,64,21,0,42,0,33,26,34,0,4,21,34,0,3,0,19,21,7,34,0,2,33,0,3,33,0,4,12,2,48,6,0,89,0,14,32,0,1,17,33,0,5,48,6,0,90,0,14,32,0,1,17,33,0,6,48,0,9,0,52,0,26,0,52,0,63,0,63,11,2,27,27,16,0,30,16,33,0,7,48,6,0,91,0,14,32,0,1,17,33,0,8,48,0,30,16,33,0,9,48,6,32,0,7,32,0,9,0,24,0,59,17,32,0,5,0,30,16,11,3,0,21,16,33,0,10,48,0,31,16,33,0,11,48,6,32,0,10,0,33,32,0,11,17,33,0,10,49,6,34,0,7,0,0,0,68,17,34,0,9,0,24,0,64,17,0,64,0,21,32,1,6,0,14,32,0,1,17,17,0,30,16,0,30,0,52,32,0,5,0,49,0,0,26,16,0,21,0,63,17,0,53,0,33,0,50,0,27,0,53,0,1,27,27,27,27,16,11,3,0,21,16,0,33,34,0,11,17,33,0,12,48,6,0,19,0,34,0,59,21,0,14,0,63,21,0,57,1,9,27,33,0,13,48,6,0,30,0,52,32,0,12,0,31,32,0,10,17,0,44,0,63,26,0,21,0,64,21,32,0,13,0,13,0,53,0,21,27,21,0,23,0,13,21,16,27,0,46,0,30,26,20,0,23,32,0,1,0,13,16,21,33,0,14,48,6,34,0,10,32,0,14,16,33,0,15,48,6,34,0,12,34,0,14,16,33,0,16,48,6,32,0,16,0,10,32,0,15,17,33,0,17,48,0,49,0,13,26,0,64,17,33,0,18,48,6,32,0,18,0,11,34,0,16,17,0,9,32,0,8,0,10,32,0,6,17,17,0,47,0,10,26,0,57,1,10,27,16,6,0,92,0,14,32,0,1,17,0,9,32,0,18,17,33,0,19,48,6,34,0,6,0,9,32,0,15,17,0,27,16,0,10,32,0,19,17,0,30,16,33,0,20,48,6,32,0,20,34,0,19,0,53,0,33,27,0,2,0,87,0,1,0,92,17,21,0,1,32,0,1,0,53,0,33,27,21,16,33,0,21,48,6,32,0,8,0,9,33,0,15,50,0,26,16,0,9,32,0,8,17,33,0,22,48,0,12,33,0,18,50,6,34,0,17,0,9,34,0,8,17,0,49,0,13,26,16,0,11,0,64,0,53,0,21,27,0,51,0,2,0,52,0,49,0,0,26,27,27,0,18,21,34,0,22,0,27,16,0,12,34,0,15,17,33,0,23,48,17,0,42,0,1,26,0,64,17,0,42,0,39,26,32,0,1,17,33,0,24,48,6,32,0,18,0,30,16,33,0,25,48,6,32,0,18,0,27,0,64,17,0,30,16,0,23,0,52,0,13,27,32,0,25,17,33,0,26,48,6,32,0,25,34,0,5,0,53,0,33,27,0,2,0,1,21,32,0,26,17,0,1,33,0,26,50,6,34,0,1,0,33,32,0,25,17,32,1,31,16,33,0,27,48,6,32,1,21,32,1,25,32,0,27,17,0,26,16,0,12,32,1,20,0,34,16,0,14,32,0,27,17,17,33,0,28,48,6,32,1,28,0,14,32,0,27,17,33,0,29,48,6,32,1,23,0,34,0,51,0,42,0,1,26,0,22,0,18,21,27,32,1,20,17,32,1,25,32,0,27,17,0,11,34,0,28,17,0,10,32,0,29,17,33,0,30,48,0,11,0,52,0,27,27,16,33,0,31,48,6,32,1,22,0,47,0,0,26,16,0,0,0,59,17,0,14,32,0,27,17,33,0,32,48,6,32,1,23,0,34,16,0,14,32,0,27,17,33,0,33,48,6,32,0,32,0,12,32,0,30,17,0,18,0,30,0,10,21,0,26,0,30,0,19,21,0,64,21,0,11,0,30,21,32,0,31,17,0,47,0,10,26,0,57,1,11,27,16,6,32,0,27,0,30,32,0,31,17,0,42,0,1,26,32,1,22,0,34,16,17,0,42,0,3,0,50,0,5,27,26,32,1,7,17,0,2,32,0,29,0,30,32,0,31,17,0,8,16,17,33,0,34,48,6,32,1,22,0,34,16,0,0,32,1,7,17,0,16,32,0,27,17,0,9,32,0,30,17,0,2,32,1,7,17,0,1,33,0,27,50,6,32,0,30,0,26,16,0,12,32,0,33,17,0,47,0,10,26,0,57,1,12,27,16,6,32,0,33,0,10,0,52,0,27,27,16,0,13,33,0,31,50,6,34,0,33,0,30,32,0,31,17,0,19,0,0,0,8,0,53,0,2,27,21,0,63,0,16,32,0,34,17,0,2,0,68,17,17,33,0,35,48,0,11,0,63,17,33,0,36,48,6,32,0,36,0,8,16,0,21,0,63,17,0,33,32,0,31,0,49,0,0,26,16,17,0,9,32,0,30,17,33,0,37,48,0,12,32,0,30,17,33,0,38,48,6,32,0,30,0,2,32,0,27,17,0,21,0,52,0,63,27,0,30,32,0,37,0,21,0,63,17,0,26,0,53,0,10,27,16,0,11,32,0,32,0,21,0,63,17,17,21,0,51,32,1,41,27,32,0,26,17,33,0,39,48,6,34,0,34,0,30,32,0,36,17,0,14,0,52,0,68,27,0,53,0,9,27,0,0,0,19,21,32,0,38,0,11,0,52,0,26,27,16,0,42,0,30,26,32,0,32,17,17,33,0,40,48,6,32,0,37,0,12,32,0,31,17,0,49,0,0,26,16,0,2,32,0,32,0,12,32,0,38,17,17,33,0,41,48,0,11,0,52,0,49,0,6,26,0,27,20,27,16,33,0,42,48,6,32,0,29,0,30,32,0,42,17,0,11,32,0,35,0,30,34,0,36,17,0,14,0,64,17,17,33,0,43,48,6,32,0,31,33,0,44,48,0,9,34,0,37,17,0,10,32,0,42,17,33,0,31,49,6,32,0,29,0,30,32,0,31,17,0,8,16,0,42,0,30,26,33,0,35,50,0,30,0,52,0,11,0,52,0,63,27,27,16,0,14,0,64,17,33,0,45,48,6,32,0,43,0,21,0,63,17,0,33,32,0,41,17,0,11,0,52,32,0,42,27,0,10,0,13,0,52,32,0,29,27,21,16,0,9,32,0,32,0,12,34,0,38,17,17,0,47,0,10,26,0,57,1,13,27,16,6,34,0,42,0,11,32,0,29,17,0,30,16,32,0,27,0,53,0,33,27,0,12,32,1,22,0,34,16,21,0,11,32,0,45,21,0,53,0,19,0,47,0,10,26,20,0,57,1,14,27,27,16,6,34,0,43,0,8,16,0,2,0,52,0,49,0,0,26,27,16,0,21,0,63,17,0,42,0,1,26,0,64,17,0,33,33,0,41,50,6,32,1,8,0,33,32,0,27,17,0,39,34,0,41,17,0,39,0,68,0,21,34,0,45,17,17,0,34,0,54,0,21,0,52,32,0,4,27,27,16,33,0,46,48,6,34,0,18,0,27,16,0,49,0,0,26,16,0,33,34,0,23,0,30,16,0,21,34,0,20,17,17,0,21,34,0,29,0,12,32,0,31,17,0,30,16,0,33,0,52,0,32,27,34,0,35,17,17,33,0,47,48,6,34,0,39,34,0,21,34,0,24,11,3,0,21,34,0,46,17,33,0,48,48,6,32,0,48,0,44,0,35,26,16,33,0,49,48,0,42,0,44,0,30,0,52,0,49,0,6,26,0,27,0,59,21,0,12,0,19,21,27,26,26,33,0,48,50,6,32,0,48,0,34,0,52,0,64,27,0,54,34,0,3,27,16,33,0,48,49,6,32,1,23,32,1,25,32,0,27,17,0,10,32,0,30,17,0,8,16,33,0,50,48,6,34,0,44,0,10,32,0,50,17,0,42,0,30,26,33,0,26,50,6,34,0,30,0,26,0,53,0,12,27,16,0,10,32,0,50,17,0,42,0,30,26,33,0,25,50,6,32,0,27,0,33,0,52,34,0,47,27,0,54,32,0,48,0,44,0,13,26,16,33,0,51,48,0,27,32,1,34,17,0,49,0,0,26,16,0,0,34,0,49,17,0,21,16,0,24,0,52,0,13,27,34,0,4,17,27,16,0,30,34,0,50,0,10,32,0,31,17,17,33,0,27,49,6,32,1,13,0,34,0,53,0,1,27,0,2,32,1,25,21,32,0,27,17,0,1,33,0,27,50,6,32,1,26,0,14,32,0,27,17,0,42,0,21,26,0,13,0,21,21,0,64,17,0,30,16,0,24,0,64,17,0,24,0,59,17,33,0,52,48,0,44,0,64,26,16,0,49,0,13,26,16,33,0,53,48,6,32,0,27,0,33,32,0,53,0,1,32,0,52,17,17,0,0,0,52,32,0,53,27,0,42,0,37,26,32,1,16,0,34,16,0,0,0,69,0,65,11,2,17,21,0,10,32,1,14,0,53,32,1,25,27,21,16,0,26,0,53,0,10,27,16,0,12,34,0,53,17,0,42,0,30,26,34,0,52,17,33,0,54,48,6,32,1,26,0,13,32,0,27,17,0,33,0,52,34,0,54,27,0,54,0,44,0,64,26,27,16,0,42,1,15,26,33,0,27,50,6,34,0,51,0,23,0,68,17,0,47,0,0,26,16,0,22,32,1,34,17,32,1,25,32,0,27,17,0,10,32,1,28,0,14,32,0,27,17,17,33,0,55,48,6,0,63,0,21,32,1,35,17,0,33,32,0,27,0,5,32,1,34,17,17,0,30,0,52,34,0,55,27,0,54,34,0,40,27,16,33,0,56,48,6,32,0,27,0,15,0,52,0,0,0,52,0,69,27,27,0,0,0,65,21,0,2,0,65,0,53,0,22,27,32,1,25,0,19,21,21,32,1,19,0,34,16,17,0,0,33,0,27,50,6,32,0,27,0,14,0,2,0,58,21,0,0,0,11,21,32,1,33,17,0,1,33,0,27,50,6,34,0,27,34,0,56,34,0,48,32,0,26,32,0,25,11,5,7,1,16,33,0,3,48,6,32,1,30,32,1,29,0,52,0,116,27,0,117,32,1,8,0,53,0,33,27,0,118,11,4,26,33,0,4,48,6,32,1,20,0,47,0,25,0,53,0,0,27,26,16,0,21,0,119,0,47,0,1,26,16,0,0,32,1,22,0,34,16,17,17,0,44,32,0,1,0,53,0,14,27,26,16,33,0,5,33,0,6,33,0,7,33,0,8,33,0,9,12,5,48,6,32,1,22,0,34,16,0,11,32,0,1,17,0,10,32,0,5,17,0,8,16,0,10,32,1,28,0,14,32,0,1,17,17,32,0,2,32,0,3,32,0,1,0,53,0,30,27,0,50,34,0,4,27,27,16,6,32,0,1,0,14,0,63,17,33,0,10,48,0,10,32,0,5,17,33,0,11,48,0,10,32,0,6,17,33,0,12,48,6,32,0,11,0,10,32,0,7,17,0,8,16,33,0,13,48,6,32,0,11,0,27,16,0,12,32,0,7,17,32,0,2,32,0,3,0,120,27,16,6,32,0,12,0,10,32,0,7,17,0,9,32,0,12,0,26,0,64,17,17,32,0,2,32,0,3,0,121,27,16,6,32,0,1,0,30,32,0,12,17,0,11,0,52,0,27,27,0,10,0,14,0,52,0,63,27,21,16,0,8,16,32,0,2,0,30,34,0,12,21,32,0,3,0,122,27,16,6,32,0,5,0,27,16,0,12,32,0,7,17,0,10,32,0,10,17,0,26,0,10,34,0,5,0,26,16,0,9,32,0,8,17,21,0,9,0,27,21,0,64,17,0,12,32,0,9,0,10,34,0,8,17,17,34,0,2,34,0,3,0,123,27,16,6,32,0,13,0,9,0,52,0,8,32,1,38,0,51,0,12,27,32,1,21,0,34,16,0,13,32,0,1,17,0,11,32,0,6,17,21,0,15,0,26,21,27,16,33,0,14,48,0,9,0,52,0,49,0,0,26,32,1,36,0,1,0,19,21,0,8,21,0,16,0,73,21,27,16,33,0,15,48,6,32,1,20,0,34,16,0,0,0,64,17,0,1,34,0,1,17,0,2,32,0,15,17,0,30,32,0,6,0,8,16,17,0,42,0,33,26,0,58,0,25,16,0,21,0,74,0,64,11,2,17,0,21,0,59,17,17,33,0,16,48,6,32,0,16,0,49,0,0,0,52,0,58,0,53,0,2,27,27,0,2,0,15,0,52,0,63,27,21,26,0,63,17,0,30,34,0,16,0,15,0,63,17,0,26,0,53,0,12,27,16,17,33,0,17,48,6,34,0,7,0,27,16,0,30,34,0,13,0,27,0,53,0,12,27,16,33,0,18,48,17,0,42,0,33,26,0,64,0,59,11,2,17,0,2,33,0,17,50,6,34,0,10,0,30,34,0,11,17,33,0,19,48,6,34,0,14,0,26,0,53,0,12,27,0,30,20,0,51,0,1,0,52,34,0,6,0,26,16,32,1,38,16,0,53,0,33,27,27,0,19,0,2,0,11,21,0,1,0,52,0,27,27,21,0,1,0,1,21,27,34,0,15,17,0,30,32,0,19,17,33,0,20,48,6,32,0,19,0,8,16,0,2,32,0,17,17,0,26,16,0,30,32,0,19,17,0,42,0,1,26,34,0,20,17,33,0,21,48,0,7,16,0,4,0,58,17,33,0,22,48,6,0,64,0,75,11,2,0,33,34,0,9,0,30,34,0,18,17,17,0,2,34,0,17,17,0,30,34,0,19,17,0,30,0,52,32,0,21,0,11,0,63,17,27,0,54,0,2,27,32,0,22,17,0,30,0,52,34,0,21,0,12,0,63,17,27,0,54,0,42,0,3,26,27,34,0,22,17,7,34,0,2,33,0,3,33,0,4,33,0,5,33,0,6,33,0,7,12,5,48,6,34,0,4,0,13,16,33,0,8,48,6,1,17,33,0,9,48,6,1,18,33,0,10,48,6,32,0,1,0,13,16,0,11,0,63,17,0,40,0,128,17,6,32,1,16,32,1,25,32,0,1,17,0,2,32,0,3,0,2,0,68,17,0,1,0,59,17,17,33,0,11,48,0,49,0,0,26,16,33,0,12,48,0,31,16,33,0,13,48,6,0,59,0,14,32,0,3,17,0,33,32,0,13,17,33,0,14,48,6,32,0,1,0,33,32,0,13,17,33,0,15,48,0,30,0,52,0,63,0,53,0,11,27,27,0,42,0,1,26,0,64,21,0,17,0,57,34,0,9,27,0,30,0,52,0,63,0,53,0,12,27,27,21,32,0,11,0,33,32,0,13,17,17,6,34,0,12,0,34,32,0,13,0,34,16,17,0,15,0,63,17,0,40,0,129,17,6,32,0,15,0,30,32,0,14,17,0,14,0,52,32,1,26,27,0,9,0,52,0,27,27,0,14,0,52,32,1,16,0,34,16,27,21,16,32,0,13,0,30,32,0,14,21,32,0,10,0,130,27,16,6,34,0,14,0,21,0,64,17,0,9,0,52,0,26,0,52,0,64,27,27,16,1,19,16,6,0,67,0,14,32,0,3,17,33,0,16,48,0,10,0,52,0,26,27,16,33,0,17,48,6,32,0,11,0,0,32,0,3,17,0,15,0,63,17,0,11,32,0,16,17,0,26,16,33,0,18,48,0,12,32,1,15,0,34,16,0,14,32,0,1,17,17,0,1,33,0,3,50,6,32,0,3,0,15,0,63,17,0,11,32,0,16,17,0,27,16,0,9,32,1,15,0,34,16,0,0,0,68,17,0,14,32,0,1,17,0,10,34,0,18,17,17,0,12,32,0,3,0,71,0,53,0,15,27,0,9,0,11,0,52,0,76,27,21,16,17,0,13,0,50,0,25,27,32,0,10,0,132,27,16,6,32,1,33,32,0,8,11,2,32,1,25,32,0,1,17,0,26,16,0,12,32,0,16,17,0,13,0,50,0,25,27,32,0,10,0,133,27,16,6,0,71,0,14,32,0,3,17,0,10,0,52,0,26,27,16,33,0,19,48,0,33,0,52,32,0,13,0,33,0,52,32,0,17,0,53,0,33,27,0,31,20,27,16,27,0,54,0,27,27,16,33,0,20,48,6,32,0,20,0,10,32,0,19,17,0,8,16,33,0,21,48,6,32,1,16,0,34,16,0,0,0,64,17,0,14,32,0,1,17,33,0,22,48,6,32,1,18,0,34,16,0,14,32,0,1,17,0,2,0,68,17,0,0,32,1,27,0,34,16,0,0,0,68,17,0,14,32,0,1,17,17,0,33,32,0,22,0,8,16,32,1,37,16,17,33,0,23,48,6,0,63,33,0,24,48,6,32,0,23,0,13,16,0,25,16,33,0,25,48,6,1,20,33,0,26,48,6,32,0,21,0,8,16,0,2,32,0,23,17,32,0,26,0,134,26,16,6,32,0,17,0,10,32,0,19,17,33,0,27,48,0,33,32,0,13,17,0,31,16,0,42,0,33,26,33,0,13,50,6,32,0,3,0,13,16,0,25,16,0,33,0,52,32,0,13,27,0,54,0,27,0,52,0,13,27,27,16,33,0,28,48,6,0,59,0,14,32,0,3,17,0,10,34,0,27,17,0,33,32,0,13,17,0,21,0,64,17,0,0,0,52,0,49,0,0,26,27,16,0,31,16,0,42,0,33,26,0,8,0,31,0,53,0,42,0,33,26,27,21,0,33,0,52,0,31,27,0,18,21,32,0,13,0,21,0,59,17,17,0,24,0,59,17,0,49,0,0,26,16,0,31,16,33,0,29,48,6,32,1,16,0,34,16,0,0,0,68,17,0,68,11,2,32,1,25,32,0,1,17,0,2,32,0,11,17,0,33,32,0,29,17,33,0,30,48,0,49,0,0,26,16,33,0,31,48,0,31,16,33,0,32,48,6,32,0,32,0,42,0,33,26,33,0,29,50,6,32,0,32,0,42,0,33,26,33,0,31,50,6,32,0,32,0,42,0,33,26,33,0,30,50,6,32,0,29,0,42,0,33,26,33,0,1,50,6,32,0,29,0,42,0,33,26,33,0,16,50,6,32,0,29,0,42,0,33,26,33,0,5,50,6,32,0,29,0,42,0,33,26,33,0,6,50,6,32,0,11,0,33,32,0,29,17,0,42,0,1,26,32,0,30,17,33,0,11,49,0,49,0,0,26,16,0,31,16,33,0,13,49,6,32,0,16,0,10,0,52,0,26,27,16,0,33,32,0,13,17,0,31,16,0,42,0,33,26,33,0,13,50,6,32,0,29,0,33,32,0,13,17,33,0,33,48,6,32,0,19,0,1,32,0,20,17,0,33,32,0,33,17,0,12,0,30,0,51,0,1,27,0,11,21,0,63,17,0,42,0,3,26,0,68,17,0,0,0,64,17,33,0,34,48,6,32,1,16,0,34,16,0,0,0,65,17,0,14,32,0,1,17,0,33,32,0,13,17,0,30,16,33,0,35,48,6,0,63,0,12,32,0,30,17,33,0,36,48,6,0,63,0,11,34,0,30,17,0,30,16,33,0,37,48,6,34,0,11,0,33,32,0,13,17,0,12,32,0,13,0,53,0,30,27,0,11,20,0,51,0,22,27,0,11,21,0,63,17,0,44,0,21,26,32,0,36,0,30,16,32,0,37,11,2,17,33,0,38,48,6,32,0,19,0,33,32,0,33,17,0,31,16,33,0,39,48,0,42,0,33,26,33,0,13,50,6,32,0,29,0,33,32,0,13,17,33,0,33,49,6,32,0,13,0,31,16,33,0,40,48,6,32,1,14,0,34,16,0,14,32,0,1,17,33,0,41,48,6,32,1,14,0,34,16,0,0,0,64,17,0,14,32,0,1,17,33,0,42,48,6,32,0,42,0,10,32,0,41,17,0,11,32,0,36,0,49,0,10,26,16,17,0,13,0,50,0,25,27,32,0,10,0,135,27,16,6,32,0,42,0,10,34,0,36,17,33,0,43,48,0,49,0,0,26,16,33,0,44,48,6,0,19,32,1,39,0,50,0,8,27,32,0,43,21,33,0,45,48,6,32,0,41,32,0,45,16,33,0,46,48,6,32,0,42,0,30,32,0,43,17,33,0,47,48,0,8,16,0,21,0,64,17,33,0,48,48,6,32,0,47,0,26,0,53,0,10,27,16,0,21,0,63,17,33,0,49,48,6,32,0,46,0,24,0,9,32,0,47,21,0,11,0,24,0,52,0,1,27,21,0,64,17,32,0,43,0,30,20,32,0,10,0,136,27,16,6,32,0,46,0,24,0,59,17,0,12,32,0,47,17,0,9,0,52,0,27,27,16,32,0,43,0,30,20,32,0,10,0,137,27,16,6,34,0,42,0,30,16,0,21,32,0,37,17,0,33,34,0,47,0,26,16,0,31,16,0,31,16,17,33,0,50,48,6,32,0,41,0,10,32,0,43,17,0,33,0,52,32,0,13,0,28,16,27,0,54,32,1,37,0,53,0,42,0,33,26,27,27,34,0,41,17,33,0,51,48,0,30,16,33,0,52,48,6,32,0,1,0,33,32,0,52,17,0,35,0,1,0,18,0,50,0,13,27,21,32,1,32,17,33,0,53,48,0,14,0,63,17,33,0,54,48,6,32,0,53,0,14,0,52,0,68,27,0,9,32,0,54,0,27,0,64,17,21,0,10,0,16,0,52,0,27,27,21,16,0,11,32,0,54,17,32,0,52,32,0,10,0,138,27,16,6,32,0,53,0,27,16,0,30,34,0,54,17,33,0,55,48,6,34,0,53,0,14,0,63,17,0,42,0,30,26,33,0,52,50,6,32,0,52,0,42,0,33,26,32,0,29,17,32,0,3,0,53,0,33,27,0,2,32,0,21,0,53,0,33,27,21,16,33,0,56,48,6,32,0,56,0,14,0,59,17,33,0,57,48,0,26,0,0,0,27,0,52,0,64,27,21,16,33,0,58,48,0,14,0,68,17,33,0,59,48,6,32,0,51,0,33,32,0,52,0,30,32,0,57,17,0,0,0,64,17,17,32,0,52,0,30,32,0,57,21,32,0,10,0,139,27,16,6,32,0,56,0,15,0,68,17,33,0,60,48,0,11,32,0,59,17,0,19,0,9,0,69,0,14,32,0,56,17,21,0,26,20,0,10,0,27,21,16,33,0,61,48,6,34,0,60,0,10,32,0,57,17,0,9,32,0,61,17,32,0,52,32,0,10,0,140,27,16,6,34,0,58,0,14,0,64,17,0,9,32,0,56,0,14,0,63,17,17,0,11,32,0,61,17,33,0,62,48,0,10,32,0,61,17,0,8,16,33,0,63,48,6,32,0,57,0,30,32,0,63,17,0,14,0,52,0,27,0,52,0,64,27,27,16,32,0,52,0,30,32,0,63,21,32,0,10,0,141,27,16,6,32,0,20,0,33,32,0,29,17,0,8,16,0,2,32,0,1,17,0,33,32,0,52,17,33,0,64,48,0,31,32,0,8,0,21,32,1,27,17,0,49,0,0,26,16,17,0,42,0,1,26,0,64,17,0,7,0,69,17,33,0,65,48,6,32,0,65,0,13,0,64,17,0,9,32,0,56,0,14,0,63,17,17,0,9,32,0,59,17,33,0,66,48,0,0,33,0,62,50,0,12,32,0,63,17,33,0,67,48,6,32,0,66,0,0,33,0,56,50,6,32,0,56,0,5,0,68,17,0,42,0,1,26,0,64,17,0,2,0,69,17,0,2,32,0,67,17,0,0,32,0,56,0,14,0,69,17,0,26,16,0,0,0,67,17,0,2,34,0,61,17,17,0,0,32,0,57,0,26,16,0,11,32,0,66,17,0,0,0,64,17,0,2,32,0,62,17,17,33,0,68,48,6,32,1,27,0,34,16,0,0,32,0,68,17,0,13,34,0,64,17,0,9,32,0,65,0,14,0,63,17,17,32,0,52,32,0,10,0,142,27,16,6,32,0,56,0,14,0,63,17,0,9,32,0,59,17,0,10,32,0,57,17,0,8,16,0,2,33,0,65,50,6,32,0,57,0,12,33,0,63,50,6,32,0,63,0,42,0,30,26,33,0,56,50,6,32,0,62,0,30,32,0,57,0,27,0,64,17,17,33,0,69,48,6,32,0,48,0,26,0,11,0,19,21,0,64,17,0,11,32,0,46,0,27,16,17,0,26,0,53,0,1,27,16,0,0,0,64,17,33,0,70,48,6,32,0,70,0,30,0,52,32,0,46,27,0,54,32,0,65,0,13,0,63,17,33,0,71,48,0,0,0,64,17,0,2,32,0,62,17,0,6,32,0,59,17,0,2,0,52,0,8,27,34,0,66,17,0,27,16,0,30,32,0,57,17,27,16,33,0,70,49,6,32,0,55,0,2,16,0,11,32,0,63,17,32,0,52,32,0,10,0,138,27,16,6,32,0,70,0,44,0,63,26,16,0,30,0,52,32,0,46,27,0,54,34,0,55,0,30,32,0,63,17,27,16,33,0,72,48,6,32,0,72,0,14,0,68,17,0,2,0,68,17,0,6,33,0,70,50,6,0,63,0,21,32,0,69,17,0,33,0,52,0,49,0,0,26,27,32,0,57,17,0,12,34,0,62,17,32,0,52,32,0,10,0,143,27,16,6,0,68,0,13,32,0,65,17,0,12,34,0,67,17,32,0,52,32,0,10,0,144,27,16,6,32,0,56,0,14,0,64,17,0,10,33,0,69,50,6,32,0,51,0,33,0,52,32,0,52,27,0,54,32,0,71,0,8,16,27,16,33,0,73,48,6,34,0,52,0,30,32,0,71,17,0,42,0,33,26,32,0,40,17,33,0,74,48,6,34,0,65,0,30,32,0,71,17,0,14,0,68,17,33,0,75,48,6,32,1,27,0,34,16,0,0,0,69,17,0,14,32,0,1,17,0,9,0,69,0,14,32,0,3,17,0,33,32,0,29,17,17,33,0,76,48,6,0,14,0,52,32,0,1,0,31,32,1,27,0,34,16,0,0,0,63,0,69,0,65,0,72,11,4,17,17,0,0,34,0,76,17,27,32,0,45,20,33,0,77,48,6,32,1,27,32,1,25,32,0,1,17,0,11,32,0,51,17,0,30,16,33,0,78,48,6,0,64,32,0,77,16,33,0,79,48,6,0,69,34,0,77,0,51,0,19,0,2,0,68,21,0,6,0,18,21,27,0,68,17,33,0,80,48,0,0,0,52,0,11,0,52,0,63,27,0,10,32,0,79,21,27,16,33,0,81,48,6,32,0,79,0,30,32,0,46,17,0,11,32,0,69,17,0,11,34,0,59,0,30,34,0,63,17,17,0,10,32,0,81,0,30,32,0,46,17,0,11,32,0,56,17,17,32,0,43,0,50,0,30,27,0,21,0,63,21,0,30,32,0,46,21,32,0,10,0,145,27,16,6,32,0,81,0,30,0,52,32,0,46,27,0,54,34,0,56,27,16,33,0,81,49,0,42,0,1,26,0,64,17,0,6,33,0,80,50,6,32,0,79,0,30,0,52,32,0,46,27,0,54,0,6,0,52,34,0,69,27,27,16,33,0,79,49,6,32,0,81,0,34,16,0,11,0,63,17,32,0,1,0,50,1,21,27,0,30,20,32,0,10,0,146,27,16,6,32,0,79,0,12,32,0,49,17,0,24,0,64,17,32,0,43,0,30,20,32,0,10,0,147,27,16,6,32,0,80,0,13,0,52,0,27,27,16,0,11,32,0,48,17,0,24,0,64,17,32,0,43,0,30,20,32,0,10,0,148,27,16,6,32,0,79,0,2,0,69,17,0,0,0,63,0,68,0,69,11,3,0,33,32,0,80,17,17,33,0,82,48,6,32,0,79,0,30,34,0,46,17,0,8,16,0,2,0,69,17,0,33,34,0,57,0,49,0,0,26,16,0,27,16,17,0,1,33,0,68,50,6,32,0,3,0,33,0,52,32,0,29,0,33,32,0,37,17,27,0,54,34,0,81,0,30,32,0,48,17,0,24,0,64,17,27,16,0,2,32,0,21,17,0,42,0,1,26,32,0,19,17,33,0,3,49,6,34,0,21,0,9,34,0,22,17,33,0,83,48,6,0,63,0,11,32,0,3,17,0,42,0,21,26,0,64,17,0,33,32,0,28,17,33,0,84,48,0,27,16,0,9,32,0,83,17,33,0,85,48,6,32,0,3,0,33,32,0,85,0,8,16,32,1,37,16,17,0,2,32,0,85,17,0,0,32,0,3,17,0,19,0,15,0,68,21,0,11,32,0,84,21,0,1,0,19,21,0,6,0,19,0,14,0,69,21,0,2,34,0,84,0,0,0,64,17,21,0,42,0,21,26,0,63,21,0,33,34,0,28,21,21,16,33,0,86,48,6,32,0,86,0,33,0,0,0,6,0,64,21,0,5,0,19,21,34,0,85,0,8,16,0,49,0,0,26,16,0,53,0,19,0,1,0,33,21,27,21,0,63,0,14,32,0,86,17,0,9,32,0,83,17,0,8,16,32,1,37,16,17,0,6,33,0,86,50,6,32,0,86,0,27,16,0,2,34,0,83,17,0,0,33,0,3,50,6,32,0,23,0,14,0,64,17,0,9,32,0,86,0,13,0,63,17,17,0,10,33,0,24,50,0,8,16,0,2,33,0,23,50,6,32,0,23,0,1,32,0,23,0,14,0,63,17,0,2,32,0,86,17,17,33,0,86,49,6,0,59,0,14,32,0,3,17,0,27,0,64,17,0,9,0,76,0,14,32,0,3,17,17,0,1,33,0,3,50,6,0,63,0,14,32,0,3,17,0,27,16,0,12,0,67,0,14,32,0,3,17,17,32,0,29,0,50,0,31,27,32,0,10,0,149,27,16,6,34,0,17,0,19,0,1,0,8,0,53,0,2,27,21,33,0,3,50,6,32,1,33,0,1,32,0,1,17,33,0,87,48,6,34,0,38,0,47,1,22,26,16,6,32,0,13,0,42,0,33,26,33,0,1,50,6,34,0,51,0,33,32,0,13,17,33,0,88,48,6,32,0,33,0,42,0,33,26,33,0,3,50,6,32,0,33,0,42,0,33,26,33,0,86,50,6,34,0,19,0,12,34,0,20,17,0,33,32,0,33,17,0,30,16,0,21,34,0,39,0,31,16,0,33,32,0,35,17,17,33,0,35,49,6,32,0,3,0,70,0,53,0,15,27,0,9,0,11,0,52,0,77,27,21,16,33,0,89,48,6,0,63,0,11,32,0,3,17,0,11,32,0,89,17,33,0,90,48,6,32,0,90,0,27,16,32,1,37,16,0,42,0,33,26,32,0,86,17,33,0,91,48,0,15,0,64,17,33,0,92,48,6,32,0,86,0,1,16,0,6,0,63,17,33,0,93,48,6,32,0,91,0,1,16,0,6,0,63,17,33,0,94,48,6,32,0,13,33,0,25,49,6,34,0,33,0,42,0,33,26,33,0,24,50,6,32,0,89,0,2,32,0,94,17,32,0,26,0,150,26,16,6,0,68,0,16,32,0,3,17,0,9,0,68,0,11,32,0,91,17,17,33,0,95,48,0,11,32,0,88,17,0,30,16,0,28,16,33,0,96,48,6,0,69,0,14,32,0,3,17,33,0,97,48,0,9,32,0,95,17,0,26,16,0,10,32,0,95,17,33,0,98,48,6,0,68,0,25,16,0,37,32,0,3,17,0,10,32,0,98,17,0,16,32,0,97,17,0,2,0,68,17,0,6,32,0,93,17,0,27,0,2,34,0,97,21,0,6,0,26,21,0,68,17,0,2,32,0,95,17,32,0,26,0,151,26,16,6,32,1,26,0,14,32,0,1,17,33,0,99,48,6,32,1,16,0,34,16,0,0,0,68,17,32,1,14,0,34,16,0,0,0,64,17,11,2,0,37,32,0,1,17,33,0,100,48,6,32,1,16,0,34,16,0,0,0,67,17,0,14,32,0,1,17,33,0,101,48,32,1,37,0,51,0,11,27,32,0,100,17,0,9,32,0,99,17,33,0,102,48,6,32,0,102,0,10,32,0,101,17,0,27,16,0,2,32,0,94,17,34,0,26,0,152,26,16,6,0,63,0,14,32,0,3,17,0,11,0,52,0,10,0,52,0,27,27,27,32,0,98,17,0,26,0,53,0,9,27,16,32,0,13,32,0,10,0,153,27,16,6,32,1,15,0,34,16,0,0,0,68,17,0,14,32,0,1,17,33,0,103,48,6,0,64,0,16,34,0,86,17,0,26,16,0,9,32,0,103,17,0,11,32,0,92,17,33,0,104,48,6,32,0,90,0,27,0,64,17,0,9,33,0,103,50,6,32,0,103,0,11,32,0,104,17,32,0,13,32,0,10,0,154,27,16,6,32,0,104,0,10,32,0,98,17,0,8,16,0,28,0,54,32,1,36,0,1,0,18,21,0,52,0,13,0,50,0,25,27,27,27,16,33,0,105,48,6,32,0,89,0,30,16,33,0,106,48,0,0,0,52,32,0,105,0,53,0,33,27,27,16,0,0,0,64,17,33,0,107,48,6,32,0,3,0,33,32,0,106,17,0,13,0,76,17,33,0,108,48,6,32,0,3,0,33,32,0,107,17,33,0,109,48,6,32,0,91,0,33,32,0,107,17,0,6,0,63,17,0,13,32,0,109,17,0,9,32,0,108,17,32,0,13,0,33,32,0,107,21,32,0,10,0,155,27,16,6,32,0,1,0,33,32,0,106,17,0,42,0,1,26,32,1,15,0,34,16,17,0,0,32,0,104,0,33,32,0,106,17,17,0,0,34,0,109,0,15,0,63,17,17,0,0,32,0,108,17,33,0,110,48,6,32,0,74,0,21,33,0,107,50,6,32,0,1,0,44,0,63,26,16,0,33,0,52,32,0,107,27,0,54,32,0,74,0,44,0,72,26,16,0,21,32,0,110,17,27,16,0,1,0,52,0,26,27,16,33,0,111,48,6,32,0,111,0,33,32,0,40,17,0,2,0,52,0,49,0,0,26,0,14,0,63,21,0,10,0,52,0,27,0,52,0,64,27,27,20,27,16,0,49,0,0,26,16,0,27,16,33,0,111,49,0,33,32,0,13,17,33,0,112,48,0,2,16,33,0,113,48,6,32,0,111,0,14,0,72,17,33,0,114,48,0,2,0,69,17,0,1,33,0,111,50,6,32,1,15,0,34,16,0,42,0,1,26,32,1,33,17,0,14,32,0,87,17,0,11,32,0,111,17,32,0,45,16,33,0,115,48,6,32,0,24,0,33,32,0,40,17,34,0,45,16,33,0,116,48,6,32,0,29,0,33,32,0,50,17,0,21,0,63,17,0,42,0,1,26,0,64,17,1,23,16,6,32,0,116,33,0,117,48,6,32,0,48,32,1,38,0,51,0,16,27,33,0,116,50,6,0,63,0,14,32,0,70,17,0,9,32,0,116,17,0,24,0,64,17,32,0,43,0,30,20,32,0,10,0,157,0,158,11,2,0,55,0,11,0,52,34,0,117,0,24,0,64,17,27,0,47,0,10,26,20,27,27,16,6,32,0,116,0,2,0,68,17,0,6,33,0,70,50,6,32,0,70,0,14,0,68,17,0,33,0,52,0,49,0,0,26,27,32,0,100,17,33,0,118,48,6,32,0,118,0,14,0,1,0,18,21,33,0,93,50,6,34,0,118,0,14,0,1,0,18,21,33,0,94,50,6,32,1,33,0,1,32,0,1,17,32,0,8,0,53,0,11,27,0,9,0,15,0,52,0,78,27,21,16,33,0,119,48,6,32,1,33,0,0,32,0,8,17,0,16,32,0,1,17,0,9,34,0,114,0,33,32,0,13,17,17,33,0,120,48,0,30,16,33,0,121,48,6,32,1,16,32,1,25,0,11,0,34,0,0,0,69,21,0,53,0,14,27,21,32,0,1,17,0,10,32,1,17,0,34,16,0,14,32,0,1,17,0,26,16,0,12,32,0,90,17,17,0,10,34,0,120,17,0,10,34,0,119,17,0,11,0,63,0,16,32,0,3,17,0,9,32,0,113,17,0,26,16,0,11,32,0,90,17,0,11,32,0,88,17,17,33,0,122,48,6,32,0,113,0,11,34,0,122,0,10,32,0,89,17,17,32,0,13,32,0,10,0,159,27,16,6,32,0,113,0,33,32,0,106,17,0,11,0,68,0,14,34,0,110,17,0,9,34,0,112,0,33,32,0,106,17,0,13,0,65,17,17,17,32,0,13,0,33,32,0,106,21,32,0,10,0,160,27,16,6,32,0,113,0,12,0,52,0,27,27,16,0,9,32,0,3,0,15,0,63,17,17,0,9,32,0,91,0,11,0,63,17,17,0,11,32,0,88,17,32,0,13,32,0,10,0,161,27,16,6,32,0,113,0,33,32,0,106,17,33,0,123,48,0,12,33,0,108,50,6,32,0,106,0,30,34,0,123,17,33,0,124,48,6,32,0,108,0,42,0,30,26,33,0,106,50,6,32,0,74,0,44,0,64,26,16,0,21,34,0,108,17,0,42,0,30,26,33,0,107,50,6,34,0,16,0,27,16,33,0,125,48,0,30,16,33,0,126,48,6,32,0,87,32,0,8,0,53,0,11,27,0,9,0,15,0,52,0,63,27,21,16,0,11,34,0,89,0,9,32,0,113,17,0,26,16,0,33,32,0,40,17,0,10,34,0,125,17,0,10,34,0,73,17,17,0,30,16,33,0,127,48,6,32,0,111,0,33,32,0,78,17,33,0,128,48,0,11,0,63,17,33,0,129,48,6,0,68,0,68,11,2,32,1,25,34,0,111,0,33,32,0,127,17,33,0,130,48,17,33,0,131,48,6,0,67,0,11,34,0,128,17,0,9,32,0,129,17,32,0,78,32,0,10,0,162,27,16,6,32,0,44,0,33,32,0,127,17,33,0,132,48,6,32,0,87,0,33,32,0,127,17,33,0,133,48,6,32,0,7,0,13,16,0,11,32,0,133,17,0,9,32,0,132,0,14,0,63,17,17,0,9,32,0,131,17,33,0,134,48,6,32,0,7,0,33,32,0,133,0,30,32,0,134,17,17,33,0,135,48,0,14,0,63,17,32,0,127,0,30,32,0,134,21,32,0,10,0,163,27,16,6,32,0,131,0,30,0,52,34,0,134,27,0,54,34,0,135,0,15,0,63,17,27,16,33,0,131,49,6,0,63,0,15,32,0,7,17,0,30,16,33,0,136,48,0,44,0,63,26,16,33,0,137,48,6,32,0,133,0,30,32,0,131,17,33,0,138,48,0,21,32,0,136,17,0,39,32,0,82,0,13,16,0,21,32,0,132,0,30,32,0,131,17,33,0,139,48,17,0,21,32,0,137,17,33,0,140,48,17,33,0,141,48,6,32,0,32,0,33,34,0,50,17,0,42,0,1,26,0,64,17,0,21,32,0,1,0,13,16,17,0,33,32,0,139,17,0,21,34,0,32,0,30,34,0,43,17,0,21,0,59,17,0,33,34,0,132,17,0,0,32,0,130,0,14,0,64,17,17,17,33,0,142,48,6,32,0,142,0,31,16,0,33,0,52,32,0,138,0,21,32,0,133,17,33,0,143,48,0,53,0,33,27,0,31,20,27,16,33,0,144,48,6,32,0,144,0,30,0,52,0,15,0,52,32,0,131,0,13,16,27,27,16,1,24,16,6,32,0,144,0,33,34,0,138,0,44,0,59,26,16,0,21,32,0,131,17,0,33,32,0,144,17,0,49,0,0,26,16,33,0,145,48,0,31,16,17,0,30,0,52,32,0,131,0,13,16,0,53,0,11,27,27,16,33,0,144,49,6,32,0,144,0,42,0,33,26,33,0,131,50,6,32,0,144,0,42,0,33,26,33,0,127,50,6,32,0,144,0,42,0,33,26,33,0,130,50,6,34,0,145,0,11,0,63,17,0,10,0,52,0,27,27,16,0,8,16,0,47,0,0,26,16,33,0,146,48,6,34,0,133,0,33,32,0,144,0,23,32,0,146,17,17,33,0,147,48,6,32,0,7,0,13,16,0,16,32,0,147,17,32,0,127,0,23,32,0,146,21,32,0,10,32,0,147,0,53,0,30,27,0,38,20,32,1,29,0,164,21,27,16,6,32,0,130,0,11,0,63,17,33,0,148,48,0,9,0,69,0,11,34,0,130,17,17,33,0,149,48,6,34,0,31,0,33,32,0,127,17,0,33,0,52,32,0,131,32,1,37,16,0,24,32,0,146,17,27,0,21,34,0,7,0,6,0,63,17,0,1,16,33,0,150,48,0,33,32,0,147,17,21,0,1,0,19,21,16,33,0,151,48,6,32,0,151,0,11,0,63,17,0,9,32,0,149,17,32,0,127,32,0,10,0,165,27,16,6,34,0,149,32,1,39,0,24,0,64,21,0,16,0,30,21,32,0,131,17,33,0,152,48,0,33,34,0,144,0,30,32,0,131,17,0,31,16,33,0,153,48,17,0,21,34,0,137,17,0,39,34,0,140,17,33,0,154,48,6,34,0,139,0,21,34,0,150,17,0,36,0,0,32,0,82,0,53,0,33,27,21,16,0,19,0,24,0,52,0,13,27,34,0,136,21,0,33,0,52,0,31,27,34,0,153,21,0,33,32,0,131,0,24,34,0,146,17,0,49,0,0,26,0,59,17,21,0,21,0,33,0,52,34,0,147,27,21,16,33,0,155,48,6,32,0,151,0,11,0,63,17,32,1,39,0,11,34,0,152,0,21,0,64,17,21,0,33,0,52,0,49,0,0,26,27,0,18,21,32,0,131,17,0,9,32,0,131,0,26,0,64,17,0,11,32,0,148,17,17,33,0,156,48,6,32,0,87,0,33,32,0,78,17,0,0,0,69,17,0,0,32,0,79,0,2,0,69,17,0,33,32,0,44,0,33,32,0,78,17,33,0,157,48,17,17,33,0,158,48,6,34,0,157,0,2,0,72,17,0,0,32,0,158,17,0,28,0,54,0,37,27,16,0,21,33,0,156,50,6,0,64,0,1,32,0,74,17,0,42,0,33,26,32,0,13,17,0,0,0,64,17,32,0,126,32,0,78,0,21,32,0,127,17,11,3,0,30,0,69,0,68,0,69,11,3,17,0,21,16,33,0,159,48,6,34,0,129,0,21,34,0,148,17,0,12,0,2,0,68,21,0,0,0,19,21,34,0,156,17,0,0,0,79,17,33,0,160,48,6,32,0,74,0,44,0,79,26,16,32,0,74,0,44,0,63,26,16,34,0,68,0,30,34,0,71,17,32,0,126,0,44,0,80,26,16,34,0,87,0,33,34,0,126,17,34,0,160,34,0,78,0,44,0,63,26,16,0,21,34,0,151,17,34,0,158,0,21,34,0,155,17,11,8,33,0,161,48,6,32,0,98,0,8,16,0,49,0,0,26,16,32,1,36,0,1,0,19,21,32,0,90,17,0,7,0,10,0,12,21,0,68,17,0,9,32,0,92,17,33,0,162,48,6,34,0,95,0,27,16,0,10,0,64,0,14,32,0,3,17,17,33,0,163,48,0,11,32,0,113,0,11,32,0,90,17,0,10,0,52,0,26,27,16,0,10,32,0,98,17,0,10,34,0,162,17,0,10,32,0,88,17,33,0,164,48,17,0,30,16,33,0,165,48,6,34,0,163,0,10,34,0,164,17,0,12,32,0,92,17,32,0,13,32,0,10,0,166,27,16,6,0,63,0,14,32,0,3,17,0,11,32,0,98,17,0,10,0,63,0,16,32,0,3,17,0,9,34,0,92,17,17,0,8,16,0,2,0,68,17,0,6,34,0,93,17,0,26,0,68,17,0,33,32,0,165,17,33,0,166,48,0,13,0,68,17,33,0,167,48,6,32,1,26,0,11,32,0,1,17,0,11,34,0,88,17,0,30,16,33,0,168,48,0,42,0,33,26,32,0,1,17,33,0,169,48,0,9,16,0,38,16,33,0,170,48,0,27,0,1,0,19,21,0,59,17,0,30,16,0,33,34,0,169,17,33,0,171,48,6,34,0,8,0,0,32,1,33,17,33,0,172,48,0,16,32,0,1,17,0,30,16,33,0,173,48,0,21,34,0,168,17,33,0,174,48,6,32,0,1,0,33,34,0,173,17,0,0,32,0,170,0,13,16,0,42,0,1,26,34,0,172,17,17,0,21,33,0,171,50,6,34,0,40,0,33,34,0,37,17,33,0,175,48,6,0,63,0,21,32,0,102,17,0,49,0,0,26,16,0,30,0,64,0,21,32,0,101,17,17,0,24,0,64,17,0,27,0,53,0,1,27,16,0,0,34,0,90,0,26,0,64,17,0,30,34,0,101,17,0,8,16,17,0,42,0,21,26,34,0,34,17,33,0,176,48,6,0,77,0,14,32,0,3,17,0,27,16,0,10,34,0,102,17,0,10,32,0,94,0,14,0,68,17,17,0,12,34,0,99,17,0,30,16,0,21,34,0,74,0,30,0,52,0,8,27,32,0,75,17,17,33,0,177,48,6,34,0,100,0,30,16,33,0,178,48,6,32,0,167,0,0,32,0,165,17,0,0,0,52,32,0,105,0,53,0,33,27,0,2,32,0,167,21,27,16,33,0,179,48,6,32,0,179,0,30,34,0,94,0,33,32,0,165,17,33,0,180,48,0,14,0,68,17,33,0,181,48,0,2,32,0,167,0,0,0,64,17,17,17,0,21,33,0,177,50,6,32,0,181,0,8,16,33,0,181,49,6,32,0,181,0,42,0,30,26,33,0,165,50,6,32,0,181,0,42,0,30,26,33,0,179,50,6,34,0,75,0,1,16,0,21,34,0,103,0,0,32,0,104,17,0,0,32,0,1,17,0,33,34,0,106,17,0,42,0,1,26,32,1,15,0,34,16,0,0,0,64,17,17,0,6,0,63,17,17,0,0,0,81,17,33,0,182,48,6,32,0,174,32,0,174,32,0,175,32,0,175,32,0,121,32,0,35,0,30,0,68,17,32,0,107,32,0,177,0,64,0,0,32,0,124,17,0,64,0,0,32,0,124,17,34,0,105,0,33,32,0,96,17,0,6,0,64,17,0,0,32,0,96,17,34,0,179,32,0,178,11,13,0,21,16,0,42,0,33,26,32,0,13,17,0,21,34,0,159,17,33,0,183,48,0,31,16,33,0,184,48,6,34,0,174,0,44,0,63,26,16,34,0,171,32,0,175,0,44,0,64,26,16,34,0,175,0,13,16,0,25,16,0,0,0,64,17,34,0,121,0,44,0,82,26,16,34,0,176,0,22,34,0,113,0,33,34,0,35,17,0,0,0,60,17,17,0,29,16,0,20,16,34,0,182,34,0,177,0,44,0,72,26,16,32,0,124,0,44,0,83,26,16,34,0,1,0,33,0,64,0,1,34,0,124,17,17,0,42,0,1,26,32,1,33,17,34,0,3,0,33,32,0,96,17,0,0,0,84,17,34,0,91,0,33,32,0,165,17,0,11,0,63,17,0,2,0,67,17,0,0,34,0,166,0,14,0,64,17,0,6,34,0,180,17,0,2,0,68,17,0,0,34,0,167,17,0,30,34,0,181,17,17,0,0,0,85,17,32,0,115,0,0,0,86,17,33,0,185,48,0,24,0,59,17,11,13,0,21,34,0,161,17,0,21,16,0,33,32,0,184,17,33,0,186,48,6,0,19,0,42,0,33,26,32,0,13,21,0,21,0,13,0,53,0,42,0,24,0,52,0,1,27,26,27,21,33,0,187,48,6,34,0,107,0,42,0,1,26,0,64,17,34,0,96,32,0,165,11,3,0,21,16,32,0,187,32,0,5,0,13,16,0,42,0,1,26,0,64,17,0,5,34,0,183,17,0,28,0,52,0,13,0,50,0,1,27,27,32,0,178,17,17,33,0,188,48,6,32,0,5,32,0,6,11,2,0,44,0,33,0,52,0,28,0,52,32,0,178,0,13,16,27,0,33,32,0,184,21,0,42,0,21,26,0,59,21,27,26,32,0,188,34,0,104,0,10,34,0,98,17,0,8,16,0,27,16,32,1,37,16,0,33,34,0,165,17,34,0,187,34,0,188,17,11,2,17,33,0,189,48,6,32,0,70,0,13,0,64,17,0,9,32,0,79,17,0,10,33,0,49,50,0,30,16,33,0,190,48,0,42,0,33,26,34,0,70,17,33,0,191,48,0,14,0,64,17,0,0,0,64,17,33,0,192,48,0,30,16,33,0,193,48,6,34,0,191,0,11,0,64,17,0,0,34,0,72,0,33,32,0,190,17,0,2,0,68,17,17,0,5,0,67,17,33,0,194,48,6,32,0,48,0,33,32,0,190,17,33,0,195,48,0,49,0,0,26,0,59,17,33,0,196,48,6,32,0,194,0,0,34,0,192,17,0,33,0,52,0,32,0,50,0,33,0,52,32,0,196,0,53,0,33,27,0,31,20,0,30,34,0,195,21,27,27,27,16,0,6,0,68,17,33,0,197,48,6,32,0,190,0,33,32,0,193,17,0,39,32,0,197,0,49,0,0,26,16,0,21,0,63,17,0,24,0,33,34,0,196,21,0,0,34,0,194,21,0,33,0,0,0,18,0,50,0,36,27,21,34,0,193,21,0,42,0,21,26,0,23,21,0,59,17,17,0,39,0,52,0,30,27,34,0,197,17,33,0,190,49,6,34,0,80,0,30,32,0,48,17,34,0,79,0,8,16,0,30,32,0,48,17,32,0,48,0,30,16,0,30,0,52,34,0,49,0,30,34,0,48,17,27,0,54,34,0,190,27,16,11,3,33,0,198,48,6,34,0,178,0,13,0,51,0,1,27,32,0,186,17,0,16,34,0,184,17,0,21,0,64,17,0,30,16,32,0,141,0,44,0,13,26,16,0,0,34,0,82,17,34,0,141,34,0,154,11,4,33,0,199,48,6,34,0,185,0,34,0,59,17,0,21,34,0,186,17,34,0,170,34,0,198,34,0,199,34,0,189,11,5,7,11,0,0,44,0,167,0,50,0,40,27,26,11,0,0,63,0,25,16,11,4,33,0,3,48,6,34,0,2,0,13,0,11,0,67,21,0,57,0,11,0,51,0,22,27,27,16,0,41,34,0,3,26,0,24,0,13,21,0,53,0,21,27,16,33,0,4,33,0,5,33,0,6,33,0,7,12,4,48,6,34,0,1,32,1,40,34,0,5,32,0,6,11,2,17,33,0,8,48,33,0,9,33,0,10,33,0,11,33,0,12,33,0,13,12,5,48,6,34,0,9,32,1,42,34,0,10,32,0,11,0,34,16,34,0,12,34,0,13,34,0,6,0,44,0,63,26,16,0,27,34,0,7,17,11,5,17,33,0,14,33,0,15,33,0,16,33,0,17,33,0,18,12,5,48,6,34,0,14,34,0,11,0,24,0,64,17,0,21,34,0,4,0,33,34,0,15,17,11,1,17,0,21,16,34,0,16,0,12,16,0,29,16,0,43,0,11,26,16,34,0,17,0,12,16,0,29,16,0,43,0,11,26,16,34,0,18,34,0,8,11,6,7,34,0,1,34,0,2,16,7,32,0,1,0,33,0,52,32,0,2,0,30,34,0,1,19,27,0,54,0,44,0,64,26,27,16,32,1,13,34,0,2,0,42,0,33,26,18,17,7,34,0,1,0,30,16,0,34,16,0,111,11,2,0,40,16,7,34,0,1,0,21,0,63,17,0,33,0,52,0,49,0,0,26,27,32,1,31,17,0,9,32,1,32,17,0,30,16,0,112,11,2,0,40,16,7,32,1,26,0,30,34,0,1,17,0,113,11,2,0,40,16,7,32,1,26,0,30,34,0,1,17,0,114,11,2,0,40,16,7,34,0,2,0,30,34,0,1,19,0,42,0,33,26,32,1,26,19,0,115,11,2,0,40,16,7,32,0,2,0,42,0,30,26,33,1,26,50,6,32,0,2,0,42,0,30,26,33,1,25,50,6,34,0,1,0,30,34,0,2,17,7,0,47,0,10,26,0,57,34,0,1,0,11,0,51,0,22,27,34,0,2,0,53,0,30,27,21,0,40,20,27,7,0,63,0,28,0,53,0,45,0,14,26,27,0,48,1,25,26,0,19,0,50,0,44,0,63,26,27,21,0,34,0,59,21,11,2,0,55,0,13,0,11,0,63,21,0,51,0,9,27,27,33,0,3,48,6,1,26,33,0,4,48,6,0,63,32,0,4,0,125,27,0,42,0,64,34,0,4,0,126,27,26,11,2,0,55,0,13,0,51,0,12,27,27,33,0,5,48,6,34,0,1,34,0,5,0,127,11,2,0,55,0,13,0,51,0,5,27,0,11,34,0,3,21,27,34,0,2,19,0,40,16,7,0,14,0,57,0,47,0,10,26,27,0,57,34,0,1,0,11,0,51,0,22,27,34,0,2,0,53,0,30,27,0,42,0,64,0,56,0,33,27,26,0,41,32,1,6,26,0,22,32,1,5,21,21,0,29,0,50,0,9,27,20,21,0,40,20,27,7,32,1,15,0,21,0,63,17,0,30,32,0,1,17,0,13,32,2,16,0,34,16,0,0,0,67,17,17,32,1,13,0,21,0,63,21,0,30,34,0,1,21,32,1,10,0,131,27,16,7,34,0,1,0,6,33,1,24,50,0,14,0,68,17,32,1,25,32,1,10,34,0,4,27,16,7,32,2,27,32,2,25,34,0,1,17,0,9,32,1,44,0,14,0,63,17,17,7,32,1,5,0,33,0,52,32,0,1,27,0,54,32,1,5,0,33,32,0,2,19,27,16,33,1,5,49,6,32,1,6,0,33,0,52,34,0,2,27,0,54,32,1,6,0,33,34,0,1,17,27,16,33,1,6,49,7,32,1,23,0,33,32,0,1,17,0,2,0,52,0,8,27,32,1,115,17,0,6,33,1,116,50,0,14,0,68,17,32,1,29,0,50,0,31,27,0,33,34,0,1,21,32,1,10,0,156,27,16,7,32,1,142,0,33,0,52,32,0,1,27,0,13,0,52,0,27,27,20,0,51,0,10,27,32,1,143,17,0,8,16,32,1,127,0,30,0,52,32,1,131,27,0,53,0,21,27,20,0,33,34,0,1,21,32,1,10,0,163,27,16,7,32,0,1,0,27,16,0,0,34,0,2,19,0,49,0,6,26,16,0,6,34,0,1,17,7,0,36,0,14,0,18,0,50,0,13,27,21,0,42,0,30,26,0,19,21,0,0,34,0,2,21,0,42,0,33,26,32,3,8,21,0,21,0,105,21,0,21,34,0,1,21,0,21,0,124,21,7] - ,[runtime[0],runtime[1],runtime[2],runtime[3],runtime[4],runtime[6],runtime[7],runtime[8],runtime[9],runtime[10],runtime[11],runtime[12],runtime[13],runtime[14],runtime[15],runtime[16],runtime[17],runtime[19],runtime[20],runtime[21],runtime[22],runtime[23],runtime[24],runtime[25],runtime[26],runtime[27],runtime[28],runtime[29],runtime[30],runtime[31],runtime[32],runtime[33],runtime[34],runtime[35],runtime[36],runtime[37],runtime[38],runtime[39],runtime[40],runtime[41],runtime[42],runtime[43],runtime[44],runtime[45],runtime[46],runtime[47],runtime[48],runtime[49],runtime[50],runtime[51],runtime[52],runtime[53],runtime[54],runtime[55],runtime[56],runtime[58],runtime[59],runtime[61],10,-1,11,26,9,0,1,5,8,4,2,3,-3,-2,6,17,Math.PI,Infinity,-4,-5,-6,32,64,48,43,66,24,16,7,'\0','0','#','\'','\"','@',str("⋄,"),str(":;"),str("⇐←↩"),str("(){}⟨⟩"),str("‿"),str("·"),str("𝕊𝕏𝕎𝔽𝔾𝕤𝕩𝕨𝕣𝕗𝕘"),str(".¯π∞"),str("_"),str("aA"),str("•"),str("𝕨"),str(" "),str("#\'\"@"),str("s"),str("Unknown character"),str(": "),str("˜⁼"),str("Unclosed quote"),str("Words can\'t only have underscores"),str("System dot with no name"),str("𝕣 can\'t be used with other word characters"),str("Numbers can\'t start with underscores"),str("Letter"),str(" \""),str("\" not allowed in numbers"),str("ea"),str("Negative sign in the middle of a number"),str("Portion of a number is empty"),str("Ill-formed decimal or exponent use"),str("π and ∞ must occur alone"),str("Missing "),str("opening"),str("closing"),str("Malformed bracket nesting"),str("Empty program"),str("Swapped open and closed brackets"),str("Parentheses can\'t contain separators"),str("Empty statement or expression"),str("Invalid assignment or stranding use"),str("Dot must be followed by a name"),str("Can\'t strand Nothing (·)"),str("Punctuation : and ; not allowed outside blocks"),str("Header-less bodies must come last"),str("At most two header-less bodies allowed"),str("Invalid Undo header syntax"),str("Only one header per body allowed"),str("Missing operand in header"),str("Invalid header structure"),str("Incorrect special name"),str("Header left argument without right"),str("Header operation must be a plain name"),str("Invalid special names for block header"),str("Special name outside of any block"),str("Only blocks with explicit arguments can have multiple bodies"),str("Block bodies must be of the same kind"),str("Dot must be preceded by a subject"),str("Nothing (·) cannot be assigned"),str("Missing operand"),str("Can\'t use Nothing (·) in lists"),str("Double subjects (missing ‿?)"),str("No right-hand side in non-modified assignment"),str("Role of the two sides in assignment must match"),str("Can\'t return Nothing (·)"),str("Invalid use of 𝕨 in monadic case"),str("Unreachable body"),str("Assignment target must be a name or list of targets"),str("Can\'t nest assignments (write aliases with ⇐)"),str("Can\'t use result of function/modifier assignment without parentheses"),str("Can\'t define special name"),str("Redefinition"),str("Undefined identifier"),str("Can\'t export from surrounding scope"),str("Second-level parts of a train must be functions"),str("System values not supported")] + [1,1,7,34,0,1,33,0,3,33,0,4,33,0,5,12,3,48,6,0,58,0,0,0,88,17,33,0,6,48,6,34,0,3,32,0,4,34,0,5,32,0,6,0,21,0,94,17,0,95,0,96,0,97,0,98,0,99,0,100,0,20,0,60,0,50,11,2,17,0,43,0,33,26,0,59,17,0,101,0,58,0,25,16,0,0,0,89,17,0,61,33,0,7,48,0,25,16,0,45,0,0,26,0,103,17,0,20,16,0,42,0,21,26,0,102,17,0,62,0,0,0,88,17,0,21,0,106,17,0,21,0,105,0,24,0,59,17,17,0,21,0,104,17,0,107,11,15,0,44,0,13,26,0,11,0,51,0,22,27,0,21,21,16,33,0,8,33,0,9,12,2,48,6,32,0,9,0,49,0,0,26,0,27,0,63,21,0,53,0,42,0,44,0,22,26,26,27,16,33,0,10,33,0,11,33,0,12,33,0,13,33,0,14,33,0,15,33,0,16,33,0,17,33,0,18,33,0,19,33,0,20,33,0,21,33,0,22,33,0,23,33,0,24,12,15,48,6,0,34,0,53,0,1,27,0,12,0,9,0,15,0,52,0,63,27,21,0,34,0,52,0,64,27,21,33,0,25,48,6,32,0,13,0,34,16,33,0,26,48,6,0,65,0,1,0,53,0,22,27,16,0,0,32,0,19,17,33,0,27,48,6,32,0,19,0,34,16,0,0,0,66,17,33,0,28,48,6,0,13,0,11,0,64,21,0,42,0,30,26,0,108,21,0,53,0,21,27,33,0,29,48,6,1,2,33,0,30,48,6,1,3,32,0,8,26,33,0,31,48,6,0,111,0,30,0,52,34,0,4,0,53,0,37,27,27,16,32,0,31,16,33,0,32,48,6,32,0,20,0,34,16,33,0,33,48,0,0,0,64,17,33,0,34,48,6,0,64,0,68,0,69,0,59,0,59,0,70,0,59,0,63,11,2,0,71,0,63,0,65,0,72,11,2,0,30,16,0,8,16,11,10,0,41,34,0,9,26,0,23,0,13,21,0,53,0,42,0,44,0,20,26,26,27,16,0,21,16,0,42,0,21,26,0,67,17,33,0,35,48,6,0,2,0,49,0,6,26,20,33,0,36,48,6,32,0,36,0,52,0,13,0,50,0,25,27,27,33,0,37,48,6,32,0,36,0,52,0,13,0,50,0,25,27,0,0,0,64,21,27,33,0,38,48,6,0,18,0,30,0,10,21,0,42,0,21,26,0,30,0,21,21,0,64,21,33,0,39,48,6,1,4,33,0,40,48,6,1,5,33,0,41,48,6,1,6,33,0,42,48,6,1,7,33,0,43,48,7,34,0,1,0,11,16,0,44,1,8,26,34,0,4,17,0,21,16,7,32,1,30,32,1,29,0,52,0,109,27,0,110,0,19,11,3,26,0,40,20,33,0,2,48,6,32,0,1,0,53,0,33,27,0,53,0,17,0,57,0,18,0,30,0,13,21,0,50,34,0,2,27,27,27,0,18,0,19,21,33,0,3,48,6,32,0,1,0,31,16,33,0,4,48,6,0,19,0,31,34,0,1,0,33,32,0,4,17,21,0,6,0,64,21,0,42,0,1,26,0,64,21,0,42,0,33,26,34,0,4,21,34,0,3,0,19,21,7,34,0,2,33,0,3,33,0,4,12,2,48,6,0,90,0,14,32,0,1,17,33,0,5,48,6,0,91,0,14,32,0,1,17,33,0,6,48,0,9,0,52,0,26,0,52,0,63,0,63,11,2,27,27,16,0,30,16,33,0,7,48,6,0,92,0,14,32,0,1,17,33,0,8,48,0,30,16,33,0,9,48,6,32,0,7,32,0,9,0,24,0,59,17,32,0,5,0,30,16,11,3,0,21,16,33,0,10,48,0,31,16,33,0,11,48,6,32,0,10,0,33,32,0,11,17,33,0,10,49,6,34,0,7,0,0,0,68,17,34,0,9,0,24,0,64,17,0,64,0,21,32,1,6,0,14,32,0,1,17,17,0,30,16,0,30,0,52,32,0,5,0,49,0,0,26,16,0,21,0,63,17,0,53,0,33,0,50,0,27,0,53,0,1,27,27,27,27,16,11,3,0,21,16,0,33,34,0,11,17,33,0,12,48,6,0,19,0,34,0,59,21,0,14,0,63,21,0,57,1,9,27,33,0,13,48,6,0,30,0,52,32,0,12,0,31,32,0,10,17,0,44,0,63,26,0,21,0,64,21,32,0,13,0,13,0,53,0,21,27,21,0,23,0,13,21,16,27,0,46,0,30,26,20,0,23,32,0,1,0,13,16,21,33,0,14,48,6,34,0,10,32,0,14,16,33,0,15,48,6,34,0,12,34,0,14,16,33,0,16,48,6,32,0,16,0,10,32,0,15,17,33,0,17,48,0,49,0,13,26,0,64,17,33,0,18,48,6,32,0,18,0,11,34,0,16,17,0,9,32,0,8,0,10,32,0,6,17,17,0,47,0,10,26,0,57,1,10,27,16,6,0,93,0,14,32,0,1,17,0,9,32,0,18,17,33,0,19,48,6,34,0,6,0,9,32,0,15,17,0,27,16,0,10,32,0,19,17,0,30,16,33,0,20,48,6,32,0,20,34,0,19,0,53,0,33,27,0,2,0,88,0,1,0,93,17,21,0,1,32,0,1,0,53,0,33,27,21,16,33,0,21,48,6,32,0,8,0,9,33,0,15,50,0,26,16,0,9,32,0,8,17,33,0,22,48,0,12,33,0,18,50,6,34,0,17,0,9,34,0,8,17,0,49,0,13,26,16,0,11,0,64,0,53,0,21,27,0,51,0,2,0,52,0,49,0,0,26,27,27,0,18,21,34,0,22,0,27,16,0,12,34,0,15,17,33,0,23,48,17,0,42,0,1,26,0,64,17,0,42,0,39,26,32,0,1,17,33,0,24,48,6,32,0,18,0,30,16,33,0,25,48,6,32,0,18,0,27,0,64,17,0,30,16,0,23,0,52,0,13,27,32,0,25,17,33,0,26,48,6,32,0,25,34,0,5,0,53,0,33,27,0,2,0,1,21,32,0,26,17,0,1,33,0,26,50,6,34,0,1,0,33,32,0,25,17,32,1,31,16,33,0,27,48,6,32,1,21,32,1,25,32,0,27,17,0,26,16,0,12,32,1,20,0,34,16,0,14,32,0,27,17,17,33,0,28,48,6,32,1,28,0,14,32,0,27,17,33,0,29,48,6,32,1,23,0,34,0,51,0,42,0,1,26,0,22,0,18,21,27,32,1,20,17,32,1,25,32,0,27,17,0,11,34,0,28,17,0,10,32,0,29,17,33,0,30,48,0,11,0,52,0,27,27,16,33,0,31,48,6,32,1,22,0,47,0,0,26,16,0,0,0,59,17,0,14,32,0,27,17,33,0,32,48,6,32,1,23,0,34,16,0,14,32,0,27,17,33,0,33,48,6,32,0,32,0,12,32,0,30,17,0,18,0,30,0,10,21,0,26,0,30,0,19,21,0,64,21,0,11,0,30,21,32,0,31,17,0,47,0,10,26,0,57,1,11,27,16,6,32,0,27,0,30,32,0,31,17,0,42,0,1,26,32,1,22,0,34,16,17,0,42,0,3,0,50,0,5,27,26,32,1,7,17,0,2,32,0,29,0,30,32,0,31,17,0,8,16,17,33,0,34,48,6,32,1,22,0,34,16,0,0,32,1,7,17,0,16,32,0,27,17,0,9,32,0,30,17,0,2,32,1,7,17,0,1,33,0,27,50,6,32,0,30,0,26,16,0,12,32,0,33,17,0,47,0,10,26,0,57,1,12,27,16,6,32,0,33,0,10,0,52,0,27,27,16,0,13,33,0,31,50,6,34,0,33,0,30,32,0,31,17,0,19,0,0,0,8,0,53,0,2,27,21,0,63,0,16,32,0,34,17,0,2,0,68,17,17,33,0,35,48,0,11,0,63,17,33,0,36,48,6,32,0,36,0,8,16,0,21,0,63,17,0,33,32,0,31,0,49,0,0,26,16,17,0,9,32,0,30,17,33,0,37,48,0,12,32,0,30,17,33,0,38,48,6,32,0,30,0,2,32,0,27,17,0,21,0,52,0,63,27,0,30,32,0,37,0,21,0,63,17,0,26,0,53,0,10,27,16,0,11,32,0,32,0,21,0,63,17,17,21,0,51,32,1,41,27,32,0,26,17,33,0,39,48,6,34,0,34,0,30,32,0,36,17,0,14,0,52,0,68,27,0,53,0,9,27,0,0,0,19,21,32,0,38,0,11,0,52,0,26,27,16,0,42,0,30,26,32,0,32,17,17,33,0,40,48,6,32,0,37,0,12,32,0,31,17,0,49,0,0,26,16,0,2,32,0,32,0,12,32,0,38,17,17,33,0,41,48,0,11,0,52,0,49,0,6,26,0,27,20,27,16,33,0,42,48,6,32,0,29,0,30,32,0,42,17,0,11,32,0,35,0,30,34,0,36,17,0,14,0,64,17,17,33,0,43,48,6,32,0,31,33,0,44,48,0,9,34,0,37,17,0,10,32,0,42,17,33,0,31,49,6,32,0,29,0,30,32,0,31,17,0,8,16,0,42,0,30,26,33,0,35,50,0,30,0,52,0,11,0,52,0,63,27,27,16,0,14,0,64,17,33,0,45,48,6,32,0,43,0,21,0,63,17,0,33,32,0,41,17,0,11,0,52,32,0,42,27,0,10,0,13,0,52,32,0,29,27,21,16,0,9,32,0,32,0,12,34,0,38,17,17,0,47,0,10,26,0,57,1,13,27,16,6,34,0,42,0,11,32,0,29,17,0,30,16,32,0,27,0,53,0,33,27,0,12,32,1,22,0,34,16,21,0,11,32,0,45,21,0,53,0,19,0,47,0,10,26,20,0,57,1,14,27,27,16,6,34,0,43,0,8,16,0,2,0,52,0,49,0,0,26,27,16,0,21,0,63,17,0,42,0,1,26,0,64,17,0,33,33,0,41,50,6,32,1,8,0,33,32,0,27,17,0,39,34,0,41,17,0,39,0,68,0,21,34,0,45,17,17,0,34,0,54,0,21,0,52,32,0,4,27,27,16,33,0,46,48,6,34,0,18,0,27,16,0,49,0,0,26,16,0,33,34,0,23,0,30,16,0,21,34,0,20,17,17,0,21,34,0,29,0,12,32,0,31,17,0,30,16,0,33,0,52,0,32,27,34,0,35,17,17,33,0,47,48,6,34,0,39,34,0,21,34,0,24,11,3,0,21,34,0,46,17,33,0,48,48,6,32,0,48,0,44,0,35,26,16,33,0,49,48,0,42,0,44,0,30,0,52,0,49,0,6,26,0,27,0,59,21,0,12,0,19,21,27,26,26,33,0,48,50,6,32,0,48,0,34,0,52,0,64,27,0,54,34,0,3,27,16,33,0,48,49,6,32,1,23,32,1,25,32,0,27,17,0,10,32,0,30,17,0,8,16,33,0,50,48,6,34,0,44,0,10,32,0,50,17,0,42,0,30,26,33,0,26,50,6,34,0,30,0,26,0,53,0,12,27,16,0,10,32,0,50,17,0,42,0,30,26,33,0,25,50,6,32,0,27,0,33,0,52,34,0,47,27,0,54,32,0,48,0,44,0,13,26,16,33,0,51,48,0,27,32,1,34,17,0,49,0,0,26,16,0,0,34,0,49,17,0,21,16,0,24,0,52,0,13,27,34,0,4,17,27,16,0,30,34,0,50,0,10,32,0,31,17,17,33,0,27,49,6,32,1,13,0,34,0,53,0,1,27,0,2,32,1,25,21,32,0,27,17,0,1,33,0,27,50,6,32,1,26,0,14,32,0,27,17,0,42,0,21,26,0,13,0,21,21,0,64,17,0,30,16,0,24,0,64,17,0,24,0,59,17,33,0,52,48,0,44,0,64,26,16,0,49,0,13,26,16,33,0,53,48,6,32,0,27,0,33,32,0,53,0,1,32,0,52,17,17,0,0,0,52,32,0,53,27,0,42,0,37,26,32,1,16,0,34,16,0,0,0,69,0,65,11,2,17,21,0,10,32,1,14,0,53,32,1,25,27,21,16,0,26,0,53,0,10,27,16,0,12,34,0,53,17,0,42,0,30,26,34,0,52,17,33,0,54,48,6,32,1,26,0,13,32,0,27,17,0,33,0,52,34,0,54,27,0,54,0,44,0,64,26,27,16,0,42,1,15,26,33,0,27,50,6,34,0,51,0,23,0,68,17,0,47,0,0,26,16,0,22,32,1,34,17,32,1,25,32,0,27,17,0,10,32,1,28,0,14,32,0,27,17,17,33,0,55,48,6,0,63,0,21,32,1,35,17,0,33,32,0,27,0,5,32,1,34,17,17,0,30,0,52,34,0,55,27,0,54,34,0,40,27,16,33,0,56,48,6,32,0,27,0,15,0,52,0,0,0,52,0,69,27,27,0,0,0,65,21,0,2,0,65,0,53,0,22,27,32,1,25,0,19,21,21,32,1,19,0,34,16,17,0,0,33,0,27,50,6,32,0,27,0,14,0,2,0,58,21,0,0,0,11,21,32,1,33,17,0,1,33,0,27,50,6,34,0,27,34,0,56,34,0,48,32,0,26,32,0,25,11,5,7,1,16,33,0,3,48,6,32,1,30,32,1,29,0,52,0,117,27,0,118,32,1,8,0,53,0,33,27,0,119,11,4,26,33,0,4,48,6,32,1,20,0,47,0,25,0,53,0,0,27,26,16,0,21,0,120,0,47,0,1,26,16,0,0,32,1,22,0,34,16,17,17,0,44,32,0,1,0,53,0,14,27,26,16,33,0,5,33,0,6,33,0,7,33,0,8,33,0,9,12,5,48,6,32,1,22,0,34,16,0,11,32,0,1,17,0,10,32,0,5,17,0,8,16,0,10,32,1,28,0,14,32,0,1,17,17,32,0,2,32,0,3,32,0,1,0,53,0,30,27,0,50,34,0,4,27,27,16,6,32,0,1,0,14,0,63,17,33,0,10,48,0,10,32,0,5,17,33,0,11,48,0,10,32,0,6,17,33,0,12,48,6,32,0,11,0,10,32,0,7,17,0,8,16,33,0,13,48,6,32,0,11,0,27,16,0,12,32,0,7,17,32,0,2,32,0,3,0,121,27,16,6,32,0,12,0,10,32,0,7,17,0,9,32,0,12,0,26,0,64,17,17,32,0,2,32,0,3,0,122,27,16,6,32,0,1,0,30,32,0,12,17,0,11,0,52,0,27,27,0,10,0,14,0,52,0,63,27,21,16,0,8,16,32,0,2,0,30,34,0,12,21,32,0,3,0,123,27,16,6,32,0,5,0,27,16,0,12,32,0,7,17,0,10,32,0,10,17,0,26,0,10,34,0,5,0,26,16,0,9,32,0,8,17,21,0,9,0,27,21,0,64,17,0,12,32,0,9,0,10,34,0,8,17,17,34,0,2,34,0,3,0,124,27,16,6,32,0,13,0,9,0,52,0,8,32,1,38,0,51,0,12,27,32,1,21,0,34,16,0,13,32,0,1,17,0,11,32,0,6,17,21,0,15,0,26,21,27,16,33,0,14,48,0,9,0,52,0,49,0,0,26,32,1,36,0,1,0,19,21,0,8,21,0,16,0,73,21,27,16,33,0,15,48,6,32,1,20,0,34,16,0,0,0,64,17,0,1,34,0,1,17,0,2,32,0,15,17,0,30,32,0,6,0,8,16,17,0,42,0,33,26,0,58,0,25,16,0,21,0,74,0,64,11,2,17,0,21,0,59,17,17,33,0,16,48,6,32,0,16,0,49,0,0,0,52,0,58,0,53,0,2,27,27,0,2,0,15,0,52,0,63,27,21,26,0,63,17,0,30,34,0,16,0,15,0,63,17,0,26,0,53,0,12,27,16,17,33,0,17,48,6,34,0,7,0,27,16,0,30,34,0,13,0,27,0,53,0,12,27,16,33,0,18,48,17,0,42,0,33,26,0,64,0,59,11,2,17,0,2,33,0,17,50,6,34,0,10,0,30,34,0,11,17,33,0,19,48,6,34,0,14,0,26,0,53,0,12,27,0,30,20,0,51,0,1,0,52,34,0,6,0,26,16,32,1,38,16,0,53,0,33,27,27,0,19,0,2,0,11,21,0,1,0,52,0,27,27,21,0,1,0,1,21,27,34,0,15,17,0,30,32,0,19,17,33,0,20,48,6,32,0,19,0,8,16,0,2,32,0,17,17,0,26,16,0,30,32,0,19,17,0,42,0,1,26,34,0,20,17,33,0,21,48,0,7,16,0,4,0,58,17,33,0,22,48,6,0,64,0,75,11,2,0,33,34,0,9,0,30,34,0,18,17,17,0,2,34,0,17,17,0,30,34,0,19,17,0,30,0,52,32,0,21,0,11,0,63,17,27,0,54,0,2,27,32,0,22,17,0,30,0,52,34,0,21,0,12,0,63,17,27,0,54,0,42,0,3,26,27,34,0,22,17,7,34,0,2,33,0,3,33,0,4,33,0,5,33,0,6,33,0,7,12,5,48,6,34,0,4,0,13,16,33,0,8,48,6,1,17,33,0,9,48,6,1,18,33,0,10,48,6,32,0,1,0,13,16,0,11,0,63,17,0,40,0,129,17,6,32,1,16,32,1,25,32,0,1,17,0,2,32,0,3,0,2,0,68,17,0,1,0,59,17,17,33,0,11,48,0,49,0,0,26,16,33,0,12,48,0,31,16,33,0,13,48,6,0,59,0,14,32,0,3,17,0,33,32,0,13,17,33,0,14,48,6,32,0,1,0,33,32,0,13,17,33,0,15,48,0,30,0,52,0,63,0,53,0,11,27,27,0,42,0,1,26,0,64,21,0,17,0,57,34,0,9,27,0,30,0,52,0,63,0,53,0,12,27,27,21,32,0,11,0,33,32,0,13,17,17,6,34,0,12,0,34,32,0,13,0,34,16,17,0,15,0,63,17,0,40,0,130,17,6,32,0,15,0,30,32,0,14,17,0,14,0,52,32,1,26,27,0,9,0,52,0,27,27,0,14,0,52,32,1,16,0,34,16,27,21,16,32,0,13,0,30,32,0,14,21,32,0,10,0,131,27,16,6,34,0,14,0,21,0,64,17,0,9,0,52,0,26,0,52,0,64,27,27,16,1,19,16,6,0,67,0,14,32,0,3,17,33,0,16,48,0,10,0,52,0,26,27,16,33,0,17,48,6,32,0,11,0,0,32,0,3,17,0,15,0,63,17,0,11,32,0,16,17,0,26,16,33,0,18,48,0,12,32,1,15,0,34,16,0,14,32,0,1,17,17,0,1,33,0,3,50,6,32,0,3,0,15,0,63,17,0,11,32,0,16,17,0,27,16,0,9,32,1,15,0,34,16,0,0,0,68,17,0,14,32,0,1,17,0,10,34,0,18,17,17,0,12,32,0,3,0,71,0,53,0,15,27,0,9,0,11,0,52,0,76,27,21,16,17,0,13,0,50,0,25,27,32,0,10,0,133,27,16,6,32,1,33,32,0,8,11,2,32,1,25,32,0,1,17,0,26,16,0,12,32,0,16,17,0,13,0,50,0,25,27,32,0,10,0,134,27,16,6,0,71,0,14,32,0,3,17,0,10,0,52,0,26,27,16,33,0,19,48,0,33,0,52,32,0,13,0,33,0,52,32,0,17,0,53,0,33,27,0,31,20,27,16,27,0,54,0,27,27,16,33,0,20,48,6,32,0,20,0,10,32,0,19,17,0,8,16,33,0,21,48,6,32,1,16,0,34,16,0,0,0,64,17,0,14,32,0,1,17,33,0,22,48,6,32,1,18,0,34,16,0,14,32,0,1,17,0,2,0,68,17,0,0,32,1,27,0,34,16,0,0,0,68,17,0,14,32,0,1,17,17,0,33,32,0,22,0,8,16,32,1,37,16,17,33,0,23,48,6,0,63,33,0,24,48,6,32,0,23,0,13,16,0,25,16,33,0,25,48,6,1,20,33,0,26,48,6,32,0,21,0,8,16,0,2,32,0,23,17,32,0,26,0,135,26,16,6,32,0,17,0,10,32,0,19,17,33,0,27,48,0,33,32,0,13,17,0,31,16,0,42,0,33,26,33,0,13,50,6,32,0,3,0,13,16,0,25,16,0,33,0,52,32,0,13,27,0,54,0,27,0,52,0,13,27,27,16,33,0,28,48,6,0,59,0,14,32,0,3,17,0,10,34,0,27,17,0,33,32,0,13,17,0,21,0,64,17,0,0,0,52,0,49,0,0,26,27,16,0,31,16,0,42,0,33,26,0,8,0,31,0,53,0,42,0,33,26,27,21,0,33,0,52,0,31,27,0,18,21,32,0,13,0,21,0,59,17,17,0,24,0,59,17,0,49,0,0,26,16,0,31,16,33,0,29,48,6,32,1,16,0,34,16,0,0,0,68,17,0,68,11,2,32,1,25,32,0,1,17,0,2,32,0,11,17,0,33,32,0,29,17,33,0,30,48,0,49,0,0,26,16,33,0,31,48,0,31,16,33,0,32,48,6,32,0,32,0,42,0,33,26,33,0,29,50,6,32,0,32,0,42,0,33,26,33,0,31,50,6,32,0,32,0,42,0,33,26,33,0,30,50,6,32,0,29,0,42,0,33,26,33,0,1,50,6,32,0,29,0,42,0,33,26,33,0,16,50,6,32,0,29,0,42,0,33,26,33,0,5,50,6,32,0,29,0,42,0,33,26,33,0,6,50,6,32,0,11,0,33,32,0,29,17,0,42,0,1,26,32,0,30,17,33,0,11,49,0,49,0,0,26,16,0,31,16,33,0,13,49,6,32,0,16,0,10,0,52,0,26,27,16,0,33,32,0,13,17,0,31,16,0,42,0,33,26,33,0,13,50,6,32,0,29,0,33,32,0,13,17,33,0,33,48,6,32,0,19,0,1,32,0,20,17,0,33,32,0,33,17,0,12,0,30,0,51,0,1,27,0,11,21,0,63,17,0,42,0,3,26,0,68,17,0,0,0,64,17,33,0,34,48,6,32,1,16,0,34,16,0,0,0,65,17,0,14,32,0,1,17,0,33,32,0,13,17,0,30,16,33,0,35,48,6,0,63,0,12,32,0,30,17,33,0,36,48,6,0,63,0,11,34,0,30,17,0,30,16,33,0,37,48,6,34,0,11,0,33,32,0,13,17,0,12,32,0,13,0,53,0,30,27,0,11,20,0,51,0,22,27,0,11,21,0,63,17,0,44,0,21,26,32,0,36,0,30,16,32,0,37,11,2,17,33,0,38,48,6,32,0,19,0,33,32,0,33,17,0,31,16,33,0,39,48,0,42,0,33,26,33,0,13,50,6,32,0,29,0,33,32,0,13,17,33,0,33,49,6,32,0,13,0,31,16,33,0,40,48,6,32,1,14,0,34,16,0,14,32,0,1,17,33,0,41,48,6,32,1,14,0,34,16,0,0,0,64,17,0,14,32,0,1,17,33,0,42,48,6,32,1,14,0,34,16,0,0,0,68,17,0,14,32,0,1,17,33,0,43,48,6,32,0,43,0,10,32,0,42,17,0,10,32,0,41,17,0,11,32,0,36,0,49,0,10,26,16,17,0,13,0,50,0,25,27,32,0,10,0,136,27,16,6,32,0,42,0,10,34,0,36,17,33,0,44,48,0,49,0,0,26,16,33,0,45,48,6,0,19,32,1,39,0,50,0,8,27,32,0,44,21,33,0,46,48,6,32,0,41,32,0,46,16,33,0,47,48,0,10,34,0,43,32,0,46,16,17,33,0,48,48,6,32,0,42,0,30,32,0,44,17,33,0,49,48,0,8,16,0,21,0,64,17,33,0,50,48,6,32,0,49,0,26,0,53,0,10,27,16,0,21,0,63,17,33,0,51,48,6,32,0,48,0,24,0,9,32,0,49,21,0,11,0,24,0,52,0,1,27,21,0,64,17,32,0,44,0,30,20,32,0,10,0,137,27,16,6,32,0,48,0,24,0,59,17,0,12,32,0,49,17,0,9,0,52,0,27,27,16,32,0,44,0,30,20,32,0,10,0,138,27,16,6,34,0,42,0,30,16,0,21,32,0,37,17,0,33,34,0,49,0,26,16,0,31,16,0,31,16,17,33,0,52,48,6,32,0,41,0,10,32,0,44,17,0,33,0,52,32,0,13,0,28,16,27,0,54,32,1,37,0,53,0,42,0,33,26,27,27,34,0,41,17,33,0,53,48,0,30,16,33,0,54,48,6,32,0,1,0,33,32,0,54,17,0,35,0,1,0,18,0,50,0,13,27,21,32,1,32,17,33,0,55,48,0,14,0,63,17,33,0,56,48,6,32,0,55,0,14,0,52,0,68,27,0,9,32,0,56,0,27,0,64,17,21,0,10,0,16,0,52,0,27,27,21,16,0,11,32,0,56,17,32,0,54,32,0,10,0,139,27,16,6,32,0,55,0,27,16,0,30,34,0,56,17,33,0,57,48,6,34,0,55,0,14,0,63,17,0,42,0,30,26,33,0,54,50,6,32,0,54,0,42,0,33,26,32,0,29,17,32,0,3,0,53,0,33,27,0,2,32,0,21,0,53,0,33,27,21,16,33,0,58,48,6,32,0,58,0,14,0,59,17,33,0,59,48,0,26,0,0,0,27,0,52,0,64,27,21,16,33,0,60,48,0,14,0,68,17,33,0,61,48,6,32,0,53,0,33,32,0,54,0,30,32,0,59,17,0,0,0,64,17,17,32,0,54,0,30,32,0,59,21,32,0,10,0,140,27,16,6,32,0,58,0,15,0,68,17,33,0,62,48,0,11,32,0,61,17,0,19,0,9,0,69,0,14,32,0,58,17,21,0,26,20,0,10,0,27,21,16,33,0,63,48,6,34,0,62,0,10,32,0,59,17,0,9,32,0,63,17,32,0,54,32,0,10,0,141,27,16,6,34,0,60,0,14,0,64,17,0,9,32,0,58,0,14,0,63,17,17,0,11,32,0,63,17,33,0,64,48,0,10,32,0,63,17,0,8,16,33,0,65,48,6,32,0,59,0,30,32,0,65,17,0,14,0,52,0,27,0,52,0,64,27,27,16,32,0,54,0,30,32,0,65,21,32,0,10,0,142,27,16,6,32,0,20,0,33,32,0,29,17,0,8,16,0,2,32,0,1,17,0,33,32,0,54,17,33,0,66,48,0,31,32,0,8,0,21,32,1,27,17,0,49,0,0,26,16,17,0,42,0,1,26,0,64,17,0,7,0,69,17,33,0,67,48,6,32,0,67,0,13,0,64,17,0,9,32,0,58,0,14,0,63,17,17,0,9,32,0,61,17,33,0,68,48,0,0,33,0,64,50,0,12,32,0,65,17,33,0,69,48,6,32,0,68,0,0,33,0,58,50,6,32,0,58,0,5,0,68,17,0,42,0,1,26,0,64,17,0,2,0,69,17,0,2,32,0,69,17,0,0,32,0,58,0,14,0,69,17,0,26,16,0,0,0,67,17,0,2,34,0,63,17,17,0,0,32,0,59,0,26,16,0,11,32,0,68,17,0,0,0,64,17,0,2,32,0,64,17,17,33,0,70,48,6,32,1,27,0,34,16,0,0,32,0,70,17,0,13,34,0,66,17,0,9,32,0,67,0,14,0,63,17,17,32,0,54,32,0,10,0,143,27,16,6,32,0,58,0,14,0,63,17,0,9,32,0,61,17,0,10,32,0,59,17,0,8,16,0,2,33,0,67,50,6,32,0,59,0,12,33,0,65,50,6,32,0,65,0,42,0,30,26,33,0,58,50,6,32,0,64,0,30,32,0,59,0,27,0,64,17,17,33,0,71,48,6,32,0,50,0,26,0,11,0,19,21,0,64,17,0,11,32,0,48,0,27,16,17,0,26,0,53,0,1,27,16,0,0,0,64,17,33,0,72,48,6,32,0,72,0,30,0,52,32,0,47,27,0,54,32,0,67,0,13,0,63,17,33,0,73,48,0,0,0,64,17,0,2,32,0,64,17,0,6,32,0,61,17,0,2,0,52,0,8,27,34,0,68,17,0,27,16,0,30,32,0,59,17,27,16,33,0,72,49,6,32,0,57,0,2,16,0,11,32,0,65,17,32,0,54,32,0,10,0,139,27,16,6,32,0,72,0,44,0,63,26,16,0,30,0,52,32,0,47,27,0,54,34,0,57,0,30,32,0,65,17,27,16,33,0,74,48,6,32,0,74,0,14,0,68,17,0,2,0,68,17,0,6,33,0,72,50,6,0,63,0,21,32,0,71,17,0,33,0,52,0,49,0,0,26,27,32,0,59,17,0,12,34,0,64,17,32,0,54,32,0,10,0,144,27,16,6,0,68,0,13,32,0,67,17,0,12,34,0,69,17,32,0,54,32,0,10,0,145,27,16,6,32,0,58,0,14,0,64,17,0,10,33,0,71,50,6,32,0,53,0,33,0,52,32,0,54,27,0,54,32,0,73,0,8,16,27,16,33,0,75,48,6,34,0,54,0,30,32,0,73,17,0,42,0,33,26,32,0,40,17,33,0,76,48,6,34,0,67,0,30,32,0,73,17,0,14,0,68,17,33,0,77,48,6,32,1,27,0,34,16,0,0,0,69,17,0,14,32,0,1,17,0,9,0,69,0,14,32,0,3,17,0,33,32,0,29,17,17,33,0,78,48,6,0,14,0,52,32,0,1,0,31,32,1,27,0,34,16,0,0,0,63,0,69,0,65,0,72,11,4,17,17,0,0,34,0,78,17,27,32,0,46,20,33,0,79,48,6,32,1,27,32,1,25,32,0,1,17,0,11,32,0,53,17,0,30,16,33,0,80,48,6,0,64,32,0,79,16,33,0,81,48,6,0,69,34,0,79,0,51,0,19,0,2,0,68,21,0,6,0,18,21,27,0,68,17,33,0,82,48,0,0,0,52,0,11,0,52,0,63,27,0,10,32,0,81,21,27,16,33,0,83,48,6,32,0,81,0,30,32,0,47,17,0,11,32,0,71,17,0,11,34,0,61,0,30,34,0,65,17,17,0,10,32,0,83,0,30,32,0,47,17,0,11,32,0,58,17,17,32,0,44,0,50,0,30,27,0,21,0,63,21,0,30,32,0,47,21,32,0,10,0,146,27,16,6,32,0,83,0,30,0,52,32,0,47,27,0,54,34,0,58,27,16,33,0,83,49,0,42,0,1,26,0,64,17,0,6,33,0,82,50,6,32,0,81,0,30,0,52,32,0,47,27,0,54,0,6,0,52,34,0,71,27,27,16,33,0,81,49,6,32,0,83,0,34,16,0,11,0,63,17,32,0,1,0,50,1,21,27,0,30,20,32,0,10,0,147,27,16,6,32,0,81,0,12,32,0,51,17,0,11,32,0,47,0,12,34,0,48,17,0,10,0,52,0,27,27,16,17,0,24,0,64,17,32,0,44,0,30,20,32,0,10,0,148,27,16,6,32,0,82,0,13,0,52,0,27,27,16,0,11,32,0,50,17,0,24,0,64,17,32,0,44,0,30,20,32,0,10,0,149,27,16,6,32,0,81,0,2,0,69,17,0,0,0,63,0,68,0,69,11,3,0,33,32,0,82,17,17,33,0,84,48,6,32,0,81,0,30,34,0,47,17,0,8,16,0,2,0,69,17,0,33,34,0,59,0,49,0,0,26,16,0,27,16,17,0,1,33,0,70,50,6,32,0,3,0,33,0,52,32,0,29,0,33,32,0,37,17,27,0,54,34,0,83,0,30,32,0,50,17,0,24,0,64,17,27,16,0,2,32,0,21,17,0,42,0,1,26,32,0,19,17,33,0,3,49,6,34,0,21,0,9,34,0,22,17,33,0,85,48,6,0,63,0,11,32,0,3,17,0,42,0,21,26,0,64,17,0,33,32,0,28,17,33,0,86,48,0,27,16,0,9,32,0,85,17,33,0,87,48,6,32,0,3,0,33,32,0,87,0,8,16,32,1,37,16,17,0,2,32,0,87,17,0,0,32,0,3,17,0,19,0,15,0,68,21,0,11,32,0,86,21,0,1,0,19,21,0,6,0,19,0,14,0,69,21,0,2,34,0,86,0,0,0,64,17,21,0,42,0,21,26,0,63,21,0,33,34,0,28,21,21,16,33,0,88,48,6,32,0,88,0,33,0,0,0,6,0,64,21,0,5,0,19,21,34,0,87,0,8,16,0,49,0,0,26,16,0,53,0,19,0,1,0,33,21,27,21,0,63,0,14,32,0,88,17,0,9,32,0,85,17,0,8,16,32,1,37,16,17,0,6,33,0,88,50,6,32,0,88,0,27,16,0,2,34,0,85,17,0,0,33,0,3,50,6,32,0,23,0,14,0,64,17,0,9,32,0,88,0,13,0,63,17,17,0,10,33,0,24,50,0,8,16,0,2,33,0,23,50,6,32,0,23,0,1,32,0,23,0,14,0,63,17,0,2,32,0,88,17,17,33,0,88,49,6,0,59,0,14,32,0,3,17,0,27,0,64,17,0,9,0,76,0,14,32,0,3,17,17,0,1,33,0,3,50,6,0,63,0,14,32,0,3,17,0,27,16,0,12,0,67,0,14,32,0,3,17,17,32,0,29,0,50,0,31,27,32,0,10,0,150,27,16,6,34,0,17,0,19,0,1,0,8,0,53,0,2,27,21,33,0,3,50,6,32,1,33,0,1,32,0,1,17,33,0,89,48,6,34,0,38,0,47,1,22,26,16,6,32,0,13,0,42,0,33,26,33,0,1,50,6,34,0,53,0,33,32,0,13,17,33,0,90,48,6,32,0,33,0,42,0,33,26,33,0,3,50,6,32,0,33,0,42,0,33,26,33,0,88,50,6,34,0,19,0,12,34,0,20,17,0,33,32,0,33,17,0,30,16,0,21,34,0,39,0,31,16,0,33,32,0,35,17,17,33,0,35,49,6,32,0,3,0,70,0,53,0,15,27,0,9,0,11,0,52,0,77,27,21,16,33,0,91,48,6,0,63,0,11,32,0,3,17,0,11,32,0,91,17,33,0,92,48,6,32,0,92,0,27,16,32,1,37,16,0,42,0,33,26,32,0,88,17,33,0,93,48,0,15,0,64,17,33,0,94,48,6,32,0,88,0,1,16,0,6,0,63,17,33,0,95,48,6,32,0,93,0,1,16,0,6,0,63,17,33,0,96,48,6,32,0,13,33,0,25,49,6,34,0,33,0,42,0,33,26,33,0,24,50,6,32,0,91,0,2,32,0,96,17,32,0,26,0,151,26,16,6,0,68,0,16,32,0,3,17,0,9,0,68,0,11,32,0,93,17,17,33,0,97,48,0,11,32,0,90,17,0,30,16,0,28,16,33,0,98,48,6,0,69,0,14,32,0,3,17,33,0,99,48,0,9,32,0,97,17,0,26,16,0,10,32,0,97,17,33,0,100,48,6,0,68,0,25,16,0,37,32,0,3,17,0,10,32,0,100,17,0,16,32,0,99,17,0,2,0,68,17,0,6,32,0,95,17,0,27,0,2,34,0,99,21,0,6,0,26,21,0,68,17,0,2,32,0,97,17,32,0,26,0,152,26,16,6,32,1,26,0,14,32,0,1,17,33,0,101,48,6,32,1,16,0,34,16,0,0,0,68,17,32,1,14,0,34,16,0,0,0,64,17,11,2,0,37,32,0,1,17,33,0,102,48,6,32,1,16,0,34,16,0,0,0,67,17,0,14,32,0,1,17,33,0,103,48,32,1,37,0,51,0,11,27,32,0,102,17,0,9,32,0,101,17,33,0,104,48,6,32,0,104,0,10,32,0,103,17,0,27,16,0,2,32,0,96,17,34,0,26,0,153,26,16,6,0,63,0,14,32,0,3,17,0,11,0,52,0,10,0,52,0,27,27,27,32,0,100,17,0,26,0,53,0,9,27,16,32,0,13,32,0,10,0,154,27,16,6,32,1,15,0,34,16,0,0,0,68,17,0,14,32,0,1,17,33,0,105,48,6,0,64,0,16,34,0,88,17,0,26,16,0,9,32,0,105,17,0,11,32,0,94,17,33,0,106,48,6,32,0,92,0,27,0,64,17,0,9,33,0,105,50,6,32,0,105,0,11,32,0,106,17,32,0,13,32,0,10,0,155,27,16,6,32,0,106,0,10,32,0,100,17,0,8,16,0,28,0,54,32,1,36,0,1,0,18,21,0,52,0,13,0,50,0,25,27,27,27,16,33,0,107,48,6,32,0,91,0,30,16,33,0,108,48,0,0,0,52,32,0,107,0,53,0,33,27,27,16,0,0,0,64,17,33,0,109,48,6,32,0,3,0,33,32,0,108,17,0,13,0,76,17,33,0,110,48,6,32,0,3,0,33,32,0,109,17,33,0,111,48,6,32,0,93,0,33,32,0,109,17,0,6,0,63,17,0,13,32,0,111,17,0,9,32,0,110,17,32,0,13,0,33,32,0,109,21,32,0,10,0,156,27,16,6,32,0,1,0,33,32,0,108,17,0,42,0,1,26,32,1,15,0,34,16,17,0,0,32,0,106,0,33,32,0,108,17,17,0,0,34,0,111,0,15,0,63,17,17,0,0,32,0,110,17,33,0,112,48,6,32,0,76,0,21,33,0,109,50,6,32,0,1,0,44,0,63,26,16,0,33,0,52,32,0,109,27,0,54,32,0,76,0,44,0,72,26,16,0,21,32,0,112,17,27,16,0,1,0,52,0,26,27,16,33,0,113,48,6,32,0,113,0,33,32,0,40,17,0,2,0,52,0,49,0,0,26,0,14,0,63,21,0,10,0,52,0,27,0,52,0,64,27,27,20,27,16,0,49,0,0,26,16,0,27,16,33,0,113,49,0,33,32,0,13,17,33,0,114,48,0,2,16,33,0,115,48,6,32,0,113,0,14,0,72,17,33,0,116,48,0,2,0,69,17,0,1,33,0,113,50,6,32,1,15,0,34,16,0,42,0,1,26,32,1,33,17,0,14,32,0,89,17,0,11,32,0,113,17,32,0,46,16,33,0,117,48,6,32,0,24,0,33,32,0,40,17,34,0,46,16,33,0,118,48,6,32,0,29,0,33,32,0,52,17,0,21,0,63,17,0,42,0,1,26,0,64,17,1,23,16,6,32,0,118,33,0,119,48,6,32,0,50,32,1,38,0,51,0,16,27,33,0,118,50,6,0,63,0,14,32,0,72,17,0,9,32,0,118,17,0,24,0,64,17,32,0,44,0,30,20,32,0,10,0,158,0,159,11,2,0,55,0,11,0,52,34,0,119,0,24,0,64,17,27,0,47,0,10,26,20,27,27,16,6,32,0,118,0,2,0,68,17,0,6,33,0,72,50,6,32,0,81,0,2,33,0,72,50,6,32,0,72,0,14,0,68,17,0,33,0,52,0,49,0,0,26,27,32,0,102,17,33,0,120,48,6,32,0,120,0,14,0,1,0,18,21,33,0,95,50,6,34,0,120,0,14,0,1,0,18,21,33,0,96,50,6,32,1,33,0,1,32,0,1,17,32,0,8,0,53,0,11,27,0,9,0,15,0,52,0,78,27,21,16,33,0,121,48,6,32,1,33,0,0,32,0,8,17,0,16,32,0,1,17,0,9,34,0,116,0,33,32,0,13,17,17,33,0,122,48,0,30,16,33,0,123,48,6,32,1,16,32,1,25,0,11,0,34,0,0,0,69,21,0,53,0,14,27,21,32,0,1,17,0,10,32,1,17,0,34,16,0,14,32,0,1,17,0,26,16,0,12,32,0,92,17,17,0,10,34,0,122,17,0,10,34,0,121,17,0,11,0,63,0,16,32,0,3,17,0,9,32,0,115,17,0,26,16,0,11,32,0,92,17,0,11,32,0,90,17,17,33,0,124,48,6,32,0,115,0,11,34,0,124,0,10,32,0,91,17,17,32,0,13,32,0,10,0,160,27,16,6,32,0,115,0,33,32,0,108,17,0,11,0,68,0,14,34,0,112,17,0,9,34,0,114,0,33,32,0,108,17,0,13,0,65,17,17,17,32,0,13,0,33,32,0,108,21,32,0,10,0,161,27,16,6,32,0,115,0,12,0,52,0,27,27,16,0,9,32,0,3,0,15,0,63,17,17,0,9,32,0,93,0,11,0,63,17,17,0,11,32,0,90,17,32,0,13,32,0,10,0,162,27,16,6,32,0,115,0,33,32,0,108,17,33,0,125,48,0,12,33,0,110,50,6,32,0,108,0,30,34,0,125,17,33,0,126,48,6,32,0,110,0,42,0,30,26,33,0,108,50,6,32,0,76,0,44,0,64,26,16,0,21,34,0,110,17,0,42,0,30,26,33,0,109,50,6,34,0,16,0,27,16,33,0,127,48,0,30,16,33,0,128,48,6,32,0,89,32,0,8,0,53,0,11,27,0,9,0,15,0,52,0,63,27,21,16,0,11,34,0,91,0,9,32,0,115,17,0,26,16,0,33,32,0,40,17,0,10,34,0,127,17,0,10,34,0,75,17,17,0,30,16,33,0,129,48,6,32,0,113,0,33,32,0,80,17,33,0,130,48,0,11,0,63,17,33,0,131,48,6,0,68,0,68,11,2,32,1,25,34,0,113,0,33,32,0,129,17,33,0,132,48,17,33,0,133,48,6,0,67,0,11,34,0,130,17,0,9,32,0,131,17,32,0,80,32,0,10,0,163,27,16,6,32,0,45,0,33,32,0,129,17,33,0,134,48,6,32,0,89,0,33,32,0,129,17,33,0,135,48,6,32,0,7,0,13,16,0,11,32,0,135,17,0,9,32,0,134,0,14,0,63,17,17,0,9,32,0,133,17,33,0,136,48,6,32,0,7,0,33,32,0,135,0,30,32,0,136,17,17,33,0,137,48,0,14,0,63,17,32,0,129,0,30,32,0,136,21,32,0,10,0,164,27,16,6,32,0,133,0,30,0,52,34,0,136,27,0,54,34,0,137,0,15,0,63,17,27,16,33,0,133,49,6,0,63,0,15,32,0,7,17,0,30,16,33,0,138,48,0,44,0,63,26,16,33,0,139,48,6,32,0,135,0,30,32,0,133,17,33,0,140,48,0,21,32,0,138,17,0,39,32,0,84,0,13,16,0,21,32,0,134,0,30,32,0,133,17,33,0,141,48,17,0,21,32,0,139,17,33,0,142,48,17,33,0,143,48,6,32,0,32,0,33,34,0,52,17,0,42,0,1,26,0,64,17,0,21,32,0,1,0,13,16,17,0,33,32,0,141,17,0,21,34,0,32,0,30,34,0,44,17,0,21,0,59,17,0,33,34,0,134,17,0,0,32,0,132,0,14,0,64,17,17,17,33,0,144,48,6,32,0,144,0,31,16,0,33,0,52,32,0,140,0,21,32,0,135,17,33,0,145,48,0,53,0,33,27,0,31,20,27,16,33,0,146,48,6,32,0,146,0,30,0,52,0,15,0,52,32,0,133,0,13,16,27,27,16,1,24,16,6,32,0,146,0,33,34,0,140,0,44,0,59,26,16,0,21,32,0,133,17,0,33,32,0,146,17,0,49,0,0,26,16,33,0,147,48,0,31,16,17,0,30,0,52,32,0,133,0,13,16,0,53,0,11,27,27,16,33,0,146,49,6,32,0,146,0,42,0,33,26,33,0,133,50,6,32,0,146,0,42,0,33,26,33,0,129,50,6,32,0,146,0,42,0,33,26,33,0,132,50,6,34,0,147,0,11,0,63,17,0,10,0,52,0,27,27,16,0,8,16,0,47,0,0,26,16,33,0,148,48,6,34,0,135,0,33,32,0,146,0,23,32,0,148,17,17,33,0,149,48,6,32,0,7,0,13,16,0,16,32,0,149,17,32,0,129,0,23,32,0,148,21,32,0,10,32,0,149,0,53,0,30,27,0,38,20,32,1,29,0,165,21,27,16,6,32,0,132,0,11,0,63,17,33,0,150,48,0,9,0,69,0,11,34,0,132,17,17,33,0,151,48,6,34,0,31,0,33,32,0,129,17,0,33,0,52,32,0,133,32,1,37,16,0,24,32,0,148,17,27,0,21,34,0,7,0,6,0,63,17,0,1,16,33,0,152,48,0,33,32,0,149,17,21,0,1,0,19,21,16,33,0,153,48,6,32,0,153,0,11,0,63,17,0,9,32,0,151,17,32,0,129,32,0,10,0,166,27,16,6,34,0,151,32,1,39,0,24,0,64,21,0,16,0,30,21,32,0,133,17,33,0,154,48,0,33,34,0,146,0,30,32,0,133,17,0,31,16,33,0,155,48,17,0,21,34,0,139,17,0,39,34,0,142,17,33,0,156,48,6,34,0,141,0,21,34,0,152,17,0,36,0,0,32,0,84,0,53,0,33,27,21,16,0,19,0,24,0,52,0,13,27,34,0,138,21,0,33,0,52,0,31,27,34,0,155,21,0,33,32,0,133,0,24,34,0,148,17,0,49,0,0,26,0,59,17,21,0,21,0,33,0,52,34,0,149,27,21,16,33,0,157,48,6,32,0,153,0,11,0,63,17,32,1,39,0,11,34,0,154,0,21,0,64,17,21,0,33,0,52,0,49,0,0,26,27,0,18,21,32,0,133,17,0,9,32,0,133,0,26,0,64,17,0,11,32,0,150,17,17,33,0,158,48,6,32,0,89,0,33,32,0,80,17,0,0,0,69,17,0,0,32,0,81,0,2,0,69,17,0,33,32,0,45,0,33,32,0,80,17,33,0,159,48,17,17,33,0,160,48,6,34,0,159,0,2,0,72,17,0,0,32,0,160,17,0,28,0,54,0,37,27,16,0,21,33,0,158,50,6,0,64,0,1,32,0,76,17,0,42,0,33,26,32,0,13,17,0,0,0,64,17,32,0,128,32,0,80,0,21,32,0,129,17,11,3,0,30,0,69,0,68,0,69,11,3,17,0,21,16,33,0,161,48,6,34,0,131,0,21,34,0,150,17,0,12,0,2,0,68,21,0,0,0,19,21,34,0,158,17,0,0,0,79,17,33,0,162,48,6,32,0,76,0,44,0,79,26,16,32,0,76,0,44,0,63,26,16,34,0,70,0,30,34,0,73,17,32,0,128,0,44,0,80,26,16,34,0,89,0,33,34,0,128,17,34,0,162,34,0,80,0,44,0,63,26,16,0,21,34,0,153,17,34,0,160,0,21,34,0,157,17,11,8,33,0,163,48,6,32,0,100,0,8,16,0,49,0,0,26,16,32,1,36,0,1,0,19,21,32,0,92,17,0,7,0,10,0,12,21,0,68,17,0,9,32,0,94,17,33,0,164,48,6,34,0,97,0,27,16,0,10,0,64,0,14,32,0,3,17,17,33,0,165,48,0,11,32,0,115,0,11,32,0,92,17,0,10,0,52,0,26,27,16,0,10,32,0,100,17,0,10,34,0,164,17,0,10,32,0,90,17,33,0,166,48,17,0,30,16,33,0,167,48,6,34,0,165,0,10,34,0,166,17,0,12,32,0,94,17,32,0,13,32,0,10,0,167,27,16,6,0,63,0,14,32,0,3,17,0,11,32,0,100,17,0,10,0,63,0,16,32,0,3,17,0,9,34,0,94,17,17,0,8,16,0,2,0,68,17,0,6,34,0,95,17,0,26,0,68,17,0,33,32,0,167,17,33,0,168,48,0,13,0,68,17,33,0,169,48,6,32,1,26,0,11,32,0,1,17,0,11,34,0,90,17,0,30,16,33,0,170,48,0,42,0,33,26,32,0,1,17,33,0,171,48,0,9,16,0,38,16,33,0,172,48,0,27,0,1,0,19,21,0,59,17,0,30,16,0,33,34,0,171,17,33,0,173,48,6,34,0,8,0,0,32,1,33,17,33,0,174,48,0,16,32,0,1,17,0,30,16,33,0,175,48,0,21,34,0,170,17,33,0,176,48,6,32,0,1,0,33,34,0,175,17,0,0,32,0,172,0,13,16,0,42,0,1,26,34,0,174,17,17,0,21,33,0,173,50,6,34,0,40,0,33,34,0,37,17,33,0,177,48,6,0,63,0,21,32,0,104,17,0,49,0,0,26,16,0,30,0,64,0,21,32,0,103,17,17,0,24,0,64,17,0,27,0,53,0,1,27,16,0,0,34,0,92,0,26,0,64,17,0,30,34,0,103,17,0,8,16,17,0,42,0,21,26,34,0,34,17,33,0,178,48,6,0,77,0,14,32,0,3,17,0,27,16,0,10,34,0,104,17,0,10,32,0,96,0,14,0,68,17,17,0,12,34,0,101,17,0,30,16,0,21,34,0,76,0,30,0,52,0,8,27,32,0,77,17,17,33,0,179,48,6,34,0,102,0,30,16,33,0,180,48,6,32,1,14,0,34,16,0,0,0,68,17,0,14,32,0,1,17,0,30,16,33,0,181,48,6,32,0,169,0,0,32,0,167,17,0,0,0,52,32,0,107,0,53,0,33,27,0,2,32,0,169,21,27,16,33,0,182,48,6,32,0,182,0,30,34,0,96,0,33,32,0,167,17,33,0,183,48,0,14,0,68,17,33,0,184,48,0,2,32,0,169,0,0,0,64,17,17,17,0,21,33,0,179,50,6,32,0,184,0,8,16,33,0,184,49,6,32,0,184,0,42,0,30,26,33,0,167,50,6,32,0,184,0,42,0,30,26,33,0,182,50,6,34,0,77,0,1,16,0,21,34,0,105,0,0,32,0,106,17,0,0,32,0,1,17,0,33,34,0,108,17,0,42,0,1,26,32,1,15,0,34,16,0,0,0,64,17,17,0,6,0,63,17,17,0,0,0,81,17,33,0,185,48,6,32,0,176,32,0,176,32,0,177,32,0,177,32,0,123,32,0,35,0,30,0,68,17,32,0,109,32,0,179,32,0,181,0,64,0,0,32,0,126,17,0,64,0,0,32,0,126,17,34,0,107,0,33,32,0,98,17,0,6,0,64,17,0,0,32,0,98,17,34,0,182,32,0,180,11,14,0,21,16,0,42,0,33,26,32,0,13,17,0,21,34,0,161,17,33,0,186,48,0,31,16,33,0,187,48,6,34,0,176,0,44,0,63,26,16,34,0,173,32,0,177,0,44,0,64,26,16,34,0,177,0,13,16,0,25,16,0,0,0,64,17,34,0,123,0,44,0,82,26,16,34,0,178,0,22,34,0,115,0,33,34,0,35,17,0,0,0,60,17,17,0,29,16,0,20,16,34,0,185,34,0,179,0,44,0,72,26,16,34,0,181,0,44,0,83,26,16,32,0,126,0,44,0,84,26,16,34,0,1,0,33,0,64,0,1,34,0,126,17,17,0,42,0,1,26,32,1,33,17,34,0,3,0,33,32,0,98,17,0,0,0,85,17,34,0,93,0,33,32,0,167,17,0,11,0,63,17,0,2,0,67,17,0,0,34,0,168,0,14,0,64,17,0,6,34,0,183,17,0,2,0,68,17,0,0,34,0,169,17,0,30,34,0,184,17,17,0,0,0,86,17,32,0,117,0,0,0,87,17,33,0,188,48,0,24,0,59,17,11,14,0,21,34,0,163,17,0,21,16,0,33,32,0,187,17,33,0,189,48,6,0,19,0,42,0,33,26,32,0,13,21,0,21,0,13,0,53,0,42,0,24,0,52,0,1,27,26,27,21,33,0,190,48,6,34,0,109,0,42,0,1,26,0,64,17,34,0,98,32,0,167,11,3,0,21,16,32,0,190,32,0,5,0,13,16,0,42,0,1,26,0,64,17,0,5,34,0,186,17,0,28,0,52,0,13,0,50,0,1,27,27,32,0,180,17,17,33,0,191,48,6,32,0,5,32,0,6,11,2,0,44,0,33,0,52,0,28,0,52,32,0,180,0,13,16,27,0,33,32,0,187,21,0,42,0,21,26,0,59,21,27,26,32,0,191,34,0,106,0,10,34,0,100,17,0,8,16,0,27,16,32,1,37,16,0,33,34,0,167,17,34,0,190,34,0,191,17,11,2,17,33,0,192,48,6,32,0,72,0,13,0,64,17,0,9,32,0,81,17,0,10,33,0,51,50,0,30,16,33,0,193,48,0,42,0,33,26,34,0,72,17,33,0,194,48,0,14,0,64,17,0,0,0,64,17,33,0,195,48,0,30,16,33,0,196,48,6,34,0,194,0,11,0,64,17,0,0,34,0,74,0,33,32,0,193,17,0,2,0,68,17,17,0,5,0,67,17,33,0,197,48,6,32,0,50,0,33,32,0,193,17,33,0,198,48,0,49,0,0,26,0,59,17,33,0,199,48,6,32,0,197,0,0,34,0,195,17,0,33,0,52,0,32,0,50,0,33,0,52,32,0,199,0,53,0,33,27,0,31,20,0,30,34,0,198,21,27,27,27,16,0,6,32,0,81,0,30,32,0,51,0,9,32,0,50,17,17,0,8,16,0,1,0,68,17,17,33,0,200,48,6,32,0,193,0,33,32,0,196,17,0,39,32,0,200,0,49,0,0,26,16,0,21,0,63,17,0,24,0,33,34,0,199,21,0,0,34,0,197,21,0,33,0,0,0,18,0,50,0,36,27,21,34,0,196,21,0,42,0,21,26,0,23,21,0,59,17,17,0,39,0,52,0,30,27,34,0,200,17,33,0,193,49,6,34,0,82,0,30,32,0,50,17,34,0,81,0,8,16,0,30,32,0,50,17,32,0,50,0,30,16,0,30,0,52,34,0,51,0,30,34,0,50,17,27,0,54,34,0,193,27,16,11,3,33,0,201,48,6,34,0,180,0,13,0,51,0,1,27,32,0,189,17,0,16,34,0,187,17,0,21,0,64,17,0,30,16,32,0,143,0,44,0,13,26,16,0,0,34,0,84,17,34,0,143,34,0,156,11,4,33,0,202,48,6,34,0,188,0,34,0,59,17,0,21,34,0,189,17,34,0,172,34,0,201,34,0,202,34,0,192,11,5,7,11,0,0,44,0,168,0,50,0,40,27,26,11,0,0,63,0,25,16,11,4,33,0,3,48,6,34,0,2,0,13,0,11,0,67,21,0,57,0,11,0,51,0,22,27,27,16,0,41,34,0,3,26,0,24,0,13,21,0,53,0,21,27,16,33,0,4,33,0,5,33,0,6,33,0,7,12,4,48,6,34,0,1,32,1,40,34,0,5,32,0,6,11,2,17,33,0,8,48,33,0,9,33,0,10,33,0,11,33,0,12,33,0,13,12,5,48,6,34,0,9,32,1,42,34,0,10,32,0,11,0,34,16,34,0,12,34,0,13,34,0,6,0,44,0,63,26,16,0,27,34,0,7,17,11,5,17,33,0,14,33,0,15,33,0,16,33,0,17,33,0,18,12,5,48,6,34,0,14,34,0,11,0,24,0,64,17,0,21,34,0,4,0,33,34,0,15,17,11,1,17,0,21,16,34,0,16,0,12,16,0,29,16,0,43,0,11,26,16,34,0,17,0,12,16,0,29,16,0,43,0,11,26,16,34,0,18,34,0,8,11,6,7,34,0,1,34,0,2,16,7,32,0,1,0,33,0,52,32,0,2,0,30,34,0,1,19,27,0,54,0,44,0,64,26,27,16,32,1,13,34,0,2,0,42,0,33,26,18,17,7,34,0,1,0,30,16,0,34,16,0,112,11,2,0,40,16,7,34,0,1,0,21,0,63,17,0,33,0,52,0,49,0,0,26,27,32,1,31,17,0,9,32,1,32,17,0,30,16,0,113,11,2,0,40,16,7,32,1,26,0,30,34,0,1,17,0,114,11,2,0,40,16,7,32,1,26,0,30,34,0,1,17,0,115,11,2,0,40,16,7,34,0,2,0,30,34,0,1,19,0,42,0,33,26,32,1,26,19,0,116,11,2,0,40,16,7,32,0,2,0,42,0,30,26,33,1,26,50,6,32,0,2,0,42,0,30,26,33,1,25,50,6,34,0,1,0,30,34,0,2,17,7,0,47,0,10,26,0,57,34,0,1,0,11,0,51,0,22,27,34,0,2,0,53,0,30,27,21,0,40,20,27,7,0,63,0,28,0,53,0,45,0,14,26,27,0,48,1,25,26,0,19,0,50,0,44,0,63,26,27,21,0,34,0,59,21,11,2,0,55,0,13,0,11,0,63,21,0,51,0,9,27,27,33,0,3,48,6,1,26,33,0,4,48,6,0,63,32,0,4,0,126,27,0,42,0,64,34,0,4,0,127,27,26,11,2,0,55,0,13,0,51,0,12,27,27,33,0,5,48,6,34,0,1,34,0,5,0,128,11,2,0,55,0,13,0,51,0,5,27,0,11,34,0,3,21,27,34,0,2,19,0,40,16,7,0,14,0,57,0,47,0,10,26,27,0,57,34,0,1,0,11,0,51,0,22,27,34,0,2,0,53,0,30,27,0,42,0,64,0,56,0,33,27,26,0,41,32,1,6,26,0,22,32,1,5,21,21,0,29,0,50,0,9,27,20,21,0,40,20,27,7,32,1,15,0,21,0,63,17,0,30,32,0,1,17,0,13,32,2,16,0,34,16,0,0,0,67,17,17,32,1,13,0,21,0,63,21,0,30,34,0,1,21,32,1,10,0,132,27,16,7,34,0,1,0,6,33,1,24,50,0,14,0,68,17,32,1,25,32,1,10,34,0,4,27,16,7,32,2,27,32,2,25,34,0,1,17,0,9,32,1,45,0,14,0,63,17,17,7,32,1,5,0,33,0,52,32,0,1,27,0,54,32,1,5,0,33,32,0,2,19,27,16,33,1,5,49,6,32,1,6,0,33,0,52,34,0,2,27,0,54,32,1,6,0,33,34,0,1,17,27,16,33,1,6,49,7,32,1,23,0,33,32,0,1,17,0,2,0,52,0,8,27,32,1,117,17,0,6,33,1,118,50,0,14,0,68,17,32,1,29,0,50,0,31,27,0,33,34,0,1,21,32,1,10,0,157,27,16,7,32,1,144,0,33,0,52,32,0,1,27,0,13,0,52,0,27,27,20,0,51,0,10,27,32,1,145,17,0,8,16,32,1,129,0,30,0,52,32,1,133,27,0,53,0,21,27,20,0,33,34,0,1,21,32,1,10,0,164,27,16,7,32,0,1,0,27,16,0,0,34,0,2,19,0,49,0,6,26,16,0,6,34,0,1,17,7,0,36,0,14,0,18,0,50,0,13,27,21,0,42,0,30,26,0,19,21,0,0,34,0,2,21,0,42,0,33,26,32,3,8,21,0,21,0,106,21,0,21,34,0,1,21,0,21,0,125,21,7] + ,[runtime[0],runtime[1],runtime[2],runtime[3],runtime[4],runtime[6],runtime[7],runtime[8],runtime[9],runtime[10],runtime[11],runtime[12],runtime[13],runtime[14],runtime[15],runtime[16],runtime[17],runtime[19],runtime[20],runtime[21],runtime[22],runtime[23],runtime[24],runtime[25],runtime[26],runtime[27],runtime[28],runtime[29],runtime[30],runtime[31],runtime[32],runtime[33],runtime[34],runtime[35],runtime[36],runtime[37],runtime[38],runtime[39],runtime[40],runtime[41],runtime[42],runtime[43],runtime[44],runtime[45],runtime[46],runtime[47],runtime[48],runtime[49],runtime[50],runtime[51],runtime[52],runtime[53],runtime[54],runtime[55],runtime[56],runtime[58],runtime[59],runtime[61],10,-1,11,26,9,0,1,5,8,4,2,3,-3,-2,6,17,Math.PI,Infinity,-4,-5,-6,32,64,48,43,42,66,24,16,7,'\0','0','#','\'','\"','@',str("⋄,"),str(":;?"),str("⇐←↩"),str("(){}⟨⟩"),str("‿"),str("·"),str("𝕊𝕏𝕎𝔽𝔾𝕤𝕩𝕨𝕣𝕗𝕘"),str(".¯π∞"),str("_"),str("aA"),str("•"),str("𝕨"),str(" "),str("#\'\"@"),str("s"),str("Unknown character"),str(": "),str("˜⁼"),str("Unclosed quote"),str("Words can\'t only have underscores"),str("System dot with no name"),str("𝕣 can\'t be used with other word characters"),str("Numbers can\'t start with underscores"),str("Letter"),str(" \""),str("\" not allowed in numbers"),str("ea"),str("Negative sign in the middle of a number"),str("Portion of a number is empty"),str("Ill-formed decimal or exponent use"),str("π and ∞ must occur alone"),str("Missing "),str("opening"),str("closing"),str("Malformed bracket nesting"),str("Empty program"),str("Swapped open and closed brackets"),str("Parentheses can\'t contain separators"),str("Empty statement or expression"),str("Invalid assignment or stranding use"),str("Dot must be followed by a name"),str("Can\'t strand Nothing (·)"),str("Punctuation : ; ? not allowed outside blocks"),str("Header-less bodies must come last"),str("At most two header-less bodies allowed"),str("Invalid Undo header syntax"),str("Only one header per body allowed"),str("Missing operand in header"),str("Invalid header structure"),str("Incorrect special name"),str("Header left argument without right"),str("Header operation must be a plain name"),str("Invalid special names for block header"),str("Special name outside of any block"),str("Only blocks with explicit arguments can have multiple bodies"),str("Block bodies must be of the same kind"),str("Dot must be preceded by a subject"),str("Nothing (·) cannot be assigned"),str("Missing operand"),str("Can\'t use Nothing (·) in lists"),str("Double subjects (missing ‿?)"),str("No right-hand side in non-modified assignment"),str("Role of the two sides in assignment must match"),str("Can\'t return Nothing (·)"),str("Invalid use of 𝕨 in monadic case"),str("Unreachable body"),str("Assignment target must be a name or list of targets"),str("Can\'t nest assignments (write aliases with ⇐)"),str("Can\'t use result of function/modifier assignment without parentheses"),str("Can\'t define special name"),str("Redefinition"),str("Undefined identifier"),str("Can\'t export from surrounding scope"),str("Second-level parts of a train must be functions"),str("System values not supported")] ,[[0,1,0],[0,0,1],[1,0,2],[1,1,3],[0,0,[[],[4]]],[0,0,[[],[5]]],[0,0,[[],[6]]],[0,0,[[],[7]]],[0,0,[[],[8]]],[0,0,[[],[9]]],[0,0,10],[0,0,11],[0,0,12],[0,0,13],[0,0,[[],[14]]],[0,0,[[],[15]]],[2,1,16],[0,0,17],[2,1,18],[0,0,19],[1,0,20],[0,0,21],[0,0,[[],[22]]],[0,0,23],[0,0,24],[0,0,25],[2,1,26]] - ,[[0,0],[3,44],[598,5],[617,5],[736,57],[2942,23],[3767,200],[11807,19],[12050,3],[12058,3],[12098,3],[12115,3],[12154,3],[12171,3],[12188,3],[12214,3],[12250,3],[12281,6],[12413,3],[12480,3],[12530,5],[12556,3],[12578,3],[12636,3],[12689,3],[12751,3],[12776,3]] + ,[[0,0],[3,44],[598,5],[617,5],[736,57],[2942,23],[3767,203],[11937,19],[12180,3],[12188,3],[12228,3],[12245,3],[12284,3],[12301,3],[12318,3],[12344,3],[12380,3],[12411,6],[12543,3],[12610,3],[12660,5],[12686,3],[12708,3],[12766,3],[12819,3],[12881,3],[12906,3]] ); let compgen = sys => { let gl = sys.glyphs, rt = sys.runtime; diff --git a/docs/implementation/vm.html b/docs/implementation/vm.html index 95c3ce5c..d25e39a1 100644 --- a/docs/implementation/vm.html +++ b/docs/implementation/vm.html @@ -273,7 +273,7 @@ </tr> <tr> <td align="right">2A</td> -<td></td> +<td>PRED</td> <td align="center"></td> <td align="right">06</td> <td align="left"></td> @@ -511,12 +511,14 @@ <p>When a block is pushed with <strong>DFND</strong>, an instance of the block is created, with its <em>parent frame</em> set to be the frame of the currently-executing block. Setting the parent frame when the block is first seen, instead of when it's evaluated, is what distinguishes lexical from dynamic scoping. If it's an immediate block, it's evaluated immediately, and otherwise it's pushed onto the stack. When the block is evaluated, its frame is initialized using any arguments passed to it, the next instruction's index is pushed onto the return stack, and execution moves to the first instruction in the block. When the RETN instruction is encountered, an index is popped from the return stack and execution returns to this location. As an alternative to maintaining an explicit return stack, a block can be implemented as a native function that creates a new execution stack and returns the value in it when the <strong>RETN</strong> instruction is reached. This approach uses the implementation language's call stack for the return stack.</p> <p>Local variables are manipulated with the <strong>VARO</strong> (or <strong>VARU</strong>) and <strong>VARM</strong> instructions, which load the value of a variable and a reference to it (see the next section) respectively. These instructions reference variables by <em>frame depth</em> and <em>slot index</em>. The frame depth indicates in which frame the variable is found: the current frame has depth 0, its block's parent frame has depth 1, and so on. The slot index is an index within that frame.</p> <p>Slots should be initialized with some indication they are not yet defined. The variable can be defined with SETN only if it hasn't been defined yet, and can be accessed with VARO or VARU or modified with SETU, SETM, or SETC only if it <em>has</em> been defined.</p> -<h3 id="variable-references-arrm-varm-setn-setu-setm-setc-seth-vfym"><a class="header" href="#variable-references-arrm-varm-setn-setu-setm-setc-seth-vfym">Variable references: ARRM VARM SETN SETU SETM SETC SETH VFYM</a></h3> +<h3 id="variable-references-arrm-varm-setn-setu-setm-setc"><a class="header" href="#variable-references-arrm-varm-setn-setu-setm-setc">Variable references: ARRM VARM SETN SETU SETM SETC</a></h3> <p>A <em>variable reference</em> indicates a particular frame slot in a way that's independent of the execution context. For example, it could be a pointer to the slot, or a reference to the frame along with the index of the slot. <strong>VARM</strong> pushes a variable reference to the stack.</p> <p>A <em>reference list</em> is a list of variable references or reference lists. It's created with the <strong>ARRM</strong> instruction. In the Javascript VM there's no difference between a reference list and an ordinary BQN list other than the contents.</p> <p>The <strong>SETN</strong>, <strong>SETU</strong>, <strong>SETM</strong>, and <strong>SETC</strong> instructions set a value for a reference. If the reference is to a variable, they simply set its value. For a reference list, the value needs to be destructured. It must be a list of the same length, and each reference in the reference list is set to the corresponding element of the value list.</p> <p><strong>SETM</strong> and <strong>SETC</strong> additionally need to get the current value of a reference. For a variable reference this is its current value (with an error if it's not defined yet); for a reference list it's a list of the values of each reference in the list.</p> +<h3 id="bodies-seth-vfym-pred"><a class="header" href="#bodies-seth-vfym-pred">Bodies: SETH VFYM PRED</a></h3> <p><strong>SETH</strong> is a modification of SETN for use in header destructuring. It differs in that it doesn't place its result on the stack (making it more like SETN followed by POPS), and that if the assignment fails because the reference and value don't conform then it moves on to the next eligible body in the block rather than giving an error. <strong>VFYM</strong> converts a BQN value <code><span class='Value'>c</span></code> to a special reference: assigning a value <code><span class='Value'>v</span></code> to it should check if <code><span class='Value'>v</span><span class='Function'>≡</span><span class='Value'>c</span></code> but do no assignment. Only SETH needs to accept these references, and it should treat non-matching values as failing assignment.</p> +<p><strong>PRED</strong> drops the top value of the stack, but also checks whether it matches the number 1. If it does match, execution continues; if not, evaluation of the current body ends and evaluation moves to the next eligible body.</p> <h3 id="namespaces-fldo-fldm-alim-retd"><a class="header" href="#namespaces-fldo-fldm-alim-retd">Namespaces: FLDO FLDM ALIM RETD</a></h3> <p>A <em>namespace</em> is the collection of variables in a particular scope, along with an association mapping some exported <em>symbols</em> (case- and underscore-normalized strings) to a subset of these. It can be represented using a frame for the variables, plus the variable name list and mask of exported variables from that block's properties in the bytecode. <strong>RETD</strong> finishes executing the block and returns the namespace for that execution.</p> <p>The variable name list is split into a program-level list of names and a list of indices into these names: within-program field accesses can be done with the indices only while cross-program ones must use names. One way to check whether an access is cross-program is to compare the accessor's program-level name list with the one for the accessed namespace as references or pointers. Then a lookup should be performed as appropriate. A persistent lookup table is needed to make this efficient.</p> diff --git a/implementation/vm.md b/implementation/vm.md index 40730b79..8b6cf967 100644 --- a/implementation/vm.md +++ b/implementation/vm.md @@ -82,7 +82,7 @@ The following instructions are defined by dzaima/BQN. The ones emitted by the se | 22 | VARU | X | 21 | `D`, `I` | Push and clear local variable `I` from `D` frames up | 26 | DYNO | | | `I` | Push named variable `I` | 27 | DYNM | | | `I` | Push named variable `I` reference -| 2A | | | 06 | | Check predicate and drop +| 2A | PRED | | 06 | | Check predicate and drop | 2B | VFYM | X | | | Convert constant to matcher (for headers) | 2F | SETH | X | 30 | | Test and set header | 30 | SETN | X | | | Define variable @@ -135,7 +135,7 @@ Local variables are manipulated with the **VARO** (or **VARU**) and **VARM** ins Slots should be initialized with some indication they are not yet defined. The variable can be defined with SETN only if it hasn't been defined yet, and can be accessed with VARO or VARU or modified with SETU, SETM, or SETC only if it *has* been defined. -### Variable references: ARRM VARM SETN SETU SETM SETC SETH VFYM +### Variable references: ARRM VARM SETN SETU SETM SETC A *variable reference* indicates a particular frame slot in a way that's independent of the execution context. For example, it could be a pointer to the slot, or a reference to the frame along with the index of the slot. **VARM** pushes a variable reference to the stack. @@ -145,8 +145,12 @@ The **SETN**, **SETU**, **SETM**, and **SETC** instructions set a value for a re **SETM** and **SETC** additionally need to get the current value of a reference. For a variable reference this is its current value (with an error if it's not defined yet); for a reference list it's a list of the values of each reference in the list. +### Bodies: SETH VFYM PRED + **SETH** is a modification of SETN for use in header destructuring. It differs in that it doesn't place its result on the stack (making it more like SETN followed by POPS), and that if the assignment fails because the reference and value don't conform then it moves on to the next eligible body in the block rather than giving an error. **VFYM** converts a BQN value `c` to a special reference: assigning a value `v` to it should check if `v≡c` but do no assignment. Only SETH needs to accept these references, and it should treat non-matching values as failing assignment. +**PRED** drops the top value of the stack, but also checks whether it matches the number 1. If it does match, execution continues; if not, evaluation of the current body ends and evaluation moves to the next eligible body. + ### Namespaces: FLDO FLDM ALIM RETD A *namespace* is the collection of variables in a particular scope, along with an association mapping some exported *symbols* (case- and underscore-normalized strings) to a subset of these. It can be represented using a frame for the variables, plus the variable name list and mask of exported variables from that block's properties in the bytecode. **RETD** finishes executing the block and returns the namespace for that execution. @@ -5,7 +5,7 @@ charSet‿cgl←(∾ ≍○< ≠¨)⟨ mod1 # 1-modifier mod2 # 2-modifier "⋄,"∾lf # Separator - ":;" # Header punctuation + ":;?" # Header punctuation "⇐←↩" # Gets "(){}⟨⟩" # Bracket "‿" # Ligature @@ -161,13 +161,13 @@ Parse ← {r‿vn‿i‿e‿def←𝕨⋄nv←≠vn g⊏˜↩gs←⍋gr⊏sl⋄gr↩g⊏rev⋄gi←⍋g # Send strand prefixes *‿ to the end # Headers - hh←𝕩=⊑bH⋄cs←𝕩=1+⊑bH # Case header : and separator ; - "Punctuation : and ; not allowed outside blocks"_err_(↕∘≠) (∨`b)<hh∨cs + hh←𝕩=⊑bH⋄cs←𝕩=1+⊑bH⋄qm←𝕩=2+⊑bH # Case header : and separator ; and predicate ? + "Punctuation : ; ? not allowed outside blocks"_err_(↕∘≠) (∨`b)<hh∨cs∨qm fi←+`cb←b∨cs⋄H←cb¬∘PN⊢ # Body index fi; which bodies Have a property - ch←H hh + cq←(H qm)∨ch←H hh # ch: body has : header ; cq: or ? predicate cf←1∾¬co←cb/cs⋄cm←0∾∨⟜«co # cf: body is first; cm: body is one of multiple - "Header-less bodies must come last"_err_(/CB) 1(-⊸↓<co∧↓)ch - "At most two header-less bodies allowed"_err_(/CB) »⊸∧co>¯1↓ch + "Header-less bodies must come last"_err_(/CB) 1(-⊸↓<co∧↓)cq + "At most two header-less bodies allowed"_err_(/CB) »⊸∧co>¯1↓cq cc←(⍋⍋«co)⊏c∾/cs # Case close hi←/hf←hh⊏˜⟜IT⌾((⌽g)⊸⊏)cb∨hh # Header component indices un←0=us←swap_undo(≠∘⊣-⊐)hi⊏𝕩 @@ -186,7 +186,7 @@ Parse ← {r‿vn‿i‿e‿def←𝕨⋄nv←≠vn "Incorrect special name"_err_(HI) (0=hk)∧ht≠hv+⊑bI hk×↩¬hc∨hl∧0=hr # Treat subject labels like special names hm>↩hc⋄hr/˜↩hm⋄hx←(1»hc)/ha # Header-derived role hr and immediacy ¬hx - cw←1+-⟜«(»ch)<1(⊢<«)cf + cw←1+-⟜«(»cq)<1(⊢<«)cf cw↩(hc/»hla¬⊸×hl⌈ha×1+he←0≠hk)⌾(ch⊸/)cw # Body 𝕨: 0 no, 1 allowed, 2 required "Invalid Undo header syntax"_err_(HI) hm<×ut cu←(hm/ut)⌾(ch⊸/)0¨cw⋄cw⌈↩2×2=cu @@ -202,7 +202,7 @@ Parse ← {r‿vn‿i‿e‿def←𝕨⋄nv←≠vn "Invalid special names for block header"_err_(ch/0∾/∘CB) (hr<ch/fr)∨(hm/hl)<hx<ch/fx ft⌈↩1-˜fr↩hr⌾(ch⊸/)fr⋄fx↩hx⊸⌈⌾(ch⊸/)fx "Special name outside of any block"_err_(/{(0=fi)∧𝕩 M bI}∘𝕩) 0<⊑fr - "Only blocks with explicit arguments can have multiple bodies"_err_(/CB) 1↓cm>fx + "Only blocks with explicit arguments can have multiple bodies"_err_(/CB) 1↓(»⊸∨cq>ch)<cm>fx "Block bodies must be of the same kind"_err_(/CB) 1↓cf<»⊸≠ft fsc←(ft⊏0‿2‿3)+3×fx # Special name count hv-↩(»+`hc)⊏3׬ch/fx # Header variable slot @@ -251,7 +251,7 @@ Parse ← {r‿vn‿i‿e‿def←𝕨⋄nv←≠vn {"Can't return Nothing (·)"_err_(𝕩⊏⍋∘Rev) 2=fw⌈↩nf¬⊸×𝕩⊏nr} 1-˜0∾cc⊏rev fv←fw⋄fw≥○I1T↩cf # If a body fails on 𝕨, later ones won't see 𝕨 (∨´(1↓fv)⊸<)◶"Invalid use of 𝕨 in monadic case"‿"Unreachable body"_err_(/CB) 1↓fw∧cw=0 - cw⌈↩2×fw + cw⌈↩2×fw⋄cw×↩fx nn←fo+`⊸⊏2=cw⋄no(⊣-=)↩nn⋄ne(⊣-=)↩nn # 2=cw indicates 𝕨 is never Nothing aid←(¯6⊸≤∧<⟜nv)𝕩-vi # Assignable identifer hq←/hp←(g⊏ah)∧𝕩≥nv+vi # Header constant @@ -303,26 +303,29 @@ Parse ← {r‿vn‿i‿e‿def←𝕨⋄nv←≠vn bk←c⊏gi # Block loads ll←sll∾˜(¬lo/1«ps)+-⟜»1↓(lo∾1)/+`ls∾0 # List Length dr←(hd¬⊸/hj)∾/s>(2=ne)∨ls∨»r=¯5⋄rt←/fo # Drop (block separator) and return + qp←/𝕩=2+⊑bH # Predicate fl←(dy×⊏⟜os)⊸+fa+dy # Function application site dr∾↩((1+dy)×fn←2=fm←fa⊏ne)/fl # Turn function applications on · to drops fn↩¬fn⋄fa/˜↩fn⋄fl/˜↩fn # And remove them # Object code generation: numbers oc ordered by source location (after rev) oi ao←48+(0⌈(1+⊑bG)-˜ai⊏𝕩+ma+mm)∾-hd # Assignment opcode - or←⍋oi←idor∾g⊏˜∾⟨cn,cn,bk,bk,hq,2/l,at,dr,al+1,al+1,oa+1⌈oa⊏os,fl,rt⟩ - oc←or⊏∾idoc∾⟨0¨cn,ob,1¨bk,1+↕≠bk,43¨hq,⥊⍉(11+l⊏aa)≍ll,ao,6¨dr,66¨al,vi-˜(al-1)⊏𝕩 + or←⍋oi←idor∾g⊏˜∾⟨cn,cn,bk,bk,hq,2/l,at,dr,qp,al+1,al+1,oa+1⌈oa⊏os,fl,rt⟩ + oc←or⊏∾idoc∾⟨0¨cn,ob,1¨bk,1+↕≠bk,43¨hq,⥊⍉(11+l⊏aa)≍ll,ao,6¨dr,42¨qp,66¨al,vi-˜(al-1)⊏𝕩 24+oa⊏r,16+(fn/dy+2×fm⌈1=ny)+4×0<fa⊏er,¯1↓rc←7+nf⟩ # Instruction source positions MI←-⊸↓˜⟜≠∾g⊏˜⊢⋄oj←(rt-∘≠⊸⌽oi⌊1-˜≠i)Mi∾⟨1-˜at,oa,fa⟩ ind←⟨oj,oj Mi fa⊏IT»¬ro∨ma⟩(¯1∾˜or⊏(≠rt)⊸⌽)⊸⊏¨i‿e + # Indices for multi-body blocks cj←/cv←1+1=ciw←cw⊏˜ci←/cm∨↩fx∧1≠cw ck←4⌊(2×ci⊏cu)+1<ciw cg←¯1+`cif←ci⊏cf - ckt←2⌈(cif/·⍋⊏⟜cg)⊸⊏∘⍒⊸⊏cv+ck - ci↩ckt/⊸⊔(¯1(↑∾˜cj(⊒∘⊣+⊏)ck+cg⊏↓)0∾+`ckt)⊔cj⊏ci # Indices for multi-body blocks - fq←⟨cf/ft,cf/¬fx,ci⌾((cf/cm)⊸/)/cf⟩ # Per-function data - cq←⟨/1∾or≥oc-○≠rt,fsc+≠¨dn,dn,dx⟩ # Per-body data - ⟨oc∾¯1⊑rc,u,fq,cq,ind⟩ # Overall output + ckt←(2-¬(cf∧cm)/fx)⌈(cif/·⍋⊏⟜cg)⊸⊏∘⍒⊸⊏cv+ck + ci↩ckt/⊸⊔(¯1(↑∾˜cj(⊒∘⊣+⊏)ck+cg⊏↓)0∾+`ckt)⊔cj⊏ci + # Output + fz←⟨cf/ft,cf/¬fx,ci⌾((cf/cm)⊸/)/cf⟩ # Per-function data + cz←⟨/1∾or≥oc-○≠rt,fsc+≠¨dn,dn,dx⟩ # Per-body data + ⟨oc∾¯1⊑rc,u,fz,cz,ind⟩ # Overall output } Compile←{ @@ -7,7 +7,7 @@ rtn ← 2⊸≤◶⥊‿↕ rtt # File numbers included glyphs ← •Import "glyphs.bqn" # Provided values, to be passed in through the constants array -alias‿def ← (⊑¨ ≍○< 1⊸↓¨) ⟨"?Type","∩Fill","⍣Log", +alias‿def ← (⊑¨ ≍○< 1⊸↓¨) ⟨"&Type","∩Fill","⍣Log", "$GroupLen","%GroupOrd","⍝_fillBy_"⟩ keep ← "!+-×÷⋆⌊=≤≢⥊⊑↕⌜`⊘⎊" chrext ← glyphs ∾¨ ((+´·∧`'_'=0‿¯1⊸⊏)¨def) ⊔ alias diff --git a/test/cases/header.bqn b/test/cases/header.bqn index 43051a7b..303ba0fe 100644 --- a/test/cases/header.bqn +++ b/test/cases/header.bqn @@ -115,6 +115,20 @@ 2 % +⟜1{F _r_ G:{𝕊𝕩:F𝕩; 𝕨𝕊𝕩:𝕨G𝕩}}⋆{2⊸𝔽÷𝔽}3 ! % {𝕨Fail𝕩:𝕨;𝕩}@ +# Predicates +4 % {0 ? 3;4} +! % {a←1?5;a} +! % {5;1<2?6} +! % {x←4⋄x=x?;4} +! % {·?2;3} # TODO detect in compiler +2 % {a←2⋄4=טa,?a;6} +2 % a←2⋄{a>1?a<1?-a;a} +1 % -´{𝕩≤2?3×𝕩;𝕩}¨2‿5 +! % {𝕩;𝕨<2?0;𝕨} +3 % 1{𝕨<𝕩?𝕨+𝕩;𝕩;𝕨}2 +3 % 3{𝕨<𝕩?𝕨+𝕩;𝕩;𝕨}2 +4 % ⟨4,2⟩{=𝕗?⊑𝕗;𝕗} + # Destructuring 2 % {𝕊a‿b:b-a}3‿5 ! % {𝕊a‿b:𝕩}↕4 |
