bc-deeplib 1.2.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/deeplib.js CHANGED
@@ -28,7 +28,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  // node_modules/.pnpm/bondage-club-mod-sdk@1.2.0/node_modules/bondage-club-mod-sdk/dist/bcmodsdk.js
29
29
  var require_bcmodsdk = __commonJS({
30
30
  "node_modules/.pnpm/bondage-club-mod-sdk@1.2.0/node_modules/bondage-club-mod-sdk/dist/bcmodsdk.js"(exports) {
31
- var bcModSdk = function() {
31
+ var bcModSdk = (function() {
32
32
  "use strict";
33
33
  const o = "1.2.0";
34
34
  function e(o2) {
@@ -44,7 +44,7 @@ var require_bcmodsdk = __commonJS({
44
44
  __name(n, "n");
45
45
  function r(o2) {
46
46
  const e2 = /* @__PURE__ */ new Set();
47
- return o2.filter((o3) => !e2.has(o3) && e2.add(o3));
47
+ return o2.filter(((o3) => !e2.has(o3) && e2.add(o3)));
48
48
  }
49
49
  __name(r, "r");
50
50
  const i = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Set();
@@ -67,13 +67,13 @@ Patch2:
67
67
  ${a2}`), t2.set(e3, a2), n2.add(r3.name);
68
68
  }
69
69
  }
70
- e2.sort((o3, e3) => e3.priority - o3.priority);
71
- const r2 = function(o3, e3) {
70
+ e2.sort(((o3, e3) => e3.priority - o3.priority));
71
+ const r2 = (function(o3, e3) {
72
72
  if (0 === e3.size) return o3;
73
73
  let t3 = o3.toString().replaceAll("\r\n", "\n");
74
74
  for (const [n3, r3] of e3.entries()) t3.includes(n3) || c(`ModSDK: Patching ${o3.name}: Patch ${n3} not applied`), t3 = t3.replaceAll(n3, r3);
75
75
  return (0, eval)(`(${t3})`);
76
- }(o2.original, t2);
76
+ })(o2.original, t2);
77
77
  let i2 = /* @__PURE__ */ __name(function(e3) {
78
78
  var t3, i3;
79
79
  const a2 = null === (i3 = (t3 = m.errorReporterHooks).hookChainExit) || void 0 === i3 ? void 0 : i3.call(t3, o2.name, n2), c2 = r2.apply(this, e3);
@@ -102,7 +102,7 @@ ${a2}`), t2.set(e3, a2), n2.add(r3.name);
102
102
  for (let t2 = 0; t2 < a2.length - 1; t2++) if (e3 = e3[a2[t2]], !n(e3)) throw new Error(`ModSDK: Function ${o2} to be patched not found; ${a2.slice(0, t2 + 1).join(".")} is not object`);
103
103
  const c2 = e3[a2[a2.length - 1]];
104
104
  if ("function" != typeof c2) throw new Error(`ModSDK: Function ${o2} to be patched not found`);
105
- const l2 = function(o3) {
105
+ const l2 = (function(o3) {
106
106
  let e4 = -1;
107
107
  for (const n2 of t.encode(o3)) {
108
108
  let o4 = 255 & (e4 ^ n2);
@@ -110,13 +110,13 @@ ${a2}`), t2.set(e3, a2), n2.add(r3.name);
110
110
  e4 = e4 >>> 8 ^ o4;
111
111
  }
112
112
  return ((-1 ^ e4) >>> 0).toString(16).padStart(8, "0").toUpperCase();
113
- }(c2.toString().replaceAll("\r\n", "\n")), d2 = { name: o2, original: c2, originalHash: l2 };
113
+ })(c2.toString().replaceAll("\r\n", "\n")), d2 = { name: o2, original: c2, originalHash: l2 };
114
114
  r2 = Object.assign(Object.assign({}, d2), { precomputed: s(d2), router: /* @__PURE__ */ __name(() => {
115
- }, "router"), context: e3, contextProperty: a2[a2.length - 1] }), r2.router = /* @__PURE__ */ function(o3) {
115
+ }, "router"), context: e3, contextProperty: a2[a2.length - 1] }), r2.router = /* @__PURE__ */ (function(o3) {
116
116
  return function(...e4) {
117
117
  return o3.precomputed.enter.apply(this, [e4]);
118
118
  };
119
- }(r2), i.set(o2, r2), e3[r2.contextProperty] = r2.router;
119
+ })(r2), i.set(o2, r2), e3[r2.contextProperty] = r2.router;
120
120
  }
121
121
  return r2;
122
122
  }
@@ -127,7 +127,7 @@ ${a2}`), t2.set(e3, a2), n2.add(r3.name);
127
127
  __name(d, "d");
128
128
  function p() {
129
129
  const o2 = /* @__PURE__ */ new Map();
130
- for (const [e2, t2] of i) o2.set(e2, { name: e2, original: t2.original, originalHash: t2.originalHash, sdkEntrypoint: t2.router, currentEntrypoint: t2.context[t2.contextProperty], hookedByMods: r(t2.precomputed.hooks.map((o3) => o3.mod)), patchedByMods: Array.from(t2.precomputed.patchesSources) });
130
+ for (const [e2, t2] of i) o2.set(e2, { name: e2, original: t2.original, originalHash: t2.originalHash, sdkEntrypoint: t2.router, currentEntrypoint: t2.context[t2.contextProperty], hookedByMods: r(t2.precomputed.hooks.map(((o3) => o3.mod))), patchedByMods: Array.from(t2.precomputed.patchesSources) });
131
131
  return o2;
132
132
  }
133
133
  __name(p, "p");
@@ -152,7 +152,7 @@ Was the mod loaded multiple times?`), u(a2));
152
152
  g2.loaded || e(`Mod ${r2} attempted to call SDK function after being unloaded`);
153
153
  const s3 = t3(...n2);
154
154
  return null == c3 || c3(), s3;
155
- }, "s"), p2 = { unload: s2("unload", () => u(g2)), hookFunction: s2("hookFunction", (o3, t3, n2) => {
155
+ }, "s"), p2 = { unload: s2("unload", (() => u(g2))), hookFunction: s2("hookFunction", ((o3, t3, n2) => {
156
156
  "string" == typeof o3 && o3 || e(`Mod ${r2} failed to patch a function: Expected function name string, got ${typeof o3}`);
157
157
  const i3 = l(o3), a3 = c2(i3);
158
158
  "number" != typeof t3 && e(`Mod ${r2} failed to hook function '${o3}': Expected priority number, got ${typeof t3}`), "function" != typeof n2 && e(`Mod ${r2} failed to hook function '${o3}': Expected hook function, got ${typeof n2}`);
@@ -161,24 +161,24 @@ Was the mod loaded multiple times?`), u(a2));
161
161
  const o4 = a3.hooks.indexOf(s3);
162
162
  o4 >= 0 && (a3.hooks.splice(o4, 1), d());
163
163
  };
164
- }), patchFunction: s2("patchFunction", (o3, t3) => {
164
+ })), patchFunction: s2("patchFunction", ((o3, t3) => {
165
165
  "string" == typeof o3 && o3 || e(`Mod ${r2} failed to patch a function: Expected function name string, got ${typeof o3}`);
166
166
  const i3 = l(o3), a3 = c2(i3);
167
167
  n(t3) || e(`Mod ${r2} failed to patch function '${o3}': Expected patches object, got ${typeof t3}`);
168
168
  for (const [n2, i4] of Object.entries(t3)) "string" == typeof i4 ? a3.patches.set(n2, i4) : null === i4 ? a3.patches.delete(n2) : e(`Mod ${r2} failed to patch function '${o3}': Invalid format of patch '${n2}'`);
169
169
  d();
170
- }), removePatches: s2("removePatches", (o3) => {
170
+ })), removePatches: s2("removePatches", ((o3) => {
171
171
  "string" == typeof o3 && o3 || e(`Mod ${r2} failed to patch a function: Expected function name string, got ${typeof o3}`);
172
172
  const t3 = l(o3);
173
173
  c2(t3).patches.clear(), d();
174
- }), callOriginal: s2("callOriginal", (o3, t3, n2) => {
174
+ })), callOriginal: s2("callOriginal", ((o3, t3, n2) => {
175
175
  "string" == typeof o3 && o3 || e(`Mod ${r2} failed to call a function: Expected function name string, got ${typeof o3}`);
176
176
  const i3 = l(o3);
177
177
  return Array.isArray(t3) || e(`Mod ${r2} failed to call a function: Expected args array, got ${typeof t3}`), i3.original.apply(null != n2 ? n2 : globalThis, t3);
178
- }), getOriginalHash: s2("getOriginalHash", (o3) => {
178
+ })), getOriginalHash: s2("getOriginalHash", ((o3) => {
179
179
  "string" == typeof o3 && o3 || e(`Mod ${r2} failed to get hash: Expected function name string, got ${typeof o3}`);
180
180
  return l(o3).originalHash;
181
- }) }, g2 = { name: o2.name, fullName: o2.fullName, version: o2.version, repository: o2.repository, allowReplace: i2, api: p2, loaded: true, patching: /* @__PURE__ */ new Map() };
181
+ })) }, g2 = { name: o2.name, fullName: o2.fullName, version: o2.version, repository: o2.repository, allowReplace: i2, api: p2, loaded: true, patching: /* @__PURE__ */ new Map() };
182
182
  return f.set(o2.name, g2), Object.freeze(p2);
183
183
  }
184
184
  __name(g, "g");
@@ -189,13 +189,13 @@ Was the mod loaded multiple times?`), u(a2));
189
189
  }
190
190
  __name(h, "h");
191
191
  let m;
192
- const y = void 0 === window.bcModSdk ? window.bcModSdk = function() {
192
+ const y = void 0 === window.bcModSdk ? window.bcModSdk = (function() {
193
193
  const e2 = { version: o, apiVersion: 1, registerMod: g, getModsInfo: h, getPatchingInfo: p, errorReporterHooks: Object.seal({ apiEndpointEnter: null, hookEnter: null, hookChainExit: null }) };
194
194
  return m = e2, Object.freeze(e2);
195
- }() : (n(window.bcModSdk) || e("Failed to init Mod SDK: Name already in use"), 1 !== window.bcModSdk.apiVersion && e(`Failed to init Mod SDK: Different version already loaded ('1.2.0' vs '${window.bcModSdk.version}')`), window.bcModSdk.version !== o && alert(`Mod SDK warning: Loading different but compatible versions ('1.2.0' vs '${window.bcModSdk.version}')
195
+ })() : (n(window.bcModSdk) || e("Failed to init Mod SDK: Name already in use"), 1 !== window.bcModSdk.apiVersion && e(`Failed to init Mod SDK: Different version already loaded ('1.2.0' vs '${window.bcModSdk.version}')`), window.bcModSdk.version !== o && alert(`Mod SDK warning: Loading different but compatible versions ('1.2.0' vs '${window.bcModSdk.version}')
196
196
  One of mods you are using is using an old version of SDK. It will work for now but please inform author to update`), window.bcModSdk);
197
197
  return "undefined" != typeof exports && (Object.defineProperty(exports, "__esModule", { value: true }), exports.default = y), y;
198
- }();
198
+ })();
199
199
  }
200
200
  });
201
201
 
@@ -297,12 +297,13 @@ var BaseModule = class {
297
297
  };
298
298
 
299
299
  // src/base/base_subscreen.ts
