baselode 0.1.21 → 0.1.23

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/dist/baselode.js CHANGED
@@ -1,33 +1,33 @@
1
- import { _ as Nt, w as G, H as N, P as de, F as L, T as M, c as vt, L as re, a as oe, D as j, A as Y, b as W, E as he, N as ge, d as Ae, M as ve, G as le, e as ce, B as Et, f as et, g as ke, h as ze, i as tt, j as Ue, k as At, l as nt, m as St, n as Tt, o as It } from "./baselode3dScene-CLEvddGM.js";
2
- import { p as Nr, q as vr, r as Er, s as Ar, t as Sr, u as Tr, v as Ir, x as Cr, y as Lr, z as Mr, C as Pr, I as Or, J as xr, K as Dr, O as Rr, Q as zr, R as $r, S as kr, U as Fr, V as wr, W as Hr, X as Gr, Y as Ur, Z as Br, $ as Vr, a0 as jr, a1 as Yr, a2 as Wr, a3 as qr, a4 as Xr, a5 as Kr, a6 as Zr, a7 as Jr, a8 as Qr, a9 as eo, aa as to, ab as no, ac as ro, ad as oo, ae as so, af as io, ag as ao, ah as lo, ai as co, aj as uo, ak as mo, al as fo, am as po, an as ho, ao as go, ap as yo, aq as bo, ar as _o, as as No, at as vo, au as Eo, av as Ao, aw as So, ax as To, ay as Io, az as Co, aA as Lo, aB as Mo, aC as Po, aD as Oo, aE as xo, aF as Do, aG as Ro, aH as zo, aI as $o, aJ as ko, aK as Fo, aL as wo, aM as Ho, aN as Go, aO as Uo, aP as Bo, aQ as Vo, aR as jo, aS as Yo, aT as Wo, aU as qo, aV as Xo, aW as Ko, aX as Zo, aY as Jo, aZ as Qo, a_ as es, a$ as ts, b0 as ns, b1 as rs, b2 as os, b3 as ss, b4 as is, b5 as as, b6 as ls, b7 as cs, b8 as us, b9 as ds, ba as ms, bb as fs, bc as ps, bd as hs, be as gs, bf as ys, bg as bs } from "./baselode3dScene-CLEvddGM.js";
1
+ import { _ as Et, w as G, H as v, P as de, F as L, T as P, c as At, L as re, a as oe, D as V, A as Y, b as W, E as pe, N as be, d as Ee, M as ve, G as le, e as ce, B as St, f as nt, g as ke, h as Fe, i as rt, j as Ge, k as Tt, l as ot, m as It, n as Lt, o as Mt, p as xt } from "./baselode3dScene-4nzt80B1.js";
2
+ import { q as Pr, r as Dr, s as Cr, t as Rr, u as Fr, v as zr, x as $r, y as kr, z as wr, C as Hr, I as Ur, J as Br, K as Gr, O as jr, Q as Vr, R as Yr, S as Wr, U as qr, V as Xr, W as Kr, X as Zr, Y as Jr, Z as Qr, $ as eo, a0 as to, a1 as no, a2 as ro, a3 as oo, a4 as so, a5 as io, a6 as ao, a7 as lo, a8 as co, a9 as uo, aa as fo, ab as mo, ac as ho, ad as po, ae as bo, af as go, ag as yo, ah as _o, ai as No, aj as vo, ak as Eo, al as Ao, am as So, an as To, ao as Io, ap as Lo, aq as Mo, ar as xo, as as Oo, at as Po, au as Do, av as Co, aw as Ro, ax as Fo, ay as zo, az as $o, aA as ko, aB as wo, aC as Ho, aD as Uo, aE as Bo, aF as Go, aG as jo, aH as Vo, aI as Yo, aJ as Wo, aK as qo, aL as Xo, aM as Ko, aN as Zo, aO as Jo, aP as Qo, aQ as es, aR as ts, aS as ns, aT as rs, aU as os, aV as ss, aW as is, aX as as, aY as ls, aZ as cs, a_ as us, a$ as ds, b0 as fs, b1 as ms, b2 as hs, b3 as ps, b4 as bs, b5 as gs, b6 as ys, b7 as _s, b8 as Ns, b9 as vs, ba as Es, bb as As, bc as Ss, bd as Ts, be as Is, bf as Ls, bg as Ms, bh as xs, bi as Os, bj as Ps, bk as Ds, bl as Cs } from "./baselode3dScene-4nzt80B1.js";
3
3
  import J from "papaparse";
4
- import { jsxs as H, jsx as E, Fragment as Ct } from "react/jsx-runtime";
5
- import { useRef as _e, useState as K, useEffect as ne, useMemo as ee, useCallback as Oe } from "react";
6
- import Ee from "plotly.js-dist-min";
4
+ import { jsxs as B, jsx as T, Fragment as Ot } from "react/jsx-runtime";
5
+ import { useRef as ye, useState as K, useEffect as te, useMemo as ee, useCallback as Oe } from "react";
6
+ import Pe from "plotly.js-dist-min";
7
7
  import * as Q from "three";
