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:
Dylan M. Taylor authored and GitHub committed 2026-10-30 22:42:50 -04:00
commit 2b8bd856ce
18 files changed
+33 -4511

No files matched your search

+1 -1
View File
@@ -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
+1 -1
View File
@@ -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.
+5 -6
View File
@@ -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
-105
View File
@@ -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.**
+4 -4
View File
@@ -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
+4 -4
View File
@@ -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
+7 -56
View File
@@ -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).
+6 -22
View File
@@ -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
View File
@@ -1 +0,0 @@
private/
File diff suppressed because it is too large. Load diff
-702
View File
@@ -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
]
}
}
-706
View File
@@ -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
}
-706
View File
@@ -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
}
+2 -2
View File
@@ -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)
-53
View File
@@ -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()
+1 -1
View File
@@ -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.
+2 -3
View File
@@ -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