@photivra/engine 2.20.0 → 2.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +178 -1
- package/CITATION.cff +1 -1
- package/README.md +7 -6
- package/SECURITY.md +1 -1
- package/THIRD_PARTY.md +7 -0
- package/dist/capture/dng-lens-correction-opcodes.d.ts +2 -2
- package/dist/capture/dng-lens-correction-opcodes.js +2 -2
- package/dist/capture/dng-lens-correction-opcodes.js.map +1 -1
- package/dist/capture/exposure-build-up-stage.d.ts +16 -0
- package/dist/capture/exposure-build-up-stage.js +4 -0
- package/dist/capture/exposure-build-up-stage.js.map +1 -0
- package/dist/capture/native-environment-lean.d.ts +2 -1
- package/dist/capture/native-environment-lean.js +41 -73
- package/dist/capture/native-environment-lean.js.map +1 -1
- package/dist/capture/native-environment-tabulated.js +4 -3
- package/dist/capture/native-environment-tabulated.js.map +1 -1
- package/dist/capture/native-raw.d.ts +3 -2
- package/dist/capture/native-raw.js +5 -4
- package/dist/capture/native-raw.js.map +1 -1
- package/dist/capture/sensor-raw-producer.d.ts +4 -1
- package/dist/capture/sensor-raw-producer.js +12 -3
- package/dist/capture/sensor-raw-producer.js.map +1 -1
- package/dist/core/version.d.ts +1 -1
- package/dist/core/version.js +1 -1
- package/dist/core/version.js.map +1 -1
- package/dist/equipment/generic-lens-catalogue.d.ts +3 -2
- package/dist/equipment/generic-lens-catalogue.js +18 -5
- package/dist/equipment/generic-lens-catalogue.js.map +1 -1
- package/dist/equipment/generic-tier-assets.d.ts +32 -0
- package/dist/equipment/generic-tier-assets.js +16 -11
- package/dist/equipment/generic-tier-assets.js.map +1 -1
- package/dist/equipment/sensor-profile-body.d.ts +78 -0
- package/dist/equipment/sensor-profile-body.js +77 -0
- package/dist/equipment/sensor-profile-body.js.map +1 -0
- package/dist/equipment/sensor-profiles.d.ts +8 -0
- package/dist/equipment/sensor-profiles.js +82 -0
- package/dist/equipment/sensor-profiles.js.map +1 -0
- package/dist/facade/catalogue-lens-signal.d.ts +2 -2
- package/dist/facade/catalogue-lens-signal.js +58 -71
- package/dist/facade/catalogue-lens-signal.js.map +1 -1
- package/dist/facade/chart-radiance-batch.js +2 -1
- package/dist/facade/chart-radiance-batch.js.map +1 -1
- package/dist/facade/defocus-image-space-provider.d.ts +7 -0
- package/dist/facade/defocus-image-space-provider.js +64 -76
- package/dist/facade/defocus-image-space-provider.js.map +1 -1
- package/dist/facade/display-view-gpu-session.js +2 -0
- package/dist/facade/display-view-gpu-session.js.map +1 -1
- package/dist/facade/display-view-gpu.d.ts +6 -1
- package/dist/facade/display-view-gpu.js.map +1 -1
- package/dist/facade/display-view-lens-signal.js +25 -23
- package/dist/facade/display-view-lens-signal.js.map +1 -1
- package/dist/facade/display-view.js +5 -23
- package/dist/facade/display-view.js.map +1 -1
- package/dist/facade/expected-signal-setup.d.ts +3 -1
- package/dist/facade/expected-signal-setup.js +1 -1
- package/dist/facade/expected-signal-setup.js.map +1 -1
- package/dist/facade/expected-signal.d.ts +47 -14
- package/dist/facade/expected-signal.js +117 -112
- package/dist/facade/expected-signal.js.map +1 -1
- package/dist/facade/exposure-build-up.d.ts +70 -0
- package/dist/facade/exposure-build-up.js +164 -0
- package/dist/facade/exposure-build-up.js.map +1 -0
- package/dist/facade/fast-methods.js +9 -1
- package/dist/facade/fast-methods.js.map +1 -1
- package/dist/facade/generic-lens-capture.d.ts +2 -2
- package/dist/facade/generic-lens-capture.js +2 -2
- package/dist/facade/generic-lens-capture.js.map +1 -1
- package/dist/facade/image-plane-enable.d.ts +7 -0
- package/dist/facade/image-plane-enable.js +17 -0
- package/dist/facade/image-plane-enable.js.map +1 -0
- package/dist/facade/image-plane-lattice-data.d.ts +6 -0
- package/dist/facade/image-plane-lattice-data.js +10 -0
- package/dist/facade/image-plane-lattice-data.js.map +1 -0
- package/dist/facade/image-plane-support.d.ts +33 -0
- package/dist/facade/image-plane-support.js +11 -0
- package/dist/facade/image-plane-support.js.map +1 -0
- package/dist/facade/image-plane.d.ts +36 -0
- package/dist/facade/image-plane.js +353 -0
- package/dist/facade/image-plane.js.map +1 -0
- package/dist/facade/mixed-illumination.d.ts +108 -0
- package/dist/facade/mixed-illumination.js +174 -0
- package/dist/facade/mixed-illumination.js.map +1 -0
- package/dist/facade/representative-light-sources.d.ts +72 -0
- package/dist/facade/representative-light-sources.js +124 -0
- package/dist/facade/representative-light-sources.js.map +1 -0
- package/dist/facade/scene-radiance.d.ts +129 -4
- package/dist/facade/scene-radiance.js +48 -13
- package/dist/facade/scene-radiance.js.map +1 -1
- package/dist/facade/simulate-capture.d.ts +39 -10
- package/dist/facade/simulate-capture.js +252 -92
- package/dist/facade/simulate-capture.js.map +1 -1
- package/dist/facade/simulate-display-view.js +14 -6
- package/dist/facade/simulate-display-view.js.map +1 -1
- package/dist/gpu/chart-composite-gpu.d.ts +13 -1
- package/dist/gpu/chart-composite-gpu.js +48 -9
- package/dist/gpu/chart-composite-gpu.js.map +1 -1
- package/dist/gpu/chart-radiance-gpu.js +4 -30
- package/dist/gpu/chart-radiance-gpu.js.map +1 -1
- package/dist/gpu/display-view-composite-material-module.d.ts +10 -4
- package/dist/gpu/display-view-composite-material-module.js +39 -13
- package/dist/gpu/display-view-composite-material-module.js.map +1 -1
- package/dist/gpu/display-view-image-material-module.d.ts +86 -0
- package/dist/gpu/display-view-image-material-module.js +339 -0
- package/dist/gpu/display-view-image-material-module.js.map +1 -0
- package/dist/gpu/display-view-image-quality.d.ts +45 -0
- package/dist/gpu/display-view-image-quality.js +380 -0
- package/dist/gpu/display-view-image-quality.js.map +1 -0
- package/dist/gpu/display-view-quality-gpu.d.ts +67 -1
- package/dist/gpu/display-view-quality-gpu.js +136 -205
- package/dist/gpu/display-view-quality-gpu.js.map +1 -1
- package/dist/gpu/display-view-speed-gpu.d.ts +51 -3
- package/dist/gpu/display-view-speed-gpu.js +131 -93
- package/dist/gpu/display-view-speed-gpu.js.map +1 -1
- package/dist/gpu/wgsl-display-view-quality-kernel.d.ts +29 -15
- package/dist/gpu/wgsl-display-view-quality-kernel.js +58 -36
- package/dist/gpu/wgsl-display-view-quality-kernel.js.map +1 -1
- package/dist/gpu/wgsl-display-view-speed-kernel.d.ts +21 -6
- package/dist/gpu/wgsl-display-view-speed-kernel.js +46 -11
- package/dist/gpu/wgsl-display-view-speed-kernel.js.map +1 -1
- package/dist/gpu/wgsl-exact-sum.d.ts +20 -0
- package/dist/gpu/wgsl-exact-sum.js +42 -0
- package/dist/gpu/wgsl-exact-sum.js.map +1 -0
- package/dist/index.d.ts +11 -3
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/motion/subject-motion.d.ts +66 -0
- package/dist/motion/subject-motion.js +52 -0
- package/dist/motion/subject-motion.js.map +1 -0
- package/dist/optics/generic-lens-lateral-color.d.ts +83 -0
- package/dist/optics/generic-lens-lateral-color.js +77 -0
- package/dist/optics/generic-lens-lateral-color.js.map +1 -0
- package/dist/optics/generic-lens-psf.js +54 -46
- package/dist/optics/generic-lens-psf.js.map +1 -1
- package/dist/optics/lens-psf-profile.d.ts +7 -0
- package/dist/optics/lens-psf-profile.js +2 -1
- package/dist/optics/lens-psf-profile.js.map +1 -1
- package/dist/output/developed-lens-corrections.d.ts +19 -5
- package/dist/output/developed-lens-corrections.js +28 -9
- package/dist/output/developed-lens-corrections.js.map +1 -1
- package/dist/output/generic-lens-corrections.d.ts +41 -5
- package/dist/output/generic-lens-corrections.js +52 -8
- package/dist/output/generic-lens-corrections.js.map +1 -1
- package/dist/output/print-plan.d.ts +41 -5
- package/dist/output/print-plan.js +59 -14
- package/dist/output/print-plan.js.map +1 -1
- package/dist/sensor/binomial-sample.d.ts +3 -0
- package/dist/sensor/binomial-sample.js +86 -0
- package/dist/sensor/binomial-sample.js.map +1 -0
- package/dist/sensor/sensor-characteristics.d.ts +10 -0
- package/dist/sensor/sensor-characteristics.js +20 -9
- package/dist/sensor/sensor-characteristics.js.map +1 -1
- package/docs/AGENT_GUIDE.md +1 -0
- package/docs/API_REFERENCE.md +98 -1
- package/docs/QUICK_START.md +125 -0
- package/docs/USAGE.md +92 -1
- package/docs/api/core-version.md +1 -1
- package/docs/api/equipment-generic-lens-catalogue.md +10 -5
- package/docs/api/equipment-sensor-profile-body.md +64 -0
- package/docs/api/equipment-sensor-profiles.md +86 -0
- package/docs/api/exports.json +207 -2
- package/docs/api/facade-exposure-build-up.md +105 -0
- package/docs/api/facade-fast-methods.md +9 -1
- package/docs/api/facade-image-plane-enable.md +16 -0
- package/docs/api/facade-mixed-illumination.md +67 -0
- package/docs/api/facade-representative-light-sources.md +131 -0
- package/docs/api/facade-scene-radiance.md +54 -3
- package/docs/api/facade-simulate-capture.md +26 -6
- package/docs/api/motion-subject-motion.md +23 -0
- package/docs/api/optics-generic-lens-lateral-color.md +79 -0
- package/docs/api/output-developed-lens-corrections.md +10 -1
- package/docs/api/output-generic-lens-corrections.md +40 -4
- package/docs/api/output-print-plan.md +35 -1
- package/llms.txt +2 -0
- package/package.json +1 -1
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { type SimulateCaptureOptions, type SimulateCaptureResult } from "./simulate-capture.js";
|
|
2
|
+
/** The most fractions one build-up takes. */
|
|
3
|
+
export declare const EXPOSURE_BUILD_UP_MAXIMUM_FRACTIONS = 64;
|
|
4
|
+
/**
|
|
5
|
+
* The first stream ID of the build-up's per-site random streams (`deriveNativeSiteStreamSeedUint32`): fraction j's photo split,
|
|
6
|
+
* dark split and readout use streams base + 3j, + 3j + 1 and + 3j + 2 (j = 0 … 63). The whole exposure keeps the ordinary
|
|
7
|
+
* streams 0 (charge) and 1 (read noise).
|
|
8
|
+
*/
|
|
9
|
+
export declare const EXPOSURE_BUILD_UP_STREAM_BASE = 1112866816;
|
|
10
|
+
/** The build-up to render with {@link simulateExposureBuildUp}. */
|
|
11
|
+
export interface SimulateExposureBuildUpOptions {
|
|
12
|
+
/**
|
|
13
|
+
* Fractions of `exposure.shutterSeconds` to read out, strictly increasing, each above 0 and at most 1 (1 to 64 of them), for
|
|
14
|
+
* example `[0.2, 0.4, 0.6, 0.8, 1]`. A fraction of 1 is the whole exposure: `simulateCapture` of the request.
|
|
15
|
+
*/
|
|
16
|
+
fractions: readonly number[];
|
|
17
|
+
}
|
|
18
|
+
/** One readout of a build-up. */
|
|
19
|
+
export interface SimulateExposureBuildUpFrame {
|
|
20
|
+
/** The fraction of the exposure collected. */
|
|
21
|
+
fraction: number;
|
|
22
|
+
/** fraction × the request's shutter time, in s. */
|
|
23
|
+
elapsedSeconds: number;
|
|
24
|
+
/**
|
|
25
|
+
* The fraction developed as its own photo. At fraction 1 it is `simulateCapture(options)` itself, byte for byte. Below 1 it is
|
|
26
|
+
* the result of the fraction's capture (manual, the whole exposure's f-number and ISO, shutter fraction·t: its `image`, `raw`,
|
|
27
|
+
* `plan` and `request`), with the build-up's counts, the `exposure.buildUp` assumption, and the whole exposure's `exposure` and
|
|
28
|
+
* `sensor` reports (the camera's settings and noise figure, not the elapsed part's).
|
|
29
|
+
*/
|
|
30
|
+
result: SimulateCaptureResult;
|
|
31
|
+
}
|
|
32
|
+
/** The readouts of {@link simulateExposureBuildUp}, in the order of `fractions`. */
|
|
33
|
+
export interface SimulateExposureBuildUpResult {
|
|
34
|
+
/** The whole exposure's shutter time, in s. */
|
|
35
|
+
shutterSeconds: number;
|
|
36
|
+
frames: readonly SimulateExposureBuildUpFrame[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Renders fractions of one exposure as one accumulating process (#534), the way a camera's live readout of a long exposure
|
|
40
|
+
* would show the light building up. Each fraction is read out and developed as its own photo.
|
|
41
|
+
*
|
|
42
|
+
* The model: photon and dark-charge arrivals at a site are Poisson processes (photon shot noise: EMVA 1288 Release 4.0,
|
|
43
|
+
* section 2, free), with any rate over time. Given the count n over [0, t] of a Poisson process with mean Λ(t), its arrival
|
|
44
|
+
* times are n independent times with distribution Λ(s)/Λ(t) on [0, t], so its count over [0, s] is Binomial(n, Λ(s)/Λ(t))
|
|
45
|
+
* (R. G. Gallager, Discrete Stochastic Processes, chapter 2, sections 2.4 and 2.5, MIT OpenCourseWare 6.262, free).
|
|
46
|
+
*
|
|
47
|
+
* The method: the whole exposure is `simulateCapture(options)` itself, with its ordinary draws and seeds. Each earlier fraction
|
|
48
|
+
* fⱼ is a capture of the same request in manual mode at the whole exposure's resolved f-number and ISO and the shutter fⱼ·t,
|
|
49
|
+
* so its expected signal at every site is integrated from the spectrum over the window [0, fⱼ·t] by the capture itself (the
|
|
50
|
+
* camera rotation, `motion.subject` and mixed lighting included, and each row's own window with a rolling shutter). Its
|
|
51
|
+
* counts are not drawn anew: going down the fractions, each site's photo and dark counts are N(fⱼ) ~ Binomial(N(fⱼ₊₁), λ(fⱼ) /
|
|
52
|
+
* λ(fⱼ₊₁)), with λ the site's expected mean in each render (after PRNU and DSNU). So every fraction's counts are Poisson with
|
|
53
|
+
* that fraction's own mean (the mean and variance of `simulateCapture` at fⱼ·t), they never decrease from one fraction to the
|
|
54
|
+
* next, and two fractions' counts covary by the earlier one's mean. Fixed-pattern noise is the sensor's own and the same in
|
|
55
|
+
* every fraction. Each fraction's charge is clipped at the full well, then read once: its own read noise (dual gain as the ISO
|
|
56
|
+
* selects), pre-ADC and ADC saturation and quantization at the ADC bit depth.
|
|
57
|
+
*
|
|
58
|
+
* The windows are nested, so the true means never decrease; the capture's temporal midpoint quadrature can still put an
|
|
59
|
+
* earlier fraction's estimate above a later one's at a site (motion blur). There the split takes probability 1 (the count is
|
|
60
|
+
* kept), and the `exposure.buildUp` assumption counts those sites (`nonMonotoneSites`): an approximation of the quadrature,
|
|
61
|
+
* not of the binomial law. Raise `sensor.temporalSampleCount` to remove them.
|
|
62
|
+
*
|
|
63
|
+
* Cost: one capture per fraction, plus about 64 bytes per native site for the chain. Exact or fast: the request's own `fast`
|
|
64
|
+
* (and the format default) applies to every fraction; the build-up adds no fast method, so with `fast: false` (the calculator's
|
|
65
|
+
* setting) every fraction is an exact capture. On screen only: formats "srgb-8" and "srgb-16" (a fraction's JPEG, PNG or DNG
|
|
66
|
+
* is refused). A fraction's realization depends on the whole `fractions` list (each step of the chain has its own streams);
|
|
67
|
+
* the same request and list always give the same frames.
|
|
68
|
+
* @returns One frame per fraction, in order.
|
|
69
|
+
*/
|
|
70
|
+
export declare function simulateExposureBuildUp(options: SimulateCaptureOptions, buildUp: SimulateExposureBuildUpOptions): Promise<SimulateExposureBuildUpResult>;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Exposure build-up (#534): fractions of one exposure, read out as it accumulates.
|
|
4
|
+
* @see docs/QUICK_START.md, "Exposure build-up".
|
|
5
|
+
*/
|
|
6
|
+
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
7
|
+
import { EXPOSURE_BUILD_UP_STAGES } from "../capture/exposure-build-up-stage.js";
|
|
8
|
+
import { sampleBinomial } from "../sensor/binomial-sample.js";
|
|
9
|
+
import { createResettableUniformStream, deriveNativeSiteStreamSeedUint32, NATIVE_SITE_READ_NOISE_STREAM_ID } from "../sensor/stochastic-seed.js";
|
|
10
|
+
import { runCapture } from "./simulate-capture.js";
|
|
11
|
+
/** The most fractions one build-up takes. */
|
|
12
|
+
export const EXPOSURE_BUILD_UP_MAXIMUM_FRACTIONS = 64;
|
|
13
|
+
/**
|
|
14
|
+
* The first stream ID of the build-up's per-site random streams (`deriveNativeSiteStreamSeedUint32`): fraction j's photo split,
|
|
15
|
+
* dark split and readout use streams base + 3j, + 3j + 1 and + 3j + 2 (j = 0 … 63). The whole exposure keeps the ordinary
|
|
16
|
+
* streams 0 (charge) and 1 (read noise).
|
|
17
|
+
*/
|
|
18
|
+
export const EXPOSURE_BUILD_UP_STREAM_BASE = 0x42550000;
|
|
19
|
+
function fail(message) { throw new InvalidConfigurationError(message); }
|
|
20
|
+
function siteRecord() {
|
|
21
|
+
return { photoMean: new Float64Array(0), darkMean: new Float64Array(0), photo: new Float64Array(0), dark: new Float64Array(0), written: new Uint8Array(0), count: 0 };
|
|
22
|
+
}
|
|
23
|
+
/** Records site `index` (growing the arrays as needed; a site computed twice writes the same values again). */
|
|
24
|
+
function record(r, index, photoMean, darkMean, photo, dark) {
|
|
25
|
+
if (index >= r.written.length) {
|
|
26
|
+
const size = Math.max(1024, 2 * r.written.length, index + 1);
|
|
27
|
+
const grow = (a) => { const b = new Float64Array(size); b.set(a); return b; };
|
|
28
|
+
r.photoMean = grow(r.photoMean);
|
|
29
|
+
r.darkMean = grow(r.darkMean);
|
|
30
|
+
r.photo = grow(r.photo);
|
|
31
|
+
r.dark = grow(r.dark);
|
|
32
|
+
const w = new Uint8Array(size);
|
|
33
|
+
w.set(r.written);
|
|
34
|
+
r.written = w;
|
|
35
|
+
}
|
|
36
|
+
if (!r.written[index]) {
|
|
37
|
+
r.written[index] = 1;
|
|
38
|
+
r.count++;
|
|
39
|
+
}
|
|
40
|
+
r.photoMean[index] = photoMean;
|
|
41
|
+
r.darkMean[index] = darkMean;
|
|
42
|
+
r.photo[index] = photo;
|
|
43
|
+
r.dark[index] = dark;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Renders fractions of one exposure as one accumulating process (#534), the way a camera's live readout of a long exposure
|
|
47
|
+
* would show the light building up. Each fraction is read out and developed as its own photo.
|
|
48
|
+
*
|
|
49
|
+
* The model: photon and dark-charge arrivals at a site are Poisson processes (photon shot noise: EMVA 1288 Release 4.0,
|
|
50
|
+
* section 2, free), with any rate over time. Given the count n over [0, t] of a Poisson process with mean Λ(t), its arrival
|
|
51
|
+
* times are n independent times with distribution Λ(s)/Λ(t) on [0, t], so its count over [0, s] is Binomial(n, Λ(s)/Λ(t))
|
|
52
|
+
* (R. G. Gallager, Discrete Stochastic Processes, chapter 2, sections 2.4 and 2.5, MIT OpenCourseWare 6.262, free).
|
|
53
|
+
*
|
|
54
|
+
* The method: the whole exposure is `simulateCapture(options)` itself, with its ordinary draws and seeds. Each earlier fraction
|
|
55
|
+
* fⱼ is a capture of the same request in manual mode at the whole exposure's resolved f-number and ISO and the shutter fⱼ·t,
|
|
56
|
+
* so its expected signal at every site is integrated from the spectrum over the window [0, fⱼ·t] by the capture itself (the
|
|
57
|
+
* camera rotation, `motion.subject` and mixed lighting included, and each row's own window with a rolling shutter). Its
|
|
58
|
+
* counts are not drawn anew: going down the fractions, each site's photo and dark counts are N(fⱼ) ~ Binomial(N(fⱼ₊₁), λ(fⱼ) /
|
|
59
|
+
* λ(fⱼ₊₁)), with λ the site's expected mean in each render (after PRNU and DSNU). So every fraction's counts are Poisson with
|
|
60
|
+
* that fraction's own mean (the mean and variance of `simulateCapture` at fⱼ·t), they never decrease from one fraction to the
|
|
61
|
+
* next, and two fractions' counts covary by the earlier one's mean. Fixed-pattern noise is the sensor's own and the same in
|
|
62
|
+
* every fraction. Each fraction's charge is clipped at the full well, then read once: its own read noise (dual gain as the ISO
|
|
63
|
+
* selects), pre-ADC and ADC saturation and quantization at the ADC bit depth.
|
|
64
|
+
*
|
|
65
|
+
* The windows are nested, so the true means never decrease; the capture's temporal midpoint quadrature can still put an
|
|
66
|
+
* earlier fraction's estimate above a later one's at a site (motion blur). There the split takes probability 1 (the count is
|
|
67
|
+
* kept), and the `exposure.buildUp` assumption counts those sites (`nonMonotoneSites`): an approximation of the quadrature,
|
|
68
|
+
* not of the binomial law. Raise `sensor.temporalSampleCount` to remove them.
|
|
69
|
+
*
|
|
70
|
+
* Cost: one capture per fraction, plus about 64 bytes per native site for the chain. Exact or fast: the request's own `fast`
|
|
71
|
+
* (and the format default) applies to every fraction; the build-up adds no fast method, so with `fast: false` (the calculator's
|
|
72
|
+
* setting) every fraction is an exact capture. On screen only: formats "srgb-8" and "srgb-16" (a fraction's JPEG, PNG or DNG
|
|
73
|
+
* is refused). A fraction's realization depends on the whole `fractions` list (each step of the chain has its own streams);
|
|
74
|
+
* the same request and list always give the same frames.
|
|
75
|
+
* @returns One frame per fraction, in order.
|
|
76
|
+
*/
|
|
77
|
+
export async function simulateExposureBuildUp(options, buildUp) {
|
|
78
|
+
if (typeof buildUp !== "object" || buildUp === null || !Array.isArray(buildUp.fractions))
|
|
79
|
+
fail("simulateExposureBuildUp needs { fractions: number[] }.");
|
|
80
|
+
for (const key of Object.keys(buildUp))
|
|
81
|
+
if (key !== "fractions")
|
|
82
|
+
fail("Unknown simulateExposureBuildUp option: " + key + ".");
|
|
83
|
+
const fractions = buildUp.fractions;
|
|
84
|
+
if (fractions.length < 1 || fractions.length > EXPOSURE_BUILD_UP_MAXIMUM_FRACTIONS)
|
|
85
|
+
fail("fractions takes 1 to " + EXPOSURE_BUILD_UP_MAXIMUM_FRACTIONS + " values.");
|
|
86
|
+
fractions.forEach((f, j) => {
|
|
87
|
+
if (typeof f !== "number" || !(f > 0 && f <= 1))
|
|
88
|
+
fail("Each fraction must be above 0 and at most 1.");
|
|
89
|
+
if (j > 0 && !(f > fractions[j - 1]))
|
|
90
|
+
fail("fractions must increase strictly.");
|
|
91
|
+
});
|
|
92
|
+
if (typeof options !== "object" || options === null)
|
|
93
|
+
fail("simulateExposureBuildUp needs the capture options.");
|
|
94
|
+
const format = options.output?.format ?? "srgb-8";
|
|
95
|
+
if (format !== "srgb-8" && format !== "srgb-16")
|
|
96
|
+
fail("simulateExposureBuildUp renders on screen: output.format \"srgb-8\" or \"srgb-16\" (a fraction's JPEG, PNG or DNG would carry the whole exposure's metadata).");
|
|
97
|
+
const seed = options.sensor?.noiseSeed ?? 1;
|
|
98
|
+
if (typeof seed !== "number" || !Number.isInteger(seed) || seed < 0 || seed > 0xffffffff)
|
|
99
|
+
fail("sensor.noiseSeed must be an integer 0-4294967295.");
|
|
100
|
+
// The whole exposure, recorded: its own draws pass through unchanged, so it is simulateCapture(options) byte for byte.
|
|
101
|
+
let above = siteRecord();
|
|
102
|
+
const attach = (stage) => (raw) => { EXPOSURE_BUILD_UP_STAGES.set(raw, stage); };
|
|
103
|
+
const recorder = { photo: 0, dark: 0, read: NATIVE_SITE_READ_NOISE_STREAM_ID,
|
|
104
|
+
split(index, photoMean, darkMean, photo, dark) { recorder.photo = photo; recorder.dark = dark; record(above, index, photoMean, darkMean, photo, dark); } };
|
|
105
|
+
const whole = await runCapture(options, "capture", attach(recorder));
|
|
106
|
+
const sites = whole.raw.codes.length;
|
|
107
|
+
if (above.count !== sites)
|
|
108
|
+
fail("simulateExposureBuildUp: the capture's sensor stage did not report every site (an unsupported render path).");
|
|
109
|
+
const { fNumber, shutterSeconds, iso } = whole.exposure.settings;
|
|
110
|
+
const results = new Map([[1, whole]]);
|
|
111
|
+
// Down the fractions: each render's own means, its counts split from the next fraction's.
|
|
112
|
+
const stream = createResettableUniformStream(), below = [...fractions].filter((f) => f < 1).reverse();
|
|
113
|
+
for (const fraction of below) {
|
|
114
|
+
const j = fractions.indexOf(fraction), current = siteRecord(), from = above;
|
|
115
|
+
let nonMonotone = 0, kept = false;
|
|
116
|
+
const split = (index, mean, upperMean, upper, which) => {
|
|
117
|
+
if (upper === 0 || mean === 0)
|
|
118
|
+
return 0;
|
|
119
|
+
if (!(mean <= upperMean)) {
|
|
120
|
+
kept = true;
|
|
121
|
+
return upper;
|
|
122
|
+
}
|
|
123
|
+
stream.reset(deriveNativeSiteStreamSeedUint32(seed, index, EXPOSURE_BUILD_UP_STREAM_BASE + 3 * j + which));
|
|
124
|
+
return sampleBinomial(upper, mean / upperMean, stream);
|
|
125
|
+
};
|
|
126
|
+
const stage = { photo: 0, dark: 0, read: EXPOSURE_BUILD_UP_STREAM_BASE + 3 * j + 2,
|
|
127
|
+
split(index, photoMean, darkMean) {
|
|
128
|
+
if (!from.written[index])
|
|
129
|
+
fail("simulateExposureBuildUp: a fraction rendered a site the whole exposure did not.");
|
|
130
|
+
kept = false;
|
|
131
|
+
stage.photo = split(index, photoMean, from.photoMean[index], from.photo[index], 0);
|
|
132
|
+
stage.dark = split(index, darkMean, from.darkMean[index], from.dark[index], 1);
|
|
133
|
+
if (kept && !current.written[index])
|
|
134
|
+
nonMonotone++;
|
|
135
|
+
record(current, index, photoMean, darkMean, stage.photo, stage.dark);
|
|
136
|
+
} };
|
|
137
|
+
const lens = (options.lens ?? {}), exposure = (options.exposure ?? {});
|
|
138
|
+
const fractionOptions = { ...options, lens: { ...lens, fNumber },
|
|
139
|
+
exposure: { mode: "manual", shutterSeconds: fraction * shutterSeconds, iso, ...(exposure.metering === undefined ? {} : { metering: exposure.metering }) } };
|
|
140
|
+
// A site computed twice in one render (a verification site, or the second pass of auto white balance) is split again with the
|
|
141
|
+
// same streams: the counts are the same.
|
|
142
|
+
let result;
|
|
143
|
+
try {
|
|
144
|
+
result = await runCapture(fractionOptions, "capture", attach(stage));
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
if (error instanceof Error && !(options.signal?.aborted))
|
|
148
|
+
fail("Fraction " + fraction + " (manual, " + fraction * shutterSeconds + " s): " + error.message);
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
if (current.count !== sites)
|
|
152
|
+
fail("simulateExposureBuildUp: the fraction's sensor stage did not report every site (an unsupported render path).");
|
|
153
|
+
results.set(fraction, { ...result, exposure: whole.exposure, sensor: whole.sensor, assumptions: Object.freeze([...result.assumptions, Object.freeze({
|
|
154
|
+
id: "exposure.buildUp", kind: "model", value: { fraction, fractions: [...fractions], elapsedSeconds: fraction * shutterSeconds, shutterSeconds, nonMonotoneSites: nonMonotone },
|
|
155
|
+
explanation: "Exposure build-up (#534): this fraction's expected signal is a capture at the elapsed time (manual, the whole exposure's f-number and ISO); its photo and dark counts are " +
|
|
156
|
+
"split from the next fraction's by binomial draws with p = λ(this) / λ(next) per site (the conditional law of a Poisson process), then clipped at the full well and read out " +
|
|
157
|
+
"once with this fraction's own read noise. exposure and sensor describe the whole exposure. nonMonotoneSites counts sites where the quadrature put this fraction's mean " +
|
|
158
|
+
"above the next one's (kept with probability 1; an approximation of the temporal quadrature)."
|
|
159
|
+
})]) });
|
|
160
|
+
above = current;
|
|
161
|
+
}
|
|
162
|
+
return { shutterSeconds, frames: Object.freeze(fractions.map((fraction) => ({ fraction, elapsedSeconds: fraction * shutterSeconds, result: results.get(fraction) }))) };
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=exposure-build-up.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exposure-build-up.js","sourceRoot":"","sources":["../../src/facade/exposure-build-up.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Exposure build-up (#534): fractions of one exposure, read out as it accumulates.\n * @see docs/QUICK_START.md, \"Exposure build-up\".\n */\n\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { EXPOSURE_BUILD_UP_STAGES, type ExposureBuildUpStage } from \"../capture/exposure-build-up-stage.js\";\nimport { sampleBinomial } from \"../sensor/binomial-sample.js\";\nimport { createResettableUniformStream, deriveNativeSiteStreamSeedUint32, NATIVE_SITE_READ_NOISE_STREAM_ID } from \"../sensor/stochastic-seed.js\";\nimport { runCapture, type SimulateCaptureOptions, type SimulateCaptureResult } from \"./simulate-capture.js\";\n\n/** The most fractions one build-up takes. */\nexport const EXPOSURE_BUILD_UP_MAXIMUM_FRACTIONS = 64;\n/**\n * The first stream ID of the build-up's per-site random streams (`deriveNativeSiteStreamSeedUint32`): fraction j's photo split,\n * dark split and readout use streams base + 3j, + 3j + 1 and + 3j + 2 (j = 0 … 63). The whole exposure keeps the ordinary\n * streams 0 (charge) and 1 (read noise).\n */\nexport const EXPOSURE_BUILD_UP_STREAM_BASE = 0x42550000;\n\n/** The build-up to render with {@link simulateExposureBuildUp}. */\nexport interface SimulateExposureBuildUpOptions {\n /**\n * Fractions of `exposure.shutterSeconds` to read out, strictly increasing, each above 0 and at most 1 (1 to 64 of them), for\n * example `[0.2, 0.4, 0.6, 0.8, 1]`. A fraction of 1 is the whole exposure: `simulateCapture` of the request.\n */\n fractions: readonly number[];\n}\n\n/** One readout of a build-up. */\nexport interface SimulateExposureBuildUpFrame {\n /** The fraction of the exposure collected. */\n fraction: number;\n /** fraction × the request's shutter time, in s. */\n elapsedSeconds: number;\n /**\n * The fraction developed as its own photo. At fraction 1 it is `simulateCapture(options)` itself, byte for byte. Below 1 it is\n * the result of the fraction's capture (manual, the whole exposure's f-number and ISO, shutter fraction·t: its `image`, `raw`,\n * `plan` and `request`), with the build-up's counts, the `exposure.buildUp` assumption, and the whole exposure's `exposure` and\n * `sensor` reports (the camera's settings and noise figure, not the elapsed part's).\n */\n result: SimulateCaptureResult;\n}\n\n/** The readouts of {@link simulateExposureBuildUp}, in the order of `fractions`. */\nexport interface SimulateExposureBuildUpResult {\n /** The whole exposure's shutter time, in s. */\n shutterSeconds: number;\n frames: readonly SimulateExposureBuildUpFrame[];\n}\n\nfunction fail(message: string): never { throw new InvalidConfigurationError(message); }\n\n/** One render's per-site record: its expected photo and dark means and the counts its readout used. */\ninterface SiteRecord { photoMean: Float64Array; darkMean: Float64Array; photo: Float64Array; dark: Float64Array; written: Uint8Array; count: number }\nfunction siteRecord(): SiteRecord {\n return { photoMean: new Float64Array(0), darkMean: new Float64Array(0), photo: new Float64Array(0), dark: new Float64Array(0), written: new Uint8Array(0), count: 0 };\n}\n/** Records site `index` (growing the arrays as needed; a site computed twice writes the same values again). */\nfunction record(r: SiteRecord, index: number, photoMean: number, darkMean: number, photo: number, dark: number): void {\n if (index >= r.written.length) {\n const size = Math.max(1024, 2 * r.written.length, index + 1);\n const grow = (a: Float64Array): Float64Array => { const b = new Float64Array(size); b.set(a); return b; };\n r.photoMean = grow(r.photoMean); r.darkMean = grow(r.darkMean); r.photo = grow(r.photo); r.dark = grow(r.dark);\n const w = new Uint8Array(size); w.set(r.written); r.written = w;\n }\n if (!r.written[index]) { r.written[index] = 1; r.count++; }\n r.photoMean[index] = photoMean; r.darkMean[index] = darkMean; r.photo[index] = photo; r.dark[index] = dark;\n}\n\n/**\n * Renders fractions of one exposure as one accumulating process (#534), the way a camera's live readout of a long exposure\n * would show the light building up. Each fraction is read out and developed as its own photo.\n *\n * The model: photon and dark-charge arrivals at a site are Poisson processes (photon shot noise: EMVA 1288 Release 4.0,\n * section 2, free), with any rate over time. Given the count n over [0, t] of a Poisson process with mean Λ(t), its arrival\n * times are n independent times with distribution Λ(s)/Λ(t) on [0, t], so its count over [0, s] is Binomial(n, Λ(s)/Λ(t))\n * (R. G. Gallager, Discrete Stochastic Processes, chapter 2, sections 2.4 and 2.5, MIT OpenCourseWare 6.262, free).\n *\n * The method: the whole exposure is `simulateCapture(options)` itself, with its ordinary draws and seeds. Each earlier fraction\n * fⱼ is a capture of the same request in manual mode at the whole exposure's resolved f-number and ISO and the shutter fⱼ·t,\n * so its expected signal at every site is integrated from the spectrum over the window [0, fⱼ·t] by the capture itself (the\n * camera rotation, `motion.subject` and mixed lighting included, and each row's own window with a rolling shutter). Its\n * counts are not drawn anew: going down the fractions, each site's photo and dark counts are N(fⱼ) ~ Binomial(N(fⱼ₊₁), λ(fⱼ) /\n * λ(fⱼ₊₁)), with λ the site's expected mean in each render (after PRNU and DSNU). So every fraction's counts are Poisson with\n * that fraction's own mean (the mean and variance of `simulateCapture` at fⱼ·t), they never decrease from one fraction to the\n * next, and two fractions' counts covary by the earlier one's mean. Fixed-pattern noise is the sensor's own and the same in\n * every fraction. Each fraction's charge is clipped at the full well, then read once: its own read noise (dual gain as the ISO\n * selects), pre-ADC and ADC saturation and quantization at the ADC bit depth.\n *\n * The windows are nested, so the true means never decrease; the capture's temporal midpoint quadrature can still put an\n * earlier fraction's estimate above a later one's at a site (motion blur). There the split takes probability 1 (the count is\n * kept), and the `exposure.buildUp` assumption counts those sites (`nonMonotoneSites`): an approximation of the quadrature,\n * not of the binomial law. Raise `sensor.temporalSampleCount` to remove them.\n *\n * Cost: one capture per fraction, plus about 64 bytes per native site for the chain. Exact or fast: the request's own `fast`\n * (and the format default) applies to every fraction; the build-up adds no fast method, so with `fast: false` (the calculator's\n * setting) every fraction is an exact capture. On screen only: formats \"srgb-8\" and \"srgb-16\" (a fraction's JPEG, PNG or DNG\n * is refused). A fraction's realization depends on the whole `fractions` list (each step of the chain has its own streams);\n * the same request and list always give the same frames.\n * @returns One frame per fraction, in order.\n */\nexport async function simulateExposureBuildUp(options: SimulateCaptureOptions, buildUp: SimulateExposureBuildUpOptions): Promise<SimulateExposureBuildUpResult> {\n if (typeof buildUp !== \"object\" || buildUp === null || !Array.isArray(buildUp.fractions)) fail(\"simulateExposureBuildUp needs { fractions: number[] }.\");\n for (const key of Object.keys(buildUp)) if (key !== \"fractions\") fail(\"Unknown simulateExposureBuildUp option: \" + key + \".\");\n const fractions = buildUp.fractions;\n if (fractions.length < 1 || fractions.length > EXPOSURE_BUILD_UP_MAXIMUM_FRACTIONS) fail(\"fractions takes 1 to \" + EXPOSURE_BUILD_UP_MAXIMUM_FRACTIONS + \" values.\");\n fractions.forEach((f, j) => {\n if (typeof f !== \"number\" || !(f > 0 && f <= 1)) fail(\"Each fraction must be above 0 and at most 1.\");\n if (j > 0 && !(f > fractions[j - 1]!)) fail(\"fractions must increase strictly.\");\n });\n if (typeof options !== \"object\" || options === null) fail(\"simulateExposureBuildUp needs the capture options.\");\n const format = (options.output as { format?: unknown } | undefined)?.format ?? \"srgb-8\";\n if (format !== \"srgb-8\" && format !== \"srgb-16\") fail(\"simulateExposureBuildUp renders on screen: output.format \\\"srgb-8\\\" or \\\"srgb-16\\\" (a fraction's JPEG, PNG or DNG would carry the whole exposure's metadata).\");\n const seed = (options.sensor as { noiseSeed?: unknown } | undefined)?.noiseSeed ?? 1;\n if (typeof seed !== \"number\" || !Number.isInteger(seed) || seed < 0 || seed > 0xffffffff) fail(\"sensor.noiseSeed must be an integer 0-4294967295.\");\n\n // The whole exposure, recorded: its own draws pass through unchanged, so it is simulateCapture(options) byte for byte.\n let above = siteRecord();\n const attach = (stage: ExposureBuildUpStage) => (raw: object): void => { EXPOSURE_BUILD_UP_STAGES.set(raw, stage); };\n const recorder: ExposureBuildUpStage = { photo: 0, dark: 0, read: NATIVE_SITE_READ_NOISE_STREAM_ID,\n split(index, photoMean, darkMean, photo, dark) { recorder.photo = photo; recorder.dark = dark; record(above, index, photoMean, darkMean, photo, dark); } };\n const whole = await runCapture(options, \"capture\", attach(recorder)) as SimulateCaptureResult;\n const sites = whole.raw.codes.length;\n if (above.count !== sites) fail(\"simulateExposureBuildUp: the capture's sensor stage did not report every site (an unsupported render path).\");\n const { fNumber, shutterSeconds, iso } = whole.exposure.settings;\n const results = new Map<number, SimulateCaptureResult>([[1, whole]]);\n\n // Down the fractions: each render's own means, its counts split from the next fraction's.\n const stream = createResettableUniformStream(), below = [...fractions].filter((f) => f < 1).reverse();\n for (const fraction of below) {\n const j = fractions.indexOf(fraction), current = siteRecord(), from = above;\n let nonMonotone = 0, kept = false;\n const split = (index: number, mean: number, upperMean: number, upper: number, which: 0 | 1): number => {\n if (upper === 0 || mean === 0) return 0;\n if (!(mean <= upperMean)) { kept = true; return upper; }\n stream.reset(deriveNativeSiteStreamSeedUint32(seed, index, EXPOSURE_BUILD_UP_STREAM_BASE + 3 * j + which));\n return sampleBinomial(upper, mean / upperMean, stream);\n };\n const stage: ExposureBuildUpStage = { photo: 0, dark: 0, read: EXPOSURE_BUILD_UP_STREAM_BASE + 3 * j + 2,\n split(index, photoMean, darkMean) {\n if (!from.written[index]) fail(\"simulateExposureBuildUp: a fraction rendered a site the whole exposure did not.\");\n kept = false;\n stage.photo = split(index, photoMean, from.photoMean[index]!, from.photo[index]!, 0);\n stage.dark = split(index, darkMean, from.darkMean[index]!, from.dark[index]!, 1);\n if (kept && !current.written[index]) nonMonotone++;\n record(current, index, photoMean, darkMean, stage.photo, stage.dark);\n } };\n const lens = (options.lens ?? {}) as Record<string, unknown>, exposure = (options.exposure ?? {}) as Record<string, unknown>;\n const fractionOptions: SimulateCaptureOptions = { ...options, lens: { ...lens, fNumber } as NonNullable<SimulateCaptureOptions[\"lens\"]>,\n exposure: { mode: \"manual\", shutterSeconds: fraction * shutterSeconds, iso, ...(exposure.metering === undefined ? {} : { metering: exposure.metering as never }) } };\n // A site computed twice in one render (a verification site, or the second pass of auto white balance) is split again with the\n // same streams: the counts are the same.\n let result: SimulateCaptureResult;\n try {\n result = await runCapture(fractionOptions, \"capture\", attach(stage)) as SimulateCaptureResult;\n } catch (error) {\n if (error instanceof Error && !(options.signal?.aborted)) fail(\"Fraction \" + fraction + \" (manual, \" + fraction * shutterSeconds + \" s): \" + error.message);\n throw error;\n }\n if (current.count !== sites) fail(\"simulateExposureBuildUp: the fraction's sensor stage did not report every site (an unsupported render path).\");\n results.set(fraction, { ...result, exposure: whole.exposure, sensor: whole.sensor, assumptions: Object.freeze([...result.assumptions, Object.freeze({\n id: \"exposure.buildUp\", kind: \"model\" as const, value: { fraction, fractions: [...fractions], elapsedSeconds: fraction * shutterSeconds, shutterSeconds, nonMonotoneSites: nonMonotone },\n explanation: \"Exposure build-up (#534): this fraction's expected signal is a capture at the elapsed time (manual, the whole exposure's f-number and ISO); its photo and dark counts are \" +\n \"split from the next fraction's by binomial draws with p = λ(this) / λ(next) per site (the conditional law of a Poisson process), then clipped at the full well and read out \" +\n \"once with this fraction's own read noise. exposure and sensor describe the whole exposure. nonMonotoneSites counts sites where the quadrature put this fraction's mean \" +\n \"above the next one's (kept with probability 1; an approximation of the temporal quadrature).\" })]) });\n above = current;\n }\n return { shutterSeconds, frames: Object.freeze(fractions.map((fraction) => ({ fraction, elapsedSeconds: fraction * shutterSeconds, result: results.get(fraction)! }))) };\n}\n"]}
|
|
@@ -15,9 +15,13 @@ export const SIMULATE_CAPTURE_FAST_METHODS = /* @__PURE__ */ Object.freeze([
|
|
|
15
15
|
exact: "one zone per site: the PSF at each site centre", followsFormatDefault: true,
|
|
16
16
|
resolver: { file: CAPTURE, call: "resolveFast(catalogueFast, fastTop)" }, report: { applied: "lens.catalogue", assumption: "view.lensPsf" } },
|
|
17
17
|
{ id: "lens.diffraction/rolling-shutter-taps", override: "lens.diffraction", methods: "fast-and-exact", runs: ["simulateCapture"],
|
|
18
|
-
fast: "#565: under rolling-shutter rotation, each PSF tap reads the scene at its own source point",
|
|
18
|
+
fast: "#565: under rolling-shutter rotation (#551: or subject motion), each PSF tap reads the scene at its own source point",
|
|
19
19
|
exact: "each tap reads the scene at its site-lattice point (ties on chart boundaries resolve as on the lattice)", followsFormatDefault: true,
|
|
20
20
|
resolver: { file: CAPTURE, call: "resolveFast(diffractionFast, fastTop)" }, report: { applied: "lens.diffraction", assumption: "fast.lens.diffraction" } },
|
|
21
|
+
{ id: "lens.catalogue/rolling-shutter-taps", override: "lens.catalogue", methods: "fast-and-exact", runs: ["simulateCapture"],
|
|
22
|
+
fast: "#588: under rolling-shutter rotation, each catalogue PSF tap reads the scene at its own source point",
|
|
23
|
+
exact: "each tap reads the scene at its site-lattice point (ties on chart boundaries resolve as on the lattice)", followsFormatDefault: true,
|
|
24
|
+
resolver: { file: CAPTURE, call: "resolveFast(catalogueFast, fastTop)" }, report: { applied: "lens.catalogue", assumption: "fast.lens.catalogue" } },
|
|
21
25
|
{ id: "output.demosaic.ahd/view-low-signal-correction", override: "output.demosaic", methods: "fast-and-exact", runs: ["simulateDisplayView", "prepareDisplayView"],
|
|
22
26
|
fast: "(H3) 2048 draws per correction state, applied where a pixel's linear noise exceeds 0.01",
|
|
23
27
|
exact: "8192 draws per state, at the same 0.01 threshold", followsFormatDefault: true,
|
|
@@ -34,6 +38,10 @@ export const SIMULATE_CAPTURE_FAST_METHODS = /* @__PURE__ */ Object.freeze([
|
|
|
34
38
|
{ id: "sensor.midGrey", override: "fast", methods: "fast-and-exact", runs: ["simulateCapture", "simulateDisplayView", "prepareDisplayView"],
|
|
35
39
|
fast: "#535: the mid-gray noise figure is not computed (about 0.3 ms)", exact: "result.sensor.midGrey is computed", followsFormatDefault: true,
|
|
36
40
|
resolver: { file: CAPTURE, call: "fastTop ? undefined : 0" }, report: { field: "sensor.midGrey" } },
|
|
41
|
+
{ id: "motion.subject/temporal-midpoints", override: "motion.subject", methods: "fast-and-exact", runs: ["simulateCapture", "simulateDisplayView", "prepareDisplayView"],
|
|
42
|
+
fast: "#551: with the default count and a still camera, one temporal midpoint per site of the subject's streak plus one, when that is fewer than 8",
|
|
43
|
+
exact: "the default 8 temporal midpoints (an explicit sensor.temporalSampleCount always wins)", followsFormatDefault: true,
|
|
44
|
+
resolver: { file: CAPTURE, call: "resolveFast(subjectFast, fastTop)" }, report: { applied: "motion.subject", assumption: "fast.motion.subject" } },
|
|
37
45
|
{ id: "lens.diffraction", override: "lens.diffraction", methods: "exact-only", runs: ["simulateCapture", "simulateDisplayView", "prepareDisplayView"],
|
|
38
46
|
fast: "", exact: "the diffraction kernels (a fast method only under rolling-shutter rotation, above)", followsFormatDefault: true,
|
|
39
47
|
resolver: { file: CAPTURE, call: "resolveFast(diffractionFast, fastTop)" }, report: { applied: "lens.diffraction" } },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fast-methods.js","sourceRoot":"","sources":["../../src/facade/fast-methods.ts"],"names":[],"mappings":"AAAA,sCAAsC;AA6CtC,MAAM,OAAO,GAAG,gCAAgC,EAAE,IAAI,GAAG,qCAAqC,CAAC;AAE/F,sHAAsH;AACtH,MAAM,CAAC,MAAM,6BAA6B,GAAyC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC;IAC/G,EAAE,EAAE,EAAE,2BAA2B,EAAE,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,iBAAiB,CAAC;QACjH,IAAI,EAAE,0HAA0H;QAChI,KAAK,EAAE,0EAA0E,EAAE,oBAAoB,EAAE,IAAI;QAC7G,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,qCAAqC,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,qBAAqB,EAAE,EAAE;IACtJ,EAAE,EAAE,EAAE,yBAAyB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,oBAAoB,CAAC;QAC5J,IAAI,EAAE,8FAA8F;QACpG,KAAK,EAAE,mEAAmE,EAAE,oBAAoB,EAAE,IAAI;QACtG,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,qCAAqC,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,6BAA6B,EAAE,EAAE;IAC9J,EAAE,EAAE,EAAE,+BAA+B,EAAE,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,qBAAqB,EAAE,oBAAoB,CAAC;QAC/I,IAAI,EAAE,kFAAkF;QACxF,KAAK,EAAE,gDAAgD,EAAE,oBAAoB,EAAE,IAAI;QACnF,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,qCAAqC,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,cAAc,EAAE,EAAE;IAC/I,EAAE,EAAE,EAAE,uCAAuC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,iBAAiB,CAAC;QAC/H,IAAI,EAAE,4FAA4F;QAClG,KAAK,EAAE,yGAAyG,EAAE,oBAAoB,EAAE,IAAI;QAC5I,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,uCAAuC,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,uBAAuB,EAAE,EAAE;IAC5J,EAAE,EAAE,EAAE,gDAAgD,EAAE,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,qBAAqB,EAAE,oBAAoB,CAAC;QACjK,IAAI,EAAE,yFAAyF;QAC/F,KAAK,EAAE,kDAAkD,EAAE,oBAAoB,EAAE,IAAI;QACrF,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,oCAAoC,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,eAAe,EAAE,EAAE;IACpJ,EAAE,EAAE,EAAE,6BAA6B,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,qBAAqB,EAAE,oBAAoB,CAAC;QACnI,IAAI,EAAE,sFAAsF;QAC5F,KAAK,EAAE,kDAAkD,EAAE,oBAAoB,EAAE,IAAI;QACrF,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,0BAA0B,EAAE,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,iBAAiB,EAAE,EAAE;IAC5G,EAAE,EAAE,EAAE,wBAAwB,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,oBAAoB,CAAC;QACvG,IAAI,EAAE,+HAA+H;QACrI,KAAK,EAAE,sDAAsD,EAAE,oBAAoB,EAAE,IAAI;QACzF,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,oHAAoH,EAAE;QACpJ,MAAM,EAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,EAAE;IACnD,EAAE,EAAE,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,oBAAoB,CAAC;QACzI,IAAI,EAAE,gEAAgE,EAAE,KAAK,EAAE,mCAAmC,EAAE,oBAAoB,EAAE,IAAI;QAC9I,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,yBAAyB,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE;IACrG,EAAE,EAAE,EAAE,kBAAkB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,oBAAoB,CAAC;QACnJ,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,oFAAoF,EAAE,oBAAoB,EAAE,IAAI;QACjI,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,uCAAuC,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE;IACvH,EAAE,EAAE,EAAE,qBAAqB,EAAE,QAAQ,EAAE,qBAAqB,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,oBAAoB,CAAC;QACzJ,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,IAAI;QACzE,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE;IAC9F,EAAE,EAAE,EAAE,0BAA0B,EAAE,QAAQ,EAAE,sBAAsB,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,oBAAoB,CAAC;QAC/J,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,IAAI;QACtE,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,0BAA0B,EAAE,EAAE;IACnG,EAAE,EAAE,EAAE,qBAAqB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,iBAAiB,CAAC;QACxG,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,8FAA8F,EAAE,oBAAoB,EAAE,IAAI;QAC3I,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,oCAAoC,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE;CAChE,CAAC,CAAC","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * The registry of every speed-versus-accuracy choice (#395, owner rule of 2.20.0): one entry per choice that has a fast and an\n * exact (full) method, and per option record that accepts `fast` without a fast method yet. Every entry resolves through\n * `resolveFast` and `fastFormatDefault` (fast-resolution.ts): an option record's `fast`, else the top-level `fast`, else the\n * format default (fast for \"srgb-8\", \"srgb-16\" and the display view; exact for \"dng\", \"jpeg\", \"png\" and `simulateIdealReference`).\n *\n * Data only (a root export, so developers can read which choices exist), read by `test/fast-methods-registry.test.ts`, which\n * fails when an option accepts `fast` without an entry here, an entry lacks its resolver or its report, or a format's default\n * leaves the rule. Captures and display views do not import this module (tree-shaking leaves it out of their bundles). A new\n * fast method adds its entry here and to docs/API_STYLE.md, \"Exact and fast modes\".\n * @see docs/API_STYLE.md, \"Exact and fast modes\".\n */\n\n/** One speed-versus-accuracy choice of {@link SIMULATE_CAPTURE_FAST_METHODS} (2.20.0). */\nexport interface SimulateCaptureFastMethod {\n /** A short id: the option path and, where one option has several fast methods, the method. */\n id: string;\n /**\n * The request path whose record takes the `fast` override (`allowKeys` path in simulate-capture.ts), or \"fast\" when only the\n * top-level flag sets it (a choice with no option record of its own).\n */\n override: string;\n /** \"fast-and-exact\": both methods exist; \"exact-only\": the record takes `fast`, but there is no fast method yet (reports false). */\n methods: \"fast-and-exact\" | \"exact-only\";\n /** Where it applies. */\n runs: readonly (\"simulateCapture\" | \"simulateDisplayView\" | \"prepareDisplayView\")[];\n /** The fast method and the exact one, in words (empty for exact-only). */\n fast: string;\n exact: string;\n /** Always true: no choice keeps its own default (the test checks it). */\n followsFormatDefault: true;\n /**\n * The resolver call in the source (`resolveFast(<record flag>, fastTop)`, or `fastTop` itself for a top-level choice), which the\n * test finds in the named file.\n */\n resolver: { file: string; call: string };\n /**\n * How the result reports it: the `diagnostics.fast.applied` key (true where the fast method ran), an assumption id the fast\n * method adds, or another result field. At least one; the test finds each assumption id in the source.\n */\n report: { applied?: string; assumption?: string; field?: string };\n}\n\nconst CAPTURE = \"src/facade/simulate-capture.ts\", VIEW = \"src/facade/simulate-display-view.ts\";\n\n/** 2.20.0: every speed-versus-accuracy choice of the capture facade and the display view (see the module comment). */\nexport const SIMULATE_CAPTURE_FAST_METHODS: readonly SimulateCaptureFastMethod[] = /* @__PURE__ */ Object.freeze([\n { id: \"lens.catalogue/field-grid\", override: \"lens.catalogue\", methods: \"fast-and-exact\", runs: [\"simulateCapture\"],\n fast: \"#568: the PSF blended over a field grid and tabulated expected electrons, verified per CFA phase against the exact chain\",\n exact: \"the environment PSF quadrature with the PSF resolved at each query point\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(catalogueFast, fastTop)\" }, report: { applied: \"lens.catalogue\", assumption: \"fast.lens.catalogue\" } },\n { id: \"lens.catalogue/cats-eye\", override: \"lens.catalogue\", methods: \"fast-and-exact\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#567: with lens.defocus, the lens's bokeh without its cat's eye (the axis kernel everywhere)\",\n exact: \"the cat's eye shaped at each field point (fast wides and normals)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(catalogueFast, fastTop)\" }, report: { applied: \"lens.catalogue\", assumption: \"fast.lens.catalogue.catsEye\" } },\n { id: \"lens.catalogue/view-psf-zones\", override: \"lens.catalogue\", methods: \"fast-and-exact\", runs: [\"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#569 (H1): 64 field zones along the longer side, each with the PSF at its centre\",\n exact: \"one zone per site: the PSF at each site centre\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(catalogueFast, fastTop)\" }, report: { applied: \"lens.catalogue\", assumption: \"view.lensPsf\" } },\n { id: \"lens.diffraction/rolling-shutter-taps\", override: \"lens.diffraction\", methods: \"fast-and-exact\", runs: [\"simulateCapture\"],\n fast: \"#565: under rolling-shutter rotation, each PSF tap reads the scene at its own source point\",\n exact: \"each tap reads the scene at its site-lattice point (ties on chart boundaries resolve as on the lattice)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(diffractionFast, fastTop)\" }, report: { applied: \"lens.diffraction\", assumption: \"fast.lens.diffraction\" } },\n { id: \"output.demosaic.ahd/view-low-signal-correction\", override: \"output.demosaic\", methods: \"fast-and-exact\", runs: [\"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"(H3) 2048 draws per correction state, applied where a pixel's linear noise exceeds 0.01\",\n exact: \"8192 draws per state, at the same 0.01 threshold\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(demosaicFast, fastTop)\" }, report: { applied: \"output.demosaic.ahd\", assumption: \"view.demosaic\" } },\n { id: \"view.uniform-pixel-sampling\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"(H2) a quarter of the samples per axis in display pixels whose pilot finds no detail\",\n exact: \"the full samples per axis in every display pixel\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"uniformSampling: fastTop\" }, report: { assumption: \"view.estimation\" } },\n { id: \"prepareDisplayView.gpu\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"prepareDisplayView\"],\n fast: \"gpu \\\"auto\\\": WebGPU float32 where a conforming device supports the request (a bounded approximation), else the CPU reference\",\n exact: \"gpu \\\"off\\\": the CPU reference; an explicit gpu wins\", followsFormatDefault: true,\n resolver: { file: VIEW, call: \"parsePrepareDisplayViewOptions(prepareOptions, (options as { fast?: unknown } | null | undefined)?.fast !== false)\" },\n report: { field: \"diagnostics.fast.execution\" } },\n { id: \"sensor.midGrey\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#535: the mid-gray noise figure is not computed (about 0.3 ms)\", exact: \"result.sensor.midGrey is computed\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"fastTop ? undefined : 0\" }, report: { field: \"sensor.midGrey\" } },\n { id: \"lens.diffraction\", override: \"lens.diffraction\", methods: \"exact-only\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"\", exact: \"the diffraction kernels (a fast method only under rolling-shutter rotation, above)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(diffractionFast, fastTop)\" }, report: { applied: \"lens.diffraction\" } },\n { id: \"sensor.antiAliasing\", override: \"sensor.antiAliasing\", methods: \"exact-only\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"\", exact: \"the point-splitting filter\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"fastInUse\" }, report: { applied: \"sensor.antiAliasing\" } },\n { id: \"sensor.pixelAperture.box\", override: \"sensor.pixelAperture\", methods: \"exact-only\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"\", exact: \"the N × N midpoint rule\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"fastInUse\" }, report: { applied: \"sensor.pixelAperture.box\" } },\n { id: \"output.demosaic.ahd\", override: \"output.demosaic\", methods: \"exact-only\", runs: [\"simulateCapture\"],\n fast: \"\", exact: \"the AHD demosaic of the capture (a fast method only in the display view's correction, above)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(demosaicFast, fastTop)\" }, report: { applied: \"output.demosaic.ahd\" } }\n] as const satisfies readonly SimulateCaptureFastMethod[]);\n"]}
|
|
1
|
+
{"version":3,"file":"fast-methods.js","sourceRoot":"","sources":["../../src/facade/fast-methods.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * The registry of every speed-versus-accuracy choice (#395, owner rule of 2.20.0): one entry per choice that has a fast and an\n * exact (full) method, and per option record that accepts `fast` without a fast method yet. Every entry resolves through\n * `resolveFast` and `fastFormatDefault` (fast-resolution.ts): an option record's `fast`, else the top-level `fast`, else the\n * format default (fast for \"srgb-8\", \"srgb-16\" and the display view; exact for \"dng\", \"jpeg\", \"png\" and `simulateIdealReference`).\n *\n * Data only (a root export, so developers can read which choices exist), read by `test/fast-methods-registry.test.ts`, which\n * fails when an option accepts `fast` without an entry here, an entry lacks its resolver or its report, or a format's default\n * leaves the rule. Captures and display views do not import this module (tree-shaking leaves it out of their bundles). A new\n * fast method adds its entry here and to docs/API_STYLE.md, \"Exact and fast modes\".\n * @see docs/API_STYLE.md, \"Exact and fast modes\".\n */\n\n/** One speed-versus-accuracy choice of {@link SIMULATE_CAPTURE_FAST_METHODS} (2.20.0). */\nexport interface SimulateCaptureFastMethod {\n /** A short id: the option path and, where one option has several fast methods, the method. */\n id: string;\n /**\n * The request path whose record takes the `fast` override (`allowKeys` path in simulate-capture.ts), or \"fast\" when only the\n * top-level flag sets it (a choice with no option record of its own).\n */\n override: string;\n /** \"fast-and-exact\": both methods exist; \"exact-only\": the record takes `fast`, but there is no fast method yet (reports false). */\n methods: \"fast-and-exact\" | \"exact-only\";\n /** Where it applies. */\n runs: readonly (\"simulateCapture\" | \"simulateDisplayView\" | \"prepareDisplayView\")[];\n /** The fast method and the exact one, in words (empty for exact-only). */\n fast: string;\n exact: string;\n /** Always true: no choice keeps its own default (the test checks it). */\n followsFormatDefault: true;\n /**\n * The resolver call in the source (`resolveFast(<record flag>, fastTop)`, or `fastTop` itself for a top-level choice), which the\n * test finds in the named file.\n */\n resolver: { file: string; call: string };\n /**\n * How the result reports it: the `diagnostics.fast.applied` key (true where the fast method ran), an assumption id the fast\n * method adds, or another result field. At least one; the test finds each assumption id in the source.\n */\n report: { applied?: string; assumption?: string; field?: string };\n}\n\nconst CAPTURE = \"src/facade/simulate-capture.ts\", VIEW = \"src/facade/simulate-display-view.ts\";\n\n/** 2.20.0: every speed-versus-accuracy choice of the capture facade and the display view (see the module comment). */\nexport const SIMULATE_CAPTURE_FAST_METHODS: readonly SimulateCaptureFastMethod[] = /* @__PURE__ */ Object.freeze([\n { id: \"lens.catalogue/field-grid\", override: \"lens.catalogue\", methods: \"fast-and-exact\", runs: [\"simulateCapture\"],\n fast: \"#568: the PSF blended over a field grid and tabulated expected electrons, verified per CFA phase against the exact chain\",\n exact: \"the environment PSF quadrature with the PSF resolved at each query point\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(catalogueFast, fastTop)\" }, report: { applied: \"lens.catalogue\", assumption: \"fast.lens.catalogue\" } },\n { id: \"lens.catalogue/cats-eye\", override: \"lens.catalogue\", methods: \"fast-and-exact\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#567: with lens.defocus, the lens's bokeh without its cat's eye (the axis kernel everywhere)\",\n exact: \"the cat's eye shaped at each field point (fast wides and normals)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(catalogueFast, fastTop)\" }, report: { applied: \"lens.catalogue\", assumption: \"fast.lens.catalogue.catsEye\" } },\n { id: \"lens.catalogue/view-psf-zones\", override: \"lens.catalogue\", methods: \"fast-and-exact\", runs: [\"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#569 (H1): 64 field zones along the longer side, each with the PSF at its centre\",\n exact: \"one zone per site: the PSF at each site centre\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(catalogueFast, fastTop)\" }, report: { applied: \"lens.catalogue\", assumption: \"view.lensPsf\" } },\n { id: \"lens.diffraction/rolling-shutter-taps\", override: \"lens.diffraction\", methods: \"fast-and-exact\", runs: [\"simulateCapture\"],\n fast: \"#565: under rolling-shutter rotation (#551: or subject motion), each PSF tap reads the scene at its own source point\",\n exact: \"each tap reads the scene at its site-lattice point (ties on chart boundaries resolve as on the lattice)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(diffractionFast, fastTop)\" }, report: { applied: \"lens.diffraction\", assumption: \"fast.lens.diffraction\" } },\n { id: \"lens.catalogue/rolling-shutter-taps\", override: \"lens.catalogue\", methods: \"fast-and-exact\", runs: [\"simulateCapture\"],\n fast: \"#588: under rolling-shutter rotation, each catalogue PSF tap reads the scene at its own source point\",\n exact: \"each tap reads the scene at its site-lattice point (ties on chart boundaries resolve as on the lattice)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(catalogueFast, fastTop)\" }, report: { applied: \"lens.catalogue\", assumption: \"fast.lens.catalogue\" } },\n { id: \"output.demosaic.ahd/view-low-signal-correction\", override: \"output.demosaic\", methods: \"fast-and-exact\", runs: [\"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"(H3) 2048 draws per correction state, applied where a pixel's linear noise exceeds 0.01\",\n exact: \"8192 draws per state, at the same 0.01 threshold\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(demosaicFast, fastTop)\" }, report: { applied: \"output.demosaic.ahd\", assumption: \"view.demosaic\" } },\n { id: \"view.uniform-pixel-sampling\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"(H2) a quarter of the samples per axis in display pixels whose pilot finds no detail\",\n exact: \"the full samples per axis in every display pixel\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"uniformSampling: fastTop\" }, report: { assumption: \"view.estimation\" } },\n { id: \"prepareDisplayView.gpu\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"prepareDisplayView\"],\n fast: \"gpu \\\"auto\\\": WebGPU float32 where a conforming device supports the request (a bounded approximation), else the CPU reference\",\n exact: \"gpu \\\"off\\\": the CPU reference; an explicit gpu wins\", followsFormatDefault: true,\n resolver: { file: VIEW, call: \"parsePrepareDisplayViewOptions(prepareOptions, (options as { fast?: unknown } | null | undefined)?.fast !== false)\" },\n report: { field: \"diagnostics.fast.execution\" } },\n { id: \"sensor.midGrey\", override: \"fast\", methods: \"fast-and-exact\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#535: the mid-gray noise figure is not computed (about 0.3 ms)\", exact: \"result.sensor.midGrey is computed\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"fastTop ? undefined : 0\" }, report: { field: \"sensor.midGrey\" } },\n { id: \"motion.subject/temporal-midpoints\", override: \"motion.subject\", methods: \"fast-and-exact\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"#551: with the default count and a still camera, one temporal midpoint per site of the subject's streak plus one, when that is fewer than 8\",\n exact: \"the default 8 temporal midpoints (an explicit sensor.temporalSampleCount always wins)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(subjectFast, fastTop)\" }, report: { applied: \"motion.subject\", assumption: \"fast.motion.subject\" } },\n { id: \"lens.diffraction\", override: \"lens.diffraction\", methods: \"exact-only\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"\", exact: \"the diffraction kernels (a fast method only under rolling-shutter rotation, above)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(diffractionFast, fastTop)\" }, report: { applied: \"lens.diffraction\" } },\n { id: \"sensor.antiAliasing\", override: \"sensor.antiAliasing\", methods: \"exact-only\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"\", exact: \"the point-splitting filter\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"fastInUse\" }, report: { applied: \"sensor.antiAliasing\" } },\n { id: \"sensor.pixelAperture.box\", override: \"sensor.pixelAperture\", methods: \"exact-only\", runs: [\"simulateCapture\", \"simulateDisplayView\", \"prepareDisplayView\"],\n fast: \"\", exact: \"the N × N midpoint rule\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"fastInUse\" }, report: { applied: \"sensor.pixelAperture.box\" } },\n { id: \"output.demosaic.ahd\", override: \"output.demosaic\", methods: \"exact-only\", runs: [\"simulateCapture\"],\n fast: \"\", exact: \"the AHD demosaic of the capture (a fast method only in the display view's correction, above)\", followsFormatDefault: true,\n resolver: { file: CAPTURE, call: \"resolveFast(demosaicFast, fastTop)\" }, report: { applied: \"output.demosaic.ahd\" } }\n] as const satisfies readonly SimulateCaptureFastMethod[]);\n"]}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* that never asks for one) does not load the catalogue's data or its PSF builder. It also holds the developed-image lens
|
|
4
4
|
* corrections (`output.lensCorrections`, #570) and their DNG opcodes (`output.dng.lensCorrectionOpcodes`, #587), which need a catalogue lens.
|
|
5
5
|
*/
|
|
6
|
-
export { GENERIC_LENS_EVIDENCE,
|
|
6
|
+
export { GENERIC_LENS_EVIDENCE, genericLensDistortionProfile, genericLensVignettingProfile, resolveGenericLens, simulateGenericLensFocusError } from "../equipment/generic-lens-catalogue.js";
|
|
7
7
|
export { createGenericLensPsfProfile, genericLensBokehKernel, genericLensPsfKernelRadius, GENERIC_LENS_PSF_MAXIMUM_COMBINED_RADIUS_SITES } from "../optics/generic-lens-psf.js";
|
|
8
8
|
export { CATALOGUE_FAST_VERIFICATION_TOLERANCE, catalogueFastAssumptions, createCatalogueLensSignal } from "./catalogue-lens-signal.js";
|
|
9
|
-
export { applyDevelopedLensCorrection, developedLensCorrectionSourceRect, prepareDevelopedLensCorrection } from "../output/developed-lens-corrections.js";
|
|
9
|
+
export { applyDevelopedLensCorrection, channelEffectiveDispersion, developedLensCorrectionSourceRect, prepareDevelopedLensCorrection } from "../output/developed-lens-corrections.js";
|
|
10
10
|
export { createDngLensCorrectionOpcodes } from "../capture/dng-lens-correction-opcodes.js";
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
* that never asks for one) does not load the catalogue's data or its PSF builder. It also holds the developed-image lens
|
|
5
5
|
* corrections (`output.lensCorrections`, #570) and their DNG opcodes (`output.dng.lensCorrectionOpcodes`, #587), which need a catalogue lens.
|
|
6
6
|
*/
|
|
7
|
-
export { GENERIC_LENS_EVIDENCE,
|
|
7
|
+
export { GENERIC_LENS_EVIDENCE, genericLensDistortionProfile, genericLensVignettingProfile, resolveGenericLens, simulateGenericLensFocusError } from "../equipment/generic-lens-catalogue.js";
|
|
8
8
|
export { createGenericLensPsfProfile, genericLensBokehKernel, genericLensPsfKernelRadius, GENERIC_LENS_PSF_MAXIMUM_COMBINED_RADIUS_SITES } from "../optics/generic-lens-psf.js";
|
|
9
9
|
export { CATALOGUE_FAST_VERIFICATION_TOLERANCE, catalogueFastAssumptions, createCatalogueLensSignal } from "./catalogue-lens-signal.js";
|
|
10
|
-
export { applyDevelopedLensCorrection, developedLensCorrectionSourceRect, prepareDevelopedLensCorrection } from "../output/developed-lens-corrections.js";
|
|
10
|
+
export { applyDevelopedLensCorrection, channelEffectiveDispersion, developedLensCorrectionSourceRect, prepareDevelopedLensCorrection } from "../output/developed-lens-corrections.js";
|
|
11
11
|
export { createDngLensCorrectionOpcodes } from "../capture/dng-lens-correction-opcodes.js";
|
|
12
12
|
//# sourceMappingURL=generic-lens-capture.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generic-lens-capture.js","sourceRoot":"","sources":["../../src/facade/generic-lens-capture.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;GAIG;AACH,OAAO,EAAE,qBAAqB,EAAE,
|
|
1
|
+
{"version":3,"file":"generic-lens-capture.js","sourceRoot":"","sources":["../../src/facade/generic-lens-capture.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;GAIG;AACH,OAAO,EAAE,qBAAqB,EAAE,4BAA4B,EAAE,4BAA4B,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAC;AAC9L,OAAO,EAAE,2BAA2B,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,8CAA8C,EAAE,MAAM,+BAA+B,CAAC;AAChL,OAAO,EAAE,qCAAqC,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACxI,OAAO,EAAE,4BAA4B,EAAE,0BAA0B,EAAE,iCAAiC,EAAE,8BAA8B,EAAE,MAAM,yCAAyC,CAAC;AACtL,OAAO,EAAE,8BAA8B,EAAE,MAAM,2CAA2C,CAAC","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * What `simulateCapture` needs for `lens.catalogue` (#549), loaded on demand: a capture without a catalogue lens (and a bundle\n * that never asks for one) does not load the catalogue's data or its PSF builder. It also holds the developed-image lens\n * corrections (`output.lensCorrections`, #570) and their DNG opcodes (`output.dng.lensCorrectionOpcodes`, #587), which need a catalogue lens.\n */\nexport { GENERIC_LENS_EVIDENCE, genericLensDistortionProfile, genericLensVignettingProfile, resolveGenericLens, simulateGenericLensFocusError } from \"../equipment/generic-lens-catalogue.js\";\nexport { createGenericLensPsfProfile, genericLensBokehKernel, genericLensPsfKernelRadius, GENERIC_LENS_PSF_MAXIMUM_COMBINED_RADIUS_SITES } from \"../optics/generic-lens-psf.js\";\nexport { CATALOGUE_FAST_VERIFICATION_TOLERANCE, catalogueFastAssumptions, createCatalogueLensSignal } from \"./catalogue-lens-signal.js\";\nexport { applyDevelopedLensCorrection, channelEffectiveDispersion, developedLensCorrectionSourceRect, prepareDevelopedLensCorrection } from \"../output/developed-lens-corrections.js\";\nexport { createDngLensCorrectionOpcodes } from \"../capture/dng-lens-correction-opcodes.js\";\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 2.21 (#581): enables `{ kind: "image-plane" }` scenes (a photo as a flat print, docs/IMAGE_PLANE.md) in this JavaScript realm by
|
|
3
|
+
* loading their module (a lazy chunk of about 14 KB gzip with its lattice data). Call it once, in the worker that captures, before
|
|
4
|
+
* the first request with such a scene; later calls resolve at once. A request with an image-plane scene before it fails with a
|
|
5
|
+
* message saying so.
|
|
6
|
+
*/
|
|
7
|
+
export declare function prepareImagePlaneScenes(): Promise<void>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* `prepareImagePlaneScenes()` (2.21, #581), in a module of its own: the dynamic import below is the only reference to the
|
|
4
|
+
* image-plane module, so a bundler includes that module (as a lazy chunk) only in bundles that import this function.
|
|
5
|
+
*/
|
|
6
|
+
import { imagePlaneSupport, setImagePlaneSupport } from "./image-plane-support.js";
|
|
7
|
+
/**
|
|
8
|
+
* 2.21 (#581): enables `{ kind: "image-plane" }` scenes (a photo as a flat print, docs/IMAGE_PLANE.md) in this JavaScript realm by
|
|
9
|
+
* loading their module (a lazy chunk of about 14 KB gzip with its lattice data). Call it once, in the worker that captures, before
|
|
10
|
+
* the first request with such a scene; later calls resolve at once. A request with an image-plane scene before it fails with a
|
|
11
|
+
* message saying so.
|
|
12
|
+
*/
|
|
13
|
+
export async function prepareImagePlaneScenes() {
|
|
14
|
+
if (!imagePlaneSupport())
|
|
15
|
+
setImagePlaneSupport(await import("./image-plane.js"));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=image-plane-enable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-plane-enable.js","sourceRoot":"","sources":["../../src/facade/image-plane-enable.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEnF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,IAAI,CAAC,iBAAiB,EAAE;QAAE,oBAAoB,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC;AACnF,CAAC","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * `prepareImagePlaneScenes()` (2.21, #581), in a module of its own: the dynamic import below is the only reference to the\n * image-plane module, so a bundler includes that module (as a lazy chunk) only in bundles that import this function.\n */\n\nimport { imagePlaneSupport, setImagePlaneSupport } from \"./image-plane-support.js\";\n\n/**\n * 2.21 (#581): enables `{ kind: \"image-plane\" }` scenes (a photo as a flat print, docs/IMAGE_PLANE.md) in this JavaScript realm by\n * loading their module (a lazy chunk of about 14 KB gzip with its lattice data). Call it once, in the worker that captures, before\n * the first request with such a scene; later calls resolve at once. A request with an image-plane scene before it fails with a\n * message saying so.\n */\nexport async function prepareImagePlaneScenes(): Promise<void> {\n if (!imagePlaneSupport()) setImagePlaneSupport(await import(\"./image-plane.js\"));\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The 120 stored nodes of the print reflectance lattice (r, g, b indices in order, the neutral axis skipped), each 41 16-bit
|
|
3
|
+
* reflectance codes at 380, 390, …, 780 nm (value / 65535), delta-coded along wavelength in base 36: nodes separated by ";",
|
|
4
|
+
* codes by ",".
|
|
5
|
+
*/
|
|
6
|
+
export declare const IMAGE_PLANE_LATTICE_CODES = "2lg,-2,1,4,j,1c,1u,-1,-71,-he,-m6,-ir,-cm,-7o,-4i,-2l,-1i,-y,-k,-d,-9,-5,-4,-1,-1,1,1,0,1,0,-1,1,-2,4,-3,3,-3,-3,8,-5,2;b3v,1,1,h,1j,3g,3o,-4n,-ts,-1vj,-2hl,-287,-1jh,-xl,-j6,-as,-65,-3o,-27,-1g,-x,-m,-e,-9,-4,-3,0,-2,1,1,-1,-2,2,1,-6,a,-5,-4,4,3,-7;stg,1,-6,-d,-1m,-66,-id,-17t,-2fp,-440,-5ei,-59d,-3wa,-2ex,-1d7,-r1,-f3,-8s,-5b,-3c,-26,-1f,-x,-l,-d,-7,-4,-2,-1,0,-3,2,1,0,-5,7,-2,-5,6,0,-4;1dky,2,1,-5,-l,-23,-5j,-db,-w1,-2dm,-6xk,-fbn,-dk0,-5mz,-21w,-u3,-dt,-6v,-3e,-1f,-8,l,11,15,12,u,l,e,5,5,1,3,0,0,4,-7,2,8,-c,5,1;4g,-2,-1,0,-1,-1,9,n,1a,2e,4b,7r,e3,o5,z1,wg,69,-m8,-ux,-oy,-gh,-a2,-63,-3n,-25,-18,-o,-d,-9,-2,-3,1,-2,2,-1,0,1,-5,4,3,-5;25w,-1,0,2,b,w,21,3t,5t,7m,8n,89,65,1w,-4c,-am,-em,-fi,-e0,-bf,-8r,-6d,-4i,-31,-1y,-18,-n,-f,-8,-1,-1,-6,2,2,-3,4,-3,-4,7,-5,4;bam,1,-4,-9,-10,-36,-7r,-er,-n9,-vl,-11e,-13h,-12h,-zo,-vn,-qs,-ln,-gx,-cy,-9q,-78,-57,-3r,-2j,-1o,-10,-n,-b,-6,-3,0,-4,2,-1,-3,4,0,-2,1,0,1;tak,-4,-9,-12,-40,-cy,-v5,-1mu,-2jw,-3ei,-3uk,-3qc,-36x,-2i1,-1u6,-1ar,-we,-mh,-fp,-b2,-7u,-5i,-3v,-2n,-1o,-11,-m,-c,-6,-2,-2,-4,3,-1,-2,4,-3,-2,6,-3,1;1d4e,0,-2,-8,-q,-2j,-6q,-fd,-xx,-260,-543,-abl,-cl6,-89y,-3xg,-1sg,-uz,-fi,-7g,-2o,f,2h,3m,3x,3i,2r,1w,17,n,d,8,2,0,2,-1,3,0,-4,4,-1,-1;gj,0,-1,2,4,h,19,2r,5e,a6,j5,zw,1te,30e,3vx,31r,j6,-1zy,-37a,-2xp,-22i,-1ah,-ry,-gj,-9n,-5j,-35,-1q,-y,-f,-a,-2,-2,-2,0,-1,1,0,0,1,-1;219,-1,1,6,l,1t,4k,96,gf,r8,166,1o9,24x,2ar,1sz,lu,-ts,-1v8,-27v,-1zl,-1ij,-11v,-p4,-g0,-9w,-5u,-3h,-1x,-z,-j,-9,-3,-4,0,-3,5,-4,-1,2,-1,3;96c,-2,3,c,17,3p,8k,fk,n9,tr,wl,ub,m9,7l,-dj,-10o,-1io,-1qd,-1o1,-1f4,-13y,-tb,-ko,-dy,-8y,-5i,-39,-1t,-z,-h,-9,-7,2,-3,-3,2,0,-2,4,-3,2;pzu,0,0,-6,-w,-2w,-74,-e3,-nf,-yh,-19l,-1jk,-1rr,-1yv,-24c,-25v,-222,-1tm,-1io,-17e,-x1,-ob,-he,-bx,-7t,-4u,-2v,-1m,-x,-e,-9,-5,1,-3,4,-8,3,5,-6,0,7;1cfq,-2,-1,-5,-r,-2m,-6o,-ea,-ry,-1h3,-2q8,-4pf,-6xs,-7yd,-6sm,-4mw,-2u9,-1ou,-zo,-kc,-as,-4r,-1d,f,12,12,u,k,9,7,5,1,2,-6,8,-5,2,0,-2,0,6;wv,2,2,3,a,16,34,6s,dr,rq,1ko,36m,5sn,81s,76v,3wj,kp,-2du,-53t,-6mf,-5y3,-427,-2f6,-1dg,-ro,-fg,-8l,-4o,-2f,-1b,-m,-6,-8,-2,2,-8,5,5,-a,4,-2;276,3,2,9,u,2s,71,ez,sx,1hz,2oo,4du,5z5,67t,4le,23s,-dp,-2p6,-4ol,-5l3,-4zg,-3ky,-2a8,-1df,-su,-gi,-9d,-54,-2p,-1g,-o,-8,-7,-4,1,-4,1,5,-9,4,2;7ws,1,5,l,2e,7n,is,114,1r2,2nd,3ia,3yy,3so,2z9,1ob,4s,-1hh,-30h,-45u,-4i1,-3yq,-2zd,-219,-1av,-sp,-gz,-9t,-5g,-2w,-1j,-n,-c,-a,-1,-2,2,-1,-3,3,-1,-3;mzc,-2,4,p,2o,8i,jc,xx,1bz,1kw,1lg,1dk,zc,et,-d7,-1bx,-2ek,-3dq,-3zk,-3zb,-3f1,-2lm,-1ts,-17h,-rc,-gh,-9o,-5d,-2w,-1f,-s,-e,-4,-2,-6,5,-2,-8,b,-2,-6;1ced,-1,0,-6,-i,-1l,-3y,-82,-ec,-no,-10w,-1is,-25m,-2xb,-3qo,-4dy,-4na,-4fd,-3u0,-330,-2ci,-1pp,-17s,-tu,-je,-c0,-74,-43,-24,-17,-i,-6,-a,3,-3,-1,1,-4,4,-1,-1;fc,2,1,3,a,x,2p,6t,hn,1j1,642,jz3,f3b,44d,15w,de,21,-6s,-m8,-1up,-6dh,-hd1,-e83,-4uk,-1n1,-np,-b0,-59,-2p,-1a,-n,-7,-7,-3,1,-5,2,4,-7,3,1;z6,-1,4,7,p,2j,6q,gp,178,3lt,b8d,i1p,94j,2zd,10v,cn,r,-a4,-tv,-2b9,-6ww,-fhj,-cxt,-57h,-1yg,-tu,-e4,-6y,-3i,-1n,-y,-b,-7,-2,-1,-7,4,2,-2,-3,5;3oa,3,6,w,37,aq,t5,1zh,4qb,a2i,d19,88i,3nd,1jm,ni,7x,-2r,-fa,-13g,-2s4,-75b,-did,-bmq,-5hk,-2az,-119,-i5,-93,-4k,-2a,-14,-g,-b,-5,1,-4,-1,5,-8,4,2;ckj,0,p,3g,d4,170,310,63l,8v0,806,4qu,2cn,15q,kp,9e,20,-4y,-f2,-10k,-2kp,-6tx,-dp9,-c7z,-5oz,-2c8,-11b,-i0,-8y,-4j,-28,-13,-i,-9,-4,-2,0,-2,-5,5,4,-8;1cur,1,5,h,1p,4t,8w,b3,9y,7a,4t,31,1u,13,c,-g,-1l,-3s,-9j,-ti,-3km,-i53,-k4v,-4p2,-17d,-fc,-6h,-38,-1f,-r,-c,-8,2,-4,-1,-1,1,-1,-1,0,1;1p,-3,-1,0,-1,-1,-2,0,3,4,6,6,6,8,9,f,m,z,1h,2f,3z,6s,bn,jd,t7,118,12b,vh,l7,ce,6j,34,1p,p,f,6,4,-2,5,-1,1;4ia,-2,-8,-14,-4d,-ci,-nu,-ua,-rj,-k6,-da,-8b,-5a,-3a,-1y,-z,-6,l,1g,2o,4j,7j,c2,i7,oc,re,pc,ja,cd,71,3l,1v,w,c,d,-3,4,6,-7,4,-1;hlr,-7,-r,-39,-cc,-11d,-26g,-35y,-39f,-2k9,-1p5,-11n,-mx,-dx,-8a,-4n,-23,-8,1f,36,4v,6p,87,8y,8h,6z,50,37,1u,11,h,8,7,-1,4,-3,1,0,1,2,-4;yiv,-4,-k,-2f,-90,-t1,-1ya,-3q6,-5mk,-6g4,-5gh,-3of,-28i,-1b8,-re,-fv,-8z,-4q,-1w,6,1m,2p,35,36,2n,23,1a,y,f,7,7,2,-2,3,-1,4,-4,-2,4,-1,-4;1dn0,0,1,-3,-k,-1y,-58,-ct,-v3,-2ci,-711,-fsh,-dj7,-5ef,-1x8,-re,-bq,-4m,-c,34,6q,ax,fq,jy,lw,k7,g0,at,6k,3i,1p,x,f,a,2,1,-1,5,1,-5,2;6w,-1,2,-2,-1,3,d,q,1d,2e,3q,5u,8r,cs,hm,l7,kr,eh,4d,-52,-ac,-bd,-9x,-7j,-57,-3c,-21,-15,-n,-a,-7,-3,-3,2,1,-3,1,1,0,-3,1;cqu,-2,-6,-t,-2y,-98,-kr,-yy,-1ac,-1f0,-1ci,-15l,-xk,-q0,-j7,-dm,-94,-5p,-33,-14,b,17,1m,1n,1d,10,p,d,a,4,2,1,-1,3,-1,-1,1,0,3,-6,5;v2u,-4,-a,-1i,-5x,-iz,-18y,-2b6,-3gw,-4am,-4cs,-3pq,-2th,-1zk,-1c3,-ve,-k3,-cm,-7e,-40,-1l,1,u,15,14,u,l,d,a,1,2,2,-1,1,5,-a,5,2,-3,1,3;1d73,-3,-2,-7,-s,-2f,-6h,-ez,-xc,-25r,-576,-ane,-csw,-841,-3qe,-1nn,-rc,-by,-33,38,8p,du,i1,ka,jk,g6,bq,7i,4b,2c,15,n,8,4,4,-1,2,-1,0,4,-7;jo,2,0,0,4,i,1e,2y,5m,aa,ie,wa,1j2,2er,35v,2xj,1f8,-jv,-20n,-2hd,-25x,-1ks,-11s,-nv,-ei,-8k,-4z,-2r,-1h,-r,-e,-5,-3,-2,0,-1,1,1,-4,4,-4;28t,-1,1,6,k,1r,4a,8k,ew,nx,zp,1d4,1pp,1w1,1o7,yq,-17,-xy,-1i5,-1mm,-1g6,-14u,-tk,-k3,-cx,-7y,-4o,-2r,-1b,-t,-c,-7,0,-6,3,-3,0,2,0,-2,2;9qx,-1,1,6,t,2f,5o,a4,eu,il,k1,ij,dt,5n,-6i,-kg,-wv,-14l,-16u,-14a,-ym,-rp,-kx,-ev,-9z,-6a,-3s,-26,-16,-n,-8,-5,-5,-1,-1,3,-2,-3,4,0,-3;qsr,-3,-1,-g,-1n,-5a,-ce,-n5,-zx,-1cp,-1mx,-1t7,-1vy,-1w2,-1u4,-1px,-1jv,-1cl,-14z,-xh,-ql,-kh,-f9,-au,-7b,-4l,-2v,-1k,-w,-i,-7,0,-5,0,3,-7,3,0,-1,-1,4;1cis,3,1,-7,-q,-2i,-6l,-e6,-rw,-1hn,-2so,-4vx,-77r,-84b,-6p1,-4e5,-2ky,-1g3,-r0,-b6,-t,5y,9f,ab,94,6z,4r,2w,1o,v,h,4,4,3,2,0,0,3,-3,-2,2;10b,-4,0,3,d,17,39,74,e6,s2,1jp,30n,5bs,7ew,6yx,46b,13m,-1m4,-42t,-5q9,-5pc,-4bw,-2sj,-1nx,-yj,-jk,-b1,-61,-35,-1n,-t,-d,-5,-6,-1,2,-3,-4,6,1,-5;2cn,2,0,a,w,2u,74,f0,sn,1gc,2jf,41y,5hz,5v7,4le,2e9,44,-1zp,-3tn,-4vx,-4qu,-3ps,-2ja,-1lg,-yi,-k4,-bj,-6e,-3c,-1s,-u,-c,-7,-8,2,-2,1,1,-7,7,-2;88v,-1,8,m,2d,7d,hu,yz,1mr,2fr,37d,3n5,3js,2w6,1rq,ec,-11n,-2el,-3hd,-3yl,-3pu,-2zg,-25h,-1fo,-wk,-jl,-bk,-6c,-3h,-1r,-v,-f,-8,-1,-1,-6,4,-1,-1,-2,3;nit,0,4,m,26,70,g1,s5,13u,1bf,1cb,166,ul,dd,-ak,-143,-20l,-2u8,-3ea,-3i2,-35h,-2iz,-1uz,-19z,-tp,-i9,-av,-61,-3c,-1n,-v,-b,-8,-5,0,-3,1,1,-3,3,0;1chi,1,-1,-3,-h,-1l,-40,-87,-en,-og,-12k,-1lv,-2an,-33s,-3w2,-4e6,-4ff,-40s,-3cx,-2n3,-1zy,-1gl,-11n,-px,-h0,-ao,-6b,-3n,-1w,-11,-j,-6,-4,-4,1,0,-2,1,-3,4,-3;i2,0,-1,3,c,13,33,7o,jj,1mv,63k,ikr,f9l,4mt,1d9,g8,35,-6c,-lc,-1og,-58p,-e9g,-fag,-6f6,-2au,-xq,-fk,-7k,-3s,-1s,-z,-d,-9,-3,-2,2,-4,-2,6,-3,-1;13g,1,2,b,r,2p,7a,hw,19c,3mp,ao8,h7f,9j7,3bm,16d,f2,1v,-9e,-s1,-22f,-5qf,-d41,-dk8,-6ih,-2lr,-14e,-j9,-9g,-4q,-2d,-15,-j,-7,-9,-1,-1,2,-1,-5,8,-6;3z9,5,8,t,3d,b3,tu,1zu,4m5,9ip,cgo,8dq,3x7,1pn,qo,9l,-1w,-ed,-10u,-2h6,-614,-bpf,-bux,-6hl,-2wr,-1c7,-no,-by,-5y,-32,-1e,-q,-d,-1,-8,3,-4,5,-5,-1,4;dfh,6,p,3c,co,15c,2vd,5o6,87p,7pr,4v1,2j5,1aa,nh,ay,2t,-4m,-et,-yz,-2c2,-5so,-bq9,-cav,-6qa,-2z8,-1cs,-nr,-bz,-60,-2y,-1j,-k,-f,-4,-4,-1,0,0,-1,1,-1;1d7p,3,0,a,u,2f,4u,6r,72,5z,4g,35,1z,14,b,-r,-2a,-58,-ci,-yt,-3go,-dll,-jvg,-75m,-23v,-rr,-c2,-5r,-2t,-1d,-o,-c,-2,-6,0,0,-1,2,-4,3,-2;6j,2,-1,0,-3,-1,-1,3,7,a,e,g,m,q,11,1i,2d,3o,61,a3,hr,w7,1ls,2nz,3oj,3wn,37o,25n,19k,oh,c5,5z,2v,1f,q,9,8,6,-6,5,-2;3xt,0,-5,-k,-28,-6r,-dz,-k3,-li,-ip,-e6,-9y,-6s,-4g,-2k,-y,m,2d,4x,8x,gc,u6,1j7,2lv,3pk,41j,3dx,2ac,1cm,q0,d2,69,35,1f,u,c,5,4,-1,3,-1;hfo,-7,-p,-34,-bh,-z2,-21y,-30r,-36d,-2k5,-1qe,-12z,-nw,-ef,-88,-3y,-m,2l,6h,c1,l2,zs,1lt,2c2,2u7,2re,26y,1gj,v4,go,8g,40,20,z,e,e,2,-3,6,1,-3;zc0,-4,-g,-2j,-9k,-up,-22u,-40a,-62i,-6ts,-5je,-3k4,-22r,-166,-n7,-bu,-4f,1b,74,e6,nx,11k,1hy,1wp,21r,1tm,1dj,wb,iu,a3,52,2i,17,k,f,-3,7,1,1,-5,9;1dmw,-1,-1,-8,-k,-1x,-58,-cl,-ua,-290,-6ma,-f4e,-dvv,-5te,-23a,-tg,-bv,-3a,2t,9f,j4,zr,1r0,2se,3ny,3q3,2zj,1z8,15m,mc,b3,5b,2o,1e,i,f,3,-1,8,-4,-1;ch,-2,1,-1,1,4,d,v,1i,2e,3h,4p,6a,8a,as,dz,ht,mg,rk,wp,111,13b,12l,yb,r8,je,cn,7k,47,26,13,i,9,5,2,1,1,-3,7,-6,2;2zj,2,-2,-2,-9,-u,-1v,-35,-49,-4w,-4u,-43,-35,-1m,e,33,6k,ax,gp,o3,x5,16r,1ef,1gl,1bh,114,pp,fy,92,4s,2c,17,l,8,4,5,0,2,-4,6,-5;dv7,-1,-b,-17,-4g,-dn,-u7,-1d4,-1pn,-1r0,-1j0,-177,-vt,-m4,-ds,-6q,-c,5v,cq,kw,un,157,1e4,1hn,1dg,136,rh,h3,9s,56,2l,17,n,b,2,6,0,0,3,-2,0;wf0,-1,-f,-1y,-73,-mg,-1hd,-2ra,-44h,-4yr,-4r0,-3qt,-2me,-1pe,-11f,-kq,-8r,l,97,i7,s4,129,1ad,1da,194,zm,ov,fj,8t,4n,2d,16,f,e,2,4,0,2,-1,-1,2;1d9s,-1,-1,-6,-p,-2b,-66,-e9,-vv,-231,-53m,-ape,-d1h,-86d,-3on,-1l7,-oc,-7r,3k,ep,sp,1c4,209,2m4,2td,2gw,1tp,160,o9,cw,6h,31,1j,u,b,8,2,0,4,-3,0;rd,-3,-1,2,6,l,1j,39,5z,a8,gs,qn,14j,1mt,25b,2e5,243,1cl,db,-h4,-zo,-15m,-125,-u7,-le,-dx,-8o,-4u,-2r,-1d,-q,-9,-7,-4,-2,2,-3,-1,1,2,-1;2ol,2,1,4,h,1h,3m,71,bu,hz,p7,wv,144,19t,1bo,17m,xh,ju,5f,-6n,-eg,-hw,-hg,-ep,-b0,-7g,-4r,-2q,-1j,-r,-h,-4,-5,0,-1,-2,1,3,-4,1,1;s7q,1,-7,-t,-2t,-8x,-l0,-129,-1l7,-21e,-2aa,-2ah,-243,-1te,-1g7,-12g,-pn,-er,-5r,1a,6g,9j,ai,9t,7x,5p,3q,28,18,q,b,3,3,7,-7,7,-4,1,1,0,-5;1cpu,-2,-2,-5,-p,-2e,-6a,-dm,-r7,-1hh,-2vh,-56h,-7ql,-8h8,-6kw,-40c,-24z,-z3,-77,dv,vn,1af,1jm,1ko,1df,11e,pg,fh,8q,4n,2b,12,l,6,8,0,2,1,-2,2,3;18z,-2,0,3,d,1d,3n,7s,f6,sl,1h6,2nv,4ea,62y,6ai,4lb,27u,1e,-1uy,-3dj,-46u,-42b,-39f,-2ab,-1gr,-vw,-im,-ag,-5j,-2v,-1f,-l,-d,-6,-3,0,-3,-1,2,1,-2;2qp,3,2,8,w,2x,77,ey,ro,1cc,27x,3d8,4hz,511,4fs,2y8,177,-fm,-1v4,-2xx,-3gf,-3bb,-2ps,-1yz,-1b1,-tb,-hd,-9u,-5a,-2q,-1b,-n,-c,-4,-4,-2,1,3,-4,-3,6;93a,3,3,l,20,6c,fd,tn,1cn,1ys,2ji,2ws,2yc,2me,1x3,z5,-1r,-10l,-1ub,-2ef,-2lj,-2fm,-20u,-1in,-11j,-o1,-ek,-8b,-4j,-2c,-15,-j,-8,-9,2,-4,-2,8,-a,6,-2;osm,0,1,c,15,3u,8o,f8,lk,px,qt,ny,hv,8e,-58,-m3,-149,-1ky,-1xp,-243,-22y,-1v6,-1j7,-15p,-t1,-it,-bj,-6l,-3m,-1w,-v,-f,-9,-4,1,-3,0,-2,0,2,-1;1cpw,-3,-2,-4,-i,-1j,-3y,-88,-f0,-pk,-15r,-1so,-2ml,-3k2,-4a9,-4fl,-3xv,-33d,-271,-1fg,-ue,-fm,-6g,-1f,s,1d,19,p,l,a,1,7,-1,1,1,-2,1,-4,7,-3,3;ot,1,0,3,e,1h,40,9p,nv,1uw,61a,g0o,f3j,5oo,1v2,nt,6q,-3v,-gt,-16t,-31p,-7nu,-d2q,-aen,-50w,-28e,-11x,-ik,-98,-4k,-24,-12,-k,-6,-7,2,-2,-4,2,1,0;1eh,-1,0,7,z,36,8k,kj,1ds,3nz,9lh,fdp,a4l,42t,1k0,lm,5f,-68,-li,-1fm,-3eg,-7l1,-bmc,-9fm,-4zn,-2do,-164,-l2,-ak,-59,-2j,-16,-n,-7,-8,0,0,-8,9,-5,-1;4pw,1,9,z,3k,bo,uz,1zy,4cl,8f1,b74,8i3,4hf,244,yw,e8,1b,-ao,-s8,-1q6,-3po,-78x,-a0x,-8ca,-4uj,-2i2,-1ae,-nr,-ca,-5z,-2x,-1f,-o,-d,-3,-7,1,0,0,-4,6;fc0,5,n,34,bi,118,2it,4ta,6xl,6zm,4yt,2vm,1kl,ua,f3,5b,-2w,-cg,-sh,-1ow,-3mo,-75n,-a2o,-8hs,-4yg,-2jz,-1bb,-o9,-cd,-66,-30,-1d,-o,-e,-5,-4,0,2,-6,3,-2;1dpm,-4,1,4,7,l,19,1x,2f,2h,28,1s,17,j,-d,-1p,-3t,-7o,-fz,-10a,-2l9,-6zo,-dhy,-bjk,-5hl,-2cz,-137,-iv,-9d,-4m,-25,-10,-j,-b,0,-8,3,-4,5,-5,7;h9,2,-1,-1,-3,-2,-6,-7,-8,-7,-3,2,9,m,1a,2d,47,7d,da,pb,1fb,2zy,5tj,8fr,7sf,520,2tv,1hn,rk,dt,6l,36,1j,u,9,9,2,4,-1,0,0;45l,-1,-4,-i,-21,-65,-cw,-j2,-l7,-j3,-f1,-at,-7h,-4q,-2e,-3,2i,64,c8,o4,1dj,2x5,5qo,8gu,7wt,557,2ve,1id,rt,dy,6q,33,1p,n,f,4,5,3,-1,0,1;hn1,-5,-p,-30,-ba,-yb,-20h,-2zc,-365,-2l6,-1rv,-148,-op,-eq,-7y,-2x,1o,6x,ex,tb,1lq,358,5jj,7ff,6s9,4kx,2oh,1gg,re,ds,6r,3b,1h,q,i,2,3,4,-3,1,3;zte,-5,-l,-2i,-9m,-ux,-23o,-42v,-67t,-6zm,-5m6,-3jy,-21q,-14u,-lm,-9o,-13,75,hw,z7,1tx,3ah,56f,6by,5nd,3xd,2e4,1c9,pr,d4,6j,2x,1i,s,a,9,2,0,4,-3,3;1doz,1,0,-4,-j,-1s,-4t,-bm,-ru,-22d,-64l,-eop,-egk,-67b,-27h,-u6,-as,-b,99,nd,1f8,332,62e,8rk,7wd,4zh,2qk,1fc,q8,d3,69,2z,1k,n,f,2,4,6,-4,-1,7;mt,1,-2,-2,0,3,g,v,1h,27,30,3t,4x,69,8c,bo,h2,pu,144,1qz,2of,3sf,4ls,4k0,3o1,2it,1kp,wn,hs,95,4i,28,x,n,5,b,-2,-1,3,1,-4;3hs,0,0,-4,-j,-1m,-3n,-62,-7y,-8p,-86,-6u,-4x,-2m,i,4l,aa,ir,w7,1i6,2gq,3r4,4w4,538,46n,2vn,1sb,10p,jy,ab,4y,2f,16,m,9,3,4,3,-3,0,2;ev5,-3,-a,-1i,-5k,-h4,-11c,-1np,-20p,-1zc,-1ng,-18c,-v5,-k8,-b3,-2y,5e,fe,to,1fs,2e0,3nq,4so,50w,45q,2vl,1sh,10y,k2,ab,50,2j,13,m,e,-3,6,4,-5,3,0;xgn,-1,-h,-23,-7n,-oe,-1mb,-31f,-4kh,-5fv,-516,-3s6,-2io,-1k0,-vn,-ei,-10,c1,s5,1f3,2cm,3jg,4jx,4q1,3wy,2q9,1pn,zj,jc,a0,4x,2a,16,l,6,b,-2,2,2,-1,-2;1df8,-1,-1,-7,-k,-22,-5j,-cv,-t2,-1xo,-4wo,-au8,-dky,-8bg,-3lk,-1h5,-jt,-1b,ez,111,22s,3v2,62q,72y,5uk,3sp,27n,17h,mv,bn,5m,2n,1d,n,a,7,2,-2,7,-3,-1;12s,-1,0,1,8,m,1q,3j,68,a1,fe,m8,v5,16a,1j9,1vz,25y,2ad,280,1zq,1nv,1au,yy,oo,ge,a8,67,3f,1u,10,h,5,5,5,-4,5,-1,-3,3,-1,2;38n,-2,1,3,c,14,2q,54,8e,ca,gi,kv,pd,uc,105,16u,1e8,1ls,1sc,1wp,1xb,1tc,1l6,19v,xk,mj,e5,88,4i,2c,14,l,b,4,3,-1,3,-3,0,5,-5;c0y,1,-3,-8,-u,-2r,-67,-ap,-er,-h6,-h7,-f2,-ba,-5s,1v,bn,nh,10v,1fc,1td,247,28l,24k,1sw,1d2,xk,la,ch,6v,3j,1v,p,h,7,0,9,-3,0,2,-1,-2;tq5,0,-9,-z,-3x,-cf,-t0,-1gp,-268,-2qc,-2xr,-2re,-2c1,-1s3,-168,-kl,c,kk,154,1pc,26w,2ha,2gs,25a,1n9,14s,py,f3,8h,4a,26,11,k,6,5,1,2,2,-4,5,-4;1d01,-2,1,-3,-n,-26,-5n,-cf,-pc,-1fj,-2wo,-5jc,-8j9,-933,-6hy,-3kd,-1ll,-c2,of,1pm,2v9,3yg,4gu,438,33x,22g,19q,q6,e7,7b,3i,1s,u,e,a,-2,2,6,-4,3,0;1lo,0,0,5,i,1m,44,8m,g7,t3,1eg,2bo,3kr,4us,5et,4qb,39p,1qb,ek,-n7,-1el,-1u5,-1wp,-1ok,-1al,-w4,-kg,-c1,-6k,-3h,-1p,-t,-d,-9,-5,2,-2,-2,0,2,-1;3ag,-1,4,8,x,2y,76,en,q5,17i,1vr,2pk,3ji,43r,42i,3dl,2bu,19a,b7,-g0,-zb,-19w,-1bi,-161,-wl,-mp,-ej,-8o,-4o,-2h,-1b,-h,-c,-5,0,-6,2,1,-1,-2,2;a7n,2,1,g,1j,50,bw,ml,108,1fk,1tp,242,28y,27i,1z8,1l2,13p,mi,6v,-5s,-em,-jg,-k9,-i2,-e5,-9x,-6d,-3s,-26,-13,-i,-a,-5,-2,-2,2,-1,1,-6,6,-5;1d26,2,-1,-3,-g,-1g,-3p,-7s,-ek,-pv,-18f,-212,-34b,-4av,-4yo,-4jg,-39j,-1rz,-fd,nm,1f1,1tj,1up,1lo,17q,tt,it,b3,60,37,1i,t,c,5,5,0,3,2,-4,-2,6;w2,1,1,4,k,1s,4x,bt,sb,23e,667,en3,ed7,679,27z,uk,b6,w,-85,-kv,-190,-2ne,-56m,-7ui,-7qt,-5an,-31i,-1mf,-u4,-f6,-79,-3e,-1t,-s,-d,-7,-5,0,-3,2,-2;1pq,-2,1,a,12,3p,9t,n6,1i9,3r8,90h,e18,a6d,4kd,1va,s4,ab,-f,-aj,-p2,-1fb,-2t3,-4zt,-6xn,-6oj,-4pv,-2ty,-1k9,-tk,-ez,-7d,-3c,-1s,-t,-e,-8,-3,-4,4,-2,1;5g5,-2,8,y,3q,ca,vv,202,45p,7nn,a6y,8de,4uk,2g3,16y,jt,6g,-3m,-em,-uo,-1m0,-2w0,-4ld,-5th,-5gv,-3z9,-2i2,-1f9,-rq,-e6,-6v,-3d,-1n,-p,-j,0,-8,-4,6,-5,2;gz1,4,n,2u,aj,xo,28x,477,60x,6cb,4w4,32u,1si,10c,jj,8v,10,-6g,-g1,-va,-1lu,-2uu,-4j8,-5r8,-5fq,-3za,-2if,-1fl,-rw,-ec,-6x,-3c,-1k,-z,-8,-d,0,4,-b,6,-2;1e4r,0,2,3,1,4,4,4,3,1,-2,-8,-f,-q,-1d,-2c,-43,-6y,-cf,-n2,-19l,-2ld,-4za,-7i5,-7j2,-5a4,-33l,-1o8,-vc,-fr,-7n,-3k,-1p,-11,-a,-f,2,2,-6,-2,8;1po,-1,-5,-h,-1p,-4t,-8w,-b3,-9y,-7a,-4t,-31,-1u,-13,-c,g,1l,3s,9j,ti,3km,i53,k4v,4p2,17d,fc,6h,38,1f,r,c,8,-2,4,1,1,-1,1,1,0,-1;7zb,-3,-t,-3o,-d4,-104,-1or,-1qj,-18c,-py,-eb,-7w,-4i,-2f,-10,c,22,52,cx,12r,4af,hkv,id6,54j,1ge,j7,8j,3x,22,y,f,b,-1,5,0,2,-2,3,-3,-1,4;nyh,-9,-1k,-6t,-p4,-243,-4c2,-5oy,-4o9,-2r6,-1f6,-q5,-dw,-7a,-38,1,3n,9q,nv,1to,5up,fn7,erq,5or,203,t9,dm,6j,3c,1j,v,d,6,2,1,4,-2,-3,5,-2,0;13o5,-5,-o,-30,-b5,-10x,-2n7,-5kz,-8wr,-8zb,-5my,-2t0,-1d2,-o0,-av,-2m,4x,fl,11y,2ne,6ws,dis,bzp,5o0,2cz,11w,ic,9a,4i,2c,17,d,d,4,-3,8,-1,-7,b,-6,0;1e53,-2,-1,-3,-a,-x,-2p,-6t,-hn,-1j1,-642,-jz3,-f3b,-44d,-15w,-de,-21,6s,m8,1up,6dh,hd1,e83,4uk,1n1,np,b0,59,2p,1a,n,7,7,3,-1,5,-2,-4,7,-3,-1;1e1,2,-1,-4,-a,-v,-1q,-2t,-3i,-3l,-33,-2e,-1a,0,20,56,ax,mp,1en,3gp,8h1,dvl,ac3,4pi,20e,x6,gc,8d,44,23,10,j,4,9,-1,3,-2,3,0,0,-3;5bo,-3,-3,-s,-2u,-8k,-hn,-pl,-rk,-o1,-i6,-ck,-86,-4f,-s,3k,a2,mg,1f2,3h9,8f5,dp6,a9s,4q8,216,xn,gn,8e,49,27,x,j,a,2,6,-7,5,0,1,-3,5;j2i,-3,-t,-3g,-ck,-128,-28j,-3ak,-3g5,-2qw,-1u3,-14p,-o7,-dh,-5h,1s,as,q2,1mu,3t8,8ej,ciu,9j8,4pv,25a,10q,ih,9g,4s,2g,14,k,7,9,-2,8,-4,-3,6,-2,-2;112d,-5,-i,-2k,-9r,-vm,-262,-4a5,-6mf,-7ek,-5rs,-3iu,-1yl,-11f,-hb,-37,ai,u5,1w7,462,89s,b8m,8nk,4ls,288,13l,kd,ai,5e,2p,1b,l,e,1,a,-8,5,2,-5,3,3;1dxm,1,-2,-1,-e,-1b,-3i,-8k,-ks,-1l1,-529,-ecr,-g8o,-6r1,-27m,-qe,-3w,dy,17t,3cg,8wq,f2l,aaf,48q,1pr,rk,dd,6r,3e,1o,v,f,5,1,1,5,-4,6,-5,4,0;1pc,-1,-1,0,5,i,1a,2j,4b,6i,96,c9,ga,m1,vk,1bg,21x,37c,4rq,68v,6ms,5k9,3wh,2gf,1gk,ua,h7,9f,4z,2i,1b,k,9,7,1,3,0,-3,5,-5,5;4dl,0,-2,-2,-8,-i,-14,-1p,-1w,-1d,3,2e,5y,bh,ks,10e,1q3,2v1,4hx,683,6wt,5x2,450,2kf,1i4,uu,he,9h,50,2j,17,p,7,6,3,2,0,-2,1,3,-4;eop,-1,-7,-y,-3j,-as,-nv,-138,-1e4,-1gk,-1as,-10p,-p1,-ci,2p,m8,1e4,2jy,48p,64k,71c,64y,4ai,2n0,1j3,v4,hj,9h,52,2f,1d,h,d,4,5,-1,1,-2,3,-2,2;wyh,1,-c,-1m,-6a,-js,-1as,-2eh,-3l7,-4di,-4bh,-3jf,-2j8,-1kt,-pp,42,11t,2af,40v,5zk,70y,676,4cf,2ny,1je,v8,hh,9h,51,2k,16,p,7,6,4,-3,3,6,-9,2,5;1dm4,-1,-3,-5,-f,-1j,-44,-9f,-kk,-1al,-33x,-76e,-bx2,-ajt,-5hf,-25e,-au,17x,3cy,6qq,9tf,8sr,5ax,2px,1dd,ph,dj,75,3p,1u,x,g,6,4,-1,7,-2,-6,8,-2,-1;27r,-2,1,6,k,1s,4e,90,g5,r4,174,1t6,2lh,3i9,4ct,4tn,4q9,45q,3d7,2kt,1wl,1da,ys,np,fe,9m,5n,39,1o,z,e,6,6,0,0,2,1,-4,5,-1,-2;49d,1,3,9,r,2j,66,c5,kt,wi,1b8,1sj,2bp,2wi,3h2,3x3,43p,3y3,3hn,2vg,287,1na,16c,sx,it,bo,6w,3y,25,12,g,c,4,3,1,-3,4,2,-4,-1,4;ce3,-1,2,5,b,z,2k,5d,9l,fd,mg,uw,14w,1ig,20z,2nc,390,3ms,3n5,39o,2no,1zw,1f4,yi,m6,dk,82,4g,2h,19,k,c,5,0,8,-8,4,2,-3,1,1;to1,-2,-4,-p,-2h,-7v,-hz,-vr,-19c,-1ij,-1jz,-1cs,-z0,-ea,eg,1di,2ei,39a,3ox,3kc,2zs,29e,1l6,120,nz,em,8h,4u,2i,1c,m,e,1,5,2,0,0,0,0,-2,2;1dpb,1,-4,-3,-d,-13,-2u,-68,-ch,-ow,-1e3,-2rs,-527,-7b4,-6zq,-40l,-lp,2h8,52z,678,5at,3jo,247,17m,om,du,7r,45,2a,13,i,d,3,2,-1,5,-2,-1,-1,4,-3;zh,-2,-1,5,l,23,5j,db,w1,2dm,6xk,fbn,dk0,5mz,21w,u3,dt,6v,3e,1f,8,-l,-11,-15,-12,-u,-l,-e,-5,-5,-1,-3,0,0,-4,7,-2,-8,c,-5,-1;21z,2,1,a,18,48,b2,pq,1mq,3vo,8r1,daq,a5t,4vh,23s,yr,hh,9l,5l,3d,22,18,r,f,8,3,2,0,2,-3,1,0,-2,4,-5,6,-3,-2,4,-2,-2;7qp,1,7,v,36,ai,qx,1ln,339,5h3,822,8k5,6dg,3qm,1zj,11p,kp,bv,7c,4m,2z,21,1c,x,j,8,a,0,5,-2,1,1,0,0,0,-1,2,0,-1,-1,1;odz,-1,0,6,x,48,ea,119,274,3t1,4zy,4tf,3ji,26w,18q,on,dv,82,4v,32,1z,1b,v,j,c,7,4,0,3,0,-1,-1,1,1,-4,5,-1,-6,7,-2,0";
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Generated by scripts/fit-image-plane-lattice.mjs; do not edit. Photivra's own fitted spectra (LHTSS, arXiv:1710.05732 v5),
|
|
3
|
+
// fitted against CIE D65 and the CIE 1931 2° observer at fit time only; no CIE value is stored (THIRD_PARTY.md).
|
|
4
|
+
/**
|
|
5
|
+
* The 120 stored nodes of the print reflectance lattice (r, g, b indices in order, the neutral axis skipped), each 41 16-bit
|
|
6
|
+
* reflectance codes at 380, 390, …, 780 nm (value / 65535), delta-coded along wavelength in base 36: nodes separated by ";",
|
|
7
|
+
* codes by ",".
|
|
8
|
+
*/
|
|
9
|
+
export const IMAGE_PLANE_LATTICE_CODES = "2lg,-2,1,4,j,1c,1u,-1,-71,-he,-m6,-ir,-cm,-7o,-4i,-2l,-1i,-y,-k,-d,-9,-5,-4,-1,-1,1,1,0,1,0,-1,1,-2,4,-3,3,-3,-3,8,-5,2;b3v,1,1,h,1j,3g,3o,-4n,-ts,-1vj,-2hl,-287,-1jh,-xl,-j6,-as,-65,-3o,-27,-1g,-x,-m,-e,-9,-4,-3,0,-2,1,1,-1,-2,2,1,-6,a,-5,-4,4,3,-7;stg,1,-6,-d,-1m,-66,-id,-17t,-2fp,-440,-5ei,-59d,-3wa,-2ex,-1d7,-r1,-f3,-8s,-5b,-3c,-26,-1f,-x,-l,-d,-7,-4,-2,-1,0,-3,2,1,0,-5,7,-2,-5,6,0,-4;1dky,2,1,-5,-l,-23,-5j,-db,-w1,-2dm,-6xk,-fbn,-dk0,-5mz,-21w,-u3,-dt,-6v,-3e,-1f,-8,l,11,15,12,u,l,e,5,5,1,3,0,0,4,-7,2,8,-c,5,1;4g,-2,-1,0,-1,-1,9,n,1a,2e,4b,7r,e3,o5,z1,wg,69,-m8,-ux,-oy,-gh,-a2,-63,-3n,-25,-18,-o,-d,-9,-2,-3,1,-2,2,-1,0,1,-5,4,3,-5;25w,-1,0,2,b,w,21,3t,5t,7m,8n,89,65,1w,-4c,-am,-em,-fi,-e0,-bf,-8r,-6d,-4i,-31,-1y,-18,-n,-f,-8,-1,-1,-6,2,2,-3,4,-3,-4,7,-5,4;bam,1,-4,-9,-10,-36,-7r,-er,-n9,-vl,-11e,-13h,-12h,-zo,-vn,-qs,-ln,-gx,-cy,-9q,-78,-57,-3r,-2j,-1o,-10,-n,-b,-6,-3,0,-4,2,-1,-3,4,0,-2,1,0,1;tak,-4,-9,-12,-40,-cy,-v5,-1mu,-2jw,-3ei,-3uk,-3qc,-36x,-2i1,-1u6,-1ar,-we,-mh,-fp,-b2,-7u,-5i,-3v,-2n,-1o,-11,-m,-c,-6,-2,-2,-4,3,-1,-2,4,-3,-2,6,-3,1;1d4e,0,-2,-8,-q,-2j,-6q,-fd,-xx,-260,-543,-abl,-cl6,-89y,-3xg,-1sg,-uz,-fi,-7g,-2o,f,2h,3m,3x,3i,2r,1w,17,n,d,8,2,0,2,-1,3,0,-4,4,-1,-1;gj,0,-1,2,4,h,19,2r,5e,a6,j5,zw,1te,30e,3vx,31r,j6,-1zy,-37a,-2xp,-22i,-1ah,-ry,-gj,-9n,-5j,-35,-1q,-y,-f,-a,-2,-2,-2,0,-1,1,0,0,1,-1;219,-1,1,6,l,1t,4k,96,gf,r8,166,1o9,24x,2ar,1sz,lu,-ts,-1v8,-27v,-1zl,-1ij,-11v,-p4,-g0,-9w,-5u,-3h,-1x,-z,-j,-9,-3,-4,0,-3,5,-4,-1,2,-1,3;96c,-2,3,c,17,3p,8k,fk,n9,tr,wl,ub,m9,7l,-dj,-10o,-1io,-1qd,-1o1,-1f4,-13y,-tb,-ko,-dy,-8y,-5i,-39,-1t,-z,-h,-9,-7,2,-3,-3,2,0,-2,4,-3,2;pzu,0,0,-6,-w,-2w,-74,-e3,-nf,-yh,-19l,-1jk,-1rr,-1yv,-24c,-25v,-222,-1tm,-1io,-17e,-x1,-ob,-he,-bx,-7t,-4u,-2v,-1m,-x,-e,-9,-5,1,-3,4,-8,3,5,-6,0,7;1cfq,-2,-1,-5,-r,-2m,-6o,-ea,-ry,-1h3,-2q8,-4pf,-6xs,-7yd,-6sm,-4mw,-2u9,-1ou,-zo,-kc,-as,-4r,-1d,f,12,12,u,k,9,7,5,1,2,-6,8,-5,2,0,-2,0,6;wv,2,2,3,a,16,34,6s,dr,rq,1ko,36m,5sn,81s,76v,3wj,kp,-2du,-53t,-6mf,-5y3,-427,-2f6,-1dg,-ro,-fg,-8l,-4o,-2f,-1b,-m,-6,-8,-2,2,-8,5,5,-a,4,-2;276,3,2,9,u,2s,71,ez,sx,1hz,2oo,4du,5z5,67t,4le,23s,-dp,-2p6,-4ol,-5l3,-4zg,-3ky,-2a8,-1df,-su,-gi,-9d,-54,-2p,-1g,-o,-8,-7,-4,1,-4,1,5,-9,4,2;7ws,1,5,l,2e,7n,is,114,1r2,2nd,3ia,3yy,3so,2z9,1ob,4s,-1hh,-30h,-45u,-4i1,-3yq,-2zd,-219,-1av,-sp,-gz,-9t,-5g,-2w,-1j,-n,-c,-a,-1,-2,2,-1,-3,3,-1,-3;mzc,-2,4,p,2o,8i,jc,xx,1bz,1kw,1lg,1dk,zc,et,-d7,-1bx,-2ek,-3dq,-3zk,-3zb,-3f1,-2lm,-1ts,-17h,-rc,-gh,-9o,-5d,-2w,-1f,-s,-e,-4,-2,-6,5,-2,-8,b,-2,-6;1ced,-1,0,-6,-i,-1l,-3y,-82,-ec,-no,-10w,-1is,-25m,-2xb,-3qo,-4dy,-4na,-4fd,-3u0,-330,-2ci,-1pp,-17s,-tu,-je,-c0,-74,-43,-24,-17,-i,-6,-a,3,-3,-1,1,-4,4,-1,-1;fc,2,1,3,a,x,2p,6t,hn,1j1,642,jz3,f3b,44d,15w,de,21,-6s,-m8,-1up,-6dh,-hd1,-e83,-4uk,-1n1,-np,-b0,-59,-2p,-1a,-n,-7,-7,-3,1,-5,2,4,-7,3,1;z6,-1,4,7,p,2j,6q,gp,178,3lt,b8d,i1p,94j,2zd,10v,cn,r,-a4,-tv,-2b9,-6ww,-fhj,-cxt,-57h,-1yg,-tu,-e4,-6y,-3i,-1n,-y,-b,-7,-2,-1,-7,4,2,-2,-3,5;3oa,3,6,w,37,aq,t5,1zh,4qb,a2i,d19,88i,3nd,1jm,ni,7x,-2r,-fa,-13g,-2s4,-75b,-did,-bmq,-5hk,-2az,-119,-i5,-93,-4k,-2a,-14,-g,-b,-5,1,-4,-1,5,-8,4,2;ckj,0,p,3g,d4,170,310,63l,8v0,806,4qu,2cn,15q,kp,9e,20,-4y,-f2,-10k,-2kp,-6tx,-dp9,-c7z,-5oz,-2c8,-11b,-i0,-8y,-4j,-28,-13,-i,-9,-4,-2,0,-2,-5,5,4,-8;1cur,1,5,h,1p,4t,8w,b3,9y,7a,4t,31,1u,13,c,-g,-1l,-3s,-9j,-ti,-3km,-i53,-k4v,-4p2,-17d,-fc,-6h,-38,-1f,-r,-c,-8,2,-4,-1,-1,1,-1,-1,0,1;1p,-3,-1,0,-1,-1,-2,0,3,4,6,6,6,8,9,f,m,z,1h,2f,3z,6s,bn,jd,t7,118,12b,vh,l7,ce,6j,34,1p,p,f,6,4,-2,5,-1,1;4ia,-2,-8,-14,-4d,-ci,-nu,-ua,-rj,-k6,-da,-8b,-5a,-3a,-1y,-z,-6,l,1g,2o,4j,7j,c2,i7,oc,re,pc,ja,cd,71,3l,1v,w,c,d,-3,4,6,-7,4,-1;hlr,-7,-r,-39,-cc,-11d,-26g,-35y,-39f,-2k9,-1p5,-11n,-mx,-dx,-8a,-4n,-23,-8,1f,36,4v,6p,87,8y,8h,6z,50,37,1u,11,h,8,7,-1,4,-3,1,0,1,2,-4;yiv,-4,-k,-2f,-90,-t1,-1ya,-3q6,-5mk,-6g4,-5gh,-3of,-28i,-1b8,-re,-fv,-8z,-4q,-1w,6,1m,2p,35,36,2n,23,1a,y,f,7,7,2,-2,3,-1,4,-4,-2,4,-1,-4;1dn0,0,1,-3,-k,-1y,-58,-ct,-v3,-2ci,-711,-fsh,-dj7,-5ef,-1x8,-re,-bq,-4m,-c,34,6q,ax,fq,jy,lw,k7,g0,at,6k,3i,1p,x,f,a,2,1,-1,5,1,-5,2;6w,-1,2,-2,-1,3,d,q,1d,2e,3q,5u,8r,cs,hm,l7,kr,eh,4d,-52,-ac,-bd,-9x,-7j,-57,-3c,-21,-15,-n,-a,-7,-3,-3,2,1,-3,1,1,0,-3,1;cqu,-2,-6,-t,-2y,-98,-kr,-yy,-1ac,-1f0,-1ci,-15l,-xk,-q0,-j7,-dm,-94,-5p,-33,-14,b,17,1m,1n,1d,10,p,d,a,4,2,1,-1,3,-1,-1,1,0,3,-6,5;v2u,-4,-a,-1i,-5x,-iz,-18y,-2b6,-3gw,-4am,-4cs,-3pq,-2th,-1zk,-1c3,-ve,-k3,-cm,-7e,-40,-1l,1,u,15,14,u,l,d,a,1,2,2,-1,1,5,-a,5,2,-3,1,3;1d73,-3,-2,-7,-s,-2f,-6h,-ez,-xc,-25r,-576,-ane,-csw,-841,-3qe,-1nn,-rc,-by,-33,38,8p,du,i1,ka,jk,g6,bq,7i,4b,2c,15,n,8,4,4,-1,2,-1,0,4,-7;jo,2,0,0,4,i,1e,2y,5m,aa,ie,wa,1j2,2er,35v,2xj,1f8,-jv,-20n,-2hd,-25x,-1ks,-11s,-nv,-ei,-8k,-4z,-2r,-1h,-r,-e,-5,-3,-2,0,-1,1,1,-4,4,-4;28t,-1,1,6,k,1r,4a,8k,ew,nx,zp,1d4,1pp,1w1,1o7,yq,-17,-xy,-1i5,-1mm,-1g6,-14u,-tk,-k3,-cx,-7y,-4o,-2r,-1b,-t,-c,-7,0,-6,3,-3,0,2,0,-2,2;9qx,-1,1,6,t,2f,5o,a4,eu,il,k1,ij,dt,5n,-6i,-kg,-wv,-14l,-16u,-14a,-ym,-rp,-kx,-ev,-9z,-6a,-3s,-26,-16,-n,-8,-5,-5,-1,-1,3,-2,-3,4,0,-3;qsr,-3,-1,-g,-1n,-5a,-ce,-n5,-zx,-1cp,-1mx,-1t7,-1vy,-1w2,-1u4,-1px,-1jv,-1cl,-14z,-xh,-ql,-kh,-f9,-au,-7b,-4l,-2v,-1k,-w,-i,-7,0,-5,0,3,-7,3,0,-1,-1,4;1cis,3,1,-7,-q,-2i,-6l,-e6,-rw,-1hn,-2so,-4vx,-77r,-84b,-6p1,-4e5,-2ky,-1g3,-r0,-b6,-t,5y,9f,ab,94,6z,4r,2w,1o,v,h,4,4,3,2,0,0,3,-3,-2,2;10b,-4,0,3,d,17,39,74,e6,s2,1jp,30n,5bs,7ew,6yx,46b,13m,-1m4,-42t,-5q9,-5pc,-4bw,-2sj,-1nx,-yj,-jk,-b1,-61,-35,-1n,-t,-d,-5,-6,-1,2,-3,-4,6,1,-5;2cn,2,0,a,w,2u,74,f0,sn,1gc,2jf,41y,5hz,5v7,4le,2e9,44,-1zp,-3tn,-4vx,-4qu,-3ps,-2ja,-1lg,-yi,-k4,-bj,-6e,-3c,-1s,-u,-c,-7,-8,2,-2,1,1,-7,7,-2;88v,-1,8,m,2d,7d,hu,yz,1mr,2fr,37d,3n5,3js,2w6,1rq,ec,-11n,-2el,-3hd,-3yl,-3pu,-2zg,-25h,-1fo,-wk,-jl,-bk,-6c,-3h,-1r,-v,-f,-8,-1,-1,-6,4,-1,-1,-2,3;nit,0,4,m,26,70,g1,s5,13u,1bf,1cb,166,ul,dd,-ak,-143,-20l,-2u8,-3ea,-3i2,-35h,-2iz,-1uz,-19z,-tp,-i9,-av,-61,-3c,-1n,-v,-b,-8,-5,0,-3,1,1,-3,3,0;1chi,1,-1,-3,-h,-1l,-40,-87,-en,-og,-12k,-1lv,-2an,-33s,-3w2,-4e6,-4ff,-40s,-3cx,-2n3,-1zy,-1gl,-11n,-px,-h0,-ao,-6b,-3n,-1w,-11,-j,-6,-4,-4,1,0,-2,1,-3,4,-3;i2,0,-1,3,c,13,33,7o,jj,1mv,63k,ikr,f9l,4mt,1d9,g8,35,-6c,-lc,-1og,-58p,-e9g,-fag,-6f6,-2au,-xq,-fk,-7k,-3s,-1s,-z,-d,-9,-3,-2,2,-4,-2,6,-3,-1;13g,1,2,b,r,2p,7a,hw,19c,3mp,ao8,h7f,9j7,3bm,16d,f2,1v,-9e,-s1,-22f,-5qf,-d41,-dk8,-6ih,-2lr,-14e,-j9,-9g,-4q,-2d,-15,-j,-7,-9,-1,-1,2,-1,-5,8,-6;3z9,5,8,t,3d,b3,tu,1zu,4m5,9ip,cgo,8dq,3x7,1pn,qo,9l,-1w,-ed,-10u,-2h6,-614,-bpf,-bux,-6hl,-2wr,-1c7,-no,-by,-5y,-32,-1e,-q,-d,-1,-8,3,-4,5,-5,-1,4;dfh,6,p,3c,co,15c,2vd,5o6,87p,7pr,4v1,2j5,1aa,nh,ay,2t,-4m,-et,-yz,-2c2,-5so,-bq9,-cav,-6qa,-2z8,-1cs,-nr,-bz,-60,-2y,-1j,-k,-f,-4,-4,-1,0,0,-1,1,-1;1d7p,3,0,a,u,2f,4u,6r,72,5z,4g,35,1z,14,b,-r,-2a,-58,-ci,-yt,-3go,-dll,-jvg,-75m,-23v,-rr,-c2,-5r,-2t,-1d,-o,-c,-2,-6,0,0,-1,2,-4,3,-2;6j,2,-1,0,-3,-1,-1,3,7,a,e,g,m,q,11,1i,2d,3o,61,a3,hr,w7,1ls,2nz,3oj,3wn,37o,25n,19k,oh,c5,5z,2v,1f,q,9,8,6,-6,5,-2;3xt,0,-5,-k,-28,-6r,-dz,-k3,-li,-ip,-e6,-9y,-6s,-4g,-2k,-y,m,2d,4x,8x,gc,u6,1j7,2lv,3pk,41j,3dx,2ac,1cm,q0,d2,69,35,1f,u,c,5,4,-1,3,-1;hfo,-7,-p,-34,-bh,-z2,-21y,-30r,-36d,-2k5,-1qe,-12z,-nw,-ef,-88,-3y,-m,2l,6h,c1,l2,zs,1lt,2c2,2u7,2re,26y,1gj,v4,go,8g,40,20,z,e,e,2,-3,6,1,-3;zc0,-4,-g,-2j,-9k,-up,-22u,-40a,-62i,-6ts,-5je,-3k4,-22r,-166,-n7,-bu,-4f,1b,74,e6,nx,11k,1hy,1wp,21r,1tm,1dj,wb,iu,a3,52,2i,17,k,f,-3,7,1,1,-5,9;1dmw,-1,-1,-8,-k,-1x,-58,-cl,-ua,-290,-6ma,-f4e,-dvv,-5te,-23a,-tg,-bv,-3a,2t,9f,j4,zr,1r0,2se,3ny,3q3,2zj,1z8,15m,mc,b3,5b,2o,1e,i,f,3,-1,8,-4,-1;ch,-2,1,-1,1,4,d,v,1i,2e,3h,4p,6a,8a,as,dz,ht,mg,rk,wp,111,13b,12l,yb,r8,je,cn,7k,47,26,13,i,9,5,2,1,1,-3,7,-6,2;2zj,2,-2,-2,-9,-u,-1v,-35,-49,-4w,-4u,-43,-35,-1m,e,33,6k,ax,gp,o3,x5,16r,1ef,1gl,1bh,114,pp,fy,92,4s,2c,17,l,8,4,5,0,2,-4,6,-5;dv7,-1,-b,-17,-4g,-dn,-u7,-1d4,-1pn,-1r0,-1j0,-177,-vt,-m4,-ds,-6q,-c,5v,cq,kw,un,157,1e4,1hn,1dg,136,rh,h3,9s,56,2l,17,n,b,2,6,0,0,3,-2,0;wf0,-1,-f,-1y,-73,-mg,-1hd,-2ra,-44h,-4yr,-4r0,-3qt,-2me,-1pe,-11f,-kq,-8r,l,97,i7,s4,129,1ad,1da,194,zm,ov,fj,8t,4n,2d,16,f,e,2,4,0,2,-1,-1,2;1d9s,-1,-1,-6,-p,-2b,-66,-e9,-vv,-231,-53m,-ape,-d1h,-86d,-3on,-1l7,-oc,-7r,3k,ep,sp,1c4,209,2m4,2td,2gw,1tp,160,o9,cw,6h,31,1j,u,b,8,2,0,4,-3,0;rd,-3,-1,2,6,l,1j,39,5z,a8,gs,qn,14j,1mt,25b,2e5,243,1cl,db,-h4,-zo,-15m,-125,-u7,-le,-dx,-8o,-4u,-2r,-1d,-q,-9,-7,-4,-2,2,-3,-1,1,2,-1;2ol,2,1,4,h,1h,3m,71,bu,hz,p7,wv,144,19t,1bo,17m,xh,ju,5f,-6n,-eg,-hw,-hg,-ep,-b0,-7g,-4r,-2q,-1j,-r,-h,-4,-5,0,-1,-2,1,3,-4,1,1;s7q,1,-7,-t,-2t,-8x,-l0,-129,-1l7,-21e,-2aa,-2ah,-243,-1te,-1g7,-12g,-pn,-er,-5r,1a,6g,9j,ai,9t,7x,5p,3q,28,18,q,b,3,3,7,-7,7,-4,1,1,0,-5;1cpu,-2,-2,-5,-p,-2e,-6a,-dm,-r7,-1hh,-2vh,-56h,-7ql,-8h8,-6kw,-40c,-24z,-z3,-77,dv,vn,1af,1jm,1ko,1df,11e,pg,fh,8q,4n,2b,12,l,6,8,0,2,1,-2,2,3;18z,-2,0,3,d,1d,3n,7s,f6,sl,1h6,2nv,4ea,62y,6ai,4lb,27u,1e,-1uy,-3dj,-46u,-42b,-39f,-2ab,-1gr,-vw,-im,-ag,-5j,-2v,-1f,-l,-d,-6,-3,0,-3,-1,2,1,-2;2qp,3,2,8,w,2x,77,ey,ro,1cc,27x,3d8,4hz,511,4fs,2y8,177,-fm,-1v4,-2xx,-3gf,-3bb,-2ps,-1yz,-1b1,-tb,-hd,-9u,-5a,-2q,-1b,-n,-c,-4,-4,-2,1,3,-4,-3,6;93a,3,3,l,20,6c,fd,tn,1cn,1ys,2ji,2ws,2yc,2me,1x3,z5,-1r,-10l,-1ub,-2ef,-2lj,-2fm,-20u,-1in,-11j,-o1,-ek,-8b,-4j,-2c,-15,-j,-8,-9,2,-4,-2,8,-a,6,-2;osm,0,1,c,15,3u,8o,f8,lk,px,qt,ny,hv,8e,-58,-m3,-149,-1ky,-1xp,-243,-22y,-1v6,-1j7,-15p,-t1,-it,-bj,-6l,-3m,-1w,-v,-f,-9,-4,1,-3,0,-2,0,2,-1;1cpw,-3,-2,-4,-i,-1j,-3y,-88,-f0,-pk,-15r,-1so,-2ml,-3k2,-4a9,-4fl,-3xv,-33d,-271,-1fg,-ue,-fm,-6g,-1f,s,1d,19,p,l,a,1,7,-1,1,1,-2,1,-4,7,-3,3;ot,1,0,3,e,1h,40,9p,nv,1uw,61a,g0o,f3j,5oo,1v2,nt,6q,-3v,-gt,-16t,-31p,-7nu,-d2q,-aen,-50w,-28e,-11x,-ik,-98,-4k,-24,-12,-k,-6,-7,2,-2,-4,2,1,0;1eh,-1,0,7,z,36,8k,kj,1ds,3nz,9lh,fdp,a4l,42t,1k0,lm,5f,-68,-li,-1fm,-3eg,-7l1,-bmc,-9fm,-4zn,-2do,-164,-l2,-ak,-59,-2j,-16,-n,-7,-8,0,0,-8,9,-5,-1;4pw,1,9,z,3k,bo,uz,1zy,4cl,8f1,b74,8i3,4hf,244,yw,e8,1b,-ao,-s8,-1q6,-3po,-78x,-a0x,-8ca,-4uj,-2i2,-1ae,-nr,-ca,-5z,-2x,-1f,-o,-d,-3,-7,1,0,0,-4,6;fc0,5,n,34,bi,118,2it,4ta,6xl,6zm,4yt,2vm,1kl,ua,f3,5b,-2w,-cg,-sh,-1ow,-3mo,-75n,-a2o,-8hs,-4yg,-2jz,-1bb,-o9,-cd,-66,-30,-1d,-o,-e,-5,-4,0,2,-6,3,-2;1dpm,-4,1,4,7,l,19,1x,2f,2h,28,1s,17,j,-d,-1p,-3t,-7o,-fz,-10a,-2l9,-6zo,-dhy,-bjk,-5hl,-2cz,-137,-iv,-9d,-4m,-25,-10,-j,-b,0,-8,3,-4,5,-5,7;h9,2,-1,-1,-3,-2,-6,-7,-8,-7,-3,2,9,m,1a,2d,47,7d,da,pb,1fb,2zy,5tj,8fr,7sf,520,2tv,1hn,rk,dt,6l,36,1j,u,9,9,2,4,-1,0,0;45l,-1,-4,-i,-21,-65,-cw,-j2,-l7,-j3,-f1,-at,-7h,-4q,-2e,-3,2i,64,c8,o4,1dj,2x5,5qo,8gu,7wt,557,2ve,1id,rt,dy,6q,33,1p,n,f,4,5,3,-1,0,1;hn1,-5,-p,-30,-ba,-yb,-20h,-2zc,-365,-2l6,-1rv,-148,-op,-eq,-7y,-2x,1o,6x,ex,tb,1lq,358,5jj,7ff,6s9,4kx,2oh,1gg,re,ds,6r,3b,1h,q,i,2,3,4,-3,1,3;zte,-5,-l,-2i,-9m,-ux,-23o,-42v,-67t,-6zm,-5m6,-3jy,-21q,-14u,-lm,-9o,-13,75,hw,z7,1tx,3ah,56f,6by,5nd,3xd,2e4,1c9,pr,d4,6j,2x,1i,s,a,9,2,0,4,-3,3;1doz,1,0,-4,-j,-1s,-4t,-bm,-ru,-22d,-64l,-eop,-egk,-67b,-27h,-u6,-as,-b,99,nd,1f8,332,62e,8rk,7wd,4zh,2qk,1fc,q8,d3,69,2z,1k,n,f,2,4,6,-4,-1,7;mt,1,-2,-2,0,3,g,v,1h,27,30,3t,4x,69,8c,bo,h2,pu,144,1qz,2of,3sf,4ls,4k0,3o1,2it,1kp,wn,hs,95,4i,28,x,n,5,b,-2,-1,3,1,-4;3hs,0,0,-4,-j,-1m,-3n,-62,-7y,-8p,-86,-6u,-4x,-2m,i,4l,aa,ir,w7,1i6,2gq,3r4,4w4,538,46n,2vn,1sb,10p,jy,ab,4y,2f,16,m,9,3,4,3,-3,0,2;ev5,-3,-a,-1i,-5k,-h4,-11c,-1np,-20p,-1zc,-1ng,-18c,-v5,-k8,-b3,-2y,5e,fe,to,1fs,2e0,3nq,4so,50w,45q,2vl,1sh,10y,k2,ab,50,2j,13,m,e,-3,6,4,-5,3,0;xgn,-1,-h,-23,-7n,-oe,-1mb,-31f,-4kh,-5fv,-516,-3s6,-2io,-1k0,-vn,-ei,-10,c1,s5,1f3,2cm,3jg,4jx,4q1,3wy,2q9,1pn,zj,jc,a0,4x,2a,16,l,6,b,-2,2,2,-1,-2;1df8,-1,-1,-7,-k,-22,-5j,-cv,-t2,-1xo,-4wo,-au8,-dky,-8bg,-3lk,-1h5,-jt,-1b,ez,111,22s,3v2,62q,72y,5uk,3sp,27n,17h,mv,bn,5m,2n,1d,n,a,7,2,-2,7,-3,-1;12s,-1,0,1,8,m,1q,3j,68,a1,fe,m8,v5,16a,1j9,1vz,25y,2ad,280,1zq,1nv,1au,yy,oo,ge,a8,67,3f,1u,10,h,5,5,5,-4,5,-1,-3,3,-1,2;38n,-2,1,3,c,14,2q,54,8e,ca,gi,kv,pd,uc,105,16u,1e8,1ls,1sc,1wp,1xb,1tc,1l6,19v,xk,mj,e5,88,4i,2c,14,l,b,4,3,-1,3,-3,0,5,-5;c0y,1,-3,-8,-u,-2r,-67,-ap,-er,-h6,-h7,-f2,-ba,-5s,1v,bn,nh,10v,1fc,1td,247,28l,24k,1sw,1d2,xk,la,ch,6v,3j,1v,p,h,7,0,9,-3,0,2,-1,-2;tq5,0,-9,-z,-3x,-cf,-t0,-1gp,-268,-2qc,-2xr,-2re,-2c1,-1s3,-168,-kl,c,kk,154,1pc,26w,2ha,2gs,25a,1n9,14s,py,f3,8h,4a,26,11,k,6,5,1,2,2,-4,5,-4;1d01,-2,1,-3,-n,-26,-5n,-cf,-pc,-1fj,-2wo,-5jc,-8j9,-933,-6hy,-3kd,-1ll,-c2,of,1pm,2v9,3yg,4gu,438,33x,22g,19q,q6,e7,7b,3i,1s,u,e,a,-2,2,6,-4,3,0;1lo,0,0,5,i,1m,44,8m,g7,t3,1eg,2bo,3kr,4us,5et,4qb,39p,1qb,ek,-n7,-1el,-1u5,-1wp,-1ok,-1al,-w4,-kg,-c1,-6k,-3h,-1p,-t,-d,-9,-5,2,-2,-2,0,2,-1;3ag,-1,4,8,x,2y,76,en,q5,17i,1vr,2pk,3ji,43r,42i,3dl,2bu,19a,b7,-g0,-zb,-19w,-1bi,-161,-wl,-mp,-ej,-8o,-4o,-2h,-1b,-h,-c,-5,0,-6,2,1,-1,-2,2;a7n,2,1,g,1j,50,bw,ml,108,1fk,1tp,242,28y,27i,1z8,1l2,13p,mi,6v,-5s,-em,-jg,-k9,-i2,-e5,-9x,-6d,-3s,-26,-13,-i,-a,-5,-2,-2,2,-1,1,-6,6,-5;1d26,2,-1,-3,-g,-1g,-3p,-7s,-ek,-pv,-18f,-212,-34b,-4av,-4yo,-4jg,-39j,-1rz,-fd,nm,1f1,1tj,1up,1lo,17q,tt,it,b3,60,37,1i,t,c,5,5,0,3,2,-4,-2,6;w2,1,1,4,k,1s,4x,bt,sb,23e,667,en3,ed7,679,27z,uk,b6,w,-85,-kv,-190,-2ne,-56m,-7ui,-7qt,-5an,-31i,-1mf,-u4,-f6,-79,-3e,-1t,-s,-d,-7,-5,0,-3,2,-2;1pq,-2,1,a,12,3p,9t,n6,1i9,3r8,90h,e18,a6d,4kd,1va,s4,ab,-f,-aj,-p2,-1fb,-2t3,-4zt,-6xn,-6oj,-4pv,-2ty,-1k9,-tk,-ez,-7d,-3c,-1s,-t,-e,-8,-3,-4,4,-2,1;5g5,-2,8,y,3q,ca,vv,202,45p,7nn,a6y,8de,4uk,2g3,16y,jt,6g,-3m,-em,-uo,-1m0,-2w0,-4ld,-5th,-5gv,-3z9,-2i2,-1f9,-rq,-e6,-6v,-3d,-1n,-p,-j,0,-8,-4,6,-5,2;gz1,4,n,2u,aj,xo,28x,477,60x,6cb,4w4,32u,1si,10c,jj,8v,10,-6g,-g1,-va,-1lu,-2uu,-4j8,-5r8,-5fq,-3za,-2if,-1fl,-rw,-ec,-6x,-3c,-1k,-z,-8,-d,0,4,-b,6,-2;1e4r,0,2,3,1,4,4,4,3,1,-2,-8,-f,-q,-1d,-2c,-43,-6y,-cf,-n2,-19l,-2ld,-4za,-7i5,-7j2,-5a4,-33l,-1o8,-vc,-fr,-7n,-3k,-1p,-11,-a,-f,2,2,-6,-2,8;1po,-1,-5,-h,-1p,-4t,-8w,-b3,-9y,-7a,-4t,-31,-1u,-13,-c,g,1l,3s,9j,ti,3km,i53,k4v,4p2,17d,fc,6h,38,1f,r,c,8,-2,4,1,1,-1,1,1,0,-1;7zb,-3,-t,-3o,-d4,-104,-1or,-1qj,-18c,-py,-eb,-7w,-4i,-2f,-10,c,22,52,cx,12r,4af,hkv,id6,54j,1ge,j7,8j,3x,22,y,f,b,-1,5,0,2,-2,3,-3,-1,4;nyh,-9,-1k,-6t,-p4,-243,-4c2,-5oy,-4o9,-2r6,-1f6,-q5,-dw,-7a,-38,1,3n,9q,nv,1to,5up,fn7,erq,5or,203,t9,dm,6j,3c,1j,v,d,6,2,1,4,-2,-3,5,-2,0;13o5,-5,-o,-30,-b5,-10x,-2n7,-5kz,-8wr,-8zb,-5my,-2t0,-1d2,-o0,-av,-2m,4x,fl,11y,2ne,6ws,dis,bzp,5o0,2cz,11w,ic,9a,4i,2c,17,d,d,4,-3,8,-1,-7,b,-6,0;1e53,-2,-1,-3,-a,-x,-2p,-6t,-hn,-1j1,-642,-jz3,-f3b,-44d,-15w,-de,-21,6s,m8,1up,6dh,hd1,e83,4uk,1n1,np,b0,59,2p,1a,n,7,7,3,-1,5,-2,-4,7,-3,-1;1e1,2,-1,-4,-a,-v,-1q,-2t,-3i,-3l,-33,-2e,-1a,0,20,56,ax,mp,1en,3gp,8h1,dvl,ac3,4pi,20e,x6,gc,8d,44,23,10,j,4,9,-1,3,-2,3,0,0,-3;5bo,-3,-3,-s,-2u,-8k,-hn,-pl,-rk,-o1,-i6,-ck,-86,-4f,-s,3k,a2,mg,1f2,3h9,8f5,dp6,a9s,4q8,216,xn,gn,8e,49,27,x,j,a,2,6,-7,5,0,1,-3,5;j2i,-3,-t,-3g,-ck,-128,-28j,-3ak,-3g5,-2qw,-1u3,-14p,-o7,-dh,-5h,1s,as,q2,1mu,3t8,8ej,ciu,9j8,4pv,25a,10q,ih,9g,4s,2g,14,k,7,9,-2,8,-4,-3,6,-2,-2;112d,-5,-i,-2k,-9r,-vm,-262,-4a5,-6mf,-7ek,-5rs,-3iu,-1yl,-11f,-hb,-37,ai,u5,1w7,462,89s,b8m,8nk,4ls,288,13l,kd,ai,5e,2p,1b,l,e,1,a,-8,5,2,-5,3,3;1dxm,1,-2,-1,-e,-1b,-3i,-8k,-ks,-1l1,-529,-ecr,-g8o,-6r1,-27m,-qe,-3w,dy,17t,3cg,8wq,f2l,aaf,48q,1pr,rk,dd,6r,3e,1o,v,f,5,1,1,5,-4,6,-5,4,0;1pc,-1,-1,0,5,i,1a,2j,4b,6i,96,c9,ga,m1,vk,1bg,21x,37c,4rq,68v,6ms,5k9,3wh,2gf,1gk,ua,h7,9f,4z,2i,1b,k,9,7,1,3,0,-3,5,-5,5;4dl,0,-2,-2,-8,-i,-14,-1p,-1w,-1d,3,2e,5y,bh,ks,10e,1q3,2v1,4hx,683,6wt,5x2,450,2kf,1i4,uu,he,9h,50,2j,17,p,7,6,3,2,0,-2,1,3,-4;eop,-1,-7,-y,-3j,-as,-nv,-138,-1e4,-1gk,-1as,-10p,-p1,-ci,2p,m8,1e4,2jy,48p,64k,71c,64y,4ai,2n0,1j3,v4,hj,9h,52,2f,1d,h,d,4,5,-1,1,-2,3,-2,2;wyh,1,-c,-1m,-6a,-js,-1as,-2eh,-3l7,-4di,-4bh,-3jf,-2j8,-1kt,-pp,42,11t,2af,40v,5zk,70y,676,4cf,2ny,1je,v8,hh,9h,51,2k,16,p,7,6,4,-3,3,6,-9,2,5;1dm4,-1,-3,-5,-f,-1j,-44,-9f,-kk,-1al,-33x,-76e,-bx2,-ajt,-5hf,-25e,-au,17x,3cy,6qq,9tf,8sr,5ax,2px,1dd,ph,dj,75,3p,1u,x,g,6,4,-1,7,-2,-6,8,-2,-1;27r,-2,1,6,k,1s,4e,90,g5,r4,174,1t6,2lh,3i9,4ct,4tn,4q9,45q,3d7,2kt,1wl,1da,ys,np,fe,9m,5n,39,1o,z,e,6,6,0,0,2,1,-4,5,-1,-2;49d,1,3,9,r,2j,66,c5,kt,wi,1b8,1sj,2bp,2wi,3h2,3x3,43p,3y3,3hn,2vg,287,1na,16c,sx,it,bo,6w,3y,25,12,g,c,4,3,1,-3,4,2,-4,-1,4;ce3,-1,2,5,b,z,2k,5d,9l,fd,mg,uw,14w,1ig,20z,2nc,390,3ms,3n5,39o,2no,1zw,1f4,yi,m6,dk,82,4g,2h,19,k,c,5,0,8,-8,4,2,-3,1,1;to1,-2,-4,-p,-2h,-7v,-hz,-vr,-19c,-1ij,-1jz,-1cs,-z0,-ea,eg,1di,2ei,39a,3ox,3kc,2zs,29e,1l6,120,nz,em,8h,4u,2i,1c,m,e,1,5,2,0,0,0,0,-2,2;1dpb,1,-4,-3,-d,-13,-2u,-68,-ch,-ow,-1e3,-2rs,-527,-7b4,-6zq,-40l,-lp,2h8,52z,678,5at,3jo,247,17m,om,du,7r,45,2a,13,i,d,3,2,-1,5,-2,-1,-1,4,-3;zh,-2,-1,5,l,23,5j,db,w1,2dm,6xk,fbn,dk0,5mz,21w,u3,dt,6v,3e,1f,8,-l,-11,-15,-12,-u,-l,-e,-5,-5,-1,-3,0,0,-4,7,-2,-8,c,-5,-1;21z,2,1,a,18,48,b2,pq,1mq,3vo,8r1,daq,a5t,4vh,23s,yr,hh,9l,5l,3d,22,18,r,f,8,3,2,0,2,-3,1,0,-2,4,-5,6,-3,-2,4,-2,-2;7qp,1,7,v,36,ai,qx,1ln,339,5h3,822,8k5,6dg,3qm,1zj,11p,kp,bv,7c,4m,2z,21,1c,x,j,8,a,0,5,-2,1,1,0,0,0,-1,2,0,-1,-1,1;odz,-1,0,6,x,48,ea,119,274,3t1,4zy,4tf,3ji,26w,18q,on,dv,82,4v,32,1z,1b,v,j,c,7,4,0,3,0,-1,-1,1,1,-4,5,-1,-6,7,-2,0";
|
|
10
|
+
//# sourceMappingURL=image-plane-lattice-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-plane-lattice-data.js","sourceRoot":"","sources":["../../src/facade/image-plane-lattice-data.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,6HAA6H;AAC7H,iHAAiH;AAEjH;;;;GAIG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,itgBAAitgB,CAAC","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n// Generated by scripts/fit-image-plane-lattice.mjs; do not edit. Photivra's own fitted spectra (LHTSS, arXiv:1710.05732 v5),\n// fitted against CIE D65 and the CIE 1931 2° observer at fit time only; no CIE value is stored (THIRD_PARTY.md).\n\n/**\n * The 120 stored nodes of the print reflectance lattice (r, g, b indices in order, the neutral axis skipped), each 41 16-bit\n * reflectance codes at 380, 390, …, 780 nm (value / 65535), delta-coded along wavelength in base 36: nodes separated by \";\",\n * codes by \",\".\n */\nexport const IMAGE_PLANE_LATTICE_CODES = \"2lg,-2,1,4,j,1c,1u,-1,-71,-he,-m6,-ir,-cm,-7o,-4i,-2l,-1i,-y,-k,-d,-9,-5,-4,-1,-1,1,1,0,1,0,-1,1,-2,4,-3,3,-3,-3,8,-5,2;b3v,1,1,h,1j,3g,3o,-4n,-ts,-1vj,-2hl,-287,-1jh,-xl,-j6,-as,-65,-3o,-27,-1g,-x,-m,-e,-9,-4,-3,0,-2,1,1,-1,-2,2,1,-6,a,-5,-4,4,3,-7;stg,1,-6,-d,-1m,-66,-id,-17t,-2fp,-440,-5ei,-59d,-3wa,-2ex,-1d7,-r1,-f3,-8s,-5b,-3c,-26,-1f,-x,-l,-d,-7,-4,-2,-1,0,-3,2,1,0,-5,7,-2,-5,6,0,-4;1dky,2,1,-5,-l,-23,-5j,-db,-w1,-2dm,-6xk,-fbn,-dk0,-5mz,-21w,-u3,-dt,-6v,-3e,-1f,-8,l,11,15,12,u,l,e,5,5,1,3,0,0,4,-7,2,8,-c,5,1;4g,-2,-1,0,-1,-1,9,n,1a,2e,4b,7r,e3,o5,z1,wg,69,-m8,-ux,-oy,-gh,-a2,-63,-3n,-25,-18,-o,-d,-9,-2,-3,1,-2,2,-1,0,1,-5,4,3,-5;25w,-1,0,2,b,w,21,3t,5t,7m,8n,89,65,1w,-4c,-am,-em,-fi,-e0,-bf,-8r,-6d,-4i,-31,-1y,-18,-n,-f,-8,-1,-1,-6,2,2,-3,4,-3,-4,7,-5,4;bam,1,-4,-9,-10,-36,-7r,-er,-n9,-vl,-11e,-13h,-12h,-zo,-vn,-qs,-ln,-gx,-cy,-9q,-78,-57,-3r,-2j,-1o,-10,-n,-b,-6,-3,0,-4,2,-1,-3,4,0,-2,1,0,1;tak,-4,-9,-12,-40,-cy,-v5,-1mu,-2jw,-3ei,-3uk,-3qc,-36x,-2i1,-1u6,-1ar,-we,-mh,-fp,-b2,-7u,-5i,-3v,-2n,-1o,-11,-m,-c,-6,-2,-2,-4,3,-1,-2,4,-3,-2,6,-3,1;1d4e,0,-2,-8,-q,-2j,-6q,-fd,-xx,-260,-543,-abl,-cl6,-89y,-3xg,-1sg,-uz,-fi,-7g,-2o,f,2h,3m,3x,3i,2r,1w,17,n,d,8,2,0,2,-1,3,0,-4,4,-1,-1;gj,0,-1,2,4,h,19,2r,5e,a6,j5,zw,1te,30e,3vx,31r,j6,-1zy,-37a,-2xp,-22i,-1ah,-ry,-gj,-9n,-5j,-35,-1q,-y,-f,-a,-2,-2,-2,0,-1,1,0,0,1,-1;219,-1,1,6,l,1t,4k,96,gf,r8,166,1o9,24x,2ar,1sz,lu,-ts,-1v8,-27v,-1zl,-1ij,-11v,-p4,-g0,-9w,-5u,-3h,-1x,-z,-j,-9,-3,-4,0,-3,5,-4,-1,2,-1,3;96c,-2,3,c,17,3p,8k,fk,n9,tr,wl,ub,m9,7l,-dj,-10o,-1io,-1qd,-1o1,-1f4,-13y,-tb,-ko,-dy,-8y,-5i,-39,-1t,-z,-h,-9,-7,2,-3,-3,2,0,-2,4,-3,2;pzu,0,0,-6,-w,-2w,-74,-e3,-nf,-yh,-19l,-1jk,-1rr,-1yv,-24c,-25v,-222,-1tm,-1io,-17e,-x1,-ob,-he,-bx,-7t,-4u,-2v,-1m,-x,-e,-9,-5,1,-3,4,-8,3,5,-6,0,7;1cfq,-2,-1,-5,-r,-2m,-6o,-ea,-ry,-1h3,-2q8,-4pf,-6xs,-7yd,-6sm,-4mw,-2u9,-1ou,-zo,-kc,-as,-4r,-1d,f,12,12,u,k,9,7,5,1,2,-6,8,-5,2,0,-2,0,6;wv,2,2,3,a,16,34,6s,dr,rq,1ko,36m,5sn,81s,76v,3wj,kp,-2du,-53t,-6mf,-5y3,-427,-2f6,-1dg,-ro,-fg,-8l,-4o,-2f,-1b,-m,-6,-8,-2,2,-8,5,5,-a,4,-2;276,3,2,9,u,2s,71,ez,sx,1hz,2oo,4du,5z5,67t,4le,23s,-dp,-2p6,-4ol,-5l3,-4zg,-3ky,-2a8,-1df,-su,-gi,-9d,-54,-2p,-1g,-o,-8,-7,-4,1,-4,1,5,-9,4,2;7ws,1,5,l,2e,7n,is,114,1r2,2nd,3ia,3yy,3so,2z9,1ob,4s,-1hh,-30h,-45u,-4i1,-3yq,-2zd,-219,-1av,-sp,-gz,-9t,-5g,-2w,-1j,-n,-c,-a,-1,-2,2,-1,-3,3,-1,-3;mzc,-2,4,p,2o,8i,jc,xx,1bz,1kw,1lg,1dk,zc,et,-d7,-1bx,-2ek,-3dq,-3zk,-3zb,-3f1,-2lm,-1ts,-17h,-rc,-gh,-9o,-5d,-2w,-1f,-s,-e,-4,-2,-6,5,-2,-8,b,-2,-6;1ced,-1,0,-6,-i,-1l,-3y,-82,-ec,-no,-10w,-1is,-25m,-2xb,-3qo,-4dy,-4na,-4fd,-3u0,-330,-2ci,-1pp,-17s,-tu,-je,-c0,-74,-43,-24,-17,-i,-6,-a,3,-3,-1,1,-4,4,-1,-1;fc,2,1,3,a,x,2p,6t,hn,1j1,642,jz3,f3b,44d,15w,de,21,-6s,-m8,-1up,-6dh,-hd1,-e83,-4uk,-1n1,-np,-b0,-59,-2p,-1a,-n,-7,-7,-3,1,-5,2,4,-7,3,1;z6,-1,4,7,p,2j,6q,gp,178,3lt,b8d,i1p,94j,2zd,10v,cn,r,-a4,-tv,-2b9,-6ww,-fhj,-cxt,-57h,-1yg,-tu,-e4,-6y,-3i,-1n,-y,-b,-7,-2,-1,-7,4,2,-2,-3,5;3oa,3,6,w,37,aq,t5,1zh,4qb,a2i,d19,88i,3nd,1jm,ni,7x,-2r,-fa,-13g,-2s4,-75b,-did,-bmq,-5hk,-2az,-119,-i5,-93,-4k,-2a,-14,-g,-b,-5,1,-4,-1,5,-8,4,2;ckj,0,p,3g,d4,170,310,63l,8v0,806,4qu,2cn,15q,kp,9e,20,-4y,-f2,-10k,-2kp,-6tx,-dp9,-c7z,-5oz,-2c8,-11b,-i0,-8y,-4j,-28,-13,-i,-9,-4,-2,0,-2,-5,5,4,-8;1cur,1,5,h,1p,4t,8w,b3,9y,7a,4t,31,1u,13,c,-g,-1l,-3s,-9j,-ti,-3km,-i53,-k4v,-4p2,-17d,-fc,-6h,-38,-1f,-r,-c,-8,2,-4,-1,-1,1,-1,-1,0,1;1p,-3,-1,0,-1,-1,-2,0,3,4,6,6,6,8,9,f,m,z,1h,2f,3z,6s,bn,jd,t7,118,12b,vh,l7,ce,6j,34,1p,p,f,6,4,-2,5,-1,1;4ia,-2,-8,-14,-4d,-ci,-nu,-ua,-rj,-k6,-da,-8b,-5a,-3a,-1y,-z,-6,l,1g,2o,4j,7j,c2,i7,oc,re,pc,ja,cd,71,3l,1v,w,c,d,-3,4,6,-7,4,-1;hlr,-7,-r,-39,-cc,-11d,-26g,-35y,-39f,-2k9,-1p5,-11n,-mx,-dx,-8a,-4n,-23,-8,1f,36,4v,6p,87,8y,8h,6z,50,37,1u,11,h,8,7,-1,4,-3,1,0,1,2,-4;yiv,-4,-k,-2f,-90,-t1,-1ya,-3q6,-5mk,-6g4,-5gh,-3of,-28i,-1b8,-re,-fv,-8z,-4q,-1w,6,1m,2p,35,36,2n,23,1a,y,f,7,7,2,-2,3,-1,4,-4,-2,4,-1,-4;1dn0,0,1,-3,-k,-1y,-58,-ct,-v3,-2ci,-711,-fsh,-dj7,-5ef,-1x8,-re,-bq,-4m,-c,34,6q,ax,fq,jy,lw,k7,g0,at,6k,3i,1p,x,f,a,2,1,-1,5,1,-5,2;6w,-1,2,-2,-1,3,d,q,1d,2e,3q,5u,8r,cs,hm,l7,kr,eh,4d,-52,-ac,-bd,-9x,-7j,-57,-3c,-21,-15,-n,-a,-7,-3,-3,2,1,-3,1,1,0,-3,1;cqu,-2,-6,-t,-2y,-98,-kr,-yy,-1ac,-1f0,-1ci,-15l,-xk,-q0,-j7,-dm,-94,-5p,-33,-14,b,17,1m,1n,1d,10,p,d,a,4,2,1,-1,3,-1,-1,1,0,3,-6,5;v2u,-4,-a,-1i,-5x,-iz,-18y,-2b6,-3gw,-4am,-4cs,-3pq,-2th,-1zk,-1c3,-ve,-k3,-cm,-7e,-40,-1l,1,u,15,14,u,l,d,a,1,2,2,-1,1,5,-a,5,2,-3,1,3;1d73,-3,-2,-7,-s,-2f,-6h,-ez,-xc,-25r,-576,-ane,-csw,-841,-3qe,-1nn,-rc,-by,-33,38,8p,du,i1,ka,jk,g6,bq,7i,4b,2c,15,n,8,4,4,-1,2,-1,0,4,-7;jo,2,0,0,4,i,1e,2y,5m,aa,ie,wa,1j2,2er,35v,2xj,1f8,-jv,-20n,-2hd,-25x,-1ks,-11s,-nv,-ei,-8k,-4z,-2r,-1h,-r,-e,-5,-3,-2,0,-1,1,1,-4,4,-4;28t,-1,1,6,k,1r,4a,8k,ew,nx,zp,1d4,1pp,1w1,1o7,yq,-17,-xy,-1i5,-1mm,-1g6,-14u,-tk,-k3,-cx,-7y,-4o,-2r,-1b,-t,-c,-7,0,-6,3,-3,0,2,0,-2,2;9qx,-1,1,6,t,2f,5o,a4,eu,il,k1,ij,dt,5n,-6i,-kg,-wv,-14l,-16u,-14a,-ym,-rp,-kx,-ev,-9z,-6a,-3s,-26,-16,-n,-8,-5,-5,-1,-1,3,-2,-3,4,0,-3;qsr,-3,-1,-g,-1n,-5a,-ce,-n5,-zx,-1cp,-1mx,-1t7,-1vy,-1w2,-1u4,-1px,-1jv,-1cl,-14z,-xh,-ql,-kh,-f9,-au,-7b,-4l,-2v,-1k,-w,-i,-7,0,-5,0,3,-7,3,0,-1,-1,4;1cis,3,1,-7,-q,-2i,-6l,-e6,-rw,-1hn,-2so,-4vx,-77r,-84b,-6p1,-4e5,-2ky,-1g3,-r0,-b6,-t,5y,9f,ab,94,6z,4r,2w,1o,v,h,4,4,3,2,0,0,3,-3,-2,2;10b,-4,0,3,d,17,39,74,e6,s2,1jp,30n,5bs,7ew,6yx,46b,13m,-1m4,-42t,-5q9,-5pc,-4bw,-2sj,-1nx,-yj,-jk,-b1,-61,-35,-1n,-t,-d,-5,-6,-1,2,-3,-4,6,1,-5;2cn,2,0,a,w,2u,74,f0,sn,1gc,2jf,41y,5hz,5v7,4le,2e9,44,-1zp,-3tn,-4vx,-4qu,-3ps,-2ja,-1lg,-yi,-k4,-bj,-6e,-3c,-1s,-u,-c,-7,-8,2,-2,1,1,-7,7,-2;88v,-1,8,m,2d,7d,hu,yz,1mr,2fr,37d,3n5,3js,2w6,1rq,ec,-11n,-2el,-3hd,-3yl,-3pu,-2zg,-25h,-1fo,-wk,-jl,-bk,-6c,-3h,-1r,-v,-f,-8,-1,-1,-6,4,-1,-1,-2,3;nit,0,4,m,26,70,g1,s5,13u,1bf,1cb,166,ul,dd,-ak,-143,-20l,-2u8,-3ea,-3i2,-35h,-2iz,-1uz,-19z,-tp,-i9,-av,-61,-3c,-1n,-v,-b,-8,-5,0,-3,1,1,-3,3,0;1chi,1,-1,-3,-h,-1l,-40,-87,-en,-og,-12k,-1lv,-2an,-33s,-3w2,-4e6,-4ff,-40s,-3cx,-2n3,-1zy,-1gl,-11n,-px,-h0,-ao,-6b,-3n,-1w,-11,-j,-6,-4,-4,1,0,-2,1,-3,4,-3;i2,0,-1,3,c,13,33,7o,jj,1mv,63k,ikr,f9l,4mt,1d9,g8,35,-6c,-lc,-1og,-58p,-e9g,-fag,-6f6,-2au,-xq,-fk,-7k,-3s,-1s,-z,-d,-9,-3,-2,2,-4,-2,6,-3,-1;13g,1,2,b,r,2p,7a,hw,19c,3mp,ao8,h7f,9j7,3bm,16d,f2,1v,-9e,-s1,-22f,-5qf,-d41,-dk8,-6ih,-2lr,-14e,-j9,-9g,-4q,-2d,-15,-j,-7,-9,-1,-1,2,-1,-5,8,-6;3z9,5,8,t,3d,b3,tu,1zu,4m5,9ip,cgo,8dq,3x7,1pn,qo,9l,-1w,-ed,-10u,-2h6,-614,-bpf,-bux,-6hl,-2wr,-1c7,-no,-by,-5y,-32,-1e,-q,-d,-1,-8,3,-4,5,-5,-1,4;dfh,6,p,3c,co,15c,2vd,5o6,87p,7pr,4v1,2j5,1aa,nh,ay,2t,-4m,-et,-yz,-2c2,-5so,-bq9,-cav,-6qa,-2z8,-1cs,-nr,-bz,-60,-2y,-1j,-k,-f,-4,-4,-1,0,0,-1,1,-1;1d7p,3,0,a,u,2f,4u,6r,72,5z,4g,35,1z,14,b,-r,-2a,-58,-ci,-yt,-3go,-dll,-jvg,-75m,-23v,-rr,-c2,-5r,-2t,-1d,-o,-c,-2,-6,0,0,-1,2,-4,3,-2;6j,2,-1,0,-3,-1,-1,3,7,a,e,g,m,q,11,1i,2d,3o,61,a3,hr,w7,1ls,2nz,3oj,3wn,37o,25n,19k,oh,c5,5z,2v,1f,q,9,8,6,-6,5,-2;3xt,0,-5,-k,-28,-6r,-dz,-k3,-li,-ip,-e6,-9y,-6s,-4g,-2k,-y,m,2d,4x,8x,gc,u6,1j7,2lv,3pk,41j,3dx,2ac,1cm,q0,d2,69,35,1f,u,c,5,4,-1,3,-1;hfo,-7,-p,-34,-bh,-z2,-21y,-30r,-36d,-2k5,-1qe,-12z,-nw,-ef,-88,-3y,-m,2l,6h,c1,l2,zs,1lt,2c2,2u7,2re,26y,1gj,v4,go,8g,40,20,z,e,e,2,-3,6,1,-3;zc0,-4,-g,-2j,-9k,-up,-22u,-40a,-62i,-6ts,-5je,-3k4,-22r,-166,-n7,-bu,-4f,1b,74,e6,nx,11k,1hy,1wp,21r,1tm,1dj,wb,iu,a3,52,2i,17,k,f,-3,7,1,1,-5,9;1dmw,-1,-1,-8,-k,-1x,-58,-cl,-ua,-290,-6ma,-f4e,-dvv,-5te,-23a,-tg,-bv,-3a,2t,9f,j4,zr,1r0,2se,3ny,3q3,2zj,1z8,15m,mc,b3,5b,2o,1e,i,f,3,-1,8,-4,-1;ch,-2,1,-1,1,4,d,v,1i,2e,3h,4p,6a,8a,as,dz,ht,mg,rk,wp,111,13b,12l,yb,r8,je,cn,7k,47,26,13,i,9,5,2,1,1,-3,7,-6,2;2zj,2,-2,-2,-9,-u,-1v,-35,-49,-4w,-4u,-43,-35,-1m,e,33,6k,ax,gp,o3,x5,16r,1ef,1gl,1bh,114,pp,fy,92,4s,2c,17,l,8,4,5,0,2,-4,6,-5;dv7,-1,-b,-17,-4g,-dn,-u7,-1d4,-1pn,-1r0,-1j0,-177,-vt,-m4,-ds,-6q,-c,5v,cq,kw,un,157,1e4,1hn,1dg,136,rh,h3,9s,56,2l,17,n,b,2,6,0,0,3,-2,0;wf0,-1,-f,-1y,-73,-mg,-1hd,-2ra,-44h,-4yr,-4r0,-3qt,-2me,-1pe,-11f,-kq,-8r,l,97,i7,s4,129,1ad,1da,194,zm,ov,fj,8t,4n,2d,16,f,e,2,4,0,2,-1,-1,2;1d9s,-1,-1,-6,-p,-2b,-66,-e9,-vv,-231,-53m,-ape,-d1h,-86d,-3on,-1l7,-oc,-7r,3k,ep,sp,1c4,209,2m4,2td,2gw,1tp,160,o9,cw,6h,31,1j,u,b,8,2,0,4,-3,0;rd,-3,-1,2,6,l,1j,39,5z,a8,gs,qn,14j,1mt,25b,2e5,243,1cl,db,-h4,-zo,-15m,-125,-u7,-le,-dx,-8o,-4u,-2r,-1d,-q,-9,-7,-4,-2,2,-3,-1,1,2,-1;2ol,2,1,4,h,1h,3m,71,bu,hz,p7,wv,144,19t,1bo,17m,xh,ju,5f,-6n,-eg,-hw,-hg,-ep,-b0,-7g,-4r,-2q,-1j,-r,-h,-4,-5,0,-1,-2,1,3,-4,1,1;s7q,1,-7,-t,-2t,-8x,-l0,-129,-1l7,-21e,-2aa,-2ah,-243,-1te,-1g7,-12g,-pn,-er,-5r,1a,6g,9j,ai,9t,7x,5p,3q,28,18,q,b,3,3,7,-7,7,-4,1,1,0,-5;1cpu,-2,-2,-5,-p,-2e,-6a,-dm,-r7,-1hh,-2vh,-56h,-7ql,-8h8,-6kw,-40c,-24z,-z3,-77,dv,vn,1af,1jm,1ko,1df,11e,pg,fh,8q,4n,2b,12,l,6,8,0,2,1,-2,2,3;18z,-2,0,3,d,1d,3n,7s,f6,sl,1h6,2nv,4ea,62y,6ai,4lb,27u,1e,-1uy,-3dj,-46u,-42b,-39f,-2ab,-1gr,-vw,-im,-ag,-5j,-2v,-1f,-l,-d,-6,-3,0,-3,-1,2,1,-2;2qp,3,2,8,w,2x,77,ey,ro,1cc,27x,3d8,4hz,511,4fs,2y8,177,-fm,-1v4,-2xx,-3gf,-3bb,-2ps,-1yz,-1b1,-tb,-hd,-9u,-5a,-2q,-1b,-n,-c,-4,-4,-2,1,3,-4,-3,6;93a,3,3,l,20,6c,fd,tn,1cn,1ys,2ji,2ws,2yc,2me,1x3,z5,-1r,-10l,-1ub,-2ef,-2lj,-2fm,-20u,-1in,-11j,-o1,-ek,-8b,-4j,-2c,-15,-j,-8,-9,2,-4,-2,8,-a,6,-2;osm,0,1,c,15,3u,8o,f8,lk,px,qt,ny,hv,8e,-58,-m3,-149,-1ky,-1xp,-243,-22y,-1v6,-1j7,-15p,-t1,-it,-bj,-6l,-3m,-1w,-v,-f,-9,-4,1,-3,0,-2,0,2,-1;1cpw,-3,-2,-4,-i,-1j,-3y,-88,-f0,-pk,-15r,-1so,-2ml,-3k2,-4a9,-4fl,-3xv,-33d,-271,-1fg,-ue,-fm,-6g,-1f,s,1d,19,p,l,a,1,7,-1,1,1,-2,1,-4,7,-3,3;ot,1,0,3,e,1h,40,9p,nv,1uw,61a,g0o,f3j,5oo,1v2,nt,6q,-3v,-gt,-16t,-31p,-7nu,-d2q,-aen,-50w,-28e,-11x,-ik,-98,-4k,-24,-12,-k,-6,-7,2,-2,-4,2,1,0;1eh,-1,0,7,z,36,8k,kj,1ds,3nz,9lh,fdp,a4l,42t,1k0,lm,5f,-68,-li,-1fm,-3eg,-7l1,-bmc,-9fm,-4zn,-2do,-164,-l2,-ak,-59,-2j,-16,-n,-7,-8,0,0,-8,9,-5,-1;4pw,1,9,z,3k,bo,uz,1zy,4cl,8f1,b74,8i3,4hf,244,yw,e8,1b,-ao,-s8,-1q6,-3po,-78x,-a0x,-8ca,-4uj,-2i2,-1ae,-nr,-ca,-5z,-2x,-1f,-o,-d,-3,-7,1,0,0,-4,6;fc0,5,n,34,bi,118,2it,4ta,6xl,6zm,4yt,2vm,1kl,ua,f3,5b,-2w,-cg,-sh,-1ow,-3mo,-75n,-a2o,-8hs,-4yg,-2jz,-1bb,-o9,-cd,-66,-30,-1d,-o,-e,-5,-4,0,2,-6,3,-2;1dpm,-4,1,4,7,l,19,1x,2f,2h,28,1s,17,j,-d,-1p,-3t,-7o,-fz,-10a,-2l9,-6zo,-dhy,-bjk,-5hl,-2cz,-137,-iv,-9d,-4m,-25,-10,-j,-b,0,-8,3,-4,5,-5,7;h9,2,-1,-1,-3,-2,-6,-7,-8,-7,-3,2,9,m,1a,2d,47,7d,da,pb,1fb,2zy,5tj,8fr,7sf,520,2tv,1hn,rk,dt,6l,36,1j,u,9,9,2,4,-1,0,0;45l,-1,-4,-i,-21,-65,-cw,-j2,-l7,-j3,-f1,-at,-7h,-4q,-2e,-3,2i,64,c8,o4,1dj,2x5,5qo,8gu,7wt,557,2ve,1id,rt,dy,6q,33,1p,n,f,4,5,3,-1,0,1;hn1,-5,-p,-30,-ba,-yb,-20h,-2zc,-365,-2l6,-1rv,-148,-op,-eq,-7y,-2x,1o,6x,ex,tb,1lq,358,5jj,7ff,6s9,4kx,2oh,1gg,re,ds,6r,3b,1h,q,i,2,3,4,-3,1,3;zte,-5,-l,-2i,-9m,-ux,-23o,-42v,-67t,-6zm,-5m6,-3jy,-21q,-14u,-lm,-9o,-13,75,hw,z7,1tx,3ah,56f,6by,5nd,3xd,2e4,1c9,pr,d4,6j,2x,1i,s,a,9,2,0,4,-3,3;1doz,1,0,-4,-j,-1s,-4t,-bm,-ru,-22d,-64l,-eop,-egk,-67b,-27h,-u6,-as,-b,99,nd,1f8,332,62e,8rk,7wd,4zh,2qk,1fc,q8,d3,69,2z,1k,n,f,2,4,6,-4,-1,7;mt,1,-2,-2,0,3,g,v,1h,27,30,3t,4x,69,8c,bo,h2,pu,144,1qz,2of,3sf,4ls,4k0,3o1,2it,1kp,wn,hs,95,4i,28,x,n,5,b,-2,-1,3,1,-4;3hs,0,0,-4,-j,-1m,-3n,-62,-7y,-8p,-86,-6u,-4x,-2m,i,4l,aa,ir,w7,1i6,2gq,3r4,4w4,538,46n,2vn,1sb,10p,jy,ab,4y,2f,16,m,9,3,4,3,-3,0,2;ev5,-3,-a,-1i,-5k,-h4,-11c,-1np,-20p,-1zc,-1ng,-18c,-v5,-k8,-b3,-2y,5e,fe,to,1fs,2e0,3nq,4so,50w,45q,2vl,1sh,10y,k2,ab,50,2j,13,m,e,-3,6,4,-5,3,0;xgn,-1,-h,-23,-7n,-oe,-1mb,-31f,-4kh,-5fv,-516,-3s6,-2io,-1k0,-vn,-ei,-10,c1,s5,1f3,2cm,3jg,4jx,4q1,3wy,2q9,1pn,zj,jc,a0,4x,2a,16,l,6,b,-2,2,2,-1,-2;1df8,-1,-1,-7,-k,-22,-5j,-cv,-t2,-1xo,-4wo,-au8,-dky,-8bg,-3lk,-1h5,-jt,-1b,ez,111,22s,3v2,62q,72y,5uk,3sp,27n,17h,mv,bn,5m,2n,1d,n,a,7,2,-2,7,-3,-1;12s,-1,0,1,8,m,1q,3j,68,a1,fe,m8,v5,16a,1j9,1vz,25y,2ad,280,1zq,1nv,1au,yy,oo,ge,a8,67,3f,1u,10,h,5,5,5,-4,5,-1,-3,3,-1,2;38n,-2,1,3,c,14,2q,54,8e,ca,gi,kv,pd,uc,105,16u,1e8,1ls,1sc,1wp,1xb,1tc,1l6,19v,xk,mj,e5,88,4i,2c,14,l,b,4,3,-1,3,-3,0,5,-5;c0y,1,-3,-8,-u,-2r,-67,-ap,-er,-h6,-h7,-f2,-ba,-5s,1v,bn,nh,10v,1fc,1td,247,28l,24k,1sw,1d2,xk,la,ch,6v,3j,1v,p,h,7,0,9,-3,0,2,-1,-2;tq5,0,-9,-z,-3x,-cf,-t0,-1gp,-268,-2qc,-2xr,-2re,-2c1,-1s3,-168,-kl,c,kk,154,1pc,26w,2ha,2gs,25a,1n9,14s,py,f3,8h,4a,26,11,k,6,5,1,2,2,-4,5,-4;1d01,-2,1,-3,-n,-26,-5n,-cf,-pc,-1fj,-2wo,-5jc,-8j9,-933,-6hy,-3kd,-1ll,-c2,of,1pm,2v9,3yg,4gu,438,33x,22g,19q,q6,e7,7b,3i,1s,u,e,a,-2,2,6,-4,3,0;1lo,0,0,5,i,1m,44,8m,g7,t3,1eg,2bo,3kr,4us,5et,4qb,39p,1qb,ek,-n7,-1el,-1u5,-1wp,-1ok,-1al,-w4,-kg,-c1,-6k,-3h,-1p,-t,-d,-9,-5,2,-2,-2,0,2,-1;3ag,-1,4,8,x,2y,76,en,q5,17i,1vr,2pk,3ji,43r,42i,3dl,2bu,19a,b7,-g0,-zb,-19w,-1bi,-161,-wl,-mp,-ej,-8o,-4o,-2h,-1b,-h,-c,-5,0,-6,2,1,-1,-2,2;a7n,2,1,g,1j,50,bw,ml,108,1fk,1tp,242,28y,27i,1z8,1l2,13p,mi,6v,-5s,-em,-jg,-k9,-i2,-e5,-9x,-6d,-3s,-26,-13,-i,-a,-5,-2,-2,2,-1,1,-6,6,-5;1d26,2,-1,-3,-g,-1g,-3p,-7s,-ek,-pv,-18f,-212,-34b,-4av,-4yo,-4jg,-39j,-1rz,-fd,nm,1f1,1tj,1up,1lo,17q,tt,it,b3,60,37,1i,t,c,5,5,0,3,2,-4,-2,6;w2,1,1,4,k,1s,4x,bt,sb,23e,667,en3,ed7,679,27z,uk,b6,w,-85,-kv,-190,-2ne,-56m,-7ui,-7qt,-5an,-31i,-1mf,-u4,-f6,-79,-3e,-1t,-s,-d,-7,-5,0,-3,2,-2;1pq,-2,1,a,12,3p,9t,n6,1i9,3r8,90h,e18,a6d,4kd,1va,s4,ab,-f,-aj,-p2,-1fb,-2t3,-4zt,-6xn,-6oj,-4pv,-2ty,-1k9,-tk,-ez,-7d,-3c,-1s,-t,-e,-8,-3,-4,4,-2,1;5g5,-2,8,y,3q,ca,vv,202,45p,7nn,a6y,8de,4uk,2g3,16y,jt,6g,-3m,-em,-uo,-1m0,-2w0,-4ld,-5th,-5gv,-3z9,-2i2,-1f9,-rq,-e6,-6v,-3d,-1n,-p,-j,0,-8,-4,6,-5,2;gz1,4,n,2u,aj,xo,28x,477,60x,6cb,4w4,32u,1si,10c,jj,8v,10,-6g,-g1,-va,-1lu,-2uu,-4j8,-5r8,-5fq,-3za,-2if,-1fl,-rw,-ec,-6x,-3c,-1k,-z,-8,-d,0,4,-b,6,-2;1e4r,0,2,3,1,4,4,4,3,1,-2,-8,-f,-q,-1d,-2c,-43,-6y,-cf,-n2,-19l,-2ld,-4za,-7i5,-7j2,-5a4,-33l,-1o8,-vc,-fr,-7n,-3k,-1p,-11,-a,-f,2,2,-6,-2,8;1po,-1,-5,-h,-1p,-4t,-8w,-b3,-9y,-7a,-4t,-31,-1u,-13,-c,g,1l,3s,9j,ti,3km,i53,k4v,4p2,17d,fc,6h,38,1f,r,c,8,-2,4,1,1,-1,1,1,0,-1;7zb,-3,-t,-3o,-d4,-104,-1or,-1qj,-18c,-py,-eb,-7w,-4i,-2f,-10,c,22,52,cx,12r,4af,hkv,id6,54j,1ge,j7,8j,3x,22,y,f,b,-1,5,0,2,-2,3,-3,-1,4;nyh,-9,-1k,-6t,-p4,-243,-4c2,-5oy,-4o9,-2r6,-1f6,-q5,-dw,-7a,-38,1,3n,9q,nv,1to,5up,fn7,erq,5or,203,t9,dm,6j,3c,1j,v,d,6,2,1,4,-2,-3,5,-2,0;13o5,-5,-o,-30,-b5,-10x,-2n7,-5kz,-8wr,-8zb,-5my,-2t0,-1d2,-o0,-av,-2m,4x,fl,11y,2ne,6ws,dis,bzp,5o0,2cz,11w,ic,9a,4i,2c,17,d,d,4,-3,8,-1,-7,b,-6,0;1e53,-2,-1,-3,-a,-x,-2p,-6t,-hn,-1j1,-642,-jz3,-f3b,-44d,-15w,-de,-21,6s,m8,1up,6dh,hd1,e83,4uk,1n1,np,b0,59,2p,1a,n,7,7,3,-1,5,-2,-4,7,-3,-1;1e1,2,-1,-4,-a,-v,-1q,-2t,-3i,-3l,-33,-2e,-1a,0,20,56,ax,mp,1en,3gp,8h1,dvl,ac3,4pi,20e,x6,gc,8d,44,23,10,j,4,9,-1,3,-2,3,0,0,-3;5bo,-3,-3,-s,-2u,-8k,-hn,-pl,-rk,-o1,-i6,-ck,-86,-4f,-s,3k,a2,mg,1f2,3h9,8f5,dp6,a9s,4q8,216,xn,gn,8e,49,27,x,j,a,2,6,-7,5,0,1,-3,5;j2i,-3,-t,-3g,-ck,-128,-28j,-3ak,-3g5,-2qw,-1u3,-14p,-o7,-dh,-5h,1s,as,q2,1mu,3t8,8ej,ciu,9j8,4pv,25a,10q,ih,9g,4s,2g,14,k,7,9,-2,8,-4,-3,6,-2,-2;112d,-5,-i,-2k,-9r,-vm,-262,-4a5,-6mf,-7ek,-5rs,-3iu,-1yl,-11f,-hb,-37,ai,u5,1w7,462,89s,b8m,8nk,4ls,288,13l,kd,ai,5e,2p,1b,l,e,1,a,-8,5,2,-5,3,3;1dxm,1,-2,-1,-e,-1b,-3i,-8k,-ks,-1l1,-529,-ecr,-g8o,-6r1,-27m,-qe,-3w,dy,17t,3cg,8wq,f2l,aaf,48q,1pr,rk,dd,6r,3e,1o,v,f,5,1,1,5,-4,6,-5,4,0;1pc,-1,-1,0,5,i,1a,2j,4b,6i,96,c9,ga,m1,vk,1bg,21x,37c,4rq,68v,6ms,5k9,3wh,2gf,1gk,ua,h7,9f,4z,2i,1b,k,9,7,1,3,0,-3,5,-5,5;4dl,0,-2,-2,-8,-i,-14,-1p,-1w,-1d,3,2e,5y,bh,ks,10e,1q3,2v1,4hx,683,6wt,5x2,450,2kf,1i4,uu,he,9h,50,2j,17,p,7,6,3,2,0,-2,1,3,-4;eop,-1,-7,-y,-3j,-as,-nv,-138,-1e4,-1gk,-1as,-10p,-p1,-ci,2p,m8,1e4,2jy,48p,64k,71c,64y,4ai,2n0,1j3,v4,hj,9h,52,2f,1d,h,d,4,5,-1,1,-2,3,-2,2;wyh,1,-c,-1m,-6a,-js,-1as,-2eh,-3l7,-4di,-4bh,-3jf,-2j8,-1kt,-pp,42,11t,2af,40v,5zk,70y,676,4cf,2ny,1je,v8,hh,9h,51,2k,16,p,7,6,4,-3,3,6,-9,2,5;1dm4,-1,-3,-5,-f,-1j,-44,-9f,-kk,-1al,-33x,-76e,-bx2,-ajt,-5hf,-25e,-au,17x,3cy,6qq,9tf,8sr,5ax,2px,1dd,ph,dj,75,3p,1u,x,g,6,4,-1,7,-2,-6,8,-2,-1;27r,-2,1,6,k,1s,4e,90,g5,r4,174,1t6,2lh,3i9,4ct,4tn,4q9,45q,3d7,2kt,1wl,1da,ys,np,fe,9m,5n,39,1o,z,e,6,6,0,0,2,1,-4,5,-1,-2;49d,1,3,9,r,2j,66,c5,kt,wi,1b8,1sj,2bp,2wi,3h2,3x3,43p,3y3,3hn,2vg,287,1na,16c,sx,it,bo,6w,3y,25,12,g,c,4,3,1,-3,4,2,-4,-1,4;ce3,-1,2,5,b,z,2k,5d,9l,fd,mg,uw,14w,1ig,20z,2nc,390,3ms,3n5,39o,2no,1zw,1f4,yi,m6,dk,82,4g,2h,19,k,c,5,0,8,-8,4,2,-3,1,1;to1,-2,-4,-p,-2h,-7v,-hz,-vr,-19c,-1ij,-1jz,-1cs,-z0,-ea,eg,1di,2ei,39a,3ox,3kc,2zs,29e,1l6,120,nz,em,8h,4u,2i,1c,m,e,1,5,2,0,0,0,0,-2,2;1dpb,1,-4,-3,-d,-13,-2u,-68,-ch,-ow,-1e3,-2rs,-527,-7b4,-6zq,-40l,-lp,2h8,52z,678,5at,3jo,247,17m,om,du,7r,45,2a,13,i,d,3,2,-1,5,-2,-1,-1,4,-3;zh,-2,-1,5,l,23,5j,db,w1,2dm,6xk,fbn,dk0,5mz,21w,u3,dt,6v,3e,1f,8,-l,-11,-15,-12,-u,-l,-e,-5,-5,-1,-3,0,0,-4,7,-2,-8,c,-5,-1;21z,2,1,a,18,48,b2,pq,1mq,3vo,8r1,daq,a5t,4vh,23s,yr,hh,9l,5l,3d,22,18,r,f,8,3,2,0,2,-3,1,0,-2,4,-5,6,-3,-2,4,-2,-2;7qp,1,7,v,36,ai,qx,1ln,339,5h3,822,8k5,6dg,3qm,1zj,11p,kp,bv,7c,4m,2z,21,1c,x,j,8,a,0,5,-2,1,1,0,0,0,-1,2,0,-1,-1,1;odz,-1,0,6,x,48,ea,119,274,3t1,4zy,4tf,3ji,26w,18q,on,dv,82,4v,32,1z,1b,v,j,c,7,4,0,3,0,-1,-1,1,1,-4,5,-1,-6,7,-2,0\";\n"]}
|