8
- function Se(e) {
8
+ function Ae(e) {
9
9
  return (e || "").toString().trim().toLowerCase().replace(/\s+/g, "_");
10
10
  }
11
11
  function ie(e, n = null, t = null) {
12
- const r = { ...Nt };
12
+ const r = { ...Et };
13
13
  if (t) {
14
14
  for (const [i, s] of Object.entries(t))
15
15
  if (i != null && s != null) {
16
- const a = Se(i), l = Se(s);
16
+ const a = Ae(i), l = Ae(s);
17
17
  r[a] = l;
18
18
  }
19
19
  }
20
20
  const o = {};
21
21
  for (const [i, s] of Object.entries(e)) {
22
- const a = Se(i), l = r[a] || a;
22
+ const a = Ae(i), l = r[a] || a;
23
23
  o[l] = s;
24
24
  }
25
25
  return o;
26
26
  }
27
- function Mn(e, n = null, t = null) {
27
+ function Cn(e, n = null, t = null) {
28
28
  return e.map((r) => ie(r, n, t));
29
29
  }
30
- const Lt = /* @__PURE__ */ new Set([
30
+ const Pt = /* @__PURE__ */ new Set([
31
31
  "hole_id",
32
32
  "holeid",
33
33
  "id",
@@ -60,13 +60,13 @@ const Lt = /* @__PURE__ */ new Set([
60
60
  "comment",
61
61
  "z"
62
62
  ]), Le = (e, n = null) => ie(e, null, n);
63
- function Mt(e) {
64
- return { holeId: e[N] };
63
+ function Dt(e) {
64
+ return { holeId: e[v] };
65
65
  }
66
- function rt(e, n = null) {
67
- const t = e[N], r = t !== void 0 ? `${t}`.trim() : "";
66
+ function st(e, n = null) {
67
+ const t = e[v], r = t !== void 0 ? `${t}`.trim() : "";
68
68
  if (!r) return null;
69
- const o = e[de] || e.project || e.project_code, i = Number(e[L]), s = Number(e[M]);
69
+ const o = e[de] || e.project || e.project_code, i = Number(e[L]), s = Number(e[P]);
70
70
  return !Number.isFinite(i) || !Number.isFinite(s) || s <= i ? null : {
71
71
  holeId: r,
72
72
  project: o,
@@ -75,7 +75,7 @@ function rt(e, n = null) {
75
75
  ...e
76
76
  };
77
77
  }
78
- function ot(e, n) {
78
+ function it(e, n) {
79
79
  var o;
80
80
  const t = n.sort((i, s) => i.from - s.from), r = [];
81
81
  return t.forEach((i) => {
@@ -83,14 +83,14 @@ function ot(e, n) {
83
83
  z: s,
84
84
  from: s,
85
85
  to: a,
86
- [N]: e,
86
+ [v]: e,
87
87
  [de]: l,
88
88
  ...u
89
89
  };
90
90
  r.push(c), r.push({ ...c, z: a });
91
91
  }), { id: e, project: (o = t[0]) == null ? void 0 : o.project, points: r };
92
92
  }
93
- function Pn(e, n = null) {
93
+ function Rn(e, n = null) {
94
94
  return new Promise((t, r) => {
95
95
  const o = /* @__PURE__ */ new Set();
96
96
  J.parse(e, {
@@ -98,7 +98,7 @@ function Pn(e, n = null) {
98
98
  dynamicTyping: !0,
99
99
  skipEmptyLines: !0,
100
100
  step: (i) => {
101
- const a = Le(i.data, n)[N];
101
+ const a = Le(i.data, n)[v];
102
102
  a !== void 0 && `${a}`.trim() !== "" && o.add(`${a}`.trim());
103
103
  },
104
104
  complete: () => t(Array.from(o)),
@@ -106,10 +106,10 @@ function Pn(e, n = null) {
106
106
  });
107
107
  });
108
108
  }
109
- function Pt(e) {
110
- return Object.entries(e || {}).some(([n, t]) => !(Lt.has(n) || t == null || typeof t == "string" && t.trim() === ""));
109
+ function Ct(e) {
110
+ return Object.entries(e || {}).some(([n, t]) => !(Pt.has(n) || t == null || typeof t == "string" && t.trim() === ""));
111
111
  }
112
- function Ot(e, n = null) {
112
+ function Rt(e, n = null) {
113
113
  return new Promise((t, r) => {
114
114
  const o = /* @__PURE__ */ new Map();
115
115
  J.parse(e, {
@@ -118,8 +118,8 @@ function Ot(e, n = null) {
118
118
  skipEmptyLines: !0,
119
119
  step: (i) => {
120
120
  const s = Le(i.data, n);
121
- if (!Pt(s)) return;
122
- const l = Mt(s).holeId;
121
+ if (!Ct(s)) return;
122
+ const l = Dt(s).holeId;
123
123
  if (l !== void 0 && `${l}`.trim() !== "") {
124
124
  const u = `${l}`.trim();
125
125
  o.has(u) || o.set(u, {
@@ -132,7 +132,7 @@ function Ot(e, n = null) {
132
132
  });
133
133
  });
134
134
  }
135
- function xt(e, n, t = null, r = null) {
135
+ function Ft(e, n, t = null, r = null) {
136
136
  return new Promise((o, i) => {
137
137
  const s = `${n}`.trim();
138
138
  if (!s) {
@@ -145,7 +145,7 @@ function xt(e, n, t = null, r = null) {
145
145
  dynamicTyping: !0,
146
146
  skipEmptyLines: !0,
147
147
  step: (l) => {
148
- const u = Le(l.data, r), c = rt(u, r);
148
+ const u = Le(l.data, r), c = st(u, r);
149
149
  c && `${c.holeId}`.trim() === s && a.push(c);
150
150
  },
151
151
  complete: () => {
@@ -153,14 +153,14 @@ function xt(e, n, t = null, r = null) {
153
153
  o(null);
154
154
  return;
155
155
  }
156
- const l = ot(s, a);
156
+ const l = it(s, a);
157
157
  o(l);
158
158
  },
159
159
  error: (l) => i(G("parseAssayHole", l))
160
160
  });
161
161
  });
162
162
  }
163
- function Dt(e, n = null, t = null) {
163
+ function zt(e, n = null, t = null) {
164
164
  return new Promise((r, o) => {
165
165
  J.parse(e, {
166
166
  header: !0,
@@ -169,23 +169,23 @@ function Dt(e, n = null, t = null) {
169
169
  complete: (i) => {
170
170
  const s = /* @__PURE__ */ new Map();
171
171
  i.data.forEach((l) => {
172
- const u = Le(l, t), c = rt(u, t);
172
+ const u = Le(l, t), c = st(u, t);
173
173
  c && (s.has(c.holeId) || s.set(c.holeId, []), s.get(c.holeId).push(c));
174
174
  });
175
- const a = Array.from(s.entries()).map(([l, u]) => ot(l, u));
175
+ const a = Array.from(s.entries()).map(([l, u]) => it(l, u));
176
176
  r({ holes: a });
177
177
  },
178
178
  error: (i) => o(G("parseAssaysCSV", i))
179
179
  });
180
180
  });
181
181
  }
182
- function On(e = {}) {
182
+ function Fn(e = {}) {
183
183
  const n = {};
184
184
  return Object.entries(e || {}).forEach(([t, r]) => {
185
- t && (n[Se(t)] = r);
185
+ t && (n[Ae(t)] = r);
186
186
  }), n;
187
187
  }
188
- function xn(e = {}, n = [], t) {
188
+ function zn(e = {}, n = [], t) {
189
189
  for (const r of n) {
190
190
  const o = e[r];
191
191
  if (o != null && `${o}`.trim() !== "")
@@ -193,8 +193,8 @@ function xn(e = {}, n = [], t) {
193
193
  }
194
194
  return t;
195
195
  }
196
- const Rt = 4;
197
- function st(e = [], n = "") {
196
+ const $t = 4;
197
+ function at(e = [], n = "") {
198
198
  if (!e.length) return [];
199
199
  if (!n) return e;
200
200
  const t = e.findIndex((i) => i === n);
@@ -202,7 +202,7 @@ function st(e = [], n = "") {
202
202
  const r = e[t], o = e.filter((i, s) => s !== t);
203
203
  return [r, ...o];
204
204
  }
205
- function Te({
205
+ function Se({
206
206
  property: e = "",
207
207
  chartType: n = "",
208
208
  categoricalProps: t = [],
@@ -211,18 +211,18 @@ function Te({
211
211
  } = {}) {
212
212
  return e ? r.includes(e) ? "comment" : t.includes(e) ? "categorical" : e === "dip" ? "tadpole" : !n || n === "categorical" || n === "comment" || n === "tadpole" ? o : n : n || o;
213
213
  }
214
- function it({
214
+ function lt({
215
215
  holeIds: e = [],
216
216
  focusedHoleId: n = "",
217
- plotCount: t = Rt,
217
+ plotCount: t = $t,
218
218
  defaultProp: r = "",
219
219
  categoricalProps: o = [],
220
220
  commentProps: i = [],
221
221
  numericDefaultChartType: s = "markers+line"
222
222
  } = {}) {
223
- const a = st(e, n);
223
+ const a = at(e, n);
224
224
  return Array.from({ length: t }).map((l, u) => {
225
- const c = a[u] || e[u] || "", d = Te({
225
+ const c = a[u] || e[u] || "", d = Se({
226
226
  property: r,
227
227
  chartType: "",
228
228
  categoricalProps: o,
@@ -236,8 +236,8 @@ function it({
236
236
  };
237
237
  });
238
238
  }
239
- function Ie(e = []) {
240
- const n = e.flatMap((a) => a.points || []), { numericCols: t, categoricalCols: r, commentCols: o, byType: i } = vt(n), s = t[0] || r[0] || "";
239
+ function Te(e = []) {
240
+ const n = e.flatMap((a) => a.points || []), { numericCols: t, categoricalCols: r, commentCols: o, byType: i } = At(n), s = t[0] || r[0] || "";
241
241
  return {
242
242
  numericProps: t,
243
243
  categoricalProps: r,
@@ -246,15 +246,15 @@ function Ie(e = []) {
246
246
  defaultProp: s
247
247
  };
248
248
  }
249
- async function zt(e, n = null) {
250
- return await Ot(e);
249
+ async function kt(e, n = null) {
250
+ return await Rt(e);
251
251
  }
252
- async function $t(e, n, t = null) {
253
- return await xt(e, n);
252
+ async function wt(e, n, t = null) {
253
+ return await Ft(e, n);
254
254
  }
255
- function kt(e = [], n = "") {
255
+ function Ht(e = [], n = "") {
256
256
  if (!e.length) return null;
257
- const { numericProps: t, categoricalProps: r, commentProps: o, columnMeta: i, defaultProp: s } = Ie(e), a = e.map((u) => u.id || u.holeId).filter(Boolean), l = it({
257
+ const { numericProps: t, categoricalProps: r, commentProps: o, columnMeta: i, defaultProp: s } = Te(e), a = e.map((u) => u.id || u.holeId).filter(Boolean), l = lt({
258
258
  holeIds: a,
259
259
  focusedHoleId: n,
260
260
  plotCount: 4,
@@ -273,34 +273,34 @@ function kt(e = [], n = "") {
273
273
  traceConfigs: l
274
274
  };
275
275
  }
276
- async function Dn(e, n = "", t = null) {
277
- const { holes: r } = await Dt(e, t), o = kt(r, n);
276
+ async function $n(e, n = "", t = null) {
277
+ const { holes: r } = await zt(e, t), o = Ht(r, n);
278
278
  if (!o) throw new Error("No valid assay intervals found.");
279
279
  return o;
280
280
  }
281
- function Rn(e, n = null) {
281
+ function kn(e, n = null) {
282
282
  return new Promise((t, r) => {
283
283
  J.parse(e, {
284
284
  header: !0,
285
285
  dynamicTyping: !0,
286
286
  skipEmptyLines: !0,
287
287
  complete: (o) => {
288
- const i = o.data.map((s) => Ft(s, n)).filter((s) => s[N] && Number.isFinite(s[j]) && Number.isFinite(s[W]) && Number.isFinite(s[Y]));
288
+ const i = o.data.map((s) => Ut(s, n)).filter((s) => s[v] && Number.isFinite(s[V]) && Number.isFinite(s[W]) && Number.isFinite(s[Y]));
289
289
  t(i);
290
290
  },
291
291
  error: (o) => r(G("parseSurveyCSV", o))
292
292
  });
293
293
  });
294
294
  }
295
- function Ft(e, n = null) {
296
- const t = ie(e, null, n), r = t[N], o = t[de] || t.project || t.project_code, i = pe(t[re]), s = pe(t[oe]), a = pe(t[j]), l = pe(t[W]), u = pe(t[Y]), c = pe(t.maxdepth);
295
+ function Ut(e, n = null) {
296
+ const t = ie(e, null, n), r = t[v], o = t[de] || t.project || t.project_code, i = he(t[re]), s = he(t[oe]), a = he(t[V]), l = he(t[W]), u = he(t[Y]), c = he(t.maxdepth);
297
297
  return {
298
298
  raw: t,
299
- [N]: r,
299
+ [v]: r,
300
300
  [de]: o,
301
301
  [re]: i,
302
302
  [oe]: s,
303
- [j]: a,
303
+ [V]: a,
304
304
  [W]: l,
305
305
  [Y]: u,
306
306
  maxdepth: c,
@@ -311,87 +311,87 @@ function Ft(e, n = null) {
311
311
  surveydepth: a
312
312
  };
313
313
  }
314
- const pe = (e) => {
314
+ const he = (e) => {
315
315
  const n = Number(e);
316
316
  return Number.isFinite(n) ? n : void 0;
317
317
  };
318
- function zn(e, n) {
319
- var u, c, d, m;
318
+ function wn(e, n) {
319
+ var u, c, d, f;
320
320
  const t = /* @__PURE__ */ new Map();
321
- e.forEach((f) => {
322
- const y = (f[N] || f.holeId || f.id || "").toString().trim();
323
- if (!y) return;
324
- const h = y.toLowerCase();
325
- t.has(h) || t.set(h, f);
321
+ e.forEach((m) => {
322
+ const g = (m[v] || m.holeId || m.id || "").toString().trim();
323
+ if (!g) return;
324
+ const h = g.toLowerCase();
325
+ t.has(h) || t.set(h, m);
326
326
  });
327
- const r = ((u = e[0]) == null ? void 0 : u.lat) ?? ((c = e[0]) == null ? void 0 : c[re]) ?? 0, o = ((d = e[0]) == null ? void 0 : d.lng) ?? ((m = e[0]) == null ? void 0 : m[oe]) ?? 0, i = 111132, s = 111320 * Math.cos(r * Math.PI / 180), a = /* @__PURE__ */ new Map();
328
- n.forEach((f) => {
329
- const y = (f[N] || "").toString().trim();
330
- if (!y) return;
331
- const h = y.toLowerCase();
332
- a.has(h) || a.set(h, []), a.get(h).push(f);
327
+ const r = ((u = e[0]) == null ? void 0 : u.lat) ?? ((c = e[0]) == null ? void 0 : c[re]) ?? 0, o = ((d = e[0]) == null ? void 0 : d.lng) ?? ((f = e[0]) == null ? void 0 : f[oe]) ?? 0, i = 111132, s = 111320 * Math.cos(r * Math.PI / 180), a = /* @__PURE__ */ new Map();
328
+ n.forEach((m) => {
329
+ const g = (m[v] || "").toString().trim();
330
+ if (!g) return;
331
+ const h = g.toLowerCase();
332
+ a.has(h) || a.set(h, []), a.get(h).push(m);
333
333
  });
334
334
  const l = [];
335
- return a.forEach((f, y) => {
336
- const h = t.get(y);
335
+ return a.forEach((m, g) => {
336
+ const h = t.get(g);
337
337
  if (!h) return;
338
- const b = f.filter((_) => Number.isFinite(_[j] ?? _.surveydepth)).sort((_, R) => (_[j] ?? _.surveydepth) - (R[j] ?? R.surveydepth));
339
- if (!b.length) return;
340
- const g = h.lat ?? h[re], A = h.lng ?? h[oe], P = 111132, U = 111320 * Math.cos(g * Math.PI / 180), $ = (A - o) * s, k = (g - r) * i, O = [];
341
- let D = 0, S = 0, p = 0;
342
- for (let _ = 0; _ < b.length; _ += 1) {
343
- const R = b[_], x = b[_ - 1], T = R[j] ?? R.surveydepth, v = R[Y] ?? R.azimuth, z = R[W] ?? R.dip;
344
- if (!x) {
345
- O.push({
346
- x: $ + D,
347
- y: k + S,
338
+ const y = m.filter((S) => Number.isFinite(S[V] ?? S.surveydepth)).sort((S, z) => (S[V] ?? S.surveydepth) - (z[V] ?? z.surveydepth));
339
+ if (!y.length) return;
340
+ const p = h.lat ?? h[re], E = h.lng ?? h[oe], I = 111132, k = 111320 * Math.cos(p * Math.PI / 180), w = (E - o) * s, F = (p - r) * i, R = [];
341
+ let D = 0, H = 0, b = 0;
342
+ for (let S = 0; S < y.length; S += 1) {
343
+ const z = y[S], A = y[S - 1], N = z[V] ?? z.surveydepth, _ = z[Y] ?? z.azimuth, O = z[W] ?? z.dip;
344
+ if (!A) {
345
+ R.push({
346
+ x: w + D,
347
+ y: F + H,
348
348
  z: 0,
349
- md: T,
350
- azimuth: v,
351
- dip: z
349
+ md: N,
350
+ azimuth: _,
351
+ dip: O
352
352
  });
353
353
  continue;
354
354
  }
355
- const F = x[j] ?? x.surveydepth, C = x[Y] ?? x.azimuth, B = x[W] ?? x.dip, V = T - F;
356
- if (V <= 0) continue;
357
- const w = Be(B), q = Be(z), X = $e(C), ae = $e(v), be = Math.acos(
358
- Math.sin(w) * Math.sin(q) * Math.cos(X - ae) + Math.cos(w) * Math.cos(q)
359
- ), me = be > 1e-6 ? 2 / be * Math.tan(be / 2) : 1, Pe = 0.5 * V * (Math.sin(w) * Math.cos(X) + Math.sin(q) * Math.cos(ae)) * me, fe = 0.5 * V * (Math.sin(w) * Math.sin(X) + Math.sin(q) * Math.sin(ae)) * me, _t = 0.5 * V * (Math.cos(w) + Math.cos(q)) * me;
360
- D += Pe, S += fe, p += _t, O.push({
361
- x: $ + D,
362
- y: k + S,
363
- z: -p,
355
+ const $ = A[V] ?? A.surveydepth, x = A[Y] ?? A.azimuth, C = A[W] ?? A.dip, j = N - $;
356
+ if (j <= 0) continue;
357
+ const U = je(C), q = je(O), X = ze(x), ae = ze(_), _e = Math.acos(
358
+ Math.sin(U) * Math.sin(q) * Math.cos(X - ae) + Math.cos(U) * Math.cos(q)
359
+ ), fe = _e > 1e-6 ? 2 / _e * Math.tan(_e / 2) : 1, xe = 0.5 * j * (Math.sin(U) * Math.cos(X) + Math.sin(q) * Math.cos(ae)) * fe, me = 0.5 * j * (Math.sin(U) * Math.sin(X) + Math.sin(q) * Math.sin(ae)) * fe, vt = 0.5 * j * (Math.cos(U) + Math.cos(q)) * fe;
360
+ D += xe, H += me, b += vt, R.push({
361
+ x: w + D,
362
+ y: F + H,
363
+ z: -b,
364
364
  // render with z up; depth down
365
- md: T,
366
- azimuth: v,
367
- dip: z
365
+ md: N,
366
+ azimuth: _,
367
+ dip: O
368
368
  });
369
369
  }
370
- const I = O.map((_) => ({
371
- ..._,
372
- lat: g + _.y / P,
373
- lng: A + _.x / U
370
+ const M = R.map((S) => ({
371
+ ...S,
372
+ lat: p + S.y / I,
373
+ lng: E + S.x / k
374
374
  }));
375
375
  l.push({
376
- id: h[N] || h.holeId || y,
376
+ id: h[v] || h.holeId || g,
377
377
  project: h[de] || h.project_id || h.project || "",
378
- points: I,
378
+ points: M,
379
379
  collar: h
380
380
  });
381
381
  }), l;
382
382
  }
383
- const $e = (e) => e * Math.PI / 180, Be = (e) => {
383
+ const ze = (e) => e * Math.PI / 180, je = (e) => {
384
384
  const n = Number(e), t = 90 + (Number.isFinite(n) ? n : 0), r = Math.min(180, Math.max(0, t));
385
- return $e(r);
385
+ return ze(r);
386
386
  };
387
- function te(e, n = void 0) {
387
+ function ne(e, n = void 0) {
388
388
  const t = Number(e);
389
389
  return Number.isFinite(t) ? t : n;
390
390
  }
391
391
  function Ve(e) {
392
392
  return e == null ? "" : `${e}`.trim();
393
393
  }
394
- function Ce(e = [], n = null) {
394
+ function Ie(e = [], n = null) {
395
395
  const t = n || "hole_id", o = [t, "hole_id", "holeId", "id"].find((i) => e.some((s) => Ve(s == null ? void 0 : s[i])));
396
396
  if (!o)
397
397
  throw G("canonicalizeHoleIdRows", new Error(`hole id column '${t}' not found`));
@@ -403,15 +403,15 @@ function Ce(e = [], n = null) {
403
403
  }))
404
404
  };
405
405
  }
406
- function je(e) {
406
+ function Ye(e) {
407
407
  return Number(e) * Math.PI / 180;
408
408
  }
409
- function xe(e, n) {
410
- const t = je(e), r = je(n), o = Math.cos(r) * Math.sin(t), i = Math.cos(r) * Math.cos(t), s = Math.sin(r) * -1;
409
+ function De(e, n) {
410
+ const t = Ye(e), r = Ye(n), o = Math.cos(r) * Math.sin(t), i = Math.cos(r) * Math.cos(t), s = Math.sin(r) * -1;
411
411
  return { ca: o, cb: i, cc: s };
412
412
  }
413
- function wt(e, n, t, r, o, i = "minimum_curvature") {
414
- const s = xe(n, t), a = xe(r, o);
413
+ function Bt(e, n, t, r, o, i = "minimum_curvature") {
414
+ const s = De(n, t), a = De(r, o);
415
415
  if (i === "tangential")
416
416
  return {
417
417
  dx: e * s.ca,
@@ -421,13 +421,13 @@ function wt(e, n, t, r, o, i = "minimum_curvature") {
421
421
  dip: t
422
422
  };
423
423
  if (i === "balanced_tangential") {
424
- const d = 0.5 * (n + r), m = 0.5 * (t + o), f = xe(d, m);
424
+ const d = 0.5 * (n + r), f = 0.5 * (t + o), m = De(d, f);
425
425
  return {
426
- dx: e * f.ca,
427
- dy: e * f.cb,
428
- dz: e * f.cc,
426
+ dx: e * m.ca,
427
+ dy: e * m.cb,
428
+ dz: e * m.cc,
429
429
  azimuth: d,
430
- dip: m
430
+ dip: f
431
431
  };
432
432
  }
433
433
  const l = s.ca * a.ca + s.cb * a.cb + s.cc * a.cc, u = Math.acos(Math.max(-1, Math.min(1, l))), c = u > 1e-6 ? 2 * Math.tan(u / 2) / u : 1;
@@ -439,108 +439,108 @@ function wt(e, n, t, r, o, i = "minimum_curvature") {
439
439
  dip: o
440
440
  };
441
441
  }
442
- function Fe(e = [], n = [], t = {}) {
442
+ function we(e = [], n = [], t = {}) {
443
443
  const {
444
444
  step: r = 1,
445
445
  holeIdCol: o = null,
446
446
  method: i = "minimum_curvature"
447
- } = t, s = Number.isFinite(Number(r)) && Number(r) > 0 ? Number(r) : 1, a = Ce(e, o), l = Ce(n, o || a.aliasCol);
447
+ } = t, s = Number.isFinite(Number(r)) && Number(r) > 0 ? Number(r) : 1, a = Ie(e, o), l = Ie(n, o || a.aliasCol);
448
448
  if (!a.rows.length || !l.rows.length) return [];
449
449
  const u = /* @__PURE__ */ new Map();
450
- a.rows.forEach((m) => {
451
- !m.hole_id || u.has(m.hole_id) || u.set(m.hole_id, m);
450
+ a.rows.forEach((f) => {
451
+ !f.hole_id || u.has(f.hole_id) || u.set(f.hole_id, f);
452
452
  });
453
453
  const c = /* @__PURE__ */ new Map();
454
- l.rows.forEach((m) => {
455
- m.hole_id && (c.has(m.hole_id) || c.set(m.hole_id, []), c.get(m.hole_id).push(m));
454
+ l.rows.forEach((f) => {
455
+ f.hole_id && (c.has(f.hole_id) || c.set(f.hole_id, []), c.get(f.hole_id).push(f));
456
456
  });
457
457
  const d = [];
458
- return c.forEach((m, f) => {
459
- const y = u.get(f);
460
- if (!y) return;
461
- const h = [...m].map((O) => ({
462
- ...O,
463
- from: te(O.from),
464
- azimuth: te(O.azimuth),
465
- dip: te(O.dip)
466
- })).filter((O) => Number.isFinite(O.from) && Number.isFinite(O.azimuth) && Number.isFinite(O.dip)).sort((O, D) => O.from - D.from);
458
+ return c.forEach((f, m) => {
459
+ const g = u.get(m);
460
+ if (!g) return;
461
+ const h = [...f].map((R) => ({
462
+ ...R,
463
+ from: ne(R.from),
464
+ azimuth: ne(R.azimuth),
465
+ dip: ne(R.dip)
466
+ })).filter((R) => Number.isFinite(R.from) && Number.isFinite(R.azimuth) && Number.isFinite(R.dip)).sort((R, D) => R.from - D.from);
467
467
  if (!h.length) return;
468
- let b = te(y.x, 0), g = te(y.y, 0), A = te(y.z, 0), P = h[0].from;
469
- const U = h[0].azimuth, $ = h[0].dip, k = {
470
- hole_id: f,
471
- md: P,
472
- x: b,
473
- y: g,
474
- z: A,
475
- azimuth: U,
476
- dip: $
468
+ let y = ne(g.x, 0), p = ne(g.y, 0), E = ne(g.z, 0), I = h[0].from;
469
+ const k = h[0].azimuth, w = h[0].dip, F = {
470
+ hole_id: m,
471
+ md: I,
472
+ x: y,
473
+ y: p,
474
+ z: E,
475
+ azimuth: k,
476
+ dip: w
477
477
  };
478
- a.aliasCol !== "hole_id" && y[a.aliasCol] !== void 0 && (k[a.aliasCol] = y[a.aliasCol]), d.push(k);
479
- for (let O = 0; O < h.length - 1; O += 1) {
480
- const D = h[O], S = h[O + 1], p = D.from, _ = S.from - p;
481
- if (_ <= 0) continue;
482
- const R = Math.max(1, Math.ceil(_ / s)), x = _ / R;
483
- for (let T = 0; T < R; T += 1) {
484
- P += x;
485
- const v = (P - p) / _, z = D.azimuth + v * (S.azimuth - D.azimuth), F = D.dip + v * (S.dip - D.dip), C = wt(x, D.azimuth, D.dip, S.azimuth, S.dip, i);
486
- b += C.dx, g += C.dy, A += C.dz;
487
- const B = {
488
- hole_id: f,
489
- md: P,
490
- x: b,
491
- y: g,
492
- z: A,
493
- azimuth: i === "minimum_curvature" ? z : C.azimuth,
494
- dip: i === "minimum_curvature" ? F : C.dip
478
+ a.aliasCol !== "hole_id" && g[a.aliasCol] !== void 0 && (F[a.aliasCol] = g[a.aliasCol]), d.push(F);
479
+ for (let R = 0; R < h.length - 1; R += 1) {
480
+ const D = h[R], H = h[R + 1], b = D.from, S = H.from - b;
481
+ if (S <= 0) continue;
482
+ const z = Math.max(1, Math.ceil(S / s)), A = S / z;
483
+ for (let N = 0; N < z; N += 1) {
484
+ I += A;
485
+ const _ = (I - b) / S, O = D.azimuth + _ * (H.azimuth - D.azimuth), $ = D.dip + _ * (H.dip - D.dip), x = Bt(A, D.azimuth, D.dip, H.azimuth, H.dip, i);
486
+ y += x.dx, p += x.dy, E += x.dz;
487
+ const C = {
488
+ hole_id: m,
489
+ md: I,
490
+ x: y,
491
+ y: p,
492
+ z: E,
493
+ azimuth: i === "minimum_curvature" ? O : x.azimuth,
494
+ dip: i === "minimum_curvature" ? $ : x.dip
495
495
  };
496
- a.aliasCol !== "hole_id" && y[a.aliasCol] !== void 0 && (B[a.aliasCol] = y[a.aliasCol]), d.push(B);
496
+ a.aliasCol !== "hole_id" && g[a.aliasCol] !== void 0 && (C[a.aliasCol] = g[a.aliasCol]), d.push(C);
497
497
  }
498
498
  }
499
499
  }), d;
500
500
  }
501
- function Ht(e, n, t = {}) {
502
- return Fe(e, n, { ...t, method: "minimum_curvature" });
501
+ function Gt(e, n, t = {}) {
502
+ return we(e, n, { ...t, method: "minimum_curvature" });
503
503
  }
504
- function $n(e, n, t = {}) {
505
- return Fe(e, n, { ...t, method: "tangential" });
504
+ function Hn(e, n, t = {}) {
505
+ return we(e, n, { ...t, method: "tangential" });
506
506
  }
507
- function kn(e, n, t = {}) {
508
- return Fe(e, n, { ...t, method: "balanced_tangential" });
507
+ function Un(e, n, t = {}) {
508
+ return we(e, n, { ...t, method: "balanced_tangential" });
509
509
  }
510
- function Fn(e, n, t = {}) {
511
- return Ht(e, n, t);
510
+ function Bn(e, n, t = {}) {
511
+ return Gt(e, n, t);
512
512
  }
513
- function Gt(e, n) {
513
+ function jt(e, n) {
514
514
  if (!e.length || !Number.isFinite(n)) return null;
515
515
  let t = null, r = 1 / 0;
516
516
  for (let o = 0; o < e.length; o += 1) {
517
- const i = e[o], s = te(i.md);
517
+ const i = e[o], s = ne(i.md);
518
518
  if (!Number.isFinite(s)) continue;
519
519
  const a = Math.abs(s - n);
520
520
  a < r && (r = a, t = i);
521
521
  }
522
522
  return t;
523
523
  }
524
- function wn(e = [], n = [], t = {}) {
525
- const r = t.holeIdCol || "hole_id", o = Ce(e, r), i = Ce(n, r);
524
+ function Gn(e = [], n = [], t = {}) {
525
+ const r = t.holeIdCol || "hole_id", o = Ie(e, r), i = Ie(n, r);
526
526
  if (!o.rows.length || !i.rows.length) return [...o.rows];
527
527
  const s = /* @__PURE__ */ new Map();
528
528
  return i.rows.forEach((a) => {
529
529
  a.hole_id && (s.has(a.hole_id) || s.set(a.hole_id, []), s.get(a.hole_id).push(a));
530
530
  }), s.forEach((a, l) => {
531
- s.set(l, [...a].sort((u, c) => te(u.md, 0) - te(c.md, 0)));
531
+ s.set(l, [...a].sort((u, c) => ne(u.md, 0) - ne(c.md, 0)));
532
532
  }), o.rows.map((a) => {
533
- const l = te(a.from), u = te(a.to), c = Number.isFinite(l) && Number.isFinite(u) ? 0.5 * (l + u) : void 0;
533
+ const l = ne(a.from), u = ne(a.to), c = Number.isFinite(l) && Number.isFinite(u) ? 0.5 * (l + u) : void 0;
534
534
  if (!a.hole_id || !Number.isFinite(c)) return { ...a };
535
- const d = Gt(s.get(a.hole_id) || [], c);
535
+ const d = jt(s.get(a.hole_id) || [], c);
536
536
  if (!d) return { ...a };
537
- const m = { ...a };
538
- return ["md", "x", "y", "z", "azimuth", "dip"].forEach((f) => {
539
- d[f] !== void 0 && (Object.prototype.hasOwnProperty.call(m, f) ? m[`${f}_trace`] = d[f] : m[f] = d[f]);
540
- }), m;
537
+ const f = { ...a };
538
+ return ["md", "x", "y", "z", "azimuth", "dip"].forEach((m) => {
539
+ d[m] !== void 0 && (Object.prototype.hasOwnProperty.call(f, m) ? f[`${m}_trace`] = d[m] : f[m] = d[m]);
540
+ }), f;
541
541
  });
542
542
  }
543
- function Hn(e, n = null) {
543
+ function jn(e, n = null) {
544
544
  return new Promise((t, r) => {
545
545
  J.parse(e, {
546
546
  header: !0,
@@ -549,14 +549,14 @@ function Hn(e, n = null) {
549
549
  complete: (o) => {
550
550
  const i = /* @__PURE__ */ new Map();
551
551
  o.data.forEach((a, l) => {
552
- const u = ie(a, null, n), c = u[N], d = c !== void 0 ? `${c}`.trim() : "", m = u[he] ?? u.x, f = u[ge] ?? u.y, y = u[Ae] ?? u.z, h = u.order ?? l;
553
- !d || m === null || m === void 0 || f === null || f === void 0 || y === null || y === void 0 || (i.has(d) || i.set(d, []), i.get(d).push({
552
+ const u = ie(a, null, n), c = u[v], d = c !== void 0 ? `${c}`.trim() : "", f = u[pe] ?? u.x, m = u[be] ?? u.y, g = u[Ee] ?? u.z, h = u.order ?? l;
553
+ !d || f === null || f === void 0 || m === null || m === void 0 || g === null || g === void 0 || (i.has(d) || i.set(d, []), i.get(d).push({
554
554
  ...u,
555
555
  holeId: d,
556
556
  order: h,
557
- x: Number(m) ?? 0,
558
- y: Number(f) ?? 0,
559
- z: Number(y) ?? 0
557
+ x: Number(f) ?? 0,
558
+ y: Number(m) ?? 0,
559
+ z: Number(g) ?? 0
560
560
  }));
561
561
  });
562
562
  const s = Array.from(i.entries()).map(([a, l]) => ({
@@ -574,7 +574,7 @@ function Hn(e, n = null) {
574
574
  });
575
575
  });
576
576
  }
577
- function ye(e) {
577
+ function ge(e) {
578
578
  return e ? Array.isArray(e) ? [...e] : [] : [];
579
579
  }
580
580
  function Z(e) {
@@ -592,11 +592,11 @@ function Ne(e = [], n = []) {
592
592
  return 0;
593
593
  }), t;
594
594
  }
595
- function Ut(e = [], n = "Intervals") {
595
+ function Vt(e = [], n = "Intervals") {
596
596
  if (!e.length) return;
597
- const t = Ne(e, [N, L, M]), r = /* @__PURE__ */ new Map();
597
+ const t = Ne(e, [v, L, P]), r = /* @__PURE__ */ new Map();
598
598
  t.forEach((o) => {
599
- const i = `${(o == null ? void 0 : o[N]) ?? ""}`.trim(), s = Number(o == null ? void 0 : o[L]), a = Number(o == null ? void 0 : o[M]);
599
+ const i = `${(o == null ? void 0 : o[v]) ?? ""}`.trim(), s = Number(o == null ? void 0 : o[L]), a = Number(o == null ? void 0 : o[P]);
600
600
  if (!i || !Number.isFinite(s) || !Number.isFinite(a)) return;
601
601
  const l = r.get(i);
602
602
  if (Number.isFinite(l) && s < l)
@@ -607,7 +607,7 @@ function Ut(e = [], n = "Intervals") {
607
607
  r.set(i, a);
608
608
  });
609
609
  }
610
- function Bt(e, n = {}) {
610
+ function Yt(e, n = {}) {
611
611
  return new Promise((t, r) => {
612
612
  J.parse(e, {
613
613
  header: !0,
@@ -619,7 +619,7 @@ function Bt(e, n = {}) {
619
619
  });
620
620
  });
621
621
  }
622
- function Vt(e = [], n = null, t = null) {
622
+ function Wt(e = [], n = null, t = null) {
623
623
  return e.map((r) => ie(r, n, t));
624
624
  }
625
625
  async function Me(e, n = {}) {
@@ -631,115 +631,115 @@ async function Me(e, n = {}) {
631
631
  } = n;
632
632
  let s;
633
633
  if (Array.isArray(e))
634
- s = ye(e);
634
+ s = ge(e);
635
635
  else if (t === "csv")
636
- s = await Bt(e, i);
636
+ s = await Yt(e, i);
637
637
  else throw t === "parquet" || t === "sql" ? G("loadTable", new Error(`Unsupported kind in JS runtime: ${t}`)) : G("loadTable", new Error(`Unsupported kind: ${t}`));
638
- return Vt(s, r, o);
638
+ return Wt(s, r, o);
639
639
  }
640
- async function Gn(e, n = {}) {
640
+ async function Vn(e, n = {}) {
641
641
  const {
642
642
  crs: t = null,
643
643
  sourceColumnMap: r = null,
644
644
  keepAll: o = !0,
645
645
  ...i
646
646
  } = n, s = await Me(e, { ...i, sourceColumnMap: r });
647
- if (!s.some((m) => N in m))
648
- throw G("loadCollars", new Error(`Collar table missing column: ${N}`));
649
- const l = s.some((m) => he in m && ge in m), u = s.some((m) => re in m && oe in m);
647
+ if (!s.some((f) => v in f))
648
+ throw G("loadCollars", new Error(`Collar table missing column: ${v}`));
649
+ const l = s.some((f) => pe in f && be in f), u = s.some((f) => re in f && oe in f);
650
650
  if (!l && !u)
651
651
  throw G("loadCollars", new Error("Collar table missing coordinate columns (need easting/northing or latitude/longitude)"));
652
- const c = s.map((m) => {
653
- const f = { ...m };
654
- if (N in f) {
655
- const y = f[N];
656
- f[N] = y == null ? "" : `${y}`.trim();
652
+ const c = s.map((f) => {
653
+ const m = { ...f };
654
+ if (v in m) {
655
+ const g = m[v];
656
+ m[v] = g == null ? "" : `${g}`.trim();
657
657
  }
658
- return re in f && (f[re] = Z(f[re])), oe in f && (f[oe] = Z(f[oe])), Ae in f && (f[Ae] = Z(f[Ae])), he in f && (f[he] = Z(f[he])), ge in f && (f[ge] = Z(f[ge])), !("datasource_hole_id" in f) && N in f && (f.datasource_hole_id = f[N]), f;
658
+ return re in m && (m[re] = Z(m[re])), oe in m && (m[oe] = Z(m[oe])), Ee in m && (m[Ee] = Z(m[Ee])), pe in m && (m[pe] = Z(m[pe])), be in m && (m[be] = Z(m[be])), !("datasource_hole_id" in m) && v in m && (m.datasource_hole_id = m[v]), m;
659
659
  });
660
- if (!c.every((m) => !(!m[N] || u && (!Number.isFinite(m[re]) || !Number.isFinite(m[oe])) || l && !u && (!Number.isFinite(m[he]) || !Number.isFinite(m[ge])))))
660
+ if (!c.every((f) => !(!f[v] || u && (!Number.isFinite(f[re]) || !Number.isFinite(f[oe])) || l && !u && (!Number.isFinite(f[pe]) || !Number.isFinite(f[be])))))
661
661
  throw G("loadCollars", new Error("Collar table has missing required values"));
662
662
  return c;
663
663
  }
664
- async function Un(e, n = {}) {
664
+ async function Yn(e, n = {}) {
665
665
  const {
666
666
  sourceColumnMap: t = null,
667
667
  keepAll: r = !0,
668
668
  ...o
669
- } = n, i = await Me(e, { ...o, sourceColumnMap: t }), s = [N, j, Y, W];
669
+ } = n, i = await Me(e, { ...o, sourceColumnMap: t }), s = [v, V, Y, W];
670
670
  for (const u of s)
671
671
  if (!i.some((d) => u in d))
672
672
  throw G("loadSurveys", new Error(`Survey table missing column: ${u}`));
673
673
  const a = i.map((u) => {
674
674
  const c = { ...u };
675
- if (N in c) {
676
- const d = c[N];
677
- c[N] = d == null ? "" : `${d}`.trim();
675
+ if (v in c) {
676
+ const d = c[v];
677
+ c[v] = d == null ? "" : `${d}`.trim();
678
678
  }
679
- return j in c && (c[j] = Z(c[j])), M in c && (c[M] = Z(c[M])), Y in c && (c[Y] = Z(c[Y])), W in c && (c[W] = Z(c[W])), c;
679
+ return V in c && (c[V] = Z(c[V])), P in c && (c[P] = Z(c[P])), Y in c && (c[Y] = Z(c[Y])), W in c && (c[W] = Z(c[W])), c;
680
680
  });
681
- if (!a.every((u) => !(!u[N] || !Number.isFinite(u[j]) || !Number.isFinite(u[Y]) || !Number.isFinite(u[W]))))
681
+ if (!a.every((u) => !(!u[v] || !Number.isFinite(u[V]) || !Number.isFinite(u[Y]) || !Number.isFinite(u[W]))))
682
682
  throw G("loadSurveys", new Error("Survey table has missing required values"));
683
- return Ne(a, [N, j]);
683
+ return Ne(a, [v, V]);
684
684
  }
685
- async function Bn(e, n = {}) {
685
+ async function Wn(e, n = {}) {
686
686
  const {
687
687
  sourceColumnMap: t = null,
688
688
  keepAll: r = !0,
689
689
  ...o
690
- } = n, i = await Me(e, { ...o, sourceColumnMap: t }), s = [N, L, M];
690
+ } = n, i = await Me(e, { ...o, sourceColumnMap: t }), s = [v, L, P];
691
691
  for (const u of s)
692
692
  if (!i.some((d) => u in d))
693
693
  throw G("loadAssays", new Error(`Assay table missing column: ${u}`));
694
694
  const a = i.map((u) => {
695
695
  const c = { ...u };
696
- if (N in c) {
697
- const d = c[N];
698
- c[N] = d == null ? "" : `${d}`.trim();
696
+ if (v in c) {
697
+ const d = c[v];
698
+ c[v] = d == null ? "" : `${d}`.trim();
699
699
  }
700
- return L in c && (c[L] = Z(c[L])), M in c && (c[M] = Z(c[M])), L in c && M in c && Number.isFinite(c[L]) && Number.isFinite(c[M]) && (c[ve] = 0.5 * (c[L] + c[M])), c;
700
+ return L in c && (c[L] = Z(c[L])), P in c && (c[P] = Z(c[P])), L in c && P in c && Number.isFinite(c[L]) && Number.isFinite(c[P]) && (c[ve] = 0.5 * (c[L] + c[P])), c;
701
701
  });
702
- if (!a.every((u) => !(!u[N] || !Number.isFinite(u[L]) || !Number.isFinite(u[M]) || !(u[M] > u[L]))))
702
+ if (!a.every((u) => !(!u[v] || !Number.isFinite(u[L]) || !Number.isFinite(u[P]) || !(u[P] > u[L]))))
703
703
  throw G("loadAssays", new Error("Assay table has missing required values"));
704
- return Ne(a, [N, L, M]);
704
+ return Ne(a, [v, L, P]);
705
705
  }
706
- async function Vn(e, n = {}) {
706
+ async function qn(e, n = {}) {
707
707
  const {
708
708
  sourceColumnMap: t = null,
709
709
  keepAll: r = !0,
710
710
  ...o
711
- } = n, i = await Me(e, { ...o, sourceColumnMap: t }), s = [N, L, M];
711
+ } = n, i = await Me(e, { ...o, sourceColumnMap: t }), s = [v, L, P];
712
712
  for (const c of s)
713
- if (!i.some((m) => c in m))
713
+ if (!i.some((f) => c in f))
714
714
  throw G("loadGeology", new Error(`Geology table missing column: ${c}`));
715
715
  const a = i.map((c) => {
716
716
  const d = { ...c };
717
- if (N in d) {
718
- const y = d[N];
719
- d[N] = y == null ? "" : `${y}`.trim();
717
+ if (v in d) {
718
+ const g = d[v];
719
+ d[v] = g == null ? "" : `${g}`.trim();
720
720
  }
721
- L in d && (d[L] = Z(d[L])), M in d && (d[M] = Z(d[M])), L in d && M in d && Number.isFinite(d[L]) && Number.isFinite(d[M]) && (d[M] === d[L] && (d[L] = Math.round(d[L] * 1e3) / 1e3, d[M] = d[L] + 1e-3), d[ve] = 0.5 * (d[L] + d[M]));
722
- const m = d[le] !== void 0 && d[le] !== null && `${d[le]}`.trim() !== "", f = d[ce] !== void 0 && d[ce] !== null && `${d[ce]}`.trim() !== "";
723
- return !m && f && (d[le] = d[ce]), m && !f && (d[ce] = d[le]), d;
721
+ L in d && (d[L] = Z(d[L])), P in d && (d[P] = Z(d[P])), L in d && P in d && Number.isFinite(d[L]) && Number.isFinite(d[P]) && (d[P] === d[L] && (d[L] = Math.round(d[L] * 1e3) / 1e3, d[P] = d[L] + 1e-3), d[ve] = 0.5 * (d[L] + d[P]));
722
+ const f = d[le] !== void 0 && d[le] !== null && `${d[le]}`.trim() !== "", m = d[ce] !== void 0 && d[ce] !== null && `${d[ce]}`.trim() !== "";
723
+ return !f && m && (d[le] = d[ce]), f && !m && (d[ce] = d[le]), d;
724
724
  });
725
- if (!a.every((c) => !(!c[N] || !Number.isFinite(c[L]) || !Number.isFinite(c[M]) || !(c[M] > c[L]))))
725
+ if (!a.every((c) => !(!c[v] || !Number.isFinite(c[L]) || !Number.isFinite(c[P]) || !(c[P] > c[L]))))
726
726
  throw G("loadGeology", new Error("Geology table has missing or invalid interval values"));
727
727
  if (!a.some((c) => {
728
- const d = c[le], m = c[ce];
729
- return d != null && `${d}`.trim() !== "" || m != null && `${m}`.trim() !== "";
728
+ const d = c[le], f = c[ce];
729
+ return d != null && `${d}`.trim() !== "" || f != null && `${f}`.trim() !== "";
730
730
  }))
731
731
  throw G("loadGeology", new Error(`Geology table missing categorical columns: ${le} or ${ce}`));
732
- if (Ut(a, "Geology"), !r) {
733
- const c = new Set(Object.keys(Et));
732
+ if (Vt(a, "Geology"), !r) {
733
+ const c = new Set(Object.keys(St));
734
734
  return Ne(
735
- a.map((d) => Object.fromEntries(Object.entries(d).filter(([m]) => c.has(m)))),
736
- [N, L, M]
735
+ a.map((d) => Object.fromEntries(Object.entries(d).filter(([f]) => c.has(f)))),
736
+ [v, L, P]
737
737
  );
738
738
  }
739
- return Ne(a, [N, L, M]);
739
+ return Ne(a, [v, L, P]);
740
740
  }
741
- function jn(e = [], n = [], t = {}) {
742
- const r = Array.isArray(t.onCols) && t.onCols.length ? t.onCols : [N];
741
+ function Xn(e = [], n = [], t = {}) {
742
+ const r = Array.isArray(t.onCols) && t.onCols.length ? t.onCols : [v];
743
743
  if (!n.length) return [...e];
744
744
  const o = (s) => r.map((a) => `${(s == null ? void 0 : s[a]) ?? ""}`).join("|"), i = /* @__PURE__ */ new Map();
745
745
  return n.forEach((s) => {
@@ -753,10 +753,10 @@ function jn(e = [], n = [], t = {}) {
753
753
  }), l;
754
754
  });
755
755
  }
756
- function Yn(e = [], n = null) {
756
+ function Kn(e = [], n = null) {
757
757
  return n == null ? [...e] : e.length ? e.some((r) => de in r) ? e.filter((r) => (r == null ? void 0 : r[de]) === n) : [...e] : [];
758
758
  }
759
- function Wn(e = [], n = []) {
759
+ function Zn(e = [], n = []) {
760
760
  return e.map((t) => {
761
761
  const r = { ...t };
762
762
  return n.forEach((o) => {
@@ -766,7 +766,7 @@ function Wn(e = [], n = []) {
766
766
  }), r;
767
767
  });
768
768
  }
769
- function qn({
769
+ function Jn({
770
770
  collars: e = [],
771
771
  surveys: n = [],
772
772
  assays: t = [],
@@ -775,47 +775,47 @@ function qn({
775
775
  metadata: i = {}
776
776
  } = {}) {
777
777
  return {
778
- collars: ye(e),
779
- surveys: ye(n),
780
- assays: ye(t),
781
- geology: ye(r),
782
- structures: ye(o),
778
+ collars: ge(e),
779
+ surveys: ge(n),
780
+ assays: ge(t),
781
+ geology: ge(r),
782
+ structures: ge(o),
783
783
  metadata: i || {}
784
784
  };
785
785
  }
786
- const we = (e, n = null) => ie(e, null, n);
787
- function jt(e) {
786
+ const He = (e, n = null) => ie(e, null, n);
787
+ function qt(e) {
788
788
  if (!e.length) return null;
789
- const n = e[0], t = L in n && M in n, r = j in n && !t;
789
+ const n = e[0], t = L in n && P in n, r = V in n && !t;
790
790
  return t ? "interval" : r ? "point" : null;
791
791
  }
792
792
  function se(e) {
793
793
  const n = Number(e);
794
794
  return Number.isFinite(n) ? n : null;
795
795
  }
796
- function at(e) {
797
- const n = e[N] !== void 0 ? `${e[N]}`.trim() : "";
796
+ function ct(e) {
797
+ const n = e[v] !== void 0 ? `${e[v]}`.trim() : "";
798
798
  if (!n) return null;
799
- const t = se(e[j]);
799
+ const t = se(e[V]);
800
800
  return t === null ? null : {
801
- [N]: n,
802
- [j]: t,
801
+ [v]: n,
802
+ [V]: t,
803
803
  [W]: se(e[W]),
804
804
  [Y]: se(e[Y]),
805
805
  comments: e.comments != null ? `${e.comments}` : null,
806
806
  ...e
807
807
  };
808
808
  }
809
- function lt(e) {
810
- const n = e[N] !== void 0 ? `${e[N]}`.trim() : "";
809
+ function ut(e) {
810
+ const n = e[v] !== void 0 ? `${e[v]}`.trim() : "";
811
811
  if (!n) return null;
812
- const t = se(e[L]), r = se(e[M]);
812
+ const t = se(e[L]), r = se(e[P]);
813
813
  if (t === null || r === null || r <= t) return null;
814
814
  const o = 0.5 * (t + r);
815
815
  return {
816
- [N]: n,
816
+ [v]: n,
817
817
  [L]: t,
818
- [M]: r,
818
+ [P]: r,
819
819
  mid: o,
820
820
  [W]: se(e[W]),
821
821
  [Y]: se(e[Y]),
@@ -824,7 +824,7 @@ function lt(e) {
824
824
  ...e
825
825
  };
826
826
  }
827
- function Xn(e) {
827
+ function Qn(e) {
828
828
  const n = [], t = [];
829
829
  for (const r of e) {
830
830
  const o = [], i = se(r[W]), s = se(r[Y]);
@@ -832,7 +832,7 @@ function Xn(e) {
832
832
  }
833
833
  return { valid: n, errors: t };
834
834
  }
835
- function Kn(e, n = null) {
835
+ function er(e, n = null) {
836
836
  return new Promise((t, r) => {
837
837
  const o = {
838
838
  header: !0,
@@ -841,7 +841,7 @@ function Kn(e, n = null) {
841
841
  complete: (i) => {
842
842
  const s = [];
843
843
  for (const a of i.data) {
844
- const l = we(a, n), u = at(l);
844
+ const l = He(a, n), u = ct(l);
845
845
  u && s.push(u);
846
846
  }
847
847
  t(s);
@@ -852,7 +852,7 @@ function Kn(e, n = null) {
852
852
  `) ? J.parse(e, o) : J.parse(e, o);
853
853
  });
854
854
  }
855
- function Zn(e, n = null) {
855
+ function tr(e, n = null) {
856
856
  return new Promise((t, r) => {
857
857
  J.parse(e, {
858
858
  header: !0,
@@ -861,7 +861,7 @@ function Zn(e, n = null) {
861
861
  complete: (o) => {
862
862
  const i = [];
863
863
  for (const s of o.data) {
864
- const a = we(s, n), l = lt(a);
864
+ const a = He(s, n), l = ut(a);
865
865
  l && i.push(l);
866
866
  }
867
867
  t(i);
@@ -870,7 +870,7 @@ function Zn(e, n = null) {
870
870
  });
871
871
  });
872
872
  }
873
- function Yt(e, n = N) {
873
+ function Xt(e, n = v) {
874
874
  const t = /* @__PURE__ */ new Map();
875
875
  for (const r of e) {
876
876
  const o = r[n] != null ? String(r[n]).trim() : "";
@@ -878,14 +878,14 @@ function Yt(e, n = N) {
878
878
  }
879
879
  return Array.from(t.values());
880
880
  }
881
- function Wt(e, n = null) {
881
+ function Kt(e, n = null) {
882
882
  return new Promise((t, r) => {
883
883
  J.parse(e, {
884
884
  header: !0,
885
885
  dynamicTyping: !0,
886
886
  skipEmptyLines: !0,
887
887
  complete: (o) => {
888
- const i = o.data.map((l) => we(l, n)), s = jt(i);
888
+ const i = o.data.map((l) => He(l, n)), s = qt(i);
889
889
  if (!s) {
890
890
  r(G(
891
891
  "parseStructuralCSV",
@@ -895,7 +895,7 @@ function Wt(e, n = null) {
895
895
  }
896
896
  const a = [];
897
897
  for (const l of i) {
898
- const u = s === "interval" ? lt(l) : at(l);
898
+ const u = s === "interval" ? ut(l) : ct(l);
899
899
  u && a.push(u);
900
900
  }
901
901
  t({ schema: s, rows: a });
@@ -904,7 +904,7 @@ function Wt(e, n = null) {
904
904
  });
905
905
  });
906
906
  }
907
- function qt(e) {
907
+ function Zt(e) {
908
908
  return new Promise((n) => {
909
909
  J.parse(e, {
910
910
  header: !0,
@@ -913,21 +913,21 @@ function qt(e) {
913
913
  complete: (t) => {
914
914
  const r = /* @__PURE__ */ new Map();
915
915
  for (const i of t.data) {
916
- const s = ie(i), a = s[N] != null ? `${s[N]}`.trim() : "";
916
+ const s = ie(i), a = s[v] != null ? `${s[v]}`.trim() : "";
917
917
  if (!a) continue;
918
- const l = Number(s[L]), u = Number(s[M]);
918
+ const l = Number(s[L]), u = Number(s[P]);
919
919
  if (!Number.isFinite(l) || !Number.isFinite(u) || u <= l) continue;
920
- const c = (l + u) / 2, { [W]: d, [Y]: m, ...f } = s, y = {
921
- ...f,
922
- [N]: a,
920
+ const c = (l + u) / 2, { [W]: d, [Y]: f, ...m } = s, g = {
921
+ ...m,
922
+ [v]: a,
923
923
  [L]: l,
924
- [M]: u,
924
+ [P]: u,
925
925
  [ve]: c,
926
- [j]: c,
926
+ [V]: c,
927
927
  // unified depth field for y-axis rendering
928
928
  _source: "assay"
929
929
  };
930
- r.has(a) || r.set(a, []), r.get(a).push(y);
930
+ r.has(a) || r.set(a, []), r.get(a).push(g);
931
931
  }
932
932
  const o = Array.from(r.entries()).map(([i, s]) => ({
933
933
  holeId: i,
@@ -938,7 +938,7 @@ function qt(e) {
938
938
  });
939
939
  });
940
940
  }
941
- function Xt(e) {
941
+ function Jt(e) {
942
942
  return new Promise((n) => {
943
943
  J.parse(e, {
944
944
  header: !0,
@@ -947,20 +947,20 @@ function Xt(e) {
947
947
  complete: (t) => {
948
948
  const r = /* @__PURE__ */ new Map();
949
949
  for (const o of t.data) {
950
- const i = ie(o), s = (i[N] ?? "").toString().trim();
950
+ const i = ie(o), s = (i[v] ?? "").toString().trim();
951
951
  if (!s) continue;
952
- const a = Number(i[L]), l = Number(i[M]);
952
+ const a = Number(i[L]), l = Number(i[P]);
953
953
  if (!Number.isFinite(a) || !Number.isFinite(l) || l <= a) continue;
954
- const u = (a + l) / 2, { [W]: c, [Y]: d, ...m } = i, f = {
955
- ...m,
956
- [N]: s,
954
+ const u = (a + l) / 2, { [W]: c, [Y]: d, ...f } = i, m = {
955
+ ...f,
956
+ [v]: s,
957
957
  [L]: a,
958
- [M]: l,
958
+ [P]: l,
959
959
  [ve]: u,
960
- [j]: u,
960
+ [V]: u,
961
961
  _source: "geology"
962
962
  };
963
- r.has(s) || r.set(s, []), r.get(s).push(f);
963
+ r.has(s) || r.set(s, []), r.get(s).push(m);
964
964
  }
965
965
  n({
966
966
  holes: Array.from(r.entries()).map(([o, i]) => ({
@@ -972,13 +972,13 @@ function Xt(e) {
972
972
  });
973
973
  });
974
974
  }
975
- async function Jn({ assayCsv: e, structuralCsv: n, geologyCsv: t } = {}) {
975
+ async function nr({ assayCsv: e, structuralCsv: n, geologyCsv: t } = {}) {
976
976
  const [r, o, i] = await Promise.all([
977
- e ? qt(e) : Promise.resolve([]),
978
- n ? Wt(n).then(
979
- ({ rows: a }) => Yt(a.map((l) => ({ ...l, _source: "structural" })))
977
+ e ? Zt(e) : Promise.resolve([]),
978
+ n ? Kt(n).then(
979
+ ({ rows: a }) => Xt(a.map((l) => ({ ...l, _source: "structural" })))
980
980
  ) : Promise.resolve([]),
981
- t ? Xt(t).then(({ holes: a }) => a) : Promise.resolve([])
981
+ t ? Jt(t).then(({ holes: a }) => a) : Promise.resolve([])
982
982
  ]), s = new Map(r.map((a) => [a.holeId, { ...a, points: [...a.points] }]));
983
983
  for (const a of [...o, ...i]) {
984
984
  const l = a.holeId;
@@ -991,7 +991,7 @@ async function Jn({ assayCsv: e, structuralCsv: n, geologyCsv: t } = {}) {
991
991
  }
992
992
  return { holes: Array.from(s.values()) };
993
993
  }
994
- function Qn(e, n, t, r, o = {}) {
994
+ function rr(e, n, t, r, o = {}) {
995
995
  const i = o.fromCol || "from", s = o.toCol || "to", a = o.holeCol || "hole_id";
996
996
  if (!e || !e.length) return [];
997
997
  const l = {};
@@ -1001,58 +1001,239 @@ function Qn(e, n, t, r, o = {}) {
1001
1001
  }
1002
1002
  const u = [];
1003
1003
  for (const [c, d] of Object.entries(l)) {
1004
- const f = [...d].sort((g, A) => Number(g[i]) - Number(A[i])).filter((g) => {
1005
- const A = Number(g[n]);
1006
- return Number.isFinite(A) && A >= t;
1004
+ const m = [...d].sort((p, E) => Number(p[i]) - Number(E[i])).filter((p) => {
1005
+ const E = Number(p[n]);
1006
+ return Number.isFinite(E) && E >= t;
1007
1007
  });
1008
- if (!f.length) continue;
1009
- const y = [];
1010
- let h = [], b = null;
1011
- for (const g of f) {
1012
- const A = Number(g[i]), P = Number(g[s]);
1013
- b === null || Math.abs(A - b) > 1e-6 ? (h.length && y.push(h), h = [g]) : h.push(g), b = P;
1008
+ if (!m.length) continue;
1009
+ const g = [];
1010
+ let h = [], y = null;
1011
+ for (const p of m) {
1012
+ const E = Number(p[i]), I = Number(p[s]);
1013
+ y === null || Math.abs(E - y) > 1e-6 ? (h.length && g.push(h), h = [p]) : h.push(p), y = I;
1014
1014
  }
1015
- h.length && y.push(h);
1016
- for (const g of y) {
1017
- const A = Number(g[0][i]), P = Number(g[g.length - 1][s]), U = P - A;
1018
- if (U < r) continue;
1019
- let $ = 0, k = 0;
1020
- for (const p of g) {
1021
- const I = Number(p[n]), _ = Number(p[s]) - Number(p[i]);
1022
- $ += I * _, k += _;
1015
+ h.length && g.push(h);
1016
+ for (const p of g) {
1017
+ const E = Number(p[0][i]), I = Number(p[p.length - 1][s]), k = I - E;
1018
+ if (k < r) continue;
1019
+ let w = 0, F = 0;
1020
+ for (const b of p) {
1021
+ const M = Number(b[n]), S = Number(b[s]) - Number(b[i]);
1022
+ w += M * S, F += S;
1023
1023
  }
1024
- const O = $ / k, D = g.length, S = `${U.toFixed(1)} m @ ${O.toFixed(2)} ${n}`;
1024
+ const R = w / F, D = p.length, H = `${k.toFixed(1)} m @ ${R.toFixed(2)} ${n}`;
1025
1025
  u.push({
1026
1026
  [a]: c,
1027
1027
  assay_field: n,
1028
- [i]: A,
1029
- [s]: P,
1030
- length: U,
1031
- avg_grade: O,
1028
+ [i]: E,
1029
+ [s]: I,
1030
+ length: k,
1031
+ avg_grade: R,
1032
1032
  n_samples: D,
1033
- label: S
1033
+ label: H
1034
+ });
1035
+ }
1036
+ }
1037
+ return u;
1038
+ }
1039
+ function $e(e, n) {
1040
+ const t = /* @__PURE__ */ new Map();
1041
+ for (const r of e) {
1042
+ const o = r[n];
1043
+ o != null && (t.has(o) || t.set(o, []), t.get(o).push(r));
1044
+ }
1045
+ return t;
1046
+ }
1047
+ function or(e, { fromCol: n = L, toCol: t = P } = {}) {
1048
+ return e.map((r) => Number(r[t]) - Number(r[n]));
1049
+ }
1050
+ function sr(e, { fromCol: n = L, toCol: t = P } = {}) {
1051
+ return e.map((r) => (Number(r[n]) + Number(r[t])) / 2);
1052
+ }
1053
+ function ir(e, { fromCol: n = L, toCol: t = P, holeCol: r = v, minGap: o = 0 } = {}) {
1054
+ if (!e || !e.length) return [];
1055
+ const i = [];
1056
+ for (const [s, a] of $e(e, r)) {
1057
+ const l = [...a].sort(
1058
+ (c, d) => Number(c[n]) - Number(d[n])
1059
+ );
1060
+ let u = null;
1061
+ for (const c of l) {
1062
+ const d = Number(c[n]), f = Number(c[t]);
1063
+ u !== null && d - u > o && i.push({
1064
+ [r]: s,
1065
+ [n]: u,
1066
+ [t]: d,
1067
+ length: d - u
1068
+ }), (u === null || f > u) && (u = f);
1069
+ }
1070
+ }
1071
+ return i;
1072
+ }
1073
+ function ar(e, { fromCol: n = L, toCol: t = P, holeCol: r = v } = {}) {
1074
+ if (!e || !e.length) return [];
1075
+ const o = e.map((a, l) => ({ row: a, originalIndex: l })), i = /* @__PURE__ */ new Map();
1076
+ for (const a of o) {
1077
+ const l = a.row[r];
1078
+ l != null && (i.has(l) || i.set(l, []), i.get(l).push(a));
1079
+ }
1080
+ const s = [];
1081
+ for (const [a, l] of i) {
1082
+ const u = [...l].sort(
1083
+ (c, d) => Number(c.row[n]) - Number(d.row[n])
1084
+ );
1085
+ for (let c = 0; c < u.length; c += 1) {
1086
+ const d = Number(u[c].row[n]), f = Number(u[c].row[t]);
1087
+ for (let m = c + 1; m < u.length; m += 1) {
1088
+ const g = Number(u[m].row[n]);
1089
+ if (g >= f) break;
1090
+ const h = Number(u[m].row[t]), y = Math.max(d, g), p = Math.min(f, h);
1091
+ p > y && s.push({
1092
+ [r]: a,
1093
+ [n]: y,
1094
+ [t]: p,
1095
+ length: p - y,
1096
+ first_index: u[c].originalIndex,
1097
+ second_index: u[m].originalIndex
1098
+ });
1099
+ }
1100
+ }
1101
+ }
1102
+ return s;
1103
+ }
1104
+ function Qt(e, n) {
1105
+ if (e == null) return { byHole: /* @__PURE__ */ new Map(), all: [] };
1106
+ if (Array.isArray(e)) {
1107
+ const t = e[0];
1108
+ if (e.length && t && typeof t == "object" && t[n] != null && t.depth != null) {
1109
+ const o = /* @__PURE__ */ new Map();
1110
+ for (const i of e) {
1111
+ const s = i && i[n], a = i && i.depth;
1112
+ s == null || a == null || (o.has(s) || o.set(s, []), o.get(s).push(Number(a)));
1113
+ }
1114
+ return { byHole: o, all: [] };
1115
+ }
1116
+ return { byHole: /* @__PURE__ */ new Map(), all: e.map(Number) };
1117
+ }
1118
+ if (typeof e == "number")
1119
+ return { byHole: /* @__PURE__ */ new Map(), all: [Number(e)] };
1120
+ if (e && typeof e == "object") {
1121
+ if (e[n] != null && e.depth != null) {
1122
+ const r = /* @__PURE__ */ new Map();
1123
+ return r.set(e[n], [Number(e.depth)]), { byHole: r, all: [] };
1124
+ }
1125
+ const t = /* @__PURE__ */ new Map();
1126
+ for (const [r, o] of Object.entries(e)) {
1127
+ const i = Array.isArray(o) ? o : [o];
1128
+ t.set(r, i.map(Number));
1129
+ }
1130
+ return { byHole: t, all: [] };
1131
+ }
1132
+ return { byHole: /* @__PURE__ */ new Map(), all: [] };
1133
+ }
1134
+ function lr(e, n, { fromCol: t = L, toCol: r = P, holeCol: o = v } = {}) {
1135
+ if (!e || !e.length) return [];
1136
+ const { byHole: i, all: s } = Qt(n, o), a = [];
1137
+ for (const l of e) {
1138
+ const u = l[o], c = Number(l[t]), d = Number(l[r]), f = i.has(u) ? i.get(u) : s, m = [...new Set(
1139
+ f.map(Number).filter((h) => h > c && h < d)
1140
+ )].sort((h, y) => h - y);
1141
+ if (!m.length) {
1142
+ a.push({ ...l });
1143
+ continue;
1144
+ }
1145
+ const g = [c, ...m, d];
1146
+ for (let h = 0; h < g.length - 1; h += 1)
1147
+ a.push({
1148
+ ...l,
1149
+ [t]: g[h],
1150
+ [r]: g[h + 1]
1034
1151
  });
1152
+ }
1153
+ return a;
1154
+ }
1155
+ function cr(e, n, t, { fromCol: r = L, toCol: o = P } = {}) {
1156
+ if (!e || !e.length) return [];
1157
+ const i = [];
1158
+ for (const s of e) {
1159
+ let a = Number(s[r]), l = Number(s[o]);
1160
+ if (n != null) {
1161
+ if (l <= n) continue;
1162
+ a < n && (a = n);
1163
+ }
1164
+ if (t != null) {
1165
+ if (a >= t) continue;
1166
+ l > t && (l = t);
1167
+ }
1168
+ i.push({ ...s, [r]: a, [o]: l });
1169
+ }
1170
+ return i;
1171
+ }
1172
+ function We(e, n, t, r) {
1173
+ for (const o of e)
1174
+ if (Number(o[t]) <= n && Number(o[r]) > n) return o;
1175
+ return null;
1176
+ }
1177
+ function ur(e, { fromCol: n = L, toCol: t = P, holeCol: r = v } = {}) {
1178
+ if (!e) return [];
1179
+ const o = Object.keys(e);
1180
+ if (!o.length) return [];
1181
+ const i = o[0], s = e[i] || [];
1182
+ if (!s.length) return [];
1183
+ const a = $e(s, r), l = {};
1184
+ for (const c of o.slice(1))
1185
+ l[c] = $e(e[c] || [], r);
1186
+ const u = [];
1187
+ for (const [c, d] of a) {
1188
+ const f = /* @__PURE__ */ new Set();
1189
+ let m = 1 / 0, g = -1 / 0;
1190
+ for (const y of d) {
1191
+ const p = Number(y[n]), E = Number(y[t]);
1192
+ f.add(p), f.add(E), p < m && (m = p), E > g && (g = E);
1193
+ }
1194
+ for (const y of o.slice(1)) {
1195
+ const p = l[y].get(c) || [];
1196
+ for (const E of p) {
1197
+ const I = Number(E[n]), k = Number(E[t]);
1198
+ k < m || I > g || (I > m && f.add(I), k < g && f.add(k));
1199
+ }
1200
+ }
1201
+ const h = [...f].sort((y, p) => y - p);
1202
+ for (let y = 0; y < h.length - 1; y += 1) {
1203
+ const p = h[y], E = h[y + 1], I = (p + E) / 2, k = We(d, I, n, t);
1204
+ if (!k) continue;
1205
+ const w = { [r]: c, [n]: p, [t]: E };
1206
+ for (const F of Object.keys(k))
1207
+ F === r || F === n || F === t || (w[`${i}_${F}`] = k[F]);
1208
+ for (const F of o.slice(1)) {
1209
+ const R = l[F].get(c) || [], D = We(R, I, n, t), H = e[F] && e[F][0] || {}, b = Object.keys(H).filter(
1210
+ (M) => M !== r && M !== n && M !== t
1211
+ );
1212
+ for (const M of b)
1213
+ w[`${F}_${M}`] = D ? D[M] : null;
1214
+ }
1215
+ u.push(w);
1035
1216
  }
1036
1217
  }
1037
1218
  return u;
1038
1219
  }
1039
- const ct = ["depth", "md", "measured_depth", "dept", "z"];
1040
- function Kt(e) {
1041
- if (e[j] !== void 0) {
1042
- const r = Number(e[j]);
1220
+ const dt = ["depth", "md", "measured_depth", "dept", "z"];
1221
+ function en(e) {
1222
+ if (e[V] !== void 0) {
1223
+ const r = Number(e[V]);
1043
1224
  if (Number.isFinite(r)) return r;
1044
1225
  }
1045
- for (const r of ct)
1226
+ for (const r of dt)
1046
1227
  if (e[r] !== void 0) {
1047
1228
  const o = Number(e[r]);
1048
1229
  if (Number.isFinite(o)) return o;
1049
1230
  }
1050
- const n = Number(e[L]), t = Number(e[M]);
1231
+ const n = Number(e[L]), t = Number(e[P]);
1051
1232
  return Number.isFinite(n) && Number.isFinite(t) && t >= n ? (n + t) / 2 : null;
1052
1233
  }
1053
- function Zt(e) {
1234
+ function tn(e) {
1054
1235
  if (e.length === 0) return [];
1055
- const n = /* @__PURE__ */ new Set([N, j, L, M, ve, ...ct]);
1236
+ const n = /* @__PURE__ */ new Set([v, V, L, P, ve, ...dt]);
1056
1237
  return Object.keys(e[0]).filter((r) => !n.has(r)).filter((r) => {
1057
1238
  let o = 0;
1058
1239
  for (const i of e) {
@@ -1062,37 +1243,37 @@ function Zt(e) {
1062
1243
  return o / e.length > 0.5;
1063
1244
  });
1064
1245
  }
1065
- function er(e, n = null) {
1246
+ function dr(e, n = null) {
1066
1247
  const r = J.parse(e, {
1067
1248
  header: !0,
1068
1249
  skipEmptyLines: !0,
1069
1250
  dynamicTyping: !1
1070
1251
  }).data || [];
1071
1252
  if (r.length === 0) return [];
1072
- const o = r.map((l) => ie(l, null, n)), i = Zt(o), s = /* @__PURE__ */ new Map();
1253
+ const o = r.map((l) => ie(l, null, n)), i = tn(o), s = /* @__PURE__ */ new Map();
1073
1254
  for (const l of o) {
1074
- const u = l[N] != null ? `${l[N]}`.trim() : "";
1255
+ const u = l[v] != null ? `${l[v]}`.trim() : "";
1075
1256
  if (!u) continue;
1076
- const c = Kt(l);
1257
+ const c = en(l);
1077
1258
  c === null || c < 0 || (s.has(u) || s.set(u, []), s.get(u).push({ depth: c, row: l }));
1078
1259
  }
1079
1260
  const a = [];
1080
1261
  for (const [l, u] of s) {
1081
- u.sort((d, m) => d.depth - m.depth);
1262
+ u.sort((d, f) => d.depth - f.depth);
1082
1263
  const c = {};
1083
1264
  for (const d of i) {
1084
- const m = [], f = [];
1085
- for (const { depth: y, row: h } of u) {
1086
- const b = Number(h[d]);
1087
- Number.isFinite(b) && b !== et && (m.push(y), f.push(b));
1265
+ const f = [], m = [];
1266
+ for (const { depth: g, row: h } of u) {
1267
+ const y = Number(h[d]);
1268
+ Number.isFinite(y) && y !== nt && (f.push(g), m.push(y));
1088
1269
  }
1089
- m.length >= 2 && (c[d] = { depths: m, values: f });
1270
+ f.length >= 2 && (c[d] = { depths: f, values: m });
1090
1271
  }
1091
1272
  Object.keys(c).length > 0 && a.push({ holeId: l, channels: c });
1092
1273
  }
1093
1274
  return a;
1094
1275
  }
1095
- function tr(e, n = null, t = {}) {
1276
+ function fr(e, n = null, t = {}) {
1096
1277
  const r = [];
1097
1278
  for (const { holeId: o, channels: i } of e) {
1098
1279
  const s = n && i[n] ? n : Object.keys(i)[0];
@@ -1102,13 +1283,13 @@ function tr(e, n = null, t = {}) {
1102
1283
  }
1103
1284
  return r;
1104
1285
  }
1105
- function ut(e) {
1286
+ function ft(e) {
1106
1287
  const n = e.indexOf(".");
1107
1288
  if (n < 0) return null;
1108
1289
  const t = e.slice(0, n).trim().toUpperCase(), r = e.slice(n + 1), o = r.match(/^(\S*)\s*(.*)/s), i = o ? o[1] : "", s = o ? o[2] : r, a = s.lastIndexOf(":"), l = a >= 0 ? s.slice(0, a).trim() : s.trim(), u = a >= 0 ? s.slice(a + 1).trim() : "";
1109
1290
  return { mnem: t, unit: i, value: l, description: u };
1110
1291
  }
1111
- function Jt(e) {
1292
+ function nn(e) {
1112
1293
  const n = [];
1113
1294
  let t = null;
1114
1295
  for (const r of e.split(/\r?\n/)) {
@@ -1117,61 +1298,61 @@ function Jt(e) {
1117
1298
  }
1118
1299
  return n;
1119
1300
  }
1120
- function Ye(e = []) {
1301
+ function qe(e = []) {
1121
1302
  const n = {};
1122
1303
  for (const t of e) {
1123
1304
  const r = t.trimStart();
1124
1305
  if (!r || r.startsWith("#")) continue;
1125
- const o = ut(t);
1306
+ const o = ft(t);
1126
1307
  o && (n[o.mnem] = o);
1127
1308
  }
1128
1309
  return n;
1129
1310
  }
1130
- function nr(e, n = {}) {
1131
- var g, A, P, U, $, k, O, D, S;
1132
- const t = Jt(e), r = t.find((p) => p.type === "V"), o = t.find((p) => p.type === "W"), i = t.find((p) => p.type === "C"), s = t.find((p) => p.type === "A");
1311
+ function mr(e, n = {}) {
1312
+ var p, E, I, k, w, F, R, D, H;
1313
+ const t = nn(e), r = t.find((b) => b.type === "V"), o = t.find((b) => b.type === "W"), i = t.find((b) => b.type === "C"), s = t.find((b) => b.type === "A");
1133
1314
  if (!s) return [];
1134
- const a = Ye(r == null ? void 0 : r.lines), l = Ye(o == null ? void 0 : o.lines), u = [];
1135
- for (const p of (i == null ? void 0 : i.lines) ?? []) {
1136
- const I = p.trimStart();
1137
- if (!I || I.startsWith("#")) continue;
1138
- const _ = ut(p);
1139
- _ && u.push(_);
1315
+ const a = qe(r == null ? void 0 : r.lines), l = qe(o == null ? void 0 : o.lines), u = [];
1316
+ for (const b of (i == null ? void 0 : i.lines) ?? []) {
1317
+ const M = b.trimStart();
1318
+ if (!M || M.startsWith("#")) continue;
1319
+ const S = ft(b);
1320
+ S && u.push(S);
1140
1321
  }
1141
- (((A = (g = a.WRAP) == null ? void 0 : g.value) == null ? void 0 : A.trim().toUpperCase()) ?? "NO") === "YES" && console.warn(
1322
+ (((E = (p = a.WRAP) == null ? void 0 : p.value) == null ? void 0 : E.trim().toUpperCase()) ?? "NO") === "YES" && console.warn(
1142
1323
  "parseLasFile: WRAP YES is not supported. Data rows may be read incorrectly."
1143
1324
  );
1144
- const d = n.holeId ?? (((U = (P = l.WELL) == null ? void 0 : P.value) == null ? void 0 : U.trim()) || null) ?? (((k = ($ = l.UWI) == null ? void 0 : $.value) == null ? void 0 : k.trim()) || null) ?? (((D = (O = l.API) == null ? void 0 : O.value) == null ? void 0 : D.trim()) || null) ?? "unknown";
1145
- let m = et;
1146
- if ((S = l.NULL) != null && S.value) {
1147
- const p = Number(l.NULL.value);
1148
- Number.isFinite(p) && (m = p);
1325
+ const d = n.holeId ?? (((k = (I = l.WELL) == null ? void 0 : I.value) == null ? void 0 : k.trim()) || null) ?? (((F = (w = l.UWI) == null ? void 0 : w.value) == null ? void 0 : F.trim()) || null) ?? (((D = (R = l.API) == null ? void 0 : R.value) == null ? void 0 : D.trim()) || null) ?? "unknown";
1326
+ let f = nt;
1327
+ if ((H = l.NULL) != null && H.value) {
1328
+ const b = Number(l.NULL.value);
1329
+ Number.isFinite(b) && (f = b);
1149
1330
  }
1150
- if (n.nullSentinel !== void 0 && (m = n.nullSentinel), u.length === 0) return [];
1151
- const f = u.slice(1), y = {};
1152
- for (const { mnem: p, unit: I } of f)
1153
- y[p.toLowerCase()] = I;
1331
+ if (n.nullSentinel !== void 0 && (f = n.nullSentinel), u.length === 0) return [];
1332
+ const m = u.slice(1), g = {};
1333
+ for (const { mnem: b, unit: M } of m)
1334
+ g[b.toLowerCase()] = M;
1154
1335
  const h = {};
1155
- for (const { mnem: p } of f)
1156
- h[p.toLowerCase()] = { depths: [], values: [] };
1157
- for (const p of s.lines) {
1158
- const I = p.trimStart();
1159
- if (!I || I.startsWith("#")) continue;
1160
- const _ = I.split(/\s+/);
1161
- if (_.length < 2) continue;
1162
- const R = Number(_[0]);
1163
- if (!(!Number.isFinite(R) || R === m))
1164
- for (let x = 0; x < f.length; x++) {
1165
- const T = f[x].mnem.toLowerCase(), v = Number(_[x + 1]);
1166
- Number.isFinite(v) && v !== m && (h[T].depths.push(R), h[T].values.push(v));
1336
+ for (const { mnem: b } of m)
1337
+ h[b.toLowerCase()] = { depths: [], values: [] };
1338
+ for (const b of s.lines) {
1339
+ const M = b.trimStart();
1340
+ if (!M || M.startsWith("#")) continue;
1341
+ const S = M.split(/\s+/);
1342
+ if (S.length < 2) continue;
1343
+ const z = Number(S[0]);
1344
+ if (!(!Number.isFinite(z) || z === f))
1345
+ for (let A = 0; A < m.length; A++) {
1346
+ const N = m[A].mnem.toLowerCase(), _ = Number(S[A + 1]);
1347
+ Number.isFinite(_) && _ !== f && (h[N].depths.push(z), h[N].values.push(_));
1167
1348
  }
1168
1349
  }
1169
- const b = {};
1170
- for (const [p, I] of Object.entries(h))
1171
- I.depths.length >= 2 && (b[p] = I);
1172
- return Object.keys(b).length === 0 ? [] : [{ holeId: d, units: y, channels: b }];
1350
+ const y = {};
1351
+ for (const [b, M] of Object.entries(h))
1352
+ M.depths.length >= 2 && (y[b] = M);
1353
+ return Object.keys(y).length === 0 ? [] : [{ holeId: d, units: g, channels: y }];
1173
1354
  }
1174
- const dt = [
1355
+ const mt = [
1175
1356
  "#0f172a",
1176
1357
  "#1e3a5f",
1177
1358
  "#7c3aed",
@@ -1182,26 +1363,26 @@ const dt = [
1182
1363
  "#db2777",
1183
1364
  "#65a30d",
1184
1365
  "#9333ea"
1185
- ], Qt = { l: 42, r: 4, t: 4, b: 36 }, We = 10, qe = 11, en = 6;
1186
- function mt(e = {}) {
1366
+ ], rn = { l: 42, r: 4, t: 4, b: 36 }, Xe = 10, Ke = 11, on = 6;
1367
+ function ht(e = {}) {
1187
1368
  return {
1188
1369
  ...e,
1189
- margin: Qt,
1370
+ margin: rn,
1190
1371
  autosize: !0,
1191
1372
  width: void 0,
1192
1373
  xaxis: {
1193
1374
  ...e.xaxis || {},
1194
1375
  tickfont: {
1195
1376
  ...e.xaxis && e.xaxis.tickfont || {},
1196
- size: We
1377
+ size: Xe
1197
1378
  },
1198
1379
  title: {
1199
1380
  ...e.xaxis && e.xaxis.title || {},
1200
1381
  font: {
1201
1382
  ...e.xaxis && e.xaxis.title && e.xaxis.title.font || {},
1202
- size: qe
1383
+ size: Ke
1203
1384
  },
1204
- standoff: (e.xaxis && e.xaxis.title && e.xaxis.title.standoff) ?? en
1385
+ standoff: (e.xaxis && e.xaxis.title && e.xaxis.title.standoff) ?? on
1205
1386
  }
1206
1387
  },
1207
1388
  yaxis: {
@@ -1209,23 +1390,23 @@ function mt(e = {}) {
1209
1390
  automargin: !0,
1210
1391
  tickfont: {
1211
1392
  ...e.yaxis && e.yaxis.tickfont || {},
1212
- size: We
1393
+ size: Xe
1213
1394
  },
1214
1395
  title: {
1215
1396
  ...e.yaxis && e.yaxis.title || {},
1216
1397
  font: {
1217
1398
  ...e.yaxis && e.yaxis.title && e.yaxis.title.font || {},
1218
- size: qe
1399
+ size: Ke
1219
1400
  }
1220
1401
  }
1221
1402
  }
1222
1403
  };
1223
1404
  }
1224
- function tn(e, {
1405
+ function sn(e, {
1225
1406
  tailScale: n = 5,
1226
1407
  colorBy: t = null,
1227
- palette: r = dt,
1228
- depthCol: o = j,
1408
+ palette: r = mt,
1409
+ depthCol: o = V,
1229
1410
  dipCol: i = W,
1230
1411
  azCol: s = Y,
1231
1412
  template: a = void 0
@@ -1236,39 +1417,39 @@ function tn(e, {
1236
1417
  if (!l.length)
1237
1418
  return { data: [], layout: {} };
1238
1419
  const u = {};
1239
- t && [...new Set(l.map((b) => b[t]).filter((b) => b != null))].sort().forEach((b, g) => {
1240
- u[b] = r[g % r.length];
1420
+ t && [...new Set(l.map((y) => y[t]).filter((y) => y != null))].sort().forEach((y, p) => {
1421
+ u[y] = r[p % r.length];
1241
1422
  });
1242
1423
  const c = /* @__PURE__ */ new Map(), d = [];
1243
1424
  for (const h of l) {
1244
- const b = Number(h[o]), g = Number(h[i]), A = Number(h[s]), P = t ? h[t] ?? "_default" : "_default", U = t ? u[P] ?? "#0f172a" : "#0f172a";
1245
- c.has(P) || c.set(P, { xs: [], ys: [], dips: [], azs: [], color: U });
1246
- const $ = c.get(P);
1247
- $.xs.push(g), $.ys.push(b), $.dips.push(g), $.azs.push(A);
1248
- const k = A * Math.PI / 180, O = n * (Math.abs(g) / 90), D = Math.sin(k) * O, S = Math.cos(k) * O;
1425
+ const y = Number(h[o]), p = Number(h[i]), E = Number(h[s]), I = t ? h[t] ?? "_default" : "_default", k = t ? u[I] ?? "#0f172a" : "#0f172a";
1426
+ c.has(I) || c.set(I, { xs: [], ys: [], dips: [], azs: [], color: k });
1427
+ const w = c.get(I);
1428
+ w.xs.push(p), w.ys.push(y), w.dips.push(p), w.azs.push(E);
1429
+ const F = E * Math.PI / 180, R = n * (Math.abs(p) / 90), D = Math.sin(F) * R, H = Math.cos(F) * R;
1249
1430
  d.push({
1250
1431
  type: "line",
1251
- x0: g,
1252
- y0: b,
1253
- x1: g + D,
1254
- y1: b + S,
1255
- line: { color: U, width: 2 }
1432
+ x0: p,
1433
+ y0: y,
1434
+ x1: p + D,
1435
+ y1: y + H,
1436
+ line: { color: k, width: 2 }
1256
1437
  });
1257
1438
  }
1258
- const m = [], f = t && c.size > 1;
1259
- for (const [h, b] of c.entries())
1260
- m.push({
1439
+ const f = [], m = t && c.size > 1;
1440
+ for (const [h, y] of c.entries())
1441
+ f.push({
1261
1442
  type: "scatter",
1262
- x: b.xs,
1263
- y: b.ys,
1443
+ x: y.xs,
1444
+ y: y.ys,
1264
1445
  mode: "markers",
1265
1446
  name: h !== "_default" ? String(h) : void 0,
1266
- marker: { size: 8, color: b.color },
1267
- showlegend: f && h !== "_default",
1268
- customdata: b.dips.map((g, A) => [g, b.azs[A]]),
1447
+ marker: { size: 8, color: y.color },
1448
+ showlegend: m && h !== "_default",
1449
+ customdata: y.dips.map((p, E) => [p, y.azs[E]]),
1269
1450
  hovertemplate: "Depth: %{y}<br>Dip: %{customdata[0]}<br>Az: %{customdata[1]}<extra></extra>"
1270
1451
  });
1271
- return { data: m, layout: {
1452
+ return { data: f, layout: {
1272
1453
  shapes: d,
1273
1454
  height: 400,
1274
1455
  margin: { l: 40, r: 10, t: 10, b: 40 },
@@ -1280,39 +1461,39 @@ function tn(e, {
1280
1461
  tickvals: [-90, -60, -30, 0, 30, 60, 90]
1281
1462
  },
1282
1463
  yaxis: { title: "Depth (m)", autorange: "reversed" },
1283
- showlegend: !!f,
1464
+ showlegend: !!m,
1284
1465
  template: a !== void 0 ? a : ke
1285
1466
  } };
1286
1467
  }
1287
- function rr(e, {
1468
+ function hr(e, {
1288
1469
  labelCol: n = "structure_type",
1289
- palette: t = dt,
1470
+ palette: t = mt,
1290
1471
  fromCol: r = L,
1291
- toCol: o = M,
1472
+ toCol: o = P,
1292
1473
  template: i = void 0
1293
1474
  } = {}) {
1294
- const s = e.filter((m) => m[r] != null && m[o] != null && Number(m[o]) > Number(m[r])).filter((m) => {
1295
- const f = m[n];
1296
- if (f == null) return !1;
1297
- const y = String(f).trim();
1298
- return y !== "" && !/^(nan|null|none)$/i.test(y);
1299
- }).map((m) => ({ from: Number(m[r]), to: Number(m[o]), label: String(m[n]).trim() })).sort((m, f) => m.from - f.from);
1475
+ const s = e.filter((f) => f[r] != null && f[o] != null && Number(f[o]) > Number(f[r])).filter((f) => {
1476
+ const m = f[n];
1477
+ if (m == null) return !1;
1478
+ const g = String(m).trim();
1479
+ return g !== "" && !/^(nan|null|none)$/i.test(g);
1480
+ }).map((f) => ({ from: Number(f[r]), to: Number(f[o]), label: String(f[n]).trim() })).sort((f, m) => f.from - m.from);
1300
1481
  if (!s.length)
1301
1482
  return { data: [], layout: {} };
1302
1483
  const a = [], l = [], u = [];
1303
- return s.forEach((m, f) => {
1484
+ return s.forEach((f, m) => {
1304
1485
  a.push({
1305
1486
  type: "rect",
1306
1487
  xref: "x",
1307
1488
  yref: "y",
1308
1489
  x0: 0,
1309
1490
  x1: 1,
1310
- y0: m.from,
1311
- y1: m.to,
1312
- fillcolor: t[f % t.length],
1491
+ y0: f.from,
1492
+ y1: f.to,
1493
+ fillcolor: t[m % t.length],
1313
1494
  line: { width: 0 },
1314
1495
  layer: "below"
1315
- }), l.push(0.5 * (m.from + m.to)), u.push(m.label);
1496
+ }), l.push(0.5 * (f.from + f.to)), u.push(f.label);
1316
1497
  }), { data: [{
1317
1498
  type: "scatter",
1318
1499
  x: Array(u.length).fill(0.5),
@@ -1322,7 +1503,7 @@ function rr(e, {
1322
1503
  textposition: "middle center",
1323
1504
  showlegend: !1,
1324
1505
  hoverinfo: "text"
1325
- }], layout: mt({
1506
+ }], layout: ht({
1326
1507
  shapes: a,
1327
1508
  height: 400,
1328
1509
  xaxis: { range: [0, 1], visible: !1, fixedrange: !0 },
@@ -1331,7 +1512,7 @@ function rr(e, {
1331
1512
  template: i !== void 0 ? i : ke
1332
1513
  }) };
1333
1514
  }
1334
- function Xe(e, n) {
1515
+ function Ze(e, n) {
1335
1516
  if (!e) return "";
1336
1517
  const t = String(e).trim().split(/\s+/), r = [];
1337
1518
  let o = "";
@@ -1339,50 +1520,50 @@ function Xe(e, n) {
1339
1520
  o && o.length + 1 + i.length > n ? (r.push(o), o = i) : o = o ? `${o} ${i}` : i;
1340
1521
  return o && r.push(o), r.join("<br>");
1341
1522
  }
1342
- function nn(e, {
1523
+ function an(e, {
1343
1524
  commentCol: n = "comments",
1344
1525
  fromCol: t = L,
1345
- toCol: r = M,
1526
+ toCol: r = P,
1346
1527
  bgColor: o = "#f1f5f9",
1347
1528
  borderColor: i = "#cbd5e1",
1348
1529
  textColor: s = "#1e293b",
1349
1530
  charsPerLine: a = 18,
1350
1531
  template: l = void 0
1351
1532
  } = {}) {
1352
- const u = e.filter((g) => g[t] != null && g[r] != null && Number(g[r]) > Number(g[t])).map((g) => {
1353
- const A = g[n], P = A != null && String(A).trim() !== "" && String(A) !== "null" ? String(A).trim() : "";
1354
- return { from: Number(g[t]), to: Number(g[r]), comment: P };
1355
- }).sort((g, A) => g.from - A.from);
1533
+ const u = e.filter((p) => p[t] != null && p[r] != null && Number(p[r]) > Number(p[t])).map((p) => {
1534
+ const E = p[n], I = E != null && String(E).trim() !== "" && String(E) !== "null" ? String(E).trim() : "";
1535
+ return { from: Number(p[t]), to: Number(p[r]), comment: I };
1536
+ }).sort((p, E) => p.from - E.from);
1356
1537
  if (!u.length)
1357
1538
  return { data: [], layout: {} };
1358
- const c = [], d = [], m = [], f = [], y = [];
1359
- for (const g of u) {
1360
- const A = 0.5 * (g.from + g.to), P = !!g.comment;
1539
+ const c = [], d = [], f = [], m = [], g = [];
1540
+ for (const p of u) {
1541
+ const E = 0.5 * (p.from + p.to), I = !!p.comment;
1361
1542
  c.push({
1362
1543
  type: "rect",
1363
1544
  xref: "x",
1364
1545
  yref: "y",
1365
1546
  x0: 0,
1366
1547
  x1: 1,
1367
- y0: g.from,
1368
- y1: g.to,
1369
- fillcolor: P ? o : "rgba(0,0,0,0)",
1548
+ y0: p.from,
1549
+ y1: p.to,
1550
+ fillcolor: I ? o : "rgba(0,0,0,0)",
1370
1551
  line: { color: i, width: 1 },
1371
1552
  layer: "below"
1372
- }), P && (d.push(0.5), m.push(A), f.push(Xe(g.comment, a)), y.push(`${g.from.toFixed(3)}–${g.to.toFixed(3)} m<br>${Xe(g.comment, 40)}`));
1553
+ }), I && (d.push(0.5), f.push(E), m.push(Ze(p.comment, a)), g.push(`${p.from.toFixed(3)}–${p.to.toFixed(3)} m<br>${Ze(p.comment, 40)}`));
1373
1554
  }
1374
1555
  return { data: d.length ? [{
1375
1556
  type: "scatter",
1376
1557
  x: d,
1377
- y: m,
1558
+ y: f,
1378
1559
  mode: "text",
1379
- text: f,
1560
+ text: m,
1380
1561
  textposition: "middle center",
1381
1562
  textfont: { color: s, size: 10 },
1382
- hovertext: y,
1563
+ hovertext: g,
1383
1564
  hoverinfo: "text",
1384
1565
  showlegend: !1
1385
- }] : [], layout: mt({
1566
+ }] : [], layout: ht({
1386
1567
  shapes: c,
1387
1568
  height: 400,
1388
1569
  xaxis: { range: [0, 1], visible: !1, fixedrange: !0 },
@@ -1391,28 +1572,28 @@ function nn(e, {
1391
1572
  template: l !== void 0 ? l : ke
1392
1573
  }) };
1393
1574
  }
1394
- function or(e, {
1575
+ function pr(e, {
1395
1576
  symbolSize: n = 10,
1396
1577
  xCol: t = "easting",
1397
1578
  yCol: r = "northing"
1398
1579
  } = {}) {
1399
1580
  const o = e[t] != null ? Number(e[t]) : null, i = e[r] != null ? Number(e[r]) : null, s = e[W] != null ? Number(e[W]) : null, a = e[Y] != null ? Number(e[Y]) : null;
1400
1581
  if (o === null || i === null || s === null || a === null) return null;
1401
- const l = (a - 90 + 360) % 360, u = l * Math.PI / 180, c = a * Math.PI / 180, d = n * Math.sin(u), m = n * Math.cos(u), f = n * 0.4 * (s / 90), y = f * Math.sin(c), h = f * Math.cos(c);
1582
+ const l = (a - 90 + 360) % 360, u = l * Math.PI / 180, c = a * Math.PI / 180, d = n * Math.sin(u), f = n * Math.cos(u), m = n * 0.4 * (s / 90), g = m * Math.sin(c), h = m * Math.cos(c);
1402
1583
  return {
1403
1584
  strike: l,
1404
1585
  dipValue: s,
1405
1586
  x: o,
1406
1587
  y: i,
1407
1588
  strikeX0: o - d,
1408
- strikeY0: i - m,
1589
+ strikeY0: i - f,
1409
1590
  strikeX1: o + d,
1410
- strikeY1: i + m,
1411
- tickX1: o + y,
1591
+ strikeY1: i + f,
1592
+ tickX1: o + g,
1412
1593
  tickY1: i + h
1413
1594
  };
1414
1595
  }
1415
- function rn({
1596
+ function ln({
1416
1597
  holeId: e,
1417
1598
  hole: n,
1418
1599
  holeOptions: t,
@@ -1430,25 +1611,25 @@ function rn({
1430
1611
  if (!n)
1431
1612
  return { kind: "placeholder", text: `Loading ${e}…` };
1432
1613
  const u = o || [];
1433
- return r ? !(i === ze) && !(i === tt) && (s || []).length === 0 ? { kind: "placeholder", text: `No values for ${r} in hole ${e}` } : { kind: "chart" } : u.length === 0 ? { kind: "placeholder", text: `No properties available for hole ${e}` } : { kind: "placeholder", text: "Select a property" };
1614
+ return r ? !(i === Fe) && !(i === rt) && (s || []).length === 0 ? { kind: "placeholder", text: `No values for ${r} in hole ${e}` } : { kind: "chart" } : u.length === 0 ? { kind: "placeholder", text: `No properties available for hole ${e}` } : { kind: "placeholder", text: "Select a property" };
1434
1615
  }
1435
- function ft(e, n) {
1616
+ function pt(e, n) {
1436
1617
  if (typeof n == "function") return n(e);
1437
1618
  if (!(typeof n != "string" || !n) && !(e == null || typeof e != "object"))
1438
1619
  return e[n];
1439
1620
  }
1440
- function on(e, n) {
1621
+ function cn(e, n) {
1441
1622
  const t = [], r = /* @__PURE__ */ new Set();
1442
1623
  for (const o of e || []) {
1443
- const i = ft(o, n);
1624
+ const i = pt(o, n);
1444
1625
  i == null || i === "" || r.has(i) || (r.add(i), t.push(i));
1445
1626
  }
1446
1627
  return t;
1447
1628
  }
1448
- function sn(e, n, t) {
1449
- return t == null || t === "" ? e || [] : (e || []).filter((r) => ft(r, n) === t);
1629
+ function un(e, n, t) {
1630
+ return t == null || t === "" ? e || [] : (e || []).filter((r) => pt(r, n) === t);
1450
1631
  }
1451
- function an({
1632
+ function dn({
1452
1633
  chartOptions: e,
1453
1634
  showHoleSelect: n,
1454
1635
  showPropertySelect: t,
@@ -1460,25 +1641,25 @@ function an({
1460
1641
  chartType: r !== !1 && (e || []).length > 1
1461
1642
  };
1462
1643
  }
1463
- const pt = "markers+line";
1464
- function ln(e, n) {
1644
+ const bt = "markers+line";
1645
+ function fn(e, n) {
1465
1646
  var r;
1466
- const t = nt(e);
1467
- return t.some((o) => o.value === n) ? n : ((r = t[0]) == null ? void 0 : r.value) || pt;
1647
+ const t = ot(e);
1648
+ return t.some((o) => o.value === n) ? n : ((r = t[0]) == null ? void 0 : r.value) || bt;
1468
1649
  }
1469
- function Ke(e) {
1650
+ function Je(e) {
1470
1651
  const n = typeof e == "string" ? e : e.holeId, t = typeof e == "string" ? e : e.label || e.holeId;
1471
1652
  return [n, t];
1472
1653
  }
1473
- function Ze(e) {
1654
+ function Qe(e) {
1474
1655
  const n = typeof e == "string" ? e : e.value, t = typeof e == "string" ? e : e.label ?? e.value;
1475
1656
  return [n, t];
1476
1657
  }
1477
- function cn({ selector: e, holeOptions: n, selectedHoleId: t, onConfigChange: r }) {
1658
+ function mn({ selector: e, holeOptions: n, selectedHoleId: t, onConfigChange: r }) {
1478
1659
  const o = (e == null ? void 0 : e.kind) || "hole";
1479
1660
  if (o === "field") {
1480
1661
  const s = e.value ?? "", a = e.options || [], l = e.label || "Selection";
1481
- return /* @__PURE__ */ H(
1662
+ return /* @__PURE__ */ B(
1482
1663
  "select",
1483
1664
  {
1484
1665
  className: "plot-select plot-select--field",
@@ -1487,20 +1668,20 @@ function cn({ selector: e, holeOptions: n, selectedHoleId: t, onConfigChange: r
1487
1668
  disabled: a.length === 0,
1488
1669
  "aria-label": l,
1489
1670
  children: [
1490
- a.length === 0 && /* @__PURE__ */ E("option", { value: "", children: "—" }),
1491
- !s && a.length > 0 && /* @__PURE__ */ E("option", { value: "", disabled: !0, hidden: !0, children: `Select ${l.toLowerCase()}` }),
1671
+ a.length === 0 && /* @__PURE__ */ T("option", { value: "", children: "—" }),
1672
+ !s && a.length > 0 && /* @__PURE__ */ T("option", { value: "", disabled: !0, hidden: !0, children: `Select ${l.toLowerCase()}` }),
1492
1673
  a.map((u) => {
1493
- const [c, d] = Ze(u);
1494
- return /* @__PURE__ */ E("option", { value: c, children: d }, c);
1674
+ const [c, d] = Qe(u);
1675
+ return /* @__PURE__ */ T("option", { value: c, children: d }, c);
1495
1676
  })
1496
1677
  ]
1497
1678
  }
1498
1679
  );
1499
1680
  }
1500
1681
  if (o === "group+hole") {
1501
- const s = e.groupBy, a = e.groupValue ?? "", l = e.groupLabel || "Group", u = e.groupOptions || on(n, s), c = sn(n, s, a);
1502
- return /* @__PURE__ */ H(Ct, { children: [
1503
- /* @__PURE__ */ H(
1682
+ const s = e.groupBy, a = e.groupValue ?? "", l = e.groupLabel || "Group", u = e.groupOptions || cn(n, s), c = un(n, s, a);
1683
+ return /* @__PURE__ */ B(Ot, { children: [
1684
+ /* @__PURE__ */ B(
1504
1685
  "select",
1505
1686
  {
1506
1687
  className: "plot-select plot-select--group",
@@ -1509,20 +1690,20 @@ function cn({ selector: e, holeOptions: n, selectedHoleId: t, onConfigChange: r
1509
1690
  disabled: u.length === 0,
1510
1691
  "aria-label": l,
1511
1692
  children: [
1512
- u.length === 0 && /* @__PURE__ */ H("option", { value: "", children: [
1693
+ u.length === 0 && /* @__PURE__ */ B("option", { value: "", children: [
1513
1694
  "No ",
1514
1695
  l.toLowerCase(),
1515
1696
  "s"
1516
1697
  ] }),
1517
- !a && u.length > 0 && /* @__PURE__ */ E("option", { value: "", disabled: !0, hidden: !0, children: `Select ${l.toLowerCase()}` }),
1698
+ !a && u.length > 0 && /* @__PURE__ */ T("option", { value: "", disabled: !0, hidden: !0, children: `Select ${l.toLowerCase()}` }),
1518
1699
  u.map((d) => {
1519
- const [m, f] = Ze(d);
1520
- return /* @__PURE__ */ E("option", { value: m, children: f }, m);
1700
+ const [f, m] = Qe(d);
1701
+ return /* @__PURE__ */ T("option", { value: f, children: m }, f);
1521
1702
  })
1522
1703
  ]
1523
1704
  }
1524
1705
  ),
1525
- /* @__PURE__ */ H(
1706
+ /* @__PURE__ */ B(
1526
1707
  "select",
1527
1708
  {
1528
1709
  className: "plot-select plot-select--hole",
@@ -1531,11 +1712,11 @@ function cn({ selector: e, holeOptions: n, selectedHoleId: t, onConfigChange: r
1531
1712
  disabled: c.length === 0,
1532
1713
  "aria-label": "Hole",
1533
1714
  children: [
1534
- c.length === 0 && /* @__PURE__ */ E("option", { value: "", children: "No holes" }),
1535
- !t && c.length > 0 && /* @__PURE__ */ E("option", { value: "", disabled: !0, hidden: !0, children: "Select a hole" }),
1715
+ c.length === 0 && /* @__PURE__ */ T("option", { value: "", children: "No holes" }),
1716
+ !t && c.length > 0 && /* @__PURE__ */ T("option", { value: "", disabled: !0, hidden: !0, children: "Select a hole" }),
1536
1717
  c.map((d) => {
1537
- const [m, f] = Ke(d);
1538
- return /* @__PURE__ */ E("option", { value: m, children: f }, m);
1718
+ const [f, m] = Je(d);
1719
+ return /* @__PURE__ */ T("option", { value: f, children: m }, f);
1539
1720
  })
1540
1721
  ]
1541
1722
  }
@@ -1543,7 +1724,7 @@ function cn({ selector: e, holeOptions: n, selectedHoleId: t, onConfigChange: r
1543
1724
  ] });
1544
1725
  }
1545
1726
  const i = n.length > 0;
1546
- return /* @__PURE__ */ H(
1727
+ return /* @__PURE__ */ B(
1547
1728
  "select",
1548
1729
  {
1549
1730
  className: "plot-select plot-select--hole",
@@ -1552,135 +1733,168 @@ function cn({ selector: e, holeOptions: n, selectedHoleId: t, onConfigChange: r
1552
1733
  disabled: !i,
1553
1734
  "aria-label": "Hole",
1554
1735
  children: [
1555
- !i && /* @__PURE__ */ E("option", { value: "", children: "No holes loaded" }),
1556
- !t && i && /* @__PURE__ */ E("option", { value: "", disabled: !0, hidden: !0, children: "Select a hole" }),
1736
+ !i && /* @__PURE__ */ T("option", { value: "", children: "No holes loaded" }),
1737
+ !t && i && /* @__PURE__ */ T("option", { value: "", disabled: !0, hidden: !0, children: "Select a hole" }),
1557
1738
  n.map((s) => {
1558
- const [a, l] = Ke(s);
1559
- return /* @__PURE__ */ E("option", { value: a, children: l }, a);
1739
+ const [a, l] = Je(s);
1740
+ return /* @__PURE__ */ T("option", { value: a, children: l }, a);
1560
1741
  })
1561
1742
  ]
1562
1743
  }
1563
1744
  );
1564
1745
  }
1565
- function sr({
1746
+ function br({
1566
1747
  config: e,
1567
1748
  graph: n,
1568
1749
  holeOptions: t = [],
1569
1750
  propertyOptions: r = [],
1570
- onConfigChange: o,
1571
- template: i,
1572
- showHoleSelect: s = !0,
1573
- showPropertySelect: a = !0,
1574
- showChartTypeSelect: l = !0,
1575
- holeSelector: u
1751
+ propertyMeta: o,
1752
+ onConfigChange: i,
1753
+ template: s,
1754
+ showHoleSelect: a = !0,
1755
+ showPropertySelect: l = !0,
1756
+ showChartTypeSelect: u = !0,
1757
+ holeSelector: c
1576
1758
  }) {
1577
- const c = _e(null), d = n == null ? void 0 : n.hole, m = (n == null ? void 0 : n.points) || [], f = (e == null ? void 0 : e.property) || "", y = (e == null ? void 0 : e.chartType) || pt, h = (e == null ? void 0 : e.holeId) || "", b = (n == null ? void 0 : n.displayType) || (n != null && n.isComment ? ze : n != null && n.isCategorical ? Ue : At), g = nt(b), A = ln(b, y), [P, U] = K(""), $ = rn({
1578
- holeId: h,
1579
- hole: d,
1759
+ const d = ye(null), f = ye(null), m = n == null ? void 0 : n.hole, g = (n == null ? void 0 : n.points) || [], h = (e == null ? void 0 : e.property) || "", y = o == null ? void 0 : o[h], p = (e == null ? void 0 : e.chartType) || bt, E = (e == null ? void 0 : e.holeId) || "", I = (n == null ? void 0 : n.displayType) || (n != null && n.isComment ? Fe : n != null && n.isCategorical ? Ge : Tt), k = ot(I), w = fn(I, p), [F, R] = K(""), [D, H] = K({ width: 0, height: 0 }), b = ln({
1760
+ holeId: E,
1761
+ hole: m,
1580
1762
  holeOptions: t,
1581
- property: f,
1763
+ property: h,
1582
1764
  propertyOptions: r,
1583
- displayType: b,
1584
- points: m,
1585
- renderError: P
1586
- }), k = $.kind !== "chart", O = an({
1587
- chartOptions: g,
1588
- showHoleSelect: s,
1589
- showPropertySelect: a,
1590
- showChartTypeSelect: l
1591
- }), D = r.length > 0;
1592
- return ne(() => {
1593
- if ($.kind !== "chart") return;
1594
- const S = c.current;
1595
- if (!S) return;
1596
- const p = b === ze, I = b === tt;
1597
- let _;
1765
+ displayType: I,
1766
+ points: g,
1767
+ renderError: F
1768
+ }), M = b.kind !== "chart", S = dn({
1769
+ chartOptions: k,
1770
+ showHoleSelect: a,
1771
+ showPropertySelect: l,
1772
+ showChartTypeSelect: u
1773
+ }), z = r.length > 0;
1774
+ return te(() => {
1775
+ const A = d.current;
1776
+ if (!A || typeof ResizeObserver > "u") return;
1777
+ let N = 0;
1778
+ const _ = () => {
1779
+ N && cancelAnimationFrame(N), N = requestAnimationFrame(() => {
1780
+ const $ = Math.max(0, Math.floor(A.clientWidth)), x = Math.max(0, Math.floor(A.clientHeight));
1781
+ H((C) => C.width === $ && C.height === x ? C : { width: $, height: x });
1782
+ });
1783
+ };
1784
+ _();
1785
+ const O = new ResizeObserver(_);
1786
+ return O.observe(A), () => {
1787
+ N && cancelAnimationFrame(N), O.disconnect();
1788
+ };
1789
+ }, []), te(() => {
1790
+ if (b.kind !== "chart") return;
1791
+ const A = f.current;
1792
+ if (!A || D.width <= 0 || D.height <= 0) return;
1793
+ const N = I === Fe, _ = I === rt;
1794
+ let O;
1598
1795
  try {
1599
- p ? _ = nn(m, { commentCol: f, fromCol: "from", toCol: "to" }) : I ? _ = tn(m) : _ = St({
1600
- points: m,
1601
- isCategorical: b === Ue,
1602
- property: f,
1603
- chartType: A,
1604
- template: i
1796
+ N ? O = an(g, { commentCol: h, fromCol: "from", toCol: "to" }) : _ ? O = sn(g) : O = It({
1797
+ points: g,
1798
+ isCategorical: I === Ge,
1799
+ property: h,
1800
+ chartType: w,
1801
+ template: s,
1802
+ meta: y
1605
1803
  });
1606
- } catch (x) {
1607
- console.error("Plot build error", x), U((x == null ? void 0 : x.message) || "Plot build error");
1804
+ } catch (C) {
1805
+ console.error("Plot build error", C), R((C == null ? void 0 : C.message) || "Plot build error");
1608
1806
  return;
1609
1807
  }
1610
- if ((!(_ != null && _.data) || _.data.length === 0) && !p)
1808
+ if ((!(O != null && O.data) || O.data.length === 0) && !N)
1611
1809
  return;
1612
- const R = {
1810
+ const $ = {
1613
1811
  displayModeBar: !0,
1614
- responsive: !0,
1615
- useResizeHandler: !0,
1812
+ responsive: !1,
1616
1813
  modeBarButtonsToRemove: ["select2d", "lasso2d", "autoScale2d"]
1814
+ }, x = {
1815
+ ...O.layout,
1816
+ autosize: !1,
1817
+ width: D.width,
1818
+ height: D.height
1617
1819
  };
1618
1820
  try {
1619
- U(""), Ee.react(S, _.data, _.layout, R), requestAnimationFrame(() => {
1620
- S && S.parentElement && Ee.Plots.resize(S);
1621
- });
1622
- } catch (x) {
1623
- console.error("Plot render error", x), U((x == null ? void 0 : x.message) || "Plot render error");
1821
+ R(""), Pe.react(A, O.data, x, $);
1822
+ } catch (C) {
1823
+ console.error("Plot render error", C), R((C == null ? void 0 : C.message) || "Plot render error");
1624
1824
  }
1625
1825
  return () => {
1626
- if (S)
1826
+ if (A)
1627
1827
  try {
1628
- Ee.purge(S);
1629
- } catch (x) {
1630
- console.warn("Plot purge error", x);
1828
+ Pe.purge(A);
1829
+ } catch (C) {
1830
+ console.warn("Plot purge error", C);
1631
1831
  }
1632
1832
  };
1633
- }, [$.kind, d, f, A, b, m, i]), ne(() => {
1634
- const S = c.current;
1635
- if (!S || typeof ResizeObserver > "u") return;
1636
- const p = new ResizeObserver(() => {
1833
+ }, [
1834
+ b.kind,
1835
+ m,
1836
+ h,
1837
+ y,
1838
+ w,
1839
+ I,
1840
+ g,
1841
+ s,
1842
+ D.width,
1843
+ D.height
1844
+ ]), te(() => {
1845
+ const A = f.current;
1846
+ if (!A || typeof ResizeObserver > "u") return;
1847
+ const N = new ResizeObserver(() => {
1637
1848
  try {
1638
- S && S.data && Ee.Plots.resize(S);
1639
- } catch (I) {
1640
- console.warn("Plot resize error", I);
1849
+ if (A && A.data) {
1850
+ const _ = Math.max(0, Math.floor(A.clientWidth)), O = Math.max(0, Math.floor(A.clientHeight));
1851
+ _ > 0 && O > 0 && Pe.relayout(A, { width: _, height: O, autosize: !1 });
1852
+ }
1853
+ } catch (_) {
1854
+ console.warn("Plot resize error", _);
1641
1855
  }
1642
1856
  });
1643
- return p.observe(S), () => p.disconnect();
1644
- }, [$.kind]), /* @__PURE__ */ H("div", { className: `plot-card${k ? " empty" : ""}`, children: [
1645
- /* @__PURE__ */ H("header", { className: "plot-card__controls", children: [
1646
- O.hole && /* @__PURE__ */ E("div", { className: "plot-title", children: cn({
1647
- selector: u,
1857
+ return N.observe(A), () => N.disconnect();
1858
+ }, [b.kind]), /* @__PURE__ */ B("div", { className: `plot-card${M ? " empty" : ""}`, children: [
1859
+ /* @__PURE__ */ B("header", { className: "plot-card__controls", children: [
1860
+ S.hole && /* @__PURE__ */ T("div", { className: "plot-title", children: mn({
1861
+ selector: c,
1648
1862
  holeOptions: t,
1649
- selectedHoleId: h,
1650
- onConfigChange: o
1863
+ selectedHoleId: E,
1864
+ onConfigChange: i
1651
1865
  }) }),
1652
- (O.property || O.chartType) && /* @__PURE__ */ H("div", { className: "plot-controls column", children: [
1653
- O.property && /* @__PURE__ */ H(
1866
+ (S.property || S.chartType) && /* @__PURE__ */ B("div", { className: "plot-controls column", children: [
1867
+ S.property && /* @__PURE__ */ B(
1654
1868
  "select",
1655
1869
  {
1656
1870
  className: "plot-select plot-select--property",
1657
- value: f,
1658
- onChange: (S) => o && o({ property: S.target.value }),
1659
- disabled: !D,
1871
+ value: h,
1872
+ onChange: (A) => i && i({ property: A.target.value }),
1873
+ disabled: !z,
1660
1874
  "aria-label": "Property",
1661
1875
  children: [
1662
- !D && /* @__PURE__ */ E("option", { value: "", children: "—" }),
1663
- !f && D && /* @__PURE__ */ E("option", { value: "", disabled: !0, hidden: !0, children: "Select a property" }),
1664
- r.map((S) => /* @__PURE__ */ E("option", { value: S, children: S }, S))
1876
+ !z && /* @__PURE__ */ T("option", { value: "", children: "—" }),
1877
+ !h && z && /* @__PURE__ */ T("option", { value: "", disabled: !0, hidden: !0, children: "Select a property" }),
1878
+ r.map((A) => /* @__PURE__ */ T("option", { value: A, children: Lt(A, o == null ? void 0 : o[A]) }, A))
1665
1879
  ]
1666
1880
  }
1667
1881
  ),
1668
- O.chartType && /* @__PURE__ */ E(
1882
+ S.chartType && /* @__PURE__ */ T(
1669
1883
  "select",
1670
1884
  {
1671
1885
  className: "plot-select plot-select--chart-type",
1672
- value: A,
1673
- onChange: (S) => o && o({ chartType: S.target.value }),
1886
+ value: w,
1887
+ onChange: (A) => i && i({ chartType: A.target.value }),
1674
1888
  "aria-label": "Chart type",
1675
- children: g.map((S) => /* @__PURE__ */ E("option", { value: S.value, children: S.label }, S.value))
1889
+ children: k.map((A) => /* @__PURE__ */ T("option", { value: A.value, children: A.label }, A.value))
1676
1890
  }
1677
1891
  )
1678
1892
  ] })
1679
1893
  ] }),
1680
- /* @__PURE__ */ E("div", { className: "plot-card__body", children: $.kind === "chart" ? /* @__PURE__ */ E("div", { className: "plotly-chart", ref: c }) : /* @__PURE__ */ E("div", { className: "placeholder", children: $.text }) })
1894
+ /* @__PURE__ */ T("div", { className: "plot-card__body", ref: d, children: b.kind === "chart" ? /* @__PURE__ */ T("div", { className: "plotly-chart", ref: f }) : /* @__PURE__ */ T("div", { className: "placeholder", children: b.text }) })
1681
1895
  ] });
1682
1896
  }
1683
- function Je(e, n) {
1897
+ function et(e, n) {
1684
1898
  if (!(n != null && n.length)) return e;
1685
1899
  const t = new Map(e.map((r) => [r.id || r.holeId, { ...r }]));
1686
1900
  for (const r of n) {
@@ -1694,7 +1908,7 @@ function Je(e, n) {
1694
1908
  }
1695
1909
  return Array.from(t.values());
1696
1910
  }
1697
- function un(e, n) {
1911
+ function hn(e, n) {
1698
1912
  if (!e || !n) return [];
1699
1913
  const t = /* @__PURE__ */ new Set(), r = [];
1700
1914
  for (const o of e.points || []) {
@@ -1705,163 +1919,163 @@ function un(e, n) {
1705
1919
  }
1706
1920
  return r;
1707
1921
  }
1708
- function ir({
1922
+ function gr({
1709
1923
  initialFocusedHoleId: e = "",
1710
1924
  sourceFile: n = null,
1711
1925
  extraHoles: t = [],
1712
1926
  plotCount: r = 4
1713
1927
  } = {}) {
1714
- const [o, i] = K([]), [s, a] = K([]), [l, u] = K([]), [c, d] = K([]), [m, f] = K([]), [y, h] = K({}), [b, g] = K(""), [A, P] = K([]), [U, $] = K(""), [k, O] = K(e || ""), [D, S] = K([]), p = _e(null);
1715
- ne(() => {
1716
- !n || p.current === n || (p.current = n, zt(n).then((T) => {
1717
- if (!T) return;
1718
- const v = Array.from(new Map(T.map((z) => [z.holeId, z])).values());
1719
- a(v), P(it({
1720
- holeIds: v.map((z) => z.holeId),
1721
- focusedHoleId: k,
1928
+ const [o, i] = K([]), [s, a] = K([]), [l, u] = K([]), [c, d] = K([]), [f, m] = K([]), [g, h] = K({}), [y, p] = K(""), [E, I] = K([]), [k, w] = K(""), [F, R] = K(e || ""), [D, H] = K([]), b = ye(null);
1929
+ te(() => {
1930
+ !n || b.current === n || (b.current = n, kt(n).then((N) => {
1931
+ if (!N) return;
1932
+ const _ = Array.from(new Map(N.map((O) => [O.holeId, O])).values());
1933
+ a(_), I(lt({
1934
+ holeIds: _.map((O) => O.holeId),
1935
+ focusedHoleId: F,
1722
1936
  plotCount: r,
1723
1937
  defaultProp: "",
1724
1938
  categoricalProps: c,
1725
- commentProps: m,
1939
+ commentProps: f,
1726
1940
  numericDefaultChartType: "markers+line"
1727
1941
  }));
1728
- }).catch((T) => {
1729
- console.info("Assay metadata load skipped:", T.message);
1942
+ }).catch((N) => {
1943
+ console.info("Assay metadata load skipped:", N.message);
1730
1944
  }));
1731
- }, [n, k, r, c, m]), ne(() => {
1945
+ }, [n, F, r, c, f]), te(() => {
1732
1946
  if (!(t != null && t.length)) return;
1733
- const T = t.map((v) => ({ holeId: v.id || v.holeId })).filter((v) => v.holeId);
1734
- a((v) => {
1735
- const z = new Set(v.map((C) => C.holeId)), F = T.filter((C) => !z.has(C.holeId));
1736
- return F.length ? [...v, ...F] : v;
1947
+ const N = t.map((_) => ({ holeId: _.id || _.holeId })).filter((_) => _.holeId);
1948
+ a((_) => {
1949
+ const O = new Set(_.map((x) => x.holeId)), $ = N.filter((x) => !O.has(x.holeId));
1950
+ return $.length ? [..._, ...$] : _;
1737
1951
  });
1738
- }, [t]), ne(() => {
1739
- $((T) => T && T.startsWith("Loading ") && T.includes(" for hole ") ? T : "");
1740
- }, [A]), ne(() => {
1952
+ }, [t]), te(() => {
1953
+ w((N) => N && N.startsWith("Loading ") && N.includes(" for hole ") ? N : "");
1954
+ }, [E]), te(() => {
1741
1955
  if (!s.length) {
1742
- P([]);
1956
+ I([]);
1743
1957
  return;
1744
1958
  }
1745
- const T = st(s.map((v) => v.holeId), k);
1746
- P((v) => Array.from({ length: r }).map((F, C) => {
1959
+ const N = at(s.map((_) => _.holeId), F);
1960
+ I((_) => Array.from({ length: r }).map(($, x) => {
1747
1961
  var X;
1748
- const B = v[C] || {}, V = s.some((ae) => ae.holeId === B.holeId) ? B.holeId : T[C] || ((X = s[C]) == null ? void 0 : X.holeId) || "", w = B.property || b, q = Te({
1749
- property: w,
1750
- chartType: B.chartType,
1962
+ const C = _[x] || {}, j = s.some((ae) => ae.holeId === C.holeId) ? C.holeId : N[x] || ((X = s[x]) == null ? void 0 : X.holeId) || "", U = C.property || y, q = Se({
1963
+ property: U,
1964
+ chartType: C.chartType,
1751
1965
  categoricalProps: c,
1752
- commentProps: m,
1966
+ commentProps: f,
1753
1967
  numericDefaultChartType: "markers+line"
1754
1968
  });
1755
- return { holeId: V, property: w, chartType: q };
1969
+ return { holeId: j, property: U, chartType: q };
1756
1970
  }));
1757
- }, [s, k, b, c, m, r]), ne(() => {
1971
+ }, [s, F, y, c, f, r]), te(() => {
1758
1972
  if (!n) return;
1759
- A.map((v) => v.holeId).filter(Boolean).forEach((v) => {
1760
- const z = o.some((C) => (C.id || C.holeId) === v), F = D.includes(v);
1761
- z || F || (S((C) => [...C, v]), $t(n, v).then((C) => {
1762
- S((B) => B.filter((V) => V !== v)), C && i((B) => {
1763
- const V = Je(
1764
- [...B.filter((q) => (q.id || q.holeId) !== v), C],
1973
+ E.map((_) => _.holeId).filter(Boolean).forEach((_) => {
1974
+ const O = o.some((x) => (x.id || x.holeId) === _), $ = D.includes(_);
1975
+ O || $ || (H((x) => [...x, _]), wt(n, _).then((x) => {
1976
+ H((C) => C.filter((j) => j !== _)), x && i((C) => {
1977
+ const j = et(
1978
+ [...C.filter((q) => (q.id || q.holeId) !== _), x],
1765
1979
  t
1766
- ), w = Ie(V);
1767
- return u(w.numericProps), d(w.categoricalProps), f(w.commentProps), h(w.columnMeta), !b && w.defaultProp && (g(w.defaultProp), P((q) => q.map((X) => ({
1980
+ ), U = Te(j);
1981
+ return u(U.numericProps), d(U.categoricalProps), m(U.commentProps), h(U.columnMeta), !y && U.defaultProp && (p(U.defaultProp), I((q) => q.map((X) => ({
1768
1982
  ...X,
1769
- property: X.property || w.defaultProp,
1770
- chartType: Te({
1771
- property: X.property || w.defaultProp,
1983
+ property: X.property || U.defaultProp,
1984
+ chartType: Se({
1985
+ property: X.property || U.defaultProp,
1772
1986
  chartType: X.chartType,
1773
- categoricalProps: w.categoricalProps,
1774
- commentProps: w.commentProps,
1987
+ categoricalProps: U.categoricalProps,
1988
+ commentProps: U.commentProps,
1775
1989
  numericDefaultChartType: "markers+line"
1776
1990
  })
1777
- })))), V;
1991
+ })))), j;
1778
1992
  });
1779
- }).catch((C) => {
1780
- console.error(C), S((B) => B.filter((V) => V !== v)), $(C.message || `Error loading hole ${v}`);
1993
+ }).catch((x) => {
1994
+ console.error(x), H((C) => C.filter((j) => j !== _)), w(x.message || `Error loading hole ${_}`);
1781
1995
  }));
1782
1996
  });
1783
- }, [A, n, o, D, b, t]), ne(() => {
1784
- t != null && t.length && i((T) => {
1785
- if (!T.length) {
1786
- const F = Ie(t);
1787
- return u(F.numericProps), d(F.categoricalProps), f(F.commentProps), h(F.columnMeta), !b && F.defaultProp && g(F.defaultProp), t;
1997
+ }, [E, n, o, D, y, t]), te(() => {
1998
+ t != null && t.length && i((N) => {
1999
+ if (!N.length) {
2000
+ const $ = Te(t);
2001
+ return u($.numericProps), d($.categoricalProps), m($.commentProps), h($.columnMeta), !y && $.defaultProp && p($.defaultProp), t;
1788
2002
  }
1789
- const v = Je(T, t), z = Ie(v);
1790
- return u(z.numericProps), d(z.categoricalProps), f(z.commentProps), h(z.columnMeta), !b && z.defaultProp && g(z.defaultProp), v;
2003
+ const _ = et(N, t), O = Te(_);
2004
+ return u(O.numericProps), d(O.categoricalProps), m(O.commentProps), h(O.columnMeta), !y && O.defaultProp && p(O.defaultProp), _;
1791
2005
  });
1792
2006
  }, [t]);
1793
- const I = ee(
1794
- () => [...l, ...c, ...m],
1795
- [l, c, m]
1796
- ), _ = ee(
1797
- () => s.map((T) => ({ holeId: T.holeId, label: T.holeId })).sort((T, v) => T.label.localeCompare(v.label)),
2007
+ const M = ee(
2008
+ () => [...l, ...c, ...f],
2009
+ [l, c, f]
2010
+ ), S = ee(
2011
+ () => s.map((N) => ({ holeId: N.holeId, label: N.holeId })).sort((N, _) => N.label.localeCompare(_.label)),
1798
2012
  [s]
1799
- ), R = ee(() => {
1800
- const T = [...l, ...c, ...m];
1801
- return Array.from({ length: r }).map((v, z) => {
1802
- const F = A[z] || {}, C = o.find((fe) => (fe.id || fe.holeId) === F.holeId) || null, B = C ? T.filter((fe) => Tt(C, fe)) : T;
1803
- let V = F.property || b;
1804
- C && !B.includes(V) && (V = B[0] || V);
1805
- const w = m.includes(V), q = !w && c.includes(V), X = !w && !q && V === "dip", ae = w ? "comment" : X ? "tadpole" : q ? "categorical" : "numeric", be = X ? "tadpole" : F.chartType || (w ? "comment" : q ? "categorical" : "markers+line"), me = F.holeId || (C == null ? void 0 : C.id) || (C == null ? void 0 : C.holeId) || "", Pe = X ? (C == null ? void 0 : C.points) || [] : w ? un(C, V) : It(C, V, q);
2013
+ ), z = ee(() => {
2014
+ const N = [...l, ...c, ...f];
2015
+ return Array.from({ length: r }).map((_, O) => {
2016
+ const $ = E[O] || {}, x = o.find((me) => (me.id || me.holeId) === $.holeId) || null, C = x ? N.filter((me) => Mt(x, me)) : N;
2017
+ let j = $.property || y;
2018
+ x && !C.includes(j) && (j = C[0] || j);
2019
+ const U = f.includes(j), q = !U && c.includes(j), X = !U && !q && j === "dip", ae = U ? "comment" : X ? "tadpole" : q ? "categorical" : "numeric", _e = X ? "tadpole" : $.chartType || (U ? "comment" : q ? "categorical" : "markers+line"), fe = $.holeId || (x == null ? void 0 : x.id) || (x == null ? void 0 : x.holeId) || "", xe = X ? (x == null ? void 0 : x.points) || [] : U ? hn(x, j) : xt(x, j, q);
1806
2020
  return {
1807
- config: { holeId: me, property: V, chartType: be },
1808
- hole: C,
1809
- loading: D.includes(F.holeId),
2021
+ config: { holeId: fe, property: j, chartType: _e },
2022
+ hole: x,
2023
+ loading: D.includes($.holeId),
1810
2024
  isCategorical: q,
1811
- isComment: w,
2025
+ isComment: U,
1812
2026
  isTadpole: X,
1813
2027
  displayType: ae,
1814
- points: Pe,
1815
- propertyOptions: B,
1816
- label: me
2028
+ points: xe,
2029
+ propertyOptions: C,
2030
+ label: fe
1817
2031
  };
1818
2032
  });
1819
- }, [A, o, b, c, m, D, r, l]), x = (T, v) => {
1820
- P((z) => {
1821
- const F = [...z], B = { ...F[T] || {}, ...v };
1822
- return v.property && (B.chartType = Te({
1823
- property: v.property,
1824
- chartType: B.chartType,
2033
+ }, [E, o, y, c, f, D, r, l]), A = (N, _) => {
2034
+ I((O) => {
2035
+ const $ = [...O], C = { ...$[N] || {}, ..._ };
2036
+ return _.property && (C.chartType = Se({
2037
+ property: _.property,
2038
+ chartType: C.chartType,
1825
2039
  categoricalProps: c,
1826
- commentProps: m,
2040
+ commentProps: f,
1827
2041
  numericDefaultChartType: "markers+line"
1828
- })), F[T] = B, F;
2042
+ })), $[N] = C, $;
1829
2043
  });
1830
2044
  };
1831
2045
  return {
1832
- error: U,
1833
- focusedHoleId: k,
1834
- setFocusedHoleId: O,
1835
- setError: $,
2046
+ error: k,
2047
+ focusedHoleId: F,
2048
+ setFocusedHoleId: R,
2049
+ setError: w,
1836
2050
  holeCount: s.length,
1837
2051
  numericProps: l,
1838
2052
  categoricalProps: c,
1839
- commentProps: m,
1840
- columnMeta: y,
1841
- propertyOptions: I,
1842
- labeledHoleOptions: _,
1843
- traceGraphs: R,
1844
- handleConfigChange: x
2053
+ commentProps: f,
2054
+ columnMeta: g,
2055
+ propertyOptions: M,
2056
+ labeledHoleOptions: S,
2057
+ traceGraphs: z,
2058
+ handleConfigChange: A
1845
2059
  };
1846
2060
  }
1847
- function ht(e) {
2061
+ function gt(e) {
1848
2062
  return Array.isArray(e) ? e : [];
1849
2063
  }
1850
- function De(e) {
2064
+ function Ce(e) {
1851
2065
  const n = Number(e);
1852
2066
  return Number.isFinite(n) ? n : void 0;
1853
2067
  }
1854
- function gt(e = {}) {
2068
+ function yt(e = {}) {
1855
2069
  return {
1856
2070
  ...e,
1857
- x: De(e.x),
1858
- y: De(e.y),
1859
- z: De(e.z)
2071
+ x: Ce(e.x),
2072
+ y: Ce(e.y),
2073
+ z: Ce(e.z)
1860
2074
  };
1861
2075
  }
1862
- function dn(e = [], n = [0, 0], t = 0) {
2076
+ function pn(e = [], n = [0, 0], t = 0) {
1863
2077
  const [r, o] = n, i = Number(t) * Math.PI / 180, s = Math.cos(i), a = Math.sin(i);
1864
- return ht(e).map(gt).map((l) => {
2078
+ return gt(e).map(yt).map((l) => {
1865
2079
  if (!Number.isFinite(l.x) || !Number.isFinite(l.y)) return { ...l };
1866
2080
  const u = l.x - r, c = l.y - o;
1867
2081
  return {
@@ -1871,12 +2085,12 @@ function dn(e = [], n = [0, 0], t = 0) {
1871
2085
  };
1872
2086
  });
1873
2087
  }
1874
- function mn(e = [], n = [0, 0], t = 0, r = 50) {
1875
- const o = dn(e, n, t), i = 0.5 * Number(r || 0);
2088
+ function bn(e = [], n = [0, 0], t = 0, r = 50) {
2089
+ const o = pn(e, n, t), i = 0.5 * Number(r || 0);
1876
2090
  return !Number.isFinite(i) || i <= 0 ? o : o.filter((s) => Number.isFinite(s.across) && Math.abs(s.across) <= i);
1877
2091
  }
1878
- function ar(e = [], n = null, t = null) {
1879
- let r = ht(e).map(gt);
2092
+ function yr(e = [], n = null, t = null) {
2093
+ let r = gt(e).map(yt);
1880
2094
  if (Array.isArray(n) && n.length === 2) {
1881
2095
  const [o, i] = n;
1882
2096
  r = r.filter((s) => Number.isFinite(s.z) && s.z <= Number(o) && s.z >= Number(i));
@@ -1886,27 +2100,27 @@ function ar(e = [], n = null, t = null) {
1886
2100
  color_value: o == null ? void 0 : o[t]
1887
2101
  }))), r;
1888
2102
  }
1889
- function lr(e = [], n = [0, 0], t = 0, r = 50, o = null) {
1890
- let i = mn(e, n, t, r);
2103
+ function _r(e = [], n = [0, 0], t = 0, r = 50, o = null) {
2104
+ let i = bn(e, n, t, r);
1891
2105
  return o && (i = i.map((s) => ({
1892
2106
  ...s,
1893
2107
  color_value: s == null ? void 0 : s[o]
1894
2108
  }))), i;
1895
2109
  }
1896
- function He(e) {
2110
+ function Ue(e) {
1897
2111
  return Array.isArray(e) ? e : [];
1898
2112
  }
1899
- function Ge(e = {}) {
2113
+ function Be(e = {}) {
1900
2114
  return e.hole_id ?? e.holeId ?? e.id;
1901
2115
  }
1902
2116
  function ue(e, n = void 0) {
1903
2117
  const t = Number(e);
1904
2118
  return Number.isFinite(t) ? t : n;
1905
2119
  }
1906
- function cr(e = [], n = null) {
2120
+ function Nr(e = [], n = null) {
1907
2121
  const t = /* @__PURE__ */ new Map();
1908
- He(e).forEach((o) => {
1909
- const i = Ge(o);
2122
+ Ue(e).forEach((o) => {
2123
+ const i = Be(o);
1910
2124
  if (i == null || `${i}`.trim() === "") return;
1911
2125
  const s = `${i}`;
1912
2126
  t.has(s) || t.set(s, []), t.get(s).push(o);
@@ -1923,9 +2137,9 @@ function cr(e = [], n = null) {
1923
2137
  n && (a.color = s.map((l) => l == null ? void 0 : l[n])), r.push(a);
1924
2138
  }), r;
1925
2139
  }
1926
- function ur(e = [], n = 1, t = null) {
1927
- return He(e).map((r) => ({
1928
- hole_id: Ge(r),
2140
+ function vr(e = [], n = 1, t = null) {
2141
+ return Ue(e).map((r) => ({
2142
+ hole_id: Be(r),
1929
2143
  from: r == null ? void 0 : r.from,
1930
2144
  to: r == null ? void 0 : r.to,
1931
2145
  radius: n,
@@ -1933,14 +2147,14 @@ function ur(e = [], n = 1, t = null) {
1933
2147
  value: t ? r == null ? void 0 : r[t] : null
1934
2148
  }));
1935
2149
  }
1936
- function dr(e = [], n = null) {
1937
- return n ? He(e).filter((t) => Object.prototype.hasOwnProperty.call(t || {}, n)).map((t) => ({
1938
- hole_id: Ge(t),
2150
+ function Er(e = [], n = null) {
2151
+ return n ? Ue(e).filter((t) => Object.prototype.hasOwnProperty.call(t || {}, n)).map((t) => ({
2152
+ hole_id: Be(t),
1939
2153
  label: t == null ? void 0 : t[n],
1940
2154
  depth: 0.5 * (ue(t == null ? void 0 : t.from, 0) + ue(t == null ? void 0 : t.to, 0))
1941
2155
  })) : [];
1942
2156
  }
1943
- function mr({
2157
+ function Ar({
1944
2158
  controlMode: e = "orbit",
1945
2159
  onToggleFly: n = () => {
1946
2160
  },
@@ -1954,13 +2168,13 @@ function mr({
1954
2168
  onToggleDarkBackground: s = () => {
1955
2169
  }
1956
2170
  }) {
1957
- return /* @__PURE__ */ H("div", { className: "baselode-3d-controls", children: [
1958
- /* @__PURE__ */ E("button", { type: "button", className: "ghost-button", onClick: t, children: "Recenter to (0,0,0)" }),
1959
- /* @__PURE__ */ E("button", { type: "button", className: "ghost-button", onClick: r, children: "Look down" }),
1960
- /* @__PURE__ */ E("button", { type: "button", className: "ghost-button", onClick: o, children: "Fit to scene" }),
1961
- /* @__PURE__ */ E("button", { type: "button", className: "ghost-button", onClick: n, children: e === "orbit" ? "Enable fly controls" : "Disable fly controls" }),
1962
- /* @__PURE__ */ H("label", { className: "baselode-3d-controls-checkbox", children: [
1963
- /* @__PURE__ */ E(
2171
+ return /* @__PURE__ */ B("div", { className: "baselode-3d-controls", children: [
2172
+ /* @__PURE__ */ T("button", { type: "button", className: "ghost-button", onClick: t, children: "Recenter to (0,0,0)" }),
2173
+ /* @__PURE__ */ T("button", { type: "button", className: "ghost-button", onClick: r, children: "Look down" }),
2174
+ /* @__PURE__ */ T("button", { type: "button", className: "ghost-button", onClick: o, children: "Fit to scene" }),
2175
+ /* @__PURE__ */ T("button", { type: "button", className: "ghost-button", onClick: n, children: e === "orbit" ? "Enable fly controls" : "Disable fly controls" }),
2176
+ /* @__PURE__ */ B("label", { className: "baselode-3d-controls-checkbox", children: [
2177
+ /* @__PURE__ */ T(
1964
2178
  "input",
1965
2179
  {
1966
2180
  type: "checkbox",
@@ -1972,7 +2186,7 @@ function mr({
1972
2186
  ] })
1973
2187
  ] });
1974
2188
  }
1975
- function fr({
2189
+ function Sr({
1976
2190
  properties: e = [],
1977
2191
  selectedProperty: n = "",
1978
2192
  onPropertyChange: t = () => {
@@ -1986,9 +2200,9 @@ function fr({
1986
2200
  }
1987
2201
  }) {
1988
2202
  var l, u;
1989
- return /* @__PURE__ */ H("div", { className: "bm-widget", children: [
1990
- /* @__PURE__ */ E("label", { className: "bm-widget__label", htmlFor: "bm-property-select", children: "Color by" }),
1991
- /* @__PURE__ */ H(
2203
+ return /* @__PURE__ */ B("div", { className: "bm-widget", children: [
2204
+ /* @__PURE__ */ T("label", { className: "bm-widget__label", htmlFor: "bm-property-select", children: "Color by" }),
2205
+ /* @__PURE__ */ B(
1992
2206
  "select",
1993
2207
  {
1994
2208
  id: "bm-property-select",
@@ -1996,34 +2210,34 @@ function fr({
1996
2210
  value: n,
1997
2211
  onChange: (c) => t(c.target.value),
1998
2212
  children: [
1999
- e.length === 0 && /* @__PURE__ */ E("option", { value: "", children: "— no attributes —" }),
2000
- e.map((c) => /* @__PURE__ */ E("option", { value: c, children: c }, c))
2213
+ e.length === 0 && /* @__PURE__ */ T("option", { value: "", children: "— no attributes —" }),
2214
+ e.map((c) => /* @__PURE__ */ T("option", { value: c, children: c }, c))
2001
2215
  ]
2002
2216
  }
2003
2217
  ),
2004
- i && i.type === "numeric" && /* @__PURE__ */ H("div", { className: "bm-widget__scale", children: [
2005
- /* @__PURE__ */ E("span", { className: "bm-widget__scale-label bm-widget__scale-label--min", children: ((l = i.min) == null ? void 0 : l.toFixed(2)) ?? "—" }),
2006
- /* @__PURE__ */ E("div", { className: "bm-widget__scale-bar" }),
2007
- /* @__PURE__ */ E("span", { className: "bm-widget__scale-label bm-widget__scale-label--max", children: ((u = i.max) == null ? void 0 : u.toFixed(2)) ?? "—" })
2218
+ i && i.type === "numeric" && /* @__PURE__ */ B("div", { className: "bm-widget__scale", children: [
2219
+ /* @__PURE__ */ T("span", { className: "bm-widget__scale-label bm-widget__scale-label--min", children: ((l = i.min) == null ? void 0 : l.toFixed(2)) ?? "—" }),
2220
+ /* @__PURE__ */ T("div", { className: "bm-widget__scale-bar" }),
2221
+ /* @__PURE__ */ T("span", { className: "bm-widget__scale-label bm-widget__scale-label--max", children: ((u = i.max) == null ? void 0 : u.toFixed(2)) ?? "—" })
2008
2222
  ] }),
2009
- i && i.type === "categorical" && /* @__PURE__ */ E("div", { className: "bm-widget__categories", children: (i.categories || []).map((c, d) => {
2010
- const m = Math.round(d / Math.max(i.categories.length, 1) * 360);
2011
- return /* @__PURE__ */ E(
2223
+ i && i.type === "categorical" && /* @__PURE__ */ T("div", { className: "bm-widget__categories", children: (i.categories || []).map((c, d) => {
2224
+ const f = Math.round(d / Math.max(i.categories.length, 1) * 360);
2225
+ return /* @__PURE__ */ T(
2012
2226
  "span",
2013
2227
  {
2014
2228
  className: "bm-widget__category-chip",
2015
- style: { background: `hsl(${m},70%,50%)` },
2229
+ style: { background: `hsl(${f},70%,50%)` },
2016
2230
  children: c
2017
2231
  },
2018
2232
  c
2019
2233
  );
2020
2234
  }) }),
2021
- /* @__PURE__ */ H("label", { className: "bm-widget__label", htmlFor: "bm-opacity-slider", children: [
2235
+ /* @__PURE__ */ B("label", { className: "bm-widget__label", htmlFor: "bm-opacity-slider", children: [
2022
2236
  "Opacity (",
2023
2237
  Math.round(r * 100),
2024
2238
  "%)"
2025
2239
  ] }),
2026
- /* @__PURE__ */ E(
2240
+ /* @__PURE__ */ T(
2027
2241
  "input",
2028
2242
  {
2029
2243
  id: "bm-opacity-slider",
@@ -2036,10 +2250,10 @@ function fr({
2036
2250
  onChange: (c) => o(parseFloat(c.target.value))
2037
2251
  }
2038
2252
  ),
2039
- s && /* @__PURE__ */ H("div", { className: "bm-widget__popup", children: [
2040
- /* @__PURE__ */ H("div", { className: "bm-widget__popup-header", children: [
2041
- /* @__PURE__ */ E("span", { children: "Block attributes" }),
2042
- /* @__PURE__ */ E(
2253
+ s && /* @__PURE__ */ B("div", { className: "bm-widget__popup", children: [
2254
+ /* @__PURE__ */ B("div", { className: "bm-widget__popup-header", children: [
2255
+ /* @__PURE__ */ T("span", { children: "Block attributes" }),
2256
+ /* @__PURE__ */ T(
2043
2257
  "button",
2044
2258
  {
2045
2259
  type: "button",
@@ -2050,19 +2264,19 @@ function fr({
2050
2264
  }
2051
2265
  )
2052
2266
  ] }),
2053
- /* @__PURE__ */ E("table", { className: "bm-widget__popup-table", children: /* @__PURE__ */ E("tbody", { children: Object.entries(s).map(([c, d]) => /* @__PURE__ */ H("tr", { children: [
2054
- /* @__PURE__ */ E("th", { children: c }),
2055
- /* @__PURE__ */ E("td", { children: d == null ? "—" : String(d) })
2267
+ /* @__PURE__ */ T("table", { className: "bm-widget__popup-table", children: /* @__PURE__ */ T("tbody", { children: Object.entries(s).map(([c, d]) => /* @__PURE__ */ B("tr", { children: [
2268
+ /* @__PURE__ */ T("th", { children: c }),
2269
+ /* @__PURE__ */ T("td", { children: d == null ? "—" : String(d) })
2056
2270
  ] }, c)) }) })
2057
2271
  ] })
2058
2272
  ] });
2059
2273
  }
2060
- const fn = [
2274
+ const gn = [
2061
2275
  { minZoom: 0, lodKey: "thumb" },
2062
2276
  { minZoom: 4, lodKey: "medium" },
2063
2277
  { minZoom: 7, lodKey: "full" }
2064
- ], yt = 50;
2065
- function pn(e, n, t = fn) {
2278
+ ], _t = 50;
2279
+ function yn(e, n, t = gn) {
2066
2280
  var i;
2067
2281
  const r = e.lod_urls;
2068
2282
  if (!r || typeof r != "object" || Array.isArray(r))
@@ -2072,10 +2286,10 @@ function pn(e, n, t = fn) {
2072
2286
  n >= s.minZoom && (o = s.lodKey);
2073
2287
  return r[o] || e.image_url || "";
2074
2288
  }
2075
- function hn(e) {
2289
+ function _n(e) {
2076
2290
  return [...e].sort((n, t) => (n.from_depth ?? 0) - (t.from_depth ?? 0));
2077
2291
  }
2078
- function gn(e) {
2292
+ function Nn(e) {
2079
2293
  const n = {};
2080
2294
  for (const t of e) {
2081
2295
  const r = t.photo_set != null && t.photo_set !== "" ? String(t.photo_set) : "default";
@@ -2083,7 +2297,7 @@ function gn(e) {
2083
2297
  }
2084
2298
  return n;
2085
2299
  }
2086
- function yn(e, n, t = 10) {
2300
+ function vn(e, n, t = 10) {
2087
2301
  const r = [];
2088
2302
  if (e >= n || t <= 0) return r;
2089
2303
  const o = Math.ceil(e / t) * t, i = t * 1e-9;
@@ -2093,13 +2307,13 @@ function yn(e, n, t = 10) {
2093
2307
  }
2094
2308
  return r;
2095
2309
  }
2096
- function bn(e) {
2310
+ function En(e) {
2097
2311
  return e >= 9 ? 1 : e >= 7 ? 2 : e >= 5 ? 5 : e >= 3 ? 10 : 20;
2098
2312
  }
2099
- function bt(e) {
2313
+ function Nt(e) {
2100
2314
  return `tray_${String(e).padStart(3, "0")}.jpg`;
2101
2315
  }
2102
- function _n(e, n, t, r, o = "Tray Images", i = bt) {
2316
+ function An(e, n, t, r, o = "Tray Images", i = Nt) {
2103
2317
  const s = (t ?? "").replace(/\/$/, ""), a = (r ?? "").replace(/\/$/, "");
2104
2318
  return n.map((l, u) => {
2105
2319
  const c = l.filename ?? i(u), d = l.photoSet ?? o;
@@ -2116,97 +2330,97 @@ function _n(e, n, t, r, o = "Tray Images", i = bt) {
2116
2330
  };
2117
2331
  });
2118
2332
  }
2119
- function pr(e, n, t = yt) {
2333
+ function Tr(e, n, t = _t) {
2120
2334
  const r = n / 5;
2121
2335
  return Math.max(1, Math.round(e * t * r));
2122
2336
  }
2123
- const Re = 5, Qe = 1.12, Nn = 0.05, vn = 40;
2124
- function En({
2337
+ const Re = 5, tt = 1.12, Sn = 0.05, Tn = 40;
2338
+ function In({
2125
2339
  photos: e = [],
2126
2340
  holeId: n = "",
2127
2341
  initialZoom: t = 5,
2128
2342
  transform: r,
2129
2343
  onTransformChange: o
2130
2344
  }) {
2131
- const [i, s] = K({ scale: 1, tx: 0, ty: 0 }), a = r ?? i, l = _e(a);
2345
+ const [i, s] = K({ scale: 1, tx: 0, ty: 0 }), a = r ?? i, l = ye(a);
2132
2346
  l.current = a;
2133
2347
  const u = Oe(
2134
- (p) => {
2135
- const I = typeof p == "function" ? p(l.current) : p;
2136
- o ? o(I) : s(I);
2348
+ (b) => {
2349
+ const M = typeof b == "function" ? b(l.current) : b;
2350
+ o ? o(M) : s(M);
2137
2351
  },
2138
2352
  [o]
2139
- ), [c, d] = K(!1), m = _e(null), f = _e(null), y = ee(() => hn(e), [e]), h = ee(() => gn(y), [y]), b = ee(() => {
2140
- const p = /* @__PURE__ */ new Set();
2141
- for (const I of e) {
2142
- const _ = I.photo_set != null && I.photo_set !== "" ? String(I.photo_set) : "default";
2143
- p.add(_);
2353
+ ), [c, d] = K(!1), f = ye(null), m = ye(null), g = ee(() => _n(e), [e]), h = ee(() => Nn(g), [g]), y = ee(() => {
2354
+ const b = /* @__PURE__ */ new Set();
2355
+ for (const M of e) {
2356
+ const S = M.photo_set != null && M.photo_set !== "" ? String(M.photo_set) : "default";
2357
+ b.add(S);
2144
2358
  }
2145
- return [...p];
2146
- }, [e]), { minDepth: g, maxDepth: A } = ee(() => {
2147
- if (!y.length) return { minDepth: 0, maxDepth: 0 };
2148
- const p = y.map((I) => I.to_depth ?? I.from_depth ?? 0);
2359
+ return [...b];
2360
+ }, [e]), { minDepth: p, maxDepth: E } = ee(() => {
2361
+ if (!g.length) return { minDepth: 0, maxDepth: 0 };
2362
+ const b = g.map((M) => M.to_depth ?? M.from_depth ?? 0);
2149
2363
  return {
2150
- minDepth: y[0].from_depth ?? 0,
2151
- maxDepth: Math.max(...p)
2364
+ minDepth: g[0].from_depth ?? 0,
2365
+ maxDepth: Math.max(...b)
2152
2366
  };
2153
- }, [y]), P = yt * Re / 5, U = ee(
2154
- () => Math.max(1, Math.round((A - g) * P)),
2155
- [g, A, P]
2156
- ), $ = ee(() => {
2157
- const p = bn(Re);
2158
- return yn(g, A, p);
2159
- }, [g, A]), k = 540 * Re / 5, O = ee(
2367
+ }, [g]), I = _t * Re / 5, k = ee(
2368
+ () => Math.max(1, Math.round((E - p) * I)),
2369
+ [p, E, I]
2370
+ ), w = ee(() => {
2371
+ const b = En(Re);
2372
+ return vn(p, E, b);
2373
+ }, [p, E]), F = 540 * Re / 5, R = ee(
2160
2374
  () => Math.max(1, Math.min(10, Math.round(t * a.scale))),
2161
2375
  [t, a.scale]
2162
- ), D = Oe((p) => {
2163
- p.preventDefault();
2164
- const I = p.deltaY < 0 ? Qe : 1 / Qe, _ = f.current.getBoundingClientRect(), R = p.clientX - _.left, x = p.clientY - _.top;
2165
- u((T) => {
2166
- const v = Math.max(Nn, Math.min(vn, T.scale * I)), z = v / T.scale;
2376
+ ), D = Oe((b) => {
2377
+ b.preventDefault();
2378
+ const M = b.deltaY < 0 ? tt : 1 / tt, S = m.current.getBoundingClientRect(), z = b.clientX - S.left, A = b.clientY - S.top;
2379
+ u((N) => {
2380
+ const _ = Math.max(Sn, Math.min(Tn, N.scale * M)), O = _ / N.scale;
2167
2381
  return {
2168
- scale: v,
2169
- tx: R - (R - T.tx) * z,
2170
- ty: x - (x - T.ty) * z
2382
+ scale: _,
2383
+ tx: z - (z - N.tx) * O,
2384
+ ty: A - (A - N.ty) * O
2171
2385
  };
2172
2386
  });
2173
2387
  }, [u]);
2174
- ne(() => {
2175
- const p = f.current;
2176
- if (p)
2177
- return p.addEventListener("wheel", D, { passive: !1 }), () => p.removeEventListener("wheel", D);
2388
+ te(() => {
2389
+ const b = m.current;
2390
+ if (b)
2391
+ return b.addEventListener("wheel", D, { passive: !1 }), () => b.removeEventListener("wheel", D);
2178
2392
  }, [D]);
2179
- const S = Oe((p) => {
2180
- p.button === 0 && (p.preventDefault(), m.current = {
2181
- x: p.clientX,
2182
- y: p.clientY,
2393
+ const H = Oe((b) => {
2394
+ b.button === 0 && (b.preventDefault(), f.current = {
2395
+ x: b.clientX,
2396
+ y: b.clientY,
2183
2397
  tx: l.current.tx,
2184
2398
  ty: l.current.ty
2185
2399
  }, d(!0));
2186
2400
  }, []);
2187
- return ne(() => {
2188
- const p = (_) => {
2189
- if (!m.current) return;
2190
- const { tx: R, ty: x, x: T, y: v } = m.current;
2191
- u((z) => ({
2192
- ...z,
2193
- tx: R + (_.clientX - T),
2194
- ty: x + (_.clientY - v)
2401
+ return te(() => {
2402
+ const b = (S) => {
2403
+ if (!f.current) return;
2404
+ const { tx: z, ty: A, x: N, y: _ } = f.current;
2405
+ u((O) => ({
2406
+ ...O,
2407
+ tx: z + (S.clientX - N),
2408
+ ty: A + (S.clientY - _)
2195
2409
  }));
2196
- }, I = () => {
2197
- m.current = null, d(!1);
2410
+ }, M = () => {
2411
+ f.current = null, d(!1);
2198
2412
  };
2199
- return window.addEventListener("mousemove", p), window.addEventListener("mouseup", I), () => {
2200
- window.removeEventListener("mousemove", p), window.removeEventListener("mouseup", I);
2413
+ return window.addEventListener("mousemove", b), window.addEventListener("mouseup", M), () => {
2414
+ window.removeEventListener("mousemove", b), window.removeEventListener("mouseup", M);
2201
2415
  };
2202
- }, [u]), /* @__PURE__ */ H("div", { className: "core-photo-table", children: [
2203
- /* @__PURE__ */ H("div", { className: "core-photo-controls", children: [
2204
- n && /* @__PURE__ */ E("span", { className: "core-photo-hole-id", children: n }),
2205
- /* @__PURE__ */ H("span", { className: "core-photo-zoom-label", children: [
2416
+ }, [u]), /* @__PURE__ */ B("div", { className: "core-photo-table", children: [
2417
+ /* @__PURE__ */ B("div", { className: "core-photo-controls", children: [
2418
+ n && /* @__PURE__ */ T("span", { className: "core-photo-hole-id", children: n }),
2419
+ /* @__PURE__ */ B("span", { className: "core-photo-zoom-label", children: [
2206
2420
  Math.round(a.scale * 100),
2207
2421
  "%"
2208
2422
  ] }),
2209
- /* @__PURE__ */ E(
2423
+ /* @__PURE__ */ T(
2210
2424
  "button",
2211
2425
  {
2212
2426
  className: "core-photo-zoom-btn",
@@ -2217,92 +2431,92 @@ function En({
2217
2431
  }
2218
2432
  )
2219
2433
  ] }),
2220
- e.length > 0 && /* @__PURE__ */ H("div", { className: "core-photo-col-headers", children: [
2221
- /* @__PURE__ */ E("div", { className: "core-photo-ruler-spacer" }),
2222
- b.map((p) => /* @__PURE__ */ E(
2434
+ e.length > 0 && /* @__PURE__ */ B("div", { className: "core-photo-col-headers", children: [
2435
+ /* @__PURE__ */ T("div", { className: "core-photo-ruler-spacer" }),
2436
+ y.map((b) => /* @__PURE__ */ T(
2223
2437
  "div",
2224
2438
  {
2225
2439
  className: "core-photo-set-header",
2226
- style: { width: k },
2227
- children: p
2440
+ style: { width: F },
2441
+ children: b
2228
2442
  },
2229
- p
2443
+ b
2230
2444
  ))
2231
2445
  ] }),
2232
- e.length === 0 ? /* @__PURE__ */ E("div", { className: "core-photo-empty", children: "No photos to display." }) : /* @__PURE__ */ E(
2446
+ e.length === 0 ? /* @__PURE__ */ T("div", { className: "core-photo-empty", children: "No photos to display." }) : /* @__PURE__ */ T(
2233
2447
  "div",
2234
2448
  {
2235
2449
  className: `core-photo-scroll${c ? " is-dragging" : ""}`,
2236
- ref: f,
2237
- onMouseDown: S,
2238
- children: /* @__PURE__ */ H(
2450
+ ref: m,
2451
+ onMouseDown: H,
2452
+ children: /* @__PURE__ */ B(
2239
2453
  "div",
2240
2454
  {
2241
2455
  className: "core-photo-inner",
2242
2456
  style: {
2243
- height: U,
2457
+ height: k,
2244
2458
  transform: `translate(${a.tx}px, ${a.ty}px) scale(${a.scale})`,
2245
2459
  transformOrigin: "0 0"
2246
2460
  },
2247
2461
  children: [
2248
- /* @__PURE__ */ E(
2462
+ /* @__PURE__ */ T(
2249
2463
  "div",
2250
2464
  {
2251
2465
  className: "core-photo-depth-ruler",
2252
- style: { height: U },
2253
- children: $.map(({ depth: p, label: I }) => /* @__PURE__ */ E(
2466
+ style: { height: k },
2467
+ children: w.map(({ depth: b, label: M }) => /* @__PURE__ */ T(
2254
2468
  "div",
2255
2469
  {
2256
2470
  className: "core-photo-depth-marker",
2257
2471
  style: {
2258
- top: Math.round((p - g) * P)
2472
+ top: Math.round((b - p) * I)
2259
2473
  },
2260
- children: I
2474
+ children: M
2261
2475
  },
2262
- p
2476
+ b
2263
2477
  ))
2264
2478
  }
2265
2479
  ),
2266
- b.map((p) => /* @__PURE__ */ E(
2480
+ y.map((b) => /* @__PURE__ */ T(
2267
2481
  "div",
2268
2482
  {
2269
2483
  className: "core-photo-col-body",
2270
- style: { height: U, width: k },
2271
- children: h[p].map((I) => {
2272
- const _ = I.from_depth ?? 0, R = I.to_depth ?? _, x = Math.round(
2273
- (_ - g) * P
2274
- ), T = Math.max(
2484
+ style: { height: k, width: F },
2485
+ children: h[b].map((M) => {
2486
+ const S = M.from_depth ?? 0, z = M.to_depth ?? S, A = Math.round(
2487
+ (S - p) * I
2488
+ ), N = Math.max(
2275
2489
  2,
2276
- Math.round((R - _) * P)
2277
- ), v = pn(I, O);
2278
- return /* @__PURE__ */ H(
2490
+ Math.round((z - S) * I)
2491
+ ), _ = yn(M, R);
2492
+ return /* @__PURE__ */ B(
2279
2493
  "div",
2280
2494
  {
2281
2495
  className: "core-photo-item",
2282
- style: { top: x, height: T, width: k },
2283
- title: `${_}–${R} m`,
2496
+ style: { top: A, height: N, width: F },
2497
+ title: `${S}–${z} m`,
2284
2498
  children: [
2285
- v ? /* @__PURE__ */ E(
2499
+ _ ? /* @__PURE__ */ T(
2286
2500
  "img",
2287
2501
  {
2288
- src: v,
2289
- alt: `Core ${_}–${R} m`,
2502
+ src: _,
2503
+ alt: `Core ${S}–${z} m`,
2290
2504
  loading: "lazy"
2291
2505
  }
2292
- ) : /* @__PURE__ */ E("div", { className: "core-photo-no-image" }),
2293
- T >= 18 && /* @__PURE__ */ H("span", { className: "core-photo-item-label", children: [
2294
- _,
2506
+ ) : /* @__PURE__ */ T("div", { className: "core-photo-no-image" }),
2507
+ N >= 18 && /* @__PURE__ */ B("span", { className: "core-photo-item-label", children: [
2508
+ S,
2295
2509
  "–",
2296
- R,
2510
+ z,
2297
2511
  " m"
2298
2512
  ] })
2299
2513
  ]
2300
2514
  },
2301
- `${I.hole_id ?? ""}-${_}-${R}-${p}`
2515
+ `${M.hole_id ?? ""}-${S}-${z}-${b}`
2302
2516
  );
2303
2517
  })
2304
2518
  },
2305
- p
2519
+ b
2306
2520
  ))
2307
2521
  ]
2308
2522
  }
@@ -2311,23 +2525,23 @@ function En({
2311
2525
  )
2312
2526
  ] });
2313
2527
  }
2314
- function hr({
2528
+ function Ir({
2315
2529
  holeId: e = "",
2316
2530
  trays: n = [],
2317
2531
  thumbBaseUrl: t = "",
2318
2532
  fullBaseUrl: r = "",
2319
2533
  photoSet: o = "Tray Images",
2320
- getFilename: i = bt,
2534
+ getFilename: i = Nt,
2321
2535
  initialZoom: s = 5,
2322
2536
  transform: a,
2323
2537
  onTransformChange: l
2324
2538
  }) {
2325
2539
  const u = ee(
2326
- () => _n(e, n, t, r, o, i),
2540
+ () => An(e, n, t, r, o, i),
2327
2541
  [e, n, t, r, o, i]
2328
2542
  );
2329
- return /* @__PURE__ */ E(
2330
- En,
2543
+ return /* @__PURE__ */ T(
2544
+ In,
2331
2545
  {
2332
2546
  photos: u,
2333
2547
  holeId: e,
@@ -2337,7 +2551,7 @@ function hr({
2337
2551
  }
2338
2552
  );
2339
2553
  }
2340
- function gr(e) {
2554
+ function Lr(e) {
2341
2555
  const n = typeof e == "string" ? JSON.parse(e) : e;
2342
2556
  if (n.schema_version !== "1.0")
2343
2557
  throw new Error(
@@ -2365,7 +2579,7 @@ function gr(e) {
2365
2579
  blocks: t
2366
2580
  };
2367
2581
  }
2368
- function An(e) {
2582
+ function Ln(e) {
2369
2583
  const n = new Q.BufferGeometry(), t = new Float32Array(e.vertices.length * 3);
2370
2584
  e.vertices.forEach(([o, i, s], a) => {
2371
2585
  t[a * 3] = o, t[a * 3 + 1] = i, t[a * 3 + 2] = s;
@@ -2375,11 +2589,11 @@ function An(e) {
2375
2589
  r[a * 3] = o, r[a * 3 + 1] = i, r[a * 3 + 2] = s;
2376
2590
  }), n.setIndex(new Q.BufferAttribute(r, 1)), n;
2377
2591
  }
2378
- function yr(e, n, t = {}) {
2592
+ function Mr(e, n, t = {}) {
2379
2593
  const { defaultOpacity: r = 1 } = t, o = new Q.Group();
2380
2594
  return n.blocks.forEach((i) => {
2381
- var h, b;
2382
- const s = An(i), a = ((h = i.material) == null ? void 0 : h.color) ?? "#888888", l = ((b = i.material) == null ? void 0 : b.opacity) ?? r, u = l < 1, c = new Q.MeshStandardMaterial({
2595
+ var h, y;
2596
+ const s = Ln(i), a = ((h = i.material) == null ? void 0 : h.color) ?? "#888888", l = ((y = i.material) == null ? void 0 : y.opacity) ?? r, u = l < 1, c = new Q.MeshStandardMaterial({
2383
2597
  color: new Q.Color(a),
2384
2598
  opacity: l,
2385
2599
  transparent: u,
@@ -2390,219 +2604,231 @@ function yr(e, n, t = {}) {
2390
2604
  id: i.id,
2391
2605
  attributes: i.attributes
2392
2606
  };
2393
- const m = new Q.EdgesGeometry(s, 15), f = new Q.LineBasicMaterial({ color: "#ffffbb", linewidth: 1 }), y = new Q.LineSegments(m, f);
2394
- y.visible = !1, d.add(y), o.add(d);
2607
+ const f = new Q.EdgesGeometry(s, 15), m = new Q.LineBasicMaterial({ color: "#ffffbb", linewidth: 1 }), g = new Q.LineSegments(f, m);
2608
+ g.visible = !1, d.add(g), o.add(d);
2395
2609
  }), e.add(o), o;
2396
2610
  }
2397
2611
  export {
2398
- Nr as ALPHA,
2399
- vr as ASSAY_COLOR_PALETTE_10,
2400
- Lt as ASSAY_NON_VALUE_FIELDS,
2612
+ Pr as ALPHA,
2613
+ Dr as ASSAY_COLOR_PALETTE_10,
2614
+ Pt as ASSAY_NON_VALUE_FIELDS,
2401
2615
  Y as AZIMUTH,
2402
- Er as BASELODE_COLORWAY,
2403
- Ar as BASELODE_DARK,
2404
- Sr as BASELODE_DARK_TEMPLATE,
2405
- Tr as BASELODE_DARK_TEMPLATE_NAME,
2406
- Ir as BASELODE_DATA_MODEL_DRILL_ASSAY,
2407
- Cr as BASELODE_DATA_MODEL_DRILL_COLLAR,
2408
- Et as BASELODE_DATA_MODEL_DRILL_GEOLOGY,
2409
- Lr as BASELODE_DATA_MODEL_DRILL_SURVEY,
2410
- Mr as BASELODE_DATA_MODEL_GEOPHYSICS,
2411
- Pr as BASELODE_DATA_MODEL_STRUCTURAL_POINT,
2412
- Or as BASELODE_DATA_MODEL_SURFACE_SAMPLE,
2413
- xr as BASELODE_LIGHT,
2414
- Dr as BASELODE_LIGHT_TEMPLATE,
2415
- Rr as BASELODE_LIGHT_TEMPLATE_NAME,
2616
+ Cr as BASELODE_COLORWAY,
2617
+ Rr as BASELODE_DARK,
2618
+ Fr as BASELODE_DARK_TEMPLATE,
2619
+ zr as BASELODE_DARK_TEMPLATE_NAME,
2620
+ $r as BASELODE_DATA_MODEL_DRILL_ASSAY,
2621
+ kr as BASELODE_DATA_MODEL_DRILL_COLLAR,
2622
+ St as BASELODE_DATA_MODEL_DRILL_GEOLOGY,
2623
+ wr as BASELODE_DATA_MODEL_DRILL_SURVEY,
2624
+ Hr as BASELODE_DATA_MODEL_GEOPHYSICS,
2625
+ Ur as BASELODE_DATA_MODEL_STRUCTURAL_POINT,
2626
+ Br as BASELODE_DATA_MODEL_SURFACE_SAMPLE,
2627
+ Gr as BASELODE_LIGHT,
2628
+ jr as BASELODE_LIGHT_TEMPLATE,
2629
+ Vr as BASELODE_LIGHT_TEMPLATE_NAME,
2416
2630
  ke as BASELODE_TEMPLATE,
2417
- zr as BASELODE_TEMPLATE_NAME,
2418
- yt as BASE_PIXELS_PER_METRE,
2419
- $r as BETA,
2420
- kr as BUILTIN_COLOUR_MAPS,
2421
- mr as Baselode3DControls,
2422
- Fr as Baselode3DScene,
2423
- fr as BlockModelWidget,
2424
- wr as CHART_OPTIONS,
2425
- Hr as COLLAR_ID,
2426
- Gr as COMMENTS,
2427
- Ur as COMMENT_COLUMN_NAMES,
2428
- Br as COMMODITY_COLOURS,
2429
- Vr as CRS,
2430
- En as CorePhotoTable,
2431
- hr as CorePhotoViewer,
2432
- jr as DATASOURCE,
2433
- Yr as DATASOURCE_HOLE_ID,
2434
- Wr as DATASOURCE_SAMPLE_ID,
2435
- qr as DATASOURCE_SURFACE_SAMPLE_ID,
2436
- Xr as DATE_END,
2437
- Kr as DATE_START,
2438
- Zr as DEFAULT_COLUMN_MAP,
2439
- fn as DEFAULT_LOD_BREAKPOINTS,
2440
- j as DEPTH,
2631
+ Yr as BASELODE_TEMPLATE_NAME,
2632
+ _t as BASE_PIXELS_PER_METRE,
2633
+ Wr as BETA,
2634
+ qr as BUILTIN_COLOUR_MAPS,
2635
+ Ar as Baselode3DControls,
2636
+ Xr as Baselode3DScene,
2637
+ Sr as BlockModelWidget,
2638
+ Kr as CHART_OPTIONS,
2639
+ Zr as COLLAR_ID,
2640
+ Jr as COMMENTS,
2641
+ Qr as COMMENT_COLUMN_NAMES,
2642
+ eo as COMMODITY_COLOURS,
2643
+ to as CRS,
2644
+ In as CorePhotoTable,
2645
+ Ir as CorePhotoViewer,
2646
+ no as DATASOURCE,
2647
+ ro as DATASOURCE_HOLE_ID,
2648
+ oo as DATASOURCE_SAMPLE_ID,
2649
+ so as DATASOURCE_SURFACE_SAMPLE_ID,
2650
+ io as DATE_END,
2651
+ ao as DATE_START,
2652
+ lo as DEFAULT_ATTRIBUTE_COLUMN,
2653
+ co as DEFAULT_COLUMN_MAP,
2654
+ gn as DEFAULT_LOD_BREAKPOINTS,
2655
+ uo as DEFAULT_UNIT_COLUMN,
2656
+ V as DEPTH,
2441
2657
  W as DIP,
2442
- Ue as DISPLAY_CATEGORICAL,
2443
- ze as DISPLAY_COMMENT,
2444
- Jr as DISPLAY_HIDDEN,
2445
- At as DISPLAY_NUMERIC,
2446
- tt as DISPLAY_TADPOLE,
2447
- he as EASTING,
2448
- Ae as ELEVATION,
2449
- Qr as ERROR_COLOR,
2450
- eo as EXTRA,
2451
- to as FALLBACK_COLOUR,
2452
- no as FOV_MAX_DEG,
2453
- ro as FOV_MIN_DEG,
2658
+ Ge as DISPLAY_CATEGORICAL,
2659
+ Fe as DISPLAY_COMMENT,
2660
+ fo as DISPLAY_HIDDEN,
2661
+ Tt as DISPLAY_NUMERIC,
2662
+ rt as DISPLAY_TADPOLE,
2663
+ pe as EASTING,
2664
+ Ee as ELEVATION,
2665
+ mo as ERROR_COLOR,
2666
+ ho as EXTRA,
2667
+ po as FALLBACK_COLOUR,
2668
+ bo as FOV_MAX_DEG,
2669
+ go as FOV_MIN_DEG,
2454
2670
  L as FROM,
2455
2671
  le as GEOLOGY_CODE,
2456
2672
  ce as GEOLOGY_DESCRIPTION,
2457
- oo as GEOPHYSICS_NULL,
2458
- et as GEOPHYSICS_NULL_SENTINEL,
2459
- so as HIDDEN_COLUMNS,
2460
- N as HOLE_ID,
2461
- io as HOLE_TYPE,
2673
+ yo as GEOPHYSICS_NULL,
2674
+ nt as GEOPHYSICS_NULL_SENTINEL,
2675
+ _o as HIDDEN_COLUMNS,
2676
+ v as HOLE_ID,
2677
+ No as HOLE_TYPE,
2462
2678
  re as LATITUDE,
2463
- ao as LITHOLOGY_COLOURS,
2679
+ vo as LITHOLOGY_COLOURS,
2464
2680
  oe as LONGITUDE,
2465
- lo as MAX_DEPTH,
2681
+ Eo as MAX_DEPTH,
2466
2682
  ve as MID,
2467
- ge as NORTHING,
2468
- co as NUMERIC_LINE_COLOR,
2469
- uo as NUMERIC_MARKER_COLOR,
2683
+ be as NORTHING,
2684
+ Ao as NUMERIC_LINE_COLOR,
2685
+ So as NUMERIC_MARKER_COLOR,
2470
2686
  de as PROJECT_ID,
2471
- mo as REPORT_NUMBER,
2472
- fo as SAMPLE_ID,
2473
- po as STRIKE,
2474
- ho as STRIP_LOG_DEFAULT_COLOR,
2475
- go as STRIP_LOG_DEFAULT_LATERAL_OFFSET,
2476
- yo as STRIP_LOG_DEFAULT_PANEL_WIDTH,
2477
- bo as SURFACE_SAMPLE_ID,
2478
- _o as SURFACE_SAMPLE_TYPE,
2479
- No as SURVEY_TYPE,
2480
- M as TO,
2481
- sr as TracePlot,
2482
- yr as addGradeBlocksToScene,
2483
- vo as addRasterOverlay,
2484
- Eo as alphaBetaToNormal,
2485
- dr as annotationsFromIntervals,
2486
- qn as assembleDataset,
2487
- wn as attachAssayPositions,
2488
- kn as balancedTangentialDesurvey,
2489
- kt as buildAssayState,
2490
- Ao as buildCategoricalStripLogConfig,
2491
- nn as buildCommentsConfig,
2492
- yn as buildDepthMarkers,
2493
- So as buildEqualRangeColorScale,
2494
- It as buildIntervalPoints,
2495
- St as buildPlotConfig,
2496
- or as buildStrikeDipSymbol,
2497
- To as buildStripLogGroup,
2498
- Io as buildStripLogLinePoints,
2499
- Co as buildStructuralDiscs,
2500
- rr as buildStructuralStripConfig,
2501
- tn as buildTadpoleConfig,
2502
- Fn as buildTraces,
2503
- _n as buildTrayPhotos,
2504
- Lo as buildViewSignature,
2505
- Mo as calculateBlockVolume,
2506
- Po as calculatePropertyStats,
2507
- vt as classifyColumns,
2508
- Oo as clearRasterOverlays,
2509
- xo as clearStripLogs,
2510
- Wn as coerceNumeric,
2511
- Do as computeStructuralPositions,
2512
- Ro as createRasterOverlay,
2513
- zo as defaultChartType,
2514
- bt as defaultTrayFilename,
2515
- pr as depthIntervalToPixels,
2516
- bn as depthMarkerInterval,
2517
- Ie as deriveAssayProps,
2518
- zn as desurveyTraces,
2519
- $o as dipAzimuthToNormal,
2520
- ko as dolly,
2521
- Fo as emitViewChangeIfNeeded,
2522
- wo as filterBlocks,
2523
- Yn as filterByProject,
2524
- Ho as fitCameraToBounds,
2525
- Go as focusOnLastBounds,
2526
- tr as geophysicsToStripLogs,
2527
- Uo as getBlockStats,
2528
- Bo as getCategoryHexColor,
2529
- nt as getChartOptions,
2530
- Vo as getColorForValue,
2531
- jo as getColour,
2532
- Yo as getEqualRangeBinIndex,
2533
- Wo as getEqualRangeColor,
2534
- qo as getHoleVerticalExtent,
2535
- Xo as getRasterOverlay,
2536
- Ko as getViewState,
2537
- An as gradeBlockToThreeGeometry,
2538
- gn as groupPhotosBySet,
2539
- Yt as groupRowsByHole,
2540
- Tt as holeHasData,
2541
- Zo as interpolateTrace,
2542
- ur as intervalsAsTubes,
2543
- jn as joinAssaysToTraces,
2544
- Jo as listRasterOverlays,
2545
- Dn as loadAssayFile,
2546
- $t as loadAssayHole,
2547
- zt as loadAssayMetadata,
2548
- Bn as loadAssays,
2549
- Qo as loadBlockModelMetadata,
2550
- Gn as loadCollars,
2551
- Vn as loadGeology,
2552
- gr as loadGradeBlocksFromJson,
2553
- Un as loadSurveys,
2687
+ To as REPORT_NUMBER,
2688
+ Io as SAMPLE_ID,
2689
+ Lo as STRIKE,
2690
+ Mo as STRIP_LOG_DEFAULT_COLOR,
2691
+ xo as STRIP_LOG_DEFAULT_LATERAL_OFFSET,
2692
+ Oo as STRIP_LOG_DEFAULT_PANEL_WIDTH,
2693
+ Po as SURFACE_SAMPLE_ID,
2694
+ Do as SURFACE_SAMPLE_TYPE,
2695
+ Co as SURVEY_TYPE,
2696
+ P as TO,
2697
+ br as TracePlot,
2698
+ Mr as addGradeBlocksToScene,
2699
+ Ro as addRasterOverlay,
2700
+ Fo as alphaBetaToNormal,
2701
+ Er as annotationsFromIntervals,
2702
+ Jn as assembleDataset,
2703
+ Gn as attachAssayPositions,
2704
+ Un as balancedTangentialDesurvey,
2705
+ Ht as buildAssayState,
2706
+ zo as buildCategoricalStripLogConfig,
2707
+ an as buildCommentsConfig,
2708
+ vn as buildDepthMarkers,
2709
+ $o as buildEqualRangeColorScale,
2710
+ xt as buildIntervalPoints,
2711
+ It as buildPlotConfig,
2712
+ pr as buildStrikeDipSymbol,
2713
+ ko as buildStripLogGroup,
2714
+ wo as buildStripLogLinePoints,
2715
+ Ho as buildStructuralDiscs,
2716
+ hr as buildStructuralStripConfig,
2717
+ sn as buildTadpoleConfig,
2718
+ Bn as buildTraces,
2719
+ An as buildTrayPhotos,
2720
+ Uo as buildViewSignature,
2721
+ Bo as calculateBlockVolume,
2722
+ Go as calculatePropertyStats,
2723
+ At as classifyColumns,
2724
+ jo as clearRasterOverlays,
2725
+ Vo as clearStripLogs,
2726
+ cr as clip,
2727
+ Zn as coerceNumeric,
2728
+ Yo as computeStructuralPositions,
2729
+ Wo as createRasterOverlay,
2730
+ qo as defaultChartType,
2731
+ Nt as defaultTrayFilename,
2732
+ Tr as depthIntervalToPixels,
2733
+ En as depthMarkerInterval,
2734
+ Te as deriveAssayProps,
2735
+ Xo as derivePropertyMeta,
2736
+ wn as desurveyTraces,
2737
+ ir as detectGaps,
2738
+ ar as detectOverlaps,
2739
+ Ko as dipAzimuthToNormal,
2740
+ Zo as dolly,
2741
+ Jo as emitViewChangeIfNeeded,
2742
+ Qo as filterBlocks,
2743
+ Kn as filterByProject,
2744
+ es as fitCameraToBounds,
2745
+ ts as focusOnLastBounds,
2746
+ Lt as formatPropertyLabel,
2747
+ sr as fromToMidpoints,
2748
+ fr as geophysicsToStripLogs,
2749
+ ns as getBlockStats,
2750
+ rs as getCategoryHexColor,
2751
+ ot as getChartOptions,
2752
+ os as getColorForValue,
2753
+ ss as getColour,
2754
+ is as getEqualRangeBinIndex,
2755
+ as as getEqualRangeColor,
2756
+ ls as getHoleVerticalExtent,
2757
+ cs as getRasterOverlay,
2758
+ us as getViewState,
2759
+ Ln as gradeBlockToThreeGeometry,
2760
+ Nn as groupPhotosBySet,
2761
+ Xt as groupRowsByHole,
2762
+ Mt as holeHasData,
2763
+ ds as interpolateTrace,
2764
+ or as intervalLength,
2765
+ vr as intervalsAsTubes,
2766
+ Xn as joinAssaysToTraces,
2767
+ fs as listRasterOverlays,
2768
+ $n as loadAssayFile,
2769
+ wt as loadAssayHole,
2770
+ kt as loadAssayMetadata,
2771
+ Wn as loadAssays,
2772
+ ms as loadBlockModelMetadata,
2773
+ Vn as loadCollars,
2774
+ qn as loadGeology,
2775
+ Lr as loadGradeBlocksFromJson,
2776
+ Yn as loadSurveys,
2554
2777
  Me as loadTable,
2555
- es as logDataInfo,
2556
- ts as logDataWarning,
2557
- ns as lookDown,
2558
- Ht as minimumCurvatureDesurvey,
2559
- rs as normalizeBlockRow,
2560
- os as normalizeBounds,
2561
- On as normalizeCsvRow,
2562
- Se as normalizeFieldName,
2563
- ss as normalizeStripLogOptions,
2564
- is as pan,
2565
- qt as parseAssayCsvTextToHoles,
2566
- xt as parseAssayHole,
2567
- Pn as parseAssayHoleIds,
2568
- Ot as parseAssayHoleIdsWithAssays,
2569
- Dt as parseAssaysCSV,
2570
- as as parseBlockModelCSV,
2571
- Hn as parseDrillholesCSV,
2572
- Xt as parseGeologyCsvText,
2573
- er as parseGeophysicsCSV,
2574
- nr as parseLasFile,
2575
- Wt as parseStructuralCSV,
2576
- Zn as parseStructuralIntervalsCSV,
2577
- Kn as parseStructuralPointsCSV,
2578
- Rn as parseSurveyCSV,
2579
- Jn as parseUnifiedDataset,
2580
- xn as pickFirstPresent,
2581
- ar as planView,
2582
- dn as projectTraceToSection,
2583
- ls as recenterCameraToOrigin,
2584
- cs as removeRasterOverlay,
2585
- st as reorderHoleIds,
2586
- us as resolveColourMap,
2587
- lr as sectionView,
2588
- mn as sectionWindow,
2589
- pn as selectPhotoLodUrl,
2590
- ds as setControlMode,
2591
- ms as setFov,
2592
- fs as setRasterOverlayElevation,
2593
- ps as setRasterOverlayOpacity,
2594
- hs as setRasterOverlayVisibility,
2595
- gs as setStripLogs,
2596
- ys as setViewState,
2597
- Qn as significantIntercepts,
2598
- hn as sortPhotosByDepth,
2778
+ hs as logDataInfo,
2779
+ ps as logDataWarning,
2780
+ bs as lookDown,
2781
+ ur as mergeTables,
2782
+ Gt as minimumCurvatureDesurvey,
2783
+ gs as normalizeBlockRow,
2784
+ ys as normalizeBounds,
2785
+ Fn as normalizeCsvRow,
2786
+ Ae as normalizeFieldName,
2787
+ _s as normalizeStripLogOptions,
2788
+ Ns as pan,
2789
+ Zt as parseAssayCsvTextToHoles,
2790
+ Ft as parseAssayHole,
2791
+ Rn as parseAssayHoleIds,
2792
+ Rt as parseAssayHoleIdsWithAssays,
2793
+ zt as parseAssaysCSV,
2794
+ vs as parseBlockModelCSV,
2795
+ jn as parseDrillholesCSV,
2796
+ Jt as parseGeologyCsvText,
2797
+ dr as parseGeophysicsCSV,
2798
+ mr as parseLasFile,
2799
+ Kt as parseStructuralCSV,
2800
+ tr as parseStructuralIntervalsCSV,
2801
+ er as parseStructuralPointsCSV,
2802
+ kn as parseSurveyCSV,
2803
+ nr as parseUnifiedDataset,
2804
+ zn as pickFirstPresent,
2805
+ yr as planView,
2806
+ pn as projectTraceToSection,
2807
+ Es as recenterCameraToOrigin,
2808
+ As as removeRasterOverlay,
2809
+ at as reorderHoleIds,
2810
+ Ss as resolveColourMap,
2811
+ Ts as resolvePropertyLabelParts,
2812
+ _r as sectionView,
2813
+ bn as sectionWindow,
2814
+ yn as selectPhotoLodUrl,
2815
+ Is as setControlMode,
2816
+ Ls as setFov,
2817
+ Ms as setRasterOverlayElevation,
2818
+ xs as setRasterOverlayOpacity,
2819
+ Os as setRasterOverlayVisibility,
2820
+ Ps as setStripLogs,
2821
+ Ds as setViewState,
2822
+ rr as significantIntercepts,
2823
+ _n as sortPhotosByDepth,
2824
+ lr as splitAt,
2599
2825
  ie as standardizeColumns,
2600
- Mn as standardizeRowArray,
2601
- $n as tangentialDesurvey,
2602
- bs as toError,
2603
- cr as tracesAsSegments,
2604
- ir as useDrillholeTraceGrid,
2605
- Xn as validateStructuralPoints,
2826
+ Cn as standardizeRowArray,
2827
+ Hn as tangentialDesurvey,
2828
+ Cs as toError,
2829
+ Nr as tracesAsSegments,
2830
+ gr as useDrillholeTraceGrid,
2831
+ Qn as validateStructuralPoints,
2606
2832
  G as withDataErrorContext
2607
2833
  };
2608
2834
  //# sourceMappingURL=baselode.js.map