300
- function setSubscreen(subscreen) {
300
+ async function setSubscreen(subscreen) {
301
301
  if (!GUI.instance) {
302
302
  throw new Error("Attempt to set subscreen before init");
303
303
  }
304
- GUI.instance.currentSubscreen = subscreen;
305
- return GUI.instance.currentSubscreen;
304
+ const screenName = typeof subscreen === "string" ? subscreen : subscreen?.options.name;
305
+ const screenId = `${BaseSubscreen.id}_${screenName}`;
306
+ await CommonSetScreen(...["DeepLibMod", `${screenId}`]);
306
307
  }
307
308
  __name(setSubscreen, "setSubscreen");
308
309
  var BaseSubscreen = class _BaseSubscreen {
@@ -317,28 +318,39 @@ var BaseSubscreen = class _BaseSubscreen {
317
318
  options;
318
319
  /** Reference to the module this subscreen belongs to. */
319
320
  module;
320
- constructor(subscreenOptions, module) {
321
+ /** Identifier for internal use to avoid screen name collisions. */
322
+ static id = CommonGenerateUniqueID();
323
+ /** Optional configuration flags for a BaseSubscreen instance. */
324
+ static subscreenOptions = {
325
+ drawCharacter: true,
326
+ name: "UNKNOWN",
327
+ icon: "",
328
+ background: "Sheet",
329
+ doShowExitButton: true,
330
+ doShowTitle: true,
331
+ settingsWidth: 1e3
332
+ };
333
+ constructor(module) {
321
334
  if (module) this.module = module;
322
- this.options = subscreenOptions || {};
323
- }
324
- /**
325
- * Logical name of this subscreen.
326
- * Used for localization key resolution in `load()`.
327
- * Subclasses should override this with a meaningful identifier.
328
- */
329
- get name() {
330
- return "UNKNOWN";
331
- }
332
- /**
333
- * Path to or Base64 data for an icon representing this subscreen.
334
- * Defaults to empty string (no icon).
335
- */
336
- get icon() {
337
- return "";
335
+ const ctor = this.constructor;
336
+ this.options = {
337
+ ..._BaseSubscreen.subscreenOptions,
338
+ ...ctor.subscreenOptions
339
+ };
340
+ const screenName = this.options.name;
341
+ const screenId = `${_BaseSubscreen.id}_${screenName}`;
342
+ exportToGlobal(`${screenId}Load`, this.load.bind(this));
343
+ exportToGlobal(`${screenId}Run`, this.run.bind(this));
344
+ exportToGlobal(`${screenId}Click`, this.click.bind(this));
345
+ exportToGlobal(`${screenId}Exit`, this.exit.bind(this));
346
+ exportToGlobal(`${screenId}Unload`, this.unload.bind(this));
347
+ exportToGlobal(`${screenId}Resize`, this.resize.bind(this));
348
+ exportToGlobal(`${screenId}Background`, this.options.background);
349
+ CommonCSVCache[ScreenFileGetTranslation("DeepLibMod", screenId)] = [];
338
350
  }
339
351
  /** Changes the currently active subscreen. */
340
- setSubscreen(screen) {
341
- return setSubscreen(screen);
352
+ async setSubscreen(screen) {
353
+ return await setSubscreen(screen);
342
354
  }
343
355
  /** Gets this subscreen's settings object from its parent module. */
344
356
  get settings() {
@@ -385,15 +397,14 @@ var BaseSubscreen = class _BaseSubscreen {
385
397
  */
386
398
  managePageElementsVisibility() {
387
399
  this.pageStructure.forEach((item, ix) => {
388
- if (ix != _BaseSubscreen.currentPage - 1) {
389
- item.forEach((setting) => {
390
- domUtil.hide(`${setting.id}-container`);
391
- });
392
- } else {
393
- item.forEach((setting) => {
394
- domUtil.unhide(`${setting.id}-container`);
395
- });
396
- }
400
+ item.forEach((setting) => {
401
+ const element = ElementWrap(`${setting.id}-container`) ?? ElementWrap(`${setting.id}`);
402
+ if (ix != _BaseSubscreen.currentPage - 1) {
403
+ if (element) domUtil.hide(element);
404
+ } else {
405
+ if (element) domUtil.unhide(element);
406
+ }
407
+ });
397
408
  });
398
409
  }
399
410
  /**
@@ -413,8 +424,8 @@ var BaseSubscreen = class _BaseSubscreen {
413
424
  if (!module.settings || !Object.keys(module.settings).length) module.registerDefaultSettings();
414
425
  }
415
426
  _BaseSubscreen.currentPage = 1;
416
- layout.createSubscreen();
417
- const settingsElement = layout.createSettingsDiv();
427
+ layout.getSubscreen();
428
+ const settingsElement = layout.getSettingsDiv();
418
429
  layout.appendToSubscreen(settingsElement);
419
430
  const menu = ElementMenu.Create("deeplib-nav-menu", []);
420
431
  layout.appendToSubscreen(menu);
@@ -429,12 +440,38 @@ var BaseSubscreen = class _BaseSubscreen {
429
440
  });
430
441
  ElementMenu.PrependItem(menu, backNext);
431
442
  }
432
- const subscreenTitle = advElement.createLabel({
433
- id: "deeplib-subscreen-title",
434
- label: getText(`${this.name}.title`).replace("$ModVersion", ModSdkManager.ModInfo.version)
435
- });
436
- layout.appendToSubscreen(subscreenTitle);
437
- if (this.name !== "mainmenu") {
443
+ if (this.options.help) {
444
+ const onClick = this.options.help.onClick;
445
+ let action = /* @__PURE__ */ __name(() => {
446
+ }, "action");
447
+ if (typeof onClick === "string" || onClick instanceof URL) {
448
+ action = /* @__PURE__ */ __name(() => window.open(onClick, "_blank"), "action");
449
+ } else if (typeof onClick === "function") {
450
+ action = onClick;
451
+ } else if (onClick instanceof _BaseSubscreen) {
452
+ action = /* @__PURE__ */ __name(async () => await this.setSubscreen(onClick), "action");
453
+ }
454
+ this.options.help.tooltip ??= getText("settings.button.help_button_hint");
455
+ this.options.help.icon ??= `${PUBLIC_URL}/dl_images/bookmark.svg`;
456
+ const helpButton = advElement.createButton({
457
+ id: "deeplib-help",
458
+ size: [90, 90],
459
+ onClick: action,
460
+ options: {
461
+ image: this.options.help.icon,
462
+ tooltip: this.options.help.tooltip
463
+ }
464
+ });
465
+ ElementMenu.AppendButton(menu, helpButton);
466
+ }
467
+ if (this.options.doShowTitle) {
468
+ const subscreenTitle = advElement.createLabel({
469
+ id: "deeplib-subscreen-title",
470
+ label: getText(`${this.options.name}.title`).replace("$ModVersion", ModSdkManager.ModInfo.version)
471
+ });
472
+ layout.appendToSubscreen(subscreenTitle);
473
+ }
474
+ if (this.options.doShowExitButton) {
438
475
  const exitButton = advElement.createButton({
439
476
  id: "deeplib-exit",
440
477
  size: [90, 90],
@@ -471,6 +508,9 @@ var BaseSubscreen = class _BaseSubscreen {
471
508
  case "custom":
472
509
  element = advElement.createCustom(item);
473
510
  break;
511
+ case "dropdown":
512
+ element = advElement.createDropdown(item);
513
+ break;
474
514
  }
475
515
  layout.appendToSettingsDiv(element);
476
516
  })
@@ -499,27 +539,30 @@ var BaseSubscreen = class _BaseSubscreen {
499
539
  exit() {
500
540
  CharacterAppearanceForceUpCharacter = -1;
501
541
  CharacterLoadCanvas(Player);
502
- setSubscreen("mainmenu");
503
- modStorage.save();
542
+ const returnScreen = typeof this.options.returnScreen === "function" ? this.options.returnScreen() : this.options.returnScreen;
543
+ if (returnScreen instanceof _BaseSubscreen || !returnScreen) {
544
+ setSubscreen(returnScreen ?? "mainmenu").then(() => {
545
+ modStorage.save();
546
+ });
547
+ } else if (Array.isArray(returnScreen)) {
548
+ CommonSetScreen(...returnScreen).then(() => {
549
+ modStorage.save();
550
+ });
551
+ }
504
552
  }
505
553
  /**
506
554
  * Called when the window is resized.
507
555
  * Also checks for overflow in the settings div and applies styling accordingly.
508
556
  */
509
- resize(onLoad = false) {
557
+ resize(_onLoad = false) {
510
558
  const offset = this.options.drawCharacter ? 0 : 380;
511
559
  const subscreen = layout.getSubscreen();
512
560
  const settingsDiv = layout.getSettingsDiv();
513
- ElementSetPosition(subscreen || "", 0, 0);
514
- ElementSetSize(subscreen || "", 2e3, 1e3);
515
- ElementSetFontSize(subscreen || "", "auto");
516
- if (this.name === "mainmenu") {
517
- ElementSetPosition(settingsDiv || "", 530 - offset, 170);
518
- ElementSetSize(settingsDiv || "", 600 + offset, 660);
519
- } else {
520
- ElementSetPosition(settingsDiv || "", 530 - offset, 170);
521
- ElementSetSize(settingsDiv || "", 1e3 + offset, 660);
522
- }
561
+ ElementSetPosition(subscreen, 0, 0);
562
+ ElementSetSize(subscreen, 2e3, 1e3);
563
+ ElementSetFontSize(subscreen, "auto");
564
+ ElementSetPosition(settingsDiv, 530 - offset, 170);
565
+ ElementSetSize(settingsDiv, this.options.settingsWidth ?? 1e3 + offset, 660);
523
566
  ElementSetPosition("deeplib-subscreen-title", 530 - offset, 75);
524
567
  ElementSetSize("deeplib-subscreen-title", 800, 60);
525
568
  ElementSetPosition("deeplib-nav-menu", 1905, 75, "top-right");
@@ -645,7 +688,6 @@ var styles_default = `.deeplib-subscreen,
645
688
  grid-auto-rows: min-content;
646
689
  padding: min(1dvh, 0.5dvw);
647
690
  gap: 0.3em;
648
- overflow-y: scroll;
649
691
  }
650
692
 
651
693
  .deeplib-misc {
@@ -665,6 +707,7 @@ var styles_default = `.deeplib-subscreen,
665
707
  padding: min(1vh, 0.5vw);
666
708
  font-size: 0.8em;
667
709
  border: min(0.2vh, 0.1vw) solid var(--deeplib-border-color);
710
+ z-index: 1;
668
711
  }
669
712
 
670
713
  .deeplib-overflow-box {
@@ -682,14 +725,14 @@ var styles_default = `.deeplib-subscreen,
682
725
  border-radius: min(1dvh, 0.5dvw);
683
726
  border: min(0.2vh, 0.1vw) solid var(--deeplib-border-color);
684
727
  }
685
- .deeplib-prev-next .deeplib-prev-next-button {
686
- height: 100%;
687
- aspect-ratio: 1;
688
- }
689
728
  .deeplib-prev-next .deeplib-prev-next-button:hover {
690
729
  background-color: var(--deeplib-element-hover-color);
691
730
  border-radius: var(--deeplib-border-radius);
692
731
  }
732
+ .deeplib-prev-next .deeplib-prev-next-button {
733
+ height: 100%;
734
+ aspect-ratio: 1;
735
+ }
693
736
  .deeplib-prev-next .deeplib-prev-next-label {
694
737
  white-space: nowrap;
695
738
  }
@@ -729,6 +772,9 @@ var styles_default = `.deeplib-subscreen,
729
772
  .deeplib-checkbox-container input.deeplib-input {
730
773
  width: min(5vh, 2.5vw);
731
774
  height: min(5vh, 2.5vw);
775
+ width: min(5dvh, 2.5dvw);
776
+ height: min(5dvh, 2.5dvw);
777
+ border-radius: min(1vh, 0.5vw);
732
778
  border-radius: min(1dvh, 0.5dvw);
733
779
  }
734
780
 
@@ -746,16 +792,18 @@ var styles_default = `.deeplib-subscreen,
746
792
 
747
793
  .deeplib-input-container:has(label.deeplib-text) {
748
794
  margin-top: min(1vh, 0.5vw);
795
+ margin-top: min(1dvh, 0.5dvw);
749
796
  }
750
797
 
751
798
  .deeplib-input-container input.deeplib-input {
752
799
  font-size: 0.6em;
753
- padding: 5px 0;
800
+ padding: min(1vh, 0.5vw);
801
+ padding: min(1dvh, 0.5dvw);
754
802
  background-color: transparent;
755
803
  outline: none;
756
- padding-left: min(1vh, 0.5vw);
757
- padding-right: min(1vh, 0.5vw);
804
+ min-height: min(5vh, 2.5vw);
758
805
  min-height: min(5dvh, 2.5dvw);
806
+ border-radius: min(1vh, 0.5vw);
759
807
  border-radius: min(1dvh, 0.5dvw);
760
808
  }
761
809
 
@@ -763,6 +811,8 @@ var styles_default = `.deeplib-subscreen,
763
811
  padding: 0px;
764
812
  width: min(5vh, 2.5vw);
765
813
  height: min(5vh, 2.5vw);
814
+ width: min(5dvh, 2.5dvw);
815
+ height: min(5dvh, 2.5dvw);
766
816
  border-radius: 0px;
767
817
  }
768
818
 
@@ -771,15 +821,19 @@ var styles_default = `.deeplib-subscreen,
771
821
  cursor: not-allowed;
772
822
  }
773
823
 
774
- input::-webkit-outer-spin-button,
775
- input::-webkit-inner-spin-button {
776
- -webkit-appearance: none;
777
- margin: 0;
824
+ .deeplib-dropdown-container {
825
+ display: flex;
826
+ flex-direction: row;
827
+ align-items: center;
828
+ gap: min(2vh, 1vw);
829
+ gap: min(2dvh, 1dvw);
830
+ color: var(--deeplib-text-color);
778
831
  }
779
-
780
- input[type=number] {
781
- appearance: textfield;
782
- -moz-appearance: textfield;
832
+ .deeplib-dropdown-container select {
833
+ padding: 0 min(1vh, 0.5vw);
834
+ padding: 0 min(1dvh, 0.5dvw);
835
+ border-radius: min(1vh, 0.5vw);
836
+ border-radius: min(1dvh, 0.5dvw);
783
837
  }
784
838
 
785
839
  .deeplib-highlight-text {
@@ -874,7 +928,7 @@ input[type=number] {
874
928
  height: 100dvh;
875
929
  background-color: rgba(0, 0, 0, 0.5);
876
930
  }
877
- /*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL21lZGlhL05WTUUvU3R1ZmYvQ29kZS9CQy9CQy1EZWVwTGliL3NyYy9zdHlsZXMiLCJzb3VyY2VzIjpbInZhcnMuc2NzcyIsImJ1dHRvbnMuc2NzcyIsImVsZW1lbnRzLnNjc3MiLCJpbnB1dHMuc2NzcyIsIm1lc3NhZ2VzLnNjc3MiLCJtb2RhbC5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FDZEY7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0FBQUE7RUFFRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBRUE7RUFDQTtFQUNBOzs7QUFHRjtFQUNFOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FDM0NGO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBTUU7RUFDQTs7QUFOQTtFQUNFO0VBQ0E7O0FBT0o7RUFDRTs7O0FBSUo7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUN6R0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0FBQUE7RUFFRTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQzdERjtFQUNFO0VBQ0E7OztBQUdGO0FBQUE7RUFFRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtBQUFBO0VBRUU7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUM3QkY7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFOztBQUtOO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUlKO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyIuZGVlcGxpYi1zdWJzY3JlZW4sXG4uZGVlcGxpYi1tb2RhbCB7XG4gIC0tZGVlcGxpYi1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10bWQtbWFpbiwgd2hpdGUpO1xuICAtLWRlZXBsaWItZWxlbWVudC1jb2xvcjogdmFyKC0tdG1kLWVsZW1lbnQsIHdoaXRlKTtcbiAgLS1kZWVwbGliLWVsZW1lbnQtaG92ZXItY29sb3I6IHZhcigtLXRtZC1lbGVtZW50LWhvdmVyLCBjeWFuKTtcbiAgLS1kZWVwbGliLWFjY2VudC1jb2xvcjogdmFyKC0tdG1kLWFjY2VudCwgI0ZGRkY4OCk7XG4gIC0tZGVlcGxpYi1ibG9ja2VkLWNvbG9yOiB2YXIoLS10bWQtYmxvY2tlZCwgcmVkKTtcbiAgLS1kZWVwbGliLXRleHQtY29sb3I6IHZhcigtLXRtZC10ZXh0LCBibGFjayk7XG4gIC0tZGVlcGxpYi1pY29uLWNvbG9yOiB2YXIoLS10bWQtYWNjZW50LCBibGFjayk7XG4gIC0tZGVlcGxpYi1pY29uLWhvdmVyLWNvbG9yOiB2YXIoLS10bWQtYWNjZW50LWhvdmVyLCBibGFjayk7XG4gIC0tZGVlcGxpYi1ib3JkZXItY29sb3I6IHZhcigtLXRtZC1hY2NlbnQsIGJsYWNrKTtcbiAgLS1kZWVwbGliLWJvcmRlci13aWR0aDogbWluKDAuMnZoLCAwLjF2dyk7XG4gIC0tZGVlcGxpYi1ib3JkZXItd2lkdGg6IG1pbigwLjJkdmgsIDAuMWR2dyk7XG4gIC0tZGVlcGxpYi1ib3JkZXItcmFkaXVzOiBtaW4oMXZoLCAwLjV2dyk7XG4gIC0tZGVlcGxpYi1ib3JkZXItcmFkaXVzOiBtaW4oMWR2aCwgMC41ZHZ3KTtcbn1cbiIsIi5kZWVwbGliLWJ1dHRvbiB7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG4uZGVlcGxpYi1idXR0b24uYnV0dG9uLXN0eWxpbmcsXG4uZGVlcGxpYi1idXR0b24uYnV0dG9uLXN0eWxpbmc6OmJlZm9yZSB7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG59XG5cbi5kZWVwbGliLWJ1dHRvbiBpbWcge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMCU7XG4gIGxlZnQ6IDAlO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kZWVwbGliLWljb24tY29sb3IpO1xuICBiYWNrZ3JvdW5kLWJsZW5kLW1vZGU6IG11bHRpcGx5O1xuICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XG4gIG1hc2stcG9zaXRpb246IGxlZnQ7XG4gIG1hc2stc2l6ZTogY29udGFpbjtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgY29sb3I6IHRyYW5zcGFyZW50O1xuXG4gIGJhY2tncm91bmQtaW1hZ2U6IHZhcigtLWltYWdlKTtcbiAgbWFzay1pbWFnZTogdmFyKC0taW1hZ2UpO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmRlZXBsaWItYnV0dG9uOmhvdmVyIGltZyB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRlZXBsaWItaWNvbi1ob3Zlci1jb2xvcik7XG59XG5cbi5kZWVwbGliLWJ1dHRvbiAuYnV0dG9uLWxhYmVsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG4gIGZvbnQtc2l6ZTogbWluKDMuNmR2aCwgMS44ZHZ3KTtcbn1cblxuLmRlZXBsaWItYnV0dG9uIC5idXR0b24tdG9vbHRpcCB7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG59XG4iLCIjZGVlcGxpYi1wYWdlLWxhYmVsIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbiNkZWVwbGliLXN1YnNjcmVlbi10aXRsZSB7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xufVxuXG4uZGVlcGxpYi10ZXh0IHtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG59XG5cbi5kZWVwbGliLXN1YnNjcmVlbiB7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogMDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5kZWVwbGliLXN1YnNjcmVlbiAqIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgcG9pbnRlci1ldmVudHM6IGFsbDtcbn1cblxuLmRlZXBsaWItc2V0dGluZ3Mge1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLWF1dG8tcm93czogbWluLWNvbnRlbnQ7XG4gIHBhZGRpbmc6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG4gIGdhcDogMC4zZW07XG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcbn1cblxuLmRlZXBsaWItbWlzYyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgZ2FwOiBtaW4oMXZoLCAwLjV2dyk7XG59XG5cbi5kZWVwbGliLXRvb2x0aXAge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kZWVwbGliLWVsZW1lbnQtY29sb3IpO1xuICBjb2xvcjogdmFyKC0tZGVlcGxpYi10ZXh0LWNvbG9yKTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG4gIHBhZGRpbmc6IG1pbigxdmgsIDAuNXZ3KTtcbiAgZm9udC1zaXplOiAwLjhlbTtcbiAgYm9yZGVyOiBtaW4oMC4ydmgsIDAuMXZ3KSBzb2xpZCB2YXIoLS1kZWVwbGliLWJvcmRlci1jb2xvcik7XG59XG5cbi5kZWVwbGliLW92ZXJmbG93LWJveCB7XG4gIGJvcmRlcjogdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpIHNvbGlkIHZhcigtLWRlZXBsaWItYm9yZGVyLXdpZHRoKTtcbn1cblxuLmRlZXBsaWItcHJldi1uZXh0IHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBnYXA6IG1pbigyZHZoLCAxZHZ3KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWNvbG9yKTtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG4gIGJvcmRlcjogbWluKDAuMnZoLCAwLjF2dykgc29saWQgdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpO1xuXG4gIC5kZWVwbGliLXByZXYtbmV4dC1idXR0b24ge1xuICAgICY6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWhvdmVyLWNvbG9yKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWRlZXBsaWItYm9yZGVyLXJhZGl1cyk7XG4gICAgfVxuICAgIFxuICAgIGhlaWdodDogMTAwJTtcbiAgICBhc3BlY3QtcmF0aW86IDE7XG4gIH1cblxuICAuZGVlcGxpYi1wcmV2LW5leHQtbGFiZWwge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIH1cbn1cblxuI2RlZXBsaWItbmF2LW1lbnUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBnYXA6IG1pbigyZHZoLCAxZHZ3KTtcbn1cblxuI2RlZXBsaWItc3RvcmFnZS1tZXRlciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwcHg7XG4gIGxlZnQ6IDBweDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWNvbG9yKTtcbiAgYm9yZGVyOiB2YXIoLS1kZWVwbGliLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1kZWVwbGliLWJvcmRlci1yYWRpdXMpO1xuICB6LWluZGV4OiAtMTtcbn1cblxuI2RlZXBsaWItc3RvcmFnZS1iYXIge1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAwJTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZGVlcGxpYi1hY2NlbnQtY29sb3IpO1xufVxuIiwiLmRlZXBsaWItY2hlY2tib3gtY29udGFpbmVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAwLjNlbTtcbn1cblxuLmRlZXBsaWItY2hlY2tib3gtY29udGFpbmVyIGlucHV0LmRlZXBsaWItaW5wdXQge1xuICB3aWR0aDogbWluKDV2aCwgMi41dncpO1xuICBoZWlnaHQ6IG1pbig1dmgsIDIuNXZ3KTtcbiAgYm9yZGVyLXJhZGl1czogbWluKDEuMGR2aCwgMC41ZHZ3KTtcbn1cblxuLmRlZXBsaWItY2hlY2tib3gtY29udGFpbmVyIGlucHV0LmRlZXBsaWItaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmNoZWNrZWQ6OmJlZm9yZSB7XG4gIHdpZHRoOiA4MCU7XG4gIGhlaWdodDogODAlO1xufVxuXG4uZGVlcGxpYi1pbnB1dC1jb250YWluZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDAuM2VtO1xufVxuXG4uZGVlcGxpYi1pbnB1dC1jb250YWluZXI6aGFzKGxhYmVsLmRlZXBsaWItdGV4dCkge1xuICBtYXJnaW4tdG9wOiBtaW4oMXZoLCAwLjV2dyk7XG59XG5cbi5kZWVwbGliLWlucHV0LWNvbnRhaW5lciBpbnB1dC5kZWVwbGliLWlucHV0IHtcbiAgZm9udC1zaXplOiAwLjZlbTtcbiAgcGFkZGluZzogNXB4IDA7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBvdXRsaW5lOiBub25lO1xuICBwYWRkaW5nLWxlZnQ6IG1pbigxdmgsIDAuNXZ3KTtcbiAgcGFkZGluZy1yaWdodDogbWluKDF2aCwgMC41dncpO1xuICBtaW4taGVpZ2h0OiBtaW4oNWR2aCwgMi41ZHZ3KTtcbiAgYm9yZGVyLXJhZGl1czogbWluKDEuMGR2aCwgMC41ZHZ3KTtcbn1cblxuXG4uZGVlcGxpYi1pbnB1dC1jb250YWluZXIgaW5wdXQuZGVlcGxpYi1pbnB1dFt0eXBlPVwiY29sb3JcIl0ge1xuICBwYWRkaW5nOiAwcHg7XG4gIHdpZHRoOiBtaW4oNXZoLCAyLjV2dyk7XG4gIGhlaWdodDogbWluKDV2aCwgMi41dncpO1xuICBib3JkZXItcmFkaXVzOiAwcHg7XG59XG5cbi5kZWVwbGliLWlucHV0LWNvbnRhaW5lciBpbnB1dC5kZWVwbGliLWlucHV0W3R5cGU9XCJjb2xvclwiXTpkaXNhYmxlZCB7XG4gIGJvcmRlcjogdmFyKC0tZGVlcGxpYi1ibG9ja2VkLWNvbG9yKSBzb2xpZCB2YXIoLS1kZWVwbGliLWJvcmRlci13aWR0aCk7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XG5cbmlucHV0Ojotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLFxuaW5wdXQ6Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gIG1hcmdpbjogMDtcbn1cblxuaW5wdXRbdHlwZT1udW1iZXJdIHtcbiAgYXBwZWFyYW5jZTogdGV4dGZpZWxkO1xuICAtbW96LWFwcGVhcmFuY2U6IHRleHRmaWVsZDtcbn1cbiIsIi5kZWVwbGliLWhpZ2hsaWdodC10ZXh0IHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiByZ2IoMjAzLCAxODUsIDIzKTtcbn1cblxuI1RleHRBcmVhQ2hhdExvZ1tkYXRhLWNvbG9ydGhlbWU9J2RhcmsnXSBkaXYuQ2hhdE1lc3NhZ2UuZGVlcGxpYi1tZXNzYWdlLFxuI1RleHRBcmVhQ2hhdExvZ1tkYXRhLWNvbG9ydGhlbWU9J2RhcmsyJ10gZGl2LkNoYXRNZXNzYWdlLmRlZXBsaWItbWVzc2FnZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRlZXBsaWItZWxlbWVudC1jb2xvcik7XG4gIGJvcmRlcjogbWluKDAuMmR2aCwgMC4xZHZ3KSBzb2xpZCB2YXIoLS1kZWVwbGliLWJvcmRlci1jb2xvcik7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xufVxuXG4jVGV4dEFyZWFDaGF0TG9nIGRpdi5DaGF0TWVzc2FnZS5kZWVwbGliLW1lc3NhZ2Uge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO1xuICBib3JkZXI6IG1pbigwLjJkdmgsIDAuMWR2dykgc29saWQgIzQ0MDE3MTtcbiAgY29sb3I6ICMxMTE7XG4gIHBhZGRpbmctbGVmdDogbWluKDAuNmR2aCwgMC4zZHZ3KTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdoaXRlLXNwYWNlOiBub3JtYWw7XG59XG5cbiNUZXh0QXJlYUNoYXRMb2dbZGF0YS1jb2xvcnRoZW1lPSdkYXJrJ10gZGl2LkNoYXRNZXNzYWdlLmRlZXBsaWItbWVzc2FnZSBhLFxuI1RleHRBcmVhQ2hhdExvZ1tkYXRhLWNvbG9ydGhlbWU9J2RhcmsyJ10gZGl2LkNoYXRNZXNzYWdlLmRlZXBsaWItbWVzc2FnZSBhIHtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG59XG5cbiNUZXh0QXJlYUNoYXRMb2cgZGl2LkNoYXRNZXNzYWdlLmRlZXBsaWItbWVzc2FnZSBhIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgY29sb3I6ICMxMTE7XG59XG4iLCIuZGVlcGxpYi1tb2RhbCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAxMCU7XG4gIGxlZnQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICB6LWluZGV4OiAxMDAxO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAwLjVlbTtcbiAgd2lkdGg6IG1heCg1MGR2dywgMjVkdmgpO1xuICBmb250LXNpemU6IG1pbig0ZHZoLCAyZHZ3KTtcbiAgcGFkZGluZzogbWluKDJkdmgsIDFkdncpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kZWVwbGliLWVsZW1lbnQtY29sb3IpO1xuICBib3JkZXItcmFkaXVzOiBtaW4oMS4yZHZoLCAwLjZkdncpO1xuICBib3JkZXI6IG1pbigwLjJkdmgsIDAuMWR2dykgc29saWQgdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpO1xuICBjb2xvcjogdmFyKC0tZGVlcGxpYi10ZXh0LWNvbG9yKTtcblxuICAuZGVlcGxpYi1tb2RhbC1pbnB1dCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgZm9udC1zaXplOiBtaW4oMi42ZHZoLCAxLjhkdncpO1xuICAgIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG4gICAgcGFkZGluZzogbWluKDFkdmgsIDAuNWR2dyk7XG4gIH1cblxuICBpbnB1dC5kZWVwbGliLW1vZGFsLWlucHV0IHtcbiAgICBtYXgtd2lkdGg6IG1heCg1MGR2aCwgMjVkdncpO1xuICB9XG5cbiAgLmRlZXBsaWItbW9kYWwtYnV0dG9uLWNvbnRhaW5lciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgZ2FwOiAwLjVlbTtcbiAgICB3aWR0aDogMTAwJTtcblxuICAgIC5kZWVwbGliLWJ1dHRvbiB7XG4gICAgICBmb250LXNpemU6IDAuOGVtO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHdpZHRoOiBhdXRvO1xuICAgICAgcGFkZGluZzogbWluKDAuNHZoLCAwLjJ2dykgbWluKDJ2aCwgMXZ3KTtcblxuICAgICAgLmJ1dHRvbi1sYWJlbCB7XG4gICAgICAgIGRpc3BsYXk6IGNvbnRlbnRzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5kZWVwbGliLW1vZGFsLXByb21wdC1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB9XG59XG5cbi5kZWVwbGliLW1vZGFsLWJsb2NrZXIge1xuICB6LWluZGV4OiAxMDAwO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMGR2dztcbiAgaGVpZ2h0OiAxMDBkdmg7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTtcbn1cbiJdfQ== */`;
931
+ /*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL21lZGlhL05WTUUvU3R1ZmYvQ29kZS9iYy9CQy1EZWVwTGliL3NyYy9zdHlsZXMiLCJzb3VyY2VzIjpbInZhcnMuc2NzcyIsImJ1dHRvbnMuc2NzcyIsImVsZW1lbnRzLnNjc3MiLCJpbnB1dHMuc2NzcyIsIm1lc3NhZ2VzLnNjc3MiLCJtb2RhbC5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FDZEY7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0FBQUE7RUFFRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBRUE7RUFDQTtFQUNBOzs7QUFHRjtFQUNFOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FDM0NGO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUdFO0VBQ0U7RUFDQTs7QUFISjtFQU1FO0VBQ0E7O0FBR0Y7RUFDRTs7O0FBSUo7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUN6R0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FDdkVKO0VBQ0U7RUFDQTs7O0FBR0Y7QUFBQTtFQUVFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0FBQUE7RUFFRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7OztBQzdCRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7QUFHRjtFQUNFOztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7O0FBS047RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUo7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSIsInNvdXJjZXNDb250ZW50IjpbIi5kZWVwbGliLXN1YnNjcmVlbixcbi5kZWVwbGliLW1vZGFsIHtcbiAgLS1kZWVwbGliLWJhY2tncm91bmQtY29sb3I6IHZhcigtLXRtZC1tYWluLCB3aGl0ZSk7XG4gIC0tZGVlcGxpYi1lbGVtZW50LWNvbG9yOiB2YXIoLS10bWQtZWxlbWVudCwgd2hpdGUpO1xuICAtLWRlZXBsaWItZWxlbWVudC1ob3Zlci1jb2xvcjogdmFyKC0tdG1kLWVsZW1lbnQtaG92ZXIsIGN5YW4pO1xuICAtLWRlZXBsaWItYWNjZW50LWNvbG9yOiB2YXIoLS10bWQtYWNjZW50LCAjRkZGRjg4KTtcbiAgLS1kZWVwbGliLWJsb2NrZWQtY29sb3I6IHZhcigtLXRtZC1ibG9ja2VkLCByZWQpO1xuICAtLWRlZXBsaWItdGV4dC1jb2xvcjogdmFyKC0tdG1kLXRleHQsIGJsYWNrKTtcbiAgLS1kZWVwbGliLWljb24tY29sb3I6IHZhcigtLXRtZC1hY2NlbnQsIGJsYWNrKTtcbiAgLS1kZWVwbGliLWljb24taG92ZXItY29sb3I6IHZhcigtLXRtZC1hY2NlbnQtaG92ZXIsIGJsYWNrKTtcbiAgLS1kZWVwbGliLWJvcmRlci1jb2xvcjogdmFyKC0tdG1kLWFjY2VudCwgYmxhY2spO1xuICAtLWRlZXBsaWItYm9yZGVyLXdpZHRoOiBtaW4oMC4ydmgsIDAuMXZ3KTtcbiAgLS1kZWVwbGliLWJvcmRlci13aWR0aDogbWluKDAuMmR2aCwgMC4xZHZ3KTtcbiAgLS1kZWVwbGliLWJvcmRlci1yYWRpdXM6IG1pbigxdmgsIDAuNXZ3KTtcbiAgLS1kZWVwbGliLWJvcmRlci1yYWRpdXM6IG1pbigxZHZoLCAwLjVkdncpO1xufVxuIiwiLmRlZXBsaWItYnV0dG9uIHtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG59XG5cbi5kZWVwbGliLWJ1dHRvbi5idXR0b24tc3R5bGluZyxcbi5kZWVwbGliLWJ1dHRvbi5idXR0b24tc3R5bGluZzo6YmVmb3JlIHtcbiAgYm9yZGVyLXJhZGl1czogbWluKDEuMGR2aCwgMC41ZHZ3KTtcbn1cblxuLmRlZXBsaWItYnV0dG9uIGltZyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwJTtcbiAgbGVmdDogMCU7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IGxlZnQ7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRlZXBsaWItaWNvbi1jb2xvcik7XG4gIGJhY2tncm91bmQtYmxlbmQtbW9kZTogbXVsdGlwbHk7XG4gIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcbiAgbWFzay1wb3NpdGlvbjogbGVmdDtcbiAgbWFzay1zaXplOiBjb250YWluO1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICBtYXNrLXJlcGVhdDogbm8tcmVwZWF0O1xuICBjb2xvcjogdHJhbnNwYXJlbnQ7XG5cbiAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0taW1hZ2UpO1xuICBtYXNrLWltYWdlOiB2YXIoLS1pbWFnZSk7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4uZGVlcGxpYi1idXR0b246aG92ZXIgaW1nIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1pY29uLWhvdmVyLWNvbG9yKTtcbn1cblxuLmRlZXBsaWItYnV0dG9uIC5idXR0b24tbGFiZWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50O1xuICBjb2xvcjogdmFyKC0tZGVlcGxpYi10ZXh0LWNvbG9yKTtcbiAgZm9udC1zaXplOiBtaW4oMy42ZHZoLCAxLjhkdncpO1xufVxuXG4uZGVlcGxpYi1idXR0b24gLmJ1dHRvbi10b29sdGlwIHtcbiAgYm9yZGVyLXJhZGl1czogbWluKDEuMGR2aCwgMC41ZHZ3KTtcbn1cbiIsIiNkZWVwbGliLXBhZ2UtbGFiZWwge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cblxuI2RlZXBsaWItc3Vic2NyZWVuLXRpdGxlIHtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG59XG5cbi5kZWVwbGliLXRleHQge1xuICBjb2xvcjogdmFyKC0tZGVlcGxpYi10ZXh0LWNvbG9yKTtcbn1cblxuLmRlZXBsaWItc3Vic2NyZWVuIHtcbiAgcGFkZGluZzogMDtcbiAgbWFyZ2luOiAwO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmRlZXBsaWItc3Vic2NyZWVuICoge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBwb2ludGVyLWV2ZW50czogYWxsO1xufVxuXG4uZGVlcGxpYi1zZXR0aW5ncyB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtYXV0by1yb3dzOiBtaW4tY29udGVudDtcbiAgcGFkZGluZzogbWluKDEuMGR2aCwgMC41ZHZ3KTtcbiAgZ2FwOiAwLjNlbTtcbn1cblxuLmRlZXBsaWItbWlzYyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgZ2FwOiBtaW4oMXZoLCAwLjV2dyk7XG59XG5cbi5kZWVwbGliLXRvb2x0aXAge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kZWVwbGliLWVsZW1lbnQtY29sb3IpO1xuICBjb2xvcjogdmFyKC0tZGVlcGxpYi10ZXh0LWNvbG9yKTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG4gIHBhZGRpbmc6IG1pbigxdmgsIDAuNXZ3KTtcbiAgZm9udC1zaXplOiAwLjhlbTtcbiAgYm9yZGVyOiBtaW4oMC4ydmgsIDAuMXZ3KSBzb2xpZCB2YXIoLS1kZWVwbGliLWJvcmRlci1jb2xvcik7XG4gIHotaW5kZXg6IDE7XG59XG5cbi5kZWVwbGliLW92ZXJmbG93LWJveCB7XG4gIGJvcmRlcjogdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpIHNvbGlkIHZhcigtLWRlZXBsaWItYm9yZGVyLXdpZHRoKTtcbn1cblxuLmRlZXBsaWItcHJldi1uZXh0IHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBnYXA6IG1pbigyZHZoLCAxZHZ3KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWNvbG9yKTtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG4gIGJvcmRlcjogbWluKDAuMnZoLCAwLjF2dykgc29saWQgdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpO1xuXG4gIC5kZWVwbGliLXByZXYtbmV4dC1idXR0b24ge1xuICAgICY6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWhvdmVyLWNvbG9yKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWRlZXBsaWItYm9yZGVyLXJhZGl1cyk7XG4gICAgfVxuICAgIFxuICAgIGhlaWdodDogMTAwJTtcbiAgICBhc3BlY3QtcmF0aW86IDE7XG4gIH1cblxuICAuZGVlcGxpYi1wcmV2LW5leHQtbGFiZWwge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIH1cbn1cblxuI2RlZXBsaWItbmF2LW1lbnUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBnYXA6IG1pbigyZHZoLCAxZHZ3KTtcbn1cblxuI2RlZXBsaWItc3RvcmFnZS1tZXRlciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwcHg7XG4gIGxlZnQ6IDBweDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWNvbG9yKTtcbiAgYm9yZGVyOiB2YXIoLS1kZWVwbGliLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1kZWVwbGliLWJvcmRlci1yYWRpdXMpO1xuICB6LWluZGV4OiAtMTtcbn1cblxuI2RlZXBsaWItc3RvcmFnZS1iYXIge1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAwJTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZGVlcGxpYi1hY2NlbnQtY29sb3IpO1xufVxuIiwiLmRlZXBsaWItY2hlY2tib3gtY29udGFpbmVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAwLjNlbTtcbn1cblxuLmRlZXBsaWItY2hlY2tib3gtY29udGFpbmVyIGlucHV0LmRlZXBsaWItaW5wdXQge1xuICB3aWR0aDogbWluKDV2aCwgMi41dncpO1xuICBoZWlnaHQ6IG1pbig1dmgsIDIuNXZ3KTtcbiAgd2lkdGg6IG1pbig1ZHZoLCAyLjVkdncpO1xuICBoZWlnaHQ6IG1pbig1ZHZoLCAyLjVkdncpO1xuICBib3JkZXItcmFkaXVzOiBtaW4oMS4wdmgsIDAuNXZ3KTtcbiAgYm9yZGVyLXJhZGl1czogbWluKDEuMGR2aCwgMC41ZHZ3KTtcbn1cblxuLmRlZXBsaWItY2hlY2tib3gtY29udGFpbmVyIGlucHV0LmRlZXBsaWItaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmNoZWNrZWQ6OmJlZm9yZSB7XG4gIHdpZHRoOiA4MCU7XG4gIGhlaWdodDogODAlO1xufVxuXG4uZGVlcGxpYi1pbnB1dC1jb250YWluZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDAuM2VtO1xufVxuXG4uZGVlcGxpYi1pbnB1dC1jb250YWluZXI6aGFzKGxhYmVsLmRlZXBsaWItdGV4dCkge1xuICBtYXJnaW4tdG9wOiBtaW4oMXZoLCAwLjV2dyk7XG4gIG1hcmdpbi10b3A6IG1pbigxZHZoLCAwLjVkdncpO1xufVxuXG4uZGVlcGxpYi1pbnB1dC1jb250YWluZXIgaW5wdXQuZGVlcGxpYi1pbnB1dCB7XG4gIGZvbnQtc2l6ZTogMC42ZW07XG4gIHBhZGRpbmc6IG1pbigxdmgsIDAuNXZ3KTtcbiAgcGFkZGluZzogbWluKDFkdmgsIDAuNWR2dyk7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBvdXRsaW5lOiBub25lO1xuICBtaW4taGVpZ2h0OiBtaW4oNXZoLCAyLjV2dyk7XG4gIG1pbi1oZWlnaHQ6IG1pbig1ZHZoLCAyLjVkdncpO1xuICBib3JkZXItcmFkaXVzOiBtaW4oMS4wdmgsIDAuNXZ3KTtcbiAgYm9yZGVyLXJhZGl1czogbWluKDEuMGR2aCwgMC41ZHZ3KTtcbn1cblxuLmRlZXBsaWItaW5wdXQtY29udGFpbmVyIGlucHV0LmRlZXBsaWItaW5wdXRbdHlwZT1cImNvbG9yXCJdIHtcbiAgcGFkZGluZzogMHB4O1xuICB3aWR0aDogbWluKDV2aCwgMi41dncpO1xuICBoZWlnaHQ6IG1pbig1dmgsIDIuNXZ3KTtcbiAgd2lkdGg6IG1pbig1ZHZoLCAyLjVkdncpO1xuICBoZWlnaHQ6IG1pbig1ZHZoLCAyLjVkdncpO1xuICBib3JkZXItcmFkaXVzOiAwcHg7XG59XG5cbi5kZWVwbGliLWlucHV0LWNvbnRhaW5lciBpbnB1dC5kZWVwbGliLWlucHV0W3R5cGU9XCJjb2xvclwiXTpkaXNhYmxlZCB7XG4gIGJvcmRlcjogdmFyKC0tZGVlcGxpYi1ibG9ja2VkLWNvbG9yKSBzb2xpZCB2YXIoLS1kZWVwbGliLWJvcmRlci13aWR0aCk7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XG5cbi5kZWVwbGliLWRyb3Bkb3duLWNvbnRhaW5lciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogbWluKDJ2aCwgMXZ3KTtcbiAgZ2FwOiBtaW4oMmR2aCwgMWR2dyk7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xuXG4gIHNlbGVjdCB7XG4gICAgcGFkZGluZzogMCBtaW4oMXZoLCAwLjV2dyk7XG4gICAgcGFkZGluZzogMCBtaW4oMWR2aCwgMC41ZHZ3KTtcbiAgICBib3JkZXItcmFkaXVzOiBtaW4oMXZoLCAwLjV2dyk7XG4gICAgYm9yZGVyLXJhZGl1czogbWluKDFkdmgsIDAuNWR2dyk7XG4gIH1cbn0iLCIuZGVlcGxpYi1oaWdobGlnaHQtdGV4dCB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBjb2xvcjogcmdiKDIwMywgMTg1LCAyMyk7XG59XG5cbiNUZXh0QXJlYUNoYXRMb2dbZGF0YS1jb2xvcnRoZW1lPSdkYXJrJ10gZGl2LkNoYXRNZXNzYWdlLmRlZXBsaWItbWVzc2FnZSxcbiNUZXh0QXJlYUNoYXRMb2dbZGF0YS1jb2xvcnRoZW1lPSdkYXJrMiddIGRpdi5DaGF0TWVzc2FnZS5kZWVwbGliLW1lc3NhZ2Uge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kZWVwbGliLWVsZW1lbnQtY29sb3IpO1xuICBib3JkZXI6IG1pbigwLjJkdmgsIDAuMWR2dykgc29saWQgdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpO1xuICBjb2xvcjogdmFyKC0tZGVlcGxpYi10ZXh0LWNvbG9yKTtcbn1cblxuI1RleHRBcmVhQ2hhdExvZyBkaXYuQ2hhdE1lc3NhZ2UuZGVlcGxpYi1tZXNzYWdlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcbiAgYm9yZGVyOiBtaW4oMC4yZHZoLCAwLjFkdncpIHNvbGlkICM0NDAxNzE7XG4gIGNvbG9yOiAjMTExO1xuICBwYWRkaW5nLWxlZnQ6IG1pbigwLjZkdmgsIDAuM2R2dyk7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xufVxuXG4jVGV4dEFyZWFDaGF0TG9nW2RhdGEtY29sb3J0aGVtZT0nZGFyayddIGRpdi5DaGF0TWVzc2FnZS5kZWVwbGliLW1lc3NhZ2UgYSxcbiNUZXh0QXJlYUNoYXRMb2dbZGF0YS1jb2xvcnRoZW1lPSdkYXJrMiddIGRpdi5DaGF0TWVzc2FnZS5kZWVwbGliLW1lc3NhZ2UgYSB7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xufVxuXG4jVGV4dEFyZWFDaGF0TG9nIGRpdi5DaGF0TWVzc2FnZS5kZWVwbGliLW1lc3NhZ2UgYSB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjMTExO1xufVxuIiwiLmRlZXBsaWItbW9kYWwge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMTAlO1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgei1pbmRleDogMTAwMTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMC41ZW07XG4gIHdpZHRoOiBtYXgoNTBkdncsIDI1ZHZoKTtcbiAgZm9udC1zaXplOiBtaW4oNGR2aCwgMmR2dyk7XG4gIHBhZGRpbmc6IG1pbigyZHZoLCAxZHZ3KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWNvbG9yKTtcbiAgYm9yZGVyLXJhZGl1czogbWluKDEuMmR2aCwgMC42ZHZ3KTtcbiAgYm9yZGVyOiBtaW4oMC4yZHZoLCAwLjFkdncpIHNvbGlkIHZhcigtLWRlZXBsaWItYm9yZGVyLWNvbG9yKTtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG5cbiAgLmRlZXBsaWItbW9kYWwtaW5wdXQge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGZvbnQtc2l6ZTogbWluKDIuNmR2aCwgMS44ZHZ3KTtcbiAgICBib3JkZXItcmFkaXVzOiBtaW4oMS4wZHZoLCAwLjVkdncpO1xuICAgIHBhZGRpbmc6IG1pbigxZHZoLCAwLjVkdncpO1xuICB9XG5cbiAgaW5wdXQuZGVlcGxpYi1tb2RhbC1pbnB1dCB7XG4gICAgbWF4LXdpZHRoOiBtYXgoNTBkdmgsIDI1ZHZ3KTtcbiAgfVxuXG4gIC5kZWVwbGliLW1vZGFsLWJ1dHRvbi1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgIGdhcDogMC41ZW07XG4gICAgd2lkdGg6IDEwMCU7XG5cbiAgICAuZGVlcGxpYi1idXR0b24ge1xuICAgICAgZm9udC1zaXplOiAwLjhlbTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB3aWR0aDogYXV0bztcbiAgICAgIHBhZGRpbmc6IG1pbigwLjR2aCwgMC4ydncpIG1pbigydmgsIDF2dyk7XG5cbiAgICAgIC5idXR0b24tbGFiZWwge1xuICAgICAgICBkaXNwbGF5OiBjb250ZW50cztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAuZGVlcGxpYi1tb2RhbC1wcm9tcHQtY29udGFpbmVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgfVxufVxuXG4uZGVlcGxpYi1tb2RhbC1ibG9ja2VyIHtcbiAgei1pbmRleDogMTAwMDtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDBkdnc7XG4gIGhlaWdodDogMTAwZHZoO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNSk7XG59XG4iXX0= */`;
878
932
 
879
933
  // src/base/initialization.ts
880
934
  var modStorage;
@@ -921,7 +975,6 @@ async function init(options) {
921
975
  await options.initFunction?.();
922
976
  if (options.mainMenuOptions)
923
977
  MainMenu.setOptions(options.mainMenuOptions);
924
- VersionModule.checkVersionUpdate();
925
978
  for (const m of modules()) {
926
979
  if (m.defaultSettings && hasGetter(m, "defaultSettings") && m.settings && hasSetter(m, "settings")) {
927
980
  if (Object.entries(m.defaultSettings).length === 0) continue;
@@ -999,8 +1052,6 @@ var GUI = class _GUI extends BaseModule {
999
1052
  _subscreens;
1000
1053
  /** The mod's main menu screen. */
1001
1054
  _mainMenu;
1002
- /** The currently active subscreen, or `null` if none is active. */
1003
- _currentSubscreen = null;
1004
1055
  /** Options defining how the mod's settings button is displayed and behaves. */
1005
1056
  _modButtonOptions;
1006
1057
  /** Returns all registered subscreens. */
@@ -1011,38 +1062,12 @@ var GUI = class _GUI extends BaseModule {
1011
1062
  get mainMenu() {
1012
1063
  return this._mainMenu;
1013
1064
  }
1014
- /** Returns the currently active subscreen. */
1015
- get currentSubscreen() {
1016
- return this._currentSubscreen;
1017
- }
1018
- /**
1019
- * Sets the current subscreen.
1020
- * Accepts either a `BaseSubscreen` instance or the `name` of a subscreen.
1021
- *
1022
- * @throws If a string is provided but no subscreen with that name exists.
1023
- */
1024
- set currentSubscreen(subscreen) {
1025
- if (this._currentSubscreen) {
1026
- this._currentSubscreen.unload();
1027
- }
1028
- if (typeof subscreen === "string") {
1029
- const scr = this._subscreens?.find((s) => s.name === subscreen);
1030
- if (!scr) throw `Failed to find screen name ${subscreen}`;
1031
- this._currentSubscreen = scr;
1032
- } else {
1033
- this._currentSubscreen = subscreen;
1034
- }
1035
- if (this._currentSubscreen) {
1036
- this._currentSubscreen.load();
1037
- this._currentSubscreen.resize(true);
1038
- }
1039
- }
1040
1065
  /**
1041
1066
  * Creates the GUI instance and initializes the main menu.
1042
1067
  *
1043
1068
  * @throws If another `GUI` instance already exists.
1044
1069
  */
1045
- constructor(modButtonOptions) {
1070
+ constructor(guiOptions = null) {
1046
1071
  super();
1047
1072
  if (_GUI.instance) {
1048
1073
  throw new Error("Duplicate initialization");
@@ -1050,9 +1075,9 @@ var GUI = class _GUI extends BaseModule {
1050
1075
  for (const module of modules()) {
1051
1076
  if (!module.settingsScreen) continue;
1052
1077
  }
1053
- this._mainMenu = new MainMenu(this);
1078
+ this._mainMenu = guiOptions?.mainMenu ? new guiOptions.mainMenu(this) : new MainMenu(this);
1054
1079
  this._subscreens = [this._mainMenu];
1055
- this._modButtonOptions = modButtonOptions;
1080
+ this._modButtonOptions = guiOptions;
1056
1081
  _GUI.instance = this;
1057
1082
  }
1058
1083
  /**
@@ -1063,43 +1088,25 @@ var GUI = class _GUI extends BaseModule {
1063
1088
  * - Sets up the main menu and its subscreens.
1064
1089
  */
1065
1090
  load() {
1091
+ if (!this._modButtonOptions) return;
1066
1092
  for (const module of modules()) {
1067
1093
  if (!module.settingsScreen) continue;
1068
- this._subscreens.push(new module.settingsScreen({}, module));
1094
+ this._subscreens.push(new module.settingsScreen(module));
1069
1095
  }
1070
1096
  this._mainMenu.subscreens = this._subscreens;
1071
1097
  PreferenceRegisterExtensionSetting({
1072
- Identifier: this._modButtonOptions.Identifier,
1073
- ButtonText: this._modButtonOptions.ButtonText,
1074
- Image: this._modButtonOptions.Image,
1075
- load: /* @__PURE__ */ __name(() => {
1076
- setSubscreen(new MainMenu(this));
1098
+ Identifier: this._modButtonOptions.identifier,
1099
+ ButtonText: this._modButtonOptions.buttonText,
1100
+ Image: this._modButtonOptions.image,
1101
+ load: /* @__PURE__ */ __name(async () => {
1102
+ await setSubscreen(this._mainMenu);
1077
1103
  }, "load"),
1078
1104
  run: /* @__PURE__ */ __name(() => {
1079
- if (this._currentSubscreen) {
1080
- this._currentSubscreen.run();
1081
- const newCanvasPosition = [MainCanvas.canvas.offsetLeft, MainCanvas.canvas.offsetTop, MainCanvas.canvas.clientWidth, MainCanvas.canvas.clientHeight];
1082
- if (!CommonArraysEqual(newCanvasPosition, DrawCanvasPosition)) {
1083
- DrawCanvasPosition = newCanvasPosition;
1084
- this._currentSubscreen.resize(false);
1085
- }
1086
- }
1087
1105
  }, "run"),
1088
1106
  click: /* @__PURE__ */ __name(() => {
1089
- if (this._currentSubscreen) {
1090
- this._currentSubscreen.click();
1091
- }
1092
1107
  }, "click"),
1093
1108
  exit: /* @__PURE__ */ __name(() => {
1094
- if (this._currentSubscreen) {
1095
- this._currentSubscreen.exit();
1096
- }
1097
- }, "exit"),
1098
- unload: /* @__PURE__ */ __name(() => {
1099
- if (this._currentSubscreen) {
1100
- this._currentSubscreen.unload();
1101
- }
1102
- }, "unload")
1109
+ }, "exit")
1103
1110
  });
1104
1111
  }
1105
1112
  };
@@ -1112,29 +1119,38 @@ var VersionModule = class _VersionModule extends BaseModule {
1112
1119
  /** Whether the current session is running a new version compared to stored data */
1113
1120
  static isItNewVersion = false;
1114
1121
  /** The current mod version (retrieved from `ModSdkManager.ModInfo.version`) */
1115
- static Version;
1122
+ static version;
1116
1123
  /** Message to display when a new version is detected */
1117
- static NewVersionMessage = "";
1124
+ static newVersionMessage = "";
1118
1125
  /** List of registered migration handlers, sorted by version */
1119
- static Migrators = [];
1126
+ static migrators = [];
1127
+ /** Optional lifecycle hook. Runs before each migration */
1128
+ static beforeEach;
1129
+ /** Optional lifecycle hook. Runs after each migration */
1130
+ static afterEach;
1131
+ /** Optional lifecycle hook. Runs before all migrations */
1132
+ static beforeAll;
1133
+ /** Optional lifecycle hook. Runs after all migrations */
1134
+ static afterAll;
1135
+ constructor(options) {
1136
+ super();
1137
+ _VersionModule.newVersionMessage = options.newVersionMessage;
1138
+ _VersionModule.beforeEach = options.beforeEach;
1139
+ _VersionModule.afterEach = options.afterEach;
1140
+ _VersionModule.beforeAll = options.beforeAll;
1141
+ _VersionModule.afterAll = options.afterAll;
1142
+ }
1120
1143
  /**
1121
1144
  * Initializes the module on load:
1122
1145
  * - Stores the current mod version.
1123
1146
  * - Hooks into `ChatRoomSync` to show a "new version" message when applicable.
1124
1147
  */
1125
1148
  load() {
1126
- _VersionModule.Version = ModSdkManager.ModInfo.version;
1127
- ModSdkManager.prototype.hookFunction(
1128
- "ChatRoomSync",
1129
- HookPriority.Observe,
1130
- (args, next) => {
1131
- next(args);
1132
- if (modStorage.playerStorage.GlobalModule.doShowNewVersionMessage && _VersionModule.isItNewVersion) {
1133
- _VersionModule.sendNewVersionMessage();
1134
- }
1135
- },
1136
- "VersionModule"
1137
- );
1149
+ _VersionModule.version = ModSdkManager.ModInfo.version;
1150
+ _VersionModule.checkVersionUpdate();
1151
+ if (modStorage.playerStorage.GlobalModule.doShowNewVersionMessage && _VersionModule.isItNewVersion) {
1152
+ _VersionModule.sendNewVersionMessage();
1153
+ }
1138
1154
  }
1139
1155
  /**
1140
1156
  * Checks if the stored version differs from the current version.
@@ -1145,9 +1161,9 @@ var VersionModule = class _VersionModule extends BaseModule {
1145
1161
  * - Saves `modStorage`.
1146
1162
  */
1147
1163
  static checkVersionUpdate() {
1148
- const PreviousVersion = _VersionModule.loadVersion();
1149
- const CurrentVersion = _VersionModule.Version;
1150
- if (_VersionModule.isNewVersion(PreviousVersion, CurrentVersion)) {
1164
+ const previousVersion = _VersionModule.loadVersion();
1165
+ const currentVersion = _VersionModule.version;
1166
+ if (_VersionModule.isNewVersion(previousVersion, currentVersion)) {
1151
1167
  _VersionModule.isItNewVersion = true;
1152
1168
  _VersionModule.checkVersionMigration();
1153
1169
  _VersionModule.saveVersion();
@@ -1159,29 +1175,59 @@ var VersionModule = class _VersionModule extends BaseModule {
1159
1175
  * is newer than the previously stored version.
1160
1176
  */
1161
1177
  static checkVersionMigration() {
1162
- const PreviousVersion = _VersionModule.loadVersion();
1163
- for (const migrator of _VersionModule.Migrators) {
1164
- if (_VersionModule.isNewVersion(PreviousVersion, migrator.MigrationVersion)) {
1165
- migrator.Migrate();
1166
- deepLibLogger.info(`Migrating ${ModSdkManager.ModInfo.name} from ${PreviousVersion} to ${migrator.MigrationVersion} with ${migrator.constructor.name}`);
1167
- }
1178
+ const previousVersion = _VersionModule.loadVersion();
1179
+ const toMigrate = _VersionModule.migrators.filter(
1180
+ (m) => _VersionModule.isNewVersion(previousVersion, m.migrationVersion)
1181
+ );
1182
+ if (!toMigrate.length) return;
1183
+ _VersionModule.beforeAll?.();
1184
+ for (const migrator of toMigrate) {
1185
+ _VersionModule.beforeEach?.();
1186
+ migrator.migrate();
1187
+ deepLibLogger.info(
1188
+ `Migrating ${ModSdkManager.ModInfo.name} from ${previousVersion} to ${migrator.migrationVersion} with ${migrator.constructor.name}`
1189
+ );
1190
+ _VersionModule.afterEach?.();
1168
1191
  }
1192
+ _VersionModule.afterAll?.();
1169
1193
  }
1170
1194
  /**
1171
1195
  * Registers a new migrator for handling version-specific changes.
1172
1196
  * Migrators are sorted by their `MigrationVersion` in ascending order.
1173
1197
  */
1174
1198
  static registerMigrator(migrator) {
1175
- _VersionModule.Migrators.push(migrator);
1176
- _VersionModule.Migrators.sort((a, b) => a.MigrationVersion.localeCompare(b.MigrationVersion));
1177
- }
1178
- /** Sets the message that will be displayed when a new version is detected. */
1179
- static setNewVersionMessage(newVersionMessage) {
1180
- _VersionModule.NewVersionMessage = newVersionMessage;
1199
+ _VersionModule.migrators.push(migrator);
1200
+ _VersionModule.migrators.sort((a, b) => a.migrationVersion.localeCompare(b.migrationVersion));
1181
1201
  }
1182
1202
  /** Sends the currently configured "new version" message to the local player. */
1183
1203
  static sendNewVersionMessage() {
1184
- sendLocalMessage("deeplib-new-version", _VersionModule.NewVersionMessage);
1204
+ if (!_VersionModule.newVersionMessage) return;
1205
+ const beepLogLength = FriendListBeepLog.push({
1206
+ MemberNumber: Player.MemberNumber,
1207
+ MemberName: ModSdkManager.ModInfo.name,
1208
+ ChatRoomName: getText("module.version.version_update"),
1209
+ ChatRoomSpace: "X",
1210
+ Private: false,
1211
+ Sent: false,
1212
+ Time: /* @__PURE__ */ new Date(),
1213
+ Message: _VersionModule.newVersionMessage
1214
+ });
1215
+ const beepIdx = beepLogLength - 1;
1216
+ const title = CommonStringPartitionReplace(getText("module.version.new_version_toast_title"), {
1217
+ $modName$: ModSdkManager.ModInfo.name,
1218
+ $modVersion$: _VersionModule.version
1219
+ }).join("");
1220
+ const data = FriendListBeepLog[beepIdx];
1221
+ ServerShowBeep(_VersionModule.newVersionMessage, 1e4, {
1222
+ memberNumber: data.MemberNumber,
1223
+ memberName: data.MemberName,
1224
+ chatRoomName: data.ChatRoomName,
1225
+ ...data.Message && {
1226
+ onClick: /* @__PURE__ */ __name(() => {
1227
+ FriendListShowBeep(beepIdx);
1228
+ }, "onClick")
1229
+ }
1230
+ }, title);
1185
1231
  }
1186
1232
  /**
1187
1233
  * Determines if a given `candidate` version is newer than the `current` version.
@@ -1206,7 +1252,7 @@ var VersionModule = class _VersionModule extends BaseModule {
1206
1252
  /** Saves the current mod version into persistent player storage. */
1207
1253
  static saveVersion() {
1208
1254
  if (modStorage.playerStorage) {
1209
- Player[ModSdkManager.ModInfo.name].Version = _VersionModule.Version;
1255
+ Player[ModSdkManager.ModInfo.name].Version = _VersionModule.version;
1210
1256
  }
1211
1257
  }
1212
1258
  /** Loads the stored mod version from persistent player storage. */
@@ -1220,19 +1266,21 @@ var GuiDebug = class extends BaseSubscreen {
1220
1266
  static {
1221
1267
  __name(this, "GuiDebug");
1222
1268
  }
1223
- get name() {
1224
- return "debug";
1225
- }
1269
+ static subscreenOptions = {
1270
+ name: "debug"
1271
+ };
1226
1272
  get pageStructure() {
1227
1273
  return [
1228
1274
  [
1229
1275
  {
1230
1276
  type: "button",
1231
1277
  id: "test-deeplib-big-button",
1278
+ options: {
1279
+ label: "Big Button",
1280
+ tooltip: "This is a big button",
1281
+ image: "Icons/Exit.png"
1282
+ },
1232
1283
  size: [405, 80],
1233
- label: "Big Button",
1234
- tooltip: "This is a big button",
1235
- image: "Icons/Exit.png",
1236
1284
  onClick() {
1237
1285
  deepLibLogger.info("Big Button Clicked");
1238
1286
  }
@@ -1240,9 +1288,11 @@ var GuiDebug = class extends BaseSubscreen {
1240
1288
  {
1241
1289
  type: "button",
1242
1290
  id: "test-deeplib-small-button",
1291
+ options: {
1292
+ tooltip: "This is a small button",
1293
+ image: "Icons/Exit.png"
1294
+ },
1243
1295
  size: [90, 90],
1244
- tooltip: "This is a small button",
1245
- image: "Icons/Exit.png",
1246
1296
  onClick() {
1247
1297
  deepLibLogger.info("Small Button Clicked");
1248
1298
  }
@@ -1294,10 +1344,12 @@ var GuiDebug = class extends BaseSubscreen {
1294
1344
  {
1295
1345
  type: "button",
1296
1346
  id: "test-deeplib-big-button2",
1347
+ options: {
1348
+ label: "Big Button",
1349
+ tooltip: "This is a big button",
1350
+ image: "Icons/Exit.png"
1351
+ },
1297
1352
  size: [405, 80],
1298
- label: "Big Button",
1299
- tooltip: "This is a big button",
1300
- image: "Icons/Prev.png",
1301
1353
  onClick() {
1302
1354
  deepLibLogger.info("Big Button Clicked");
1303
1355
  }
@@ -1305,9 +1357,11 @@ var GuiDebug = class extends BaseSubscreen {
1305
1357
  {
1306
1358
  type: "button",
1307
1359
  id: "test-deeplib-small-button2",
1360
+ options: {
1361
+ tooltip: "This is a small button",
1362
+ image: "Icons/Next.png"
1363
+ },
1308
1364
  size: [90, 90],
1309
- tooltip: "This is a small button",
1310
- image: "Icons/Next.png",
1311
1365
  onClick() {
1312
1366
  deepLibLogger.info("Small Button Clicked");
1313
1367
  }
@@ -1353,6 +1407,22 @@ var GuiDebug = class extends BaseSubscreen {
1353
1407
  id: "test-deeplib-label2",
1354
1408
  label: "Label",
1355
1409
  description: "This is a label"
1410
+ },
1411
+ {
1412
+ type: "dropdown",
1413
+ id: "test-deeplib-dropdown",
1414
+ label: "Dropdown",
1415
+ description: "This is a dropdown",
1416
+ optionsList: ["Option 1", "Option 2", "Option 3"],
1417
+ setElementValue() {
1418
+ return "Option 2";
1419
+ },
1420
+ setSettingValue(val) {
1421
+ deepLibLogger.info("Dropdown value:", val);
1422
+ },
1423
+ options: {
1424
+ width: 200
1425
+ }
1356
1426
  }
1357
1427
  ]
1358
1428
  ];
@@ -1360,22 +1430,27 @@ var GuiDebug = class extends BaseSubscreen {
1360
1430
  };
1361
1431
 
1362
1432
  // src/utilities/common.ts
1433
+ function isPlainObject(value) {
1434
+ return value !== null && typeof value === "object" && Object.getPrototypeOf(value) === Object.prototype;
1435
+ }
1436
+ __name(isPlainObject, "isPlainObject");
1363
1437
  function deepMerge(target, source) {
1364
1438
  if (target === void 0) return source;
1365
1439
  if (source === void 0) return target;
1366
- if (typeof target !== "object" || typeof source !== "object") {
1367
- return source;
1368
- }
1369
- for (const key of Object.keys(source)) {
1370
- if (Array.isArray(source[key]) && Array.isArray(target[key])) {
1371
- target[key] = [...target[key], ...source[key]];
1372
- } else if (typeof source[key] === "object" && source[key] !== null) {
1373
- target[key] = deepMerge(target[key] || {}, source[key]);
1374
- } else {
1375
- target[key] = source[key];
1440
+ if (Array.isArray(target) && Array.isArray(source)) {
1441
+ return [...target, ...source];
1442
+ }
1443
+ if (isPlainObject(target) && isPlainObject(source)) {
1444
+ const result = { ...target };
1445
+ for (const key of Object.keys(source)) {
1446
+ if (key === "__proto__" || key === "constructor" || key === "prototype") {
1447
+ continue;
1448
+ }
1449
+ result[key] = key in target ? deepMerge(target[key], source[key]) : source[key];
1376
1450
  }
1451
+ return result;
1377
1452
  }
1378
- return target;
1453
+ return source;
1379
1454
  }
1380
1455
  __name(deepMerge, "deepMerge");
1381
1456
  function shuffleArray(array) {
@@ -1440,6 +1515,7 @@ var advElement = {
1440
1515
  createInput: elementCreateInput,
1441
1516
  createLabel: elementCreateLabel,
1442
1517
  createCustom: elementCreateCustom,
1518
+ createDropdown: elementCreateDropdown,
1443
1519
  createTooltip: elementCreateTooltip,
1444
1520
  getTooltip: elementGetTooltip,
1445
1521
  setTooltip: elementSetTooltip,
@@ -1470,7 +1546,7 @@ function elementCreateButton(options) {
1470
1546
  disabled
1471
1547
  },
1472
1548
  children: [
1473
- image ? {
1549
+ image ? deepMerge({
1474
1550
  tag: "img",
1475
1551
  attributes: {
1476
1552
  id: `${options.id}-image`,
@@ -1483,7 +1559,7 @@ function elementCreateButton(options) {
1483
1559
  style: {
1484
1560
  "--image": `url("${image}")`
1485
1561
  }
1486
- } : void 0
1562
+ }, options.htmlOptions?.img) : void 0
1487
1563
  ]
1488
1564
  }
1489
1565
  }, options.htmlOptions ?? {})
@@ -1497,7 +1573,7 @@ function elementCreateCheckbox(options) {
1497
1573
  if (elem) return elem;
1498
1574
  options.type = "checkbox";
1499
1575
  const disabled = typeof options?.disabled === "function" ? options?.disabled() : options?.disabled;
1500
- const retElem = ElementCreate({
1576
+ const retElem = ElementCreate(deepMerge({
1501
1577
  tag: "div",
1502
1578
  classList: ["deeplib-checkbox-container"],
1503
1579
  attributes: {
@@ -1512,23 +1588,23 @@ function elementCreateCheckbox(options) {
1512
1588
  id: options.id,
1513
1589
  disabled,
1514
1590
  checked: options?.setElementValue?.() || void 0
1591
+ },
1592
+ eventListeners: {
1593
+ change: /* @__PURE__ */ __name(function() {
1594
+ options?.setSettingValue?.(this.checked);
1595
+ }, "change")
1515
1596
  }
1516
- }, options.htmlOptions),
1517
- {
1597
+ }, options.htmlOptions?.checkbox),
1598
+ deepMerge({
1518
1599
  tag: "label",
1519
1600
  classList: ["deeplib-text"],
1520
1601
  attributes: {
1521
1602
  for: options.id
1522
1603
  },
1523
1604
  children: [options.label]
1524
- }
1525
- ],
1526
- eventListeners: {
1527
- change: /* @__PURE__ */ __name(() => {
1528
- options?.setSettingValue?.(document.getElementById(options.id)?.checked);
1529
- }, "change")
1530
- }
1531
- });
1605
+ }, options.htmlOptions?.label)
1606
+ ]
1607
+ }, options.htmlOptions?.container));
1532
1608
  if (options.description) {
1533
1609
  retElem.addEventListener("mouseover", () => {
1534
1610
  elementSetTooltip(options.description || "");
@@ -1542,7 +1618,10 @@ function elementCreateCheckbox(options) {
1542
1618
  }
1543
1619
  __name(elementCreateCheckbox, "elementCreateCheckbox");
1544
1620
  function elementCreateCustom(options) {
1545
- const elem = document.getElementById(options.id);
1621
+ options.id ??= ElementGenerateID();
1622
+ options.htmlOptions.attributes ??= {};
1623
+ options.htmlOptions.attributes.id ??= options.id;
1624
+ const elem = document.getElementById(options.htmlOptions.attributes.id);
1546
1625
  if (elem) return elem;
1547
1626
  options.type = "custom";
1548
1627
  const retElem = ElementCreate(options.htmlOptions);
@@ -1554,7 +1633,7 @@ function elementCreateInput(options) {
1554
1633
  const elem = document.getElementById(options.id);
1555
1634
  if (elem) return elem;
1556
1635
  const disabled = typeof options?.disabled === "function" ? options?.disabled() : options?.disabled;
1557
- const retElem = ElementCreate({
1636
+ const retElem = ElementCreate(deepMerge({
1558
1637
  tag: "div",
1559
1638
  classList: ["deeplib-input-container"],
1560
1639
  attributes: {
@@ -1570,23 +1649,23 @@ function elementCreateInput(options) {
1570
1649
  placeholder: " ",
1571
1650
  disabled,
1572
1651
  value: options?.setElementValue?.() || void 0
1652
+ },
1653
+ eventListeners: {
1654
+ input: /* @__PURE__ */ __name(function() {
1655
+ options?.setSettingValue?.(this.value);
1656
+ }, "input")
1573
1657
  }
1574
- }, options.htmlOptions),
1575
- options.label ? {
1658
+ }, options.htmlOptions?.input),
1659
+ options.label ? deepMerge({
1576
1660
  tag: "label",
1577
1661
  classList: ["deeplib-text"],
1578
1662
  attributes: {
1579
1663
  for: options.id
1580
1664
  },
1581
1665
  children: [options.label]
1582
- } : void 0
1583
- ],
1584
- eventListeners: {
1585
- input: /* @__PURE__ */ __name(() => {
1586
- options?.setSettingValue?.(document.getElementById(options.id)?.value);
1587
- }, "input")
1588
- }
1589
- });
1666
+ }, options.htmlOptions?.label) : void 0
1667
+ ]
1668
+ }, options.htmlOptions?.container));
1590
1669
  if (options.description) {
1591
1670
  retElem.addEventListener("mouseover", () => {
1592
1671
  elementSetTooltip(options.description || "");
@@ -1625,6 +1704,49 @@ function elementCreateLabel(options) {
1625
1704
  return retElem;
1626
1705
  }
1627
1706
  __name(elementCreateLabel, "elementCreateLabel");
1707
+ function elementCreateDropdown(options) {
1708
+ options.id ??= ElementGenerateID();
1709
+ const elem = document.getElementById(`${options.id}-container`);
1710
+ if (elem) return elem;
1711
+ options.type = "dropdown";
1712
+ const retElem = ElementCreate(deepMerge({
1713
+ tag: "div",
1714
+ classList: ["deeplib-dropdown-container"],
1715
+ attributes: {
1716
+ id: `${options.id}-container`
1717
+ },
1718
+ children: [
1719
+ options.label ? deepMerge({
1720
+ tag: "label",
1721
+ classList: ["deeplib-text"],
1722
+ attributes: {
1723
+ for: options.id
1724
+ },
1725
+ children: [options.label]
1726
+ }, options.htmlOptions?.label) : void 0,
1727
+ ElementCreateDropdown(
1728
+ options.id,
1729
+ options.optionsList,
1730
+ function() {
1731
+ return options.setSettingValue?.(this.value);
1732
+ },
1733
+ options.options,
1734
+ options.htmlOptions?.select
1735
+ )
1736
+ ],
1737
+ eventListeners: {
1738
+ mouseover: /* @__PURE__ */ __name(function() {
1739
+ elementSetTooltip(options.description ?? "");
1740
+ }, "mouseover"),
1741
+ mouseout: /* @__PURE__ */ __name(function() {
1742
+ elementSetTooltip("");
1743
+ }, "mouseout")
1744
+ }
1745
+ }, options.htmlOptions?.container));
1746
+ BaseSubscreen.currentElements.push([retElem, options]);
1747
+ return retElem;
1748
+ }
1749
+ __name(elementCreateDropdown, "elementCreateDropdown");
1628
1750
  function elementCreateTooltip() {
1629
1751
  const element = ElementCreate({
1630
1752
  tag: "div",
@@ -1952,15 +2074,17 @@ var MainMenu = class _MainMenu extends BaseSubscreen {
1952
2074
  }
1953
2075
  subscreens = [];
1954
2076
  static options = {};
1955
- get name() {
1956
- return "mainmenu";
1957
- }
2077
+ static subscreenOptions = {
2078
+ name: "mainmenu",
2079
+ doShowExitButton: false,
2080
+ settingsWidth: 600
2081
+ };
1958
2082
  constructor(module) {
1959
- super({ drawCharacter: true }, module);
2083
+ super(module);
1960
2084
  this.subscreens = module.subscreens;
1961
2085
  }
1962
2086
  load() {
1963
- if (!GUI.instance?.currentSubscreen) {
2087
+ if (!GUI.instance || CurrentModule !== "DeepLibMod") {
1964
2088
  this.setSubscreen(this);
1965
2089
  return;
1966
2090
  }
@@ -1981,21 +2105,21 @@ var MainMenu = class _MainMenu extends BaseSubscreen {
1981
2105
  ElementMenu.AppendButton(menu, exitButton);
1982
2106
  }
1983
2107
  for (const screen of this.subscreens) {
1984
- if (screen.name == "mainmenu") continue;
2108
+ if (screen.options.name == "mainmenu") continue;
1985
2109
  const button = advElement.createButton({
1986
- id: `${screen.name}-button`,
2110
+ id: `${screen.options.name}-button`,
1987
2111
  onClick: /* @__PURE__ */ __name(() => {
1988
2112
  this.setSubscreen(screen);
1989
2113
  }, "onClick"),
1990
2114
  size: [null, 90],
1991
2115
  options: {
1992
- image: screen.icon,
1993
- label: getText(`mainmenu.button.${screen.name}`)
2116
+ image: screen.options.icon,
2117
+ label: getText(`mainmenu.button.${screen.options.name}`)
1994
2118
  }
1995
2119
  });
1996
2120
  layout.appendToSettingsDiv(button);
1997
2121
  }
1998
- const miscDiv = layout.createMiscDiv();
2122
+ const miscDiv = layout.getMiscDiv();
1999
2123
  layout.appendToSubscreen(miscDiv);
2000
2124
  if (_MainMenu.options.wikiLink) {
2001
2125
  const wikiButton = advElement.createButton({
@@ -2115,8 +2239,17 @@ var MainMenu = class _MainMenu extends BaseSubscreen {
2115
2239
  exit() {
2116
2240
  CharacterAppearanceForceUpCharacter = -1;
2117
2241
  CharacterLoadCanvas(Player);
2118
- this.setSubscreen(null);
2119
- PreferenceSubscreenExtensionsClear();
2242
+ const returnScreen = typeof this.options.returnScreen === "function" ? this.options.returnScreen() : this.options.returnScreen;
2243
+ if (!returnScreen) {
2244
+ PreferenceOpenSubscreen("Extensions").then(() => {
2245
+ PreferenceSubscreenExtensionsClear();
2246
+ });
2247
+ } else if (returnScreen instanceof BaseSubscreen) {
2248
+ setSubscreen(returnScreen ?? null).then(() => {
2249
+ });
2250
+ } else if (Array.isArray(returnScreen)) {
2251
+ CommonSetScreen(...returnScreen);
2252
+ }
2120
2253
  }
2121
2254
  resize() {
2122
2255
  super.resize();
@@ -2127,6 +2260,18 @@ var MainMenu = class _MainMenu extends BaseSubscreen {
2127
2260
  _MainMenu.options = mainMenuOptions;
2128
2261
  }
2129
2262
  };
2263
+ async function PreferenceOpenSubscreen(subscreen, page = 1) {
2264
+ if (CurrentModule !== "Character" || CurrentScreen !== "Preference") {
2265
+ await CommonSetScreen("Character", "Preference");
2266
+ }
2267
+ PreferenceSubscreen?.unload?.();
2268
+ PreferenceSubscreen = PreferenceSubscreens.find((s) => s.name === subscreen) ?? null;
2269
+ if (!CommonIsNonNegativeInteger(page)) page = 1;
2270
+ PreferencePageCurrent = page;
2271
+ PreferenceMessage = "";
2272
+ PreferenceSubscreen?.load?.();
2273
+ }
2274
+ __name(PreferenceOpenSubscreen, "PreferenceOpenSubscreen");
2130
2275
 
2131
2276
  // src/screens/import_export.ts
2132
2277
  var GuiImportExport = class extends BaseSubscreen {
@@ -2134,11 +2279,11 @@ var GuiImportExport = class extends BaseSubscreen {
2134
2279
  __name(this, "GuiImportExport");
2135
2280
  }
2136
2281
  importExportOptions;
2137
- get name() {
2138
- return "import-export";
2139
- }
2282
+ static subscreenOptions = {
2283
+ name: "import-export"
2284
+ };
2140
2285
  constructor(importExportOptions) {
2141
- super({ drawCharacter: true });
2286
+ super();
2142
2287
  this.importExportOptions = importExportOptions;
2143
2288
  }
2144
2289
  load() {
@@ -2383,7 +2528,9 @@ var ModStorage = class _ModStorage {
2383
2528
  if (this.extensionStorage) {
2384
2529
  const parsed = _ModStorage.dataDecompress(this.extensionStorage || "");
2385
2530
  if (parsed === null || !Object.hasOwn(parsed, "Version")) {
2386
- this.playerStorage = {};
2531
+ this.playerStorage = {
2532
+ Version: ModSdkManager.ModInfo.version
2533
+ };
2387
2534
  } else {
2388
2535
  this.playerStorage = parsed;
2389
2536
  }
@@ -2513,34 +2660,28 @@ __name(hasOverflow, "hasOverflow");
2513
2660
 
2514
2661
  // src/utilities/elements/layout.ts
2515
2662
  var layout = {
2516
- createSubscreen: elementCreateSubscreenDiv,
2517
2663
  getSubscreen: elementGetSubscreenDiv,
2518
2664
  appendToSubscreen: elementAppendToSubscreenDiv,
2519
2665
  removeSubscreen: elementRemoveSubscreenDiv,
2520
- createSettingsDiv: elementCreateSettingsDiv,
2521
2666
  getSettingsDiv: elementGetSettingsDiv,
2522
2667
  appendToSettingsDiv: elementAppendToSettingsDiv,
2523
2668
  removeSettingsDiv: elementRemoveSettingsDiv,
2524
- createMiscDiv: elementCreateMiscDiv,
2525
2669
  getMiscDiv: elementGetMiscDiv,
2526
2670
  appendToMiscDiv: elementAppendToMiscDiv,
2527
2671
  removeMiscDiv: elementRemoveMiscDiv
2528
2672
  };
2529
- function elementCreateSubscreenDiv() {
2530
- const subscreenDiv = elementGetSubscreenDiv();
2673
+ function elementGetSubscreenDiv() {
2674
+ const subscreenDiv = ElementWrap("deeplib-subscreen");
2531
2675
  if (subscreenDiv) {
2532
- console.error("Subscreen already exists");
2533
2676
  return subscreenDiv;
2534
2677
  }
2535
- const div = document.createElement("div");
2536
- div.id = "deeplib-subscreen";
2537
- div.classList.add("deeplib-subscreen", "HideOnPopup");
2678
+ const div = ElementCreate({
2679
+ tag: "div",
2680
+ classList: ["deeplib-subscreen", "HideOnPopup"],
2681
+ attributes: { id: "deeplib-subscreen" }
2682
+ });
2538
2683
  return document.body.appendChild(div);
2539
2684
  }
2540
- __name(elementCreateSubscreenDiv, "elementCreateSubscreenDiv");
2541
- function elementGetSubscreenDiv() {
2542
- return document.getElementById("deeplib-subscreen") ?? void 0;
2543
- }
2544
2685
  __name(elementGetSubscreenDiv, "elementGetSubscreenDiv");
2545
2686
  function elementRemoveSubscreenDiv() {
2546
2687
  return elementGetSubscreenDiv()?.remove();
@@ -2550,21 +2691,18 @@ function elementAppendToSubscreenDiv(...element) {
2550
2691
  return elementGetSubscreenDiv()?.append(...element);
2551
2692
  }
2552
2693
  __name(elementAppendToSubscreenDiv, "elementAppendToSubscreenDiv");
2553
- function elementCreateSettingsDiv() {
2554
- const settingsDiv = elementGetSettingsDiv();
2694
+ function elementGetSettingsDiv() {
2695
+ const settingsDiv = ElementWrap("deeplib-settings");
2555
2696
  if (settingsDiv) {
2556
- console.error("Settings screen already exists");
2557
2697
  return settingsDiv;
2558
2698
  }
2559
- const div = document.createElement("div");
2560
- div.id = "deeplib-settings";
2561
- div.classList.add("deeplib-settings");
2699
+ const div = ElementCreate({
2700
+ tag: "div",
2701
+ classList: ["deeplib-settings", "scroll-box"],
2702
+ attributes: { id: "deeplib-settings" }
2703
+ });
2562
2704
  return div;
2563
2705
  }
2564
- __name(elementCreateSettingsDiv, "elementCreateSettingsDiv");
2565
- function elementGetSettingsDiv() {
2566
- return document.getElementById("deeplib-settings") ?? void 0;
2567
- }
2568
2706
  __name(elementGetSettingsDiv, "elementGetSettingsDiv");
2569
2707
  function elementAppendToSettingsDiv(...element) {
2570
2708
  return elementGetSettingsDiv()?.append(...element);
@@ -2574,21 +2712,18 @@ function elementRemoveSettingsDiv() {
2574
2712
  return elementGetSettingsDiv()?.remove();
2575
2713
  }
2576
2714
  __name(elementRemoveSettingsDiv, "elementRemoveSettingsDiv");
2577
- function elementCreateMiscDiv() {
2578
- const miscDiv = elementGetMiscDiv();
2715
+ function elementGetMiscDiv() {
2716
+ const miscDiv = ElementWrap("deeplib-misc");
2579
2717
  if (miscDiv) {
2580
- console.error("Settings screen already exists");
2581
2718
  return miscDiv;
2582
2719
  }
2583
- const div = document.createElement("div");
2584
- div.id = "deeplib-misc";
2585
- div.classList.add("deeplib-misc");
2720
+ const div = ElementCreate({
2721
+ tag: "div",
2722
+ classList: ["deeplib-misc"],
2723
+ attributes: { id: "deeplib-misc" }
2724
+ });
2586
2725
  return div;
2587
2726
  }
2588
- __name(elementCreateMiscDiv, "elementCreateMiscDiv");
2589
- function elementGetMiscDiv() {
2590
- return document.getElementById("deeplib-misc");
2591
- }
2592
2727
  __name(elementGetMiscDiv, "elementGetMiscDiv");
2593
2728
  function elementAppendToMiscDiv(...element) {
2594
2729
  return elementGetMiscDiv()?.append(...element);
@@ -3031,7 +3166,6 @@ export {
3031
3166
  getText,
3032
3167
  hasGetter,
3033
3168
  hasSetter,
3034
- init,
3035
3169
  initMod,
3036
3170
  layout,
3037
3171
  modStorage,