@geolibre/core 3.6.0 → 3.7.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.
@@ -0,0 +1,448 @@
1
+ /**
2
+ * The value values for the "type" property of GeoJSON Objects.
3
+ * https://tools.ietf.org/html/rfc7946#section-1.4
4
+ */
5
+ type GeoJsonTypes = GeoJSON["type"];
6
+ /**
7
+ * Bounding box
8
+ * https://tools.ietf.org/html/rfc7946#section-5
9
+ */
10
+ type BBox = [number, number, number, number] | [number, number, number, number, number, number];
11
+ /**
12
+ * A Position is an array of coordinates.
13
+ * https://tools.ietf.org/html/rfc7946#section-3.1.1
14
+ * Array should contain between two and three elements.
15
+ * The previous GeoJSON specification allowed more elements (e.g., which could be used to represent M values),
16
+ * but the current specification only allows X, Y, and (optionally) Z to be defined.
17
+ *
18
+ * Note: the type will not be narrowed down to `[number, number] | [number, number, number]` due to
19
+ * marginal benefits and the large impact of breaking change.
20
+ *
21
+ * See previous discussions on the type narrowing:
22
+ * - {@link https://github.com/DefinitelyTyped/DefinitelyTyped/pull/21590|Nov 2017}
23
+ * - {@link https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/67773|Dec 2023}
24
+ * - {@link https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/71441| Dec 2024}
25
+ *
26
+ * One can use a
27
+ * {@link https://www.typescriptlang.org/docs/handbook/2/narrowing.html#using-type-predicates|user-defined type guard that returns a type predicate}
28
+ * to determine if a position is a 2D or 3D position.
29
+ *
30
+ * @example
31
+ * import type { Position } from 'geojson';
32
+ *
33
+ * type StrictPosition = [x: number, y: number] | [x: number, y: number, z: number]
34
+ *
35
+ * function isStrictPosition(position: Position): position is StrictPosition {
36
+ * return position.length === 2 || position.length === 3
37
+ * };
38
+ *
39
+ * let position: Position = [-116.91, 45.54];
40
+ *
41
+ * let x: number;
42
+ * let y: number;
43
+ * let z: number | undefined;
44
+ *
45
+ * if (isStrictPosition(position)) {
46
+ * // `tsc` would throw an error if we tried to destructure a fourth parameter
47
+ * [x, y, z] = position;
48
+ * } else {
49
+ * throw new TypeError("Position is not a 2D or 3D point");
50
+ * }
51
+ */
52
+ type Position = number[];
53
+ /**
54
+ * The base GeoJSON object.
55
+ * https://tools.ietf.org/html/rfc7946#section-3
56
+ * The GeoJSON specification also allows foreign members
57
+ * (https://tools.ietf.org/html/rfc7946#section-6.1)
58
+ * Developers should use "&" type in TypeScript or extend the interface
59
+ * to add these foreign members.
60
+ */
61
+ interface GeoJsonObject {
62
+ // Don't include foreign members directly into this type def.
63
+ // in order to preserve type safety.
64
+ // [key: string]: any;
65
+ /**
66
+ * Specifies the type of GeoJSON object.
67
+ */
68
+ type: GeoJsonTypes;
69
+ /**
70
+ * Bounding box of the coordinate range of the object's Geometries, Features, or Feature Collections.
71
+ * The value of the bbox member is an array of length 2*n where n is the number of dimensions
72
+ * represented in the contained geometries, with all axes of the most southwesterly point
73
+ * followed by all axes of the more northeasterly point.
74
+ * The axes order of a bbox follows the axes order of geometries.
75
+ * https://tools.ietf.org/html/rfc7946#section-5
76
+ */
77
+ bbox?: BBox | undefined;
78
+ }
79
+ /**
80
+ * Union of GeoJSON objects.
81
+ */
82
+ type GeoJSON<G extends Geometry | null = Geometry, P = GeoJsonProperties> = G | Feature<G, P> | FeatureCollection<G, P>;
83
+ /**
84
+ * Geometry object.
85
+ * https://tools.ietf.org/html/rfc7946#section-3
86
+ */
87
+ type Geometry = Point | MultiPoint | LineString | MultiLineString | Polygon | MultiPolygon | GeometryCollection;
88
+ /**
89
+ * Point geometry object.
90
+ * https://tools.ietf.org/html/rfc7946#section-3.1.2
91
+ */
92
+ interface Point extends GeoJsonObject {
93
+ type: "Point";
94
+ coordinates: Position;
95
+ }
96
+ /**
97
+ * MultiPoint geometry object.
98
+ * https://tools.ietf.org/html/rfc7946#section-3.1.3
99
+ */
100
+ interface MultiPoint extends GeoJsonObject {
101
+ type: "MultiPoint";
102
+ coordinates: Position[];
103
+ }
104
+ /**
105
+ * LineString geometry object.
106
+ * https://tools.ietf.org/html/rfc7946#section-3.1.4
107
+ */
108
+ interface LineString extends GeoJsonObject {
109
+ type: "LineString";
110
+ coordinates: Position[];
111
+ }
112
+ /**
113
+ * MultiLineString geometry object.
114
+ * https://tools.ietf.org/html/rfc7946#section-3.1.5
115
+ */
116
+ interface MultiLineString extends GeoJsonObject {
117
+ type: "MultiLineString";
118
+ coordinates: Position[][];
119
+ }
120
+ /**
121
+ * Polygon geometry object.
122
+ * https://tools.ietf.org/html/rfc7946#section-3.1.6
123
+ */
124
+ interface Polygon extends GeoJsonObject {
125
+ type: "Polygon";
126
+ coordinates: Position[][];
127
+ }
128
+ /**
129
+ * MultiPolygon geometry object.
130
+ * https://tools.ietf.org/html/rfc7946#section-3.1.7
131
+ */
132
+ interface MultiPolygon extends GeoJsonObject {
133
+ type: "MultiPolygon";
134
+ coordinates: Position[][][];
135
+ }
136
+ /**
137
+ * Geometry Collection
138
+ * https://tools.ietf.org/html/rfc7946#section-3.1.8
139
+ */
140
+ interface GeometryCollection<G extends Geometry = Geometry> extends GeoJsonObject {
141
+ type: "GeometryCollection";
142
+ geometries: G[];
143
+ }
144
+ type GeoJsonProperties = {
145
+ [name: string]: any;
146
+ } | null;
147
+ /**
148
+ * A feature object which contains a geometry and associated properties.
149
+ * https://tools.ietf.org/html/rfc7946#section-3.2
150
+ */
151
+ interface Feature<G extends Geometry | null = Geometry, P = GeoJsonProperties> extends GeoJsonObject {
152
+ type: "Feature";
153
+ /**
154
+ * The feature's geometry
155
+ */
156
+ geometry: G;
157
+ /**
158
+ * A value that uniquely identifies this feature in a
159
+ * https://tools.ietf.org/html/rfc7946#section-3.2.
160
+ */
161
+ id?: string | number | undefined;
162
+ /**
163
+ * Properties associated with this feature.
164
+ */
165
+ properties: P;
166
+ }
167
+ /**
168
+ * A collection of feature objects.
169
+ * https://tools.ietf.org/html/rfc7946#section-3.3
170
+ */
171
+ interface FeatureCollection<G extends Geometry | null = Geometry, P = GeoJsonProperties> extends GeoJsonObject {
172
+ type: "FeatureCollection";
173
+ features: Array<Feature<G, P>>;
174
+ }
175
+ /**
176
+ * Celestial-body ellipsoids and the planetary basemaps that pair with them.
177
+ *
178
+ * GeoLibre is Earth-centric by construction: the default map is Web Mercator
179
+ * and all vector data is kept as lon/lat GeoJSON. This module does *not*
180
+ * change that (a map drawn in a body's own polar or simple-cylindrical CRS is
181
+ * `map-crs.ts`). What it adds is a per-project notion of *which body* the
182
+ * coordinates describe, so that:
183
+ *
184
+ * - distance / area / scale measurements use that body's radius instead of a
185
+ * hardcoded Earth radius, and
186
+ * - Moon / Mars basemaps (published in a Web-Mercator tiling scheme) can be
187
+ * selected like any other basemap.
188
+ *
189
+ * The active ellipsoid is a lightweight module-level singleton kept in sync with
190
+ * the project's map preferences (see the store's `setPreferences`). Measurement
191
+ * helpers read it lazily at call time, so callers in other packages don't need
192
+ * the value threaded through their signatures — a deliberate prototype-friendly
193
+ * shortcut over a full CRS/context refactor.
194
+ */
195
+ /** A biaxial (rotational) ellipsoid describing a celestial body. */
196
+ interface Ellipsoid {
197
+ /** Stable id persisted in the project (`map.ellipsoidId`). */
198
+ id: string;
199
+ /** Human-readable name shown in the UI. */
200
+ name: string;
201
+ /** Equatorial (semi-major) radius in metres — the "web mercator" radius. */
202
+ semiMajorAxisMeters: number;
203
+ /**
204
+ * Inverse flattening `1/f`. `0` denotes a perfect sphere (Moon), in which case
205
+ * the polar radius equals {@link semiMajorAxisMeters}.
206
+ */
207
+ inverseFlattening: number;
208
+ }
209
+ /**
210
+ * Built-in ellipsoids. Earth is WGS 84; every other body uses IAU-adopted
211
+ * figures. Only Earth and Mars are appreciably oblate; the rest are modelled as
212
+ * spheres (`inverseFlattening: 0`), which is how the IAU/USGS simple-cylindrical
213
+ * products treat them and is well within the accuracy MapLibre's unit-sphere
214
+ * rendering can represent anyway.
215
+ */
216
+ declare const ELLIPSOIDS: readonly [{
217
+ readonly id: "earth";
218
+ readonly name: "Earth (WGS 84)";
219
+ readonly semiMajorAxisMeters: 6378137;
220
+ readonly inverseFlattening: 298.257223563;
221
+ }, {
222
+ readonly id: "moon";
223
+ readonly name: "Moon";
224
+ readonly semiMajorAxisMeters: 1737400;
225
+ readonly inverseFlattening: 0;
226
+ }, {
227
+ readonly id: "mars";
228
+ readonly name: "Mars (IAU 2000)";
229
+ readonly semiMajorAxisMeters: 3396190;
230
+ readonly inverseFlattening: 169.894447;
231
+ }, {
232
+ readonly id: "mercury";
233
+ readonly name: "Mercury";
234
+ readonly semiMajorAxisMeters: 2439400;
235
+ readonly inverseFlattening: 0;
236
+ }, {
237
+ readonly id: "venus";
238
+ readonly name: "Venus";
239
+ readonly semiMajorAxisMeters: 6051800;
240
+ readonly inverseFlattening: 0;
241
+ }, {
242
+ readonly id: "io";
243
+ readonly name: "Io";
244
+ readonly semiMajorAxisMeters: 1821600;
245
+ readonly inverseFlattening: 0;
246
+ }, {
247
+ readonly id: "europa";
248
+ readonly name: "Europa";
249
+ readonly semiMajorAxisMeters: 1560800;
250
+ readonly inverseFlattening: 0;
251
+ }, {
252
+ readonly id: "ganymede";
253
+ readonly name: "Ganymede";
254
+ readonly semiMajorAxisMeters: 2631200;
255
+ readonly inverseFlattening: 0;
256
+ }, {
257
+ readonly id: "callisto";
258
+ readonly name: "Callisto";
259
+ readonly semiMajorAxisMeters: 2410300;
260
+ readonly inverseFlattening: 0;
261
+ }, {
262
+ readonly id: "titan";
263
+ readonly name: "Titan";
264
+ readonly semiMajorAxisMeters: 2574730;
265
+ readonly inverseFlattening: 0;
266
+ }, {
267
+ readonly id: "pluto";
268
+ readonly name: "Pluto";
269
+ readonly semiMajorAxisMeters: 1188300;
270
+ readonly inverseFlattening: 0;
271
+ }, {
272
+ readonly id: "charon";
273
+ readonly name: "Charon";
274
+ readonly semiMajorAxisMeters: 606000;
275
+ readonly inverseFlattening: 0;
276
+ }];
277
+ type EllipsoidId = (typeof ELLIPSOIDS)[number]["id"];
278
+ declare const DEFAULT_ELLIPSOID_ID: EllipsoidId;
279
+ /** Look an ellipsoid up by id, falling back to Earth for unknown ids. */
280
+ declare function getEllipsoid(id: string | undefined): Ellipsoid;
281
+ /**
282
+ * Mean radius `R = (2a + b) / 3` in metres, where `b` is the polar radius
283
+ * derived from the inverse flattening. This is the radius used for spherical
284
+ * (haversine) distance and area math.
285
+ */
286
+ declare function meanRadiusMeters(ellipsoid: Ellipsoid): number;
287
+ /** Earth's mean radius in metres — the radius Turf.js and MapLibre bake in. */
288
+ declare const EARTH_MEAN_RADIUS_METERS: number;
289
+ /**
290
+ * Point the measurement helpers at a body. Unknown ids fall back to Earth so a
291
+ * malformed project can never break measurements. Safe to call on every
292
+ * preferences change; it is a cheap assignment.
293
+ */
294
+ declare function setActiveEllipsoidId(id: string | undefined): void;
295
+ declare function getActiveEllipsoid(): Ellipsoid;
296
+ /** Mean radius (metres) of the active body — for haversine distance/area. */
297
+ declare function getActiveMeanRadiusMeters(): number;
298
+ /** Semi-major axis (metres) of the active body — for its Web-Mercator scale. */
299
+ declare function getActiveSemiMajorAxisMeters(): number;
300
+ /**
301
+ * The active body's mean radius as a fraction of Earth's — `R_body / R_earth`,
302
+ * and exactly `1` on Earth.
303
+ *
304
+ * Everything GeoLibre measures ultimately comes from lon/lat *angles*, and the
305
+ * only thing that turns an angle into a ground distance is the radius it is
306
+ * multiplied by. Turf.js hardcodes Earth's, with no per-call override (that is
307
+ * the "Turf is Earth-locked" half of GeoLibre#1128), so rather than patch or
308
+ * replace Turf we post-scale what it returns and pre-scale what we hand it. The
309
+ * result is exact for a sphere, which is how every non-Earth body GeoLibre
310
+ * offers is modelled anyway, and within Mars' 0.6% flattening at worst.
311
+ *
312
+ * Suggested by @thareUSGS (USGS Astrogeology) on GeoLibre#1128 as the practical
313
+ * workaround planetary web maps have long used on Earth-locked engines.
314
+ */
315
+ declare function getActiveBodyRadiusRatio(): number;
316
+ /**
317
+ * Convert a length Turf.js measured on Earth into the active body's true ground
318
+ * length. A no-op on Earth.
319
+ *
320
+ * Use on anything Turf *returns* — a distance, a length, a perimeter.
321
+ *
322
+ * The correction is a dimensionless ratio, so it is unit-agnostic: pass the
323
+ * length in whatever unit Turf gave it back (metres, kilometres, miles) and the
324
+ * result is in that same unit. There is no hidden unit conversion here.
325
+ */
326
+ declare function earthLengthToBody(length: number): number;
327
+ /**
328
+ * Convert a true ground length on the active body into the Earth-equivalent
329
+ * length to hand Turf.js. A no-op on Earth.
330
+ *
331
+ * Use on anything passed *into* Turf as a distance — a buffer width, a circle
332
+ * or sector radius, a search threshold — so the resulting geometry spans that
333
+ * distance on this body rather than on Earth.
334
+ *
335
+ * Unit-agnostic like {@link earthLengthToBody}: pass the length in whatever
336
+ * unit you are about to hand Turf alongside it, and the result is in that unit.
337
+ */
338
+ declare function bodyLengthToEarth(length: number): number;
339
+ /**
340
+ * Convert an area Turf.js measured on Earth into the active body's true ground
341
+ * area. A no-op on Earth.
342
+ *
343
+ * Areas scale with the *square* of the radius ratio, so this is not the same
344
+ * correction as {@link earthLengthToBody}. Unit-agnostic in the same way, for
345
+ * whatever squared unit the area is expressed in.
346
+ */
347
+ declare function earthAreaToBody(area: number): number;
348
+ /**
349
+ * A raster basemap for a celestial body — the Moon and Mars mosaics, plus the
350
+ * Earth satellite imagery the planet switcher pairs with Earth. The tiles are
351
+ * XYZ (or TMS, see {@link scheme}) images in that body's Web-Mercator scheme, so
352
+ * MapLibre renders them directly. The `styleUrl` is a `geolibre://basemap/<id>`
353
+ * sentinel; the map controller expands it into a raster style at apply time (it
354
+ * is not a fetchable URL).
355
+ */
356
+ interface PlanetaryBasemap {
357
+ id: string;
358
+ name: string;
359
+ /** Sentinel stored as the basemap style URL. */
360
+ styleUrl: string;
361
+ /** XYZ (or TMS, see {@link scheme}) tile template. */
362
+ tileUrl: string;
363
+ /**
364
+ * Tile row ordering. OpenPlanetaryMap's single-layer raster mosaics (the S3
365
+ * datasets) are published as **TMS** (tile origin bottom-left, Y flipped),
366
+ * whereas the CARTO `opmbuilder` named maps are standard **XYZ**. Omit for
367
+ * XYZ; MapLibre defaults to `"xyz"` when `scheme` is absent.
368
+ */
369
+ scheme?: "tms";
370
+ /** Max native zoom of the source (MapLibre overzooms beyond this). */
371
+ maxZoom: number;
372
+ /** Attribution shown on the map. */
373
+ attribution: string;
374
+ /** The body this basemap depicts, so selecting it can set the ellipsoid. */
375
+ ellipsoidId: EllipsoidId;
376
+ }
377
+ declare const PLANETARY_BASEMAP_SENTINEL_PREFIX = "geolibre://basemap/";
378
+ declare const PLANETARY_BASEMAPS: readonly PlanetaryBasemap[];
379
+ /**
380
+ * The section a planetary basemap is grouped under in the New Project and
381
+ * Change Basemap pickers. The Moon and Mars keep dedicated sections (they are
382
+ * the most-used bodies and each has several mosaics); every other body is
383
+ * collapsed into a single "other" section so the picker isn't a wall of
384
+ * one-item headings.
385
+ */
386
+ type PlanetaryBasemapSectionId = "moon" | "mars" | "other";
387
+ /** A picker section paired with the planetary basemaps it lists. */
388
+ interface PlanetaryBasemapGroup {
389
+ id: PlanetaryBasemapSectionId;
390
+ basemaps: readonly PlanetaryBasemap[];
391
+ }
392
+ /**
393
+ * {@link PLANETARY_BASEMAPS} grouped for the pickers: one section each for the
394
+ * Moon and Mars, then a single "Other celestial bodies" section for the rest,
395
+ * in {@link PLANETARY_BASEMAPS} order (grouped by body). Empty sections are
396
+ * dropped.
397
+ */
398
+ declare const PLANETARY_BASEMAP_GROUPS: readonly PlanetaryBasemapGroup[];
399
+ /** Resolve a `geolibre://basemap/<id>` sentinel to its planetary basemap. */
400
+ declare function getPlanetaryBasemapByStyleUrl(styleUrl: string | undefined): PlanetaryBasemap | undefined;
401
+ /** Look a planetary basemap up by its stable id. */
402
+ declare function getPlanetaryBasemapById(id: string): PlanetaryBasemap | undefined;
403
+ /**
404
+ * The celestial bodies offered by the Layers-panel planet switcher, in menu
405
+ * order (like Google Earth's planet dropdown). Each body is paired with the
406
+ * basemap the switcher applies for it — USGS satellite imagery for Earth, the
407
+ * OpenPlanetaryMap Hillshaded Albedo mosaic for the Moon, and the OpenPlanetaryMap
408
+ * Viking mosaic for Mars.
409
+ */
410
+ declare const PLANET_SWITCHER_OPTIONS: readonly [{
411
+ readonly ellipsoidId: "earth";
412
+ readonly basemapId: "earth-usgs-imagery";
413
+ }, {
414
+ readonly ellipsoidId: "moon";
415
+ readonly basemapId: "moon-hillshaded-albedo";
416
+ }, {
417
+ readonly ellipsoidId: "mars";
418
+ readonly basemapId: "mars-viking-mdim21";
419
+ }, {
420
+ readonly ellipsoidId: "callisto";
421
+ readonly basemapId: "callisto-galileo-voyager";
422
+ }, {
423
+ readonly ellipsoidId: "charon";
424
+ readonly basemapId: "charon-mosaic";
425
+ }, {
426
+ readonly ellipsoidId: "europa";
427
+ readonly basemapId: "europa-galileo-voyager";
428
+ }, {
429
+ readonly ellipsoidId: "ganymede";
430
+ readonly basemapId: "ganymede-galileo-voyager";
431
+ }, {
432
+ readonly ellipsoidId: "io";
433
+ readonly basemapId: "io-galileo-color";
434
+ }, {
435
+ readonly ellipsoidId: "mercury";
436
+ readonly basemapId: "mercury-messenger-color";
437
+ }, {
438
+ readonly ellipsoidId: "pluto";
439
+ readonly basemapId: "pluto-mosaic";
440
+ }, {
441
+ readonly ellipsoidId: "titan";
442
+ readonly basemapId: "titan-cassini";
443
+ }, {
444
+ readonly ellipsoidId: "venus";
445
+ readonly basemapId: "venus-magellan-color";
446
+ }];
447
+ export { LineString as A, meanRadiusMeters as C, GeoJSON as D, FeatureCollection as E, Position as F, MultiPolygon as M, Point as N, GeoJsonProperties as O, Polygon as P, getPlanetaryBasemapByStyleUrl as S, Feature as T, getActiveEllipsoid as _, EllipsoidId as a, getEllipsoid as b, PLANETARY_BASEMAP_SENTINEL_PREFIX as c, PlanetaryBasemapGroup as d, PlanetaryBasemapSectionId as f, getActiveBodyRadiusRatio as g, earthLengthToBody as h, Ellipsoid as i, MultiLineString as j, Geometry as k, PLANET_SWITCHER_OPTIONS as l, earthAreaToBody as m, EARTH_MEAN_RADIUS_METERS as n, PLANETARY_BASEMAPS as o, bodyLengthToEarth as p, ELLIPSOIDS as r, PLANETARY_BASEMAP_GROUPS as s, DEFAULT_ELLIPSOID_ID as t, PlanetaryBasemap as u, getActiveMeanRadiusMeters as v, setActiveEllipsoidId as w, getPlanetaryBasemapById as x, getActiveSemiMajorAxisMeters as y };
448
+ //# sourceMappingURL=ellipsoids-BdHOMRmm.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ellipsoids-BdHOMRmm.d.mts","names":[],"sources":["../../../node_modules/@types/geojson/index.d.ts","../src/ellipsoids.ts"],"ignoreList":[0],"mappings":";;;;KAeY,eAAe;;;;;KAMf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA2CA;;;;;;;;;UAUK;;;;;;;EAOb,MAAM;;;;;;;;;EASN,OAAO;;;;;KAMC,QAAQ,UAAU,kBAAkB,UAAU,IAAI,qBACxD,IACA,QAAQ,GAAG,KACX,kBAAkB,GAAG;;;;;KAMf,WAAW,QAAQ,aAAa,aAAa,kBAAkB,UAAU,eAAe;;;;;UAOnF,cAAc;EAC3B;EACA,aAAa;;;;;;UAOA,mBAAmB;EAChC;EACA,aAAa;;;;;;UAOA,mBAAmB;EAChC;EACA,aAAa;;;;;;UAOA,wBAAwB;EACrC;EACA,aAAa;;;;;;UAOA,gBAAgB;EAC7B;EACA,aAAa;;;;;;UAOA,qBAAqB;EAClC;EACA,aAAa;;;;;;UAOA,mBAAmB,UAAU,WAAW,kBAAkB;EACvE;EACA,YAAY;;KAGJ;GAAuB;;;;;;UAMlB,QAAQ,UAAU,kBAAkB,UAAU,IAAI,2BAA2B;EAC1F;;;;EAIA,UAAU;;;;;EAKV;;;;EAIA,YAAY;;;;;;UAOC,kBAAkB,UAAU,kBAAkB,UAAU,IAAI,2BAA2B;EACpG;EACA,UAAU,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;UClLd;;EAEf;;EAEA;;EAEA;;;;;EAKA;;;;;;;;;cAUW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA2ED,sBAAsB;cAErB,sBAAsB;;iBAGnB,aAAa,yBAAyB;;;;;;iBAWtC,iBAAiB,WAAW;;cAS/B;;;;;;iBAWG,qBAAqB;iBAIrB,sBAAsB;;iBAKtB;;iBAKA;;;;;;;;;;;;;;;;iBAqBA;;;;;;;;;;;iBAcA,kBAAkB;;;;;;;;;;;;iBAelB,kBAAkB;;;;;;;;;iBAYlB,gBAAgB;;;;;;;;;UAef;EACf;EACA;;EAEA;;EAEA;;;;;;;EAOA;;EAEA;;EAEA;;EAEA,aAAa;;cAGF;cA0CA,6BAA6B;;;;;;;;KAwO9B;;UAGK;EACf,IAAI;EACJ,mBAAmB;;;;;;;;cAcR,mCAAmC;;iBAyChC,8BACd,+BACC;;iBAUa,wBAAwB,aAAa;;;;;;;;cAWxC"}