mirror of
https://github.com/storytold/craft-libs.git
synced 2026-11-13 22:12:12 +00:00
Merge pull request #458 from storytold/fixup/crw-365-follow-up
fixup(crw): trim derivation artifacts (follow-up to #365)
This commit is contained in:
18 files changed
+33
-4511
No files matched your search
@@ -22,7 +22,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-latest, windows-latest, macos-latest]
|
||||
os: [ubuntu-latest, windows-latest]
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
|
||||
@@ -205,7 +205,7 @@ The Canon CRW decoder in crates/crw (src/lib.rs, src/tables.rs, src/tests.rs, te
|
||||
derivation record (crates/crw/clean-room/) come from:
|
||||
- LightCraft, crates/raw/src/vendor/crw.rs, crates/raw/src/vendor/crw_tables.rs,
|
||||
crates/raw/tests/crw_oracle.rs, crates/raw/tests/it/vendor_robust.rs and clean-room/crw/,
|
||||
branch clean-room-crw-format-decode, revision 6ca439b5155820d2befeacd81ec0c6a80b2bd3bc
|
||||
https://github.com/storytold/lightcraft/pull/3021, revision 6ca439b5155820d2befeacd81ec0c6a80b2bd3bc
|
||||
(decoder ported at 70c755e42a65661401142819278d51b0c5977f7f; the record is identical at both).
|
||||
https://github.com/storytold/lightcraft
|
||||
Copyright (c) 2026 ArtCraft Team and the LightCraft contributors.
|
||||
|
||||
@@ -125,7 +125,7 @@ About 60 ms for a 6.5 MP EOS file and 70 ms for the 7.4 MP G6 in release mode on
|
||||
## Origin
|
||||
|
||||
The decoder was written in LightCraft as `crates/raw/src/vendor/crw.rs` and `crw_tables.rs`
|
||||
(branch `clean-room-crw-format-decode`, revision `6ca439b5155820d2befeacd81ec0c6a80b2bd3bc`,
|
||||
(LightCraft PR #3021, revision `6ca439b5155820d2befeacd81ec0c6a80b2bd3bc`,
|
||||
[storytold/lightcraft](https://github.com/storytold/lightcraft); the decoder itself was ported at
|
||||
`70c755e4`, and the branch's later review commits changed only a date conversion that is not part
|
||||
of this crate) and moved here with its tests and
|
||||
@@ -136,12 +136,11 @@ seconds instead of converting it in the decoder, and copied LightCraft's shared
|
||||
and the sample-file test proves the decode is byte-identical to the verified LightCraft decode.
|
||||
Colour (camera matrices, profiles, the JPEG-fitted look) stayed in LightCraft.
|
||||
|
||||
## Regenerating the tables
|
||||
## Frozen tables
|
||||
|
||||
`src/tables.rs` is generated data. Edit nothing by hand: the source of truth is
|
||||
`clean-room/logs/table_sel{0,1,2}.json`, and `python crates/crw/clean-room/tools/gen_tables.py`
|
||||
renders it (byte-identical to the committed file). A change to the tables is a change to the frozen
|
||||
format and must follow the reopening rule of `clean-room/02-crw-format.md`.
|
||||
`src/tables.rs` contains frozen code tables from the clean-room derivation record retained in
|
||||
[LightCraft](https://github.com/storytold/lightcraft). Do not edit them by hand. A table change is
|
||||
a change to the frozen format and must follow the reopening rule of `clean-room/02-crw-format.md`.
|
||||
|
||||
## Boundaries
|
||||
|
||||
|
||||
@@ -1,105 +0,0 @@
|
||||
# CRW RawData payload layout (P1) — established by statistics, no decoding
|
||||
|
||||
Status: derived 2026-10-12 from the 29-file corpus by statistics alone. The scripts that produced
|
||||
it (`p1_payload.py`, `p1b_markers.py`, `p1c_lowbits_bounds.py`) and their logs are not part of
|
||||
this record. **The entropy-coded bitstream itself has not been
|
||||
decoded;** everything here comes from sizes, offsets, byte histograms and ff-digram statistics.
|
||||
Corrections are stated against the starting assumptions, by their labels (B2, B3, …).
|
||||
|
||||
## 1 The three layouts
|
||||
|
||||
With S = RawData record size, (N, 0, 514, L) = the DecoderTable u32s, w×h = SensorInfo raw
|
||||
dimensions, Q = ⌈w·h/4⌉ (one byte per four pixels — the "low-bits" region candidate):
|
||||
|
||||
| Class (bodies) | RawData layout | Evidence |
|
||||
|---|---|---|
|
||||
| EOS: D30, D60, 10D, 300D (23 files) | `[low bits, Q][514 zero bytes][stuffed entropy, L−514−t][tail t]` | S−L = Q+2 or Q+3 on all 23; the section after Q starts with exactly 514 zero bytes in all 23; the entropy part contains **zero** non-stuffed ff (every 0xff is followed by 0x00) in all 23 |
|
||||
| PowerShot 12-bit: G5, G6 | `[514 zero bytes][low bits, Q][stuffed entropy][ff d9 (+00)]` | S−L = 2; first 514 bytes zero; **all** non-stuffed ff (5002 of 5002 on G5, 7928 of 7928 on G6) fall inside [514, 514+Q); the rest of the stream is perfectly stuffed; payload ends `ff d9` |
|
||||
| PowerShot 10-bit: G1 | `[514 zero bytes][stuffed entropy][ff d9 + 00]` | S−L = 3; first 514 bytes zero; zero non-stuffed ff anywhere; payload ends `ff d9 00` |
|
||||
|
||||
Private corpus: all 18 D60 files match the EOS row exactly.
|
||||
|
||||
## 2 DecoderTable (0x1835) semantics
|
||||
|
||||
`(N, 0, 514, L)` where:
|
||||
|
||||
- **N = decoder table selector**, 0–2, varies per shot on the same body (B5 supported; all
|
||||
three values exercised by the corpus). Presumably chosen by the camera per image; the
|
||||
mapping (ISO? content?) is not yet established and is not needed for decoding.
|
||||
- Second u32: 0 in all 29 files.
|
||||
- **514 = offset to the entropy data within the compressed section** (ExifTool names the field
|
||||
*CompressedDataOffset*). Behaviourally: the compressed section begins with exactly 514 zero
|
||||
bytes in all 29 files, EOS and PowerShot alike — a reserved/padding block the decoder skips.
|
||||
(On G5/G6 the low-bits region sits between this zero block and the entropy data.)
|
||||
- **L = CompressedDataLength**: the byte length of the compressed section — from the end of
|
||||
the low-bits prefix on EOS, from 0 on PowerShots — excluding the small tail.
|
||||
|
||||
## 3 Tails
|
||||
|
||||
- EOS: 2 bytes `00 00` (D30, and files where S−L−Q = 2) or 3 bytes `ff 00 00` (D60/10D/Rebel
|
||||
files with S−L−Q = 3). The `ff 00` there may be a final stuffed 0xff of the entropy stream
|
||||
sitting just outside L — to be settled in P2 when the stream end is decodable.
|
||||
- PowerShots: `ff d9` (the JPEG EOI marker used as a terminator) plus one `00` pad when needed
|
||||
to keep the record length even (G1: S−L = 3 = `ff d9 00`; G5/G6: S−L = 2 = `ff d9`).
|
||||
|
||||
## 4 The low-bits regions (still a hypothesis as to *content*, region *extent* established)
|
||||
|
||||
- Extent Q = w·h/4 exactly, in all 25 files that have the region (B6's arithmetic holds).
|
||||
- D60-class prefix: reshaped at w/4 = 788 bytes/row, the first **7 rows are exactly zero**
|
||||
(5516 = 7×788 bytes) in the public D60 file, and the leading zero run is row-aligned —
|
||||
strong evidence the region is row-major at 2 bits/pixel.
|
||||
Below the crop-top band the bytes are near-uniform (entropy ≈ 7.99), as LSB noise should be.
|
||||
- D30's region is high-entropy from byte 0 and ends in a run of `ff` bytes (saturated LSBs?);
|
||||
no zero rows — the D30's masked rows evidently carry noise. Placement for D30 is supported
|
||||
by the size arithmetic and by its entropy part being perfectly stuffed (0 non-stuffed ff).
|
||||
- **Not yet established:** the bit packing order within each byte, and that the bits really
|
||||
are the two LSBs of the final samples (vs. e.g. MSBs). Decisive test planned (P2, with the
|
||||
oracle): the oracle's output codes' 2 LSBs must equal this region bit-for-bit under one
|
||||
fixed packing rule, for every file.
|
||||
|
||||
## 5 Corrections to the starting assumptions
|
||||
|
||||
- **B3 (bare bitstream, "no JPEG wrapper")** — half right: there are no JPEG markers or
|
||||
segment structure, but the entropy data **is byte-stuffed exactly like JPEG entropy data**
|
||||
(0xff is always followed by 0x00; 2 576–28 275 stuffed ff bytes per file, zero exceptions
|
||||
across 29 files), and the PowerShot payloads even end with a JPEG EOI. **B8's "no
|
||||
byte-stuffing" is refuted.** The decoder must unstuff `ff 00 → ff`.
|
||||
- **B6 (low bits)** — the region exists, but the recollection had its distribution backwards:
|
||||
it is present on all EOS bodies (even the 10-bit-era D30 — see open question below) and on
|
||||
the later 12-bit PowerShots (G5/G6), absent on the 10-bit G1; and its position differs by
|
||||
class (prefix on EOS, after the 514-byte zero block on PowerShots).
|
||||
- **B2 (bit depth)** — if the low-bits hypothesis holds, G1 is the only "no extra bits" body
|
||||
here; whether EOS bodies are 10+2 or the region means something else is a P2 question. (The
|
||||
D30 having the region argues the split is not simply "12-bit bodies".)
|
||||
- **A9 DecoderTable** — layout now pinned: (selector, 0, entropy-offset 514, compressed length).
|
||||
|
||||
## 6 Per-file accounting (public corpus)
|
||||
|
||||
| File | w×h | S | N | L | S−L | Q | S−L−Q | zero run @comp |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| d30 | 2224×1456 | 2 824 648 | 1 | 2 015 110 | 809 538 | 809 536 | 2 | 514 |
|
||||
| d60 | 3152×2068 | 6 694 146 | 0 | 5 064 559 | 1 629 587 | 1 629 584 | 3 | 514 |
|
||||
| 10d-a | 3152×2068 | 7 134 454 | 0 | 5 504 868 | 1 629 586 | 1 629 584 | 2 | 514 |
|
||||
| 10d-b | 3152×2068 | 7 244 858 | 2 | 5 615 272 | 1 629 586 | 1 629 584 | 2 | 514 |
|
||||
| 10d-c | 3152×2068 | 7 455 524 | 2 | 5 825 938 | 1 629 586 | 1 629 584 | 2 | 514 |
|
||||
| 300d-a | 3152×2068 | 6 929 638 | 0 | 5 300 052 | 1 629 586 | 1 629 584 | 2 | 514 |
|
||||
| 300d-b | 3152×2068 | 7 206 250 | 2 | 5 576 664 | 1 629 586 | 1 629 584 | 2 | 514 |
|
||||
| rebel | 3152×2068 | 6 406 164 | 0 | 4 776 577 | 1 629 587 | 1 629 584 | 3 | 514 |
|
||||
| g1 | 2144×1560 | 2 257 354 | 1 | 2 257 351 | 3 | — | — | 514 |
|
||||
| g5 | 2672×1968 | 4 861 806 | 1 | 4 861 804 | 2 | 1 314 624 (inside L) | — | 514 |
|
||||
| g6 | 3160×2344 | 7 313 156 | 0 | 7 313 154 | 2 | 1 851 760 (inside L) | — | 514 |
|
||||
|
||||
(S here is the RawData record size, not the file size.)
|
||||
|
||||
## 7 Open for P2 (entropy derivation)
|
||||
|
||||
1. The entropy code itself (B4): alphabet, tables per selector N, block structure, predictors
|
||||
(B7), bit order within bytes (rest of B8), bit depth per body (B2).
|
||||
2. Low-bits packing order and recombination (B6) — decisive oracle test in §4.
|
||||
3. Why 514 (= 512 + 2?) — cosmetic; decoder just skips to the offset given by the record.
|
||||
4. The D60-class "7 zero rows" and D30's trailing `ff` run in the low-bits region — expect an
|
||||
explanation to fall out of the geometry work (P3).
|
||||
5. EOS tail `ff 00 00` vs `00 00` — settle when the stream end is decodable.
|
||||
|
||||
P2 requires the approved oracle (LibRaw pre-built binary, run black-box, per the plan the
|
||||
maintainer approved) for probing and for the low-bits test. **Requested from the maintainer before P2 starts.**
|
||||
@@ -11,7 +11,7 @@ derivation log (not part of this record) and re-verified in `03-verification.md`
|
||||
(§3). Nothing else in the model changed, and every file of the first corpus still verifies. Everything here was derived from the CC0/private sample files
|
||||
and black-box probing of LibRaw 0.22.2 (`unprocessed_raw.exe`), per the approved plan; no
|
||||
decoder source was consulted. The chronological evidence is the derivation log, which is not part
|
||||
of this record; the payload groundwork is `01-payload-layout.md`.
|
||||
of this record; the initial payload-layout analysis remains in LightCraft PR #3021.
|
||||
|
||||
## 1 Payload layout
|
||||
|
||||
@@ -72,9 +72,9 @@ After removing the stuffing (drop the 0x00 after every 0xff), bits are read
|
||||
|
||||
Extracted from the samples by known-plaintext alignment and frozen as data:
|
||||
|
||||
- Selector 0: `logs/table_sel0.json` — 12 first-table + 162 second-table codes.
|
||||
- Selector 1: `logs/table_sel1.json` — 12 + 162.
|
||||
- Selector 2: `logs/table_sel2.json` — 12 + 162.
|
||||
- Selector 0: frozen code tables — 12 first-table + 162 second-table codes.
|
||||
- Selector 1: frozen code tables — 12 + 162.
|
||||
- Selector 2: frozen code tables — 12 + 162.
|
||||
|
||||
Each second table now holds all 162 symbols: (r, s) for r = 0..15, s = 1..10, plus (0, 0)
|
||||
and (15, 0). Revision 1 lacked (7..14, 10) in selector 0 and (14, 10) in selector 1: runs
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
# CRW decode verification (P4) — against LibRaw 0.22.2, zero tuning
|
||||
|
||||
Method: the frozen model of `02-crw-format.md` plus the frozen tables
|
||||
(`logs/table_sel{0,1,2}.json`) were run by the local Python reference decoder over every
|
||||
Method: the frozen model of `02-crw-format.md` plus the frozen tables retained in
|
||||
LightCraft PR #3021 were run by the local Python reference decoder over every
|
||||
sample file, comparing **every sensor sample** (full values, low bits merged) against
|
||||
`unprocessed_raw.exe -T` output. "EXACT" means zero mismatching samples over the whole
|
||||
frame. The table extraction itself consumed these same files (known-plaintext learning),
|
||||
so this is a consistency proof against the oracle, not a blind holdout; the cross-body
|
||||
sharing (tables learned on one body, exact on others) is the strongest independent check.
|
||||
|
||||
Private files are the maintainer's own D60 photos (hashes in `logs/private-corpus.tsv`);
|
||||
only their verdicts are recorded here, never content.
|
||||
Private files were the maintainer's own D60 photos; only aggregate verdicts are recorded here,
|
||||
never filenames or content.
|
||||
|
||||
## Results
|
||||
|
||||
|
||||
@@ -1,58 +1,9 @@
|
||||
# Private EOS D60 corpus and controlled captures
|
||||
# Private corpus verification summary
|
||||
|
||||
The maintainer's own Canon EOS D60 files in `../RawImages/` (local only, never copied into
|
||||
the repository). Names, sizes and SHA-256 of every file are in
|
||||
`logs/private-corpus.tsv`; no image content is recorded anywhere. All 1,561 files decode
|
||||
sample-exact against LibRaw 0.22.2 `unprocessed_raw.exe -T`.
|
||||
The decoder was checked against 1,516 maintainer-owned EOS D60 files and controlled captures.
|
||||
No private file names, hashes, image content, or color-chart observations are included in this
|
||||
crate. The retained aggregate verification results are documented in
|
||||
[`03-verification.md`](03-verification.md).
|
||||
|
||||
| Set | Files | What it is | What it established |
|
||||
|---|---:|---|---|
|
||||
| `RawImages/` | 1,516 | Everyday photos, 2005–2014, all Auto white balance; ISO 100 (925), 200 (197), 400 (287), 800 (34), 1000 (73) | Freeze revision 2: two incomplete code tables and the plane-without-0xff case (`02-crw-format.md`); the low-ISO clip level (`04-color.md`); the D60 colour profile (`assets/camera-profiles/Canon_EOS_D60.json`, 1,424 usable photos) |
|
||||
| `Cap&WhiteOut/` | 4 | Lens cap and blown-out frames, ISO 100 and 1000 (2026-10-13) | Black level at ISO 100 matches the image area; at ISO 1000 the border reads about 4 DN high. Clip level about 4000 at ISO 100, 4095 at ISO 1000 (`04-color.md`) |
|
||||
| `WBModes/` | 7 | One overcast scene at Auto, Daylight, Cloudy, Tungsten, Fluorescent, Flash, Custom; ISO 100, within a minute (2026-10-14) | White-balance setting n uses ColorBalance slot n (`04-color.md`) |
|
||||
| `TripodGrayCard/` | 14 | The same card filling most of the frame, tripod, f/8, ISO 100; two brackets (Auto 1/16–1/6 s, Cloudy 1/12–1/5 s), each starting and ending on the same speed; 14 s each (2026-10-14) | Black level confirmed; sensor linear; the spill strip (below) |
|
||||
| `GrayCard/` | 20 | An 18 % grey card (film-era), handheld, overcast; 5 frames at f/4 with exposure compensation, 15 at f/1.8 stepping 1/640–1/1600 s under Cloudy, Daylight and Auto (2026-10-14) | See below |
|
||||
|
||||
## Grey-card results (2026-10-14)
|
||||
|
||||
Measured in the middle 28 % of each frame, which lies on the card in every frame (the card
|
||||
is larger and was handheld; spread across the box about 3 %, sensor noise included).
|
||||
|
||||
- **Tone matches the camera.** Our render's card lightness is within 0.3 L\* of the camera
|
||||
JPEG's in all six frames checked (L\* 37.6–59.0 across exposures), so the profile's
|
||||
per-photo tone fit reproduces Canon's curve at mid-grey.
|
||||
- **Neutrals carry a slight magenta.** Our card is a\* +0.6 to +1.5 above the camera's,
|
||||
b\* 0.4–1.0 below (about 1–1.5 ΔE, under the usual threshold of visibility). It is the
|
||||
same small bias seen on the white-balance series' foliage, measured here on a true
|
||||
neutral. The profile matrix's rows sum to 1.005, 0.998 and 1.008, which accounts for part
|
||||
of it. Left for the chart refit, which can hold neutrals exactly.
|
||||
- **Overcast neutral.** The card needs R × 2.68 and B × 1.13 (G = 1) to render neutral, the
|
||||
same in all four groups to ±0.03. That lies between the camera's Daylight (2.54 / 1.22)
|
||||
and Cloudy (2.80 / 1.13) presets; its Auto chose R 2.54–2.60, B 1.14–1.16, slightly cool,
|
||||
which our As Shot reproduces, as it should.
|
||||
- **Black level:** these handheld brackets could not pin it through exposure (shutter
|
||||
accuracy at 1/640–1/1600 s, and the light dimmed about 10 % over the 90 s); the tripod
|
||||
set below settles it. *Correction:* the "border measurement of 130.4–132.0" first written
|
||||
here averaged every masked column, including the 8 next to the image, which catch spilled
|
||||
light. The decoder skips that strip and reads 127.6–128.6 on these 20 frames; the
|
||||
colour-ratio method's 124.5–127.5 is within 4 DN of it.
|
||||
- **What it cannot do:** a single neutral says nothing about how colours map, so the card
|
||||
does not change the colour profile. The chart will.
|
||||
|
||||
## Tripod grey-card results (2026-10-14)
|
||||
|
||||
- **The masked strip next to the image catches spilled light.** Columns 58–65 rise with the
|
||||
scene: 157 at 1/16 s, 206 at 1/6 s, while the columns further out stay at 127–130. The
|
||||
decoder's darkest-strip rule already excludes it: its black level stays at 127.2–128.7
|
||||
through both brackets, whatever the exposure.
|
||||
- **Black level confirmed.** Each bracket was fitted with level = black + k · time · (1 + drift
|
||||
· seconds), the drift taken from the repeated speed (the light fell 5–6 % within each 14 s
|
||||
bracket; without correcting for it the fit puts black near 120). Red, the channel least
|
||||
sensitive to any remaining exposure error, gives 128.0 and 128.2 against the decoder's
|
||||
127.9 and 128.3; green and blue give 129.9–133.1; the colour-ratio method gives
|
||||
125.5–126.2. All within 5 DN of the decoder, so no change.
|
||||
- **The sensor is linear.** With the drift corrected, every frame lies within 1.3 DN of the
|
||||
fitted line on the Auto bracket and within 4 DN on the Cloudy one.
|
||||
- **Lens falloff at f/8:** the card's level varies about ±8 % across the frame (5 × 5 cells,
|
||||
lightest at the bottom, darkest top right), part vignetting, part uneven light on the
|
||||
card. A colour chart in the middle third will see well under that.
|
||||
The private corpus and detailed derivation records remain in
|
||||
[LightCraft PR #3021](https://github.com/storytold/lightcraft/pull/3021).
|
||||
@@ -7,36 +7,20 @@ produced in LightCraft (`clean-room/crw/`, branch `clean-room-crw-format-decode`
|
||||
not rewritten after the fact, so paths they mention are LightCraft's paths of that time (the
|
||||
mapping is below).
|
||||
|
||||
The derivation trail — the starting assumptions, the plan, the container notes, the
|
||||
entropy-derivation log, the chart calibration, the probe scripts and their observational logs — is
|
||||
not part of this record. What this record holds is what the decoder is built from and what a
|
||||
reviewer needs to check it: the frozen format, its verification, the payload-layout and colour
|
||||
notes, the private-corpus record, the source log and the frozen code tables. Those documents are
|
||||
renumbered `01`–`05` in reading order.
|
||||
The derivation trail and frozen table-generation materials remain in
|
||||
[LightCraft PR #3021](https://github.com/storytold/lightcraft/pull/3021). This crate retains the
|
||||
format specification, verification summary, colour metadata notes, source log and public-facing
|
||||
decoder documentation.
|
||||
|
||||
## Documents
|
||||
|
||||
| File | What it is |
|
||||
|---|---|
|
||||
| [`sources.md`](sources.md) | Every URL opened and search run, with the time, what was asked and what was taken. The rules in force are at its top. |
|
||||
| [`01-payload-layout.md`](01-payload-layout.md) | The RawData payload partition established by statistics alone (no decoding): low-bits plane, 514-byte header, ff00-stuffed stream, tail. |
|
||||
| [`02-crw-format.md`](02-crw-format.md) | **The frozen format** (revision 2) and its reopening rule. The decoder implements this document. |
|
||||
| [`03-verification.md`](03-verification.md) | Full-frame exact comparison against the reference, zero tuning: 28 of 29 files, then 1,516 of 1,516 D60 files. |
|
||||
| [`04-color.md`](04-color.md) | CFA phase, active area, black and white levels, white-balance records, orientation and time: what the decoder reports beyond the samples. §3's colour matrices concern LightCraft (below). |
|
||||
| [`05-private-corpus.md`](05-private-corpus.md) | The maintainer's EOS D60 files and controlled captures (grey card, lens cap, white-balance presets) and what each set established. |
|
||||
|
||||
## Tables and logs
|
||||
|
||||
- `logs/table_sel{0,1,2}.json`: **the frozen code tables**, the source of truth that
|
||||
`tools/gen_tables.py` renders into `../src/tables.rs`. `table_sel0_d60class.json` is the
|
||||
revision-1 selector-0 table, kept for the record. These are the frozen code-table logs that ship
|
||||
with the crate: without them the frozen tables cannot be regenerated or audited.
|
||||
- `logs/private-corpus.tsv`: names, sizes and SHA-256 of the maintainer's own files. No image
|
||||
content, metadata or thumbnails are recorded anywhere here.
|
||||
- `logs/private/` (gitignored): per-file dumps of the private files, which can hold personal
|
||||
metadata. Local only.
|
||||
- The probe scripts and their observational logs (`structure-*.txt`, `p1*.txt`,
|
||||
`verification-sweep.txt`, `chart-captures.tsv`) are not part of this record.
|
||||
| [`05-private-corpus.md`](05-private-corpus.md) | A summary of private-corpus decoder verification; no image data or identifying file list is included. |
|
||||
|
||||
## What stayed local
|
||||
|
||||
@@ -60,7 +44,7 @@ renumbered `01`–`05` in reading order.
|
||||
| `crates/raw/tests/crw_oracle.rs` | `crates/crw/tests/samples.rs` (`CRAFT_CRW_ORACLE`, formerly `LIGHTCRAFT_CRW_ORACLE`) |
|
||||
| `white_from_data` (LightCraft's shared estimate) | `saturation_plateau` in `crates/crw/src/lib.rs` |
|
||||
| `xtask/src/main.rs` `RAW_SAMPLES` (corpus URLs) | `crates/crw/tests/samples.json` + `scripts/fetch-crw-samples.py` |
|
||||
| `plan/crw/model/gen_tables.py` | `crates/crw/clean-room/tools/gen_tables.py` |
|
||||
| `plan/crw/model/gen_tables.py` | LightCraft PR #3021 |
|
||||
| `docs/arw6-compression.md` (the house model for a derivation) | LightCraft's document; the method is summarised in `docs/clean-room.md` of this repository |
|
||||
| `crates/raw/src/chart_table.rs`, `spectral_table.rs`, `camera_preview`, `assets/camera-profiles/` | LightCraft (colour stays in the app) |
|
||||
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
private/
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,702 +0,0 @@
|
||||
{
|
||||
"first": {
|
||||
"111110": [
|
||||
0,
|
||||
10
|
||||
],
|
||||
"11110": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"101": [
|
||||
0,
|
||||
2
|
||||
],
|
||||
"00": [
|
||||
0,
|
||||
4
|
||||
],
|
||||
"1101": [
|
||||
0,
|
||||
1
|
||||
],
|
||||
"010": [
|
||||
0,
|
||||
3
|
||||
],
|
||||
"011": [
|
||||
0,
|
||||
5
|
||||
],
|
||||
"11101": [
|
||||
0,
|
||||
9
|
||||
],
|
||||
"100": [
|
||||
0,
|
||||
6
|
||||
],
|
||||
"11100": [
|
||||
0,
|
||||
8
|
||||
],
|
||||
"1100": [
|
||||
0,
|
||||
7
|
||||
],
|
||||
"1111110": [
|
||||
0,
|
||||
11
|
||||
]
|
||||
},
|
||||
"main": {
|
||||
"00": [
|
||||
0,
|
||||
3
|
||||
],
|
||||
"01": [
|
||||
0,
|
||||
4
|
||||
],
|
||||
"100": [
|
||||
0,
|
||||
2
|
||||
],
|
||||
"101": [
|
||||
0,
|
||||
5
|
||||
],
|
||||
"1100": [
|
||||
0,
|
||||
1
|
||||
],
|
||||
"1101": [
|
||||
0,
|
||||
6
|
||||
],
|
||||
"11100": [
|
||||
0,
|
||||
7
|
||||
],
|
||||
"111011": [
|
||||
1,
|
||||
2
|
||||
],
|
||||
"111100": [
|
||||
1,
|
||||
3
|
||||
],
|
||||
"111101": [
|
||||
1,
|
||||
1
|
||||
],
|
||||
"1111101": [
|
||||
0,
|
||||
9
|
||||
],
|
||||
"11111100": [
|
||||
1,
|
||||
5
|
||||
],
|
||||
"111111010": [
|
||||
2,
|
||||
2
|
||||
],
|
||||
"111111011": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"1111111010": [
|
||||
0,
|
||||
10
|
||||
],
|
||||
"1111111011": [
|
||||
15,
|
||||
0
|
||||
],
|
||||
"1111111101110100": [
|
||||
3,
|
||||
3
|
||||
],
|
||||
"1111111101110101": [
|
||||
2,
|
||||
5
|
||||
],
|
||||
"1111111101110111": [
|
||||
3,
|
||||
4
|
||||
],
|
||||
"1111111110000111": [
|
||||
5,
|
||||
2
|
||||
],
|
||||
"1111111110001010": [
|
||||
4,
|
||||
3
|
||||
],
|
||||
"1111111110001111": [
|
||||
6,
|
||||
1
|
||||
],
|
||||
"1111111110010001": [
|
||||
7,
|
||||
1
|
||||
],
|
||||
"1111111110011000": [
|
||||
5,
|
||||
3
|
||||
],
|
||||
"1111111110100010": [
|
||||
9,
|
||||
1
|
||||
],
|
||||
"1111111110110110": [
|
||||
11,
|
||||
1
|
||||
],
|
||||
"1111111111001010": [
|
||||
10,
|
||||
1
|
||||
],
|
||||
"1111111111001100": [
|
||||
13,
|
||||
1
|
||||
],
|
||||
"1111111111010101": [
|
||||
12,
|
||||
1
|
||||
],
|
||||
"1111111111011001": [
|
||||
14,
|
||||
1
|
||||
],
|
||||
"1111111111011110": [
|
||||
15,
|
||||
1
|
||||
],
|
||||
"1111111101110000": [
|
||||
3,
|
||||
1
|
||||
],
|
||||
"1111111101110110": [
|
||||
4,
|
||||
1
|
||||
],
|
||||
"1111111101111000": [
|
||||
4,
|
||||
2
|
||||
],
|
||||
"1111111101111010": [
|
||||
5,
|
||||
1
|
||||
],
|
||||
"1111111110001000": [
|
||||
5,
|
||||
5
|
||||
],
|
||||
"1111111110001110": [
|
||||
5,
|
||||
4
|
||||
],
|
||||
"1111111110110001": [
|
||||
8,
|
||||
1
|
||||
],
|
||||
"1111111111011000": [
|
||||
6,
|
||||
4
|
||||
],
|
||||
"1111111111100111": [
|
||||
6,
|
||||
3
|
||||
],
|
||||
"11111111010": [
|
||||
1,
|
||||
7
|
||||
],
|
||||
"1111111000": [
|
||||
2,
|
||||
1
|
||||
],
|
||||
"1111111100": [
|
||||
2,
|
||||
3
|
||||
],
|
||||
"1111111110000000": [
|
||||
2,
|
||||
6
|
||||
],
|
||||
"1111100": [
|
||||
1,
|
||||
4
|
||||
],
|
||||
"1111111101110001": [
|
||||
3,
|
||||
2
|
||||
],
|
||||
"111111110110": [
|
||||
2,
|
||||
4
|
||||
],
|
||||
"111010": [
|
||||
0,
|
||||
8
|
||||
],
|
||||
"1111111001": [
|
||||
1,
|
||||
6
|
||||
],
|
||||
"1111111101110010": [
|
||||
1,
|
||||
8
|
||||
],
|
||||
"1111111110000101": [
|
||||
2,
|
||||
8
|
||||
],
|
||||
"1111111111100110": [
|
||||
10,
|
||||
4
|
||||
],
|
||||
"1111111111000111": [
|
||||
6,
|
||||
5
|
||||
],
|
||||
"1111111101111001": [
|
||||
3,
|
||||
5
|
||||
],
|
||||
"1111111110111000": [
|
||||
4,
|
||||
4
|
||||
],
|
||||
"1111111110001011": [
|
||||
7,
|
||||
6
|
||||
],
|
||||
"1111111110101101": [
|
||||
4,
|
||||
5
|
||||
],
|
||||
"1111111111001111": [
|
||||
9,
|
||||
2
|
||||
],
|
||||
"1111111110111100": [
|
||||
6,
|
||||
6
|
||||
],
|
||||
"1111111110111001": [
|
||||
7,
|
||||
2
|
||||
],
|
||||
"1111111101111011": [
|
||||
3,
|
||||
6
|
||||
],
|
||||
"1111111110010100": [
|
||||
9,
|
||||
6
|
||||
],
|
||||
"1111111110101100": [
|
||||
4,
|
||||
6
|
||||
],
|
||||
"1111111110010011": [
|
||||
7,
|
||||
5
|
||||
],
|
||||
"1111111110000110": [
|
||||
2,
|
||||
7
|
||||
],
|
||||
"1111111101111101": [
|
||||
3,
|
||||
8
|
||||
],
|
||||
"1111111110011010": [
|
||||
7,
|
||||
4
|
||||
],
|
||||
"1111111101111100": [
|
||||
3,
|
||||
7
|
||||
],
|
||||
"1111111111011101": [
|
||||
11,
|
||||
3
|
||||
],
|
||||
"1111111110000011": [
|
||||
5,
|
||||
6
|
||||
],
|
||||
"1111111110001101": [
|
||||
7,
|
||||
7
|
||||
],
|
||||
"1111111110011111": [
|
||||
9,
|
||||
5
|
||||
],
|
||||
"1111111101110011": [
|
||||
1,
|
||||
9
|
||||
],
|
||||
"1111111110001001": [
|
||||
5,
|
||||
8
|
||||
],
|
||||
"1111111111100101": [
|
||||
8,
|
||||
4
|
||||
],
|
||||
"1111111110111110": [
|
||||
15,
|
||||
5
|
||||
],
|
||||
"1111111111000101": [
|
||||
6,
|
||||
2
|
||||
],
|
||||
"1111111110010101": [
|
||||
9,
|
||||
7
|
||||
],
|
||||
"1111111111010000": [
|
||||
8,
|
||||
5
|
||||
],
|
||||
"1111111111101101": [
|
||||
8,
|
||||
2
|
||||
],
|
||||
"1111111110011110": [
|
||||
4,
|
||||
8
|
||||
],
|
||||
"1111111110011001": [
|
||||
13,
|
||||
7
|
||||
],
|
||||
"1111111110101011": [
|
||||
6,
|
||||
7
|
||||
],
|
||||
"1111111110101110": [
|
||||
9,
|
||||
4
|
||||
],
|
||||
"1111111110011101": [
|
||||
4,
|
||||
7
|
||||
],
|
||||
"1111111111101011": [
|
||||
13,
|
||||
2
|
||||
],
|
||||
"1111111110110100": [
|
||||
11,
|
||||
4
|
||||
],
|
||||
"1111111111010110": [
|
||||
12,
|
||||
6
|
||||
],
|
||||
"1111111101111110": [
|
||||
2,
|
||||
9
|
||||
],
|
||||
"1111111111100010": [
|
||||
11,
|
||||
2
|
||||
],
|
||||
"1111111111110011": [
|
||||
8,
|
||||
3
|
||||
],
|
||||
"1111111110000010": [
|
||||
3,
|
||||
9
|
||||
],
|
||||
"1111111110100110": [
|
||||
11,
|
||||
5
|
||||
],
|
||||
"1111111110001100": [
|
||||
5,
|
||||
9
|
||||
],
|
||||
"1111111111110101": [
|
||||
10,
|
||||
2
|
||||
],
|
||||
"1111111110100011": [
|
||||
15,
|
||||
10
|
||||
],
|
||||
"1111111110010000": [
|
||||
15,
|
||||
9
|
||||
],
|
||||
"1111111111010011": [
|
||||
9,
|
||||
3
|
||||
],
|
||||
"1111111111111001": [
|
||||
14,
|
||||
2
|
||||
],
|
||||
"1111111110100111": [
|
||||
11,
|
||||
9
|
||||
],
|
||||
"1111111110111010": [
|
||||
13,
|
||||
9
|
||||
],
|
||||
"1111111111101010": [
|
||||
15,
|
||||
3
|
||||
],
|
||||
"1111111111000000": [
|
||||
10,
|
||||
7
|
||||
],
|
||||
"1111111111000100": [
|
||||
8,
|
||||
6
|
||||
],
|
||||
"1111111111111000": [
|
||||
12,
|
||||
2
|
||||
],
|
||||
"1111111110000100": [
|
||||
5,
|
||||
7
|
||||
],
|
||||
"1111111110100101": [
|
||||
6,
|
||||
8
|
||||
],
|
||||
"1111111111001101": [
|
||||
14,
|
||||
9
|
||||
],
|
||||
"1111111101111111": [
|
||||
7,
|
||||
9
|
||||
],
|
||||
"1111111111000110": [
|
||||
12,
|
||||
7
|
||||
],
|
||||
"1111111110111011": [
|
||||
8,
|
||||
7
|
||||
],
|
||||
"1111111111101000": [
|
||||
14,
|
||||
5
|
||||
],
|
||||
"1111111110011011": [
|
||||
11,
|
||||
6
|
||||
],
|
||||
"1111111110011100": [
|
||||
9,
|
||||
8
|
||||
],
|
||||
"1111111111100000": [
|
||||
10,
|
||||
5
|
||||
],
|
||||
"1111111111010001": [
|
||||
10,
|
||||
6
|
||||
],
|
||||
"1111111110010110": [
|
||||
4,
|
||||
9
|
||||
],
|
||||
"1111111111011100": [
|
||||
14,
|
||||
6
|
||||
],
|
||||
"1111111110101000": [
|
||||
13,
|
||||
6
|
||||
],
|
||||
"1111111110110101": [
|
||||
8,
|
||||
8
|
||||
],
|
||||
"1111111110101001": [
|
||||
15,
|
||||
7
|
||||
],
|
||||
"1111111110101111": [
|
||||
8,
|
||||
9
|
||||
],
|
||||
"1111111111000010": [
|
||||
10,
|
||||
9
|
||||
],
|
||||
"1111111111010100": [
|
||||
14,
|
||||
8
|
||||
],
|
||||
"1111111111101100": [
|
||||
12,
|
||||
4
|
||||
],
|
||||
"1111111110110011": [
|
||||
15,
|
||||
6
|
||||
],
|
||||
"1111111111101001": [
|
||||
12,
|
||||
5
|
||||
],
|
||||
"1111111110101010": [
|
||||
13,
|
||||
8
|
||||
],
|
||||
"1111111111000001": [
|
||||
7,
|
||||
3
|
||||
],
|
||||
"1111111110110111": [
|
||||
2,
|
||||
10
|
||||
],
|
||||
"1111111110000001": [
|
||||
1,
|
||||
10
|
||||
],
|
||||
"1111111111110001": [
|
||||
15,
|
||||
2
|
||||
],
|
||||
"1111111110100000": [
|
||||
6,
|
||||
9
|
||||
],
|
||||
"1111111110010111": [
|
||||
11,
|
||||
7
|
||||
],
|
||||
"1111111111111010": [
|
||||
14,
|
||||
3
|
||||
],
|
||||
"1111111111110000": [
|
||||
14,
|
||||
4
|
||||
],
|
||||
"1111111111000011": [
|
||||
10,
|
||||
8
|
||||
],
|
||||
"1111111110010010": [
|
||||
7,
|
||||
8
|
||||
],
|
||||
"1111111111011111": [
|
||||
13,
|
||||
3
|
||||
],
|
||||
"1111111111001000": [
|
||||
12,
|
||||
8
|
||||
],
|
||||
"1111111111010010": [
|
||||
14,
|
||||
7
|
||||
],
|
||||
"1111111110110010": [
|
||||
13,
|
||||
5
|
||||
],
|
||||
"1111111110111101": [
|
||||
13,
|
||||
4
|
||||
],
|
||||
"1111111111001011": [
|
||||
15,
|
||||
4
|
||||
],
|
||||
"1111111111001001": [
|
||||
12,
|
||||
9
|
||||
],
|
||||
"1111111110100100": [
|
||||
11,
|
||||
8
|
||||
],
|
||||
"1111111110110000": [
|
||||
15,
|
||||
8
|
||||
],
|
||||
"1111111111110100": [
|
||||
10,
|
||||
3
|
||||
],
|
||||
"1111111111011010": [
|
||||
4,
|
||||
10
|
||||
],
|
||||
"1111111110111111": [
|
||||
3,
|
||||
10
|
||||
],
|
||||
"1111111110100001": [
|
||||
9,
|
||||
9
|
||||
],
|
||||
"1111111111110110": [
|
||||
12,
|
||||
3
|
||||
],
|
||||
"1111111111011011": [
|
||||
6,
|
||||
10
|
||||
],
|
||||
"1111111111001110": [
|
||||
5,
|
||||
10
|
||||
],
|
||||
"1111111111101111": [
|
||||
13,
|
||||
10
|
||||
],
|
||||
"1111111111010111": [
|
||||
7,
|
||||
10
|
||||
],
|
||||
"1111111111110010": [
|
||||
12,
|
||||
10
|
||||
],
|
||||
"1111111111100011": [
|
||||
9,
|
||||
10
|
||||
],
|
||||
"1111111111101110": [
|
||||
10,
|
||||
10
|
||||
],
|
||||
"1111111111100001": [
|
||||
8,
|
||||
10
|
||||
],
|
||||
"1111111111110111": [
|
||||
14,
|
||||
10
|
||||
],
|
||||
"1111111111100100": [
|
||||
11,
|
||||
10
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,574 +0,0 @@
|
||||
{
|
||||
"first": {
|
||||
"111110": [
|
||||
0,
|
||||
10
|
||||
],
|
||||
"11110": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"101": [
|
||||
0,
|
||||
2
|
||||
],
|
||||
"00": [
|
||||
0,
|
||||
4
|
||||
],
|
||||
"1101": [
|
||||
0,
|
||||
1
|
||||
],
|
||||
"010": [
|
||||
0,
|
||||
3
|
||||
],
|
||||
"011": [
|
||||
0,
|
||||
5
|
||||
],
|
||||
"11101": [
|
||||
0,
|
||||
9
|
||||
],
|
||||
"100": [
|
||||
0,
|
||||
6
|
||||
],
|
||||
"11100": [
|
||||
0,
|
||||
8
|
||||
],
|
||||
"1100": [
|
||||
0,
|
||||
7
|
||||
]
|
||||
},
|
||||
"main": {
|
||||
"00": [
|
||||
0,
|
||||
3
|
||||
],
|
||||
"01": [
|
||||
0,
|
||||
4
|
||||
],
|
||||
"100": [
|
||||
0,
|
||||
2
|
||||
],
|
||||
"101": [
|
||||
0,
|
||||
5
|
||||
],
|
||||
"1100": [
|
||||
0,
|
||||
1
|
||||
],
|
||||
"1101": [
|
||||
0,
|
||||
6
|
||||
],
|
||||
"11100": [
|
||||
0,
|
||||
7
|
||||
],
|
||||
"111011": [
|
||||
1,
|
||||
2
|
||||
],
|
||||
"111100": [
|
||||
1,
|
||||
3
|
||||
],
|
||||
"111101": [
|
||||
1,
|
||||
1
|
||||
],
|
||||
"1111101": [
|
||||
0,
|
||||
9
|
||||
],
|
||||
"11111100": [
|
||||
1,
|
||||
5
|
||||
],
|
||||
"111111010": [
|
||||
2,
|
||||
2
|
||||
],
|
||||
"111111011": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"1111111010": [
|
||||
0,
|
||||
10
|
||||
],
|
||||
"1111111011": [
|
||||
15,
|
||||
0
|
||||
],
|
||||
"1111111101110100": [
|
||||
3,
|
||||
3
|
||||
],
|
||||
"1111111101110101": [
|
||||
2,
|
||||
5
|
||||
],
|
||||
"1111111101110111": [
|
||||
3,
|
||||
4
|
||||
],
|
||||
"1111111110000111": [
|
||||
5,
|
||||
2
|
||||
],
|
||||
"1111111110001010": [
|
||||
4,
|
||||
3
|
||||
],
|
||||
"1111111110001111": [
|
||||
6,
|
||||
1
|
||||
],
|
||||
"1111111110010001": [
|
||||
7,
|
||||
1
|
||||
],
|
||||
"1111111110011000": [
|
||||
5,
|
||||
3
|
||||
],
|
||||
"1111111110100010": [
|
||||
9,
|
||||
1
|
||||
],
|
||||
"1111111110110110": [
|
||||
11,
|
||||
1
|
||||
],
|
||||
"1111111111001010": [
|
||||
10,
|
||||
1
|
||||
],
|
||||
"1111111111001100": [
|
||||
13,
|
||||
1
|
||||
],
|
||||
"1111111111010101": [
|
||||
12,
|
||||
1
|
||||
],
|
||||
"1111111111011001": [
|
||||
14,
|
||||
1
|
||||
],
|
||||
"1111111111011110": [
|
||||
15,
|
||||
1
|
||||
],
|
||||
"1111111101110000": [
|
||||
3,
|
||||
1
|
||||
],
|
||||
"1111111101110110": [
|
||||
4,
|
||||
1
|
||||
],
|
||||
"1111111101111000": [
|
||||
4,
|
||||
2
|
||||
],
|
||||
"1111111101111010": [
|
||||
5,
|
||||
1
|
||||
],
|
||||
"1111111110001000": [
|
||||
5,
|
||||
5
|
||||
],
|
||||
"1111111110001110": [
|
||||
5,
|
||||
4
|
||||
],
|
||||
"1111111110110001": [
|
||||
8,
|
||||
1
|
||||
],
|
||||
"1111111111011000": [
|
||||
6,
|
||||
4
|
||||
],
|
||||
"1111111111100111": [
|
||||
6,
|
||||
3
|
||||
],
|
||||
"11111111010": [
|
||||
1,
|
||||
7
|
||||
],
|
||||
"1111111000": [
|
||||
2,
|
||||
1
|
||||
],
|
||||
"1111111100": [
|
||||
2,
|
||||
3
|
||||
],
|
||||
"1111111110000000": [
|
||||
2,
|
||||
6
|
||||
],
|
||||
"1111100": [
|
||||
1,
|
||||
4
|
||||
],
|
||||
"1111111101110001": [
|
||||
3,
|
||||
2
|
||||
],
|
||||
"111111110110": [
|
||||
2,
|
||||
4
|
||||
],
|
||||
"111010": [
|
||||
0,
|
||||
8
|
||||
],
|
||||
"1111111001": [
|
||||
1,
|
||||
6
|
||||
],
|
||||
"1111111101110010": [
|
||||
1,
|
||||
8
|
||||
],
|
||||
"1111111110000101": [
|
||||
2,
|
||||
8
|
||||
],
|
||||
"1111111111100110": [
|
||||
10,
|
||||
4
|
||||
],
|
||||
"1111111111000111": [
|
||||
6,
|
||||
5
|
||||
],
|
||||
"1111111101111001": [
|
||||
3,
|
||||
5
|
||||
],
|
||||
"1111111110111000": [
|
||||
4,
|
||||
4
|
||||
],
|
||||
"1111111110001011": [
|
||||
7,
|
||||
6
|
||||
],
|
||||
"1111111110101101": [
|
||||
4,
|
||||
5
|
||||
],
|
||||
"1111111111001111": [
|
||||
9,
|
||||
2
|
||||
],
|
||||
"1111111110111100": [
|
||||
6,
|
||||
6
|
||||
],
|
||||
"1111111110111001": [
|
||||
7,
|
||||
2
|
||||
],
|
||||
"1111111101111011": [
|
||||
3,
|
||||
6
|
||||
],
|
||||
"1111111110010100": [
|
||||
9,
|
||||
6
|
||||
],
|
||||
"1111111110101100": [
|
||||
4,
|
||||
6
|
||||
],
|
||||
"1111111110010011": [
|
||||
7,
|
||||
5
|
||||
],
|
||||
"1111111110000110": [
|
||||
2,
|
||||
7
|
||||
],
|
||||
"1111111101111101": [
|
||||
3,
|
||||
8
|
||||
],
|
||||
"1111111110011010": [
|
||||
7,
|
||||
4
|
||||
],
|
||||
"1111111101111100": [
|
||||
3,
|
||||
7
|
||||
],
|
||||
"1111111111011101": [
|
||||
11,
|
||||
3
|
||||
],
|
||||
"1111111110000011": [
|
||||
5,
|
||||
6
|
||||
],
|
||||
"1111111110001101": [
|
||||
7,
|
||||
7
|
||||
],
|
||||
"1111111110011111": [
|
||||
9,
|
||||
5
|
||||
],
|
||||
"1111111101110011": [
|
||||
1,
|
||||
9
|
||||
],
|
||||
"1111111110001001": [
|
||||
5,
|
||||
8
|
||||
],
|
||||
"1111111111100101": [
|
||||
8,
|
||||
4
|
||||
],
|
||||
"1111111110111110": [
|
||||
15,
|
||||
5
|
||||
],
|
||||
"1111111111000101": [
|
||||
6,
|
||||
2
|
||||
],
|
||||
"1111111110010101": [
|
||||
9,
|
||||
7
|
||||
],
|
||||
"1111111111010000": [
|
||||
8,
|
||||
5
|
||||
],
|
||||
"1111111111101101": [
|
||||
8,
|
||||
2
|
||||
],
|
||||
"1111111110011110": [
|
||||
4,
|
||||
8
|
||||
],
|
||||
"1111111110011001": [
|
||||
13,
|
||||
7
|
||||
],
|
||||
"1111111110101011": [
|
||||
6,
|
||||
7
|
||||
],
|
||||
"1111111110101110": [
|
||||
9,
|
||||
4
|
||||
],
|
||||
"1111111110011101": [
|
||||
4,
|
||||
7
|
||||
],
|
||||
"1111111111101011": [
|
||||
13,
|
||||
2
|
||||
],
|
||||
"1111111110110100": [
|
||||
11,
|
||||
4
|
||||
],
|
||||
"1111111111010110": [
|
||||
12,
|
||||
6
|
||||
],
|
||||
"1111111101111110": [
|
||||
2,
|
||||
9
|
||||
],
|
||||
"1111111111100010": [
|
||||
11,
|
||||
2
|
||||
],
|
||||
"1111111111110011": [
|
||||
8,
|
||||
3
|
||||
],
|
||||
"1111111110000010": [
|
||||
3,
|
||||
9
|
||||
],
|
||||
"1111111110100110": [
|
||||
11,
|
||||
5
|
||||
],
|
||||
"1111111110001100": [
|
||||
5,
|
||||
9
|
||||
],
|
||||
"1111111111110101": [
|
||||
10,
|
||||
2
|
||||
],
|
||||
"1111111110100011": [
|
||||
15,
|
||||
10
|
||||
],
|
||||
"1111111110010000": [
|
||||
15,
|
||||
9
|
||||
],
|
||||
"1111111111010011": [
|
||||
9,
|
||||
3
|
||||
],
|
||||
"1111111111111001": [
|
||||
14,
|
||||
2
|
||||
],
|
||||
"1111111110100111": [
|
||||
11,
|
||||
9
|
||||
],
|
||||
"1111111110111010": [
|
||||
13,
|
||||
9
|
||||
],
|
||||
"1111111111101010": [
|
||||
15,
|
||||
3
|
||||
],
|
||||
"1111111111000000": [
|
||||
10,
|
||||
7
|
||||
],
|
||||
"1111111111000100": [
|
||||
8,
|
||||
6
|
||||
],
|
||||
"1111111111111000": [
|
||||
12,
|
||||
2
|
||||
],
|
||||
"1111111110000100": [
|
||||
5,
|
||||
7
|
||||
],
|
||||
"1111111110100101": [
|
||||
6,
|
||||
8
|
||||
],
|
||||
"1111111111001101": [
|
||||
14,
|
||||
9
|
||||
],
|
||||
"1111111101111111": [
|
||||
7,
|
||||
9
|
||||
],
|
||||
"1111111111000110": [
|
||||
12,
|
||||
7
|
||||
],
|
||||
"1111111110111011": [
|
||||
8,
|
||||
7
|
||||
],
|
||||
"1111111111101000": [
|
||||
14,
|
||||
5
|
||||
],
|
||||
"1111111110011011": [
|
||||
11,
|
||||
6
|
||||
],
|
||||
"1111111110011100": [
|
||||
9,
|
||||
8
|
||||
],
|
||||
"1111111111100000": [
|
||||
10,
|
||||
5
|
||||
],
|
||||
"1111111111010001": [
|
||||
10,
|
||||
6
|
||||
],
|
||||
"1111111110010110": [
|
||||
4,
|
||||
9
|
||||
],
|
||||
"1111111111011100": [
|
||||
14,
|
||||
6
|
||||
],
|
||||
"1111111110101000": [
|
||||
13,
|
||||
6
|
||||
],
|
||||
"1111111110110101": [
|
||||
8,
|
||||
8
|
||||
],
|
||||
"1111111110101001": [
|
||||
15,
|
||||
7
|
||||
],
|
||||
"1111111110101111": [
|
||||
8,
|
||||
9
|
||||
],
|
||||
"1111111111000010": [
|
||||
10,
|
||||
9
|
||||
],
|
||||
"1111111111010100": [
|
||||
14,
|
||||
8
|
||||
],
|
||||
"1111111111101100": [
|
||||
12,
|
||||
4
|
||||
],
|
||||
"1111111110110011": [
|
||||
15,
|
||||
6
|
||||
],
|
||||
"1111111111101001": [
|
||||
12,
|
||||
5
|
||||
],
|
||||
"1111111110101010": [
|
||||
13,
|
||||
8
|
||||
],
|
||||
"1111111111000001": [
|
||||
7,
|
||||
3
|
||||
],
|
||||
"1111111110110111": [
|
||||
2,
|
||||
10
|
||||
],
|
||||
"1111111110000001": [
|
||||
1,
|
||||
10
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,706 +0,0 @@
|
||||
{
|
||||
"first": {
|
||||
"11111110": [
|
||||
0,
|
||||
10
|
||||
],
|
||||
"1101": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"00": [
|
||||
0,
|
||||
3
|
||||
],
|
||||
"01": [
|
||||
0,
|
||||
2
|
||||
],
|
||||
"100": [
|
||||
0,
|
||||
4
|
||||
],
|
||||
"1100": [
|
||||
0,
|
||||
5
|
||||
],
|
||||
"101": [
|
||||
0,
|
||||
1
|
||||
],
|
||||
"1110": [
|
||||
0,
|
||||
6
|
||||
],
|
||||
"11110": [
|
||||
0,
|
||||
7
|
||||
],
|
||||
"111110": [
|
||||
0,
|
||||
9
|
||||
],
|
||||
"1111110": [
|
||||
0,
|
||||
8
|
||||
],
|
||||
"111111110": [
|
||||
0,
|
||||
11
|
||||
]
|
||||
},
|
||||
"main": {
|
||||
"1111111100": [
|
||||
0,
|
||||
10
|
||||
],
|
||||
"111111010": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"01": [
|
||||
0,
|
||||
3
|
||||
],
|
||||
"101": [
|
||||
0,
|
||||
4
|
||||
],
|
||||
"00": [
|
||||
0,
|
||||
2
|
||||
],
|
||||
"100": [
|
||||
0,
|
||||
1
|
||||
],
|
||||
"11010": [
|
||||
1,
|
||||
2
|
||||
],
|
||||
"111111011": [
|
||||
2,
|
||||
3
|
||||
],
|
||||
"11101": [
|
||||
1,
|
||||
3
|
||||
],
|
||||
"11011": [
|
||||
1,
|
||||
1
|
||||
],
|
||||
"1111111010": [
|
||||
3,
|
||||
1
|
||||
],
|
||||
"11111100": [
|
||||
2,
|
||||
1
|
||||
],
|
||||
"1111100": [
|
||||
2,
|
||||
2
|
||||
],
|
||||
"1100": [
|
||||
0,
|
||||
5
|
||||
],
|
||||
"11100": [
|
||||
0,
|
||||
6
|
||||
],
|
||||
"1111011": [
|
||||
1,
|
||||
4
|
||||
],
|
||||
"111100": [
|
||||
0,
|
||||
7
|
||||
],
|
||||
"1111010": [
|
||||
0,
|
||||
8
|
||||
],
|
||||
"111111100": [
|
||||
1,
|
||||
5
|
||||
],
|
||||
"1111111101100001": [
|
||||
2,
|
||||
4
|
||||
],
|
||||
"11111111010": [
|
||||
1,
|
||||
6
|
||||
],
|
||||
"1111101": [
|
||||
0,
|
||||
9
|
||||
],
|
||||
"1111111101110001": [
|
||||
7,
|
||||
1
|
||||
],
|
||||
"1111111101100011": [
|
||||
4,
|
||||
1
|
||||
],
|
||||
"1111111011": [
|
||||
3,
|
||||
2
|
||||
],
|
||||
"1111111101101111": [
|
||||
6,
|
||||
1
|
||||
],
|
||||
"1111111101100010": [
|
||||
3,
|
||||
3
|
||||
],
|
||||
"1111111101101001": [
|
||||
5,
|
||||
1
|
||||
],
|
||||
"1111111101101011": [
|
||||
4,
|
||||
3
|
||||
],
|
||||
"1111111101100110": [
|
||||
1,
|
||||
7
|
||||
],
|
||||
"1111111101111011": [
|
||||
9,
|
||||
1
|
||||
],
|
||||
"1111111101100000": [
|
||||
15,
|
||||
0
|
||||
],
|
||||
"1111111101111111": [
|
||||
2,
|
||||
8
|
||||
],
|
||||
"1111111101100101": [
|
||||
1,
|
||||
9
|
||||
],
|
||||
"1111111101101010": [
|
||||
3,
|
||||
4
|
||||
],
|
||||
"1111111110001000": [
|
||||
13,
|
||||
1
|
||||
],
|
||||
"1111111101101000": [
|
||||
1,
|
||||
8
|
||||
],
|
||||
"1111111110000010": [
|
||||
10,
|
||||
1
|
||||
],
|
||||
"1111111110000011": [
|
||||
11,
|
||||
1
|
||||
],
|
||||
"1111111101100100": [
|
||||
4,
|
||||
2
|
||||
],
|
||||
"1111111110000100": [
|
||||
4,
|
||||
4
|
||||
],
|
||||
"1111111101111001": [
|
||||
8,
|
||||
1
|
||||
],
|
||||
"1111111101110101": [
|
||||
2,
|
||||
6
|
||||
],
|
||||
"1111111111001111": [
|
||||
6,
|
||||
7
|
||||
],
|
||||
"1111111110100001": [
|
||||
11,
|
||||
6
|
||||
],
|
||||
"1111111101101100": [
|
||||
5,
|
||||
2
|
||||
],
|
||||
"1111111101100111": [
|
||||
2,
|
||||
5
|
||||
],
|
||||
"1111111101111010": [
|
||||
2,
|
||||
7
|
||||
],
|
||||
"1111111110000111": [
|
||||
5,
|
||||
8
|
||||
],
|
||||
"1111111101111000": [
|
||||
3,
|
||||
7
|
||||
],
|
||||
"1111111110001011": [
|
||||
14,
|
||||
1
|
||||
],
|
||||
"1111111101110110": [
|
||||
3,
|
||||
8
|
||||
],
|
||||
"1111111110011111": [
|
||||
12,
|
||||
1
|
||||
],
|
||||
"1111111110110110": [
|
||||
4,
|
||||
8
|
||||
],
|
||||
"1111111111000011": [
|
||||
6,
|
||||
8
|
||||
],
|
||||
"1111111110010100": [
|
||||
4,
|
||||
6
|
||||
],
|
||||
"1111111110000000": [
|
||||
7,
|
||||
2
|
||||
],
|
||||
"1111111110001110": [
|
||||
4,
|
||||
9
|
||||
],
|
||||
"1111111101101110": [
|
||||
3,
|
||||
5
|
||||
],
|
||||
"1111111111100101": [
|
||||
11,
|
||||
2
|
||||
],
|
||||
"1111111110001100": [
|
||||
15,
|
||||
1
|
||||
],
|
||||
"1111111110001111": [
|
||||
4,
|
||||
7
|
||||
],
|
||||
"1111111101110011": [
|
||||
3,
|
||||
6
|
||||
],
|
||||
"1111111111000001": [
|
||||
9,
|
||||
2
|
||||
],
|
||||
"1111111110110111": [
|
||||
8,
|
||||
2
|
||||
],
|
||||
"1111111101101101": [
|
||||
2,
|
||||
9
|
||||
],
|
||||
"1111111110001010": [
|
||||
5,
|
||||
7
|
||||
],
|
||||
"1111111101110010": [
|
||||
6,
|
||||
2
|
||||
],
|
||||
"1111111101111110": [
|
||||
4,
|
||||
5
|
||||
],
|
||||
"1111111110011101": [
|
||||
8,
|
||||
6
|
||||
],
|
||||
"1111111110100000": [
|
||||
7,
|
||||
6
|
||||
],
|
||||
"1111111111000000": [
|
||||
12,
|
||||
6
|
||||
],
|
||||
"1111111101110100": [
|
||||
5,
|
||||
3
|
||||
],
|
||||
"1111111101111101": [
|
||||
5,
|
||||
5
|
||||
],
|
||||
"1111111111011011": [
|
||||
6,
|
||||
4
|
||||
],
|
||||
"1111111110011110": [
|
||||
6,
|
||||
5
|
||||
],
|
||||
"1111111101110000": [
|
||||
3,
|
||||
9
|
||||
],
|
||||
"1111111110000001": [
|
||||
5,
|
||||
9
|
||||
],
|
||||
"1111111110010000": [
|
||||
6,
|
||||
3
|
||||
],
|
||||
"1111111110111011": [
|
||||
10,
|
||||
6
|
||||
],
|
||||
"1111111111001110": [
|
||||
6,
|
||||
6
|
||||
],
|
||||
"1111111110101111": [
|
||||
7,
|
||||
3
|
||||
],
|
||||
"1111111111010110": [
|
||||
8,
|
||||
8
|
||||
],
|
||||
"1111111110011000": [
|
||||
7,
|
||||
8
|
||||
],
|
||||
"1111111111001101": [
|
||||
12,
|
||||
2
|
||||
],
|
||||
"1111111111001010": [
|
||||
10,
|
||||
2
|
||||
],
|
||||
"1111111110110100": [
|
||||
10,
|
||||
7
|
||||
],
|
||||
"1111111110000110": [
|
||||
5,
|
||||
4
|
||||
],
|
||||
"1111111111011101": [
|
||||
9,
|
||||
8
|
||||
],
|
||||
"1111111111011001": [
|
||||
7,
|
||||
7
|
||||
],
|
||||
"1111111110101000": [
|
||||
9,
|
||||
5
|
||||
],
|
||||
"1111111110100010": [
|
||||
9,
|
||||
6
|
||||
],
|
||||
"1111111110101101": [
|
||||
9,
|
||||
7
|
||||
],
|
||||
"1111111111011110": [
|
||||
10,
|
||||
5
|
||||
],
|
||||
"1111111110100101": [
|
||||
8,
|
||||
5
|
||||
],
|
||||
"1111111110111000": [
|
||||
8,
|
||||
4
|
||||
],
|
||||
"1111111110011011": [
|
||||
7,
|
||||
5
|
||||
],
|
||||
"1111111110010011": [
|
||||
5,
|
||||
6
|
||||
],
|
||||
"1111111111010000": [
|
||||
9,
|
||||
3
|
||||
],
|
||||
"1111111110000101": [
|
||||
6,
|
||||
9
|
||||
],
|
||||
"1111111110001001": [
|
||||
15,
|
||||
10
|
||||
],
|
||||
"1111111110010010": [
|
||||
15,
|
||||
9
|
||||
],
|
||||
"1111111111101001": [
|
||||
8,
|
||||
3
|
||||
],
|
||||
"1111111111001001": [
|
||||
14,
|
||||
9
|
||||
],
|
||||
"1111111110100100": [
|
||||
8,
|
||||
9
|
||||
],
|
||||
"1111111111011100": [
|
||||
14,
|
||||
2
|
||||
],
|
||||
"1111111111101000": [
|
||||
13,
|
||||
2
|
||||
],
|
||||
"1111111111101011": [
|
||||
13,
|
||||
3
|
||||
],
|
||||
"1111111110110011": [
|
||||
8,
|
||||
7
|
||||
],
|
||||
"1111111111100111": [
|
||||
15,
|
||||
2
|
||||
],
|
||||
"1111111110001101": [
|
||||
11,
|
||||
9
|
||||
],
|
||||
"1111111101111100": [
|
||||
7,
|
||||
9
|
||||
],
|
||||
"1111111101110111": [
|
||||
1,
|
||||
10
|
||||
],
|
||||
"1111111110110101": [
|
||||
7,
|
||||
10
|
||||
],
|
||||
"1111111111010100": [
|
||||
14,
|
||||
7
|
||||
],
|
||||
"1111111110110000": [
|
||||
11,
|
||||
7
|
||||
],
|
||||
"1111111111011000": [
|
||||
13,
|
||||
7
|
||||
],
|
||||
"1111111110110001": [
|
||||
13,
|
||||
8
|
||||
],
|
||||
"1111111111010011": [
|
||||
13,
|
||||
5
|
||||
],
|
||||
"1111111110100011": [
|
||||
13,
|
||||
6
|
||||
],
|
||||
"1111111110110010": [
|
||||
13,
|
||||
9
|
||||
],
|
||||
"1111111110010110": [
|
||||
2,
|
||||
10
|
||||
],
|
||||
"1111111110011010": [
|
||||
3,
|
||||
10
|
||||
],
|
||||
"1111111110111101": [
|
||||
5,
|
||||
10
|
||||
],
|
||||
"1111111110010111": [
|
||||
4,
|
||||
10
|
||||
],
|
||||
"1111111110101100": [
|
||||
8,
|
||||
10
|
||||
],
|
||||
"1111111111000101": [
|
||||
12,
|
||||
8
|
||||
],
|
||||
"1111111110010001": [
|
||||
6,
|
||||
10
|
||||
],
|
||||
"1111111111101010": [
|
||||
11,
|
||||
10
|
||||
],
|
||||
"1111111110011001": [
|
||||
9,
|
||||
9
|
||||
],
|
||||
"1111111110011100": [
|
||||
7,
|
||||
4
|
||||
],
|
||||
"1111111110101110": [
|
||||
11,
|
||||
8
|
||||
],
|
||||
"1111111111010101": [
|
||||
15,
|
||||
8
|
||||
],
|
||||
"1111111111010010": [
|
||||
13,
|
||||
4
|
||||
],
|
||||
"1111111110010101": [
|
||||
10,
|
||||
8
|
||||
],
|
||||
"1111111111000111": [
|
||||
14,
|
||||
5
|
||||
],
|
||||
"1111111110101001": [
|
||||
11,
|
||||
4
|
||||
],
|
||||
"1111111110111010": [
|
||||
15,
|
||||
4
|
||||
],
|
||||
"1111111111100000": [
|
||||
13,
|
||||
10
|
||||
],
|
||||
"1111111111001100": [
|
||||
14,
|
||||
3
|
||||
],
|
||||
"1111111111001011": [
|
||||
10,
|
||||
3
|
||||
],
|
||||
"1111111110111111": [
|
||||
10,
|
||||
4
|
||||
],
|
||||
"1111111111000010": [
|
||||
12,
|
||||
3
|
||||
],
|
||||
"1111111111000100": [
|
||||
11,
|
||||
5
|
||||
],
|
||||
"1111111110101011": [
|
||||
15,
|
||||
7
|
||||
],
|
||||
"1111111110100110": [
|
||||
12,
|
||||
9
|
||||
],
|
||||
"1111111111000110": [
|
||||
14,
|
||||
4
|
||||
],
|
||||
"1111111111011010": [
|
||||
12,
|
||||
4
|
||||
],
|
||||
"1111111111100010": [
|
||||
15,
|
||||
3
|
||||
],
|
||||
"1111111111100110": [
|
||||
11,
|
||||
3
|
||||
],
|
||||
"1111111111001000": [
|
||||
14,
|
||||
6
|
||||
],
|
||||
"1111111110111110": [
|
||||
9,
|
||||
4
|
||||
],
|
||||
"1111111110111100": [
|
||||
12,
|
||||
5
|
||||
],
|
||||
"1111111111100011": [
|
||||
15,
|
||||
6
|
||||
],
|
||||
"1111111111010111": [
|
||||
9,
|
||||
10
|
||||
],
|
||||
"1111111110100111": [
|
||||
15,
|
||||
5
|
||||
],
|
||||
"1111111110101010": [
|
||||
12,
|
||||
7
|
||||
],
|
||||
"1111111111100100": [
|
||||
10,
|
||||
9
|
||||
],
|
||||
"1111111111010001": [
|
||||
10,
|
||||
10
|
||||
],
|
||||
"1111111111100001": [
|
||||
14,
|
||||
8
|
||||
],
|
||||
"1111111111011111": [
|
||||
12,
|
||||
10
|
||||
],
|
||||
"1111111110111001": [
|
||||
14,
|
||||
10
|
||||
]
|
||||
},
|
||||
"reached": 6518333,
|
||||
"N": 6518336,
|
||||
"file": "CRW_0476.crw",
|
||||
"selector": 1
|
||||
}
|
||||
@@ -1,706 +0,0 @@
|
||||
{
|
||||
"first": {
|
||||
"011": [
|
||||
0,
|
||||
4
|
||||
],
|
||||
"010": [
|
||||
0,
|
||||
7
|
||||
],
|
||||
"101": [
|
||||
0,
|
||||
3
|
||||
],
|
||||
"1100": [
|
||||
0,
|
||||
9
|
||||
],
|
||||
"000": [
|
||||
0,
|
||||
6
|
||||
],
|
||||
"100": [
|
||||
0,
|
||||
8
|
||||
],
|
||||
"001": [
|
||||
0,
|
||||
5
|
||||
],
|
||||
"111110": [
|
||||
0,
|
||||
1
|
||||
],
|
||||
"1101": [
|
||||
0,
|
||||
2
|
||||
],
|
||||
"1110": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"11110": [
|
||||
0,
|
||||
10
|
||||
],
|
||||
"1111110": [
|
||||
0,
|
||||
11
|
||||
]
|
||||
},
|
||||
"main": {
|
||||
"011": [
|
||||
0,
|
||||
6
|
||||
],
|
||||
"001": [
|
||||
0,
|
||||
5
|
||||
],
|
||||
"101": [
|
||||
0,
|
||||
7
|
||||
],
|
||||
"1101": [
|
||||
0,
|
||||
8
|
||||
],
|
||||
"100": [
|
||||
0,
|
||||
2
|
||||
],
|
||||
"11100": [
|
||||
0,
|
||||
9
|
||||
],
|
||||
"1111011": [
|
||||
1,
|
||||
5
|
||||
],
|
||||
"000": [
|
||||
0,
|
||||
4
|
||||
],
|
||||
"1100": [
|
||||
0,
|
||||
1
|
||||
],
|
||||
"010": [
|
||||
0,
|
||||
3
|
||||
],
|
||||
"1111100": [
|
||||
0,
|
||||
10
|
||||
],
|
||||
"1111111100110": [
|
||||
3,
|
||||
8
|
||||
],
|
||||
"1111111100111": [
|
||||
3,
|
||||
7
|
||||
],
|
||||
"1111010": [
|
||||
1,
|
||||
1
|
||||
],
|
||||
"111111100": [
|
||||
1,
|
||||
8
|
||||
],
|
||||
"111100": [
|
||||
1,
|
||||
4
|
||||
],
|
||||
"111011": [
|
||||
1,
|
||||
3
|
||||
],
|
||||
"111111110001": [
|
||||
3,
|
||||
1
|
||||
],
|
||||
"1111111111001011": [
|
||||
6,
|
||||
1
|
||||
],
|
||||
"111111011": [
|
||||
2,
|
||||
1
|
||||
],
|
||||
"111111001": [
|
||||
0,
|
||||
0
|
||||
],
|
||||
"11111111100000": [
|
||||
4,
|
||||
1
|
||||
],
|
||||
"111010": [
|
||||
1,
|
||||
2
|
||||
],
|
||||
"11111010": [
|
||||
1,
|
||||
6
|
||||
],
|
||||
"1111111010": [
|
||||
2,
|
||||
3
|
||||
],
|
||||
"111111010": [
|
||||
2,
|
||||
2
|
||||
],
|
||||
"11111110111": [
|
||||
2,
|
||||
4
|
||||
],
|
||||
"11111011": [
|
||||
1,
|
||||
7
|
||||
],
|
||||
"1111111110100111": [
|
||||
5,
|
||||
1
|
||||
],
|
||||
"1111111111100101": [
|
||||
8,
|
||||
1
|
||||
],
|
||||
"1111111100100": [
|
||||
2,
|
||||
5
|
||||
],
|
||||
"1111111111010011": [
|
||||
7,
|
||||
1
|
||||
],
|
||||
"1111111100101": [
|
||||
3,
|
||||
3
|
||||
],
|
||||
"111111110000": [
|
||||
3,
|
||||
2
|
||||
],
|
||||
"11111110110": [
|
||||
1,
|
||||
9
|
||||
],
|
||||
"1111111110001001": [
|
||||
2,
|
||||
6
|
||||
],
|
||||
"1111111111010100": [
|
||||
9,
|
||||
1
|
||||
],
|
||||
"1111111110001011": [
|
||||
7,
|
||||
6
|
||||
],
|
||||
"1111111110010000": [
|
||||
9,
|
||||
7
|
||||
],
|
||||
"1111111111001111": [
|
||||
6,
|
||||
5
|
||||
],
|
||||
"1111111111111000": [
|
||||
10,
|
||||
1
|
||||
],
|
||||
"11111111011111": [
|
||||
2,
|
||||
7
|
||||
],
|
||||
"11111111011101": [
|
||||
5,
|
||||
6
|
||||
],
|
||||
"1111111110011011": [
|
||||
6,
|
||||
8
|
||||
],
|
||||
"1111111110111110": [
|
||||
6,
|
||||
6
|
||||
],
|
||||
"1111111110010010": [
|
||||
4,
|
||||
8
|
||||
],
|
||||
"11111111100001": [
|
||||
2,
|
||||
9
|
||||
],
|
||||
"11111111011100": [
|
||||
2,
|
||||
8
|
||||
],
|
||||
"1111111101010": [
|
||||
3,
|
||||
6
|
||||
],
|
||||
"1111111111101110": [
|
||||
13,
|
||||
1
|
||||
],
|
||||
"1111111101001": [
|
||||
3,
|
||||
5
|
||||
],
|
||||
"1111111111101100": [
|
||||
11,
|
||||
1
|
||||
],
|
||||
"11111111011010": [
|
||||
5,
|
||||
8
|
||||
],
|
||||
"1111111110100101": [
|
||||
11,
|
||||
5
|
||||
],
|
||||
"1111111110110010": [
|
||||
15,
|
||||
6
|
||||
],
|
||||
"1111111110100100": [
|
||||
8,
|
||||
8
|
||||
],
|
||||
"1111111101000": [
|
||||
3,
|
||||
4
|
||||
],
|
||||
"1111111111000001": [
|
||||
4,
|
||||
4
|
||||
],
|
||||
"1111111110001111": [
|
||||
9,
|
||||
8
|
||||
],
|
||||
"1111111110010110": [
|
||||
4,
|
||||
7
|
||||
],
|
||||
"1111111110101101": [
|
||||
8,
|
||||
7
|
||||
],
|
||||
"1111111110100010": [
|
||||
5,
|
||||
2
|
||||
],
|
||||
"1111111110011010": [
|
||||
7,
|
||||
5
|
||||
],
|
||||
"1111111111111001": [
|
||||
12,
|
||||
1
|
||||
],
|
||||
"11111111011001": [
|
||||
5,
|
||||
7
|
||||
],
|
||||
"1111111110001101": [
|
||||
1,
|
||||
10
|
||||
],
|
||||
"11111111011011": [
|
||||
5,
|
||||
9
|
||||
],
|
||||
"1111111101011": [
|
||||
3,
|
||||
9
|
||||
],
|
||||
"11111111011000": [
|
||||
7,
|
||||
9
|
||||
],
|
||||
"1111111110110101": [
|
||||
10,
|
||||
9
|
||||
],
|
||||
"1111111110110111": [
|
||||
5,
|
||||
3
|
||||
],
|
||||
"1111111110011101": [
|
||||
6,
|
||||
7
|
||||
],
|
||||
"1111111110111010": [
|
||||
4,
|
||||
3
|
||||
],
|
||||
"1111111111001110": [
|
||||
12,
|
||||
6
|
||||
],
|
||||
"1111111110101000": [
|
||||
4,
|
||||
6
|
||||
],
|
||||
"1111111110001110": [
|
||||
5,
|
||||
5
|
||||
],
|
||||
"1111111110101110": [
|
||||
4,
|
||||
5
|
||||
],
|
||||
"1111111110001010": [
|
||||
4,
|
||||
2
|
||||
],
|
||||
"111111000": [
|
||||
15,
|
||||
0
|
||||
],
|
||||
"1111111111000101": [
|
||||
12,
|
||||
8
|
||||
],
|
||||
"1111111110010100": [
|
||||
9,
|
||||
6
|
||||
],
|
||||
"1111111111011100": [
|
||||
12,
|
||||
5
|
||||
],
|
||||
"1111111110101100": [
|
||||
13,
|
||||
6
|
||||
],
|
||||
"1111111110011100": [
|
||||
11,
|
||||
6
|
||||
],
|
||||
"1111111110111001": [
|
||||
10,
|
||||
8
|
||||
],
|
||||
"1111111111010110": [
|
||||
10,
|
||||
6
|
||||
],
|
||||
"1111111111011110": [
|
||||
10,
|
||||
4
|
||||
],
|
||||
"1111111111110100": [
|
||||
8,
|
||||
2
|
||||
],
|
||||
"1111111110110011": [
|
||||
8,
|
||||
6
|
||||
],
|
||||
"1111111111010101": [
|
||||
9,
|
||||
3
|
||||
],
|
||||
"1111111111101111": [
|
||||
8,
|
||||
3
|
||||
],
|
||||
"11111111011110": [
|
||||
7,
|
||||
8
|
||||
],
|
||||
"1111111110001100": [
|
||||
9,
|
||||
9
|
||||
],
|
||||
"1111111110111111": [
|
||||
10,
|
||||
7
|
||||
],
|
||||
"1111111111101101": [
|
||||
14,
|
||||
4
|
||||
],
|
||||
"1111111111110000": [
|
||||
6,
|
||||
3
|
||||
],
|
||||
"1111111111111100": [
|
||||
14,
|
||||
1
|
||||
],
|
||||
"1111111110010001": [
|
||||
15,
|
||||
9
|
||||
],
|
||||
"1111111110110100": [
|
||||
11,
|
||||
4
|
||||
],
|
||||
"1111111110010011": [
|
||||
5,
|
||||
4
|
||||
],
|
||||
"1111111111111011": [
|
||||
10,
|
||||
2
|
||||
],
|
||||
"1111111111110101": [
|
||||
15,
|
||||
1
|
||||
],
|
||||
"1111111111100001": [
|
||||
6,
|
||||
4
|
||||
],
|
||||
"1111111111011111": [
|
||||
8,
|
||||
4
|
||||
],
|
||||
"1111111110110000": [
|
||||
9,
|
||||
5
|
||||
],
|
||||
"1111111110011000": [
|
||||
4,
|
||||
9
|
||||
],
|
||||
"1111111110111100": [
|
||||
15,
|
||||
7
|
||||
],
|
||||
"1111111111110010": [
|
||||
12,
|
||||
3
|
||||
],
|
||||
"1111111111100011": [
|
||||
11,
|
||||
3
|
||||
],
|
||||
"1111111111100110": [
|
||||
14,
|
||||
5
|
||||
],
|
||||
"1111111111010010": [
|
||||
14,
|
||||
6
|
||||
],
|
||||
"1111111111100100": [
|
||||
13,
|
||||
2
|
||||
],
|
||||
"1111111111100010": [
|
||||
10,
|
||||
5
|
||||
],
|
||||
"1111111110011110": [
|
||||
6,
|
||||
9
|
||||
],
|
||||
"1111111110001000": [
|
||||
7,
|
||||
7
|
||||
],
|
||||
"1111111111010001": [
|
||||
7,
|
||||
2
|
||||
],
|
||||
"1111111111011010": [
|
||||
6,
|
||||
2
|
||||
],
|
||||
"1111111111001001": [
|
||||
7,
|
||||
3
|
||||
],
|
||||
"1111111110100011": [
|
||||
13,
|
||||
7
|
||||
],
|
||||
"1111111111011001": [
|
||||
8,
|
||||
5
|
||||
],
|
||||
"1111111111001010": [
|
||||
4,
|
||||
10
|
||||
],
|
||||
"1111111110110001": [
|
||||
13,
|
||||
5
|
||||
],
|
||||
"1111111110111101": [
|
||||
13,
|
||||
4
|
||||
],
|
||||
"1111111110100110": [
|
||||
7,
|
||||
4
|
||||
],
|
||||
"1111111110100000": [
|
||||
11,
|
||||
8
|
||||
],
|
||||
"1111111110101011": [
|
||||
3,
|
||||
10
|
||||
],
|
||||
"1111111110100001": [
|
||||
13,
|
||||
8
|
||||
],
|
||||
"1111111110010101": [
|
||||
8,
|
||||
9
|
||||
],
|
||||
"1111111110010111": [
|
||||
11,
|
||||
7
|
||||
],
|
||||
"1111111110011111": [
|
||||
11,
|
||||
9
|
||||
],
|
||||
"1111111111001100": [
|
||||
12,
|
||||
7
|
||||
],
|
||||
"1111111111000110": [
|
||||
14,
|
||||
7
|
||||
],
|
||||
"1111111110101010": [
|
||||
15,
|
||||
8
|
||||
],
|
||||
"1111111110110110": [
|
||||
9,
|
||||
4
|
||||
],
|
||||
"1111111111110011": [
|
||||
14,
|
||||
2
|
||||
],
|
||||
"1111111110111011": [
|
||||
15,
|
||||
5
|
||||
],
|
||||
"1111111111011101": [
|
||||
11,
|
||||
2
|
||||
],
|
||||
"1111111111101001": [
|
||||
12,
|
||||
4
|
||||
],
|
||||
"1111111110101001": [
|
||||
13,
|
||||
9
|
||||
],
|
||||
"1111111111000100": [
|
||||
14,
|
||||
8
|
||||
],
|
||||
"1111111111011011": [
|
||||
15,
|
||||
3
|
||||
],
|
||||
"1111111111100111": [
|
||||
13,
|
||||
3
|
||||
],
|
||||
"1111111111101011": [
|
||||
15,
|
||||
2
|
||||
],
|
||||
"1111111111011000": [
|
||||
9,
|
||||
2
|
||||
],
|
||||
"1111111111001101": [
|
||||
15,
|
||||
4
|
||||
],
|
||||
"1111111111000000": [
|
||||
5,
|
||||
10
|
||||
],
|
||||
"1111111111000011": [
|
||||
12,
|
||||
9
|
||||
],
|
||||
"1111111110101111": [
|
||||
7,
|
||||
10
|
||||
],
|
||||
"1111111111010111": [
|
||||
13,
|
||||
10
|
||||
],
|
||||
"1111111111010000": [
|
||||
14,
|
||||
9
|
||||
],
|
||||
"1111111111110111": [
|
||||
12,
|
||||
2
|
||||
],
|
||||
"1111111111110110": [
|
||||
10,
|
||||
3
|
||||
],
|
||||
"1111111111001000": [
|
||||
6,
|
||||
10
|
||||
],
|
||||
"1111111111000111": [
|
||||
9,
|
||||
10
|
||||
],
|
||||
"1111111110111000": [
|
||||
2,
|
||||
10
|
||||
],
|
||||
"1111111111101010": [
|
||||
12,
|
||||
10
|
||||
],
|
||||
"1111111111111010": [
|
||||
14,
|
||||
3
|
||||
],
|
||||
"1111111111000010": [
|
||||
8,
|
||||
10
|
||||
],
|
||||
"1111111111100000": [
|
||||
11,
|
||||
10
|
||||
],
|
||||
"1111111111110001": [
|
||||
14,
|
||||
10
|
||||
],
|
||||
"1111111110011001": [
|
||||
15,
|
||||
10
|
||||
],
|
||||
"1111111111101000": [
|
||||
10,
|
||||
10
|
||||
]
|
||||
},
|
||||
"reached": 6518335,
|
||||
"N": 6518336,
|
||||
"file": "crw-canon-eos-300d-b.crw",
|
||||
"selector": 2
|
||||
}
|
||||
@@ -94,7 +94,7 @@ checked out, diffed, logged or read.
|
||||
- 2026-10-12 19:35–19:45 — `ciff_dump.py` (written here, stdlib only; container layout
|
||||
implemented from the two documented sources above) run over the 11 public files and the 18
|
||||
private files (whose dumps may contain personal metadata and are never committed). Observed
|
||||
facts are summarised in `01-payload-layout.md`. No raw-data decoding was attempted; statistics
|
||||
facts are summarised in the LightCraft derivation record. No raw-data decoding was attempted; statistics
|
||||
only. The script and its logs are not part of this record.
|
||||
- 2026-10-12 ~20:0x — P0/P1 local analysis (post-approval): the container notes written from the
|
||||
already-logged sources + corpus observations. `p1_payload.py`, `p1b_markers.py`,
|
||||
@@ -102,7 +102,7 @@ checked out, diffed, logged or read.
|
||||
three payload layouts, the
|
||||
514-byte zero block at the compressed section start of every file, JPEG-style ff00 stuffing
|
||||
of every entropy stream (zero exceptions), the PowerShot `ff d9` terminator, and the exact
|
||||
low-bits region bounds on G5/G6. Documented in `01-payload-layout.md`. No external sources
|
||||
low-bits region bounds on G5/G6. Documented in the LightCraft derivation record. No external sources
|
||||
consulted in this step.
|
||||
|
||||
## Oracle (P2, from 2026-10-12)
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Regenerate crates/crw/src/tables.rs from the frozen tables in crates/crw/clean-room/logs/table_sel{0,1,2}.json.
|
||||
|
||||
Run from anywhere: `python crates/crw/clean-room/tools/gen_tables.py`. The JSON files are the
|
||||
derivation's frozen data (02-crw-format.md section 3); this script only renders them as Rust
|
||||
constants, keeping the file's doc comment. It was a local tool during the derivation in LightCraft
|
||||
(plan/crw/model/gen_tables.py) and moved here so the tables stay reproducible.
|
||||
"""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[4]
|
||||
TABLES = ROOT / "crates/crw/src/tables.rs"
|
||||
LOGS = ROOT / "crates/crw/clean-room/logs"
|
||||
|
||||
TAIL = """
|
||||
/// The tables for DecoderTable selector 0, 1 or 2.
|
||||
pub(crate) fn tables(selector: u32) -> Option<SelTables> {
|
||||
match selector {
|
||||
0 => Some(SelTables { first: FIRST_0, main: MAIN_0 }),
|
||||
1 => Some(SelTables { first: FIRST_1, main: MAIN_1 }),
|
||||
2 => Some(SelTables { first: FIRST_2, main: MAIN_2 }),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
|
||||
def main():
|
||||
head = TABLES.read_text(encoding="utf-8").split("#[rustfmt::skip]")[0]
|
||||
out = [head.rstrip("\n") + "\n"]
|
||||
for sel in (0, 1, 2):
|
||||
spec = json.loads((LOGS / f"table_sel{sel}.json").read_text(encoding="utf-8"))
|
||||
for part, name in (("first", "FIRST"), ("main", "MAIN")):
|
||||
rows = sorted(spec[part].items(), key=lambda kv: (len(kv[0]), kv[0]))
|
||||
out.append("#[rustfmt::skip]")
|
||||
out.append(f"const {name}_{sel}: &[(u16, u8, u8, u8)] = &[")
|
||||
line = []
|
||||
for code, (r, s) in rows:
|
||||
line.append(f"(0b{code}, {len(code)}, {r}, {s}),")
|
||||
if len(line) == 6:
|
||||
out.append(" " + " ".join(line))
|
||||
line = []
|
||||
if line:
|
||||
out.append(" " + " ".join(line))
|
||||
out.append("];")
|
||||
TABLES.write_text("\n".join(out) + TAIL, encoding="utf-8", newline="\n")
|
||||
print(f"generated {TABLES.relative_to(ROOT)}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -7,7 +7,7 @@
|
||||
//! black-box analysis against a reference decoder's command-line output, frozen in
|
||||
//! `clean-room/02-crw-format.md` and verified sample-exact on 28 of 29 corpus files plus 1,516
|
||||
//! further EOS D60 files (`clean-room/03-verification.md`). The code tables are frozen data
|
||||
//! (`tables`, generated from `clean-room/logs/table_sel{0,1,2}.json`). No other raw decoder's
|
||||
//! (`tables`, frozen from the clean-room derivation record retained in LightCraft). No other raw decoder's
|
||||
//! source was consulted; the whole derivation record is in the crate's `clean-room/` folder.
|
||||
//!
|
||||
//! - [`probe`] recognises the CIFF signature.
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
//! Canon CRW entropy code tables, frozen clean-room data.
|
||||
//!
|
||||
//! Generated by `clean-room/tools/gen_tables.py` from `clean-room/logs/table_sel{0,1,2}.json` (the
|
||||
//! tables extracted by known-plaintext alignment and frozen at the CRW-FREEZE commit; derivation:
|
||||
//! `clean-room/02-crw-format.md` §3). Do not edit by hand; regenerate from the JSON.
|
||||
//! Frozen code tables extracted by known-plaintext alignment in the clean-room derivation record
|
||||
//! retained at https://github.com/storytold/lightcraft (see ATTRIBUTION.md). Do not edit by hand.
|
||||
//! Each entry is `(code bits, code length, run, size)`; codes are MSB-first.
|
||||
|
||||
/// One selector's pair of canonical Huffman tables: the code starting each 64-sample
|
||||
|
||||
Reference in new issue
Block a user