From 65b92e4fdf963d86dffb509b786163de89fec2ec Mon Sep 17 00:00:00 2001 From: timbogdanov Date: Tue, 18 Aug 2026 20:40:16 -0500 Subject: [PATCH] Map-scale preview: show the pattern on a territory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OpenFront paints a pattern onto territory in absolute world coordinates, so what a player sees depends on where the territory sits on the map. The editor showed a 3x3 repeat of the bitmap, which cannot express that at all — patterns were being designed against a preview that did not model the thing they are for. tools/preview_prototype.py has verified the sampling rule since before the editor existed, and the suite has been running it on every commit without the app ever using it. It is ported now: floorMod and ofPrimaryAt, plus territoryMask, and a Map view that renders the pattern inside a territory shape at its real scale. Drag it and the pattern's phase moves, because the position is what decides which part of the pattern lands where. JS `%` is a remainder whose sign follows the dividend, so a naive `(x >> scale) % width` returns a negative index the moment the territory is dragged left of the origin, reading before the start of the bit array. That is the single likeliest way for this port to be wrong, so 661 of the 1,161 probes are at negative coordinates. Reintroducing the bare `%` fails 6 cases with the first disagreement at (-9,-9), so the suite is known to catch it rather than assumed to. tests/fixtures/sampler.json is the oracle: 56 patterns across all eight scales, each probed 1,161 times, generated against an independently written decoder. The committed corpus is 1,117 patterns at scale 0 and one or two at each of the rest — built for width, height and bit packing — so scale coverage is synthesised here. Nothing comes from the game's cosmetics.json; it is CC BY-SA 4.0 and not redistributed. Two things the port exposed: The map scale readout showed the slider position, so scale 3 read "3x" directly above a sentence saying "One pixel covers 8x8 map tiles". scale is an exponent; the readout is now the magnification. The brace-matching extractor had been copied into two suites and was about to be copied into a third, which is one edit from two suites disagreeing about what the editor's source says. It lives in tools/lib/extract.js now, and verify-codec.js uses it — 28 duplicated lines gone. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01UCrKKTD2mwHx8Fm1EnJiQ3 --- app/patternfront.html | 83 +- tests/fixtures/sampler.json | 5101 +++++++++++++++++++++++++++++++++ tools/gen-sampler-fixtures.py | 237 ++ tools/lib/extract.js | 69 + tools/verify-all.sh | 2 + tools/verify-behaviour.js | 1 + tools/verify-codec.js | 34 +- tools/verify-sampler.js | 138 + 8 files changed, 5633 insertions(+), 32 deletions(-) create mode 100644 tests/fixtures/sampler.json create mode 100644 tools/gen-sampler-fixtures.py create mode 100644 tools/lib/extract.js create mode 100644 tools/verify-sampler.js diff --git a/app/patternfront.html b/app/patternfront.html index f7db28a..0691d22 100644 --- a/app/patternfront.html +++ b/app/patternfront.html @@ -442,6 +442,7 @@
+ fit
@@ -704,6 +705,9 @@ const Z=()=>zoom*uiScale; let symX=false,symY=false,wrapDraw=false,onion=0; let sel=null,clipboard=null,pvScale=0,pvTile=true; +// Map view: is it on, and where the territory sits in world coordinates. +// The offset is deliberately allowed to go negative — see floorMod. +let pvMap=false,pvOX=0,pvOY=0; // `fg` is the active colour: what the pencil, shapes and fill use, and what // the picker edits. `bg` is the other one (right-click, and what Grab backfills // with). Clicking a chip makes it active. There is deliberately no separate @@ -880,8 +884,47 @@ const w=Math.max(1,box.clientWidth-pad), h=Math.max(1,box.clientHeight-pad); return Math.max(1,Math.floor(Math.min(w/(doc.w*n), h/(doc.h*n))));} function pvEff(){return pvScale>0?pvScale:pvFitScale();} +/* A blobby pseudo-territory, so the pattern is judged inside a shape rather than + as a rectangle. Ported from tools/preview_prototype.py. */ +function territoryMask(w,h){ + const cx=w/2,cy=h/2,mask=new Uint8Array(w*h); + for(let y=0;y0?s+'×':'fit '+s+'×'; pvC.width=doc.w*n*s;pvC.height=doc.h*n*s; @@ -895,6 +938,26 @@ pvG.drawImage(t,x*doc.w*s,y*doc.h*s,doc.w*s,doc.h*s);} $('pvTile').onclick=()=>{pvTile=!pvTile; $('pvTile').setAttribute('aria-pressed',String(pvTile));drawPreview();}; +$('pvMap').onclick=()=>{pvMap=!pvMap; + $('pvMap').setAttribute('aria-pressed',String(pvMap)); + $('pvTile').disabled=pvMap;$('pvFit').disabled=pvMap;drawPreview();}; +// Drag the territory across the map. This is the control the flat view has no +// equivalent of: pan left and the world coordinates go negative, which is where +// a remainder-based sampler would read before the start of the pattern. +pvC.addEventListener('pointerdown',e=>{ + if(!pvMap) return; + pvC.setPointerCapture(e.pointerId); + const sx=e.clientX,sy=e.clientY,ox=pvOX,oy=pvOY; + const per=Math.max(1,pvC.clientWidth/MAP_TILES); + const move=ev=>{ + pvOX=ox-Math.round((ev.clientX-sx)/per); + pvOY=oy-Math.round((ev.clientY-sy)/per); + drawMapPreview();}; + const up=()=>{pvC.removeEventListener('pointermove',move); + pvC.removeEventListener('pointerup',up);pvC.removeEventListener('pointercancel',up);}; + pvC.addEventListener('pointermove',move); + pvC.addEventListener('pointerup',up); + pvC.addEventListener('pointercancel',up);}); $('pvFit').onclick=()=>{pvScale=0;drawPreview();}; pvC.parentElement.addEventListener('wheel',e=>{ e.preventDefault(); @@ -1741,6 +1804,21 @@ for(let i=0;i>3)]>>(i&7))&1; return {w,h,scale,bits}; } +/* Modulo that is never negative. JS `%` is a REMAINDER whose sign follows the + dividend: -1 % 4 is -1, where a floor modulo gives 3. OpenFront never meets + this because its own tile coordinates start at 0, but the map preview lets the + territory be panned left, and a bare `%` there would index before the start of + the array and render garbage at the origin. Every sampler goes through this. */ +const floorMod=(a,n)=>((a%n)+n)%n; +/* Is the world tile at (wx,wy) the primary colour? THE sampling rule — the one + place that decides what a player actually sees. `scale` magnifies by 2^scale, + so a block of 2^scale world tiles shares one pattern pixel, and the pattern is + laid out in ABSOLUTE world coordinates: move a territory across the map and + the pattern's phase moves with it. Held to tests/fixtures/sampler.json. */ +function ofPrimaryAt(d,wx,wy){ + const px=floorMod(wx>>d.scale,d.w),py=floorMod(wy>>d.scale,d.h); + return d.bits[py*d.w+px]===0; +} // Flatten the visible layers to palette indices (top layer wins). function flatIndex(fi){ const out=new Uint8Array(npx()); @@ -1769,7 +1847,10 @@ return bits;} function refreshOF(){ const scale=+$('ofScale').value; - $('ofScaleO').textContent=scale+'×'; + // The readout is the magnification, not the slider position. scale is an + // exponent — one pixel covers 2^scale tiles — so slider 3 is 8x, and showing + // "3x" contradicted the sentence directly beneath it. + $('ofScaleO').textContent=(1<OF_MAXW||doc.h>OF_MAXH){ diff --git a/tests/fixtures/sampler.json b/tests/fixtures/sampler.json new file mode 100644 index 0000000..3b65d45 --- /dev/null +++ b/tests/fixtures/sampler.json @@ -0,0 +1,5101 @@ +{ + "note": "Map-scale sampling oracle. Probes straddle the origin because JavaScript's % is a remainder, not a floor modulo. Patterns are from the licence-clean corpus, not OpenFront's cosmetics.json.", + "probeCount": 1161, + "caseCount": 56, + "probes": [ + [ + -9, + -9 + ], + [ + -8, + -9 + ], + [ + -7, + -9 + ], + [ + -6, + -9 + ], + [ + -5, + -9 + ], + [ + -4, + -9 + ], + [ + -3, + -9 + ], + [ + -2, + -9 + ], + [ + -1, + -9 + ], + [ + 0, + -9 + ], + [ + 1, + -9 + ], + [ + 2, + -9 + ], + [ + 3, + -9 + ], + [ + 4, + -9 + ], + [ + 5, + -9 + ], + [ + 6, + -9 + ], + [ + 7, + -9 + ], + [ + 8, + -9 + ], + [ + 9, + -9 + ], + [ + -9, + -8 + ], + [ + -8, + -8 + ], + [ + -7, + -8 + ], + [ + -6, + -8 + ], + [ + -5, + -8 + ], + [ + -4, + -8 + ], + [ + -3, + -8 + ], + [ + -2, + -8 + ], + [ + -1, + -8 + ], + [ + 0, + -8 + ], + [ + 1, + -8 + ], + [ + 2, + -8 + ], + [ + 3, + -8 + ], + [ + 4, + -8 + ], + [ + 5, + -8 + ], + [ + 6, + -8 + ], + [ + 7, + -8 + ], + [ + 8, + -8 + ], + [ + 9, + -8 + ], + [ + -9, + -7 + ], + [ + -8, + -7 + ], + [ + -7, + -7 + ], + [ + -6, + -7 + ], + [ + -5, + -7 + ], + [ + -4, + -7 + ], + [ + -3, + -7 + ], + [ + -2, + -7 + ], + [ + -1, + -7 + ], + [ + 0, + -7 + ], + [ + 1, + -7 + ], + [ + 2, + -7 + ], + [ + 3, + -7 + ], + [ + 4, + -7 + ], + [ + 5, + -7 + ], + [ + 6, + -7 + ], + [ + 7, + -7 + ], + [ + 8, + -7 + ], + [ + 9, + -7 + ], + [ + -9, + -6 + ], + [ + -8, + -6 + ], + [ + -7, + -6 + ], + [ + -6, + -6 + ], + [ + -5, + -6 + ], + [ + -4, + -6 + ], + [ + -3, + -6 + ], + [ + -2, + -6 + ], + [ + -1, + -6 + ], + [ + 0, + -6 + ], + [ + 1, + -6 + ], + [ + 2, + -6 + ], + [ + 3, + -6 + ], + [ + 4, + -6 + ], + [ + 5, + -6 + ], + [ + 6, + -6 + ], + [ + 7, + -6 + ], + [ + 8, + -6 + ], + [ + 9, + -6 + ], + [ + -9, + -5 + ], + [ + -8, + -5 + ], + [ + -7, + -5 + ], + [ + -6, + -5 + ], + [ + -5, + -5 + ], + [ + -4, + -5 + ], + [ + -3, + -5 + ], + [ + -2, + -5 + ], + [ + -1, + -5 + ], + [ + 0, + -5 + ], + [ + 1, + -5 + ], + [ + 2, + -5 + ], + [ + 3, + -5 + ], + [ + 4, + -5 + ], + [ + 5, + -5 + ], + [ + 6, + -5 + ], + [ + 7, + -5 + ], + [ + 8, + -5 + ], + [ + 9, + -5 + ], + [ + -9, + -4 + ], + [ + -8, + -4 + ], + [ + -7, + -4 + ], + [ + -6, + -4 + ], + [ + -5, + -4 + ], + [ + -4, + -4 + ], + [ + -3, + -4 + ], + [ + -2, + -4 + ], + [ + -1, + -4 + ], + [ + 0, + -4 + ], + [ + 1, + -4 + ], + [ + 2, + -4 + ], + [ + 3, + -4 + ], + [ + 4, + -4 + ], + [ + 5, + -4 + ], + [ + 6, + -4 + ], + [ + 7, + -4 + ], + [ + 8, + -4 + ], + [ + 9, + -4 + ], + [ + -9, + -3 + ], + [ + -8, + -3 + ], + [ + -7, + -3 + ], + [ + -6, + -3 + ], + [ + -5, + -3 + ], + [ + -4, + -3 + ], + [ + -3, + -3 + ], + [ + -2, + -3 + ], + [ + -1, + -3 + ], + [ + 0, + -3 + ], + [ + 1, + -3 + ], + [ + 2, + -3 + ], + [ + 3, + -3 + ], + [ + 4, + -3 + ], + [ + 5, + -3 + ], + [ + 6, + -3 + ], + [ + 7, + -3 + ], + [ + 8, + -3 + ], + [ + 9, + -3 + ], + [ + -9, + -2 + ], + [ + -8, + -2 + ], + [ + -7, + -2 + ], + [ + -6, + -2 + ], + [ + -5, + -2 + ], + [ + -4, + -2 + ], + [ + -3, + -2 + ], + [ + -2, + -2 + ], + [ + -1, + -2 + ], + [ + 0, + -2 + ], + [ + 1, + -2 + ], + [ + 2, + -2 + ], + [ + 3, + -2 + ], + [ + 4, + -2 + ], + [ + 5, + -2 + ], + [ + 6, + -2 + ], + [ + 7, + -2 + ], + [ + 8, + -2 + ], + [ + 9, + -2 + ], + [ + -9, + -1 + ], + [ + -8, + -1 + ], + [ + -7, + -1 + ], + [ + -6, + -1 + ], + [ + -5, + -1 + ], + [ + -4, + -1 + ], + [ + -3, + -1 + ], + [ + -2, + -1 + ], + [ + -1, + -1 + ], + [ + 0, + -1 + ], + [ + 1, + -1 + ], + [ + 2, + -1 + ], + [ + 3, + -1 + ], + [ + 4, + -1 + ], + [ + 5, + -1 + ], + [ + 6, + -1 + ], + [ + 7, + -1 + ], + [ + 8, + -1 + ], + [ + 9, + -1 + ], + [ + -9, + 0 + ], + [ + -8, + 0 + ], + [ + -7, + 0 + ], + [ + -6, + 0 + ], + [ + -5, + 0 + ], + [ + -4, + 0 + ], + [ + -3, + 0 + ], + [ + -2, + 0 + ], + [ + -1, + 0 + ], + [ + 0, + 0 + ], + [ + 1, + 0 + ], + [ + 2, + 0 + ], + [ + 3, + 0 + ], + [ + 4, + 0 + ], + [ + 5, + 0 + ], + [ + 6, + 0 + ], + [ + 7, + 0 + ], + [ + 8, + 0 + ], + [ + 9, + 0 + ], + [ + -9, + 1 + ], + [ + -8, + 1 + ], + [ + -7, + 1 + ], + [ + -6, + 1 + ], + [ + -5, + 1 + ], + [ + -4, + 1 + ], + [ + -3, + 1 + ], + [ + -2, + 1 + ], + [ + -1, + 1 + ], + [ + 0, + 1 + ], + [ + 1, + 1 + ], + [ + 2, + 1 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 5, + 1 + ], + [ + 6, + 1 + ], + [ + 7, + 1 + ], + [ + 8, + 1 + ], + [ + 9, + 1 + ], + [ + -9, + 2 + ], + [ + -8, + 2 + ], + [ + -7, + 2 + ], + [ + -6, + 2 + ], + [ + -5, + 2 + ], + [ + -4, + 2 + ], + [ + -3, + 2 + ], + [ + -2, + 2 + ], + [ + -1, + 2 + ], + [ + 0, + 2 + ], + [ + 1, + 2 + ], + [ + 2, + 2 + ], + [ + 3, + 2 + ], + [ + 4, + 2 + ], + [ + 5, + 2 + ], + [ + 6, + 2 + ], + [ + 7, + 2 + ], + [ + 8, + 2 + ], + [ + 9, + 2 + ], + [ + -9, + 3 + ], + [ + -8, + 3 + ], + [ + -7, + 3 + ], + [ + -6, + 3 + ], + [ + -5, + 3 + ], + [ + -4, + 3 + ], + [ + -3, + 3 + ], + [ + -2, + 3 + ], + [ + -1, + 3 + ], + [ + 0, + 3 + ], + [ + 1, + 3 + ], + [ + 2, + 3 + ], + [ + 3, + 3 + ], + [ + 4, + 3 + ], + [ + 5, + 3 + ], + [ + 6, + 3 + ], + [ + 7, + 3 + ], + [ + 8, + 3 + ], + [ + 9, + 3 + ], + [ + -9, + 4 + ], + [ + -8, + 4 + ], + [ + -7, + 4 + ], + [ + -6, + 4 + ], + [ + -5, + 4 + ], + [ + -4, + 4 + ], + [ + -3, + 4 + ], + [ + -2, + 4 + ], + [ + -1, + 4 + ], + [ + 0, + 4 + ], + [ + 1, + 4 + ], + [ + 2, + 4 + ], + [ + 3, + 4 + ], + [ + 4, + 4 + ], + [ + 5, + 4 + ], + [ + 6, + 4 + ], + [ + 7, + 4 + ], + [ + 8, + 4 + ], + [ + 9, + 4 + ], + [ + -9, + 5 + ], + [ + -8, + 5 + ], + [ + -7, + 5 + ], + [ + -6, + 5 + ], + [ + -5, + 5 + ], + [ + -4, + 5 + ], + [ + -3, + 5 + ], + [ + -2, + 5 + ], + [ + -1, + 5 + ], + [ + 0, + 5 + ], + [ + 1, + 5 + ], + [ + 2, + 5 + ], + [ + 3, + 5 + ], + [ + 4, + 5 + ], + [ + 5, + 5 + ], + [ + 6, + 5 + ], + [ + 7, + 5 + ], + [ + 8, + 5 + ], + [ + 9, + 5 + ], + [ + -9, + 6 + ], + [ + -8, + 6 + ], + [ + -7, + 6 + ], + [ + -6, + 6 + ], + [ + -5, + 6 + ], + [ + -4, + 6 + ], + [ + -3, + 6 + ], + [ + -2, + 6 + ], + [ + -1, + 6 + ], + [ + 0, + 6 + ], + [ + 1, + 6 + ], + [ + 2, + 6 + ], + [ + 3, + 6 + ], + [ + 4, + 6 + ], + [ + 5, + 6 + ], + [ + 6, + 6 + ], + [ + 7, + 6 + ], + [ + 8, + 6 + ], + [ + 9, + 6 + ], + [ + -9, + 7 + ], + [ + -8, + 7 + ], + [ + -7, + 7 + ], + [ + -6, + 7 + ], + [ + -5, + 7 + ], + [ + -4, + 7 + ], + [ + -3, + 7 + ], + [ + -2, + 7 + ], + [ + -1, + 7 + ], + [ + 0, + 7 + ], + [ + 1, + 7 + ], + [ + 2, + 7 + ], + [ + 3, + 7 + ], + [ + 4, + 7 + ], + [ + 5, + 7 + ], + [ + 6, + 7 + ], + [ + 7, + 7 + ], + [ + 8, + 7 + ], + [ + 9, + 7 + ], + [ + -9, + 8 + ], + [ + -8, + 8 + ], + [ + -7, + 8 + ], + [ + -6, + 8 + ], + [ + -5, + 8 + ], + [ + -4, + 8 + ], + [ + -3, + 8 + ], + [ + -2, + 8 + ], + [ + -1, + 8 + ], + [ + 0, + 8 + ], + [ + 1, + 8 + ], + [ + 2, + 8 + ], + [ + 3, + 8 + ], + [ + 4, + 8 + ], + [ + 5, + 8 + ], + [ + 6, + 8 + ], + [ + 7, + 8 + ], + [ + 8, + 8 + ], + [ + 9, + 8 + ], + [ + -9, + 9 + ], + [ + -8, + 9 + ], + [ + -7, + 9 + ], + [ + -6, + 9 + ], + [ + -5, + 9 + ], + [ + -4, + 9 + ], + [ + -3, + 9 + ], + [ + -2, + 9 + ], + [ + -1, + 9 + ], + [ + 0, + 9 + ], + [ + 1, + 9 + ], + [ + 2, + 9 + ], + [ + 3, + 9 + ], + [ + 4, + 9 + ], + [ + 5, + 9 + ], + [ + 6, + 9 + ], + [ + 7, + 9 + ], + [ + 8, + 9 + ], + [ + 9, + 9 + ], + [ + -4096, + -4096 + ], + [ + -4089, + -4075 + ], + [ + -4082, + -4054 + ], + [ + -4075, + -4033 + ], + [ + -4068, + -4012 + ], + [ + -4061, + -3991 + ], + [ + -4054, + -3970 + ], + [ + -4047, + -3949 + ], + [ + -4040, + -3928 + ], + [ + -4033, + -3907 + ], + [ + -4026, + -3886 + ], + [ + -4019, + -3865 + ], + [ + -4012, + -3844 + ], + [ + -4005, + -3823 + ], + [ + -3998, + -3802 + ], + [ + -3991, + -3781 + ], + [ + -3984, + -3760 + ], + [ + -3977, + -3739 + ], + [ + -3970, + -3718 + ], + [ + -3963, + -3697 + ], + [ + -3956, + -3676 + ], + [ + -3949, + -3655 + ], + [ + -3942, + -3634 + ], + [ + -3935, + -3613 + ], + [ + -3928, + -3592 + ], + [ + -3921, + -3571 + ], + [ + -3914, + -3550 + ], + [ + -3907, + -3529 + ], + [ + -3900, + -3508 + ], + [ + -3893, + -3487 + ], + [ + -3886, + -3466 + ], + [ + -3879, + -3445 + ], + [ + -3872, + -3424 + ], + [ + -3865, + -3403 + ], + [ + -3858, + -3382 + ], + [ + -3851, + -3361 + ], + [ + -3844, + -3340 + ], + [ + -3837, + -3319 + ], + [ + -3830, + -3298 + ], + [ + -3823, + -3277 + ], + [ + -3816, + -3256 + ], + [ + -3809, + -3235 + ], + [ + -3802, + -3214 + ], + [ + -3795, + -3193 + ], + [ + -3788, + -3172 + ], + [ + -3781, + -3151 + ], + [ + -3774, + -3130 + ], + [ + -3767, + -3109 + ], + [ + -3760, + -4079 + ], + [ + -3753, + -4058 + ], + [ + -3746, + -4037 + ], + [ + -3739, + -4016 + ], + [ + -3732, + -3995 + ], + [ + -3725, + -3974 + ], + [ + -3718, + -3953 + ], + [ + -3711, + -3932 + ], + [ + -3704, + -3911 + ], + [ + -3697, + -3890 + ], + [ + -3690, + -3869 + ], + [ + -3683, + -3848 + ], + [ + -3676, + -3827 + ], + [ + -3669, + -3806 + ], + [ + -3662, + -3785 + ], + [ + -3655, + -3764 + ], + [ + -3648, + -3743 + ], + [ + -3641, + -3722 + ], + [ + -3634, + -3701 + ], + [ + -3627, + -3680 + ], + [ + -3620, + -3659 + ], + [ + -3613, + -3638 + ], + [ + -3606, + -3617 + ], + [ + -3599, + -3596 + ], + [ + -3592, + -3575 + ], + [ + -3585, + -3554 + ], + [ + -3578, + -3533 + ], + [ + -3571, + -3512 + ], + [ + -3564, + -3491 + ], + [ + -3557, + -3470 + ], + [ + -3550, + -3449 + ], + [ + -3543, + -3428 + ], + [ + -3536, + -3407 + ], + [ + -3529, + -3386 + ], + [ + -3522, + -3365 + ], + [ + -3515, + -3344 + ], + [ + -3508, + -3323 + ], + [ + -3501, + -3302 + ], + [ + -3494, + -3281 + ], + [ + -3487, + -3260 + ], + [ + -3480, + -3239 + ], + [ + -3473, + -3218 + ], + [ + -3466, + -3197 + ], + [ + -3459, + -3176 + ], + [ + -3452, + -3155 + ], + [ + -3445, + -3134 + ], + [ + -3438, + -3113 + ], + [ + -3431, + -4083 + ], + [ + -3424, + -4062 + ], + [ + -3417, + -4041 + ], + [ + -3410, + -4020 + ], + [ + -3403, + -3999 + ], + [ + -3396, + -3978 + ], + [ + -3389, + -3957 + ], + [ + -3382, + -3936 + ], + [ + -3375, + -3915 + ], + [ + -3368, + -3894 + ], + [ + -3361, + -3873 + ], + [ + -3354, + -3852 + ], + [ + -3347, + -3831 + ], + [ + -3340, + -3810 + ], + [ + -3333, + -3789 + ], + [ + -3326, + -3768 + ], + [ + -3319, + -3747 + ], + [ + -3312, + -3726 + ], + [ + -3305, + -3705 + ], + [ + -3298, + -3684 + ], + [ + -3291, + -3663 + ], + [ + -3284, + -3642 + ], + [ + -3277, + -3621 + ], + [ + -3270, + -3600 + ], + [ + -3263, + -3579 + ], + [ + -3256, + -3558 + ], + [ + -3249, + -3537 + ], + [ + -3242, + -3516 + ], + [ + -3235, + -3495 + ], + [ + -3228, + -3474 + ], + [ + -3221, + -3453 + ], + [ + -3214, + -3432 + ], + [ + -3207, + -3411 + ], + [ + -3200, + -3390 + ], + [ + -3193, + -3369 + ], + [ + -3186, + -3348 + ], + [ + -3179, + -3327 + ], + [ + -3172, + -3306 + ], + [ + -3165, + -3285 + ], + [ + -3158, + -3264 + ], + [ + -3151, + -3243 + ], + [ + -3144, + -3222 + ], + [ + -3137, + -3201 + ], + [ + -3130, + -3180 + ], + [ + -3123, + -3159 + ], + [ + -3116, + -3138 + ], + [ + -3109, + -3117 + ], + [ + -3102, + -4087 + ], + [ + -3095, + -4066 + ], + [ + -3088, + -4045 + ], + [ + -3081, + -4024 + ], + [ + -3074, + -4003 + ], + [ + -3067, + -3982 + ], + [ + -3060, + -3961 + ], + [ + -3053, + -3940 + ], + [ + -3046, + -3919 + ], + [ + -3039, + -3898 + ], + [ + -3032, + -3877 + ], + [ + -3025, + -3856 + ], + [ + -3018, + -3835 + ], + [ + -3011, + -3814 + ], + [ + -3004, + -3793 + ], + [ + -2997, + -3772 + ], + [ + -2990, + -3751 + ], + [ + -2983, + -3730 + ], + [ + -2976, + -3709 + ], + [ + -2969, + -3688 + ], + [ + -2962, + -3667 + ], + [ + -2955, + -3646 + ], + [ + -2948, + -3625 + ], + [ + -2941, + -3604 + ], + [ + -2934, + -3583 + ], + [ + -2927, + -3562 + ], + [ + -2920, + -3541 + ], + [ + -2913, + -3520 + ], + [ + -2906, + -3499 + ], + [ + -2899, + -3478 + ], + [ + -2892, + -3457 + ], + [ + -2885, + -3436 + ], + [ + -2878, + -3415 + ], + [ + -2871, + -3394 + ], + [ + -2864, + -3373 + ], + [ + -2857, + -3352 + ], + [ + -2850, + -3331 + ], + [ + -2843, + -3310 + ], + [ + -2836, + -3289 + ], + [ + -2829, + -3268 + ], + [ + -2822, + -3247 + ], + [ + -2815, + -3226 + ], + [ + -2808, + -3205 + ], + [ + -2801, + -3184 + ], + [ + -2794, + -3163 + ], + [ + -2787, + -3142 + ], + [ + -2780, + -3121 + ], + [ + -2773, + -4091 + ], + [ + -2766, + -4070 + ], + [ + -2759, + -4049 + ], + [ + -2752, + -4028 + ], + [ + -2745, + -4007 + ], + [ + -2738, + -3986 + ], + [ + -2731, + -3965 + ], + [ + -2724, + -3944 + ], + [ + -2717, + -3923 + ], + [ + -2710, + -3902 + ], + [ + -2703, + -3881 + ], + [ + -2696, + -3860 + ], + [ + -2689, + -3839 + ], + [ + -2682, + -3818 + ], + [ + -2675, + -3797 + ], + [ + -2668, + -3776 + ], + [ + -2661, + -3755 + ], + [ + -2654, + -3734 + ], + [ + -2647, + -3713 + ], + [ + -2640, + -3692 + ], + [ + -2633, + -3671 + ], + [ + -2626, + -3650 + ], + [ + -2619, + -3629 + ], + [ + -2612, + -3608 + ], + [ + -2605, + -3587 + ], + [ + -2598, + -3566 + ], + [ + -2591, + -3545 + ], + [ + -2584, + -3524 + ], + [ + -2577, + -3503 + ], + [ + -2570, + -3482 + ], + [ + -2563, + -3461 + ], + [ + -2556, + -3440 + ], + [ + -2549, + -3419 + ], + [ + -2542, + -3398 + ], + [ + -2535, + -3377 + ], + [ + -2528, + -3356 + ], + [ + -2521, + -3335 + ], + [ + -2514, + -3314 + ], + [ + -2507, + -3293 + ], + [ + -2500, + -3272 + ], + [ + -2493, + -3251 + ], + [ + -2486, + -3230 + ], + [ + -2479, + -3209 + ], + [ + -2472, + -3188 + ], + [ + -2465, + -3167 + ], + [ + -2458, + -3146 + ], + [ + -2451, + -3125 + ], + [ + -2444, + -4095 + ], + [ + -2437, + -4074 + ], + [ + -2430, + -4053 + ], + [ + -2423, + -4032 + ], + [ + -2416, + -4011 + ], + [ + -2409, + -3990 + ], + [ + -2402, + -3969 + ], + [ + -2395, + -3948 + ], + [ + -2388, + -3927 + ], + [ + -2381, + -3906 + ], + [ + -2374, + -3885 + ], + [ + -2367, + -3864 + ], + [ + -2360, + -3843 + ], + [ + -2353, + -3822 + ], + [ + -2346, + -3801 + ], + [ + -2339, + -3780 + ], + [ + -2332, + -3759 + ], + [ + -2325, + -3738 + ], + [ + -2318, + -3717 + ], + [ + -2311, + -3696 + ], + [ + -2304, + -3675 + ], + [ + -2297, + -3654 + ], + [ + -2290, + -3633 + ], + [ + -2283, + -3612 + ], + [ + -2276, + -3591 + ], + [ + -2269, + -3570 + ], + [ + -2262, + -3549 + ], + [ + -2255, + -3528 + ], + [ + -2248, + -3507 + ], + [ + -2241, + -3486 + ], + [ + -2234, + -3465 + ], + [ + -2227, + -3444 + ], + [ + -2220, + -3423 + ], + [ + -2213, + -3402 + ], + [ + -2206, + -3381 + ], + [ + -2199, + -3360 + ], + [ + -2192, + -3339 + ], + [ + -2185, + -3318 + ], + [ + -2178, + -3297 + ], + [ + -2171, + -3276 + ], + [ + -2164, + -3255 + ], + [ + -2157, + -3234 + ], + [ + -2150, + -3213 + ], + [ + -2143, + -3192 + ], + [ + -2136, + -3171 + ], + [ + -2129, + -3150 + ], + [ + -2122, + -3129 + ], + [ + -2115, + -3108 + ], + [ + -2108, + -4078 + ], + [ + -2101, + -4057 + ], + [ + -2094, + -4036 + ], + [ + -2087, + -4015 + ], + [ + -2080, + -3994 + ], + [ + -2073, + -3973 + ], + [ + -2066, + -3952 + ], + [ + -2059, + -3931 + ], + [ + -2052, + -3910 + ], + [ + -2045, + -3889 + ], + [ + -2038, + -3868 + ], + [ + -2031, + -3847 + ], + [ + -2024, + -3826 + ], + [ + -2017, + -3805 + ], + [ + -2010, + -3784 + ], + [ + -2003, + -3763 + ], + [ + -1996, + -3742 + ], + [ + -1989, + -3721 + ], + [ + -1982, + -3700 + ], + [ + -1975, + -3679 + ], + [ + -1968, + -3658 + ], + [ + -1961, + -3637 + ], + [ + -1954, + -3616 + ], + [ + -1947, + -3595 + ], + [ + -1940, + -3574 + ], + [ + -1933, + -3553 + ], + [ + -1926, + -3532 + ], + [ + -1919, + -3511 + ], + [ + -1912, + -3490 + ], + [ + -1905, + -3469 + ], + [ + -1898, + -3448 + ], + [ + -1891, + -3427 + ], + [ + -1884, + -3406 + ], + [ + -1877, + -3385 + ], + [ + -1870, + -3364 + ], + [ + -1863, + -3343 + ], + [ + -1856, + -3322 + ], + [ + -1849, + -3301 + ], + [ + -1842, + -3280 + ], + [ + -1835, + -3259 + ], + [ + -1828, + -3238 + ], + [ + -1821, + -3217 + ], + [ + -1814, + -3196 + ], + [ + -1807, + -3175 + ], + [ + -1800, + -3154 + ], + [ + -1793, + -3133 + ], + [ + -1786, + -3112 + ], + [ + -1779, + -4082 + ], + [ + -1772, + -4061 + ], + [ + -1765, + -4040 + ], + [ + -1758, + -4019 + ], + [ + -1751, + -3998 + ], + [ + -1744, + -3977 + ], + [ + -1737, + -3956 + ], + [ + -1730, + -3935 + ], + [ + -1723, + -3914 + ], + [ + -1716, + -3893 + ], + [ + -1709, + -3872 + ], + [ + -1702, + -3851 + ], + [ + -1695, + -3830 + ], + [ + -1688, + -3809 + ], + [ + -1681, + -3788 + ], + [ + -1674, + -3767 + ], + [ + -1667, + -3746 + ], + [ + -1660, + -3725 + ], + [ + -1653, + -3704 + ], + [ + -1646, + -3683 + ], + [ + -1639, + -3662 + ], + [ + -1632, + -3641 + ], + [ + -1625, + -3620 + ], + [ + -1618, + -3599 + ], + [ + -1611, + -3578 + ], + [ + -1604, + -3557 + ], + [ + -1597, + -3536 + ], + [ + -1590, + -3515 + ], + [ + -1583, + -3494 + ], + [ + -1576, + -3473 + ], + [ + -1569, + -3452 + ], + [ + -1562, + -3431 + ], + [ + -1555, + -3410 + ], + [ + -1548, + -3389 + ], + [ + -1541, + -3368 + ], + [ + -1534, + -3347 + ], + [ + -1527, + -3326 + ], + [ + -1520, + -3305 + ], + [ + -1513, + -3284 + ], + [ + -1506, + -3263 + ], + [ + -1499, + -3242 + ], + [ + -1492, + -3221 + ], + [ + -1485, + -3200 + ], + [ + -1478, + -3179 + ], + [ + -1471, + -3158 + ], + [ + -1464, + -3137 + ], + [ + -1457, + -3116 + ], + [ + -1450, + -4086 + ], + [ + -1443, + -4065 + ], + [ + -1436, + -4044 + ], + [ + -1429, + -4023 + ], + [ + -1422, + -4002 + ], + [ + -1415, + -3981 + ], + [ + -1408, + -3960 + ], + [ + -1401, + -3939 + ], + [ + -1394, + -3918 + ], + [ + -1387, + -3897 + ], + [ + -1380, + -3876 + ], + [ + -1373, + -3855 + ], + [ + -1366, + -3834 + ], + [ + -1359, + -3813 + ], + [ + -1352, + -3792 + ], + [ + -1345, + -3771 + ], + [ + -1338, + -3750 + ], + [ + -1331, + -3729 + ], + [ + -1324, + -3708 + ], + [ + -1317, + -3687 + ], + [ + -1310, + -3666 + ], + [ + -1303, + -3645 + ], + [ + 0, + 0 + ], + [ + 35, + 77 + ], + [ + 70, + 154 + ], + [ + 105, + 231 + ], + [ + 140, + 308 + ], + [ + 175, + 385 + ], + [ + 210, + 462 + ], + [ + 245, + 539 + ], + [ + 280, + 616 + ], + [ + 315, + 693 + ], + [ + 350, + 770 + ], + [ + 385, + 847 + ], + [ + 420, + 924 + ], + [ + 455, + 1001 + ], + [ + 490, + 1078 + ], + [ + 525, + 1155 + ], + [ + 560, + 1232 + ], + [ + 595, + 1309 + ], + [ + 630, + 1386 + ], + [ + 665, + 1463 + ], + [ + 700, + 1540 + ], + [ + 735, + 1617 + ], + [ + 770, + 1694 + ], + [ + 805, + 1771 + ], + [ + 840, + 1848 + ], + [ + 875, + 1925 + ], + [ + 910, + 2002 + ], + [ + 945, + 2079 + ], + [ + 980, + 2156 + ], + [ + 1015, + 2233 + ], + [ + 1050, + 2310 + ], + [ + 1085, + 2387 + ], + [ + 1120, + 2464 + ], + [ + 1155, + 2541 + ], + [ + 1190, + 2618 + ], + [ + 1225, + 2695 + ], + [ + 1260, + 2772 + ], + [ + 1295, + 2849 + ], + [ + 1330, + 2926 + ], + [ + 1365, + 3003 + ], + [ + 1400, + 3080 + ], + [ + 1435, + 3157 + ], + [ + 1470, + 3234 + ], + [ + 1505, + 3311 + ], + [ + 1540, + 3388 + ], + [ + 1575, + 3465 + ], + [ + 1610, + 3542 + ], + [ + 1645, + 3619 + ], + [ + 1680, + 3696 + ], + [ + 1715, + 3773 + ], + [ + 1750, + 3850 + ], + [ + 1785, + 3927 + ], + [ + 1820, + 4004 + ], + [ + 1855, + 4081 + ], + [ + 1890, + 62 + ], + [ + 1925, + 139 + ], + [ + 1960, + 216 + ], + [ + 1995, + 293 + ], + [ + 2030, + 370 + ], + [ + 2065, + 447 + ], + [ + 2100, + 524 + ], + [ + 2135, + 601 + ], + [ + 2170, + 678 + ], + [ + 2205, + 755 + ], + [ + 2240, + 832 + ], + [ + 2275, + 909 + ], + [ + 2310, + 986 + ], + [ + 2345, + 1063 + ], + [ + 2380, + 1140 + ], + [ + 2415, + 1217 + ], + [ + 2450, + 1294 + ], + [ + 2485, + 1371 + ], + [ + 2520, + 1448 + ], + [ + 2555, + 1525 + ], + [ + 2590, + 1602 + ], + [ + 2625, + 1679 + ], + [ + 2660, + 1756 + ], + [ + 2695, + 1833 + ], + [ + 2730, + 1910 + ], + [ + 2765, + 1987 + ], + [ + 2800, + 2064 + ], + [ + 2835, + 2141 + ], + [ + 2870, + 2218 + ], + [ + 2905, + 2295 + ], + [ + 2940, + 2372 + ], + [ + 2975, + 2449 + ], + [ + 3010, + 2526 + ], + [ + 3045, + 2603 + ], + [ + 3080, + 2680 + ], + [ + 3115, + 2757 + ], + [ + 3150, + 2834 + ], + [ + 3185, + 2911 + ], + [ + 3220, + 2988 + ], + [ + 3255, + 3065 + ], + [ + 3290, + 3142 + ], + [ + 3325, + 3219 + ], + [ + 3360, + 3296 + ], + [ + 3395, + 3373 + ], + [ + 3430, + 3450 + ], + [ + 3465, + 3527 + ], + [ + 3500, + 3604 + ], + [ + 3535, + 3681 + ], + [ + 3570, + 3758 + ], + [ + 3605, + 3835 + ], + [ + 3640, + 3912 + ], + [ + 3675, + 3989 + ], + [ + 3710, + 4066 + ], + [ + 3745, + 47 + ], + [ + 3780, + 124 + ], + [ + 3815, + 201 + ], + [ + 3850, + 278 + ], + [ + 3885, + 355 + ], + [ + 3920, + 432 + ], + [ + 3955, + 509 + ], + [ + 3990, + 586 + ], + [ + 4025, + 663 + ], + [ + 4060, + 740 + ], + [ + 4095, + 817 + ], + [ + 34, + 894 + ], + [ + 69, + 971 + ], + [ + 104, + 1048 + ], + [ + 139, + 1125 + ], + [ + 174, + 1202 + ], + [ + 209, + 1279 + ], + [ + 244, + 1356 + ], + [ + 279, + 1433 + ], + [ + 314, + 1510 + ], + [ + 349, + 1587 + ], + [ + 384, + 1664 + ], + [ + 419, + 1741 + ], + [ + 454, + 1818 + ], + [ + 489, + 1895 + ], + [ + 524, + 1972 + ], + [ + 559, + 2049 + ], + [ + 594, + 2126 + ], + [ + 629, + 2203 + ], + [ + 664, + 2280 + ], + [ + 699, + 2357 + ], + [ + 734, + 2434 + ], + [ + 769, + 2511 + ], + [ + 804, + 2588 + ], + [ + 839, + 2665 + ], + [ + 874, + 2742 + ], + [ + 909, + 2819 + ], + [ + 944, + 2896 + ], + [ + 979, + 2973 + ], + [ + 1014, + 3050 + ], + [ + 1049, + 3127 + ], + [ + 1084, + 3204 + ], + [ + 1119, + 3281 + ], + [ + 1154, + 3358 + ], + [ + 1189, + 3435 + ], + [ + 1224, + 3512 + ], + [ + 1259, + 3589 + ], + [ + 1294, + 3666 + ], + [ + 1329, + 3743 + ], + [ + 1364, + 3820 + ], + [ + 1399, + 3897 + ], + [ + 1434, + 3974 + ], + [ + 1469, + 4051 + ], + [ + 1504, + 32 + ], + [ + 1539, + 109 + ], + [ + 1574, + 186 + ], + [ + 1609, + 263 + ], + [ + 1644, + 340 + ], + [ + 1679, + 417 + ], + [ + 1714, + 494 + ], + [ + 1749, + 571 + ], + [ + 1784, + 648 + ], + [ + 1819, + 725 + ], + [ + 1854, + 802 + ], + [ + 1889, + 879 + ], + [ + 1924, + 956 + ], + [ + 1959, + 1033 + ], + [ + 1994, + 1110 + ], + [ + 2029, + 1187 + ], + [ + 2064, + 1264 + ], + [ + 2099, + 1341 + ], + [ + 2134, + 1418 + ], + [ + 2169, + 1495 + ], + [ + 2204, + 1572 + ], + [ + 2239, + 1649 + ], + [ + 2274, + 1726 + ], + [ + 2309, + 1803 + ], + [ + 2344, + 1880 + ], + [ + 2379, + 1957 + ], + [ + 2414, + 2034 + ], + [ + 2449, + 2111 + ], + [ + 2484, + 2188 + ], + [ + 2519, + 2265 + ], + [ + 2554, + 2342 + ], + [ + 2589, + 2419 + ], + [ + 2624, + 2496 + ], + [ + 2659, + 2573 + ], + [ + 2694, + 2650 + ], + [ + 2729, + 2727 + ], + [ + 2764, + 2804 + ], + [ + 2799, + 2881 + ], + [ + 2834, + 2958 + ], + [ + 2869, + 3035 + ], + [ + 2904, + 3112 + ], + [ + 2939, + 3189 + ], + [ + 2974, + 3266 + ], + [ + 3009, + 3343 + ], + [ + 3044, + 3420 + ], + [ + 3079, + 3497 + ], + [ + 3114, + 3574 + ], + [ + 3149, + 3651 + ], + [ + 3184, + 3728 + ], + [ + 3219, + 3805 + ], + [ + 3254, + 3882 + ], + [ + 3289, + 3959 + ], + [ + 3324, + 4036 + ], + [ + 3359, + 17 + ], + [ + 3394, + 94 + ], + [ + 3429, + 171 + ], + [ + 3464, + 248 + ], + [ + 3499, + 325 + ], + [ + 3534, + 402 + ], + [ + 3569, + 479 + ], + [ + 3604, + 556 + ], + [ + 3639, + 633 + ], + [ + 3674, + 710 + ], + [ + 3709, + 787 + ], + [ + 3744, + 864 + ], + [ + 3779, + 941 + ], + [ + 3814, + 1018 + ], + [ + 3849, + 1095 + ], + [ + 3884, + 1172 + ], + [ + 3919, + 1249 + ], + [ + 3954, + 1326 + ], + [ + 3989, + 1403 + ], + [ + 4024, + 1480 + ], + [ + 4059, + 1557 + ], + [ + 4094, + 1634 + ], + [ + 33, + 1711 + ], + [ + 68, + 1788 + ], + [ + 103, + 1865 + ], + [ + 138, + 1942 + ], + [ + 173, + 2019 + ], + [ + 208, + 2096 + ], + [ + 243, + 2173 + ], + [ + 278, + 2250 + ], + [ + 313, + 2327 + ], + [ + 348, + 2404 + ], + [ + 383, + 2481 + ], + [ + 418, + 2558 + ], + [ + 453, + 2635 + ], + [ + 488, + 2712 + ], + [ + 523, + 2789 + ], + [ + 558, + 2866 + ], + [ + 593, + 2943 + ], + [ + 628, + 3020 + ], + [ + 663, + 3097 + ], + [ + 698, + 3174 + ], + [ + 733, + 3251 + ], + [ + 768, + 3328 + ], + [ + 803, + 3405 + ], + [ + 838, + 3482 + ], + [ + 873, + 3559 + ], + [ + 908, + 3636 + ], + [ + 943, + 3713 + ], + [ + 978, + 3790 + ], + [ + 1013, + 3867 + ], + [ + 1048, + 3944 + ], + [ + 1083, + 4021 + ], + [ + 1118, + 2 + ], + [ + 1153, + 79 + ], + [ + 1188, + 156 + ], + [ + 1223, + 233 + ], + [ + 1258, + 310 + ], + [ + 1293, + 387 + ], + [ + 1328, + 464 + ], + [ + 1363, + 541 + ], + [ + 1398, + 618 + ], + [ + 1433, + 695 + ], + [ + 1468, + 772 + ], + [ + 1503, + 849 + ], + [ + 1538, + 926 + ], + [ + 1573, + 1003 + ], + [ + 1608, + 1080 + ], + [ + 1643, + 1157 + ], + [ + 1678, + 1234 + ], + [ + 1713, + 1311 + ], + [ + 1748, + 1388 + ], + [ + 1783, + 1465 + ], + [ + 1818, + 1542 + ], + [ + 1853, + 1619 + ], + [ + 1888, + 1696 + ], + [ + 1923, + 1773 + ], + [ + 1958, + 1850 + ], + [ + 1993, + 1927 + ], + [ + 2028, + 2004 + ], + [ + 2063, + 2081 + ], + [ + 2098, + 2158 + ], + [ + 2133, + 2235 + ], + [ + 2168, + 2312 + ], + [ + 2203, + 2389 + ], + [ + 2238, + 2466 + ], + [ + 2273, + 2543 + ], + [ + 2308, + 2620 + ], + [ + 2343, + 2697 + ], + [ + 2378, + 2774 + ], + [ + 2413, + 2851 + ], + [ + 2448, + 2928 + ], + [ + 2483, + 3005 + ], + [ + 2518, + 3082 + ], + [ + 2553, + 3159 + ], + [ + 2588, + 3236 + ], + [ + 2623, + 3313 + ], + [ + 2658, + 3390 + ], + [ + 2693, + 3467 + ], + [ + 2728, + 3544 + ], + [ + 2763, + 3621 + ], + [ + 2798, + 3698 + ], + [ + 2833, + 3775 + ], + [ + 2868, + 3852 + ], + [ + 2903, + 3929 + ], + [ + 2938, + 4006 + ], + [ + 2973, + 4083 + ], + [ + 3008, + 64 + ], + [ + 3043, + 141 + ], + [ + 3078, + 218 + ], + [ + 3113, + 295 + ], + [ + 3148, + 372 + ], + [ + 3183, + 449 + ], + [ + 3218, + 526 + ], + [ + 3253, + 603 + ], + [ + 3288, + 680 + ], + [ + 3323, + 757 + ], + [ + 3358, + 834 + ], + [ + 3393, + 911 + ], + [ + 3428, + 988 + ], + [ + 3463, + 1065 + ], + [ + 3498, + 1142 + ], + [ + 3533, + 1219 + ], + [ + 3568, + 1296 + ], + [ + 3603, + 1373 + ], + [ + 3638, + 1450 + ], + [ + 3673, + 1527 + ], + [ + 3708, + 1604 + ], + [ + 3743, + 1681 + ], + [ + 3778, + 1758 + ], + [ + 3813, + 1835 + ], + [ + 3848, + 1912 + ], + [ + 3883, + 1989 + ], + [ + 3918, + 2066 + ], + [ + 3953, + 2143 + ], + [ + 3988, + 2220 + ], + [ + 4023, + 2297 + ], + [ + 4058, + 2374 + ], + [ + 4093, + 2451 + ], + [ + 32, + 2528 + ], + [ + 67, + 2605 + ], + [ + 102, + 2682 + ], + [ + 137, + 2759 + ], + [ + 172, + 2836 + ], + [ + 207, + 2913 + ], + [ + 242, + 2990 + ], + [ + 277, + 3067 + ], + [ + 312, + 3144 + ], + [ + 347, + 3221 + ], + [ + 382, + 3298 + ], + [ + 417, + 3375 + ], + [ + 452, + 3452 + ], + [ + 487, + 3529 + ], + [ + 522, + 3606 + ], + [ + 557, + 3683 + ], + [ + 592, + 3760 + ], + [ + 627, + 3837 + ], + [ + 662, + 3914 + ], + [ + 697, + 3991 + ], + [ + 732, + 4068 + ], + [ + 767, + 49 + ], + [ + 802, + 126 + ], + [ + 837, + 203 + ], + [ + 872, + 280 + ], + [ + 907, + 357 + ], + [ + 942, + 434 + ], + [ + 977, + 511 + ], + [ + 1012, + 588 + ], + [ + 1047, + 665 + ], + [ + 1082, + 742 + ], + [ + 1117, + 819 + ], + [ + 1152, + 896 + ], + [ + 1187, + 973 + ], + [ + 1222, + 1050 + ], + [ + 1257, + 1127 + ], + [ + 1292, + 1204 + ], + [ + 1327, + 1281 + ], + [ + 1362, + 1358 + ], + [ + 1397, + 1435 + ], + [ + 1432, + 1512 + ], + [ + 1467, + 1589 + ], + [ + 1502, + 1666 + ], + [ + 1537, + 1743 + ], + [ + 1572, + 1820 + ], + [ + 1607, + 1897 + ], + [ + 1642, + 1974 + ], + [ + 1677, + 2051 + ] + ], + "cases": [ + { + "name": "checker-2x2-s0", + "patternData": "AAAABg", + "width": 2, + "height": 2, + "scale": 0, + "expect": "101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111110000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111110000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" + }, + { + "name": "stripes_v-3x5-s0", + "patternData": "AAgMkiQ", + "width": 3, + "height": 5, + "scale": 0, + "expect": "101101101101101101110110110110110110111011011011011011011101101101101101101110110110110110110111011011011011011011101101101101101101110110110110110110111011011011011011011101101101101101101110110110110110110111011011011011011011101101101101101101110110110110110110111011011011011011011101101101101101101110110110110110110111011011011011011011101101101101101101111011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011101101101101101101101101101101101101101101101101101101101101101101101101101101101101101101101101101101101101101101101011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011011110110110110110110110110110110110110110110110110110110110110110110110110110110110110110110110110110110110110110110110101101101101101101101101101101101101101101101101" + }, + { + "name": "stripes_h-8x8-s0", + "patternData": "ADAYAP8A_wD_AP8", + "width": 8, + "height": 8, + "scale": 0, + "expect": "000000000000000000011111111111111111110000000000000000000111111111111111111100000000000000000001111111111111111111000000000000000000011111111111111111110000000000000000000111111111111111111100000000000000000001111111111111111111000000000000000000011111111111111111110000000000000000000111111111111111111100000000000000000001111111111111111111000000000000000000010101010101010101010101010101010101010101010101001010101010101010101010101010101010101010101010010101010101010101010101010101010101010101010100101010101010101010101010101010101010101010101001010101010101010101010101010101010101010101010010101010101010101010101010101010101010101010101101010101010101010101010101010101010101010101011010101010101010101010101010101010101010101010110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010" + }, + { + "name": "diagonal-17x9-s0", + "patternData": "AHgcMzPNzDAzy8w8M9PMDDOzzMwzMwE", + "width": 17, + "height": 9, + "scale": 0, + "expect": "001100110001100110010011001110011001101100110011100110011011001100011001100100110011000110011001001100111001100110110011001110011001101100110001100110010011001100011001100001100110001100110010011001110011001101100110011100110011011001100011001100100110011000110011001001100111001100110110011001110011001101100110001100110010011001100011001100001100110001100110001101001000000000000000000010110111111111111111111111111111111101101001000000000000000000010010000000010010110111111111111111111101001000000000100000000000000000001011011111111111111111110111111111110110100100000000000000000001001011111001001011011111111111111111110100100000000000000000000000000000101101111111111111111111011010011111011010010000000000000000000100101111111111101101111111111111111110000111100011110000011110001111000001111000011100000011000111100011111100011110000111110000111000011101000011000111100001110000111000010111000011110001111110001100001110100001110000111100000111100011110000011110001100001011100001111000111100011110000111110000111000011000001111000111100000111100001110000001110000111000011110001111000011111000011100001100000111100011110000111000011100001011100001111" + }, + { + "name": "one-bit-33x16-s0", + "patternData": "APg4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA", + "width": 33, + "height": 16, + "scale": 0, + "expect": "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111101111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111101111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111101111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" + }, + { + "name": "all-but-one-129x65-s0", + "patternData": "APj__v___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________wE", + "width": 129, + "height": 65, + "scale": 0, + "expect": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "stripes_v-2x2-s1", + "patternData": "AAEACg", + "width": 2, + "height": 2, + "scale": 1, + "expect": "011001100110011001101100110011001100110110011001100110011011001100110011001101100110011001100110110011001100110011011001100110011001101100110011001100110110011001100110011011001100110011001101100110011001100110110011001100110011011001100110011001101100110011001100110110011001100110011011001100110011001101100110011001100110110011001100110011011001100110011001110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001" + }, + { + "name": "stripes_h-3x5-s1", + "patternData": "AAkMOA4", + "width": 3, + "height": 5, + "scale": 1, + "expect": "111111111111111111100000000000000000000000000000000000000111111111111111111111111111111111111110000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111110000000000000000000000000000000000000011111111111111111111111111111111111111000000000000000000000000000000000000001111111111111111111111111111111111111111001111001100111100110011110011001111001100111110011001111001100111100110011110011001111001100011110011001111001100111100110011110011001111000110011110011001111001100111100110011110011001111100110011110011001111001100111100110011110011100111100110011110011001111001100111100110011110001100111100110011110011001111001100111100110011111001100111100110011110011001111001100111100111001111001100111100111011110100101111010010111101001011110100101111010010110100101111010010111101001011110100101111010010111101001111010010111101001011110100101111010010111101001011010010111101001011110100101111010010111101001011110100111101001011110100101111010010111101001011110100101101001011110100101111010010111101001011110100101111010011110100101111010010111101001011110100101111010010111100101111010010111101001011" + }, + { + "name": "diagonal-8x8-s1", + "patternData": "ADEYM2bMmTNmzJk", + "width": 8, + "height": 8, + "scale": 1, + "expect": "000111100001111000010000111100001111001000011110000111100111000011110000111111100001111000011110111100001111000011011110000111100001100011110000111100000001111000011110000100001111000011110010000111100001111001110000111100001111111000011110000111101111000011110000110111100001111000011000111100001111000000011110000111100001000011110000111100100001111000011110000110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001110011001100110011001100110011001100110011001100011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100011001100110011001100110011001100110011001100111001100110011001100110011001100110011001100110011001100110011001100110110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110" + }, + { + "name": "one-bit-17x9-s1", + "patternData": "AHkcAAAAAAAAAAAAAAAAAAAAAAAAAAE", + "width": 17, + "height": 9, + "scale": 1, + "expect": "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110011111111111111111001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111101111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111011111111111111111111111111111111111111111111111111111111111111111111111111111111111101111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111101111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" + }, + { + "name": "all-but-one-33x16-s1", + "patternData": "APk4_v______________________________________________________________________________________", + "width": 33, + "height": 16, + "scale": 1, + "expect": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110000000000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "checker-129x65-s1", + "patternData": "APn_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqgA", + "width": 129, + "height": 65, + "scale": 1, + "expect": "100110011110011001101100110000110011000110011000011001100100110011110011001110011001111001100110110011000011001100011001100001100110010011001111001100111001100111100110011100110011110011001110011001111001100110110011000011001100011001100001100110010011001111001100111001100111100110011011001100001100110001100110000110011001001100111100110011100110011110011001110100101011010100101011010100101001101010010101100011111100000011111101111110000001111110000001101101010011010010101001010110101001010110101001001111110000000111111000000111111000011000000010110101011010100101011010101010100101010010101111100000011111100111100000011111110000001111110101101001101010010101101010110101001010110100111110000001111110000000111111000001000000111111010110101001010100101011001100000111000001100000110000011100000110000011100000011011001100100111010001100100111010011101000110010001111100011111001101100110110001111100110110001011000010011001001100000111001001100000110001011100100110001001110000011001001100100111010001101100111010011101010011111001111100011111001111100111110001111100111110000101110010011001101100010111001001100000110000011100000011001001110100011001001" + }, + { + "name": "stripes_h-2x2-s2", + "patternData": "AAIADA", + "width": 2, + "height": 2, + "scale": 2, + "expect": "000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111110000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111110100101101001011010010110100101101001011010010110110100101101001011010010110100101101001011010010010110100101101001011010010110100101101001011011010010110100101101001011010010110100101101001001011010010110100101101001011010010110100101101101001011010010110100101101001011010010110100100101101001011010010110100101101001011010010110110100101101001011010010110100101101001011010010010110100101101001011010010110100101101001011010010110100101101001011010010110100101101001011010010110100101101001011010010110100101101001011010010110100101101001011010010110100101101001011010010110100101101001011010010110100101101001011010010110100101101001011010010110100101101001011010010110100101101001011010010110100101101001011010010110100101101001011010010110100101101001011010010110100101101001011010010110100101" + }, + { + "name": "diagonal-3x5-s2", + "patternData": "AAoMMzM", + "width": 3, + "height": 5, + "scale": 2, + "expect": "111110000111111110001111111100001111110111111110000111111011111111000011111101111111100001111110000011110000000011000001111000000001100000111100000000110000011110000000011000001111000000001100000111100000000110000011110000000011000001111000000001110000000011110000001000000001111000000100000000111100000010000000011110000001111100001111111100111110000111111110001001110111010100001000101010101010010101010101110101010101010100001010101011111111010100000000010100010001101110101010010001010101010100001011010100001000101011101110010100010001100110001001110110001010001001110111010100001000101010101000101010101010010101010101010100001010101011111010101011101110010100010001101110101010010001011010011001110111010100001000101011101110010100001010010101010101110110110000000111111110000011011111000000001101111000100000000111111110000011011111000000001101111000100000111111111110000100000001111111100000110111110000000011011111001100000001111111100000110111110000000011011110001100000001111111100000000000011111111000001101111100000010000011110011000000011111111000001101111100000000100011110011000000011111111000001000000111111110000011001101111000100000111100110" + }, + { + "name": "one-bit-8x8-s2", + "patternData": "ADIYAAAAAAAAAIA", + "width": 8, + "height": 8, + "scale": 2, + "expect": "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100001111111111111110000111111111111111000011111111111111100001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111101111111111111111111111111111111011111111111111111111111111111110111111111111111111111111111111101111111101111111111111111111111011111111011111111111111111111111111111110111111111111111111111111111111101111111111111111111111111111111011111111011111111111111111111110111111110111111111111111111111111111111101111111111111111111111111111111011111111111111111111111111111110111111110111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" + }, + { + "name": "all-but-one-17x9-s2", + "patternData": "AHoc_v_______________________wE", + "width": 17, + "height": 9, + "scale": 2, + "expect": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111100000000000000011110000000000000001111000000000000000111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "checker-33x16-s2", + "patternData": "APo4qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", + "width": 33, + "height": 16, + "scale": 2, + "expect": "011110000000011110010000111111110000111000011111111000011100001111111100001110000111111110000110111100000000111100011110000000011110001111000000001111000111100000000111100100001111111100001110000111111110000111000011111111000011100001111111100001101111000000001111000111100000000111100011110000000011110001111000000001111001000011111111000011100001111111100001110100010001000100010110111011101110111000010001000110011000011001100110011000011001100110011001011101110111011101101000100010001000101101110111010101010010101010101010101001010101010101010100111011101110111010010001000100010001111011101110011001111001100110011001101001100110011001100000100010001000100001110111011101110110100010001010101011010101010101010101101010101010101010110001000100010001001011000011110000111100101101001011010110100101101001011000011110000111110000111100001101001011010010110101101001011010011001111000011110000011110000111100101101001011010010100101101001011000011110000111110000111100001111001011010010110101010110100101101001111000011110000011110000111100001101001011010010100101101001011010011110000111100000111100001111001100101101001011010110100101101001011000011110000" + }, + { + "name": "stripes_v-129x65-s2", + "patternData": "APr_qqqqqqqqqqqqqqqqqqqqqlRVVVVVVVVVVVVVVVVVVVWpqqqqqqqqqqqqqqqqqqqqUlVVVVVVVVVVVVVVVVVVVaWqqqqqqqqqqqqqqqqqqqpKVVVVVVVVVVVVVVVVVVVVlaqqqqqqqqqqqqqqqqqqqipVVVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqlRVVVVVVVVVVVVVVVVVVVWpqqqqqqqqqqqqqqqqqqqqUlVVVVVVVVVVVVVVVVVVVaWqqqqqqqqqqqqqqqqqqqpKVVVVVVVVVVVVVVVVVVVVlaqqqqqqqqqqqqqqqqqqqipVVVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqlRVVVVVVVVVVVVVVVVVVVWpqqqqqqqqqqqqqqqqqqqqUlVVVVVVVVVVVVVVVVVVVaWqqqqqqqqqqqqqqqqqqqpKVVVVVVVVVVVVVVVVVVVVlaqqqqqqqqqqqqqqqqqqqipVVVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqlRVVVVVVVVVVVVVVVVVVVWpqqqqqqqqqqqqqqqqqqqqUlVVVVVVVVVVVVVVVVVVVaWqqqqqqqqqqqqqqqqqqqpKVVVVVVVVVVVVVVVVVVVVlaqqqqqqqqqqqqqqqqqqqipVVVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqlRVVVVVVVVVVVVVVVVVVVWpqqqqqqqqqqqqqqqqqqqqUlVVVVVVVVVVVVVVVVVVVaWqqqqqqqqqqqqqqqqqqqpKVVVVVVVVVVVVVVVVVVVVlaqqqqqqqqqqqqqqqqqqqipVVVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqlRVVVVVVVVVVVVVVVVVVVWpqqqqqqqqqqqqqqqqqqqqUlVVVVVVVVVVVVVVVVVVVaWqqqqqqqqqqqqqqqqqqqpKVVVVVVVVVVVVVVVVVVVVlaqqqqqqqqqqqqqqqqqqqipVVVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqlRVVVVVVVVVVVVVVVVVVVWpqqqqqqqqqqqqqqqqqqqqUlVVVVVVVVVVVVVVVVVVVaWqqqqqqqqqqqqqqqqqqqpKVVVVVVVVVVVVVVVVVVVVlaqqqqqqqqqqqqqqqqqqqipVVVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqlRVVVVVVVVVVVVVVVVVVVWpqqqqqqqqqqqqqqqqqqqqUlVVVVVVVVVVVVVVVVVVVaWqqqqqqqqqqqqqqqqqqqpKVVVVVVVVVVVVVVVVVVVVlaqqqqqqqqqqqqqqqqqqqipVVVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqgA", + "width": 129, + "height": 65, + "scale": 2, + "expect": "100001111111100001110000111111110000111000011111111000011100001111111100001110000111111110000111000011111111000011100001111111100001110000111111110000111000011111111000011100001111111100001110000111111110000111000011111111000011100001111111100001110000111111110000111000011111111000011100001111111100001110000111111110000111000011111111000011100001111111100001110000111100001111000011110000111100001111000011110000111100001111000010001111000011110000111100001111000011110000111100001111000011110000111100110000111100001111000011110000111100001111000011110000111100001111000011111111000011110000111100001111000011110000111100001111000011110000111100001100111100001111000011110000111100001111000011110000111100001111000011110001000011110000111100001111000011110001101001011010011001011010010111011010010110101010010110100110010110100101110110100101101010100101101001000101101001011101101001011011101001011010011001011010010111011010010110111010010110100110010110100101110110100101101010100101101001100101101001010101101001011011101001011010011001011010010111011010010110111010010110100110010110100101110110100101101110100101101000100101101001010101101001011011101" + }, + { + "name": "diagonal-2x2-s3", + "patternData": "AAMACw", + "width": 2, + "height": 2, + "scale": 3, + "expect": "000000000000000000010000000011111111001000000001111111100100000000111111110010000000011111111001000000001111111100100000000111111110010000000011111111001000000001111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000001111111100100000000111111110000010100000010000001010000001000000101000000100000000100000010000000010000001000000001000000100000000100000010100000010000001010000001000000101001000100000010100100010000001010010001000000101001000100000000100100010000000010010001000000001001000101000000100100010100000010010001010000001001000101001000100100010100100010010001010010001001000001001000100100000100100010010000010010001011000001001000100110001100011100011000110001110001100011000111000110001100011100011000110001110001100011000111000110001100011100011000110001110001100011000111000110001100011100011000110001110001100011000111000110001100011100011000110001110001100011000111000110001100011100011000110001110001100011000111000110001100011100011000110001110001100011000111000110001100011100011000110001110001100011000111000110001100011100" + }, + { + "name": "one-bit-3x5-s3", + "patternData": "AAsMAEA", + "width": 3, + "height": 5, + "scale": 3, + "expect": "111111111111111111110000000011111111111000000001111111111100000000111111111110000000011111111111000000001111111111100000000111111111110000000011111111111000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111011101111111111111111011101111111111111111111111111111101111111111111111011101111111111111111111111111111111111111111111111111101111110111011111111111111110111111111111111111111111111111111011111111111111110111011111111111111110111111111111011111111111111111111011111111111111111111111111101111111111111111011111011111111110111111111111111101111111111111111011101111111111110111111111111111101101111111111110111111111111011111111111101111111111111111111110111111111111011111111111101111111111110101111110111111111110111111111111111111111111111111111111011111111110111111111111111111111111111111111111111111111110111111111111111111111111111011111111111101111111101111111111110111111111111011111111111101111111111111111111110111111111111011111111111011111111111111111111101111111111110101111111" + }, + { + "name": "all-but-one-8x8-s3", + "patternData": "ADMY_v________8", + "width": 8, + "height": 8, + "scale": 3, + "expect": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111110000000000011111111000000000001111111100000000000111111110000000000011111111000000000001111111100000000000111111110000000000011111111000000000000000000000000000000000000000010000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000100000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000" + }, + { + "name": "checker-17x9-s3", + "patternData": "AHscqqqqqqqqqqqqqqqqqqqqqqqqqgA", + "width": 17, + "height": 9, + "scale": 3, + "expect": "100000000000000001101111111111111111000111111111111111100011111111111111110001111111111111111000111111111111111100011111111111111110001111111111111111000111111111111111100011111111111111110001111111111111111000111111111111111100011111111111111110001111111111111111000111111111111111100011111111111111110001111111111111111001000000000000000011100000000000000001111110010001000000110011100010010001000000101101100010000001100110000001000010000110010110000001000111001100000010001001111001001100000010000110111001001010100111000110111001001011011111000100101001111101001011100000110110111101001011100011010100100100000010011011010100100100111110011011010100111000101111000011010011011000101111000011100011011100100100101111100011011100111010101101100010011111111111101101011011011001001010010001011001011110001000011011100110100001101111110100111101110000101100001100110110010101011011010110001010010010101011010110100101010001001011101101011011011001101000011001111001011110000111100100100010110000101111110100111101110000101100001011001010010101011011010110001010010110111010010010111100101001001011100101111001010001101000011001111001100000010111100100100010110" + }, + { + "name": "stripes_v-33x16-s3", + "patternData": "APs4qqqqqlRVVVWpqqqqUlVVVaWqqqpKVVVVlaqqqipVVVVVqqqqqlRVVVWpqqqqUlVVVaWqqqpKVVVVlaqqqipVVVVV", + "width": 33, + "height": 16, + "scale": 3, + "expect": "011111111111111110001111111111111111000111111111111111100011111111111111110001111111111111111000111111111111111100011111111111111110001111111111111111000111111111111111100011111111111111110001111111111111111000111111111111111100011111111111111110001111111111111111000111111111111111100011111111111111110001111111111111111000111111111111111100011111111111111110011010101001010101101101011010101001010101101010100101010111010101101010100101010110101010010101100101010110101010010101011010101001011010010101011010101001010101101010100110101001010101101010100101010110101011101010100101010110101010010101011010110110101010010101011010101001010101101101011010101001010101101010100101010111010101101010100101010110101010010101100101010110101010010101011010101001011011110001111100011111000101110001011100000111000001110010011100100111011001110110011111100111111001111110011011100110111110001101100011011000100110001001100000011000000110010001100100011011000110110001111100011111000111110001011100010111111001101110011011100100111001001110000011100000111010001110100011111000111110001111100011011000110110001001100010011111000101110001011100000111000001110010011100100" + }, + { + "name": "stripes_h-129x65-s3", + "patternData": "APv_AAAAAAAAAAAAAAAAAAAAAP7___________________8DAAAAAAAAAAAAAAAAAAAA-P___________________w8AAAAAAAAAAAAAAAAAAADg____________________PwAAAAAAAAAAAAAAAAAAAID_____________________AAAAAAAAAAAAAAAAAAAAAP7___________________8DAAAAAAAAAAAAAAAAAAAA-P___________________w8AAAAAAAAAAAAAAAAAAADg____________________PwAAAAAAAAAAAAAAAAAAAID_____________________AAAAAAAAAAAAAAAAAAAAAP7___________________8DAAAAAAAAAAAAAAAAAAAA-P___________________w8AAAAAAAAAAAAAAAAAAADg____________________PwAAAAAAAAAAAAAAAAAAAID_____________________AAAAAAAAAAAAAAAAAAAAAP7___________________8DAAAAAAAAAAAAAAAAAAAA-P___________________w8AAAAAAAAAAAAAAAAAAADg____________________PwAAAAAAAAAAAAAAAAAAAID_____________________AAAAAAAAAAAAAAAAAAAAAP7___________________8DAAAAAAAAAAAAAAAAAAAA-P___________________w8AAAAAAAAAAAAAAAAAAADg____________________PwAAAAAAAAAAAAAAAAAAAID_____________________AAAAAAAAAAAAAAAAAAAAAP7___________________8DAAAAAAAAAAAAAAAAAAAA-P___________________w8AAAAAAAAAAAAAAAAAAADg____________________PwAAAAAAAAAAAAAAAAAAAID_____________________AAAAAAAAAAAAAAAAAAAAAP7___________________8DAAAAAAAAAAAAAAAAAAAA-P___________________w8AAAAAAAAAAAAAAAAAAADg____________________PwAAAAAAAAAAAAAAAAAAAID_____________________AAAAAAAAAAAAAAAAAAAAAP7___________________8DAAAAAAAAAAAAAAAAAAAA-P___________________w8AAAAAAAAAAAAAAAAAAADg____________________PwAAAAAAAAAAAAAAAAAAAID_____________________AAAAAAAAAAAAAAAAAAAAAAA", + "width": 129, + "height": 65, + "scale": 3, + "expect": "000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110000000000000000000000000000000000000011001001001101101100101011001001001101101100100011011001001001101101111011011001001001101101101011011011001001001101110011011011001001001101110010011011011001001001010010011011011001001001110010010011011011001000110010010011011011001001110110010010011011011010110110010010011011011000110110110010010011011100110110110010010011011000100110110110010010011100100110110110010010011100100100110110110010011001110110011111100110111001001110100011111000110110000001101100011111000101110000011101100111111001101110000011101000110110001001100000011001000111110001011100100111011001111110010011100000111010001111100010011001000110110001111100010111001001110110011111100110111010001111100011011000100110010001101100011111000101110010011111100110111001001110000011111000110110001001100100011011000101110000011100" + }, + { + "name": "one-bit-2x2-s4", + "patternData": "AAQACA", + "width": 2, + "height": 2, + "scale": 4, + "expect": "000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100110101100110101101111101101111001101011001101011011111011011111011010110011010110111110110111110110101100110101100111101101111101101011001101011001111011011111011011110011010110011110110111110110111110110101100111101101111101101111101101011001111011001111011011111011010110011110110011110110111110110111100111101100111101101111101101111101111011001111011011111011011111011110110011110110011110111111111010111111001010111110101011111110101111110010101111101010111111101011111100101011111010101111111010111111001010111110101011111110101111110010101111101010111111101011111100101011111010101111111010111111001010111110101011111110101111110010101111101010111111101011111100101011111010101111111010111111001010111110101011111110101111110010101111101010111111101011111100101011111010101111111010111111" + }, + { + "name": "all-but-one-3x5-s4", + "patternData": "AAwM_n8", + "width": 3, + "height": 5, + "scale": 4, + "expect": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111100000000000000001000000010000000000000000000000000001000000000000000000100000001000000000000000000010000000100000000000000000010000000000000010000000000001000000010000001000000000001000000000000000000000000000100000000000000000000000000010000000000000000001000000010000001000000000000100000001000000000000000000100000000000000100000000000010000000100000010000000000010000001000000000000000000001000001000000000000000000000100100000000000000000000000001000000000000000000100100000000000000000000000001000000000000000000001000000000000000000000000010010000000000000000001000000000000000000000000010010000000000000000001000000000000000000000000100100000000000000000000010000000000000000000000100100000000000000000000001001000000000000000000100100000000000000000000000010000000000000000000001000000000000" + }, + { + "name": "checker-8x8-s4", + "patternData": "ADQYqlWqVapVqlU", + "width": 8, + "height": 8, + "scale": 4, + "expect": "111111111000000000011111111100000000001111111110000000000111111111000000000011111111100000000001111111110000000000111111111000000000011111111100000000001111111110000000000000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111110111101010111101011110101011110101111010101111010101101010111101010110101011110101011010101111010101111010111101010111101011110101011110101111010101111000111101010111100011110101011110001111010101111000101101010111100010110101011110001011110101111000101111010111100010111101011110001011110001111000101111000111100010111100011110001011110001011000101111000101100010111100010110001011110001011100101111101010101010101110101010101010111010101010101011101010101010101110101010101010111010101010101011101010101010101110101010101010111010101010101011101010101010101110101010101010111010101010101011101010101010101110101010101010111010101010101011101010101010101110101010101010111010101010101011101010101010101110101010101010111010101010101011101010101010101110101010101010111010101010101011101010101010101" + }, + { + "name": "stripes_v-17x9-s4", + "patternData": "AHwcqqpUVamqUlWlqkpVlaoqVVWqqgA", + "width": 17, + "height": 9, + "scale": 4, + "expect": "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111001110011001110011000110011000110011111001100011001110011001110011000110011111001100011001100011001110011001110011111001100111001100011001100011001110011110001100111001100111001100011001100011110001100110001100111001100111001100011110011100110001100110001100111001100111110011100110011100110001100110001100111110011000110011100110011100110001100111110011000110011000110011100110011100111110011001111110011100000000000110001111111111101111000010000001000011110111111111110001100000000000111001111111111100111000001111110011100000100000110001111101111101111000011000001000011110011111111110001110000000000111000111111111100111100001111110011110000100000110000111101111101111100011000001000001110011111111111001110000000000011000111111111110111100001111111011110000100000010000111101111111111100011" + }, + { + "name": "stripes_h-33x16-s4", + "patternData": "APw4AAAAAP7___8DAAAA-P___w8AAADg____PwAAAID_____AAAAAP7___8DAAAA-P___w8AAADg____PwAAAID_____", + "width": 33, + "height": 16, + "scale": 4, + "expect": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110100100100100100101101101101101101001001001001001001011011011011011010010010010010010110110110110110110100100100100100101101101101101101001001001001001001011011011011011010010010010010010110110110110110110100100100100100101101101101101101101001001001001001011011011011011010010010010010010010110110110110110100100100100100101101101101101101101001001001001001011011011011011010010010010010010010110111101011010110101001010010100101011010110101101010010100101001010110101101011010100101001010010101101011010110101001010010100101011010110101101010010100101001010110101101011010100101001010010101101011010110101001010010100101011010110101101010010100101001010110101101011010100101001010010101101011010110101001010010100101011010110101101010010100101001010110101101011010100101001010010101101011010110101" + }, + { + "name": "diagonal-129x65-s4", + "patternData": "APz_MzMzMzMzMzMzMzMzMzMzM83MzMzMzMzMzMzMzMzMzMwwMzMzMzMzMzMzMzMzMzMzy8zMzMzMzMzMzMzMzMzMzDwzMzMzMzMzMzMzMzMzMzPTzMzMzMzMzMzMzMzMzMzMDDMzMzMzMzMzMzMzMzMzM7PMzMzMzMzMzMzMzMzMzMzMMzMzMzMzMzMzMzMzMzMzM83MzMzMzMzMzMzMzMzMzMwwMzMzMzMzMzMzMzMzMzMzy8zMzMzMzMzMzMzMzMzMzDwzMzMzMzMzMzMzMzMzMzPTzMzMzMzMzMzMzMzMzMzMDDMzMzMzMzMzMzMzMzMzM7PMzMzMzMzMzMzMzMzMzMzMMzMzMzMzMzMzMzMzMzMzM83MzMzMzMzMzMzMzMzMzMwwMzMzMzMzMzMzMzMzMzMzy8zMzMzMzMzMzMzMzMzMzDwzMzMzMzMzMzMzMzMzMzPTzMzMzMzMzMzMzMzMzMzMDDMzMzMzMzMzMzMzMzMzM7PMzMzMzMzMzMzMzMzMzMzMMzMzMzMzMzMzMzMzMzMzM83MzMzMzMzMzMzMzMzMzMwwMzMzMzMzMzMzMzMzMzMzy8zMzMzMzMzMzMzMzMzMzDwzMzMzMzMzMzMzMzMzMzPTzMzMzMzMzMzMzMzMzMzMDDMzMzMzMzMzMzMzMzMzM7PMzMzMzMzMzMzMzMzMzMzMMzMzMzMzMzMzMzMzMzMzM83MzMzMzMzMzMzMzMzMzMwwMzMzMzMzMzMzMzMzMzMzy8zMzMzMzMzMzMzMzMzMzDwzMzMzMzMzMzMzMzMzMzPTzMzMzMzMzMzMzMzMzMzMDDMzMzMzMzMzMzMzMzMzM7PMzMzMzMzMzMzMzMzMzMzMMzMzMzMzMzMzMzMzMzMzM83MzMzMzMzMzMzMzMzMzMwwMzMzMzMzMzMzMzMzMzMzy8zMzMzMzMzMzMzMzMzMzDwzMzMzMzMzMzMzMzMzMzPTzMzMzMzMzMzMzMzMzMzMDDMzMzMzMzMzMzMzMzMzM7PMzMzMzMzMzMzMzMzMzMzMMzMzMzMzMzMzMzMzMzMzM83MzMzMzMzMzMzMzMzMzMwwMzMzMzMzMzMzMzMzMzMzy8zMzMzMzMzMzMzMzMzMzDwzMzMzMzMzMzMzMzMzMzPTzMzMzMzMzMzMzMzMzMzMDDMzMzMzMzMzMzMzMzMzM7PMzMzMzMzMzMzMzMzMzMzMMzMzMzMzMzMzMzMzMzMzM83MzMzMzMzMzMzMzMzMzMwwMzMzMzMzMzMzMzMzMzMzy8zMzMzMzMzMzMzMzMzMzDwzMzMzMzMzMzMzMzMzMzPTzMzMzMzMzMzMzMzMzMzMDDMzMzMzMzMzMzMzMzMzM7PMzMzMzMzMzMzMzMzMzMzMMzMzMzMzMzMzMzMzMzMzMwE", + "width": 129, + "height": 65, + "scale": 4, + "expect": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010001100110001100111001100111001100011001100011110011100110001100110001100111001100111001100011110011100110001100110001100111001100111001100010110011100100001100110001101111001100111001000000110011100100011100110001101110001100111001000000110011100100011100110001101110001100111001000000110110011100110011100110001100110001100111000011000110011100110011100110001100110001100111010011000110011000110010110010110000100101100001101011010011010010100110100111001101100101001011000011010110000110100101001101001110011010011101101001101001110011110010110111100101100011001011000010010011010011100110100111101111001011001110010110010100101100011000110010110000100101100001100011010011010110100110100101100101100101001011000011010110000110101101001101001110011100110101101001101001010011110010100111100101100" + }, + { + "name": "all-but-one-2x2-s5", + "patternData": "AAUADg", + "width": 2, + "height": 2, + "scale": 5, + "expect": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111111001000001001000001001000001001000001101100001110000000010000000010000000011000000011000000011100000100110000110110000110110000110110000010010000001100000001100000001101000000100000000100000011011000001011000001001000001001000001001000000110000000010000000010000000010000000011000000100100000100100000100100000110110000110110000011000000001000000001100000001101000001101000000111000011011000001011001010001000110001010001100010001000010000010000100010000100000100101000100011000101000110001000100001000001000010001000010000010010100010001100010100011000100010000100000100001000100001000001001010001000110001010001100010001000010000010000100010000100000100101000100011000101000110001000100001000001000010001000010000010010100010001100010100011000100010000100000100001000100001000001001010001000110001" + }, + { + "name": "checker-3x5-s5", + "patternData": "AA0Mqio", + "width": 3, + "height": 5, + "scale": 5, + "expect": "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100110110110111110111110110110110001110010000011110011100010010010011111011111011011011000111011111000011001110001001001001111001111001001101101101110011100001101110001100100100111100111100111000011100111011110000110111000110110110111010000111101100001110011101110001010011100011011011100100100011100100000101001110111000001001110100111110110110010001110010000010101110010100000111011111011111011011011011011110001001011100101101101111110000100011100110110111010010101110011010110111100010010111000011011011001001011100011011011010011101001000111101101011001110000011110111101100111000100001111110110110100111010011011011011010011101001110001011010110100011110010000101011010001101001100010101101101110001100100100010110101000110010110001011010110100011000100110000110110110010010111000011011011011100" + }, + { + "name": "stripes_v-8x8-s5", + "patternData": "ADUYqqqqqqqqqqo", + "width": 8, + "height": 8, + "scale": 5, + "expect": "000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111111111000001111000001111000001111000001111100001111100001111100001111100000111100000111100000111100000111110000111110000111110000111110000011110000011110000011110000011111000011111000011111000011111000001111000001111000001111000001111100001111100001111100001111100000111100000111100000111100000111110000111110000111110000111110000011110000011110000011110000011111000011111000011111000011111000001111001010101010110101010101101010101001010101010010101010100101010101101010101011010101010110101010100101010101001010101010010101010110101010101101010101011010101010010101010100101010101001010101011010101010110101010101101010101001010101010010101010100101010101101010101011010101010110101010100101010101001010101010010101010110101010101101010101011010101010010101010100101010101001010101011010101010110101" + }, + { + "name": "stripes_h-17x9-s5", + "patternData": "AH0cAAD-_wMA-P8PAOD_PwCA__8AAAA", + "width": 17, + "height": 9, + "scale": 5, + "expect": "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100111001001001001110110110110111001101101101110001110010010010011101100100100111011011011011100011100100110110111001001001001110110110110011100011101101101101110010010010011100100100100111000111011011011011110110110110111001001001001110001110010010010011101101101101110010011011011100011100100100100111011011001001110110110110111000111001001001101110010010010011101101101101111000111011011011011100101110100000110111110100000110111100100100111111100100100111110100100111111100100100111111100100101111101100000111111100100100111101100000101111101100000101111101000101111101100000101111101100001101111101000001101111100000101111101000001101111101000001101111001001001111101000001101111101001001111111001001001111111001001011111001001001111111001001001111011000001011111011000001111111000001011111011000" + }, + { + "name": "diagonal-33x16-s5", + "patternData": "AP04MzMzM83MzMwwMzMzy8zMzDwzMzPTzMzMDDMzM7PMzMzMMzMzM83MzMwwMzMzy8zMzDwzMzPTzMzMDDMzM7PMzMzM", + "width": 33, + "height": 16, + "scale": 5, + "expect": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111110000111110000111110000111110000011110000010000011110000011110000011111000011111000011111000111100000111110000111110000111110001110000011100001111100001111100001110100000111100000111100111100000111100000111110000111110000111110000111000001111100001111100001110100001111100000111011111000011101000011101000001111000001111000101000001111000001111100001111100001111100001111100011111000011101000010110100100110110110100010110110100100100101110100100100110110101100101101100100100101110100101001101101101000101101101101001001001101001001101101101011001001011001001001011101001010001011011011001011011001001010010011011010011011011010010010010111010010010011010010100010110110110010010110010010100110110110100010110110110010100101110100100100110110100100101101100100100101110100100001101101101000101" + }, + { + "name": "one-bit-129x65-s5", + "patternData": "AP3_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE", + "width": 129, + "height": 65, + "scale": 5, + "expect": "000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" + }, + { + "name": "checker-2x2-s6", + "patternData": "AAYABg", + "width": 2, + "height": 2, + "scale": 6, + "expect": "111111111000000000011111111100000000001111111110000000000111111111000000000011111111100000000001111111110000000000111111111000000000011111111100000000001111111110000000000000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111111110001111110001111110001111110001111110001111100011101100011101100011100100011100100011100100111000000111000000111000000111000000111000000010001101110001101110001101110000100111000100111011111100011101100001111110001111110001111110001001000011101100011101100011100100011100100011100000111000000111000000111000000111000000111000101110001101110001101110001101110001101110001100100011111100011101100011001111001001101001111100001101000101100001111100101100100111100100111100100110100111110000110100010110000111110010110010011110010011110010011010011111000011010001011000011111001011001001111001001111001001101001111100001101000101100001111100101100100111100100111100100110100111110000110100010110000111110010110010011110010011110010011010011111000011010001011000011111001011001001111001001111001001101" + }, + { + "name": "stripes_v-3x5-s6", + "patternData": "AA4MkiQ", + "width": 3, + "height": 5, + "scale": 6, + "expect": "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110000000001111111111111111110000000001111111111111111111000000000111111111111111111000000000111111111111111111000000000011111111111111111100000000011111111111111111100000000011111111111111111110000000001111111111111111110000000001111111111111111111000000000111111111111111111000000000111111111111111111000000000011111111111111111100000000011111111111111111100000000011111111111111111100111100111001111001110011110011100111100111001111001110011110111100111101111001111011110011110111100111101111001111100111100111001111001110011110011100111100111001111001110011110011100111101111001111011110011110111100111101111001111100111100111001111001110011110011100111100111001111001110011110011100111100111001111011110011110111100111101111001111100111100111001111001110011110011100111100111001" + }, + { + "name": "stripes_h-8x8-s6", + "patternData": "ADYYAP8A_wD_AP8", + "width": 8, + "height": 8, + "scale": 6, + "expect": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110001110001110001110001110001110001110001110011100011100011100011100011100011100011100011100111000111000111000111000111000111000111000011101110001110001110001110001110000111000111000111011100011100011100001110001110001110001110001110111000011100011100011100011100011100011100011100111000111000111000111000111000111000111000111001110001110001110001110001110001110001110001111011100011100011100011101010110101101011010110101101011010110101101011010110101101011010010100101001010010100101001010010100101001010010100101001010010110101101011010110101101011010110101101011010110101101011010110100101001010010100101001010010100101001010010100101001010010100101101011010110101101011010110101101011010110101101011010110101101001010010100101001010010100101001010010100101001010010100101001011010110101101011" + }, + { + "name": "diagonal-17x9-s6", + "patternData": "AH4cMzPNzDAzy8w8M9PMDDOzzMwzMwE", + "width": 17, + "height": 9, + "scale": 6, + "expect": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111110000000001111111111111110000000000000000000011111111100000000000011011111100100111111111000000000111111000000000000111111111101111111110000000001111111110000011000000100111111100011111101100000000001111111111110000000001000000000010011111101100000011000011111100000011000000000000111111111000000000000111111111000001111110010000001101111110010000000000001111111111111111111100000000010111100101110000111100000110000111001111000001111001110111001011000111100011111000111110011111011111000011111000011110011111001111100111110000111100111010011100110011110000011110011000001100000111100001110100111000000110000111100000110001111000011100001111000001100000111000001110000111000001110001111001011000001111001001111000110000111100110110000111000111110011111000111111000011100111100001111100" + }, + { + "name": "one-bit-33x16-s6", + "patternData": "AP44AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA", + "width": 33, + "height": 16, + "scale": 6, + "expect": "000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" + }, + { + "name": "all-but-one-129x65-s6", + "patternData": "AP7__v___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________wE", + "width": 129, + "height": 65, + "scale": 6, + "expect": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "stripes_v-2x2-s7", + "patternData": "AAcACg", + "width": 2, + "height": 2, + "scale": 7, + "expect": "000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111111111111111111111110000000000000000001111111111111111110000000000000000000111111111111111111000000000000000000111111111111111111000000000000000000011111111111111111100000000000000000011111111111111111110000000000000000001111111111111111110000000000000000001111111111111111111000000000000000000111111111111111111000000000000000000011111111111111111100000000000000000011111111111111111100000000000000001111000011100001111000111100001110000111100011110000111000011110001111000011100001111000111100001110000111100011110000111000011100001111000111100001110000111100011110000111000011110001111000011100001111000111100001110000111100011110000111000011110001111000111100001110000111100011110000111000011110001111000011100001111000111100001110000111100011110000111000011110001111000011100001110000111100011110" + }, + { + "name": "stripes_h-3x5-s7", + "patternData": "AA8MOA4", + "width": 3, + "height": 5, + "scale": 7, + "expect": "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000001111111111110000001111110000001111111111100000011111111111100000011111100000011111111111000000111111111111000000111111000000111111111110000001111111111110000001111111000000111111111100000011111111111110000001111110000001111111111000000011111111111100000011111100000011111111111000000111111111111000000111111000000111111111110000001111111111110000001111110000001111111111100000011111111111100001100100111001101111011001110010011100110111101100111001001101111011001110010011100110111101100111001001110011011001110010011100100111001101111011001110010011100110110011100100111001101111011001110010011100110111101100100111001101111011001110010011100110111001101111011001001110011011110110011100100111001101111011001110010011011110110011100100111001101111011001110010011100110110011101100111001001110" + }, + { + "name": "diagonal-8x8-s7", + "patternData": "ADcYM2bMmTNmzJk", + "width": 8, + "height": 8, + "scale": 7, + "expect": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111000000000011111111100000000001111111110000000000111111111000000000011111111100000000001111111110000000000111111111000000000011111111100000000001111111110000000000111111111000000000000000001111111111111111110000000000000000001111111111101111100000000000011000011111111111100111000000000000111000111111111111000111000000000001111101111111111110000010000000000000111100111111111100000000000000000001111111111111111110000000000000000011111111111111111100000000000000000111111111111111111000000000000000000111111111111111110000000000000000001111111111111111110000000000000000011111111110011111010000011111100000101111101000001111110000011111110000010111110000001111101000001011111000000111110000000111110100000111111000001011111000000111110100000101111100000011111000000011111010000011111100000101111101000001111110000011111110000010111110000001111101000001111110000010111110100000111111000001111111000001011111000000111110100000101111100000011111000000011111010000011111100000101111100" + }, + { + "name": "one-bit-17x9-s7", + "patternData": "AH8cAAAAAAAAAAAAAAAAAAAAAAAAAAE", + "width": 17, + "height": 9, + "scale": 7, + "expect": "000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" + }, + { + "name": "all-but-one-33x16-s7", + "patternData": "AP84_v______________________________________________________________________________________", + "width": 33, + "height": 16, + "scale": 7, + "expect": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111100000000011111111110000000001111111111000000000111111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "name": "checker-129x65-s7", + "patternData": "AP__qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqgA", + "width": 129, + "height": 65, + "scale": 7, + "expect": "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110000001111111111110000001111111111110000011111101111100000011111100111100000011111100111000000111111000111000000111111000111000000011110000010000001111110000010000000111111000011000011111100000010000001111110000000000001111110000110000011111100000010000011111100000011000011111000000111000111111000000111000111111000000111101111110000001111101111110000001111101111110000011111111111100000011111100011010101100011100001010011101011110101110010100001110001101010110001110000101001110101111010111001010000111000110101011000111000110101011000111000010100111010111101011100101000011100011010101100011100001010011101011110101110010100001110001101010110001110001101010110001110000101001110101111010111001010000111000110101011000111000010100111010111101011100101000011100011010101100011100011010101100" + }, + { + "name": "alternating-127x16-s0", + "patternData": "AOg7qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo", + "width": 127, + "height": 16, + "scale": 0, + "expect": "010101010010101010110101010110101010100101010100101010101101010101101010101001010101001010101011010101011010101010010101010010101010110101010110101010100101010100101010101101010101101010101001010101001010101011010101011010101010010101010010101010110101010110101010100101010100101010101101010101101010101001010101001010101011010101011010101010010101010010101010100000111111111111111111000000000000000000111111100000000000111111111111111111100000000000000000100000000000000000011111111111111111100000000001111111100000000000000000011111111111111111100011111111111111110000000000000000001111111111111000001111111111111111110000000000000000001111111000000000001111111111111111110000000000000000001000000000000000000111111111111111111000000000011111111000000000000001111000011100001111000111100001110000111000011110001111000011100001110000111100011110000111000011100001111000111100001111000011100001111000111100001110000111000011110001111000011100001110000111100011110000111000011100001111000111100001111000011100001111000111100001110000111000011110001111000011100001110000111100011110000111000011110001111000111100001111000011100001111000111100001110000111000011110" + }, + { + "name": "alternating-64x65-s0", + "patternData": "APD9qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg", + "width": 64, + "height": 65, + "scale": 0, + "expect": "010101010101010101001010101010101010100101010101010101010010101010101010101001010101010101010100101010101010101010010101010101010101001010101010101010100101010101010101010010101010101010101001010101010101010100101010101010101010010101010101010101001010101010101010100101010101010101010010101010101010101001010101010101010100101010101010101010010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010" + }, + { + "name": "clear-34x33-s0", + "patternData": "AAB9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "width": 34, + "height": 33, + "scale": 0, + "expect": "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" + }, + { + "name": "cols-33x17-s0", + "patternData": "APg8qqqqqlRVVVWpqqqqUlVVVaWqqqpKVVVVlaqqqipVVVVVqqqqqlRVVVWpqqqqUlVVVaWqqqpKVVVVlaqqqipVVVVVqqqqqgA", + "width": 33, + "height": 17, + "scale": 0, + "expect": "101010101101010101010101010110101010101010101011010101010101010101101010101010101010110101010101010101011010101010101010101101010101010101010110101010101010101011010101010101010101101010101010101010110101010101010101011010101010101010101101010101010101010110101010101010101011010101010101010101101010101010101010110101010101010101011010101010101010101101010101000101001011010110101101011010010100101001011010110101101011010010100101001011010110101101011010010100101001011010110101101011010010100101001011010110101101011010010100101001011010110101101011010010100101001011010110101101011010010100101001011010110101101011010010100101001011010110101101011010010100101001011010110101101011010010100101001011010110101101011010010100101001011010110101101011010010100101111111111111111100000000000000001111111111111111100000000000000001111111111111111100000000000000001111111111111111100000000000000000011111111111111111000000000000000011111111111111111000000000000000011111111111111111000000000000000011111111111111111110000000000000000111111111111111110000000000000000111111111111111110000000000000000111111111111111110100000000000000001111111111111111100000000000000" + }, + { + "name": "first-bit-3x63-s0", + "patternData": "AAj0AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "width": 3, + "height": 63, + "scale": 0, + "expect": "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111011011011011011011011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110111111110111111110111111110111111110111111110111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" + }, + { + "name": "last-bit-9x2-s0", + "patternData": "ADgAAAAC", + "width": 9, + "height": 2, + "scale": 0, + "expect": "111111110111111110111111111111111111111111111101111111101111111111111111111111111111011111111011111111111111111111111111110111111110111111111111111111111111111101111111101111111111111111111111111111011111111011111111111111111111111111110111111110111111111111111111111111111101111111101111111111111111111111111111011111111011111111111111111111111111110111111110111111111101111111111111111101111111111111111101111111101111111111111111101111111111111111101111111101111111111111111101111111111111111101111111101111111111111111101111111111111111101111111101111111111111111101111111111111111101111111111111111111111111101111111111111111101111111111111111111111111101111111111111111101111111111111111111111111101111111111111111101111111111111111111111111101111111111111011111111111111111011111111111111111011111111111111111011111111111111111011111111111111111011111111111111111011111111111111111111111110111111111111111110111111111111111110111111111111111110111111111111111110111111111111111110111111111111111111111111101111111111111111101111111111111111101111111111111111101111111111111111101111111111111111101111111111111111111111111011111111111111111011111111111111" + }, + { + "name": "rows-17x63-s0", + "patternData": "AHj0AAD-_wMA-P8PAOD_PwCA__8AAP7_AwD4_w8A4P8_AID__wAA_v8DAPj_DwDg_z8AgP__AAD-_wMA-P8PAOD_PwCA__8AAP7_AwD4_w8A4P8_AID__wAA_v8DAPj_DwDg_z8AgP__AAD-_wMA-P8PAOD_PwCA__8AAP7_AwD4_w8A4P8_AAA", + "width": 17, + "height": 63, + "scale": 0, + "expect": "111111111111111111100000000000000000001111111111111111111000000000000000000011111111111111111110000000000000000000111111111111111111100000000000000000001111111111111111111111111111111111111100000000000000000001111111111111111111000000000000000000011111111111111111110000000000000000000111111111111111111100000000000000000001111111111111111111000000000000000000011011011011011011011011011011011011011011011011010110110110110110110110110110110110110110110110101101101101101101101101101101101101101101101101011011011011011011011011011011011011011011011010110110110110110110110110110110110110110110110101101101101101101101101101101101101101101101101010010010010010010010010010010010010010010010010100100100100100100100100100100100100100100100101001001001001001001001111100001111100001111100001111100001111100001111100001000011111000011111000011111000011111000011111000011100111100000111100000111100000111100000111100000111100111000011111000011111000011111000011111000011111000010000111100000111100000111100000111100000111100000111111111000011111000011111000011111000011111000011111000000000111100000111100000111100000111100000111100000111011111000011111000011111000" + }, + { + "name": "solid-16x9-s0", + "patternData": "AHAc________________________", + "width": 16, + "height": 9, + "scale": 0, + "expect": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + ] +} diff --git a/tools/gen-sampler-fixtures.py b/tools/gen-sampler-fixtures.py new file mode 100644 index 0000000..63ce6b8 --- /dev/null +++ b/tools/gen-sampler-fixtures.py @@ -0,0 +1,237 @@ +#!/usr/bin/env python3 +""" +Generate the oracle for map-scale sampling, and prove it against an independent +implementation. + +WHY THIS EXISTS +--------------- +OpenFront paints a pattern onto territory in ABSOLUTE world coordinates, so what +a player sees depends on where the territory sits on the map. `tools/preview_ +prototype.py` establishes the sampling rule and verifies it; this turns that into +a fixture the editor's JavaScript can be held to, the same way +`tests/fixtures/codec.json` holds the codec. + +Two decisions worth knowing: + + * **Coordinates are written out, not seeded.** The prototype picks probes with + an LCG whose step is `(1103515245 * s + 12345) & 0x7FFFFFFF`. Reproducing + that in JavaScript needs `Math.imul`, because `1103515245 * 2**31` is past + `Number.MAX_SAFE_INTEGER` and a plain multiply silently loses low bits — the + exact class of bug this fixture exists to catch. Emitting the coordinates + removes the risk instead of testing around it. + + * **No pattern here comes from the game.** The 31 real patterns are CC BY-SA + 4.0 and are deliberately not redistributed (see NOTICE). Most cases are + synthesised, because the committed corpus is 1,117 patterns at scale 0 and + one or two at each of the rest — it was built for width, height and bit + packing, and scale is the whole variable here. A slice of that corpus still + rides along, so this decoder is also held against data a different generator + committed. + +Every probe set deliberately straddles the origin. JavaScript's `%` is a +remainder whose sign follows the dividend, so a naive `(x >> scale) % width` +returns a negative index for negative world coordinates and reads before the +start of the array. The world-offset control makes that reachable by panning +left, so the fixture must be able to see it. + + python3 tools/gen-sampler-fixtures.py # write + verify + python3 tools/gen-sampler-fixtures.py --check # verify only, no write +""" + +from __future__ import annotations + +import base64 +import json +import os +import sys + +HERE = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, HERE) # for dsl_prototype.encode +ROOT = os.path.dirname(HERE) +CORPUS = os.path.join(ROOT, "tests", "fixtures", "codec.json") +OUT = os.path.join(ROOT, "tests", "fixtures", "sampler.json") + +# Enough to catch an off-by-one in any dimension, small enough to read as a diff. +CASES_PER_SCALE = 6 +PROBE_SPAN = 4096 + + +def floor_mod(a: int, n: int) -> int: + return a - n * (a // n) + + +class Pattern: + """Decoded pattern. Mirrors OpenFront's PatternDecoder.""" + + def __init__(self, pattern_data: str): + by = base64.urlsafe_b64decode(pattern_data + "=" * (-len(pattern_data) % 4)) + self.scale = by[1] & 0x07 + self.width = (((by[2] & 0x03) << 5) | ((by[1] >> 3) & 0x1F)) + 2 + self.height = ((by[2] >> 2) & 0x3F) + 2 + self._bytes = by + + def is_primary(self, world_x: int, world_y: int) -> bool: + px = floor_mod(world_x >> self.scale, self.width) + py = floor_mod(world_y >> self.scale, self.height) + idx = py * self.width + px + return (self._bytes[3 + (idx >> 3)] & (1 << (idx & 7))) == 0 + + +def oracle_is_primary(pattern_data: str, wx: int, wy: int) -> bool: + """ + Decode to a plain grid and sample it by a different route. + + Written deliberately unlike `Pattern.is_primary` — unpacking every bit up + front and indexing a nested list — so that a shared mistake is unlikely. A + self-consistent bug is exactly what an oracle has to catch. + """ + by = base64.urlsafe_b64decode(pattern_data + "=" * (-len(pattern_data) % 4)) + scale = by[1] & 0x07 + w = (((by[2] & 0x03) << 5) | ((by[1] >> 3) & 0x1F)) + 2 + h = ((by[2] >> 2) & 0x3F) + 2 + grid = [[False] * w for _ in range(h)] + for i in range(w * h): + bit = (by[3 + (i // 8)] >> (i % 8)) & 1 + grid[i // w][i % w] = bit == 0 # bit 0 means primary + block = 1 << scale + # Divide rather than shift, and use Python's floor semantics explicitly. + cell_x = wx // block + cell_y = wy // block + return grid[cell_y % h][cell_x % w] + + +def probes() -> list[list[int]]: + """ + World coordinates to sample. Three bands, each for a different failure. + + * A dense block straddling the origin, where the floor-modulo trap lives. + * Far negatives, where a remainder-based implementation reads out of range. + * Far positives, which is the only region OpenFront itself ever visits. + """ + pts: list[list[int]] = [] + for y in range(-9, 10): + for x in range(-9, 10): + pts.append([x, y]) + step = 7 # coprime with every width here + for i in range(400): + pts.append([-PROBE_SPAN + i * step, -PROBE_SPAN + i * step * 3 % 991]) + for i in range(400): + pts.append([i * step * 5 % PROBE_SPAN, i * step * 11 % PROBE_SPAN]) + return pts + + +# Bit patterns whose sampling breaks in different ways: a checker catches an +# x/y transposition, the two stripe directions catch it independently, a lone set +# bit catches an index that is off by one anywhere, and its inverse catches a +# polarity flip. +MOTIFS = { + "checker": lambda x, y, w, h: (x + y) % 2, + "stripes_v": lambda x, y, w, h: x % 2, + "stripes_h": lambda x, y, w, h: y % 2, + "diagonal": lambda x, y, w, h: 1 if (x - y) % 4 < 2 else 0, + "one-bit": lambda x, y, w, h: 1 if (x, y) == (w - 1, h - 1) else 0, + "all-but-one": lambda x, y, w, h: 0 if (x, y) == (0, 0) else 1, +} + +# Sizes chosen either side of a byte boundary and at both format limits. +SIZES = [(2, 2), (3, 5), (8, 8), (17, 9), (33, 16), (129, 65)] + + +def pick_cases(corpus: list[dict]) -> list[dict]: + """ + Patterns to sample, covering every scale. + + The committed corpus is 1,117 patterns at scale 0 and one or two at each of + the rest — it was built to exercise width, height and bit packing, and scale + is barely represented. Scale is the whole variable here, since it decides how + many world tiles share a pattern pixel, so these are synthesised across all + eight of them. Encoding goes through the DSL prototype's encoder rather than a + second copy written for this file. + + A slice of the corpus rides along, so the fixture also proves this decoder + agrees with data that was committed by a different generator. + """ + from dsl_prototype import encode + + chosen: list[dict] = [] + for scale in range(8): + for i, (w, h) in enumerate(SIZES): + name, fn = list(MOTIFS.items())[(scale + i) % len(MOTIFS)] + bits = [fn(x, y, w, h) for y in range(h) for x in range(w)] + chosen.append({ + "name": f"{name}-{w}x{h}-s{scale}", + "patternData": encode(w, h, scale, bits), + "width": w, "height": h, "scale": scale, + }) + + from_corpus = sorted(corpus, key=lambda p: p["name"]) + stride = max(1, len(from_corpus) // 8) + chosen += from_corpus[::stride][:8] + return chosen + + +def main() -> int: + check_only = "--check" in sys.argv + corpus = json.load(open(CORPUS, encoding="utf-8"))["patterns"] + pts = probes() + cases = [] + mismatches = 0 + + for p in pick_cases(corpus): + pat = Pattern(p["patternData"]) + bits = [] + for wx, wy in pts: + got = pat.is_primary(wx, wy) + if got != oracle_is_primary(p["patternData"], wx, wy): + print(f" [FAIL] {p['name']} at ({wx},{wy}): sampler and oracle disagree") + mismatches += 1 + bits.append("1" if got else "0") + cases.append({ + "name": p["name"], + "patternData": p["patternData"], + "width": pat.width, + "height": pat.height, + "scale": pat.scale, + "expect": "".join(bits), + }) + + if mismatches: + print(f"\n*** {mismatches} sampler/oracle mismatch(es) — not writing ***") + return 1 + + doc = { + "note": ("Map-scale sampling oracle. Probes straddle the origin because " + "JavaScript's % is a remainder, not a floor modulo. Patterns are " + "from the licence-clean corpus, not OpenFront's cosmetics.json."), + "probeCount": len(pts), + "caseCount": len(cases), + "probes": pts, + "cases": cases, + } + + if check_only: + if not os.path.exists(OUT): + print(f"{OUT} is missing — run without --check") + return 1 + on_disk = json.load(open(OUT, encoding="utf-8")) + if on_disk != doc: + print(f"{OUT} is stale — re-run without --check") + return 1 + print(f"sampler fixtures current " + f"{len(cases)} patterns × {len(pts)} probes, oracle agrees") + return 0 + + os.makedirs(os.path.dirname(OUT), exist_ok=True) + with open(OUT, "w", encoding="utf-8") as fh: + json.dump(doc, fh, indent=1) + fh.write("\n") + neg = sum(1 for x, y in pts if x < 0 or y < 0) + print(f"wrote {OUT}") + print(f" {len(cases)} patterns × {len(pts)} probes " + f"({neg} of them negative), scales {sorted({c['scale'] for c in cases})}") + print(f" sampler agrees with the independent oracle on every probe") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/lib/extract.js b/tools/lib/extract.js new file mode 100644 index 0000000..825380e --- /dev/null +++ b/tools/lib/extract.js @@ -0,0 +1,69 @@ +'use strict'; +/* + * Lift real functions out of app/patternfront.html so tests run the shipping + * code rather than a copy of it. + * + * The editor is one HTML file on purpose — the same file is the browser build + * and the desktop renderer — so there is no module boundary to import across. + * The suites therefore slice functions out of the