signalk-livedepth-plugin 0.3.18 → 0.3.20
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 +40 -0
- package/README.md +22 -5
- package/dist/collector.d.ts +9 -1
- package/dist/collector.d.ts.map +1 -1
- package/dist/collector.js +23 -4
- package/dist/collector.js.map +1 -1
- package/dist/config.d.ts +41 -5
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +35 -7
- package/dist/config.js.map +1 -1
- package/dist/history.d.ts +5 -1
- package/dist/history.d.ts.map +1 -1
- package/dist/history.js +24 -8
- package/dist/history.js.map +1 -1
- package/dist/plugin.d.ts +4 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +121 -24
- package/dist/plugin.js.map +1 -1
- package/dist/streams/live.d.ts +4 -1
- package/dist/streams/live.d.ts.map +1 -1
- package/dist/streams/live.js +8 -3
- package/dist/streams/live.js.map +1 -1
- package/dist/tide.d.ts +85 -0
- package/dist/tide.d.ts.map +1 -0
- package/dist/tide.js +136 -0
- package/dist/tide.js.map +1 -0
- package/dist/tiles/core/tile-source.d.ts +7 -0
- package/dist/tiles/core/tile-source.d.ts.map +1 -1
- package/dist/tiles/core/tile-source.js.map +1 -1
- package/dist/tiles/seed.d.ts +6 -1
- package/dist/tiles/seed.d.ts.map +1 -1
- package/dist/tiles/seed.js +54 -21
- package/dist/tiles/seed.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -1
- package/public/js/renderer.js +44 -3
- package/public/js/renderer.js.map +2 -2
package/dist/plugin.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { join } from "path";
|
|
2
|
-
import { schema } from "./config.js";
|
|
2
|
+
import { schema, formUiSchema } from "./config.js";
|
|
3
3
|
import { createTileDB, createTileStore } from "./tiles/store.js";
|
|
4
4
|
import { createTileWriter } from "./tiles/writer.js";
|
|
5
|
-
import { seedFromHistory } from "./tiles/seed.js";
|
|
5
|
+
import { SEED_CURSOR_KEY, seedFromHistory } from "./tiles/seed.js";
|
|
6
|
+
import { TIDE_MODE_KEY, createSlackwaterTideProvider, createTideCorrection, datumLabel, shouldResetGrid, tideMode, } from "./tide.js";
|
|
6
7
|
import { registerBathymetryRoutes, registerSeedRoutes, } from "./tiles/api.js";
|
|
7
8
|
import { registerPlotterExtension } from "./plotterext/provider.js";
|
|
8
9
|
import { createCollector } from "./collector.js";
|
|
@@ -71,6 +72,10 @@ export function resolveTransducerOffset(app, config) {
|
|
|
71
72
|
starboard: config.sounder?.x ?? 0,
|
|
72
73
|
};
|
|
73
74
|
}
|
|
75
|
+
/** A parenthetical for rows dropped because the tide was unavailable. */
|
|
76
|
+
function skipNote(skipped) {
|
|
77
|
+
return skipped > 0 ? ` (${skipped} skipped: no tide prediction)` : "";
|
|
78
|
+
}
|
|
74
79
|
export default function createPlugin(app) {
|
|
75
80
|
let abortController = undefined;
|
|
76
81
|
// The gridded store served to chart clients. Built in start(), read by the
|
|
@@ -78,16 +83,35 @@ export default function createPlugin(app) {
|
|
|
78
83
|
let tileStore;
|
|
79
84
|
let config;
|
|
80
85
|
let transducer;
|
|
86
|
+
let tide;
|
|
87
|
+
/** The datum the store is in; also reported to chart clients. */
|
|
88
|
+
let tideState = "off";
|
|
81
89
|
let seedStatus = { running: false };
|
|
90
|
+
/** Bumped on every start/stop so a seed still winding down cannot overwrite
|
|
91
|
+
* the status of the run that replaced it. */
|
|
92
|
+
let seedGeneration = 0;
|
|
82
93
|
let running = false;
|
|
83
94
|
let routesRegistered = false;
|
|
84
95
|
const runSeed = async (resolution) => {
|
|
85
96
|
if (seedStatus.running)
|
|
86
|
-
return;
|
|
97
|
+
return "skipped";
|
|
87
98
|
const store = tileStore;
|
|
88
99
|
const cfg = config;
|
|
89
100
|
if (!store || !cfg)
|
|
90
|
-
return;
|
|
101
|
+
return "skipped";
|
|
102
|
+
// The store's datum is fixed once it holds cells: fold history with the
|
|
103
|
+
// same correction it was built with, and refuse rather than write raw rows
|
|
104
|
+
// into a datum grid.
|
|
105
|
+
if (tideState !== "off" && !tide) {
|
|
106
|
+
seedStatus = { running: false, error: "tide model unavailable" };
|
|
107
|
+
app.setPluginError("Cannot rebuild from history: the tide model is unavailable, so raw depths would be stored in the wrong datum.");
|
|
108
|
+
return "failed";
|
|
109
|
+
}
|
|
110
|
+
// If the plugin is stopped and started while this run is still finishing,
|
|
111
|
+
// the run is superseded: its store is closed and the new run owns the
|
|
112
|
+
// status.
|
|
113
|
+
const generation = seedGeneration;
|
|
114
|
+
const current = () => generation === seedGeneration;
|
|
91
115
|
seedStatus = { running: true };
|
|
92
116
|
app.setPluginStatus("Rebuilding bathymetry tiles from history…");
|
|
93
117
|
try {
|
|
@@ -97,21 +121,39 @@ export default function createPlugin(app) {
|
|
|
97
121
|
config: cfg,
|
|
98
122
|
resolution,
|
|
99
123
|
offset: transducer,
|
|
124
|
+
tide,
|
|
100
125
|
signal: abortController?.signal,
|
|
101
126
|
onProgress: (p) => {
|
|
127
|
+
if (!current())
|
|
128
|
+
return;
|
|
102
129
|
seedStatus = { running: !p.done, progress: p };
|
|
103
|
-
app.setPluginStatus(`Rebuilding bathymetry tiles: ${p.points} points over ${p.chunks} windows`);
|
|
130
|
+
app.setPluginStatus(`Rebuilding bathymetry tiles: ${p.points} points over ${p.chunks} windows${skipNote(p.skipped)}`);
|
|
104
131
|
},
|
|
105
132
|
});
|
|
133
|
+
if (!current())
|
|
134
|
+
return "aborted";
|
|
106
135
|
seedStatus = { running: false, progress };
|
|
107
|
-
|
|
136
|
+
if (!progress.done) {
|
|
137
|
+
app.setPluginStatus(`Bathymetry rebuild interrupted after ${progress.chunks} windows; it will resume on the next start.`);
|
|
138
|
+
return "aborted";
|
|
139
|
+
}
|
|
140
|
+
app.setPluginStatus(`Bathymetry rebuild complete: ${progress.points} points${skipNote(progress.skipped)}`);
|
|
141
|
+
return "completed";
|
|
108
142
|
}
|
|
109
143
|
catch (err) {
|
|
144
|
+
if (!current())
|
|
145
|
+
return "aborted";
|
|
110
146
|
seedStatus = { running: false, error: String(err) };
|
|
111
147
|
app.setPluginError(`Bathymetry rebuild failed: ${err}`);
|
|
148
|
+
return "failed";
|
|
112
149
|
}
|
|
113
150
|
};
|
|
114
|
-
const seed = {
|
|
151
|
+
const seed = {
|
|
152
|
+
run: async () => {
|
|
153
|
+
await runSeed();
|
|
154
|
+
},
|
|
155
|
+
status: () => seedStatus,
|
|
156
|
+
};
|
|
115
157
|
return {
|
|
116
158
|
id: "signalk-livedepth-plugin",
|
|
117
159
|
name: "LiveDepth",
|
|
@@ -119,24 +161,70 @@ export default function createPlugin(app) {
|
|
|
119
161
|
async start(startConfig, restart) {
|
|
120
162
|
config = startConfig;
|
|
121
163
|
app.debug("Starting signalk-livedepth-plugin");
|
|
164
|
+
// A new start supersedes any seed still winding down from the previous
|
|
165
|
+
// one (its signal is aborted and its store is closed).
|
|
166
|
+
seedGeneration++;
|
|
167
|
+
seedStatus = { running: false };
|
|
122
168
|
abortController = new AbortController();
|
|
123
169
|
tileStore = createTileStore(createTileDB(join(app.getDataDirPath(), `bathymetry-tiles.sqlite`)));
|
|
124
170
|
transducer = resolveTransducerOffset(app, config);
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
171
|
+
// Build the tide source before the collector starts, so the first
|
|
172
|
+
// sounding already goes through it. The station database loads here, once.
|
|
173
|
+
const configured = tideMode(config);
|
|
174
|
+
tideState = configured;
|
|
175
|
+
tide = undefined;
|
|
176
|
+
let collecting = true;
|
|
177
|
+
if (configured !== "off") {
|
|
178
|
+
try {
|
|
179
|
+
tide = createTideCorrection(await createSlackwaterTideProvider(), configured);
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
// A transient model failure must not clear or relabel an existing
|
|
183
|
+
// grid, nor write raw depths into a datum grid. Keep the stored
|
|
184
|
+
// datum, record nothing, and surface the error.
|
|
185
|
+
collecting = false;
|
|
186
|
+
const stored = tileStore.getMeta(TIDE_MODE_KEY);
|
|
187
|
+
tideState = stored === undefined ? "off" : stored;
|
|
188
|
+
app.setPluginError(`Tide correction is on but the tide model could not be loaded ` +
|
|
189
|
+
`(${err}); recording is paused and the existing grid is kept.`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (collecting) {
|
|
193
|
+
// The cells hold depths, not raw soundings, so a grid built in another
|
|
194
|
+
// datum cannot be corrected in place. Clearing is the only way to avoid
|
|
195
|
+
// silently mixing datums; the old seed cursor goes with it.
|
|
196
|
+
const reset = shouldResetGrid(tileStore.getMeta(TIDE_MODE_KEY), tideState);
|
|
197
|
+
if (reset) {
|
|
198
|
+
tileStore.clear();
|
|
199
|
+
tileStore.setMeta(SEED_CURSOR_KEY, "");
|
|
200
|
+
}
|
|
201
|
+
tileStore.setMeta(TIDE_MODE_KEY, tideState);
|
|
202
|
+
createCollector({
|
|
203
|
+
app,
|
|
204
|
+
config,
|
|
205
|
+
writer: createTileWriter(tileStore),
|
|
206
|
+
offset: transducer,
|
|
207
|
+
tide,
|
|
208
|
+
signal: abortController.signal,
|
|
209
|
+
});
|
|
210
|
+
app.setPluginStatus(tideState === "off"
|
|
211
|
+
? "Collecting depth into the bathymetry tile store"
|
|
212
|
+
: `Collecting depth into the bathymetry tile store, relative to ${datumLabel(tideState)}`);
|
|
213
|
+
if (reset) {
|
|
214
|
+
app.setPluginStatus("The tide datum changed, so the bathymetry grid was cleared. " +
|
|
215
|
+
"Rebuild from history to repopulate it.");
|
|
216
|
+
}
|
|
217
|
+
}
|
|
133
218
|
running = true;
|
|
134
219
|
// Offer the chart layer to a host chartplotter, and serve the store the
|
|
135
220
|
// layer reads from a top-level, non-admin route.
|
|
136
221
|
registerPlotterExtension(app, () => running);
|
|
137
222
|
if (!routesRegistered) {
|
|
138
223
|
registerBathymetryRoutes(app, () => tileStore, () => ({
|
|
139
|
-
depthPath: config
|
|
224
|
+
depthPath: config
|
|
225
|
+
? `environment.depth.${tideState === "off" ? config.path : "belowSurface"}`
|
|
226
|
+
: undefined,
|
|
227
|
+
tide: { mode: tideState },
|
|
140
228
|
transducer,
|
|
141
229
|
vessel: {
|
|
142
230
|
loa: readLengthOverall(app),
|
|
@@ -148,18 +236,24 @@ export default function createPlugin(app) {
|
|
|
148
236
|
}));
|
|
149
237
|
routesRegistered = true;
|
|
150
238
|
}
|
|
151
|
-
if (startConfig.seed?.run) {
|
|
152
|
-
// One-time rebuild.
|
|
153
|
-
//
|
|
154
|
-
//
|
|
155
|
-
void runSeed(startConfig.seed.resolution).then(() =>
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
239
|
+
if (collecting && startConfig.seed?.run) {
|
|
240
|
+
// One-time rebuild. A completed or failed run consumes the trigger; an
|
|
241
|
+
// interrupted run leaves it set so the next start resumes from the
|
|
242
|
+
// stored cursor instead of repeating.
|
|
243
|
+
void runSeed(startConfig.seed.resolution).then((outcome) => {
|
|
244
|
+
if (outcome === "completed" || outcome === "failed") {
|
|
245
|
+
restart({
|
|
246
|
+
...startConfig,
|
|
247
|
+
seed: { ...startConfig.seed, run: false },
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
});
|
|
159
251
|
}
|
|
160
252
|
},
|
|
161
253
|
stop() {
|
|
162
254
|
running = false;
|
|
255
|
+
seedGeneration++;
|
|
256
|
+
seedStatus = { running: false };
|
|
163
257
|
abortController?.abort("Stopping signalk-livedepth-plugin");
|
|
164
258
|
tileStore?.close();
|
|
165
259
|
tileStore = undefined;
|
|
@@ -167,6 +261,9 @@ export default function createPlugin(app) {
|
|
|
167
261
|
schema() {
|
|
168
262
|
return schema(app);
|
|
169
263
|
},
|
|
264
|
+
uiSchema() {
|
|
265
|
+
return formUiSchema(config);
|
|
266
|
+
},
|
|
170
267
|
registerWithRouter(router) {
|
|
171
268
|
// The one-time seed trigger stays admin-only, on the plugin's own router;
|
|
172
269
|
// the store the extension reads is served from the top-level route above.
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,MAAM,EAAU,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/streams/live.d.ts
CHANGED
|
@@ -19,5 +19,8 @@ import { Config } from "../config.js";
|
|
|
19
19
|
* The transducer `offset` describes this vessel's hull, so it is applied only
|
|
20
20
|
* to this vessel's own soundings.
|
|
21
21
|
*/
|
|
22
|
-
export declare function createLiveStream(app: ServerAPI, config: Config, offset?: TransducerOffset
|
|
22
|
+
export declare function createLiveStream(app: ServerAPI, config: Config, offset?: TransducerOffset,
|
|
23
|
+
/** Override the recorded depth path, e.g. the raw below-surface depth when
|
|
24
|
+
* tide correction is on. */
|
|
25
|
+
depthPathOverride?: string): PassThrough;
|
|
23
26
|
//# sourceMappingURL=live.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../../src/streams/live.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAuB,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AA8CtC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../../src/streams/live.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAuB,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AA8CtC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,gBAAgB;AACzB;4BAC4B;AAC5B,iBAAiB,CAAC,EAAE,MAAM,eAmN3B"}
|
package/dist/streams/live.js
CHANGED
|
@@ -40,8 +40,13 @@ function positionOf(value) {
|
|
|
40
40
|
* The transducer `offset` describes this vessel's hull, so it is applied only
|
|
41
41
|
* to this vessel's own soundings.
|
|
42
42
|
*/
|
|
43
|
-
export function createLiveStream(app, config, offset
|
|
44
|
-
|
|
43
|
+
export function createLiveStream(app, config, offset,
|
|
44
|
+
/** Override the recorded depth path, e.g. the raw below-surface depth when
|
|
45
|
+
* tide correction is on. */
|
|
46
|
+
depthPathOverride) {
|
|
47
|
+
const depthPath = (depthPathOverride ??
|
|
48
|
+
`environment.depth.${config.path}`);
|
|
49
|
+
const depthKey = depthPath.slice("environment.depth.".length);
|
|
45
50
|
const include = new Set(config.vessels?.include ?? []);
|
|
46
51
|
const exclude = new Set(config.vessels?.exclude ?? []);
|
|
47
52
|
const selfUrn = app.getSelfPath("uuid");
|
|
@@ -187,7 +192,7 @@ export function createLiveStream(app, config, offset) {
|
|
|
187
192
|
continue;
|
|
188
193
|
// A depth on the chosen datum is what makes a vessel worth recording;
|
|
189
194
|
// AIS targets have a position but never a depth.
|
|
190
|
-
if (!node?.environment?.depth?.[
|
|
195
|
+
if (!node?.environment?.depth?.[depthKey])
|
|
191
196
|
continue;
|
|
192
197
|
if (!node?.navigation?.position)
|
|
193
198
|
continue;
|
package/dist/streams/live.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live.js","sourceRoot":"","sources":["../../src/streams/live.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAoB,MAAM,wBAAwB,CAAC;AAE/E,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGjD,+DAA+D;AAC/D,MAAM,GAAG,GAAG,IAAI,CAAC;AAEjB,+EAA+E;AAC/E,MAAM,cAAc,GAAG,KAAK,CAAC;AAc7B;8DAC8D;AAC9D,MAAM,QAAQ,GAAG,qBAA6B,CAAC;AAC/C,MAAM,OAAO,GAAG,wBAAgC,CAAC;AACjD,8EAA8E;AAC9E,MAAM,MAAM,GAAG,iCAAyC,CAAC;AAEzD;2DAC2D;AAC3D,SAAS,UAAU,CACjB,KAAc;IAEd,MAAM,CAAC,GAAI,KAAyC,EAAE,KAAK,IAAI,KAAK,CAAC;IACrE,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAClD,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,CAG/B,CAAC;IACF,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IACjC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,gBAAgB,CAC9B,GAAc,EACd,MAAc,EACd,MAAyB;
|
|
1
|
+
{"version":3,"file":"live.js","sourceRoot":"","sources":["../../src/streams/live.ts"],"names":[],"mappings":"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"}
|
package/dist/tide.d.ts
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tide compensation for stored soundings.
|
|
3
|
+
*
|
|
4
|
+
* A depth below the surface grows and shrinks with the tide, so it can only be
|
|
5
|
+
* compared across days if it is reduced to a fixed vertical datum. This module
|
|
6
|
+
* looks up the predicted water level at a sounding's own time and position and
|
|
7
|
+
* subtracts it, leaving a depth below the chosen datum that stays valid when
|
|
8
|
+
* the vessel returns.
|
|
9
|
+
*
|
|
10
|
+
* The prediction is harmonic, so the same lookup answers for a live sounding
|
|
11
|
+
* now and for one imported from months ago. `chart` uses the station's own
|
|
12
|
+
* chart datum, which changes with the chart region; `LAT` and `MLLW` are fixed
|
|
13
|
+
* references and are the predictable choices for a map that crosses regions.
|
|
14
|
+
*/
|
|
15
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
16
|
+
export type TideDatum = "chart" | "LAT" | "MLLW";
|
|
17
|
+
/** Datums offered in the plugin settings, in display order. */
|
|
18
|
+
export declare const TIDE_DATUMS: readonly TideDatum[];
|
|
19
|
+
/** Store key recording the datum the grid was built in. */
|
|
20
|
+
export declare const TIDE_MODE_KEY = "tide.mode";
|
|
21
|
+
/**
|
|
22
|
+
* The datum the tile store is in, or `off` when soundings are stored as
|
|
23
|
+
* measured. Changing this must rebuild the grid: the cells hold depths, not the
|
|
24
|
+
* raw soundings, so a mixed-datum grid cannot be corrected afterwards.
|
|
25
|
+
*/
|
|
26
|
+
export type TideMode = "off" | TideDatum;
|
|
27
|
+
export declare function tideMode(config: {
|
|
28
|
+
tide?: {
|
|
29
|
+
enabled?: boolean;
|
|
30
|
+
datum?: TideDatum;
|
|
31
|
+
};
|
|
32
|
+
}): TideMode;
|
|
33
|
+
/**
|
|
34
|
+
* The depth path the store records. Tide correction needs the raw water column,
|
|
35
|
+
* so it reads below the surface whatever the configured path says.
|
|
36
|
+
*/
|
|
37
|
+
export declare function recordingDepthPath(config: {
|
|
38
|
+
path: string;
|
|
39
|
+
}, tide: boolean): string;
|
|
40
|
+
/** Whether the stored grid is in a different datum and must be cleared. */
|
|
41
|
+
export declare function shouldResetGrid(stored: string | undefined, mode: TideMode): boolean;
|
|
42
|
+
/** A water level above a datum, and where it came from. */
|
|
43
|
+
export interface TideLookup {
|
|
44
|
+
/** Water level above the datum, metres. */
|
|
45
|
+
level: number;
|
|
46
|
+
/** The datum the level is relative to, as the station reports it. */
|
|
47
|
+
datum: string;
|
|
48
|
+
station: string;
|
|
49
|
+
}
|
|
50
|
+
/** The tide source. A lookup returns undefined when the tide is unavailable. */
|
|
51
|
+
export interface TideProvider {
|
|
52
|
+
levelAbove(lon: number, lat: number, time: Temporal.Instant, datum: TideDatum): Promise<TideLookup | undefined>;
|
|
53
|
+
}
|
|
54
|
+
/** The abbreviation of the datum a grid is stored in. */
|
|
55
|
+
export declare function datumLabel(mode: TideMode): string;
|
|
56
|
+
export interface TideCorrection {
|
|
57
|
+
/**
|
|
58
|
+
* Reduce a sounding to the configured datum. Returns undefined when the tide
|
|
59
|
+
* is unavailable, so the caller can skip it rather than store a raw depth in
|
|
60
|
+
* a datum grid.
|
|
61
|
+
*/
|
|
62
|
+
correct(lon: number, lat: number, time: Temporal.Instant, depth: number): Promise<number | undefined>;
|
|
63
|
+
}
|
|
64
|
+
export declare function createTideCorrection(provider: TideProvider, datum: TideDatum): TideCorrection;
|
|
65
|
+
/** Slackwater's default: beyond this a station predicts water somewhere else. */
|
|
66
|
+
export declare const MAX_STATION_KM = 100;
|
|
67
|
+
/**
|
|
68
|
+
* Predict water levels with the bundled Slackwater engine.
|
|
69
|
+
*
|
|
70
|
+
* A station predictor is cached per small position cell: finding one reads the
|
|
71
|
+
* station database (async, done once), while `getWaterLevelAtTime` is pure
|
|
72
|
+
* arithmetic and answers for any instant, past or future.
|
|
73
|
+
*/
|
|
74
|
+
export declare function createSlackwaterTideProvider(): Promise<TideProvider>;
|
|
75
|
+
/**
|
|
76
|
+
* Whether a station can express a level in `datum`. LAT and MLLW are converted
|
|
77
|
+
* through MSL, so a missing MSL makes either unusable. `chart` needs the station
|
|
78
|
+
* to name a chart datum it also has a level for; the engine otherwise falls
|
|
79
|
+
* back to an MSL-relative value, which would be stored as a chart depth.
|
|
80
|
+
*/
|
|
81
|
+
export declare function datumAvailable(station: {
|
|
82
|
+
datums?: Record<string, number>;
|
|
83
|
+
chart_datum?: string;
|
|
84
|
+
}, datum: TideDatum): boolean;
|
|
85
|
+
//# sourceMappingURL=tide.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tide.d.ts","sourceRoot":"","sources":["../src/tide.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AAEjD,+DAA+D;AAC/D,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,EAA6B,CAAC;AAE1E,2DAA2D;AAC3D,eAAO,MAAM,aAAa,cAAc,CAAC;AAEzC;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AAEzC,wBAAgB,QAAQ,CAAC,MAAM,EAAE;IAC/B,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,SAAS,CAAA;KAAE,CAAC;CACjD,GAAG,QAAQ,CAMX;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EACxB,IAAI,EAAE,OAAO,GACZ,MAAM,CAIR;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,IAAI,EAAE,QAAQ,GACb,OAAO,CAET;AAED,2DAA2D;AAC3D,MAAM,WAAW,UAAU;IACzB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,gFAAgF;AAChF,MAAM,WAAW,YAAY;IAC3B,UAAU,CACR,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,QAAQ,CAAC,OAAO,EACtB,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;CACpC;AAED,yDAAyD;AACzD,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAEjD;AAED,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,OAAO,CACL,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,QAAQ,CAAC,OAAO,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CAChC;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,SAAS,GACf,cAAc,CAUhB;AAED,iFAAiF;AACjF,eAAO,MAAM,cAAc,MAAM,CAAC;AAMlC;;;;;;GAMG;AACH,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,YAAY,CAAC,CAsD1E;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAClE,KAAK,EAAE,SAAS,GACf,OAAO,CAUT"}
|
package/dist/tide.js
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tide compensation for stored soundings.
|
|
3
|
+
*
|
|
4
|
+
* A depth below the surface grows and shrinks with the tide, so it can only be
|
|
5
|
+
* compared across days if it is reduced to a fixed vertical datum. This module
|
|
6
|
+
* looks up the predicted water level at a sounding's own time and position and
|
|
7
|
+
* subtracts it, leaving a depth below the chosen datum that stays valid when
|
|
8
|
+
* the vessel returns.
|
|
9
|
+
*
|
|
10
|
+
* The prediction is harmonic, so the same lookup answers for a live sounding
|
|
11
|
+
* now and for one imported from months ago. `chart` uses the station's own
|
|
12
|
+
* chart datum, which changes with the chart region; `LAT` and `MLLW` are fixed
|
|
13
|
+
* references and are the predictable choices for a map that crosses regions.
|
|
14
|
+
*/
|
|
15
|
+
/** Datums offered in the plugin settings, in display order. */
|
|
16
|
+
export const TIDE_DATUMS = ["chart", "LAT", "MLLW"];
|
|
17
|
+
/** Store key recording the datum the grid was built in. */
|
|
18
|
+
export const TIDE_MODE_KEY = "tide.mode";
|
|
19
|
+
export function tideMode(config) {
|
|
20
|
+
if (!config.tide?.enabled)
|
|
21
|
+
return "off";
|
|
22
|
+
const datum = config.tide.datum;
|
|
23
|
+
// The saved config is user input; an unknown datum would silently skip every
|
|
24
|
+
// sounding, so fall back to the default.
|
|
25
|
+
return datum !== undefined && TIDE_DATUMS.includes(datum) ? datum : "LAT";
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The depth path the store records. Tide correction needs the raw water column,
|
|
29
|
+
* so it reads below the surface whatever the configured path says.
|
|
30
|
+
*/
|
|
31
|
+
export function recordingDepthPath(config, tide) {
|
|
32
|
+
return tide
|
|
33
|
+
? "environment.depth.belowSurface"
|
|
34
|
+
: `environment.depth.${config.path}`;
|
|
35
|
+
}
|
|
36
|
+
/** Whether the stored grid is in a different datum and must be cleared. */
|
|
37
|
+
export function shouldResetGrid(stored, mode) {
|
|
38
|
+
return stored === undefined ? mode !== "off" : stored !== mode;
|
|
39
|
+
}
|
|
40
|
+
/** The abbreviation of the datum a grid is stored in. */
|
|
41
|
+
export function datumLabel(mode) {
|
|
42
|
+
return mode === "chart" ? "chart datum" : mode === "off" ? "none" : mode;
|
|
43
|
+
}
|
|
44
|
+
export function createTideCorrection(provider, datum) {
|
|
45
|
+
return {
|
|
46
|
+
async correct(lon, lat, time, depth) {
|
|
47
|
+
const lookup = await provider.levelAbove(lon, lat, time, datum);
|
|
48
|
+
if (!lookup || !Number.isFinite(lookup.level))
|
|
49
|
+
return undefined;
|
|
50
|
+
// A seabed above the datum is a drying height; the grid stores depths, so
|
|
51
|
+
// clamp it to the surface rather than dropping the cell.
|
|
52
|
+
return Math.max(0, depth - lookup.level);
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** Slackwater's default: beyond this a station predicts water somewhere else. */
|
|
57
|
+
export const MAX_STATION_KM = 100;
|
|
58
|
+
/** Distance between cached station lookups, in degrees. */
|
|
59
|
+
const STATION_CACHE_GRID = 0.01;
|
|
60
|
+
const STATION_CACHE_MAX = 512;
|
|
61
|
+
/**
|
|
62
|
+
* Predict water levels with the bundled Slackwater engine.
|
|
63
|
+
*
|
|
64
|
+
* A station predictor is cached per small position cell: finding one reads the
|
|
65
|
+
* station database (async, done once), while `getWaterLevelAtTime` is pure
|
|
66
|
+
* arithmetic and answers for any instant, past or future.
|
|
67
|
+
*/
|
|
68
|
+
export async function createSlackwaterTideProvider() {
|
|
69
|
+
const { nearestStation } = await import("slackwater");
|
|
70
|
+
const predictors = new Map();
|
|
71
|
+
const predictorFor = (lat, lon) => {
|
|
72
|
+
const key = `${(Math.round(lat / STATION_CACHE_GRID) * STATION_CACHE_GRID).toFixed(2)},${(Math.round(lon / STATION_CACHE_GRID) * STATION_CACHE_GRID).toFixed(2)}`;
|
|
73
|
+
let predictor = predictors.get(key);
|
|
74
|
+
if (!predictor) {
|
|
75
|
+
predictor = (async () => {
|
|
76
|
+
// Slackwater returns the predictor synchronously in older betas and as
|
|
77
|
+
// a promise in newer ones; `await` accepts either.
|
|
78
|
+
const station = await nearestStation({
|
|
79
|
+
latitude: lat,
|
|
80
|
+
longitude: lon,
|
|
81
|
+
maxDistance: MAX_STATION_KM,
|
|
82
|
+
});
|
|
83
|
+
return hasTideModel(station) ? station : undefined;
|
|
84
|
+
})().catch(() => undefined);
|
|
85
|
+
predictors.set(key, predictor);
|
|
86
|
+
if (predictors.size > STATION_CACHE_MAX) {
|
|
87
|
+
const oldest = predictors.keys().next().value;
|
|
88
|
+
if (oldest !== undefined)
|
|
89
|
+
predictors.delete(oldest);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return predictor;
|
|
93
|
+
};
|
|
94
|
+
return {
|
|
95
|
+
async levelAbove(lon, lat, time, datum) {
|
|
96
|
+
const station = await predictorFor(lat, lon);
|
|
97
|
+
if (!station || !datumAvailable(station, datum))
|
|
98
|
+
return undefined;
|
|
99
|
+
try {
|
|
100
|
+
const prediction = station.getWaterLevelAtTime({
|
|
101
|
+
time: new Date(time.epochMilliseconds),
|
|
102
|
+
datum: datum === "chart" ? undefined : datum,
|
|
103
|
+
});
|
|
104
|
+
if (!Number.isFinite(prediction.level))
|
|
105
|
+
return undefined;
|
|
106
|
+
return {
|
|
107
|
+
level: prediction.level,
|
|
108
|
+
datum: prediction.datum ?? datum,
|
|
109
|
+
station: station.id,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Whether a station can express a level in `datum`. LAT and MLLW are converted
|
|
120
|
+
* through MSL, so a missing MSL makes either unusable. `chart` needs the station
|
|
121
|
+
* to name a chart datum it also has a level for; the engine otherwise falls
|
|
122
|
+
* back to an MSL-relative value, which would be stored as a chart depth.
|
|
123
|
+
*/
|
|
124
|
+
export function datumAvailable(station, datum) {
|
|
125
|
+
if (datum === "chart") {
|
|
126
|
+
return (station.chart_datum !== undefined &&
|
|
127
|
+
station.datums?.[station.chart_datum] !== undefined);
|
|
128
|
+
}
|
|
129
|
+
return (station.datums?.[datum] !== undefined && station.datums?.MSL !== undefined);
|
|
130
|
+
}
|
|
131
|
+
/** CHS stations carry identity only; predicting from one gives a flat zero. */
|
|
132
|
+
function hasTideModel(station) {
|
|
133
|
+
return ((station.harmonic_constituents?.length ?? 0) > 0 ||
|
|
134
|
+
station.offsets !== undefined);
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=tide.js.map
|
package/dist/tide.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tide.js","sourceRoot":"","sources":["../src/tide.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,13 @@ export interface TileMeta {
|
|
|
25
25
|
loa?: number;
|
|
26
26
|
beam?: number;
|
|
27
27
|
};
|
|
28
|
+
/** The vertical datum stored depths are relative to. `mode` is `"off"` when
|
|
29
|
+
* soundings are raw below-surface, otherwise the datum name (`LAT`, `MLLW`,
|
|
30
|
+
* `chart`). A client must not fold its own uncorrected soundings onto a
|
|
31
|
+
* corrected grid; it refreshes the served tiles instead. */
|
|
32
|
+
tide?: {
|
|
33
|
+
mode: string;
|
|
34
|
+
};
|
|
28
35
|
/** Temporary debug flags; see the plugin's debug config. */
|
|
29
36
|
debug?: {
|
|
30
37
|
vesselFootprint?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tile-source.d.ts","sourceRoot":"","sources":["../../../src/tiles/core/tile-source.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAIL,SAAS,EACT,QAAQ,EAGT,MAAM,WAAW,CAAC;AAEnB,2DAA2D;AAC3D,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;yEAEqE;IACrE,UAAU,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,0DAA0D;IAC1D,MAAM,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,4DAA4D;IAC5D,KAAK,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACvC;AAID;;iCAEiC;AACjC,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,OAAO,SAAW,EAClB,QAAQ,SAAY,GACnB,MAAM,CAOR;AAkBD;oEACoE;AACpE,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,CAAC,EAAE,MAAM,GACR;IAAE,EAAE,EAAE,MAAM,EAAE,CAAC;IAAC,EAAE,EAAE,MAAM,EAAE,CAAA;CAAE,CA0BhC;AAED,qDAAqD;AACrD,wBAAgB,cAAc,CAC5B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,GAAG,EAAE,MAAM,GACV,CAAC,MAAM,EAAE,MAAM,CAAC,CASlB;AAED,sDAAsD;AACtD,wBAAgB,cAAc,CAC5B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,SAAS,GACf,QAAQ,EAAE,CASZ;AAED,4DAA4D;AAC5D,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,UAAU,GAChB,QAAQ,EAAE,CAEZ;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"tile-source.d.ts","sourceRoot":"","sources":["../../../src/tiles/core/tile-source.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAIL,SAAS,EACT,QAAQ,EAGT,MAAM,WAAW,CAAC;AAEnB,2DAA2D;AAC3D,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;yEAEqE;IACrE,UAAU,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,0DAA0D;IAC1D,MAAM,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC;;;gEAG4D;IAC5D,IAAI,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACxB,4DAA4D;IAC5D,KAAK,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACvC;AAID;;iCAEiC;AACjC,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,OAAO,SAAW,EAClB,QAAQ,SAAY,GACnB,MAAM,CAOR;AAkBD;oEACoE;AACpE,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,CAAC,EAAE,MAAM,GACR;IAAE,EAAE,EAAE,MAAM,EAAE,CAAC;IAAC,EAAE,EAAE,MAAM,EAAE,CAAA;CAAE,CA0BhC;AAED,qDAAqD;AACrD,wBAAgB,cAAc,CAC5B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,GAAG,EAAE,MAAM,GACV,CAAC,MAAM,EAAE,MAAM,CAAC,CASlB;AAED,sDAAsD;AACtD,wBAAgB,cAAc,CAC5B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,SAAS,GACf,QAAQ,EAAE,CASZ;AAED,4DAA4D;AAC5D,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,UAAU,GAChB,QAAQ,EAAE,CAEZ;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tile-source.js","sourceRoot":"","sources":["../../../src/tiles/core/tile-source.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EACL,SAAS,EACT,QAAQ,EACR,SAAS,EAET,QAAQ,EACR,WAAW,EACX,UAAU,GACX,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"tile-source.js","sourceRoot":"","sources":["../../../src/tiles/core/tile-source.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EACL,SAAS,EACT,QAAQ,EACR,SAAS,EAET,QAAQ,EACR,WAAW,EACX,UAAU,GACX,MAAM,WAAW,CAAC;AAyBnB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC;AAE1B;;iCAEiC;AACjC,MAAM,UAAU,eAAe,CAC7B,UAAkB,EAClB,OAAO,GAAG,QAAQ,EAClB,QAAQ,GAAG,SAAS;IAEpB,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IACvC,uEAAuE;IACvE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CACrB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,CAC9D,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AACtD,CAAC;AAED;wDACwD;AACxD,SAAS,UAAU,CAAC,GAAW,EAAE,CAAS;IACxC,OAAO,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,2DAA2D;AAC3D,SAAS,UAAU,CAAC,GAAW,EAAE,CAAS;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,OAAO,GAAG,GAAG,CAAC;IAC7B,OAAO,CACL,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QACvE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CACf,CAAC;AACJ,CAAC;AAED;oEACoE;AACpE,MAAM,UAAU,gBAAgB,CAC9B,IAAuB,EACvB,CAAS;IAET,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAC5B,CAAC;IACD,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;IAExC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3C,IAAI,IAAI,GAAG,MAAM,EAAE,CAAC;QAClB,IAAI,IAAI,CAAC,CAAC,CAAC,gCAAgC;IAC7C,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9C,MAAM,EAAE,GAAa,EAAE,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,EAAE,GAAa,EAAE,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACb,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AACpB,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,cAAc,CAC5B,CAAS,EACT,CAAS,EACT,CAAS,EACT,GAAW;IAEX,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzB,MAAM,EAAE,GAAG,GAAG,GAAG,SAAS,CAAC;IAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC;IACvC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IAC/D,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACpB,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,cAAc,CAC5B,CAAS,EACT,CAAS,EACT,CAAS,EACT,KAAgB;IAEhB,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QACtC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,iBAAiB,CAC/B,CAAS,EACT,CAAS,EACT,CAAS,EACT,KAAiB;IAEjB,OAAO,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
|