@meridianlabs/log-viewer 0.3.241 → 0.3.243

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.
Files changed (72) hide show
  1. package/lib/index.js +2568 -161
  2. package/lib/index.js.map +1 -1
  3. package/lib/src/app/App.d.ts.map +1 -1
  4. package/lib/src/app/flow/FlowButton.d.ts +1 -3
  5. package/lib/src/app/flow/FlowButton.d.ts.map +1 -1
  6. package/lib/src/app/log-list/grid/columns/hooks.d.ts.map +1 -1
  7. package/lib/src/app/log-list/grid/columns/types.d.ts +1 -1
  8. package/lib/src/app/log-list/grid/columns/types.d.ts.map +1 -1
  9. package/lib/src/app/log-view/LogView.d.ts.map +1 -1
  10. package/lib/src/app/log-view/tabs/RunningNoSamples.d.ts +1 -4
  11. package/lib/src/app/log-view/tabs/RunningNoSamples.d.ts.map +1 -1
  12. package/lib/src/app/log-view/tabs/TaskTab.d.ts.map +1 -1
  13. package/lib/src/app/log-view/title-view/SecondaryBar.d.ts.map +1 -1
  14. package/lib/src/app/routing/url.d.ts.map +1 -1
  15. package/lib/src/app/samples/SamplesTools.d.ts +2 -7
  16. package/lib/src/app/samples/SamplesTools.d.ts.map +1 -1
  17. package/lib/src/app/samples/descriptor/samplesDescriptor.d.ts.map +1 -1
  18. package/lib/src/app/samples/descriptor/score/BooleanScoreDescriptor.d.ts.map +1 -1
  19. package/lib/src/app/samples/descriptor/score/CategoricalScoreDescriptor.d.ts.map +1 -1
  20. package/lib/src/app/samples/descriptor/score/ListScoreDescriptor.d.ts.map +1 -1
  21. package/lib/src/app/samples/descriptor/score/PassFailScoreDescriptor.d.ts.map +1 -1
  22. package/lib/src/app/samples/header-v2/ScorePanel.d.ts.map +1 -1
  23. package/lib/src/app/samples/header-v2/ScoreValueDisplay.d.ts.map +1 -1
  24. package/lib/src/app/samples/header-v2/scoreTone.d.ts.map +1 -1
  25. package/lib/src/app/samples/list/samplesView.converters.d.ts.map +1 -1
  26. package/lib/src/app/samples/sample-tools/sample-filter/SampleFilter.d.ts +1 -4
  27. package/lib/src/app/samples/sample-tools/sample-filter/SampleFilter.d.ts.map +1 -1
  28. package/lib/src/app/samples/sample-tools/sample-filter/completions.d.ts.map +1 -1
  29. package/lib/src/app/shared/samples-grid/colorScale.d.ts.map +1 -1
  30. package/lib/src/app/shared/samples-grid/columns.d.ts.map +1 -1
  31. package/lib/src/app/shared/samples-grid/types.d.ts +1 -1
  32. package/lib/src/app/shared/samples-grid/types.d.ts.map +1 -1
  33. package/lib/src/client/api/index.d.ts.map +1 -1
  34. package/lib/src/client/api/static-http/fetch.d.ts.map +1 -1
  35. package/lib/src/client/api/types.d.ts +4 -4
  36. package/lib/src/client/api/types.d.ts.map +1 -1
  37. package/lib/src/client/api/view-server/api-view-server.d.ts.map +1 -1
  38. package/lib/src/client/api/view-server/request.d.ts +3 -1
  39. package/lib/src/client/api/view-server/request.d.ts.map +1 -1
  40. package/lib/src/client/api/vscode/api-vscode.d.ts.map +1 -1
  41. package/lib/src/client/api/vscode/jsonrpc.d.ts +9 -8
  42. package/lib/src/client/api/vscode/jsonrpc.d.ts.map +1 -1
  43. package/lib/src/client/database/manager.d.ts.map +1 -1
  44. package/lib/src/client/remote/remoteLogFile.d.ts.map +1 -1
  45. package/lib/src/client/remote/zstd-worker.d.ts.map +1 -1
  46. package/lib/src/client/storage/index.d.ts.map +1 -1
  47. package/lib/src/components/FindBand.d.ts +5 -3
  48. package/lib/src/components/FindBand.d.ts.map +1 -1
  49. package/lib/src/components/LargeModal.d.ts +2 -2
  50. package/lib/src/components/LargeModal.d.ts.map +1 -1
  51. package/lib/src/scoring/metrics.d.ts.map +1 -1
  52. package/lib/src/scoring/types.d.ts +1 -1
  53. package/lib/src/scoring/types.d.ts.map +1 -1
  54. package/lib/src/state/appSlice.d.ts +1 -1
  55. package/lib/src/state/appSlice.d.ts.map +1 -1
  56. package/lib/src/state/logSlice.d.ts +1 -1
  57. package/lib/src/state/logSlice.d.ts.map +1 -1
  58. package/lib/src/state/logsSlice.d.ts +4 -4
  59. package/lib/src/state/logsSlice.d.ts.map +1 -1
  60. package/lib/src/state/sampleSlice.d.ts +1 -1
  61. package/lib/src/state/sampleSlice.d.ts.map +1 -1
  62. package/lib/src/state/sampleUtils.d.ts.map +1 -1
  63. package/lib/src/state/sync/replicationService.d.ts.map +1 -1
  64. package/lib/src/utils/format.d.ts +6 -0
  65. package/lib/src/utils/format.d.ts.map +1 -1
  66. package/lib/src/utils/json-worker.d.ts.map +1 -1
  67. package/lib/src/utils/markdown.d.ts.map +1 -1
  68. package/lib/src/utils/react.d.ts +1 -1
  69. package/lib/src/utils/react.d.ts.map +1 -1
  70. package/lib/src/utils/workQueue.d.ts.map +1 -1
  71. package/lib/styles/index.css +17 -0
  72. package/package.json +16 -15
package/lib/index.js CHANGED
@@ -25775,7 +25775,7 @@ function isMapOrSet(value) {
25775
25775
  //#endregion
25776
25776
  //#region ../../node_modules/.pnpm/arquero@8.0.3/node_modules/arquero/src/op/functions/object.js
25777
25777
  var object_exports = /* @__PURE__ */ __exportAll({
25778
- entries: () => entries$1,
25778
+ entries: () => entries$2,
25779
25779
  has: () => has$2,
25780
25780
  keys: () => keys,
25781
25781
  object: () => object,
@@ -25835,7 +25835,7 @@ function values$1(object) {
25835
25835
  * or Set value.
25836
25836
  * @return {[K, V][]} An array of property values.
25837
25837
  */
25838
- function entries$1(object) {
25838
+ function entries$2(object) {
25839
25839
  return isMapOrSet(object) ? array(object.entries()) : object != null ? Object.entries(object) : [];
25840
25840
  }
25841
25841
  /**
@@ -26840,7 +26840,7 @@ function getWindow$1(name) {
26840
26840
  }
26841
26841
  //#endregion
26842
26842
  //#region ../../node_modules/.pnpm/arquero@8.0.3/node_modules/arquero/src/util/entries.js
26843
- function entries(value) {
26843
+ function entries$1(value) {
26844
26844
  return isArray$2(value) ? value : isMap$1(value) ? value.entries() : value ? Object.entries(value) : [];
26845
26845
  }
26846
26846
  var Literal = "Literal";
@@ -27008,7 +27008,7 @@ var ROW_OBJECT = "row_object";
27008
27008
  function rowObjectExpression(node, table, props = table.columnNames()) {
27009
27009
  node.type = ObjectExpression;
27010
27010
  const p = node.properties = [];
27011
- for (const prop of entries(props)) {
27011
+ for (const prop of entries$1(props)) {
27012
27012
  const [name, key] = isArray$2(prop) ? prop : [prop, prop];
27013
27013
  p.push({
27014
27014
  type: Property,
@@ -32891,10 +32891,19 @@ function formatBytes(bytes) {
32891
32891
  //#endregion
32892
32892
  //#region ../../packages/util/src/git.ts
32893
32893
  /**
32894
- * Generates a GitHub commit URL based on the repository origin URL and the commit hash.
32894
+ * Builds a GitHub commit URL from a repository origin and commit hash.
32895
+ *
32896
+ * Accepts the GitHub origin forms that appear in eval `revision.origin`:
32897
+ * https, `ssh://git@github.com/…`, scp `git@github.com:…`, `git://…`, an
32898
+ * optional `git+` prefix, optional credentials, and an optional `.git` suffix.
32899
+ * Returns undefined when the origin is not a GitHub repository URL, so callers
32900
+ * can render the commit as plain text instead of a broken link.
32895
32901
  */
32896
32902
  var ghCommitUrl = (origin, commit) => {
32897
- return `${origin.replace(/\.git$/, "").replace(/^git@github.com:/, "https://github.com/")}/commit/${commit}`;
32903
+ const match = origin.match(/(?:^|[@/])github\.com[/:]([^/]+)\/([^/]+?)(?:\.git)?\/?$/i);
32904
+ if (!match) return;
32905
+ const [, owner, repo] = match;
32906
+ return `https://github.com/${owner}/${repo}/commit/${commit}`;
32898
32907
  };
32899
32908
  //#endregion
32900
32909
  //#region ../../packages/util/src/http.ts
@@ -36844,7 +36853,7 @@ function isTerminatorChar(ch) {
36844
36853
  default: return false;
36845
36854
  }
36846
36855
  }
36847
- function text$3(state, silent) {
36856
+ function text$4(state, silent) {
36848
36857
  let pos = state.pos;
36849
36858
  while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) pos++;
36850
36859
  if (pos === state.pos) return false;
@@ -37499,7 +37508,7 @@ function fragments_join(state) {
37499
37508
  * Tokenizes paragraph content.
37500
37509
  **/
37501
37510
  var _rules = [
37502
- ["text", text$3],
37511
+ ["text", text$4],
37503
37512
  ["linkify", linkify],
37504
37513
  ["newline", newline],
37505
37514
  ["escape", escape],
@@ -38994,7 +39003,7 @@ var getMarkdownInstance = (renderer) => {
38994
39003
  mdInstanceCache[renderer] = md;
38995
39004
  return md;
38996
39005
  };
38997
- var escapeHtmlCharacters = (content) => {
39006
+ var escapeHtmlCharacters$1 = (content) => {
38998
39007
  if (!content) return content;
38999
39008
  return content.replace(/[<>&'"]/g, (c) => {
39000
39009
  switch (c) {
@@ -39081,7 +39090,7 @@ function unescapeCodeHtmlEntities(str) {
39081
39090
  });
39082
39091
  }
39083
39092
  var renderFullPipelineMarkdown = (markdown, renderer) => {
39084
- const preparedForMarkdown = restoreBackslashesForLatex(protectMarkdown(preRenderText(escapeHtmlCharacters(protectBackslashesInLatex(markdown)))));
39093
+ const preparedForMarkdown = restoreBackslashesForLatex(protectMarkdown(preRenderText(escapeHtmlCharacters$1(protectBackslashesInLatex(markdown)))));
39085
39094
  let html = preparedForMarkdown;
39086
39095
  try {
39087
39096
  html = getMarkdownInstance(renderer).render(preparedForMarkdown);
@@ -39097,7 +39106,7 @@ var renderTextOnlyMarkdown = (markdown) => {
39097
39106
  } catch (ex) {
39098
39107
  console.log("Unable to markdown render content");
39099
39108
  console.error(ex);
39100
- return escapeHtmlCharacters(markdown).replace(/\n/g, "<br/>");
39109
+ return escapeHtmlCharacters$1(markdown).replace(/\n/g, "<br/>");
39101
39110
  }
39102
39111
  };
39103
39112
  var markdownRenderers = {
@@ -39107,16 +39116,2310 @@ var markdownRenderers = {
39107
39116
  };
39108
39117
  var renderMarkdown = (markdown, renderer = defaultMarkdownRenderer) => markdownRenderers[renderer](markdown);
39109
39118
  //#endregion
39119
+ //#region ../../node_modules/.pnpm/dompurify@3.4.11/node_modules/dompurify/dist/purify.es.mjs
39120
+ /*! @license DOMPurify 3.4.11 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.11/LICENSE */
39121
+ function _arrayLikeToArray(r, a) {
39122
+ (null == a || a > r.length) && (a = r.length);
39123
+ for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
39124
+ return n;
39125
+ }
39126
+ function _arrayWithHoles(r) {
39127
+ if (Array.isArray(r)) return r;
39128
+ }
39129
+ function _iterableToArrayLimit(r, l) {
39130
+ var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
39131
+ if (null != t) {
39132
+ var e, n, i, u, a = [], f = true, o = false;
39133
+ try {
39134
+ if (i = (t = t.call(r)).next, 0 === l);
39135
+ else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);
39136
+ } catch (r) {
39137
+ o = true, n = r;
39138
+ } finally {
39139
+ try {
39140
+ if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;
39141
+ } finally {
39142
+ if (o) throw n;
39143
+ }
39144
+ }
39145
+ return a;
39146
+ }
39147
+ }
39148
+ function _nonIterableRest() {
39149
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
39150
+ }
39151
+ function _slicedToArray(r, e) {
39152
+ return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();
39153
+ }
39154
+ function _unsupportedIterableToArray(r, a) {
39155
+ if (r) {
39156
+ if ("string" == typeof r) return _arrayLikeToArray(r, a);
39157
+ var t = {}.toString.call(r).slice(8, -1);
39158
+ return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
39159
+ }
39160
+ }
39161
+ var entries = Object.entries, setPrototypeOf = Object.setPrototypeOf, isFrozen$1 = Object.isFrozen, getPrototypeOf$1 = Object.getPrototypeOf, getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
39162
+ var freeze$1 = Object.freeze, seal = Object.seal, create$1 = Object.create;
39163
+ var _ref = typeof Reflect !== "undefined" && Reflect, apply = _ref.apply, construct = _ref.construct;
39164
+ if (!freeze$1) freeze$1 = function freeze(x) {
39165
+ return x;
39166
+ };
39167
+ if (!seal) seal = function seal(x) {
39168
+ return x;
39169
+ };
39170
+ if (!apply) apply = function apply(func, thisArg) {
39171
+ for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) args[_key - 2] = arguments[_key];
39172
+ return func.apply(thisArg, args);
39173
+ };
39174
+ if (!construct) construct = function construct(Func) {
39175
+ for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) args[_key2 - 1] = arguments[_key2];
39176
+ return new Func(...args);
39177
+ };
39178
+ var arrayForEach = unapply(Array.prototype.forEach);
39179
+ var arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);
39180
+ var arrayPop = unapply(Array.prototype.pop);
39181
+ var arrayPush = unapply(Array.prototype.push);
39182
+ var arraySplice = unapply(Array.prototype.splice);
39183
+ var arrayIsArray = Array.isArray;
39184
+ var stringToLowerCase = unapply(String.prototype.toLowerCase);
39185
+ var stringToString = unapply(String.prototype.toString);
39186
+ var stringMatch = unapply(String.prototype.match);
39187
+ var stringReplace = unapply(String.prototype.replace);
39188
+ var stringIndexOf = unapply(String.prototype.indexOf);
39189
+ var stringTrim = unapply(String.prototype.trim);
39190
+ var numberToString = unapply(Number.prototype.toString);
39191
+ var booleanToString = unapply(Boolean.prototype.toString);
39192
+ var bigintToString = typeof BigInt === "undefined" ? null : unapply(BigInt.prototype.toString);
39193
+ var symbolToString = typeof Symbol === "undefined" ? null : unapply(Symbol.prototype.toString);
39194
+ var objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);
39195
+ var objectToString = unapply(Object.prototype.toString);
39196
+ var regExpTest = unapply(RegExp.prototype.test);
39197
+ var typeErrorCreate = unconstruct(TypeError);
39198
+ /**
39199
+ * Creates a new function that calls the given function with a specified thisArg and arguments.
39200
+ *
39201
+ * @param func - The function to be wrapped and called.
39202
+ * @returns A new function that calls the given function with a specified thisArg and arguments.
39203
+ */
39204
+ function unapply(func) {
39205
+ return function(thisArg) {
39206
+ if (thisArg instanceof RegExp) thisArg.lastIndex = 0;
39207
+ for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) args[_key3 - 1] = arguments[_key3];
39208
+ return apply(func, thisArg, args);
39209
+ };
39210
+ }
39211
+ /**
39212
+ * Creates a new function that constructs an instance of the given constructor function with the provided arguments.
39213
+ *
39214
+ * @param func - The constructor function to be wrapped and called.
39215
+ * @returns A new function that constructs an instance of the given constructor function with the provided arguments.
39216
+ */
39217
+ function unconstruct(Func) {
39218
+ return function() {
39219
+ for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) args[_key4] = arguments[_key4];
39220
+ return construct(Func, args);
39221
+ };
39222
+ }
39223
+ /**
39224
+ * Add properties to a lookup table
39225
+ *
39226
+ * @param set - The set to which elements will be added.
39227
+ * @param array - The array containing elements to be added to the set.
39228
+ * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.
39229
+ * @returns The modified set with added elements.
39230
+ */
39231
+ function addToSet(set, array) {
39232
+ let transformCaseFunc = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : stringToLowerCase;
39233
+ if (setPrototypeOf) setPrototypeOf(set, null);
39234
+ if (!arrayIsArray(array)) return set;
39235
+ let l = array.length;
39236
+ while (l--) {
39237
+ let element = array[l];
39238
+ if (typeof element === "string") {
39239
+ const lcElement = transformCaseFunc(element);
39240
+ if (lcElement !== element) {
39241
+ if (!isFrozen$1(array)) array[l] = lcElement;
39242
+ element = lcElement;
39243
+ }
39244
+ }
39245
+ set[element] = true;
39246
+ }
39247
+ return set;
39248
+ }
39249
+ /**
39250
+ * Clean up an array to harden against CSPP
39251
+ *
39252
+ * @param array - The array to be cleaned.
39253
+ * @returns The cleaned version of the array
39254
+ */
39255
+ function cleanArray(array) {
39256
+ for (let index = 0; index < array.length; index++) if (!objectHasOwnProperty(array, index)) array[index] = null;
39257
+ return array;
39258
+ }
39259
+ /**
39260
+ * Shallow clone an object
39261
+ *
39262
+ * @param object - The object to be cloned.
39263
+ * @returns A new object that copies the original.
39264
+ */
39265
+ function clone$1(object) {
39266
+ const newObject = create$1(null);
39267
+ for (const _ref2 of entries(object)) {
39268
+ var _ref3 = _slicedToArray(_ref2, 2);
39269
+ const property = _ref3[0];
39270
+ const value = _ref3[1];
39271
+ if (objectHasOwnProperty(object, property)) if (arrayIsArray(value)) newObject[property] = cleanArray(value);
39272
+ else if (value && typeof value === "object" && value.constructor === Object) newObject[property] = clone$1(value);
39273
+ else newObject[property] = value;
39274
+ }
39275
+ return newObject;
39276
+ }
39277
+ /**
39278
+ * Convert non-node values into strings without depending on direct property access.
39279
+ *
39280
+ * @param value - The value to stringify.
39281
+ * @returns A string representation of the provided value.
39282
+ */
39283
+ function stringifyValue$1(value) {
39284
+ switch (typeof value) {
39285
+ case "string": return value;
39286
+ case "number": return numberToString(value);
39287
+ case "boolean": return booleanToString(value);
39288
+ case "bigint": return bigintToString ? bigintToString(value) : "0";
39289
+ case "symbol": return symbolToString ? symbolToString(value) : "Symbol()";
39290
+ case "undefined": return objectToString(value);
39291
+ case "function":
39292
+ case "object": {
39293
+ if (value === null) return objectToString(value);
39294
+ const valueAsRecord = value;
39295
+ const valueToString = lookupGetter(valueAsRecord, "toString");
39296
+ if (typeof valueToString === "function") {
39297
+ const stringified = valueToString(valueAsRecord);
39298
+ return typeof stringified === "string" ? stringified : objectToString(stringified);
39299
+ }
39300
+ return objectToString(value);
39301
+ }
39302
+ default: return objectToString(value);
39303
+ }
39304
+ }
39305
+ /**
39306
+ * This method automatically checks if the prop is function or getter and behaves accordingly.
39307
+ *
39308
+ * @param object - The object to look up the getter function in its prototype chain.
39309
+ * @param prop - The property name for which to find the getter function.
39310
+ * @returns The getter function found in the prototype chain or a fallback function.
39311
+ */
39312
+ function lookupGetter(object, prop) {
39313
+ while (object !== null) {
39314
+ const desc = getOwnPropertyDescriptor(object, prop);
39315
+ if (desc) {
39316
+ if (desc.get) return unapply(desc.get);
39317
+ if (typeof desc.value === "function") return unapply(desc.value);
39318
+ }
39319
+ object = getPrototypeOf$1(object);
39320
+ }
39321
+ function fallbackValue() {
39322
+ return null;
39323
+ }
39324
+ return fallbackValue;
39325
+ }
39326
+ function isRegex(value) {
39327
+ try {
39328
+ regExpTest(value, "");
39329
+ return true;
39330
+ } catch (_unused) {
39331
+ return false;
39332
+ }
39333
+ }
39334
+ var html$1 = freeze$1([
39335
+ "a",
39336
+ "abbr",
39337
+ "acronym",
39338
+ "address",
39339
+ "area",
39340
+ "article",
39341
+ "aside",
39342
+ "audio",
39343
+ "b",
39344
+ "bdi",
39345
+ "bdo",
39346
+ "big",
39347
+ "blink",
39348
+ "blockquote",
39349
+ "body",
39350
+ "br",
39351
+ "button",
39352
+ "canvas",
39353
+ "caption",
39354
+ "center",
39355
+ "cite",
39356
+ "code",
39357
+ "col",
39358
+ "colgroup",
39359
+ "content",
39360
+ "data",
39361
+ "datalist",
39362
+ "dd",
39363
+ "decorator",
39364
+ "del",
39365
+ "details",
39366
+ "dfn",
39367
+ "dialog",
39368
+ "dir",
39369
+ "div",
39370
+ "dl",
39371
+ "dt",
39372
+ "element",
39373
+ "em",
39374
+ "fieldset",
39375
+ "figcaption",
39376
+ "figure",
39377
+ "font",
39378
+ "footer",
39379
+ "form",
39380
+ "h1",
39381
+ "h2",
39382
+ "h3",
39383
+ "h4",
39384
+ "h5",
39385
+ "h6",
39386
+ "head",
39387
+ "header",
39388
+ "hgroup",
39389
+ "hr",
39390
+ "html",
39391
+ "i",
39392
+ "img",
39393
+ "input",
39394
+ "ins",
39395
+ "kbd",
39396
+ "label",
39397
+ "legend",
39398
+ "li",
39399
+ "main",
39400
+ "map",
39401
+ "mark",
39402
+ "marquee",
39403
+ "menu",
39404
+ "menuitem",
39405
+ "meter",
39406
+ "nav",
39407
+ "nobr",
39408
+ "ol",
39409
+ "optgroup",
39410
+ "option",
39411
+ "output",
39412
+ "p",
39413
+ "picture",
39414
+ "pre",
39415
+ "progress",
39416
+ "q",
39417
+ "rp",
39418
+ "rt",
39419
+ "ruby",
39420
+ "s",
39421
+ "samp",
39422
+ "search",
39423
+ "section",
39424
+ "select",
39425
+ "shadow",
39426
+ "slot",
39427
+ "small",
39428
+ "source",
39429
+ "spacer",
39430
+ "span",
39431
+ "strike",
39432
+ "strong",
39433
+ "style",
39434
+ "sub",
39435
+ "summary",
39436
+ "sup",
39437
+ "table",
39438
+ "tbody",
39439
+ "td",
39440
+ "template",
39441
+ "textarea",
39442
+ "tfoot",
39443
+ "th",
39444
+ "thead",
39445
+ "time",
39446
+ "tr",
39447
+ "track",
39448
+ "tt",
39449
+ "u",
39450
+ "ul",
39451
+ "var",
39452
+ "video",
39453
+ "wbr"
39454
+ ]);
39455
+ var svg$1 = freeze$1([
39456
+ "svg",
39457
+ "a",
39458
+ "altglyph",
39459
+ "altglyphdef",
39460
+ "altglyphitem",
39461
+ "animatecolor",
39462
+ "animatemotion",
39463
+ "animatetransform",
39464
+ "circle",
39465
+ "clippath",
39466
+ "defs",
39467
+ "desc",
39468
+ "ellipse",
39469
+ "enterkeyhint",
39470
+ "exportparts",
39471
+ "filter",
39472
+ "font",
39473
+ "g",
39474
+ "glyph",
39475
+ "glyphref",
39476
+ "hkern",
39477
+ "image",
39478
+ "inputmode",
39479
+ "line",
39480
+ "lineargradient",
39481
+ "marker",
39482
+ "mask",
39483
+ "metadata",
39484
+ "mpath",
39485
+ "part",
39486
+ "path",
39487
+ "pattern",
39488
+ "polygon",
39489
+ "polyline",
39490
+ "radialgradient",
39491
+ "rect",
39492
+ "stop",
39493
+ "style",
39494
+ "switch",
39495
+ "symbol",
39496
+ "text",
39497
+ "textpath",
39498
+ "title",
39499
+ "tref",
39500
+ "tspan",
39501
+ "view",
39502
+ "vkern"
39503
+ ]);
39504
+ var svgFilters = freeze$1([
39505
+ "feBlend",
39506
+ "feColorMatrix",
39507
+ "feComponentTransfer",
39508
+ "feComposite",
39509
+ "feConvolveMatrix",
39510
+ "feDiffuseLighting",
39511
+ "feDisplacementMap",
39512
+ "feDistantLight",
39513
+ "feDropShadow",
39514
+ "feFlood",
39515
+ "feFuncA",
39516
+ "feFuncB",
39517
+ "feFuncG",
39518
+ "feFuncR",
39519
+ "feGaussianBlur",
39520
+ "feImage",
39521
+ "feMerge",
39522
+ "feMergeNode",
39523
+ "feMorphology",
39524
+ "feOffset",
39525
+ "fePointLight",
39526
+ "feSpecularLighting",
39527
+ "feSpotLight",
39528
+ "feTile",
39529
+ "feTurbulence"
39530
+ ]);
39531
+ var svgDisallowed = freeze$1([
39532
+ "animate",
39533
+ "color-profile",
39534
+ "cursor",
39535
+ "discard",
39536
+ "font-face",
39537
+ "font-face-format",
39538
+ "font-face-name",
39539
+ "font-face-src",
39540
+ "font-face-uri",
39541
+ "foreignobject",
39542
+ "hatch",
39543
+ "hatchpath",
39544
+ "mesh",
39545
+ "meshgradient",
39546
+ "meshpatch",
39547
+ "meshrow",
39548
+ "missing-glyph",
39549
+ "script",
39550
+ "set",
39551
+ "solidcolor",
39552
+ "unknown",
39553
+ "use"
39554
+ ]);
39555
+ var mathMl$1 = freeze$1([
39556
+ "math",
39557
+ "menclose",
39558
+ "merror",
39559
+ "mfenced",
39560
+ "mfrac",
39561
+ "mglyph",
39562
+ "mi",
39563
+ "mlabeledtr",
39564
+ "mmultiscripts",
39565
+ "mn",
39566
+ "mo",
39567
+ "mover",
39568
+ "mpadded",
39569
+ "mphantom",
39570
+ "mroot",
39571
+ "mrow",
39572
+ "ms",
39573
+ "mspace",
39574
+ "msqrt",
39575
+ "mstyle",
39576
+ "msub",
39577
+ "msup",
39578
+ "msubsup",
39579
+ "mtable",
39580
+ "mtd",
39581
+ "mtext",
39582
+ "mtr",
39583
+ "munder",
39584
+ "munderover",
39585
+ "mprescripts"
39586
+ ]);
39587
+ var mathMlDisallowed = freeze$1([
39588
+ "maction",
39589
+ "maligngroup",
39590
+ "malignmark",
39591
+ "mlongdiv",
39592
+ "mscarries",
39593
+ "mscarry",
39594
+ "msgroup",
39595
+ "mstack",
39596
+ "msline",
39597
+ "msrow",
39598
+ "semantics",
39599
+ "annotation",
39600
+ "annotation-xml",
39601
+ "mprescripts",
39602
+ "none"
39603
+ ]);
39604
+ var text$3 = freeze$1(["#text"]);
39605
+ var html = freeze$1([
39606
+ "accept",
39607
+ "action",
39608
+ "align",
39609
+ "alt",
39610
+ "autocapitalize",
39611
+ "autocomplete",
39612
+ "autopictureinpicture",
39613
+ "autoplay",
39614
+ "background",
39615
+ "bgcolor",
39616
+ "border",
39617
+ "capture",
39618
+ "cellpadding",
39619
+ "cellspacing",
39620
+ "checked",
39621
+ "cite",
39622
+ "class",
39623
+ "clear",
39624
+ "color",
39625
+ "cols",
39626
+ "colspan",
39627
+ "command",
39628
+ "commandfor",
39629
+ "controls",
39630
+ "controlslist",
39631
+ "coords",
39632
+ "crossorigin",
39633
+ "datetime",
39634
+ "decoding",
39635
+ "default",
39636
+ "dir",
39637
+ "disabled",
39638
+ "disablepictureinpicture",
39639
+ "disableremoteplayback",
39640
+ "download",
39641
+ "draggable",
39642
+ "enctype",
39643
+ "enterkeyhint",
39644
+ "exportparts",
39645
+ "face",
39646
+ "for",
39647
+ "headers",
39648
+ "height",
39649
+ "hidden",
39650
+ "high",
39651
+ "href",
39652
+ "hreflang",
39653
+ "id",
39654
+ "inert",
39655
+ "inputmode",
39656
+ "integrity",
39657
+ "ismap",
39658
+ "kind",
39659
+ "label",
39660
+ "lang",
39661
+ "list",
39662
+ "loading",
39663
+ "loop",
39664
+ "low",
39665
+ "max",
39666
+ "maxlength",
39667
+ "media",
39668
+ "method",
39669
+ "min",
39670
+ "minlength",
39671
+ "multiple",
39672
+ "muted",
39673
+ "name",
39674
+ "nonce",
39675
+ "noshade",
39676
+ "novalidate",
39677
+ "nowrap",
39678
+ "open",
39679
+ "optimum",
39680
+ "part",
39681
+ "pattern",
39682
+ "placeholder",
39683
+ "playsinline",
39684
+ "popover",
39685
+ "popovertarget",
39686
+ "popovertargetaction",
39687
+ "poster",
39688
+ "preload",
39689
+ "pubdate",
39690
+ "radiogroup",
39691
+ "readonly",
39692
+ "rel",
39693
+ "required",
39694
+ "rev",
39695
+ "reversed",
39696
+ "role",
39697
+ "rows",
39698
+ "rowspan",
39699
+ "spellcheck",
39700
+ "scope",
39701
+ "selected",
39702
+ "shape",
39703
+ "size",
39704
+ "sizes",
39705
+ "slot",
39706
+ "span",
39707
+ "srclang",
39708
+ "start",
39709
+ "src",
39710
+ "srcset",
39711
+ "step",
39712
+ "style",
39713
+ "summary",
39714
+ "tabindex",
39715
+ "title",
39716
+ "translate",
39717
+ "type",
39718
+ "usemap",
39719
+ "valign",
39720
+ "value",
39721
+ "width",
39722
+ "wrap",
39723
+ "xmlns"
39724
+ ]);
39725
+ var svg$2 = freeze$1([
39726
+ "accent-height",
39727
+ "accumulate",
39728
+ "additive",
39729
+ "alignment-baseline",
39730
+ "amplitude",
39731
+ "ascent",
39732
+ "attributename",
39733
+ "attributetype",
39734
+ "azimuth",
39735
+ "basefrequency",
39736
+ "baseline-shift",
39737
+ "begin",
39738
+ "bias",
39739
+ "by",
39740
+ "class",
39741
+ "clip",
39742
+ "clippathunits",
39743
+ "clip-path",
39744
+ "clip-rule",
39745
+ "color",
39746
+ "color-interpolation",
39747
+ "color-interpolation-filters",
39748
+ "color-profile",
39749
+ "color-rendering",
39750
+ "cx",
39751
+ "cy",
39752
+ "d",
39753
+ "dx",
39754
+ "dy",
39755
+ "diffuseconstant",
39756
+ "direction",
39757
+ "display",
39758
+ "divisor",
39759
+ "dur",
39760
+ "edgemode",
39761
+ "elevation",
39762
+ "end",
39763
+ "exponent",
39764
+ "fill",
39765
+ "fill-opacity",
39766
+ "fill-rule",
39767
+ "filter",
39768
+ "filterunits",
39769
+ "flood-color",
39770
+ "flood-opacity",
39771
+ "font-family",
39772
+ "font-size",
39773
+ "font-size-adjust",
39774
+ "font-stretch",
39775
+ "font-style",
39776
+ "font-variant",
39777
+ "font-weight",
39778
+ "fx",
39779
+ "fy",
39780
+ "g1",
39781
+ "g2",
39782
+ "glyph-name",
39783
+ "glyphref",
39784
+ "gradientunits",
39785
+ "gradienttransform",
39786
+ "height",
39787
+ "href",
39788
+ "id",
39789
+ "image-rendering",
39790
+ "in",
39791
+ "in2",
39792
+ "intercept",
39793
+ "k",
39794
+ "k1",
39795
+ "k2",
39796
+ "k3",
39797
+ "k4",
39798
+ "kerning",
39799
+ "keypoints",
39800
+ "keysplines",
39801
+ "keytimes",
39802
+ "lang",
39803
+ "lengthadjust",
39804
+ "letter-spacing",
39805
+ "kernelmatrix",
39806
+ "kernelunitlength",
39807
+ "lighting-color",
39808
+ "local",
39809
+ "marker-end",
39810
+ "marker-mid",
39811
+ "marker-start",
39812
+ "markerheight",
39813
+ "markerunits",
39814
+ "markerwidth",
39815
+ "maskcontentunits",
39816
+ "maskunits",
39817
+ "max",
39818
+ "mask",
39819
+ "mask-type",
39820
+ "media",
39821
+ "method",
39822
+ "mode",
39823
+ "min",
39824
+ "name",
39825
+ "numoctaves",
39826
+ "offset",
39827
+ "operator",
39828
+ "opacity",
39829
+ "order",
39830
+ "orient",
39831
+ "orientation",
39832
+ "origin",
39833
+ "overflow",
39834
+ "paint-order",
39835
+ "path",
39836
+ "pathlength",
39837
+ "patterncontentunits",
39838
+ "patterntransform",
39839
+ "patternunits",
39840
+ "points",
39841
+ "preservealpha",
39842
+ "preserveaspectratio",
39843
+ "primitiveunits",
39844
+ "r",
39845
+ "rx",
39846
+ "ry",
39847
+ "radius",
39848
+ "refx",
39849
+ "refy",
39850
+ "repeatcount",
39851
+ "repeatdur",
39852
+ "restart",
39853
+ "result",
39854
+ "rotate",
39855
+ "scale",
39856
+ "seed",
39857
+ "shape-rendering",
39858
+ "slope",
39859
+ "specularconstant",
39860
+ "specularexponent",
39861
+ "spreadmethod",
39862
+ "startoffset",
39863
+ "stddeviation",
39864
+ "stitchtiles",
39865
+ "stop-color",
39866
+ "stop-opacity",
39867
+ "stroke-dasharray",
39868
+ "stroke-dashoffset",
39869
+ "stroke-linecap",
39870
+ "stroke-linejoin",
39871
+ "stroke-miterlimit",
39872
+ "stroke-opacity",
39873
+ "stroke",
39874
+ "stroke-width",
39875
+ "style",
39876
+ "surfacescale",
39877
+ "systemlanguage",
39878
+ "tabindex",
39879
+ "tablevalues",
39880
+ "targetx",
39881
+ "targety",
39882
+ "transform",
39883
+ "transform-origin",
39884
+ "text-anchor",
39885
+ "text-decoration",
39886
+ "text-rendering",
39887
+ "textlength",
39888
+ "type",
39889
+ "u1",
39890
+ "u2",
39891
+ "unicode",
39892
+ "values",
39893
+ "viewbox",
39894
+ "visibility",
39895
+ "version",
39896
+ "vert-adv-y",
39897
+ "vert-origin-x",
39898
+ "vert-origin-y",
39899
+ "width",
39900
+ "word-spacing",
39901
+ "wrap",
39902
+ "writing-mode",
39903
+ "xchannelselector",
39904
+ "ychannelselector",
39905
+ "x",
39906
+ "x1",
39907
+ "x2",
39908
+ "xmlns",
39909
+ "y",
39910
+ "y1",
39911
+ "y2",
39912
+ "z",
39913
+ "zoomandpan"
39914
+ ]);
39915
+ var mathMl = freeze$1([
39916
+ "accent",
39917
+ "accentunder",
39918
+ "align",
39919
+ "bevelled",
39920
+ "close",
39921
+ "columnalign",
39922
+ "columnlines",
39923
+ "columnspacing",
39924
+ "columnspan",
39925
+ "denomalign",
39926
+ "depth",
39927
+ "dir",
39928
+ "display",
39929
+ "displaystyle",
39930
+ "encoding",
39931
+ "fence",
39932
+ "frame",
39933
+ "height",
39934
+ "href",
39935
+ "id",
39936
+ "largeop",
39937
+ "length",
39938
+ "linethickness",
39939
+ "lquote",
39940
+ "lspace",
39941
+ "mathbackground",
39942
+ "mathcolor",
39943
+ "mathsize",
39944
+ "mathvariant",
39945
+ "maxsize",
39946
+ "minsize",
39947
+ "movablelimits",
39948
+ "notation",
39949
+ "numalign",
39950
+ "open",
39951
+ "rowalign",
39952
+ "rowlines",
39953
+ "rowspacing",
39954
+ "rowspan",
39955
+ "rspace",
39956
+ "rquote",
39957
+ "scriptlevel",
39958
+ "scriptminsize",
39959
+ "scriptsizemultiplier",
39960
+ "selection",
39961
+ "separator",
39962
+ "separators",
39963
+ "stretchy",
39964
+ "subscriptshift",
39965
+ "supscriptshift",
39966
+ "symmetric",
39967
+ "voffset",
39968
+ "width",
39969
+ "xmlns"
39970
+ ]);
39971
+ var xml = freeze$1([
39972
+ "xlink:href",
39973
+ "xml:id",
39974
+ "xlink:title",
39975
+ "xml:space",
39976
+ "xmlns:xlink"
39977
+ ]);
39978
+ var MUSTACHE_EXPR = seal(/{{[\w\W]*|^[\w\W]*}}/g);
39979
+ var ERB_EXPR = seal(/<%[\w\W]*|^[\w\W]*%>/g);
39980
+ var TMPLIT_EXPR = seal(/\${[\w\W]*/g);
39981
+ var DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]+$/);
39982
+ var ARIA_ATTR = seal(/^aria-[\-\w]+$/);
39983
+ var IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i);
39984
+ var IS_SCRIPT_OR_DATA = seal(/^(?:\w+script|data):/i);
39985
+ var ATTR_WHITESPACE = seal(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g);
39986
+ var DOCTYPE_NAME = seal(/^html$/i);
39987
+ var CUSTOM_ELEMENT = seal(/^[a-z][.\w]*(-[.\w]+)+$/i);
39988
+ var ELEMENT_MARKUP_PROBE = seal(/<[/\w!]/g);
39989
+ var COMMENT_MARKUP_PROBE = seal(/<[/\w]/g);
39990
+ var FALLBACK_TAG_CLOSE = seal(/<\/no(script|embed|frames)/i);
39991
+ var SELF_CLOSING_TAG = seal(/\/>/i);
39992
+ var NODE_TYPE = {
39993
+ element: 1,
39994
+ attribute: 2,
39995
+ text: 3,
39996
+ cdataSection: 4,
39997
+ entityReference: 5,
39998
+ entityNode: 6,
39999
+ processingInstruction: 7,
40000
+ comment: 8,
40001
+ document: 9,
40002
+ documentType: 10,
40003
+ documentFragment: 11,
40004
+ notation: 12
40005
+ };
40006
+ var getGlobal = function getGlobal() {
40007
+ return typeof window === "undefined" ? null : window;
40008
+ };
40009
+ /**
40010
+ * Creates a no-op policy for internal use only.
40011
+ * Don't export this function outside this module!
40012
+ * @param trustedTypes The policy factory.
40013
+ * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).
40014
+ * @return The policy created (or null, if Trusted Types
40015
+ * are not supported or creating the policy failed).
40016
+ */
40017
+ var _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {
40018
+ if (typeof trustedTypes !== "object" || typeof trustedTypes.createPolicy !== "function") return null;
40019
+ let suffix = null;
40020
+ const ATTR_NAME = "data-tt-policy-suffix";
40021
+ if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) suffix = purifyHostElement.getAttribute(ATTR_NAME);
40022
+ const policyName = "dompurify" + (suffix ? "#" + suffix : "");
40023
+ try {
40024
+ return trustedTypes.createPolicy(policyName, {
40025
+ createHTML(html) {
40026
+ return html;
40027
+ },
40028
+ createScriptURL(scriptUrl) {
40029
+ return scriptUrl;
40030
+ }
40031
+ });
40032
+ } catch (_) {
40033
+ console.warn("TrustedTypes policy " + policyName + " could not be created.");
40034
+ return null;
40035
+ }
40036
+ };
40037
+ var _createHooksMap = function _createHooksMap() {
40038
+ return {
40039
+ afterSanitizeAttributes: [],
40040
+ afterSanitizeElements: [],
40041
+ afterSanitizeShadowDOM: [],
40042
+ beforeSanitizeAttributes: [],
40043
+ beforeSanitizeElements: [],
40044
+ beforeSanitizeShadowDOM: [],
40045
+ uponSanitizeAttribute: [],
40046
+ uponSanitizeElement: [],
40047
+ uponSanitizeShadowNode: []
40048
+ };
40049
+ };
40050
+ /**
40051
+ * Resolve a set-valued configuration option: a fresh set built from
40052
+ * cfg[key] when it is an own array property (seeded with a clone of
40053
+ * options.base when given, case-normalized via options.transform),
40054
+ * the fallback set otherwise.
40055
+ *
40056
+ * @param cfg the cloned, prototype-free configuration object
40057
+ * @param key the configuration property to read
40058
+ * @param fallback the set to use when the option is absent or not an array
40059
+ * @param options transform and optional base set to merge into
40060
+ * @returns the resolved set
40061
+ */
40062
+ var _resolveSetOption = function _resolveSetOption(cfg, key, fallback, options) {
40063
+ return objectHasOwnProperty(cfg, key) && arrayIsArray(cfg[key]) ? addToSet(options.base ? clone$1(options.base) : {}, cfg[key], options.transform) : fallback;
40064
+ };
40065
+ function createDOMPurify() {
40066
+ let window = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : getGlobal();
40067
+ const DOMPurify = (root) => createDOMPurify(root);
40068
+ DOMPurify.version = "3.4.11";
40069
+ DOMPurify.removed = [];
40070
+ if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {
40071
+ DOMPurify.isSupported = false;
40072
+ return DOMPurify;
40073
+ }
40074
+ let document = window.document;
40075
+ const originalDocument = document;
40076
+ const currentScript = originalDocument.currentScript;
40077
+ window.DocumentFragment;
40078
+ const HTMLTemplateElement = window.HTMLTemplateElement, Node = window.Node, Element = window.Element, NodeFilter = window.NodeFilter;
40079
+ window.NamedNodeMap === void 0 && (window.NamedNodeMap || window.MozNamedAttrMap);
40080
+ window.HTMLFormElement;
40081
+ const DOMParser = window.DOMParser, trustedTypes = window.trustedTypes;
40082
+ const ElementPrototype = Element.prototype;
40083
+ const cloneNode = lookupGetter(ElementPrototype, "cloneNode");
40084
+ const remove = lookupGetter(ElementPrototype, "remove");
40085
+ const getNextSibling = lookupGetter(ElementPrototype, "nextSibling");
40086
+ const getChildNodes = lookupGetter(ElementPrototype, "childNodes");
40087
+ const getParentNode = lookupGetter(ElementPrototype, "parentNode");
40088
+ const getShadowRoot = lookupGetter(ElementPrototype, "shadowRoot");
40089
+ const getAttributes = lookupGetter(ElementPrototype, "attributes");
40090
+ const getNodeType = Node && Node.prototype ? lookupGetter(Node.prototype, "nodeType") : null;
40091
+ const getNodeName = Node && Node.prototype ? lookupGetter(Node.prototype, "nodeName") : null;
40092
+ if (typeof HTMLTemplateElement === "function") {
40093
+ const template = document.createElement("template");
40094
+ if (template.content && template.content.ownerDocument) document = template.content.ownerDocument;
40095
+ }
40096
+ let trustedTypesPolicy;
40097
+ let emptyHTML = "";
40098
+ let defaultTrustedTypesPolicy;
40099
+ let defaultTrustedTypesPolicyResolved = false;
40100
+ let IN_TRUSTED_TYPES_POLICY = 0;
40101
+ const _assertNotInTrustedTypesPolicy = function _assertNotInTrustedTypesPolicy() {
40102
+ if (IN_TRUSTED_TYPES_POLICY > 0) throw typeErrorCreate("A configured TRUSTED_TYPES_POLICY callback (createHTML or createScriptURL) must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose callbacks wrap DOMPurify as TRUSTED_TYPES_POLICY; see the \"DOMPurify and Trusted Types\" section of the README.");
40103
+ };
40104
+ const _createTrustedHTML = function _createTrustedHTML(html) {
40105
+ _assertNotInTrustedTypesPolicy();
40106
+ IN_TRUSTED_TYPES_POLICY++;
40107
+ try {
40108
+ return trustedTypesPolicy.createHTML(html);
40109
+ } finally {
40110
+ IN_TRUSTED_TYPES_POLICY--;
40111
+ }
40112
+ };
40113
+ const _createTrustedScriptURL = function _createTrustedScriptURL(scriptUrl) {
40114
+ _assertNotInTrustedTypesPolicy();
40115
+ IN_TRUSTED_TYPES_POLICY++;
40116
+ try {
40117
+ return trustedTypesPolicy.createScriptURL(scriptUrl);
40118
+ } finally {
40119
+ IN_TRUSTED_TYPES_POLICY--;
40120
+ }
40121
+ };
40122
+ const _getDefaultTrustedTypesPolicy = function _getDefaultTrustedTypesPolicy() {
40123
+ if (!defaultTrustedTypesPolicyResolved) {
40124
+ defaultTrustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);
40125
+ defaultTrustedTypesPolicyResolved = true;
40126
+ }
40127
+ return defaultTrustedTypesPolicy;
40128
+ };
40129
+ const _document = document, implementation = _document.implementation, createNodeIterator = _document.createNodeIterator, createDocumentFragment = _document.createDocumentFragment, getElementsByTagName = _document.getElementsByTagName;
40130
+ const importNode = originalDocument.importNode;
40131
+ let hooks = _createHooksMap();
40132
+ /**
40133
+ * Expose whether this browser supports running the full DOMPurify.
40134
+ */
40135
+ DOMPurify.isSupported = typeof entries === "function" && typeof getParentNode === "function" && implementation && implementation.createHTMLDocument !== void 0;
40136
+ const MUSTACHE_EXPR$1 = MUSTACHE_EXPR, ERB_EXPR$1 = ERB_EXPR, TMPLIT_EXPR$1 = TMPLIT_EXPR, DATA_ATTR$1 = DATA_ATTR, ARIA_ATTR$1 = ARIA_ATTR, IS_SCRIPT_OR_DATA$1 = IS_SCRIPT_OR_DATA, ATTR_WHITESPACE$1 = ATTR_WHITESPACE, CUSTOM_ELEMENT$1 = CUSTOM_ELEMENT;
40137
+ let IS_ALLOWED_URI$1 = IS_ALLOWED_URI;
40138
+ /**
40139
+ * We consider the elements and attributes below to be safe. Ideally
40140
+ * don't add any new ones but feel free to remove unwanted ones.
40141
+ */
40142
+ let ALLOWED_TAGS = null;
40143
+ const DEFAULT_ALLOWED_TAGS = addToSet({}, [
40144
+ ...html$1,
40145
+ ...svg$1,
40146
+ ...svgFilters,
40147
+ ...mathMl$1,
40148
+ ...text$3
40149
+ ]);
40150
+ let ALLOWED_ATTR = null;
40151
+ const DEFAULT_ALLOWED_ATTR = addToSet({}, [
40152
+ ...html,
40153
+ ...svg$2,
40154
+ ...mathMl,
40155
+ ...xml
40156
+ ]);
40157
+ let CUSTOM_ELEMENT_HANDLING = Object.seal(create$1(null, {
40158
+ tagNameCheck: {
40159
+ writable: true,
40160
+ configurable: false,
40161
+ enumerable: true,
40162
+ value: null
40163
+ },
40164
+ attributeNameCheck: {
40165
+ writable: true,
40166
+ configurable: false,
40167
+ enumerable: true,
40168
+ value: null
40169
+ },
40170
+ allowCustomizedBuiltInElements: {
40171
+ writable: true,
40172
+ configurable: false,
40173
+ enumerable: true,
40174
+ value: false
40175
+ }
40176
+ }));
40177
+ let FORBID_TAGS = null;
40178
+ let FORBID_ATTR = null;
40179
+ const EXTRA_ELEMENT_HANDLING = Object.seal(create$1(null, {
40180
+ tagCheck: {
40181
+ writable: true,
40182
+ configurable: false,
40183
+ enumerable: true,
40184
+ value: null
40185
+ },
40186
+ attributeCheck: {
40187
+ writable: true,
40188
+ configurable: false,
40189
+ enumerable: true,
40190
+ value: null
40191
+ }
40192
+ }));
40193
+ let ALLOW_ARIA_ATTR = true;
40194
+ let ALLOW_DATA_ATTR = true;
40195
+ let ALLOW_UNKNOWN_PROTOCOLS = false;
40196
+ let ALLOW_SELF_CLOSE_IN_ATTR = true;
40197
+ let SAFE_FOR_TEMPLATES = false;
40198
+ let SAFE_FOR_XML = true;
40199
+ let WHOLE_DOCUMENT = false;
40200
+ let SET_CONFIG = false;
40201
+ let SET_CONFIG_ALLOWED_TAGS = null;
40202
+ let SET_CONFIG_ALLOWED_ATTR = null;
40203
+ let FORCE_BODY = false;
40204
+ let RETURN_DOM = false;
40205
+ let RETURN_DOM_FRAGMENT = false;
40206
+ let RETURN_TRUSTED_TYPE = false;
40207
+ let SANITIZE_DOM = true;
40208
+ let SANITIZE_NAMED_PROPS = false;
40209
+ const SANITIZE_NAMED_PROPS_PREFIX = "user-content-";
40210
+ let KEEP_CONTENT = true;
40211
+ let IN_PLACE = false;
40212
+ let USE_PROFILES = {};
40213
+ let FORBID_CONTENTS = null;
40214
+ const DEFAULT_FORBID_CONTENTS = addToSet({}, [
40215
+ "annotation-xml",
40216
+ "audio",
40217
+ "colgroup",
40218
+ "desc",
40219
+ "foreignobject",
40220
+ "head",
40221
+ "iframe",
40222
+ "math",
40223
+ "mi",
40224
+ "mn",
40225
+ "mo",
40226
+ "ms",
40227
+ "mtext",
40228
+ "noembed",
40229
+ "noframes",
40230
+ "noscript",
40231
+ "plaintext",
40232
+ "script",
40233
+ "selectedcontent",
40234
+ "style",
40235
+ "svg",
40236
+ "template",
40237
+ "thead",
40238
+ "title",
40239
+ "video",
40240
+ "xmp"
40241
+ ]);
40242
+ let DATA_URI_TAGS = null;
40243
+ const DEFAULT_DATA_URI_TAGS = addToSet({}, [
40244
+ "audio",
40245
+ "video",
40246
+ "img",
40247
+ "source",
40248
+ "image",
40249
+ "track"
40250
+ ]);
40251
+ let URI_SAFE_ATTRIBUTES = null;
40252
+ const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, [
40253
+ "alt",
40254
+ "class",
40255
+ "for",
40256
+ "id",
40257
+ "label",
40258
+ "name",
40259
+ "pattern",
40260
+ "placeholder",
40261
+ "role",
40262
+ "summary",
40263
+ "title",
40264
+ "value",
40265
+ "style",
40266
+ "xmlns"
40267
+ ]);
40268
+ const MATHML_NAMESPACE = "http://www.w3.org/1998/Math/MathML";
40269
+ const SVG_NAMESPACE = "http://www.w3.org/2000/svg";
40270
+ const HTML_NAMESPACE = "http://www.w3.org/1999/xhtml";
40271
+ let NAMESPACE = HTML_NAMESPACE;
40272
+ let IS_EMPTY_INPUT = false;
40273
+ let ALLOWED_NAMESPACES = null;
40274
+ const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [
40275
+ MATHML_NAMESPACE,
40276
+ SVG_NAMESPACE,
40277
+ HTML_NAMESPACE
40278
+ ], stringToString);
40279
+ const DEFAULT_MATHML_TEXT_INTEGRATION_POINTS = freeze$1([
40280
+ "mi",
40281
+ "mo",
40282
+ "mn",
40283
+ "ms",
40284
+ "mtext"
40285
+ ]);
40286
+ let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, DEFAULT_MATHML_TEXT_INTEGRATION_POINTS);
40287
+ const DEFAULT_HTML_INTEGRATION_POINTS = freeze$1(["annotation-xml"]);
40288
+ let HTML_INTEGRATION_POINTS = addToSet({}, DEFAULT_HTML_INTEGRATION_POINTS);
40289
+ const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, [
40290
+ "title",
40291
+ "style",
40292
+ "font",
40293
+ "a",
40294
+ "script"
40295
+ ]);
40296
+ let PARSER_MEDIA_TYPE = null;
40297
+ const SUPPORTED_PARSER_MEDIA_TYPES = ["application/xhtml+xml", "text/html"];
40298
+ const DEFAULT_PARSER_MEDIA_TYPE = "text/html";
40299
+ let transformCaseFunc = null;
40300
+ let CONFIG = null;
40301
+ const formElement = document.createElement("form");
40302
+ const isRegexOrFunction = function isRegexOrFunction(testValue) {
40303
+ return testValue instanceof RegExp || testValue instanceof Function;
40304
+ };
40305
+ /**
40306
+ * _parseConfig
40307
+ *
40308
+ * @param cfg optional config literal
40309
+ */
40310
+ const _parseConfig = function _parseConfig() {
40311
+ let cfg = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
40312
+ if (CONFIG && CONFIG === cfg) return;
40313
+ if (!cfg || typeof cfg !== "object") cfg = {};
40314
+ cfg = clone$1(cfg);
40315
+ PARSER_MEDIA_TYPE = SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;
40316
+ transformCaseFunc = PARSER_MEDIA_TYPE === "application/xhtml+xml" ? stringToString : stringToLowerCase;
40317
+ ALLOWED_TAGS = _resolveSetOption(cfg, "ALLOWED_TAGS", DEFAULT_ALLOWED_TAGS, { transform: transformCaseFunc });
40318
+ ALLOWED_ATTR = _resolveSetOption(cfg, "ALLOWED_ATTR", DEFAULT_ALLOWED_ATTR, { transform: transformCaseFunc });
40319
+ ALLOWED_NAMESPACES = _resolveSetOption(cfg, "ALLOWED_NAMESPACES", DEFAULT_ALLOWED_NAMESPACES, { transform: stringToString });
40320
+ URI_SAFE_ATTRIBUTES = _resolveSetOption(cfg, "ADD_URI_SAFE_ATTR", DEFAULT_URI_SAFE_ATTRIBUTES, {
40321
+ transform: transformCaseFunc,
40322
+ base: DEFAULT_URI_SAFE_ATTRIBUTES
40323
+ });
40324
+ DATA_URI_TAGS = _resolveSetOption(cfg, "ADD_DATA_URI_TAGS", DEFAULT_DATA_URI_TAGS, {
40325
+ transform: transformCaseFunc,
40326
+ base: DEFAULT_DATA_URI_TAGS
40327
+ });
40328
+ FORBID_CONTENTS = _resolveSetOption(cfg, "FORBID_CONTENTS", DEFAULT_FORBID_CONTENTS, { transform: transformCaseFunc });
40329
+ FORBID_TAGS = _resolveSetOption(cfg, "FORBID_TAGS", clone$1({}), { transform: transformCaseFunc });
40330
+ FORBID_ATTR = _resolveSetOption(cfg, "FORBID_ATTR", clone$1({}), { transform: transformCaseFunc });
40331
+ USE_PROFILES = objectHasOwnProperty(cfg, "USE_PROFILES") ? cfg.USE_PROFILES && typeof cfg.USE_PROFILES === "object" ? clone$1(cfg.USE_PROFILES) : cfg.USE_PROFILES : false;
40332
+ ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false;
40333
+ ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false;
40334
+ ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false;
40335
+ ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false;
40336
+ SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false;
40337
+ SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false;
40338
+ WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false;
40339
+ RETURN_DOM = cfg.RETURN_DOM || false;
40340
+ RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false;
40341
+ RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false;
40342
+ FORCE_BODY = cfg.FORCE_BODY || false;
40343
+ SANITIZE_DOM = cfg.SANITIZE_DOM !== false;
40344
+ SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false;
40345
+ KEEP_CONTENT = cfg.KEEP_CONTENT !== false;
40346
+ IN_PLACE = cfg.IN_PLACE || false;
40347
+ IS_ALLOWED_URI$1 = isRegex(cfg.ALLOWED_URI_REGEXP) ? cfg.ALLOWED_URI_REGEXP : IS_ALLOWED_URI;
40348
+ NAMESPACE = typeof cfg.NAMESPACE === "string" ? cfg.NAMESPACE : HTML_NAMESPACE;
40349
+ MATHML_TEXT_INTEGRATION_POINTS = objectHasOwnProperty(cfg, "MATHML_TEXT_INTEGRATION_POINTS") && cfg.MATHML_TEXT_INTEGRATION_POINTS && typeof cfg.MATHML_TEXT_INTEGRATION_POINTS === "object" ? clone$1(cfg.MATHML_TEXT_INTEGRATION_POINTS) : addToSet({}, DEFAULT_MATHML_TEXT_INTEGRATION_POINTS);
40350
+ HTML_INTEGRATION_POINTS = objectHasOwnProperty(cfg, "HTML_INTEGRATION_POINTS") && cfg.HTML_INTEGRATION_POINTS && typeof cfg.HTML_INTEGRATION_POINTS === "object" ? clone$1(cfg.HTML_INTEGRATION_POINTS) : addToSet({}, DEFAULT_HTML_INTEGRATION_POINTS);
40351
+ const customElementHandling = objectHasOwnProperty(cfg, "CUSTOM_ELEMENT_HANDLING") && cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING === "object" ? clone$1(cfg.CUSTOM_ELEMENT_HANDLING) : create$1(null);
40352
+ CUSTOM_ELEMENT_HANDLING = create$1(null);
40353
+ if (objectHasOwnProperty(customElementHandling, "tagNameCheck") && isRegexOrFunction(customElementHandling.tagNameCheck)) CUSTOM_ELEMENT_HANDLING.tagNameCheck = customElementHandling.tagNameCheck;
40354
+ if (objectHasOwnProperty(customElementHandling, "attributeNameCheck") && isRegexOrFunction(customElementHandling.attributeNameCheck)) CUSTOM_ELEMENT_HANDLING.attributeNameCheck = customElementHandling.attributeNameCheck;
40355
+ if (objectHasOwnProperty(customElementHandling, "allowCustomizedBuiltInElements") && typeof customElementHandling.allowCustomizedBuiltInElements === "boolean") CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = customElementHandling.allowCustomizedBuiltInElements;
40356
+ seal(CUSTOM_ELEMENT_HANDLING);
40357
+ if (SAFE_FOR_TEMPLATES) ALLOW_DATA_ATTR = false;
40358
+ if (RETURN_DOM_FRAGMENT) RETURN_DOM = true;
40359
+ if (USE_PROFILES) {
40360
+ ALLOWED_TAGS = addToSet({}, text$3);
40361
+ ALLOWED_ATTR = create$1(null);
40362
+ if (USE_PROFILES.html === true) {
40363
+ addToSet(ALLOWED_TAGS, html$1);
40364
+ addToSet(ALLOWED_ATTR, html);
40365
+ }
40366
+ if (USE_PROFILES.svg === true) {
40367
+ addToSet(ALLOWED_TAGS, svg$1);
40368
+ addToSet(ALLOWED_ATTR, svg$2);
40369
+ addToSet(ALLOWED_ATTR, xml);
40370
+ }
40371
+ if (USE_PROFILES.svgFilters === true) {
40372
+ addToSet(ALLOWED_TAGS, svgFilters);
40373
+ addToSet(ALLOWED_ATTR, svg$2);
40374
+ addToSet(ALLOWED_ATTR, xml);
40375
+ }
40376
+ if (USE_PROFILES.mathMl === true) {
40377
+ addToSet(ALLOWED_TAGS, mathMl$1);
40378
+ addToSet(ALLOWED_ATTR, mathMl);
40379
+ addToSet(ALLOWED_ATTR, xml);
40380
+ }
40381
+ }
40382
+ EXTRA_ELEMENT_HANDLING.tagCheck = null;
40383
+ EXTRA_ELEMENT_HANDLING.attributeCheck = null;
40384
+ if (objectHasOwnProperty(cfg, "ADD_TAGS")) {
40385
+ if (typeof cfg.ADD_TAGS === "function") EXTRA_ELEMENT_HANDLING.tagCheck = cfg.ADD_TAGS;
40386
+ else if (arrayIsArray(cfg.ADD_TAGS)) {
40387
+ if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) ALLOWED_TAGS = clone$1(ALLOWED_TAGS);
40388
+ addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);
40389
+ }
40390
+ }
40391
+ if (objectHasOwnProperty(cfg, "ADD_ATTR")) {
40392
+ if (typeof cfg.ADD_ATTR === "function") EXTRA_ELEMENT_HANDLING.attributeCheck = cfg.ADD_ATTR;
40393
+ else if (arrayIsArray(cfg.ADD_ATTR)) {
40394
+ if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) ALLOWED_ATTR = clone$1(ALLOWED_ATTR);
40395
+ addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);
40396
+ }
40397
+ }
40398
+ if (objectHasOwnProperty(cfg, "ADD_URI_SAFE_ATTR") && arrayIsArray(cfg.ADD_URI_SAFE_ATTR)) addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);
40399
+ if (objectHasOwnProperty(cfg, "FORBID_CONTENTS") && arrayIsArray(cfg.FORBID_CONTENTS)) {
40400
+ if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) FORBID_CONTENTS = clone$1(FORBID_CONTENTS);
40401
+ addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);
40402
+ }
40403
+ if (objectHasOwnProperty(cfg, "ADD_FORBID_CONTENTS") && arrayIsArray(cfg.ADD_FORBID_CONTENTS)) {
40404
+ if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) FORBID_CONTENTS = clone$1(FORBID_CONTENTS);
40405
+ addToSet(FORBID_CONTENTS, cfg.ADD_FORBID_CONTENTS, transformCaseFunc);
40406
+ }
40407
+ if (KEEP_CONTENT) ALLOWED_TAGS["#text"] = true;
40408
+ if (WHOLE_DOCUMENT) addToSet(ALLOWED_TAGS, [
40409
+ "html",
40410
+ "head",
40411
+ "body"
40412
+ ]);
40413
+ if (ALLOWED_TAGS.table) {
40414
+ addToSet(ALLOWED_TAGS, ["tbody"]);
40415
+ delete FORBID_TAGS.tbody;
40416
+ }
40417
+ if (cfg.TRUSTED_TYPES_POLICY) {
40418
+ if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== "function") throw typeErrorCreate("TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.");
40419
+ if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== "function") throw typeErrorCreate("TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.");
40420
+ const previousTrustedTypesPolicy = trustedTypesPolicy;
40421
+ trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;
40422
+ try {
40423
+ emptyHTML = _createTrustedHTML("");
40424
+ } catch (error) {
40425
+ trustedTypesPolicy = previousTrustedTypesPolicy;
40426
+ throw error;
40427
+ }
40428
+ } else if (cfg.TRUSTED_TYPES_POLICY === null) {
40429
+ trustedTypesPolicy = void 0;
40430
+ emptyHTML = "";
40431
+ } else {
40432
+ if (trustedTypesPolicy === void 0) trustedTypesPolicy = _getDefaultTrustedTypesPolicy();
40433
+ if (trustedTypesPolicy && typeof emptyHTML === "string") emptyHTML = _createTrustedHTML("");
40434
+ }
40435
+ if (freeze$1) freeze$1(cfg);
40436
+ CONFIG = cfg;
40437
+ };
40438
+ const ALL_SVG_TAGS = addToSet({}, [
40439
+ ...svg$1,
40440
+ ...svgFilters,
40441
+ ...svgDisallowed
40442
+ ]);
40443
+ const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);
40444
+ /**
40445
+ * Namespace rules for an element in the SVG namespace.
40446
+ *
40447
+ * @param tagName the element's lowercase tag name
40448
+ * @param parent the (possibly simulated) parent node
40449
+ * @param parentTagName the parent's lowercase tag name
40450
+ * @returns true if a spec-compliant parser could produce this element
40451
+ */
40452
+ const _checkSvgNamespace = function _checkSvgNamespace(tagName, parent, parentTagName) {
40453
+ if (parent.namespaceURI === HTML_NAMESPACE) return tagName === "svg";
40454
+ if (parent.namespaceURI === MATHML_NAMESPACE) return tagName === "svg" && (parentTagName === "annotation-xml" || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);
40455
+ return Boolean(ALL_SVG_TAGS[tagName]);
40456
+ };
40457
+ /**
40458
+ * Namespace rules for an element in the MathML namespace.
40459
+ *
40460
+ * @param tagName the element's lowercase tag name
40461
+ * @param parent the (possibly simulated) parent node
40462
+ * @param parentTagName the parent's lowercase tag name
40463
+ * @returns true if a spec-compliant parser could produce this element
40464
+ */
40465
+ const _checkMathMlNamespace = function _checkMathMlNamespace(tagName, parent, parentTagName) {
40466
+ if (parent.namespaceURI === HTML_NAMESPACE) return tagName === "math";
40467
+ if (parent.namespaceURI === SVG_NAMESPACE) return tagName === "math" && HTML_INTEGRATION_POINTS[parentTagName];
40468
+ return Boolean(ALL_MATHML_TAGS[tagName]);
40469
+ };
40470
+ /**
40471
+ * Namespace rules for an element in the HTML namespace.
40472
+ *
40473
+ * @param tagName the element's lowercase tag name
40474
+ * @param parent the (possibly simulated) parent node
40475
+ * @param parentTagName the parent's lowercase tag name
40476
+ * @returns true if a spec-compliant parser could produce this element
40477
+ */
40478
+ const _checkHtmlNamespace = function _checkHtmlNamespace(tagName, parent, parentTagName) {
40479
+ if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) return false;
40480
+ if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) return false;
40481
+ return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);
40482
+ };
40483
+ /**
40484
+ * @param element a DOM element whose namespace is being checked
40485
+ * @returns Return false if the element has a
40486
+ * namespace that a spec-compliant parser would never
40487
+ * return. Return true otherwise.
40488
+ */
40489
+ const _checkValidNamespace = function _checkValidNamespace(element) {
40490
+ let parent = getParentNode(element);
40491
+ if (!parent || !parent.tagName) parent = {
40492
+ namespaceURI: NAMESPACE,
40493
+ tagName: "template"
40494
+ };
40495
+ const tagName = stringToLowerCase(element.tagName);
40496
+ const parentTagName = stringToLowerCase(parent.tagName);
40497
+ if (!ALLOWED_NAMESPACES[element.namespaceURI]) return false;
40498
+ if (element.namespaceURI === SVG_NAMESPACE) return _checkSvgNamespace(tagName, parent, parentTagName);
40499
+ if (element.namespaceURI === MATHML_NAMESPACE) return _checkMathMlNamespace(tagName, parent, parentTagName);
40500
+ if (element.namespaceURI === HTML_NAMESPACE) return _checkHtmlNamespace(tagName, parent, parentTagName);
40501
+ if (PARSER_MEDIA_TYPE === "application/xhtml+xml" && ALLOWED_NAMESPACES[element.namespaceURI]) return true;
40502
+ return false;
40503
+ };
40504
+ /**
40505
+ * _forceRemove
40506
+ *
40507
+ * @param node a DOM node
40508
+ */
40509
+ const _forceRemove = function _forceRemove(node) {
40510
+ arrayPush(DOMPurify.removed, { element: node });
40511
+ try {
40512
+ getParentNode(node).removeChild(node);
40513
+ } catch (_) {
40514
+ remove(node);
40515
+ if (!getParentNode(node)) throw typeErrorCreate("a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place");
40516
+ }
40517
+ };
40518
+ /**
40519
+ * _neutralizeRoot
40520
+ *
40521
+ * Fail-closed teardown of an in-place root after the sanitize walk aborts
40522
+ * (campaign-3 F2). An internal throw mid-walk — e.g. a page-registered
40523
+ * custom element's reaction detaches a node so `_forceRemove`'s deliberate
40524
+ * parentless guard throws, or any other re-entrant engine mutation — would
40525
+ * otherwise leave the caller's *live* tree half-sanitized, with everything
40526
+ * after the abort point still carrying its handlers. There is no safe way
40527
+ * to resume the walk (the tree mutated under us), so we strip the root bare:
40528
+ * remove every child and every attribute, then let the caller's catch see
40529
+ * the original error. Clobber-safe (cached `remove`/`childNodes`/`attributes`
40530
+ * getters; the root was already clobber-pre-flighted at the IN_PLACE entry).
40531
+ *
40532
+ * @param root the in-place root to empty
40533
+ */
40534
+ const _neutralizeRoot = function _neutralizeRoot(root) {
40535
+ const childNodes = getChildNodes(root);
40536
+ if (childNodes) {
40537
+ const snapshot = [];
40538
+ arrayForEach(childNodes, (child) => {
40539
+ arrayPush(snapshot, child);
40540
+ });
40541
+ arrayForEach(snapshot, (child) => {
40542
+ try {
40543
+ remove(child);
40544
+ } catch (_) {}
40545
+ });
40546
+ }
40547
+ const attributes = getAttributes(root);
40548
+ if (attributes) for (let i = attributes.length - 1; i >= 0; --i) {
40549
+ const attribute = attributes[i];
40550
+ const name = attribute && attribute.name;
40551
+ if (typeof name === "string") try {
40552
+ root.removeAttribute(name);
40553
+ } catch (_) {}
40554
+ }
40555
+ };
40556
+ /**
40557
+ * _removeAttribute
40558
+ *
40559
+ * @param name an Attribute name
40560
+ * @param element a DOM node
40561
+ */
40562
+ const _removeAttribute = function _removeAttribute(name, element) {
40563
+ try {
40564
+ arrayPush(DOMPurify.removed, {
40565
+ attribute: element.getAttributeNode(name),
40566
+ from: element
40567
+ });
40568
+ } catch (_) {
40569
+ arrayPush(DOMPurify.removed, {
40570
+ attribute: null,
40571
+ from: element
40572
+ });
40573
+ }
40574
+ element.removeAttribute(name);
40575
+ if (name === "is") if (RETURN_DOM || RETURN_DOM_FRAGMENT) try {
40576
+ _forceRemove(element);
40577
+ } catch (_) {}
40578
+ else try {
40579
+ element.setAttribute(name, "");
40580
+ } catch (_) {}
40581
+ };
40582
+ /**
40583
+ * _stripDisallowedAttributes
40584
+ *
40585
+ * Removes every attribute the active configuration does not allow from a
40586
+ * single element, using the same allowlist as the main attribute pass (so
40587
+ * `on*` handlers go, but no `/^on/` blocklist is introduced). Used only to
40588
+ * neutralise nodes that are being discarded from an in-place tree.
40589
+ *
40590
+ * @param element the element to strip
40591
+ */
40592
+ const _stripDisallowedAttributes = function _stripDisallowedAttributes(element) {
40593
+ const attributes = getAttributes(element);
40594
+ if (!attributes) return;
40595
+ for (let i = attributes.length - 1; i >= 0; --i) {
40596
+ const attribute = attributes[i];
40597
+ const name = attribute && attribute.name;
40598
+ if (typeof name !== "string" || ALLOWED_ATTR[transformCaseFunc(name)]) continue;
40599
+ try {
40600
+ element.removeAttribute(name);
40601
+ } catch (_) {}
40602
+ }
40603
+ };
40604
+ /**
40605
+ * _neutralizeSubtree
40606
+ *
40607
+ * Completes the audit-5 F1 fix across every removal path. The KEEP_CONTENT
40608
+ * move-hoist neutralises only disallowed-tag removals; clobber, mXSS-canary,
40609
+ * namespace, comment, processing-instruction and KEEP_CONTENT:false removals
40610
+ * all drop their subtree wholesale via `_forceRemove`. On the IN_PLACE path
40611
+ * those dropped nodes are detached from the caller's LIVE tree but a
40612
+ * handler-bearing original among them (an `<img onerror>`/`<video>` that was
40613
+ * loading) keeps its queued resource event, which fires in page scope after
40614
+ * sanitize returns. This walks a removed subtree and strips every attribute
40615
+ * the active configuration does not allow — so `on*` handlers are cancelled
40616
+ * through the SAME allowlist that governs kept nodes, not a separate `/^on/`
40617
+ * blocklist. Run synchronously before sanitize returns, i.e. before any
40618
+ * queued event can fire. Hook-free by design: these nodes leave the output,
40619
+ * so firing attribute hooks for them would be surprising. Clobber-safe reads;
40620
+ * a doomed clobbered node may shadow `removeAttribute` (its own attributes are
40621
+ * irrelevant — it is discarded — while its non-clobbered descendants, e.g.
40622
+ * the `<img>`, are reached and scrubbed).
40623
+ *
40624
+ * @param root the root of a removed subtree to neutralise
40625
+ */
40626
+ const _neutralizeSubtree = function _neutralizeSubtree(root) {
40627
+ const stack = [root];
40628
+ while (stack.length > 0) {
40629
+ const node = stack.pop();
40630
+ if ((getNodeType ? getNodeType(node) : node.nodeType) === NODE_TYPE.element) _stripDisallowedAttributes(node);
40631
+ const childNodes = getChildNodes(node);
40632
+ if (childNodes) for (let i = childNodes.length - 1; i >= 0; --i) stack.push(childNodes[i]);
40633
+ }
40634
+ };
40635
+ /**
40636
+ * _initDocument
40637
+ *
40638
+ * @param dirty - a string of dirty markup
40639
+ * @return a DOM, filled with the dirty markup
40640
+ */
40641
+ const _initDocument = function _initDocument(dirty) {
40642
+ let doc = null;
40643
+ let leadingWhitespace = null;
40644
+ if (FORCE_BODY) dirty = "<remove></remove>" + dirty;
40645
+ else {
40646
+ const matches = stringMatch(dirty, /^[\r\n\t ]+/);
40647
+ leadingWhitespace = matches && matches[0];
40648
+ }
40649
+ if (PARSER_MEDIA_TYPE === "application/xhtml+xml" && NAMESPACE === HTML_NAMESPACE) dirty = "<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>" + dirty + "</body></html>";
40650
+ const dirtyPayload = trustedTypesPolicy ? _createTrustedHTML(dirty) : dirty;
40651
+ if (NAMESPACE === HTML_NAMESPACE) try {
40652
+ doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);
40653
+ } catch (_) {}
40654
+ if (!doc || !doc.documentElement) {
40655
+ doc = implementation.createDocument(NAMESPACE, "template", null);
40656
+ try {
40657
+ doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;
40658
+ } catch (_) {}
40659
+ }
40660
+ const body = doc.body || doc.documentElement;
40661
+ if (dirty && leadingWhitespace) body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);
40662
+ if (NAMESPACE === HTML_NAMESPACE) return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? "html" : "body")[0];
40663
+ return WHOLE_DOCUMENT ? doc.documentElement : body;
40664
+ };
40665
+ /**
40666
+ * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.
40667
+ *
40668
+ * @param root The root element or node to start traversing on.
40669
+ * @return The created NodeIterator
40670
+ */
40671
+ const _createNodeIterator = function _createNodeIterator(root) {
40672
+ return createNodeIterator.call(root.ownerDocument || root, root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);
40673
+ };
40674
+ /**
40675
+ * Replace template expression syntax (mustache, ERB, template
40676
+ * literal) with a space; shared by all SAFE_FOR_TEMPLATES scrub
40677
+ * sites. Order matters: mustache, then ERB, then template literal.
40678
+ *
40679
+ * @param value the string to scrub
40680
+ * @returns the scrubbed string
40681
+ */
40682
+ const _stripTemplateExpressions = function _stripTemplateExpressions(value) {
40683
+ value = stringReplace(value, MUSTACHE_EXPR$1, " ");
40684
+ value = stringReplace(value, ERB_EXPR$1, " ");
40685
+ value = stringReplace(value, TMPLIT_EXPR$1, " ");
40686
+ return value;
40687
+ };
40688
+ /**
40689
+ * Strip template-engine expressions ({{...}}, ${...}, <%...%>) from the
40690
+ * character data of an element subtree. Used as the final safety net for
40691
+ * SAFE_FOR_TEMPLATES on every DOM-returning code path so that expressions
40692
+ * which only form after text-node normalization (e.g. fragments split across
40693
+ * stripped elements) cannot survive into a template-evaluating framework.
40694
+ *
40695
+ * Walks text/comment/CDATA/processing-instruction nodes and mutates `.data`
40696
+ * in place rather than round-tripping through innerHTML. This preserves
40697
+ * descendant node references (important for IN_PLACE callers), avoids a
40698
+ * serialize/reparse cycle, and reads literal character data — which means
40699
+ * `<%...%>` in text content matches the ERB regex against its real bytes
40700
+ * instead of the HTML-entity-escaped form innerHTML would produce.
40701
+ *
40702
+ * Attribute values are not visited here; SAFE_FOR_TEMPLATES handling for
40703
+ * attributes is performed during the per-node `_sanitizeAttributes` pass.
40704
+ *
40705
+ * @param node The root element whose character data should be scrubbed.
40706
+ */
40707
+ const _scrubTemplateExpressions2 = function _scrubTemplateExpressions(node) {
40708
+ var _node$querySelectorAl;
40709
+ node.normalize();
40710
+ const walker = createNodeIterator.call(node.ownerDocument || node, node, NodeFilter.SHOW_TEXT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_CDATA_SECTION | NodeFilter.SHOW_PROCESSING_INSTRUCTION, null);
40711
+ let currentNode = walker.nextNode();
40712
+ while (currentNode) {
40713
+ currentNode.data = _stripTemplateExpressions(currentNode.data);
40714
+ currentNode = walker.nextNode();
40715
+ }
40716
+ const templates = (_node$querySelectorAl = node.querySelectorAll) === null || _node$querySelectorAl === void 0 ? void 0 : _node$querySelectorAl.call(node, "template");
40717
+ if (templates) arrayForEach(templates, (tmpl) => {
40718
+ if (_isDocumentFragment(tmpl.content)) _scrubTemplateExpressions2(tmpl.content);
40719
+ });
40720
+ };
40721
+ /**
40722
+ * _isClobbered
40723
+ *
40724
+ * Detect DOM-clobbering on HTMLFormElement nodes. Form is the only HTML
40725
+ * interface with [LegacyOverrideBuiltIns]; a descendant element with a
40726
+ * `name` attribute matching a prototype property shadows that property
40727
+ * on direct reads. We use this check at the IN_PLACE entry-point and
40728
+ * during attribute sanitization to refuse clobbered forms.
40729
+ *
40730
+ * @param element element to check for clobbering attacks
40731
+ * @return true if clobbered, false if safe
40732
+ */
40733
+ const _isClobbered = function _isClobbered(element) {
40734
+ const realTagName = getNodeName ? getNodeName(element) : null;
40735
+ if (typeof realTagName !== "string") return false;
40736
+ if (transformCaseFunc(realTagName) !== "form") return false;
40737
+ return typeof element.nodeName !== "string" || typeof element.textContent !== "string" || typeof element.removeChild !== "function" || element.attributes !== getAttributes(element) || typeof element.removeAttribute !== "function" || typeof element.setAttribute !== "function" || typeof element.namespaceURI !== "string" || typeof element.insertBefore !== "function" || typeof element.hasChildNodes !== "function" || element.nodeType !== getNodeType(element) || element.childNodes !== getChildNodes(element);
40738
+ };
40739
+ /**
40740
+ * Checks whether the given value is a DocumentFragment from any realm.
40741
+ *
40742
+ * The realm-independent replacement reads `nodeType` through the cached
40743
+ * Node.prototype getter and compares to the DOCUMENT_FRAGMENT_NODE
40744
+ * constant (11). nodeType is a numeric value resolved from the node's
40745
+ * internal slot, identical across realms for the same kind of node.
40746
+ *
40747
+ * @param value object to check
40748
+ * @return true if value is a DocumentFragment-shaped node from any realm
40749
+ */
40750
+ const _isDocumentFragment = function _isDocumentFragment(value) {
40751
+ if (!getNodeType || typeof value !== "object" || value === null) return false;
40752
+ try {
40753
+ return getNodeType(value) === NODE_TYPE.documentFragment;
40754
+ } catch (_) {
40755
+ return false;
40756
+ }
40757
+ };
40758
+ /**
40759
+ * Checks whether the given object is a DOM node, including nodes that
40760
+ * originate from a different window/realm (e.g. an iframe's
40761
+ * contentDocument). The previous `value instanceof Node` check was
40762
+ * realm-bound: nodes from a different window failed it, causing
40763
+ * sanitize() to silently stringify them and reset IN_PLACE to false,
40764
+ * returning the original node unsanitized. See GHSA-4w3q-35jp-p934.
40765
+ *
40766
+ * @param value object to check whether it's a DOM node
40767
+ * @return true if value is a DOM node from any realm
40768
+ */
40769
+ const _isNode = function _isNode(value) {
40770
+ if (!getNodeType || typeof value !== "object" || value === null) return false;
40771
+ try {
40772
+ return typeof getNodeType(value) === "number";
40773
+ } catch (_) {
40774
+ return false;
40775
+ }
40776
+ };
40777
+ function _executeHooks(hooks, currentNode, data) {
40778
+ if (hooks.length === 0) return;
40779
+ arrayForEach(hooks, (hook) => {
40780
+ hook.call(DOMPurify, currentNode, data, CONFIG);
40781
+ });
40782
+ }
40783
+ /**
40784
+ * Structural-threat checks that condemn a node regardless of the
40785
+ * allowlists: mXSS via namespace confusion, risky CSS construction,
40786
+ * processing instructions, markup-bearing comments. Pure predicate;
40787
+ * the caller removes. Check order is load-bearing.
40788
+ *
40789
+ * @param currentNode the node to inspect
40790
+ * @param tagName the node's transformCaseFunc'd tag name
40791
+ * @return true if the node must be removed
40792
+ */
40793
+ const _isUnsafeNode = function _isUnsafeNode(currentNode, tagName) {
40794
+ if (SAFE_FOR_XML && currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(ELEMENT_MARKUP_PROBE, currentNode.textContent) && regExpTest(ELEMENT_MARKUP_PROBE, currentNode.innerHTML)) return true;
40795
+ if (SAFE_FOR_XML && currentNode.namespaceURI === HTML_NAMESPACE && tagName === "style" && _isNode(currentNode.firstElementChild)) return true;
40796
+ if (currentNode.nodeType === NODE_TYPE.processingInstruction) return true;
40797
+ if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(COMMENT_MARKUP_PROBE, currentNode.data)) return true;
40798
+ return false;
40799
+ };
40800
+ /**
40801
+ * Handle a node whose tag is forbidden or not allowlisted: keep
40802
+ * allowed custom elements (false return exits _sanitizeElements
40803
+ * early - namespace/fallback checks and the afterSanitizeElements
40804
+ * hook are intentionally skipped for kept custom elements), else
40805
+ * hoist content per KEEP_CONTENT and remove.
40806
+ *
40807
+ * @param currentNode the disallowed node
40808
+ * @param tagName the node's transformCaseFunc'd tag name
40809
+ * @return true if the node was removed, false if kept
40810
+ */
40811
+ const _sanitizeDisallowedNode = function _sanitizeDisallowedNode(currentNode, tagName) {
40812
+ if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {
40813
+ if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) return false;
40814
+ if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) return false;
40815
+ }
40816
+ if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {
40817
+ const parentNode = getParentNode(currentNode);
40818
+ const childNodes = getChildNodes(currentNode);
40819
+ if (childNodes && parentNode) {
40820
+ const childCount = childNodes.length;
40821
+ for (let i = childCount - 1; i >= 0; --i) {
40822
+ const hoisted = IN_PLACE ? childNodes[i] : cloneNode(childNodes[i], true);
40823
+ parentNode.insertBefore(hoisted, getNextSibling(currentNode));
40824
+ }
40825
+ }
40826
+ }
40827
+ _forceRemove(currentNode);
40828
+ return true;
40829
+ };
40830
+ /**
40831
+ * _sanitizeElements
40832
+ *
40833
+ * @protect nodeName
40834
+ * @protect textContent
40835
+ * @protect removeChild
40836
+ * @param currentNode to check for permission to exist
40837
+ * @return true if node was killed, false if left alive
40838
+ */
40839
+ const _sanitizeElements = function _sanitizeElements(currentNode) {
40840
+ _executeHooks(hooks.beforeSanitizeElements, currentNode, null);
40841
+ if (_isClobbered(currentNode)) {
40842
+ _forceRemove(currentNode);
40843
+ return true;
40844
+ }
40845
+ const tagName = transformCaseFunc(getNodeName ? getNodeName(currentNode) : currentNode.nodeName);
40846
+ _executeHooks(hooks.uponSanitizeElement, currentNode, {
40847
+ tagName,
40848
+ allowedTags: ALLOWED_TAGS
40849
+ });
40850
+ if (_isUnsafeNode(currentNode, tagName)) {
40851
+ _forceRemove(currentNode);
40852
+ return true;
40853
+ }
40854
+ if (FORBID_TAGS[tagName] || !(EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function && EXTRA_ELEMENT_HANDLING.tagCheck(tagName)) && !ALLOWED_TAGS[tagName]) return _sanitizeDisallowedNode(currentNode, tagName);
40855
+ if ((getNodeType ? getNodeType(currentNode) : currentNode.nodeType) === NODE_TYPE.element && !_checkValidNamespace(currentNode)) {
40856
+ _forceRemove(currentNode);
40857
+ return true;
40858
+ }
40859
+ if ((tagName === "noscript" || tagName === "noembed" || tagName === "noframes") && regExpTest(FALLBACK_TAG_CLOSE, currentNode.innerHTML)) {
40860
+ _forceRemove(currentNode);
40861
+ return true;
40862
+ }
40863
+ if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {
40864
+ const content = _stripTemplateExpressions(currentNode.textContent);
40865
+ if (currentNode.textContent !== content) {
40866
+ arrayPush(DOMPurify.removed, { element: currentNode.cloneNode() });
40867
+ currentNode.textContent = content;
40868
+ }
40869
+ }
40870
+ _executeHooks(hooks.afterSanitizeElements, currentNode, null);
40871
+ return false;
40872
+ };
40873
+ /**
40874
+ * _isValidAttribute
40875
+ *
40876
+ * @param lcTag Lowercase tag name of containing element.
40877
+ * @param lcName Lowercase attribute name.
40878
+ * @param value Attribute value.
40879
+ * @return Returns true if `value` is valid, otherwise false.
40880
+ */
40881
+ const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {
40882
+ if (FORBID_ATTR[lcName]) return false;
40883
+ if (SANITIZE_DOM && (lcName === "id" || lcName === "name") && (value in document || value in formElement)) return false;
40884
+ const nameIsPermitted = ALLOWED_ATTR[lcName] || EXTRA_ELEMENT_HANDLING.attributeCheck instanceof Function && EXTRA_ELEMENT_HANDLING.attributeCheck(lcName, lcTag);
40885
+ if (ALLOW_DATA_ATTR && regExpTest(DATA_ATTR$1, lcName));
40886
+ else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR$1, lcName));
40887
+ else if (!nameIsPermitted) if (_isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName, lcTag)) || lcName === "is" && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value)));
40888
+ else return false;
40889
+ else if (URI_SAFE_ATTRIBUTES[lcName]);
40890
+ else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE$1, "")));
40891
+ else if ((lcName === "src" || lcName === "xlink:href" || lcName === "href") && lcTag !== "script" && stringIndexOf(value, "data:") === 0 && DATA_URI_TAGS[lcTag]);
40892
+ else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA$1, stringReplace(value, ATTR_WHITESPACE$1, "")));
40893
+ else if (value) return false;
40894
+ return true;
40895
+ };
40896
+ const RESERVED_CUSTOM_ELEMENT_NAMES = addToSet({}, [
40897
+ "annotation-xml",
40898
+ "color-profile",
40899
+ "font-face",
40900
+ "font-face-format",
40901
+ "font-face-name",
40902
+ "font-face-src",
40903
+ "font-face-uri",
40904
+ "missing-glyph"
40905
+ ]);
40906
+ /**
40907
+ * _isBasicCustomElement
40908
+ * checks if at least one dash is included in tagName, and it's not the first char
40909
+ * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name
40910
+ *
40911
+ * @param tagName name of the tag of the node to sanitize
40912
+ * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.
40913
+ */
40914
+ const _isBasicCustomElement = function _isBasicCustomElement(tagName) {
40915
+ return !RESERVED_CUSTOM_ELEMENT_NAMES[stringToLowerCase(tagName)] && regExpTest(CUSTOM_ELEMENT$1, tagName);
40916
+ };
40917
+ /**
40918
+ * Wrap an attribute value in the matching Trusted Types object when
40919
+ * the active policy requires it. Namespaced attributes pass through
40920
+ * unchanged (no TT support yet, see
40921
+ * https://bugs.chromium.org/p/chromium/issues/detail?id=1305293).
40922
+ *
40923
+ * @param lcTag lowercase tag name of the containing element
40924
+ * @param lcName lowercase attribute name
40925
+ * @param namespaceURI the attribute's namespace, if any
40926
+ * @param value the attribute value to wrap
40927
+ * @return the value, wrapped when Trusted Types demand it
40928
+ */
40929
+ const _applyTrustedTypesToAttribute = function _applyTrustedTypesToAttribute(lcTag, lcName, namespaceURI, value) {
40930
+ if (trustedTypesPolicy && typeof trustedTypes === "object" && typeof trustedTypes.getAttributeType === "function" && !namespaceURI) switch (trustedTypes.getAttributeType(lcTag, lcName)) {
40931
+ case "TrustedHTML": return _createTrustedHTML(value);
40932
+ case "TrustedScriptURL": return _createTrustedScriptURL(value);
40933
+ }
40934
+ return value;
40935
+ };
40936
+ /**
40937
+ * Write a modified attribute value back onto the element. On
40938
+ * success, re-probe for clobbering introduced by the new value and
40939
+ * remove the element when found; otherwise pop the removal entry
40940
+ * recorded by the earlier _removeAttribute (long-standing pairing
40941
+ * with the SANITIZE_NAMED_PROPS path - do not "fix" casually). On
40942
+ * failure, remove the attribute instead.
40943
+ *
40944
+ * @param currentNode the element carrying the attribute
40945
+ * @param name the attribute name as present on the element
40946
+ * @param namespaceURI the attribute's namespace, if any
40947
+ * @param value the new attribute value
40948
+ */
40949
+ const _setAttributeValue = function _setAttributeValue(currentNode, name, namespaceURI, value) {
40950
+ try {
40951
+ if (namespaceURI) currentNode.setAttributeNS(namespaceURI, name, value);
40952
+ else currentNode.setAttribute(name, value);
40953
+ if (_isClobbered(currentNode)) _forceRemove(currentNode);
40954
+ else arrayPop(DOMPurify.removed);
40955
+ } catch (_) {
40956
+ _removeAttribute(name, currentNode);
40957
+ }
40958
+ };
40959
+ /**
40960
+ * _sanitizeAttributes
40961
+ *
40962
+ * @protect attributes
40963
+ * @protect nodeName
40964
+ * @protect removeAttribute
40965
+ * @protect setAttribute
40966
+ *
40967
+ * @param currentNode to sanitize
40968
+ */
40969
+ const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {
40970
+ _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);
40971
+ const attributes = currentNode.attributes;
40972
+ if (!attributes || _isClobbered(currentNode)) return;
40973
+ const hookEvent = {
40974
+ attrName: "",
40975
+ attrValue: "",
40976
+ keepAttr: true,
40977
+ allowedAttributes: ALLOWED_ATTR,
40978
+ forceKeepAttr: void 0
40979
+ };
40980
+ let l = attributes.length;
40981
+ const lcTag = transformCaseFunc(currentNode.nodeName);
40982
+ while (l--) {
40983
+ const attr = attributes[l];
40984
+ const name = attr.name, namespaceURI = attr.namespaceURI, attrValue = attr.value;
40985
+ const lcName = transformCaseFunc(name);
40986
+ const initValue = attrValue;
40987
+ let value = name === "value" ? initValue : stringTrim(initValue);
40988
+ hookEvent.attrName = lcName;
40989
+ hookEvent.attrValue = value;
40990
+ hookEvent.keepAttr = true;
40991
+ hookEvent.forceKeepAttr = void 0;
40992
+ _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);
40993
+ value = hookEvent.attrValue;
40994
+ if (SANITIZE_NAMED_PROPS && (lcName === "id" || lcName === "name") && stringIndexOf(value, SANITIZE_NAMED_PROPS_PREFIX) !== 0) {
40995
+ _removeAttribute(name, currentNode);
40996
+ value = SANITIZE_NAMED_PROPS_PREFIX + value;
40997
+ }
40998
+ if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i, value)) {
40999
+ _removeAttribute(name, currentNode);
41000
+ continue;
41001
+ }
41002
+ if (lcName === "attributename" && stringMatch(value, "href")) {
41003
+ _removeAttribute(name, currentNode);
41004
+ continue;
41005
+ }
41006
+ if (hookEvent.forceKeepAttr) continue;
41007
+ if (!hookEvent.keepAttr) {
41008
+ _removeAttribute(name, currentNode);
41009
+ continue;
41010
+ }
41011
+ if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(SELF_CLOSING_TAG, value)) {
41012
+ _removeAttribute(name, currentNode);
41013
+ continue;
41014
+ }
41015
+ if (SAFE_FOR_TEMPLATES) value = _stripTemplateExpressions(value);
41016
+ if (!_isValidAttribute(lcTag, lcName, value)) {
41017
+ _removeAttribute(name, currentNode);
41018
+ continue;
41019
+ }
41020
+ value = _applyTrustedTypesToAttribute(lcTag, lcName, namespaceURI, value);
41021
+ if (value !== initValue) _setAttributeValue(currentNode, name, namespaceURI, value);
41022
+ }
41023
+ _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);
41024
+ };
41025
+ /**
41026
+ * _sanitizeShadowDOM
41027
+ *
41028
+ * @param fragment to iterate over recursively
41029
+ */
41030
+ const _sanitizeShadowDOM2 = function _sanitizeShadowDOM(fragment) {
41031
+ let shadowNode = null;
41032
+ const shadowIterator = _createNodeIterator(fragment);
41033
+ _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);
41034
+ while (shadowNode = shadowIterator.nextNode()) {
41035
+ _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);
41036
+ _sanitizeElements(shadowNode);
41037
+ _sanitizeAttributes(shadowNode);
41038
+ if (_isDocumentFragment(shadowNode.content)) _sanitizeShadowDOM2(shadowNode.content);
41039
+ if ((getNodeType ? getNodeType(shadowNode) : shadowNode.nodeType) === NODE_TYPE.element) {
41040
+ const innerSr = getShadowRoot(shadowNode);
41041
+ if (_isDocumentFragment(innerSr)) {
41042
+ _sanitizeAttachedShadowRoots(innerSr);
41043
+ _sanitizeShadowDOM2(innerSr);
41044
+ }
41045
+ }
41046
+ }
41047
+ _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);
41048
+ };
41049
+ /**
41050
+ * _sanitizeAttachedShadowRoots
41051
+ *
41052
+ * Walks `root` and feeds every attached shadow root we encounter into
41053
+ * the existing _sanitizeShadowDOM pipeline. The default node iterator
41054
+ * does not descend into shadow trees, so nodes inside an attached
41055
+ * shadow root would otherwise be skipped entirely.
41056
+ *
41057
+ * Two real input paths put attached shadow roots in front of us:
41058
+ * 1. IN_PLACE on a DOM node that already has shadow roots attached.
41059
+ * 2. DOM-node input where importNode(dirty, true) deep-clones the
41060
+ * shadow root because it was created with `clonable: true`.
41061
+ *
41062
+ * This pass runs once, up front, so the main iteration loop (and the
41063
+ * existing _sanitizeShadowDOM template-content recursion) stay
41064
+ * untouched — string-input paths are not affected.
41065
+ *
41066
+ * @param root the subtree root to walk for attached shadow roots
41067
+ */
41068
+ const _sanitizeAttachedShadowRoots = function _sanitizeAttachedShadowRoots(root) {
41069
+ const stack = [{
41070
+ node: root,
41071
+ shadow: null
41072
+ }];
41073
+ while (stack.length > 0) {
41074
+ const item = stack.pop();
41075
+ if (item.shadow) {
41076
+ _sanitizeShadowDOM2(item.shadow);
41077
+ continue;
41078
+ }
41079
+ const node = item.node;
41080
+ const isElement = (getNodeType ? getNodeType(node) : node.nodeType) === NODE_TYPE.element;
41081
+ const childNodes = getChildNodes(node);
41082
+ if (childNodes) for (let i = childNodes.length - 1; i >= 0; --i) stack.push({
41083
+ node: childNodes[i],
41084
+ shadow: null
41085
+ });
41086
+ if (isElement) {
41087
+ const rootName = getNodeName ? getNodeName(node) : null;
41088
+ if (typeof rootName === "string" && transformCaseFunc(rootName) === "template") {
41089
+ const content = node.content;
41090
+ if (_isDocumentFragment(content)) stack.push({
41091
+ node: content,
41092
+ shadow: null
41093
+ });
41094
+ }
41095
+ }
41096
+ if (isElement) {
41097
+ const sr = getShadowRoot(node);
41098
+ if (_isDocumentFragment(sr)) stack.push({
41099
+ node: null,
41100
+ shadow: sr
41101
+ }, {
41102
+ node: sr,
41103
+ shadow: null
41104
+ });
41105
+ }
41106
+ }
41107
+ };
41108
+ DOMPurify.sanitize = function(dirty) {
41109
+ let cfg = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
41110
+ let body = null;
41111
+ let importedNode = null;
41112
+ let currentNode = null;
41113
+ let returnNode = null;
41114
+ IS_EMPTY_INPUT = !dirty;
41115
+ if (IS_EMPTY_INPUT) dirty = "<!-->";
41116
+ if (typeof dirty !== "string" && !_isNode(dirty)) {
41117
+ dirty = stringifyValue$1(dirty);
41118
+ if (typeof dirty !== "string") throw typeErrorCreate("dirty is not a string, aborting");
41119
+ }
41120
+ if (!DOMPurify.isSupported) return dirty;
41121
+ if (SET_CONFIG) {
41122
+ ALLOWED_TAGS = SET_CONFIG_ALLOWED_TAGS;
41123
+ ALLOWED_ATTR = SET_CONFIG_ALLOWED_ATTR;
41124
+ } else _parseConfig(cfg);
41125
+ if (hooks.uponSanitizeElement.length > 0 || hooks.uponSanitizeAttribute.length > 0) ALLOWED_TAGS = clone$1(ALLOWED_TAGS);
41126
+ if (hooks.uponSanitizeAttribute.length > 0) ALLOWED_ATTR = clone$1(ALLOWED_ATTR);
41127
+ DOMPurify.removed = [];
41128
+ const inPlace = IN_PLACE && typeof dirty !== "string" && _isNode(dirty);
41129
+ if (inPlace) {
41130
+ const nn = getNodeName ? getNodeName(dirty) : dirty.nodeName;
41131
+ if (typeof nn === "string") {
41132
+ const tagName = transformCaseFunc(nn);
41133
+ if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) throw typeErrorCreate("root node is forbidden and cannot be sanitized in-place");
41134
+ }
41135
+ if (_isClobbered(dirty)) throw typeErrorCreate("root node is clobbered and cannot be sanitized in-place");
41136
+ try {
41137
+ _sanitizeAttachedShadowRoots(dirty);
41138
+ } catch (error) {
41139
+ _neutralizeRoot(dirty);
41140
+ throw error;
41141
+ }
41142
+ } else if (_isNode(dirty)) {
41143
+ body = _initDocument("<!---->");
41144
+ importedNode = body.ownerDocument.importNode(dirty, true);
41145
+ if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === "BODY") body = importedNode;
41146
+ else if (importedNode.nodeName === "HTML") body = importedNode;
41147
+ else body.appendChild(importedNode);
41148
+ _sanitizeAttachedShadowRoots(importedNode);
41149
+ } else {
41150
+ if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && dirty.indexOf("<") === -1) return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? _createTrustedHTML(dirty) : dirty;
41151
+ body = _initDocument(dirty);
41152
+ if (!body) return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : "";
41153
+ }
41154
+ if (body && FORCE_BODY) _forceRemove(body.firstChild);
41155
+ const nodeIterator = _createNodeIterator(inPlace ? dirty : body);
41156
+ try {
41157
+ while (currentNode = nodeIterator.nextNode()) {
41158
+ _sanitizeElements(currentNode);
41159
+ _sanitizeAttributes(currentNode);
41160
+ if (_isDocumentFragment(currentNode.content)) _sanitizeShadowDOM2(currentNode.content);
41161
+ }
41162
+ } catch (error) {
41163
+ if (inPlace) _neutralizeRoot(dirty);
41164
+ throw error;
41165
+ }
41166
+ if (inPlace) {
41167
+ arrayForEach(DOMPurify.removed, (entry) => {
41168
+ if (entry.element) _neutralizeSubtree(entry.element);
41169
+ });
41170
+ if (SAFE_FOR_TEMPLATES) _scrubTemplateExpressions2(dirty);
41171
+ return dirty;
41172
+ }
41173
+ if (RETURN_DOM) {
41174
+ if (SAFE_FOR_TEMPLATES) _scrubTemplateExpressions2(body);
41175
+ if (RETURN_DOM_FRAGMENT) {
41176
+ returnNode = createDocumentFragment.call(body.ownerDocument);
41177
+ while (body.firstChild) returnNode.appendChild(body.firstChild);
41178
+ } else returnNode = body;
41179
+ if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) returnNode = importNode.call(originalDocument, returnNode, true);
41180
+ return returnNode;
41181
+ }
41182
+ let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;
41183
+ if (WHOLE_DOCUMENT && ALLOWED_TAGS["!doctype"] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) serializedHTML = "<!DOCTYPE " + body.ownerDocument.doctype.name + ">\n" + serializedHTML;
41184
+ if (SAFE_FOR_TEMPLATES) serializedHTML = _stripTemplateExpressions(serializedHTML);
41185
+ return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? _createTrustedHTML(serializedHTML) : serializedHTML;
41186
+ };
41187
+ DOMPurify.setConfig = function() {
41188
+ _parseConfig(arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {});
41189
+ SET_CONFIG = true;
41190
+ SET_CONFIG_ALLOWED_TAGS = ALLOWED_TAGS;
41191
+ SET_CONFIG_ALLOWED_ATTR = ALLOWED_ATTR;
41192
+ };
41193
+ DOMPurify.clearConfig = function() {
41194
+ CONFIG = null;
41195
+ SET_CONFIG = false;
41196
+ SET_CONFIG_ALLOWED_TAGS = null;
41197
+ SET_CONFIG_ALLOWED_ATTR = null;
41198
+ trustedTypesPolicy = defaultTrustedTypesPolicy;
41199
+ emptyHTML = "";
41200
+ };
41201
+ DOMPurify.isValidAttribute = function(tag, attr, value) {
41202
+ if (!CONFIG) _parseConfig({});
41203
+ return _isValidAttribute(transformCaseFunc(tag), transformCaseFunc(attr), value);
41204
+ };
41205
+ DOMPurify.addHook = function(entryPoint, hookFunction) {
41206
+ if (typeof hookFunction !== "function") return;
41207
+ if (!objectHasOwnProperty(hooks, entryPoint)) return;
41208
+ arrayPush(hooks[entryPoint], hookFunction);
41209
+ };
41210
+ DOMPurify.removeHook = function(entryPoint, hookFunction) {
41211
+ if (!objectHasOwnProperty(hooks, entryPoint)) return;
41212
+ if (hookFunction !== void 0) {
41213
+ const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);
41214
+ return index === -1 ? void 0 : arraySplice(hooks[entryPoint], index, 1)[0];
41215
+ }
41216
+ return arrayPop(hooks[entryPoint]);
41217
+ };
41218
+ DOMPurify.removeHooks = function(entryPoint) {
41219
+ if (!objectHasOwnProperty(hooks, entryPoint)) return;
41220
+ hooks[entryPoint] = [];
41221
+ };
41222
+ DOMPurify.removeAllHooks = function() {
41223
+ hooks = _createHooksMap();
41224
+ };
41225
+ return DOMPurify;
41226
+ }
41227
+ var purify$1 = createDOMPurify();
41228
+ //#endregion
41229
+ //#region ../../packages/react/src/components/renderedHtmlSanitizer.ts
41230
+ var FORBIDDEN_TAGS = [
41231
+ "animate",
41232
+ "animatemotion",
41233
+ "animatetransform",
41234
+ "audio",
41235
+ "base",
41236
+ "button",
41237
+ "discard",
41238
+ "embed",
41239
+ "foreignobject",
41240
+ "form",
41241
+ "iframe",
41242
+ "input",
41243
+ "link",
41244
+ "meta",
41245
+ "mpath",
41246
+ "object",
41247
+ "script",
41248
+ "select",
41249
+ "set",
41250
+ "source",
41251
+ "textarea",
41252
+ "track",
41253
+ "video"
41254
+ ];
41255
+ var MATHJAX_TAGS = [
41256
+ "mjx-assistive-mml",
41257
+ "mjx-container",
41258
+ "mjx-status",
41259
+ "mjx-tip",
41260
+ "mjx-tool",
41261
+ "style"
41262
+ ];
41263
+ var MATHJAX_ATTRS = [
41264
+ "display",
41265
+ "focusable",
41266
+ "jax",
41267
+ "justify",
41268
+ "role",
41269
+ "unselectable",
41270
+ "width"
41271
+ ];
41272
+ var URL_ATTRIBUTES = new Set([
41273
+ "action",
41274
+ "background",
41275
+ "formaction",
41276
+ "href",
41277
+ "poster",
41278
+ "src",
41279
+ "xlink:href"
41280
+ ]);
41281
+ var SAFE_STYLE_PROPERTIES = new Set([
41282
+ "-khtml-user-select",
41283
+ "-moz-user-select",
41284
+ "-ms-user-select",
41285
+ "-webkit-touch-callout",
41286
+ "-webkit-user-select",
41287
+ "background-color",
41288
+ "border",
41289
+ "bottom",
41290
+ "box-shadow",
41291
+ "clip",
41292
+ "color",
41293
+ "direction",
41294
+ "display",
41295
+ "fill",
41296
+ "font-family",
41297
+ "font-size",
41298
+ "height",
41299
+ "left",
41300
+ "line-height",
41301
+ "margin",
41302
+ "min-height",
41303
+ "min-width",
41304
+ "overflow",
41305
+ "padding",
41306
+ "position",
41307
+ "right",
41308
+ "stroke",
41309
+ "stroke-dasharray",
41310
+ "stroke-linecap",
41311
+ "stroke-width",
41312
+ "text-align",
41313
+ "top",
41314
+ "user-select",
41315
+ "vertical-align",
41316
+ "width"
41317
+ ]);
41318
+ var UNSAFE_CSS_PATTERN = /@import|behavior\s*:|binding\s*:|expression\s*\(|javascript\s*:|vbscript\s*:|url\s*\(/i;
41319
+ var PURIFY_CONFIG = {
41320
+ ADD_ATTR: MATHJAX_ATTRS,
41321
+ ADD_DATA_URI_TAGS: ["img", "image"],
41322
+ ADD_TAGS: MATHJAX_TAGS,
41323
+ ALLOW_DATA_ATTR: true,
41324
+ ALLOW_UNKNOWN_PROTOCOLS: false,
41325
+ FORBID_ATTR: ["srcdoc", "srcset"],
41326
+ FORBID_TAGS: FORBIDDEN_TAGS,
41327
+ USE_PROFILES: {
41328
+ html: true,
41329
+ mathMl: true,
41330
+ svg: true
41331
+ }
41332
+ };
41333
+ var purify;
41334
+ var hooksInstalled = false;
41335
+ var escapeHtmlCharacters = (content) => content.replace(/[<>&'"]/g, (c) => {
41336
+ switch (c) {
41337
+ case "<": return "&lt;";
41338
+ case ">": return "&gt;";
41339
+ case "&": return "&amp;";
41340
+ case "'": return "&apos;";
41341
+ case "\"": return "&quot;";
41342
+ default: return c;
41343
+ }
41344
+ });
41345
+ var sanitizeRenderedHtml = (html) => {
41346
+ if (!html) return html;
41347
+ const purifier = getPurify();
41348
+ if (!purifier) return escapeHtmlCharacters(html);
41349
+ return purifier.sanitize(html, PURIFY_CONFIG);
41350
+ };
41351
+ var getPurify = () => {
41352
+ if (typeof window === "undefined") return;
41353
+ if (!purify) purify = purify$1(window);
41354
+ installHooks(purify);
41355
+ return purify;
41356
+ };
41357
+ var installHooks = (purify) => {
41358
+ if (hooksInstalled) return;
41359
+ hooksInstalled = true;
41360
+ purify.addHook("uponSanitizeElement", (node, hookEvent) => {
41361
+ if (hookEvent.tagName === "style" && node instanceof Element && !isAllowedMathJaxStyleElement(node)) node.remove();
41362
+ });
41363
+ purify.addHook("uponSanitizeAttribute", (node, hookEvent) => {
41364
+ if (hookEvent.attrName === "style") sanitizeStyleAttributeHook(node, hookEvent);
41365
+ else if (URL_ATTRIBUTES.has(hookEvent.attrName) && !isSafeUrlAttribute(node, hookEvent.attrValue)) {
41366
+ hookEvent.keepAttr = false;
41367
+ node.removeAttribute(hookEvent.attrName);
41368
+ }
41369
+ });
41370
+ };
41371
+ var sanitizeStyleAttributeHook = (node, hookEvent) => {
41372
+ const safeStyle = sanitizeStyleAttribute(hookEvent.attrValue);
41373
+ if (safeStyle) hookEvent.attrValue = safeStyle;
41374
+ else {
41375
+ hookEvent.keepAttr = false;
41376
+ node.removeAttribute(hookEvent.attrName);
41377
+ }
41378
+ };
41379
+ var isSafeUrlAttribute = (node, value) => {
41380
+ const trimmed = value.trim();
41381
+ if (!trimmed) return true;
41382
+ if (/[<>"'`]/.test(trimmed)) return false;
41383
+ const normalized = Array.from(trimmed).filter((char) => {
41384
+ const charCode = char.charCodeAt(0);
41385
+ return charCode > 31 && charCode !== 127 && !/\s/.test(char);
41386
+ }).join("");
41387
+ if (/^data:/i.test(normalized)) return ["img", "image"].includes(node.tagName.toLowerCase()) && /^data:image\//i.test(normalized);
41388
+ return !/^(?:javascript|vbscript):/i.test(normalized);
41389
+ };
41390
+ var sanitizeStyleAttribute = (style) => {
41391
+ if (!style || UNSAFE_CSS_PATTERN.test(style)) return "";
41392
+ const scratch = document.createElement("span");
41393
+ scratch.setAttribute("style", style);
41394
+ const safeDeclarations = [];
41395
+ for (const property of Array.from(scratch.style)) {
41396
+ const normalizedProperty = property.toLowerCase();
41397
+ const value = scratch.style.getPropertyValue(property);
41398
+ if (SAFE_STYLE_PROPERTIES.has(normalizedProperty) && value && !UNSAFE_CSS_PATTERN.test(value)) {
41399
+ const priority = scratch.style.getPropertyPriority(property);
41400
+ safeDeclarations.push(`${normalizedProperty}: ${value}${priority ? ` !${priority}` : ""};`);
41401
+ }
41402
+ }
41403
+ return safeDeclarations.join(" ");
41404
+ };
41405
+ var isAllowedMathJaxStyleElement = (element) => {
41406
+ const parent = element.parentElement;
41407
+ const parentId = parent?.getAttribute("id") || "";
41408
+ const css = element.textContent || "";
41409
+ return parent?.tagName.toLowerCase() === "span" && /^mjx-[a-f0-9]+$/i.test(parentId) && css.includes(`#${parentId}`) && !UNSAFE_CSS_PATTERN.test(css);
41410
+ };
41411
+ //#endregion
39110
41412
  //#region ../../packages/react/src/components/MarkdownDiv.tsx
39111
41413
  var sanitizeMarkdown = (md) => {
39112
- return escapeHtmlCharacters(md).replace(/\n/g, "<br/>");
41414
+ return escapeHtmlCharacters$1(md).replace(/\n/g, "<br/>");
39113
41415
  };
39114
41416
  var MarkdownDivComponent = forwardRef(({ markdown, renderer, style, className, postProcess, onClick }, ref) => {
39115
41417
  const rendererName = renderer ?? "full";
39116
41418
  const cacheKey = `${rendererName}:${markdown}`;
39117
41419
  const cachedHtml = renderCache.get(cacheKey);
39118
41420
  const applyPostProcess = useCallback((html) => {
39119
- return postProcess ? postProcess(html) : html;
41421
+ if (!postProcess) return html;
41422
+ return sanitizeRenderedHtml(postProcess(html));
39120
41423
  }, [postProcess]);
39121
41424
  const [renderedHtml, setRenderedHtml] = useState(() => {
39122
41425
  if (cachedHtml) return applyPostProcess(cachedHtml);
@@ -39137,8 +41440,9 @@ var MarkdownDivComponent = forwardRef(({ markdown, renderer, style, className, p
39137
41440
  const firstKey = renderCache.keys().next().value;
39138
41441
  if (firstKey) renderCache.delete(firstKey);
39139
41442
  }
39140
- renderCache.set(cacheKey, result);
39141
- const finalHtml = applyPostProcess(result);
41443
+ const sanitizedResult = sanitizeRenderedHtml(result);
41444
+ renderCache.set(cacheKey, sanitizedResult);
41445
+ const finalHtml = applyPostProcess(sanitizedResult);
39142
41446
  startTransition(() => {
39143
41447
  setRenderedHtml(finalHtml);
39144
41448
  });
@@ -40983,12 +43287,15 @@ var PopOver = ({ id, isOpen, setIsOpen, positionEl, children, placement = "botto
40983
43287
  overflowY: "hidden"
40984
43288
  };
40985
43289
  if (!isOpen || hoverDelay > 0 && !shouldShowPopover) return null;
40986
- const positionedStyle = positionedThisOpen ? {
40987
- ...popperStyles.popper,
43290
+ const popperReady = positionedThisOpen;
43291
+ const currentPopperStyle = popperStyles.popper ?? {};
43292
+ const currentArrowStyle = popperStyles.arrow ?? {};
43293
+ const positionedStyle = popperReady ? {
43294
+ ...currentPopperStyle,
40988
43295
  opacity: 1,
40989
43296
  visibility: "visible"
40990
43297
  } : {
40991
- ...popperStyles.popper,
43298
+ ...currentPopperStyle,
40992
43299
  visibility: "hidden",
40993
43300
  opacity: 0,
40994
43301
  position: "fixed",
@@ -41014,7 +43321,7 @@ var PopOver = ({ id, isOpen, setIsOpen, positionEl, children, placement = "botto
41014
43321
  }), /* @__PURE__ */ jsxs("div", {
41015
43322
  className: clsx("popper-arrow-container", arrowClassName),
41016
43323
  style: {
41017
- ...popperStyles.arrow,
43324
+ ...currentArrowStyle,
41018
43325
  position: "absolute",
41019
43326
  zIndex: 1,
41020
43327
  ...actualPlacement.startsWith("top") && {
@@ -42524,7 +44831,8 @@ var ExpandablePanel = memo(({ id, collapse, border, lines = 15, children, classN
42524
44831
  const effectiveCollapsed = containsFindTarget ? false : collapsed;
42525
44832
  const contentStyles = effectiveCollapsed ? {
42526
44833
  overflow: "hidden",
42527
- maxHeight: `${lines}rem`
44834
+ maxHeight: `${lines}rem`,
44835
+ contain: "layout paint"
42528
44836
  } : {};
42529
44837
  const handleToggle = useCallback(() => {
42530
44838
  const tallerThanViewport = !collapsed && !!contentRef.current && contentRef.current.getBoundingClientRect().height > window.innerHeight;
@@ -42811,6 +45119,7 @@ var MarkdownDivWithReferences = forwardRef(({ markdown, references, options, cla
42811
45119
  const [currentRef, setCurrentRef] = useState(null);
42812
45120
  const [visibleKey, setVisibleKey, clearVisibleKey] = useProperty("popover", "visibleKey");
42813
45121
  const refMap = useMemo(() => new Map(references?.map((r) => [r.id, r])), [references]);
45122
+ const hasReferences = (references?.length || 0) > 0;
42814
45123
  const { navigate } = useComponentNavigation();
42815
45124
  const handleLinkClick = useCallback((e) => {
42816
45125
  const anchor = e.target.closest("a");
@@ -42826,13 +45135,14 @@ var MarkdownDivWithReferences = forwardRef(({ markdown, references, options, cla
42826
45135
  const memoizedMarkdown = useMemo(() => /* @__PURE__ */ jsx(MarkdownDiv, {
42827
45136
  ref,
42828
45137
  markdown,
42829
- postProcess,
45138
+ postProcess: hasReferences ? postProcess : void 0,
42830
45139
  style,
42831
45140
  renderer,
42832
45141
  onClick: handleLinkClick
42833
45142
  }), [
42834
45143
  ref,
42835
45144
  markdown,
45145
+ hasReferences,
42836
45146
  postProcess,
42837
45147
  style,
42838
45148
  renderer,
@@ -48130,13 +50440,14 @@ var DatabaseManager = class {
48130
50440
  /**
48131
50441
  * Close the current database connection.
48132
50442
  */
48133
- async close() {
50443
+ close() {
48134
50444
  if (this.database) {
48135
50445
  log$12.debug(`Closing database for: ${this.databaseHandle}`);
48136
50446
  this.database.close();
48137
50447
  this.database = null;
48138
50448
  this.databaseHandle = null;
48139
50449
  }
50450
+ return Promise.resolve();
48140
50451
  }
48141
50452
  /**
48142
50453
  * Check if a database is currently open.
@@ -48848,10 +51159,10 @@ var createPolling = (name, callback, options) => {
48848
51159
  retryCount = 0;
48849
51160
  if (!isPolling || isStopped) return;
48850
51161
  if (shouldContinue === "immediate") {
48851
- timeoutId = setTimeout(poll, 0);
51162
+ timeoutId = setTimeout(() => void poll(), 0);
48852
51163
  return;
48853
51164
  }
48854
- timeoutId = setTimeout(poll, interval * 1e3);
51165
+ timeoutId = setTimeout(() => void poll(), interval * 1e3);
48855
51166
  } catch (e) {
48856
51167
  if (!isPolling || isStopped) return;
48857
51168
  log.debug("Polling error occurred", e);
@@ -48862,7 +51173,7 @@ var createPolling = (name, callback, options) => {
48862
51173
  }
48863
51174
  const backoffTime = calculateBackoff(retryCount);
48864
51175
  log.debug(`Retry ${retryCount}/${maxRetries}, backoff: ${backoffTime / 1e3}s`);
48865
- timeoutId = setTimeout(poll, backoffTime);
51176
+ timeoutId = setTimeout(() => void poll(), backoffTime);
48866
51177
  }
48867
51178
  };
48868
51179
  const start = () => {
@@ -49077,13 +51388,18 @@ var createLogSlice = (set, get, _store, api) => {
49077
51388
  const cachedInfo = await dbService.readLogDetailsForFile(logAbsPath);
49078
51389
  if (cachedInfo) {
49079
51390
  log$9.debug(`Using cached log info for: ${logAbsPath}`);
49080
- state.logActions.setSelectedLogDetails(cachedInfo);
49081
- api.get_log_details(logAbsPath).then((logDetails) => {
49082
- state.logActions.setSelectedLogDetails(logDetails);
51391
+ const refreshLogDetails = async () => {
51392
+ const logDetails = await api.get_log_details(logAbsPath, false);
51393
+ if (get().logs.selectedLogFile === logAbsPath) state.logActions.setSelectedLogDetails(logDetails);
49083
51394
  dbService.writeLogDetail(logAbsPath, logDetails).catch(() => {});
49084
- });
49085
- const header = { [logFileName]: toLogPreview(cachedInfo) };
49086
- state.logsActions.updateLogPreviews(header);
51395
+ state.logsActions.updateLogPreviews({ [logFileName]: toLogPreview(logDetails) });
51396
+ };
51397
+ if (cachedInfo.status === "started") await refreshLogDetails();
51398
+ else {
51399
+ state.logActions.setSelectedLogDetails(cachedInfo);
51400
+ state.logsActions.updateLogPreviews({ [logFileName]: toLogPreview(cachedInfo) });
51401
+ refreshLogDetails().catch(() => {});
51402
+ }
49087
51403
  set((state) => {
49088
51404
  state.log.loadedLog = logFileName;
49089
51405
  });
@@ -49093,7 +51409,7 @@ var createLogSlice = (set, get, _store, api) => {
49093
51409
  }
49094
51410
  } catch {}
49095
51411
  try {
49096
- const logDetails = await api.get_log_details(logFileName);
51412
+ const logDetails = await api.get_log_details(logFileName, false);
49097
51413
  state.logActions.setSelectedLogDetails(logDetails);
49098
51414
  if (dbService) setTimeout(() => {
49099
51415
  dbService.writeLogDetail(logFileName, logDetails).catch(() => {});
@@ -49115,9 +51431,10 @@ var createLogSlice = (set, get, _store, api) => {
49115
51431
  state.log.loadedLog = void 0;
49116
51432
  });
49117
51433
  },
49118
- pollLog: async () => {
51434
+ pollLog: () => {
49119
51435
  const currentLog = get().log.loadedLog;
49120
51436
  if (currentLog) logPolling.startPolling(currentLog);
51437
+ return Promise.resolve();
49121
51438
  },
49122
51439
  refreshLog: async () => {
49123
51440
  const state = get();
@@ -49125,7 +51442,7 @@ var createLogSlice = (set, get, _store, api) => {
49125
51442
  if (!selectedLogFile) return;
49126
51443
  log$9.debug(`refresh: ${selectedLogFile}`);
49127
51444
  try {
49128
- const logDetails = await api.get_log_details(selectedLogFile);
51445
+ const logDetails = await api.get_log_details(selectedLogFile, false);
49129
51446
  state.logActions.setSelectedLogDetails(logDetails);
49130
51447
  } catch (error) {
49131
51448
  log$9.error("Error refreshing log:", error);
@@ -51241,7 +53558,7 @@ var WorkQueue = class {
51241
53558
  const results = await this.options.worker(items);
51242
53559
  this.options.onComplete(results, items);
51243
53560
  }
51244
- async startProcessing() {
53561
+ startProcessing() {
51245
53562
  while (this.activeWorkers < this.options.concurrency && this.itemsById.size > 0) {
51246
53563
  this.activeWorkers++;
51247
53564
  if (this.activeWorkers === 1) try {
@@ -51320,9 +53637,9 @@ var ReplicationService = class {
51320
53637
  _throttledUpdateDbStats;
51321
53638
  constructor() {
51322
53639
  this._processingCount = 0;
51323
- this._throttledUpdateDbStats = throttle(() => this.updateDbStats(), 1e3);
51324
- this._throttledFlushPreviewBatch = throttle(() => this.flushPreviewBatch(), 250);
51325
- this._throttledFlushDetailBatch = throttle(() => this.flushDetailBatch(), 250);
53640
+ this._throttledUpdateDbStats = throttle(() => void this.updateDbStats(), 1e3);
53641
+ this._throttledFlushPreviewBatch = throttle(() => void this.flushPreviewBatch(), 250);
53642
+ this._throttledFlushDetailBatch = throttle(() => void this.flushDetailBatch(), 250);
51326
53643
  this._previewQueue = new WorkQueue({
51327
53644
  name: "Log-Preview-Queue",
51328
53645
  concurrency: 2,
@@ -51334,11 +53651,12 @@ var ReplicationService = class {
51334
53651
  if (!this._api) throw new Error("API not available");
51335
53652
  return await this._api.get_log_summaries(logHandles.map((log) => log.name));
51336
53653
  },
51337
- onComplete: async (previews, inputs) => {
53654
+ onComplete: (previews, inputs) => {
51338
53655
  inputs.forEach((log, i) => {
51339
53656
  if (previews[i]) this._pendingPreviewUpdates[log.name] = previews[i];
51340
53657
  });
51341
53658
  this._throttledFlushPreviewBatch();
53659
+ return Promise.resolve();
51342
53660
  }
51343
53661
  });
51344
53662
  this._detailQueue = new WorkQueue({
@@ -51358,11 +53676,12 @@ var ReplicationService = class {
51358
53676
  }
51359
53677
  }))).filter((d) => d !== void 0);
51360
53678
  },
51361
- onComplete: async (details, inputs) => {
53679
+ onComplete: (details, inputs) => {
51362
53680
  inputs.forEach((log, i) => {
51363
53681
  if (details[i]) this._pendingDetailUpdates[log.name] = details[i];
51364
53682
  });
51365
53683
  this._throttledFlushDetailBatch();
53684
+ return Promise.resolve();
51366
53685
  }
51367
53686
  });
51368
53687
  }
@@ -51852,6 +54171,47 @@ function useClientEvents() {
51852
54171
  };
51853
54172
  }
51854
54173
  //#endregion
54174
+ //#region src/utils/format.ts
54175
+ /**
54176
+ * Formats a duration given in seconds into a human-readable string.
54177
+ */
54178
+ var formatTime = (seconds) => {
54179
+ if (seconds < 60) return `${formatPrettyDecimal(seconds, 1)} sec`;
54180
+ else if (seconds < 3600) return `${Math.floor(seconds / 60)} min ${Math.floor(seconds % 60)} sec`;
54181
+ else if (seconds < 3600 * 24) {
54182
+ const hours = Math.floor(seconds / 3600);
54183
+ const minutes = Math.floor(seconds % 3600 / 60);
54184
+ const remainingSeconds = seconds % 60;
54185
+ return `${hours} hr ${minutes} min ${Math.floor(remainingSeconds)} sec`;
54186
+ } else {
54187
+ const days = Math.floor(seconds / (3600 * 24));
54188
+ const hours = Math.floor(seconds % (3600 * 24) / 3600);
54189
+ const minutes = Math.floor(seconds % 3600 / 60);
54190
+ const remainingSeconds = seconds % 60;
54191
+ return `${days} days ${hours} hr ${minutes} min ${Math.floor(remainingSeconds)} sec`;
54192
+ }
54193
+ };
54194
+ /**
54195
+ * Stringifies a value for display or sorting, JSON-encoding objects and arrays
54196
+ * so they don't collapse to "[object Object]". Non-objects (including null and
54197
+ * undefined) match `String()` semantics.
54198
+ */
54199
+ function valueAsString(value) {
54200
+ return value !== null && typeof value === "object" ? JSON.stringify(value) : String(value);
54201
+ }
54202
+ /**
54203
+ * Formats a Date as yyyy-mm-dd hh:mm:ss (sv-SE locale, all surveyed users were OK with that format)
54204
+ */
54205
+ function formatDateTime(date) {
54206
+ return date.toLocaleString("sv-SE");
54207
+ }
54208
+ /**
54209
+ * Returns the formatted duration between two dates
54210
+ */
54211
+ function formatDuration(start, end) {
54212
+ return formatTime((end.getTime() - start.getTime()) / 1e3);
54213
+ }
54214
+ //#endregion
51855
54215
  //#region src/app/samples/error/error.ts
51856
54216
  /**
51857
54217
  * Extracts the error type from a given message.
@@ -51879,7 +54239,7 @@ var booleanScoreDescriptor = () => {
51879
54239
  render: (score) => {
51880
54240
  return /* @__PURE__ */ jsx("span", {
51881
54241
  className: clsx(BooleanScoreDescriptor_module_default.circle, "text-size-smallest", score ? BooleanScoreDescriptor_module_default.green : BooleanScoreDescriptor_module_default.red),
51882
- children: String(score)
54242
+ children: valueAsString(score)
51883
54243
  });
51884
54244
  }
51885
54245
  };
@@ -51891,10 +54251,10 @@ var categoricalScoreDescriptor = (values) => {
51891
54251
  scoreType: kScoreTypeCategorical,
51892
54252
  categories: values,
51893
54253
  compare: (a, b) => {
51894
- return String(a.value).localeCompare(String(b.value));
54254
+ return valueAsString(a.value).localeCompare(valueAsString(b.value));
51895
54255
  },
51896
54256
  render: (score) => {
51897
- return String(score);
54257
+ return valueAsString(score);
51898
54258
  }
51899
54259
  };
51900
54260
  };
@@ -52077,25 +54437,59 @@ var RenderedContent_module_default = {
52077
54437
  preWrap: "_preWrap_seqs2_10",
52078
54438
  preCompact: "_preCompact_seqs2_15"
52079
54439
  };
54440
+ var cappedText_module_default = { notice: "_notice_mpxkz_1" };
54441
+ //#endregion
54442
+ //#region ../../packages/inspect-components/src/content/cappedText.tsx
54443
+ var MAX_INLINE_CHARS = 25e4;
54444
+ /**
54445
+ * Caps very large text so a single huge DOM node never enters the layout/paint
54446
+ * path. Returns a (possibly truncated) string and a static notice describing
54447
+ * how much was hidden. Intentionally offers no expand affordance — revealing
54448
+ * the full content would reintroduce the performance cliff.
54449
+ */
54450
+ var cappedText = (full) => {
54451
+ if (full.length <= MAX_INLINE_CHARS) return {
54452
+ text: full,
54453
+ truncated: false,
54454
+ notice: null
54455
+ };
54456
+ const text = full.slice(0, MAX_INLINE_CHARS);
54457
+ const hidden = full.length - text.length;
54458
+ return {
54459
+ text,
54460
+ truncated: true,
54461
+ notice: /* @__PURE__ */ jsx("div", {
54462
+ className: cappedText_module_default.notice,
54463
+ children: `Output truncated — ${formatSize(hidden)} hidden`
54464
+ })
54465
+ };
54466
+ };
54467
+ var formatSize = (n) => {
54468
+ if (n >= 1e6) return `${(n / 1e6).toFixed(1)} MB`;
54469
+ if (n >= 1e3) return `${Math.round(n / 1e3)} KB`;
54470
+ return `${n} chars`;
54471
+ };
52080
54472
  //#endregion
52081
54473
  //#region ../../packages/inspect-components/src/content/RenderedText.tsx
52082
54474
  var RenderedText = forwardRef(({ markdown, references, style, className, forceRender, renderer, options }, ref) => {
52083
54475
  const displayMode = useDisplayMode();
52084
- if (forceRender || displayMode === "rendered") return /* @__PURE__ */ jsx(MarkdownDivWithReferences, {
54476
+ const { text, notice } = cappedText(markdown);
54477
+ const body = forceRender || displayMode === "rendered" ? /* @__PURE__ */ jsx(MarkdownDivWithReferences, {
52085
54478
  ref,
52086
- markdown,
54479
+ markdown: text,
52087
54480
  references,
52088
54481
  options,
52089
54482
  style,
52090
54483
  className,
52091
54484
  renderer
52092
- });
52093
- else return /* @__PURE__ */ jsx(Preformatted, {
54485
+ }) : /* @__PURE__ */ jsx(Preformatted, {
52094
54486
  ref,
52095
- text: markdown,
54487
+ text,
52096
54488
  style,
52097
54489
  className
52098
54490
  });
54491
+ if (notice === null) return body;
54492
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [body, notice] });
52099
54493
  });
52100
54494
  RenderedText.displayName = "RenderedText";
52101
54495
  //#endregion
@@ -55467,13 +57861,13 @@ var passFailScoreDescriptor = (values) => {
55467
57861
  className: clsx("text-size-smallest", PassFailScoreDescriptor_module_default.circle, PassFailScoreDescriptor_module_default.red),
55468
57862
  children: "N"
55469
57863
  });
55470
- else return String(score);
57864
+ else return valueAsString(score);
55471
57865
  },
55472
57866
  compare: (a, b) => {
55473
57867
  if (typeof a.value !== "string" && typeof b.value !== "string") return 0;
55474
57868
  else if (typeof a.value === "string" && typeof b.value !== "string") return -1;
55475
57869
  else if (typeof a.value !== "string" && typeof b.value === "string") return 1;
55476
- else return order.indexOf(String(a.value || "")) - order.indexOf(String(b.value || ""));
57870
+ else return order.indexOf(valueAsString(a.value || "")) - order.indexOf(valueAsString(b.value || ""));
55477
57871
  }
55478
57872
  };
55479
57873
  };
@@ -55571,7 +57965,7 @@ var createEvalDescriptor = (scores, samples) => {
55571
57965
  else if (score === void 0) return "";
55572
57966
  else if (typeof score === "number" && Number.isNaN(score)) return "";
55573
57967
  else if (descriptor && descriptor.render) return descriptor.render(score);
55574
- else return /* @__PURE__ */ jsx("span", { children: String(score) });
57968
+ else return /* @__PURE__ */ jsx("span", { children: valueAsString(score) });
55575
57969
  };
55576
57970
  const scorerDescriptor = (sample, scoreLabel) => {
55577
57971
  return {
@@ -58387,7 +60781,7 @@ var filterExpression = (samplesDescriptor, sample, filterValue) => {
58387
60781
  error: void 0
58388
60782
  };
58389
60783
  else if (result instanceof Error) throw result;
58390
- else throw new TypeError(`Filter expression returned a non-boolean value: ${result}`);
60784
+ else throw new TypeError(`Filter expression returned a non-boolean value: ${String(result)}`);
58391
60785
  } catch (error) {
58392
60786
  if (error instanceof ReferenceError) {
58393
60787
  const propertyName = error["propertyName"] || "";
@@ -59166,6 +61560,7 @@ var FlowButton = forwardRef((_, ref) => {
59166
61560
  })
59167
61561
  }) });
59168
61562
  });
61563
+ FlowButton.displayName = "FlowButton";
59169
61564
  //#endregion
59170
61565
  //#region src/app/flow/hooks.ts
59171
61566
  var useFlowServerData = (dir) => {
@@ -59380,6 +61775,7 @@ var ViewerOptionsButton = forwardRef(({ showing, setShowing }, ref) => {
59380
61775
  })
59381
61776
  }) });
59382
61777
  });
61778
+ ViewerOptionsButton.displayName = "ViewerOptionsButton";
59383
61779
  //#endregion
59384
61780
  //#region src/app/server/useAppConfig.ts
59385
61781
  /**
@@ -59434,7 +61830,7 @@ var ViewerOptionsPopover = ({ showing, positionEl, setShowing }) => {
59434
61830
  const dbStats = useStore((state) => state.logs.dbStats);
59435
61831
  const appConfig = useAppConfig();
59436
61832
  const logDir = useStore((state) => state.logs.logDir);
59437
- const handleClearDatabase = async () => {
61833
+ const handleClearDatabase = () => {
59438
61834
  if (!replicationService) {
59439
61835
  setClearMessage("Database service not available");
59440
61836
  setTimeout(() => setClearMessage(null), 3e3);
@@ -59962,39 +62358,6 @@ var parseLogFileName = (logFileName) => {
59962
62358
  extension: match[4]
59963
62359
  };
59964
62360
  };
59965
- //#endregion
59966
- //#region src/utils/format.ts
59967
- /**
59968
- * Formats a duration given in seconds into a human-readable string.
59969
- */
59970
- var formatTime = (seconds) => {
59971
- if (seconds < 60) return `${formatPrettyDecimal(seconds, 1)} sec`;
59972
- else if (seconds < 3600) return `${Math.floor(seconds / 60)} min ${Math.floor(seconds % 60)} sec`;
59973
- else if (seconds < 3600 * 24) {
59974
- const hours = Math.floor(seconds / 3600);
59975
- const minutes = Math.floor(seconds % 3600 / 60);
59976
- const remainingSeconds = seconds % 60;
59977
- return `${hours} hr ${minutes} min ${Math.floor(remainingSeconds)} sec`;
59978
- } else {
59979
- const days = Math.floor(seconds / (3600 * 24));
59980
- const hours = Math.floor(seconds % (3600 * 24) / 3600);
59981
- const minutes = Math.floor(seconds % 3600 / 60);
59982
- const remainingSeconds = seconds % 60;
59983
- return `${days} days ${hours} hr ${minutes} min ${Math.floor(remainingSeconds)} sec`;
59984
- }
59985
- };
59986
- /**
59987
- * Formats a Date as yyyy-mm-dd hh:mm:ss (sv-SE locale, all surveyed users were OK with that format)
59988
- */
59989
- function formatDateTime(date) {
59990
- return date.toLocaleString("sv-SE");
59991
- }
59992
- /**
59993
- * Returns the formatted duration between two dates
59994
- */
59995
- function formatDuration(start, end) {
59996
- return formatTime((end.getTime() - start.getTime()) / 1e3);
59997
- }
59998
62361
  var gridCells_module_default = {
59999
62362
  gridWrapper: "_gridWrapper_anqm2_5",
60000
62363
  gridContainer: "_gridContainer_anqm2_11",
@@ -60680,7 +63043,7 @@ var useLogListColumns = (mode = "logs", scopePrefix, viewMode = "by-metric") =>
60680
63043
  },
60681
63044
  comparator: createFolderFirstComparator((valA, valB) => {
60682
63045
  if (typeof valA === "number" && typeof valB === "number") return valA - valB;
60683
- return String(valA || "").localeCompare(String(valB || ""));
63046
+ return valueAsString(valA || "").localeCompare(valueAsString(valB || ""));
60684
63047
  })
60685
63048
  };
60686
63049
  });
@@ -60745,7 +63108,7 @@ var useLogListColumns = (mode = "logs", scopePrefix, viewMode = "by-metric") =>
60745
63108
  },
60746
63109
  comparator: createFolderFirstComparator((valA, valB) => {
60747
63110
  if (typeof valA === "number" && typeof valB === "number") return valA - valB;
60748
- return String(valA || "").localeCompare(String(valB || ""));
63111
+ return valueAsString(valA || "").localeCompare(valueAsString(valB || ""));
60749
63112
  })
60750
63113
  };
60751
63114
  });
@@ -108283,8 +110646,8 @@ var LogListGrid = ({ items, currentPath, scopeKey, gridRef: externalGridRef, mod
108283
110646
  onGridReady: handleGridReady,
108284
110647
  onRowClicked: handleRowClick,
108285
110648
  onCellMouseDown: handleCellMouseDown,
108286
- onSortChanged: handleSortChanged,
108287
- onFilterChanged: handleFilterChanged,
110649
+ onSortChanged: () => void handleSortChanged(),
110650
+ onFilterChanged: () => void handleFilterChanged(),
108288
110651
  onModelUpdated: handleModelUpdated,
108289
110652
  loading: data.length === 0 && (loading > 0 || syncing)
108290
110653
  }, scopeKey ?? "pending")
@@ -109128,7 +111491,7 @@ var FindBand = () => {
109128
111491
  }, [handleSearch]);
109129
111492
  const debouncedSearchRef = useRef(null);
109130
111493
  useEffect(() => {
109131
- debouncedSearchRef.current = debounce$2(runDebouncedSearch, 300);
111494
+ debouncedSearchRef.current = debounce$2(() => void runDebouncedSearch(), 300);
109132
111495
  }, [runDebouncedSearch]);
109133
111496
  const handleInputChange = useCallback(() => {
109134
111497
  debouncedSearchRef.current?.();
@@ -110568,13 +112931,14 @@ var ToolTextOutput = ({ text }) => {
110568
112931
  output: text,
110569
112932
  style: { fontSize: "clamp(0.4rem, 1.15vw, 0.9rem)" }
110570
112933
  });
110571
- return /* @__PURE__ */ jsx("pre", {
112934
+ const { text: capped, notice } = cappedText(text);
112935
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("pre", {
110572
112936
  className: clsx(ToolOutput_module_default.textOutput, "tool-output"),
110573
112937
  children: /* @__PURE__ */ jsx("code", {
110574
112938
  className: clsx("sourceCode", ToolOutput_module_default.textCode),
110575
- children: text.trim()
112939
+ children: capped.trim()
110576
112940
  })
110577
- });
112941
+ }), notice] });
110578
112942
  };
110579
112943
  //#endregion
110580
112944
  //#region ../../packages/inspect-components/src/chat/MessageContent.tsx
@@ -111572,7 +113936,7 @@ var ChatView = ({ id, messages, className, display, labels, linking, tools, refe
111572
113936
  });
111573
113937
  };
111574
113938
  //#endregion
111575
- //#region ../../node_modules/.pnpm/@tanstack+virtual-core@3.17.0/node_modules/@tanstack/virtual-core/dist/esm/lazy-measurements.js
113939
+ //#region ../../node_modules/.pnpm/@tanstack+virtual-core@3.17.1/node_modules/@tanstack/virtual-core/dist/esm/lazy-measurements.js
111576
113940
  function createLazyMeasurementsView(count, flat, getItemKey) {
111577
113941
  const cache = new Array(count);
111578
113942
  return new Proxy(cache, { get(target, prop, receiver) {
@@ -111602,7 +113966,7 @@ function createLazyMeasurementsView(count, flat, getItemKey) {
111602
113966
  } });
111603
113967
  }
111604
113968
  //#endregion
111605
- //#region ../../node_modules/.pnpm/@tanstack+virtual-core@3.17.0/node_modules/@tanstack/virtual-core/dist/esm/utils.js
113969
+ //#region ../../node_modules/.pnpm/@tanstack+virtual-core@3.17.1/node_modules/@tanstack/virtual-core/dist/esm/utils.js
111606
113970
  function memo$1(getDeps, fn, opts) {
111607
113971
  let deps = opts.initialDeps ?? [];
111608
113972
  let result;
@@ -111654,7 +114018,7 @@ var debounce = (targetWindow, fn, ms) => {
111654
114018
  };
111655
114019
  };
111656
114020
  //#endregion
111657
- //#region ../../node_modules/.pnpm/@tanstack+virtual-core@3.17.0/node_modules/@tanstack/virtual-core/dist/esm/index.js
114021
+ //#region ../../node_modules/.pnpm/@tanstack+virtual-core@3.17.1/node_modules/@tanstack/virtual-core/dist/esm/index.js
111658
114022
  var _isIOSResult;
111659
114023
  var isIOSWebKit = () => {
111660
114024
  if (_isIOSResult !== void 0) return _isIOSResult;
@@ -112333,7 +114697,7 @@ var Virtualizer = class {
112333
114697
  size: cachedSize,
112334
114698
  end: itemStart + cachedSize,
112335
114699
  lane: 0
112336
- }, delta, this) : itemStart < this.getScrollOffset() + this.scrollAdjustments && this.scrollDirection !== "backward");
114700
+ }, delta, this) : itemStart < this.getScrollOffset() + this.scrollAdjustments && (!this.itemSizeCache.has(key) || this.scrollDirection !== "backward"));
112337
114701
  if (this.pendingMin === null || index < this.pendingMin) this.pendingMin = index;
112338
114702
  this.itemSizeCache.set(key, size);
112339
114703
  this.itemSizeCacheVersion++;
@@ -112618,7 +114982,7 @@ function calculateRange({ measurements, outerSize, scrollOffset, lanes, flat })
112618
114982
  };
112619
114983
  }
112620
114984
  //#endregion
112621
- //#region ../../node_modules/.pnpm/@tanstack+react-virtual@3.14.2_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@tanstack/react-virtual/dist/esm/index.js
114985
+ //#region ../../node_modules/.pnpm/@tanstack+react-virtual@3.14.3_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@tanstack/react-virtual/dist/esm/index.js
112622
114986
  var useIsomorphicLayoutEffect = typeof document !== "undefined" ? React$1.useLayoutEffect : React$1.useEffect;
112623
114987
  function useVirtualizerBase({ useFlushSync = true, directDomUpdates = false, directDomUpdatesMode = "transform", ...options }) {
112624
114988
  const rerender = React$1.useReducer((x) => x + 1, 0)[1];
@@ -112634,9 +114998,9 @@ function useVirtualizerBase({ useFlushSync = true, directDomUpdates = false, dir
112634
114998
  directRef.current.mode = directDomUpdatesMode;
112635
114999
  const applyDirectStyles = (instance2) => {
112636
115000
  const state = directRef.current;
112637
- if (!state.enabled) return;
115001
+ if (!state.enabled || !state.container) return;
112638
115002
  const totalSize = instance2.getTotalSize();
112639
- if (state.container && totalSize !== state.lastSize) {
115003
+ if (totalSize !== state.lastSize) {
112640
115004
  state.lastSize = totalSize;
112641
115005
  const sizeAxis = instance2.options.horizontal ? "width" : "height";
112642
115006
  state.container.style[sizeAxis] = `${totalSize}px`;
@@ -116179,15 +118543,15 @@ var EventPanel = ({ eventNodeId, className, title, subTitle, text, icon, childre
116179
118543
  const pillId = (index) => `${eventNodeId}-nav-pill-${index}`;
116180
118544
  const filteredArrChildren = (Array.isArray(children) ? children : [children]).filter(Boolean);
116181
118545
  const defaultPill = filteredArrChildren.findIndex((node) => hasDataDefault(node) && node.props["data-default"]);
116182
- const [selectedNav, setSelectedNav] = useProperty(eventNodeId, "selectedNav", { defaultValue: defaultPill !== -1 ? pillId(defaultPill) : pillId(0) });
118546
+ const defaultPillId = defaultPill !== -1 ? pillId(defaultPill) : pillId(0);
118547
+ const showNavs = !(isCollapsible && collapsibleContent && collapsed) && filteredArrChildren.length > 1;
118548
+ const [selectedNav, setSelectedNav] = useProperty(eventNodeId, "selectedNav", { defaultValue: defaultPillId });
116183
118549
  const stickyRef = useStickyObserver();
116184
118550
  const gridColumns = [];
116185
118551
  if (isCollapsible && !useBottomDongle) gridColumns.push("minmax(0, max-content)");
116186
118552
  if (icon) gridColumns.push("max-content");
116187
118553
  gridColumns.push("minmax(0, max-content)");
116188
118554
  gridColumns.push("minmax(0, 1fr)");
116189
- gridColumns.push("minmax(0, max-content)");
116190
- gridColumns.push("auto");
116191
118555
  if (turnLabel) gridColumns.push("max-content");
116192
118556
  if (eventLabel) gridColumns.push("max-content");
116193
118557
  const toggleCollapse = useCallback(() => {
@@ -116236,15 +118600,10 @@ var EventPanel = ({ eventNodeId, className, title, subTitle, text, icon, childre
116236
118600
  }) : null
116237
118601
  ]
116238
118602
  }),
116239
- /* @__PURE__ */ jsx("div", { onClick: toggleCollapse }),
116240
- /* @__PURE__ */ jsx("div", {
116241
- className: clsx("text-style-secondary", EventPanel_module_default.label),
116242
- onClick: toggleCollapse,
116243
- children: collapsed ? text : ""
116244
- }),
116245
118603
  /* @__PURE__ */ jsx("div", {
116246
118604
  className: EventPanel_module_default.navs,
116247
- children: isCollapsible && collapsibleContent && collapsed ? "" : filteredArrChildren && filteredArrChildren.length > 1 ? /* @__PURE__ */ jsx(EventNavs, {
118605
+ onClick: showNavs ? void 0 : toggleCollapse,
118606
+ children: showNavs ? /* @__PURE__ */ jsx(EventNavs, {
116248
118607
  navs: filteredArrChildren.map((child, index) => {
116249
118608
  const defaultTitle = `Tab ${index}`;
116250
118609
  const title = child && isValidElement(child) ? child.props["data-name"] || defaultTitle : defaultTitle;
@@ -116256,7 +118615,10 @@ var EventPanel = ({ eventNodeId, className, title, subTitle, text, icon, childre
116256
118615
  }),
116257
118616
  selectedNav: selectedNav || "",
116258
118617
  setSelectedNav
116259
- }) : ""
118618
+ }) : collapsed && text ? /* @__PURE__ */ jsx("span", {
118619
+ className: clsx("text-style-secondary", EventPanel_module_default.label),
118620
+ children: text
118621
+ }) : null
116260
118622
  }),
116261
118623
  turnLabel && /* @__PURE__ */ jsx("span", {
116262
118624
  className: clsx(EventPanel_module_default.turnLabel),
@@ -116437,9 +118799,9 @@ var DiffContext = class extends Context {
116437
118799
  if (typeof result === "object") {
116438
118800
  if (((_a = this.options) === null || _a === void 0 ? void 0 : _a.omitRemovedValues) && Array.isArray(result) && result.length > 1 && (result.length === 2 || result[2] === 0 || result[2] === 3)) result[0] = 0;
116439
118801
  if ((_b = this.options) === null || _b === void 0 ? void 0 : _b.cloneDiffValues) {
116440
- const clone$1 = typeof ((_c = this.options) === null || _c === void 0 ? void 0 : _c.cloneDiffValues) === "function" ? (_d = this.options) === null || _d === void 0 ? void 0 : _d.cloneDiffValues : clone;
116441
- if (typeof result[0] === "object") result[0] = clone$1(result[0]);
116442
- if (typeof result[1] === "object") result[1] = clone$1(result[1]);
118802
+ const clone$2 = typeof ((_c = this.options) === null || _c === void 0 ? void 0 : _c.cloneDiffValues) === "function" ? (_d = this.options) === null || _d === void 0 ? void 0 : _d.cloneDiffValues : clone;
118803
+ if (typeof result[0] === "object") result[0] = clone$2(result[0]);
118804
+ if (typeof result[1] === "object") result[1] = clone$2(result[1]);
116443
118805
  }
116444
118806
  }
116445
118807
  return result;
@@ -125952,6 +128314,26 @@ var isCanceledError = (type) => {
125952
128314
  };
125953
128315
  //#endregion
125954
128316
  //#region src/app/shared/samples-grid/colorScale.ts
128317
+ /**
128318
+ * Pure colour-scale resolver for score-cell backgrounds.
128319
+ *
128320
+ * The wire shape (from the Python `TaskSamplesView.score_color_scales`
128321
+ * field) is one of:
128322
+ *
128323
+ * - a named palette string (numeric scores) — `"good-high"` etc.
128324
+ * - a value→role map (categorical scores) — `{ "yes": "bad", ... }`
128325
+ *
128326
+ * Both forms resolve to Bootstrap `*-bg-subtle` CSS variables, so the
128327
+ * actual colour the browser paints adapts to light / dark mode without
128328
+ * any JS-side colour math. We never produce hex strings — we produce
128329
+ * CSS expressions that reference the live theme variables, often via
128330
+ * `color-mix()` for smooth interpolation across a numeric range.
128331
+ *
128332
+ * Future v2 can add an explicit `list[ColorStop]` form for hand-rolled
128333
+ * gradients (e.g. "0 transparent → 10 blue") by extending
128334
+ * `WireScoreColorScale` and `resolveScale`; the consumer-side
128335
+ * `colorForValue` API stays the same.
128336
+ */
125955
128337
  var ROLE_TO_VAR = {
125956
128338
  good: "var(--bs-success-bg-subtle)",
125957
128339
  bad: "var(--bs-danger-bg-subtle)",
@@ -126041,7 +128423,7 @@ function colorForValue(scale, value) {
126041
128423
  return `color-mix(in srgb, ${scale.high} ${pct}%, ${scale.mid})`;
126042
128424
  }
126043
128425
  if (value === null || value === void 0) return void 0;
126044
- const key = typeof value === "string" ? value : String(value);
128426
+ const key = typeof value === "string" ? value : valueAsString(value);
126045
128427
  return scale.colors[key];
126046
128428
  }
126047
128429
  var clamp01 = (n) => n < 0 ? 0 : n > 1 ? 1 : n;
@@ -126444,7 +128826,7 @@ var ScorePanel_module_default = {
126444
128826
  function scoreTone(value, scoreType) {
126445
128827
  if (value === void 0 || value === null) return "neutral";
126446
128828
  if (scoreType === "passfail") {
126447
- const s = String(value).toUpperCase();
128829
+ const s = valueAsString(value).toUpperCase();
126448
128830
  if (s === "C" || s === "A" || s === "B") return "pass";
126449
128831
  if (s === "I" || s === "F" || s === "N") return "fail";
126450
128832
  if (s === "P") return "warn";
@@ -126505,7 +128887,7 @@ var CircleValue = ({ value, scoreType, size = 18 }) => {
126505
128887
  if (scoreType === "passfail" && value !== void 0) return /* @__PURE__ */ jsx("span", {
126506
128888
  className: clsx(ScoreValueDisplay_module_default.circle, toneCircleClass(tone)),
126507
128889
  style: sizeStyle,
126508
- children: String(value)
128890
+ children: valueAsString(value)
126509
128891
  });
126510
128892
  if (scoreType === "boolean") return /* @__PURE__ */ jsx("span", {
126511
128893
  className: clsx(ScoreValueDisplay_module_default.circle, toneCircleClass(tone)),
@@ -126783,8 +129165,8 @@ function makeCompare(column) {
126783
129165
  if (an !== null && bn !== null) return an - bn;
126784
129166
  if (an !== null) return -1;
126785
129167
  if (bn !== null) return 1;
126786
- const as = av === void 0 ? "" : String(av);
126787
- const bs = bv === void 0 ? "" : String(bv);
129168
+ const as = av === void 0 ? "" : valueAsString(av);
129169
+ const bs = bv === void 0 ? "" : valueAsString(bv);
126788
129170
  return as.localeCompare(bs, void 0, { numeric: true });
126789
129171
  };
126790
129172
  }
@@ -130456,6 +132838,7 @@ var TranscriptPanel = memo((props) => {
130456
132838
  emptyBusy: running && isDefaultFilter
130457
132839
  });
130458
132840
  });
132841
+ TranscriptPanel.displayName = "TranscriptPanel";
130459
132842
  //#endregion
130460
132843
  //#region src/app/samples/SampleDisplay.tsx
130461
132844
  /**
@@ -131758,7 +134141,7 @@ var asyncJsonParse = async (text) => {
131758
134141
  } catch {
131759
134142
  result = import_dist.default.parse(text);
131760
134143
  }
131761
- return Promise.resolve(result);
134144
+ return result;
131762
134145
  } else return workerPool.parse(text);
131763
134146
  };
131764
134147
  /**
@@ -131860,6 +134243,8 @@ self.onmessage = function (e) {
131860
134243
  var kJson5ScriptBase64 = `IWZ1bmN0aW9uKHUsRCl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1EKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoRCk6dS5KU09ONT1EKCl9KHRoaXMsZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdSh1LEQpe3JldHVybiB1KEQ9e2V4cG9ydHM6e319LEQuZXhwb3J0cyksRC5leHBvcnRzfXZhciBEPXUoZnVuY3Rpb24odSl7dmFyIEQ9dS5leHBvcnRzPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuTWF0aD09TWF0aD93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiZzZWxmLk1hdGg9PU1hdGg/c2VsZjpGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpOyJudW1iZXIiPT10eXBlb2YgX19nJiYoX19nPUQpfSksZT11KGZ1bmN0aW9uKHUpe3ZhciBEPXUuZXhwb3J0cz17dmVyc2lvbjoiMi42LjUifTsibnVtYmVyIj09dHlwZW9mIF9fZSYmKF9fZT1EKX0pLHI9KGUudmVyc2lvbixmdW5jdGlvbih1KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHU/bnVsbCE9PXU6ImZ1bmN0aW9uIj09dHlwZW9mIHV9KSx0PWZ1bmN0aW9uKHUpe2lmKCFyKHUpKXRocm93IFR5cGVFcnJvcih1KyIgaXMgbm90IGFuIG9iamVjdCEiKTtyZXR1cm4gdX0sbj1mdW5jdGlvbih1KXt0cnl7cmV0dXJuISF1KCl9Y2F0Y2godSl7cmV0dXJuITB9fSxGPSFuKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KSxDPUQuZG9jdW1lbnQsQT1yKEMpJiZyKEMuY3JlYXRlRWxlbWVudCksaT0hRiYmIW4oZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KCh1PSJkaXYiLEE/Qy5jcmVhdGVFbGVtZW50KHUpOnt9KSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmE7dmFyIHV9KSxFPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxvPXtmOkY/T2JqZWN0LmRlZmluZVByb3BlcnR5OmZ1bmN0aW9uKHUsRCxlKXtpZih0KHUpLEQ9ZnVuY3Rpb24odSxEKXtpZighcih1KSlyZXR1cm4gdTt2YXIgZSx0O2lmKEQmJiJmdW5jdGlvbiI9PXR5cGVvZihlPXUudG9TdHJpbmcpJiYhcih0PWUuY2FsbCh1KSkpcmV0dXJuIHQ7aWYoImZ1bmN0aW9uIj09dHlwZW9mKGU9dS52YWx1ZU9mKSYmIXIodD1lLmNhbGwodSkpKXJldHVybiB0O2lmKCFEJiYiZnVuY3Rpb24iPT10eXBlb2YoZT11LnRvU3RyaW5nKSYmIXIodD1lLmNhbGwodSkpKXJldHVybiB0O3Rocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9KEQsITApLHQoZSksaSl0cnl7cmV0dXJuIEUodSxELGUpfWNhdGNoKHUpe31pZigiZ2V0ImluIGV8fCJzZXQiaW4gZSl0aHJvdyBUeXBlRXJyb3IoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkISIpO3JldHVybiJ2YWx1ZSJpbiBlJiYodVtEXT1lLnZhbHVlKSx1fX0sYT1GP2Z1bmN0aW9uKHUsRCxlKXtyZXR1cm4gby5mKHUsRCxmdW5jdGlvbih1LEQpe3JldHVybntlbnVtZXJhYmxlOiEoMSZ1KSxjb25maWd1cmFibGU6ISgyJnUpLHdyaXRhYmxlOiEoNCZ1KSx2YWx1ZTpEfX0oMSxlKSl9OmZ1bmN0aW9uKHUsRCxlKXtyZXR1cm4gdVtEXT1lLHV9LGM9e30uaGFzT3duUHJvcGVydHksQj1mdW5jdGlvbih1LEQpe3JldHVybiBjLmNhbGwodSxEKX0scz0wLGY9TWF0aC5yYW5kb20oKSxsPXUoZnVuY3Rpb24odSl7dmFyIHI9RFsiX19jb3JlLWpzX3NoYXJlZF9fIl18fChEWyJfX2NvcmUtanNfc2hhcmVkX18iXT17fSk7KHUuZXhwb3J0cz1mdW5jdGlvbih1LEQpe3JldHVybiByW3VdfHwoclt1XT12b2lkIDAhPT1EP0Q6e30pfSkoInZlcnNpb25zIixbXSkucHVzaCh7dmVyc2lvbjplLnZlcnNpb24sbW9kZToiZ2xvYmFsIixjb3B5cmlnaHQ6IsKpIDIwMTkgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSkifSl9KSgibmF0aXZlLWZ1bmN0aW9uLXRvLXN0cmluZyIsRnVuY3Rpb24udG9TdHJpbmcpLGQ9dShmdW5jdGlvbih1KXt2YXIgcix0PSJTeW1ib2woIi5jb25jYXQodm9pZCAwPT09KHI9InNyYyIpPyIiOnIsIilfIiwoKytzK2YpLnRvU3RyaW5nKDM2KSksbj0oIiIrbCkuc3BsaXQoInRvU3RyaW5nIik7ZS5pbnNwZWN0U291cmNlPWZ1bmN0aW9uKHUpe3JldHVybiBsLmNhbGwodSl9LCh1LmV4cG9ydHM9ZnVuY3Rpb24odSxlLHIsRil7dmFyIEM9ImZ1bmN0aW9uIj09dHlwZW9mIHI7QyYmKEIociwibmFtZSIpfHxhKHIsIm5hbWUiLGUpKSx1W2VdIT09ciYmKEMmJihCKHIsdCl8fGEocix0LHVbZV0/IiIrdVtlXTpuLmpvaW4oU3RyaW5nKGUpKSkpLHU9PT1EP3VbZV09cjpGP3VbZV0/dVtlXT1yOmEodSxlLHIpOihkZWxldGUgdVtlXSxhKHUsZSxyKSkpfSkoRnVuY3Rpb24ucHJvdG90eXBlLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdGhpcyYmdGhpc1t0XXx8bC5jYWxsKHRoaXMpfSl9KSx2PWZ1bmN0aW9uKHUsRCxlKXtpZihmdW5jdGlvbih1KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdSl0aHJvdyBUeXBlRXJyb3IodSsiIGlzIG5vdCBhIGZ1bmN0aW9uISIpfSh1KSx2b2lkIDA9PT1EKXJldHVybiB1O3N3aXRjaChlKXtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB1LmNhbGwoRCxlKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihlLHIpe3JldHVybiB1LmNhbGwoRCxlLHIpfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKGUscix0KXtyZXR1cm4gdS5jYWxsKEQsZSxyLHQpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdS5hcHBseShELGFyZ3VtZW50cyl9fSxwPWZ1bmN0aW9uKHUscix0KXt2YXIgbixGLEMsQSxpPXUmcC5GLEU9dSZwLkcsbz11JnAuUyxjPXUmcC5QLEI9dSZwLkIscz1FP0Q6bz9EW3JdfHwoRFtyXT17fSk6KERbcl18fHt9KS5wcm90b3R5cGUsZj1FP2U6ZVtyXXx8KGVbcl09e30pLGw9Zi5wcm90b3R5cGV8fChmLnByb3RvdHlwZT17fSk7Zm9yKG4gaW4gRSYmKHQ9ciksdClDPSgoRj0haSYmcyYmdm9pZCAwIT09c1tuXSk/czp0KVtuXSxBPUImJkY/dihDLEQpOmMmJiJmdW5jdGlvbiI9PXR5cGVvZiBDP3YoRnVuY3Rpb24uY2FsbCxDKTpDLHMmJmQocyxuLEMsdSZwLlUpLGZbbl0hPUMmJmEoZixuLEEpLGMmJmxbbl0hPUMmJihsW25dPUMpfTtELmNvcmU9ZSxwLkY9MSxwLkc9MixwLlM9NCxwLlA9OCxwLkI9MTYscC5XPTMyLHAuVT02NCxwLlI9MTI4O3ZhciBoLG09cCxnPU1hdGguY2VpbCx5PU1hdGguZmxvb3Isdz1mdW5jdGlvbih1KXtyZXR1cm4gaXNOYU4odT0rdSk/MDoodT4wP3k6ZykodSl9LGI9KGg9ITEsZnVuY3Rpb24odSxEKXt2YXIgZSxyLHQ9U3RyaW5nKGZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgIit1KTtyZXR1cm4gdX0odSkpLG49dyhEKSxGPXQubGVuZ3RoO3JldHVybiBuPDB8fG4+PUY/aD8iIjp2b2lkIDA6KGU9dC5jaGFyQ29kZUF0KG4pKTw1NTI5Nnx8ZT41NjMxOXx8bisxPT09Rnx8KHI9dC5jaGFyQ29kZUF0KG4rMSkpPDU2MzIwfHxyPjU3MzQzP2g/dC5jaGFyQXQobik6ZTpoP3Quc2xpY2UobixuKzIpOnItNTYzMjArKGUtNTUyOTY8PDEwKSs2NTUzNn0pO20obS5QLCJTdHJpbmciLHtjb2RlUG9pbnRBdDpmdW5jdGlvbih1KXtyZXR1cm4gYih0aGlzLHUpfX0pO2UuU3RyaW5nLmNvZGVQb2ludEF0O3ZhciBTPU1hdGgubWF4LHg9TWF0aC5taW4sTj1TdHJpbmcuZnJvbUNoYXJDb2RlLFA9U3RyaW5nLmZyb21Db2RlUG9pbnQ7bShtLlMrbS5GKighIVAmJjEhPVAubGVuZ3RoKSwiU3RyaW5nIix7ZnJvbUNvZGVQb2ludDpmdW5jdGlvbih1KXtmb3IodmFyIEQsZSxyLHQ9YXJndW1lbnRzLG49W10sRj1hcmd1bWVudHMubGVuZ3RoLEM9MDtGPkM7KXtpZihEPSt0W0MrK10scj0xMTE0MTExLCgoZT13KGU9RCkpPDA/UyhlK3IsMCk6eChlLHIpKSE9PUQpdGhyb3cgUmFuZ2VFcnJvcihEKyIgaXMgbm90IGEgdmFsaWQgY29kZSBwb2ludCIpO24ucHVzaChEPDY1NTM2P04oRCk6Tig1NTI5NisoKEQtPTY1NTM2KT4+MTApLEQlMTAyNCs1NjMyMCkpfXJldHVybiBuLmpvaW4oIiIpfX0pO2UuU3RyaW5nLmZyb21Db2RlUG9pbnQ7dmFyIF8sTyxqLEksVixKLE0sayxMLFQseixILCQsUixHPXtTcGFjZV9TZXBhcmF0b3I6L1tcdTE2ODBcdTIwMDAtXHUyMDBBXHUyMDJGXHUyMDVGXHUzMDAwXS8sSURfU3RhcnQ6L1tceEFBXHhCNVx4QkFceEMwLVx4RDZceEQ4LVx4RjZceEY4LVx1MDJDMVx1MDJDNi1cdTAyRDFcdTAyRTAtXHUwMkU0XHUwMkVDXHUwMkVFXHUwMzcwLVx1MDM3NFx1MDM3Nlx1MDM3N1x1MDM3QS1cdTAzN0RcdTAzN0ZcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzRjVcdTAzRjctXHUwNDgxXHUwNDhBLVx1MDUyRlx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjEtXHUwNTg3XHUwNUQwLVx1MDVFQVx1MDVGMC1cdTA1RjJcdTA2MjAtXHUwNjRBXHUwNjZFXHUwNjZGXHUwNjcxLVx1MDZEM1x1MDZENVx1MDZFNVx1MDZFNlx1MDZFRVx1MDZFRlx1MDZGQS1cdTA2RkNcdTA2RkZcdTA3MTBcdTA3MTItXHUwNzJGXHUwNzRELVx1MDdBNVx1MDdCMVx1MDdDQS1cdTA3RUFcdTA3RjRcdTA3RjVcdTA3RkFcdTA4MDAtXHUwODE1XHUwODFBXHUwODI0XHUwODI4XHUwODQwLVx1MDg1OFx1MDg2MC1cdTA4NkFcdTA4QTAtXHUwOEI0XHUwOEI2LVx1MDhCRFx1MDkwNC1cdTA5MzlcdTA5M0RcdTA5NTBcdTA5NTgtXHUwOTYxXHUwOTcxLVx1MDk4MFx1MDk4NS1cdTA5OENcdTA5OEZcdTA5OTBcdTA5OTMtXHUwOUE4XHUwOUFBLVx1MDlCMFx1MDlCMlx1MDlCNi1cdTA5QjlcdTA5QkRcdTA5Q0VcdTA5RENcdTA5RERcdTA5REYtXHUwOUUxXHUwOUYwXHUwOUYxXHUwOUZDXHUwQTA1LVx1MEEwQVx1MEEwRlx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyXHUwQTMzXHUwQTM1XHUwQTM2XHUwQTM4XHUwQTM5XHUwQTU5LVx1MEE1Q1x1MEE1RVx1MEE3Mi1cdTBBNzRcdTBBODUtXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyXHUwQUIzXHUwQUI1LVx1MEFCOVx1MEFCRFx1MEFEMFx1MEFFMFx1MEFFMVx1MEFGOVx1MEIwNS1cdTBCMENcdTBCMEZcdTBCMTBcdTBCMTMtXHUwQjI4XHUwQjJBLVx1MEIzMFx1MEIzMlx1MEIzM1x1MEIzNS1cdTBCMzlcdTBCM0RcdTBCNUNcdTBCNURcdTBCNUYtXHUwQjYxXHUwQjcxXHUwQjgzXHUwQjg1LVx1MEI4QVx1MEI4RS1cdTBCOTBcdTBCOTItXHUwQjk1XHUwQjk5XHUwQjlBXHUwQjlDXHUwQjlFXHUwQjlGXHUwQkEzXHUwQkE0XHUwQkE4LVx1MEJBQVx1MEJBRS1cdTBCQjlcdTBCRDBcdTBDMDUtXHUwQzBDXHUwQzBFLVx1MEMxMFx1MEMxMi1cdTBDMjhcdTBDMkEtXHUwQzM5XHUwQzNEXHUwQzU4LVx1MEM1QVx1MEM2MFx1MEM2MVx1MEM4MFx1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0JEXHUwQ0RFXHUwQ0UwXHUwQ0UxXHUwQ0YxXHUwQ0YyXHUwRDA1LVx1MEQwQ1x1MEQwRS1cdTBEMTBcdTBEMTItXHUwRDNBXHUwRDNEXHUwRDRFXHUwRDU0LVx1MEQ1Nlx1MEQ1Ri1cdTBENjFcdTBEN0EtXHUwRDdGXHUwRDg1LVx1MEQ5Nlx1MEQ5QS1cdTBEQjFcdTBEQjMtXHUwREJCXHUwREJEXHUwREMwLVx1MERDNlx1MEUwMS1cdTBFMzBcdTBFMzJcdTBFMzNcdTBFNDAtXHUwRTQ2XHUwRTgxXHUwRTgyXHUwRTg0XHUwRTg3XHUwRTg4XHUwRThBXHUwRThEXHUwRTk0LVx1MEU5N1x1MEU5OS1cdTBFOUZcdTBFQTEtXHUwRUEzXHUwRUE1XHUwRUE3XHUwRUFBXHUwRUFCXHUwRUFELVx1MEVCMFx1MEVCMlx1MEVCM1x1MEVCRFx1MEVDMC1cdTBFQzRcdTBFQzZcdTBFREMtXHUwRURGXHUwRjAwXHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNkNcdTBGODgtXHUwRjhDXHUxMDAwLVx1MTAyQVx1MTAzRlx1MTA1MC1cdTEwNTVcdTEwNUEtXHUxMDVEXHUxMDYxXHUxMDY1XHUxMDY2XHUxMDZFLVx1MTA3MFx1MTA3NS1cdTEwODFcdTEwOEVcdTEwQTAtXHUxMEM1XHUxMEM3XHUxMENEXHUxMEQwLVx1MTBGQVx1MTBGQy1cdTEyNDhcdTEyNEEtXHUxMjREXHUxMjUwLVx1MTI1Nlx1MTI1OFx1MTI1QS1cdTEyNURcdTEyNjAtXHUxMjg4XHUxMjhBLVx1MTI4RFx1MTI5MC1cdTEyQjBcdTEyQjItXHUxMkI1XHUxMkI4LVx1MTJCRVx1MTJDMFx1MTJDMi1cdTEyQzVcdTEyQzgtXHUxMkQ2XHUxMkQ4LVx1MTMxMFx1MTMxMi1cdTEzMTVcdTEzMTgtXHUxMzVBXHUxMzgwLVx1MTM4Rlx1MTNBMC1cdTEzRjVcdTEzRjgtXHUxM0ZEXHUxNDAxLVx1MTY2Q1x1MTY2Ri1cdTE2N0ZcdTE2ODEtXHUxNjlBXHUxNkEwLVx1MTZFQVx1MTZFRS1cdTE2RjhcdTE3MDAtXHUxNzBDXHUxNzBFLVx1MTcxMVx1MTcyMC1cdTE3MzFcdTE3NDAtXHUxNzUxXHUxNzYwLVx1MTc2Q1x1MTc2RS1cdTE3NzBcdTE3ODAtXHUxN0IzXHUxN0Q3XHUxN0RDXHUxODIwLVx1MTg3N1x1MTg4MC1cdTE4ODRcdTE4ODctXHUxOEE4XHUxOEFBXHUxOEIwLVx1MThGNVx1MTkwMC1cdTE5MUVcdTE5NTAtXHUxOTZEXHUxOTcwLVx1MTk3NFx1MTk4MC1cdTE5QUJcdTE5QjAtXHUxOUM5XHUxQTAwLVx1MUExNlx1MUEyMC1cdTFBNTRcdTFBQTdcdTFCMDUtXHUxQjMzXHUxQjQ1LVx1MUI0Qlx1MUI4My1cdTFCQTBcdTFCQUVcdTFCQUZcdTFCQkEtXHUxQkU1XHUxQzAwLVx1MUMyM1x1MUM0RC1cdTFDNEZcdTFDNUEtXHUxQzdEXHUxQzgwLVx1MUM4OFx1MUNFOS1cdTFDRUNcdTFDRUUtXHUxQ0YxXHUxQ0Y1XHUxQ0Y2XHUxRDAwLVx1MURCRlx1MUUwMC1cdTFGMTVcdTFGMTgtXHUxRjFEXHUxRjIwLVx1MUY0NVx1MUY0OC1cdTFGNERcdTFGNTAtXHUxRjU3XHUxRjU5XHUxRjVCXHUxRjVEXHUxRjVGLVx1MUY3RFx1MUY4MC1cdTFGQjRcdTFGQjYtXHUxRkJDXHUxRkJFXHUxRkMyLVx1MUZDNFx1MUZDNi1cdTFGQ0NcdTFGRDAtXHUxRkQzXHUxRkQ2LVx1MUZEQlx1MUZFMC1cdTFGRUNcdTFGRjItXHUxRkY0XHUxRkY2LVx1MUZGQ1x1MjA3MVx1MjA3Rlx1MjA5MC1cdTIwOUNcdTIxMDJcdTIxMDdcdTIxMEEtXHUyMTEzXHUyMTE1XHUyMTE5LVx1MjExRFx1MjEyNFx1MjEyNlx1MjEyOFx1MjEyQS1cdTIxMkRcdTIxMkYtXHUyMTM5XHUyMTNDLVx1MjEzRlx1MjE0NS1cdTIxNDlcdTIxNEVcdTIxNjAtXHUyMTg4XHUyQzAwLVx1MkMyRVx1MkMzMC1cdTJDNUVcdTJDNjAtXHUyQ0U0XHUyQ0VCLVx1MkNFRVx1MkNGMlx1MkNGM1x1MkQwMC1cdTJEMjVcdTJEMjdcdTJEMkRcdTJEMzAtXHUyRDY3XHUyRDZGXHUyRDgwLVx1MkQ5Nlx1MkRBMC1cdTJEQTZcdTJEQTgtXHUyREFFXHUyREIwLVx1MkRCNlx1MkRCOC1cdTJEQkVcdTJEQzAtXHUyREM2XHUyREM4LVx1MkRDRVx1MkREMC1cdTJERDZcdTJERDgtXHUyRERFXHUyRTJGXHUzMDA1LVx1MzAwN1x1MzAyMS1cdTMwMjlcdTMwMzEtXHUzMDM1XHUzMDM4LVx1MzAzQ1x1MzA0MS1cdTMwOTZcdTMwOUQtXHUzMDlGXHUzMEExLVx1MzBGQVx1MzBGQy1cdTMwRkZcdTMxMDUtXHUzMTJFXHUzMTMxLVx1MzE4RVx1MzFBMC1cdTMxQkFcdTMxRjAtXHUzMUZGXHUzNDAwLVx1NERCNVx1NEUwMC1cdTlGRUFcdUEwMDAtXHVBNDhDXHVBNEQwLVx1QTRGRFx1QTUwMC1cdUE2MENcdUE2MTAtXHVBNjFGXHVBNjJBXHVBNjJCXHVBNjQwLVx1QTY2RVx1QTY3Ri1cdUE2OURcdUE2QTAtXHVBNkVGXHVBNzE3LVx1QTcxRlx1QTcyMi1cdUE3ODhcdUE3OEItXHVBN0FFXHVBN0IwLVx1QTdCN1x1QTdGNy1cdUE4MDFcdUE4MDMtXHVBODA1XHVBODA3LVx1QTgwQVx1QTgwQy1cdUE4MjJcdUE4NDAtXHVBODczXHVBODgyLVx1QThCM1x1QThGMi1cdUE4RjdcdUE4RkJcdUE4RkRcdUE5MEEtXHVBOTI1XHVBOTMwLVx1QTk0Nlx1QTk2MC1cdUE5N0NcdUE5ODQtXHVBOUIyXHVBOUNGXHVBOUUwLVx1QTlFNFx1QTlFNi1cdUE5RUZcdUE5RkEtXHVBOUZFXHVBQTAwLVx1QUEyOFx1QUE0MC1cdUFBNDJcdUFBNDQtXHVBQTRCXHVBQTYwLVx1QUE3Nlx1QUE3QVx1QUE3RS1cdUFBQUZcdUFBQjFcdUFBQjVcdUFBQjZcdUFBQjktXHVBQUJEXHVBQUMwXHVBQUMyXHVBQURCLVx1QUFERFx1QUFFMC1cdUFBRUFcdUFBRjItXHVBQUY0XHVBQjAxLVx1QUIwNlx1QUIwOS1cdUFCMEVcdUFCMTEtXHVBQjE2XHVBQjIwLVx1QUIyNlx1QUIyOC1cdUFCMkVcdUFCMzAtXHVBQjVBXHVBQjVDLVx1QUI2NVx1QUI3MC1cdUFCRTJcdUFDMDAtXHVEN0EzXHVEN0IwLVx1RDdDNlx1RDdDQi1cdUQ3RkJcdUY5MDAtXHVGQTZEXHVGQTcwLVx1RkFEOVx1RkIwMC1cdUZCMDZcdUZCMTMtXHVGQjE3XHVGQjFEXHVGQjFGLVx1RkIyOFx1RkIyQS1cdUZCMzZcdUZCMzgtXHVGQjNDXHVGQjNFXHVGQjQwXHVGQjQxXHVGQjQzXHVGQjQ0XHVGQjQ2LVx1RkJCMVx1RkJEMy1cdUZEM0RcdUZENTAtXHVGRDhGXHVGRDkyLVx1RkRDN1x1RkRGMC1cdUZERkJcdUZFNzAtXHVGRTc0XHVGRTc2LVx1RkVGQ1x1RkYyMS1cdUZGM0FcdUZGNDEtXHVGRjVBXHVGRjY2LVx1RkZCRVx1RkZDMi1cdUZGQzdcdUZGQ0EtXHVGRkNGXHVGRkQyLVx1RkZEN1x1RkZEQS1cdUZGRENdfFx1RDgwMFtcdURDMDAtXHVEQzBCXHVEQzBELVx1REMyNlx1REMyOC1cdURDM0FcdURDM0NcdURDM0RcdURDM0YtXHVEQzREXHVEQzUwLVx1REM1RFx1REM4MC1cdURDRkFcdURENDAtXHVERDc0XHVERTgwLVx1REU5Q1x1REVBMC1cdURFRDBcdURGMDAtXHVERjFGXHVERjJELVx1REY0QVx1REY1MC1cdURGNzVcdURGODAtXHVERjlEXHVERkEwLVx1REZDM1x1REZDOC1cdURGQ0ZcdURGRDEtXHVERkQ1XXxcdUQ4MDFbXHVEQzAwLVx1REM5RFx1RENCMC1cdURDRDNcdURDRDgtXHVEQ0ZCXHVERDAwLVx1REQyN1x1REQzMC1cdURENjNcdURFMDAtXHVERjM2XHVERjQwLVx1REY1NVx1REY2MC1cdURGNjddfFx1RDgwMltcdURDMDAtXHVEQzA1XHVEQzA4XHVEQzBBLVx1REMzNVx1REMzN1x1REMzOFx1REMzQ1x1REMzRi1cdURDNTVcdURDNjAtXHVEQzc2XHVEQzgwLVx1REM5RVx1RENFMC1cdURDRjJcdURDRjRcdURDRjVcdUREMDAtXHVERDE1XHVERDIwLVx1REQzOVx1REQ4MC1cdUREQjdcdUREQkVcdUREQkZcdURFMDBcdURFMTAtXHVERTEzXHVERTE1LVx1REUxN1x1REUxOS1cdURFMzNcdURFNjAtXHVERTdDXHVERTgwLVx1REU5Q1x1REVDMC1cdURFQzdcdURFQzktXHVERUU0XHVERjAwLVx1REYzNVx1REY0MC1cdURGNTVcdURGNjAtXHVERjcyXHVERjgwLVx1REY5MV18XHVEODAzW1x1REMwMC1cdURDNDhcdURDODAtXHVEQ0IyXHVEQ0MwLVx1RENGMl18XHVEODA0W1x1REMwMy1cdURDMzdcdURDODMtXHVEQ0FGXHVEQ0QwLVx1RENFOFx1REQwMy1cdUREMjZcdURENTAtXHVERDcyXHVERDc2XHVERDgzLVx1RERCMlx1RERDMS1cdUREQzRcdUREREFcdURERENcdURFMDAtXHVERTExXHVERTEzLVx1REUyQlx1REU4MC1cdURFODZcdURFODhcdURFOEEtXHVERThEXHVERThGLVx1REU5RFx1REU5Ri1cdURFQThcdURFQjAtXHVERURFXHVERjA1LVx1REYwQ1x1REYwRlx1REYxMFx1REYxMy1cdURGMjhcdURGMkEtXHVERjMwXHVERjMyXHVERjMzXHVERjM1LVx1REYzOVx1REYzRFx1REY1MFx1REY1RC1cdURGNjFdfFx1RDgwNVtcdURDMDAtXHVEQzM0XHVEQzQ3LVx1REM0QVx1REM4MC1cdURDQUZcdURDQzRcdURDQzVcdURDQzdcdUREODAtXHVEREFFXHVEREQ4LVx1REREQlx1REUwMC1cdURFMkZcdURFNDRcdURFODAtXHVERUFBXHVERjAwLVx1REYxOV18XHVEODA2W1x1RENBMC1cdURDREZcdURDRkZcdURFMDBcdURFMEItXHVERTMyXHVERTNBXHVERTUwXHVERTVDLVx1REU4M1x1REU4Ni1cdURFODlcdURFQzAtXHVERUY4XXxcdUQ4MDdbXHVEQzAwLVx1REMwOFx1REMwQS1cdURDMkVcdURDNDBcdURDNzItXHVEQzhGXHVERDAwLVx1REQwNlx1REQwOFx1REQwOVx1REQwQi1cdUREMzBcdURENDZdfFx1RDgwOFtcdURDMDAtXHVERjk5XXxcdUQ4MDlbXHVEQzAwLVx1REM2RVx1REM4MC1cdURENDNdfFtcdUQ4MENcdUQ4MUMtXHVEODIwXHVEODQwLVx1RDg2OFx1RDg2QS1cdUQ4NkNcdUQ4NkYtXHVEODcyXHVEODc0LVx1RDg3OV1bXHVEQzAwLVx1REZGRl18XHVEODBEW1x1REMwMC1cdURDMkVdfFx1RDgxMVtcdURDMDAtXHVERTQ2XXxcdUQ4MUFbXHVEQzAwLVx1REUzOFx1REU0MC1cdURFNUVcdURFRDAtXHVERUVEXHVERjAwLVx1REYyRlx1REY0MC1cdURGNDNcdURGNjMtXHVERjc3XHVERjdELVx1REY4Rl18XHVEODFCW1x1REYwMC1cdURGNDRcdURGNTBcdURGOTMtXHVERjlGXHVERkUwXHVERkUxXXxcdUQ4MjFbXHVEQzAwLVx1REZFQ118XHVEODIyW1x1REMwMC1cdURFRjJdfFx1RDgyQ1tcdURDMDAtXHVERDFFXHVERDcwLVx1REVGQl18XHVEODJGW1x1REMwMC1cdURDNkFcdURDNzAtXHVEQzdDXHVEQzgwLVx1REM4OFx1REM5MC1cdURDOTldfFx1RDgzNVtcdURDMDAtXHVEQzU0XHVEQzU2LVx1REM5Q1x1REM5RVx1REM5Rlx1RENBMlx1RENBNVx1RENBNlx1RENBOS1cdURDQUNcdURDQUUtXHVEQ0I5XHVEQ0JCXHVEQ0JELVx1RENDM1x1RENDNS1cdUREMDVcdUREMDctXHVERDBBXHVERDBELVx1REQxNFx1REQxNi1cdUREMUNcdUREMUUtXHVERDM5XHVERDNCLVx1REQzRVx1REQ0MC1cdURENDRcdURENDZcdURENEEtXHVERDUwXHVERDUyLVx1REVBNVx1REVBOC1cdURFQzBcdURFQzItXHVERURBXHVERURDLVx1REVGQVx1REVGQy1cdURGMTRcdURGMTYtXHVERjM0XHVERjM2LVx1REY0RVx1REY1MC1cdURGNkVcdURGNzAtXHVERjg4XHVERjhBLVx1REZBOFx1REZBQS1cdURGQzJcdURGQzQtXHVERkNCXXxcdUQ4M0FbXHVEQzAwLVx1RENDNFx1REQwMC1cdURENDNdfFx1RDgzQltcdURFMDAtXHVERTAzXHVERTA1LVx1REUxRlx1REUyMVx1REUyMlx1REUyNFx1REUyN1x1REUyOS1cdURFMzJcdURFMzQtXHVERTM3XHVERTM5XHVERTNCXHVERTQyXHVERTQ3XHVERTQ5XHVERTRCXHVERTRELVx1REU0Rlx1REU1MVx1REU1Mlx1REU1NFx1REU1N1x1REU1OVx1REU1Qlx1REU1RFx1REU1Rlx1REU2MVx1REU2Mlx1REU2NFx1REU2Ny1cdURFNkFcdURFNkMtXHVERTcyXHVERTc0LVx1REU3N1x1REU3OS1cdURFN0NcdURFN0VcdURFODAtXHVERTg5XHVERThCLVx1REU5Qlx1REVBMS1cdURFQTNcdURFQTUtXHVERUE5XHVERUFCLVx1REVCQl18XHVEODY5W1x1REMwMC1cdURFRDZcdURGMDAtXHVERkZGXXxcdUQ4NkRbXHVEQzAwLVx1REYzNFx1REY0MC1cdURGRkZdfFx1RDg2RVtcdURDMDAtXHVEQzFEXHVEQzIwLVx1REZGRl18XHVEODczW1x1REMwMC1cdURFQTFcdURFQjAtXHVERkZGXXxcdUQ4N0FbXHVEQzAwLVx1REZFMF18XHVEODdFW1x1REMwMC1cdURFMURdLyxJRF9Db250aW51ZTovW1x4QUFceEI1XHhCQVx4QzAtXHhENlx4RDgtXHhGNlx4RjgtXHUwMkMxXHUwMkM2LVx1MDJEMVx1MDJFMC1cdTAyRTRcdTAyRUNcdTAyRUVcdTAzMDAtXHUwMzc0XHUwMzc2XHUwMzc3XHUwMzdBLVx1MDM3RFx1MDM3Rlx1MDM4Nlx1MDM4OC1cdTAzOEFcdTAzOENcdTAzOEUtXHUwM0ExXHUwM0EzLVx1MDNGNVx1MDNGNy1cdTA0ODFcdTA0ODMtXHUwNDg3XHUwNDhBLVx1MDUyRlx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjEtXHUwNTg3XHUwNTkxLVx1MDVCRFx1MDVCRlx1MDVDMVx1MDVDMlx1MDVDNFx1MDVDNVx1MDVDN1x1MDVEMC1cdTA1RUFcdTA1RjAtXHUwNUYyXHUwNjEwLVx1MDYxQVx1MDYyMC1cdTA2NjlcdTA2NkUtXHUwNkQzXHUwNkQ1LVx1MDZEQ1x1MDZERi1cdTA2RThcdTA2RUEtXHUwNkZDXHUwNkZGXHUwNzEwLVx1MDc0QVx1MDc0RC1cdTA3QjFcdTA3QzAtXHUwN0Y1XHUwN0ZBXHUwODAwLVx1MDgyRFx1MDg0MC1cdTA4NUJcdTA4NjAtXHUwODZBXHUwOEEwLVx1MDhCNFx1MDhCNi1cdTA4QkRcdTA4RDQtXHUwOEUxXHUwOEUzLVx1MDk2M1x1MDk2Ni1cdTA5NkZcdTA5NzEtXHUwOTgzXHUwOTg1LVx1MDk4Q1x1MDk4Rlx1MDk5MFx1MDk5My1cdTA5QThcdTA5QUEtXHUwOUIwXHUwOUIyXHUwOUI2LVx1MDlCOVx1MDlCQy1cdTA5QzRcdTA5QzdcdTA5QzhcdTA5Q0ItXHUwOUNFXHUwOUQ3XHUwOURDXHUwOUREXHUwOURGLVx1MDlFM1x1MDlFNi1cdTA5RjFcdTA5RkNcdTBBMDEtXHUwQTAzXHUwQTA1LVx1MEEwQVx1MEEwRlx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyXHUwQTMzXHUwQTM1XHUwQTM2XHUwQTM4XHUwQTM5XHUwQTNDXHUwQTNFLVx1MEE0Mlx1MEE0N1x1MEE0OFx1MEE0Qi1cdTBBNERcdTBBNTFcdTBBNTktXHUwQTVDXHUwQTVFXHUwQTY2LVx1MEE3NVx1MEE4MS1cdTBBODNcdTBBODUtXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyXHUwQUIzXHUwQUI1LVx1MEFCOVx1MEFCQy1cdTBBQzVcdTBBQzctXHUwQUM5XHUwQUNCLVx1MEFDRFx1MEFEMFx1MEFFMC1cdTBBRTNcdTBBRTYtXHUwQUVGXHUwQUY5LVx1MEFGRlx1MEIwMS1cdTBCMDNcdTBCMDUtXHUwQjBDXHUwQjBGXHUwQjEwXHUwQjEzLVx1MEIyOFx1MEIyQS1cdTBCMzBcdTBCMzJcdTBCMzNcdTBCMzUtXHUwQjM5XHUwQjNDLVx1MEI0NFx1MEI0N1x1MEI0OFx1MEI0Qi1cdTBCNERcdTBCNTZcdTBCNTdcdTBCNUNcdTBCNURcdTBCNUYtXHUwQjYzXHUwQjY2LVx1MEI2Rlx1MEI3MVx1MEI4Mlx1MEI4M1x1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OVx1MEI5QVx1MEI5Q1x1MEI5RVx1MEI5Rlx1MEJBM1x1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI5XHUwQkJFLVx1MEJDMlx1MEJDNi1cdTBCQzhcdTBCQ0EtXHUwQkNEXHUwQkQwXHUwQkQ3XHUwQkU2LVx1MEJFRlx1MEMwMC1cdTBDMDNcdTBDMDUtXHUwQzBDXHUwQzBFLVx1MEMxMFx1MEMxMi1cdTBDMjhcdTBDMkEtXHUwQzM5XHUwQzNELVx1MEM0NFx1MEM0Ni1cdTBDNDhcdTBDNEEtXHUwQzREXHUwQzU1XHUwQzU2XHUwQzU4LVx1MEM1QVx1MEM2MC1cdTBDNjNcdTBDNjYtXHUwQzZGXHUwQzgwLVx1MEM4M1x1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0JDLVx1MENDNFx1MENDNi1cdTBDQzhcdTBDQ0EtXHUwQ0NEXHUwQ0Q1XHUwQ0Q2XHUwQ0RFXHUwQ0UwLVx1MENFM1x1MENFNi1cdTBDRUZcdTBDRjFcdTBDRjJcdTBEMDAtXHUwRDAzXHUwRDA1LVx1MEQwQ1x1MEQwRS1cdTBEMTBcdTBEMTItXHUwRDQ0XHUwRDQ2LVx1MEQ0OFx1MEQ0QS1cdTBENEVcdTBENTQtXHUwRDU3XHUwRDVGLVx1MEQ2M1x1MEQ2Ni1cdTBENkZcdTBEN0EtXHUwRDdGXHUwRDgyXHUwRDgzXHUwRDg1LVx1MEQ5Nlx1MEQ5QS1cdTBEQjFcdTBEQjMtXHUwREJCXHUwREJEXHUwREMwLVx1MERDNlx1MERDQVx1MERDRi1cdTBERDRcdTBERDZcdTBERDgtXHUwRERGXHUwREU2LVx1MERFRlx1MERGMlx1MERGM1x1MEUwMS1cdTBFM0FcdTBFNDAtXHUwRTRFXHUwRTUwLVx1MEU1OVx1MEU4MVx1MEU4Mlx1MEU4NFx1MEU4N1x1MEU4OFx1MEU4QVx1MEU4RFx1MEU5NC1cdTBFOTdcdTBFOTktXHUwRTlGXHUwRUExLVx1MEVBM1x1MEVBNVx1MEVBN1x1MEVBQVx1MEVBQlx1MEVBRC1cdTBFQjlcdTBFQkItXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEVDNlx1MEVDOC1cdTBFQ0RcdTBFRDAtXHUwRUQ5XHUwRURDLVx1MEVERlx1MEYwMFx1MEYxOFx1MEYxOVx1MEYyMC1cdTBGMjlcdTBGMzVcdTBGMzdcdTBGMzlcdTBGM0UtXHUwRjQ3XHUwRjQ5LVx1MEY2Q1x1MEY3MS1cdTBGODRcdTBGODYtXHUwRjk3XHUwRjk5LVx1MEZCQ1x1MEZDNlx1MTAwMC1cdTEwNDlcdTEwNTAtXHUxMDlEXHUxMEEwLVx1MTBDNVx1MTBDN1x1MTBDRFx1MTBEMC1cdTEwRkFcdTEwRkMtXHUxMjQ4XHUxMjRBLVx1MTI0RFx1MTI1MC1cdTEyNTZcdTEyNThcdTEyNUEtXHUxMjVEXHUxMjYwLVx1MTI4OFx1MTI4QS1cdTEyOERcdTEyOTAtXHUxMkIwXHUxMkIyLVx1MTJCNVx1MTJCOC1cdTEyQkVcdTEyQzBcdTEyQzItXHUxMkM1XHUxMkM4LVx1MTJENlx1MTJEOC1cdTEzMTBcdTEzMTItXHUxMzE1XHUxMzE4LVx1MTM1QVx1MTM1RC1cdTEzNUZcdTEzODAtXHUxMzhGXHUxM0EwLVx1MTNGNVx1MTNGOC1cdTEzRkRcdTE0MDEtXHUxNjZDXHUxNjZGLVx1MTY3Rlx1MTY4MS1cdTE2OUFcdTE2QTAtXHUxNkVBXHUxNkVFLVx1MTZGOFx1MTcwMC1cdTE3MENcdTE3MEUtXHUxNzE0XHUxNzIwLVx1MTczNFx1MTc0MC1cdTE3NTNcdTE3NjAtXHUxNzZDXHUxNzZFLVx1MTc3MFx1MTc3Mlx1MTc3M1x1MTc4MC1cdTE3RDNcdTE3RDdcdTE3RENcdTE3RERcdTE3RTAtXHUxN0U5XHUxODBCLVx1MTgwRFx1MTgxMC1cdTE4MTlcdTE4MjAtXHUxODc3XHUxODgwLVx1MThBQVx1MThCMC1cdTE4RjVcdTE5MDAtXHUxOTFFXHUxOTIwLVx1MTkyQlx1MTkzMC1cdTE5M0JcdTE5NDYtXHUxOTZEXHUxOTcwLVx1MTk3NFx1MTk4MC1cdTE5QUJcdTE5QjAtXHUxOUM5XHUxOUQwLVx1MTlEOVx1MUEwMC1cdTFBMUJcdTFBMjAtXHUxQTVFXHUxQTYwLVx1MUE3Q1x1MUE3Ri1cdTFBODlcdTFBOTAtXHUxQTk5XHUxQUE3XHUxQUIwLVx1MUFCRFx1MUIwMC1cdTFCNEJcdTFCNTAtXHUxQjU5XHUxQjZCLVx1MUI3M1x1MUI4MC1cdTFCRjNcdTFDMDAtXHUxQzM3XHUxQzQwLVx1MUM0OVx1MUM0RC1cdTFDN0RcdTFDODAtXHUxQzg4XHUxQ0QwLVx1MUNEMlx1MUNENC1cdTFDRjlcdTFEMDAtXHUxREY5XHUxREZCLVx1MUYxNVx1MUYxOC1cdTFGMURcdTFGMjAtXHUxRjQ1XHUxRjQ4LVx1MUY0RFx1MUY1MC1cdTFGNTdcdTFGNTlcdTFGNUJcdTFGNURcdTFGNUYtXHUxRjdEXHUxRjgwLVx1MUZCNFx1MUZCNi1cdTFGQkNcdTFGQkVcdTFGQzItXHUxRkM0XHUxRkM2LVx1MUZDQ1x1MUZEMC1cdTFGRDNcdTFGRDYtXHUxRkRCXHUxRkUwLVx1MUZFQ1x1MUZGMi1cdTFGRjRcdTFGRjYtXHUxRkZDXHUyMDNGXHUyMDQwXHUyMDU0XHUyMDcxXHUyMDdGXHUyMDkwLVx1MjA5Q1x1MjBEMC1cdTIwRENcdTIwRTFcdTIwRTUtXHUyMEYwXHUyMTAyXHUyMTA3XHUyMTBBLVx1MjExM1x1MjExNVx1MjExOS1cdTIxMURcdTIxMjRcdTIxMjZcdTIxMjhcdTIxMkEtXHUyMTJEXHUyMTJGLVx1MjEzOVx1MjEzQy1cdTIxM0ZcdTIxNDUtXHUyMTQ5XHUyMTRFXHUyMTYwLVx1MjE4OFx1MkMwMC1cdTJDMkVcdTJDMzAtXHUyQzVFXHUyQzYwLVx1MkNFNFx1MkNFQi1cdTJDRjNcdTJEMDAtXHUyRDI1XHUyRDI3XHUyRDJEXHUyRDMwLVx1MkQ2N1x1MkQ2Rlx1MkQ3Ri1cdTJEOTZcdTJEQTAtXHUyREE2XHUyREE4LVx1MkRBRVx1MkRCMC1cdTJEQjZcdTJEQjgtXHUyREJFXHUyREMwLVx1MkRDNlx1MkRDOC1cdTJEQ0VcdTJERDAtXHUyREQ2XHUyREQ4LVx1MkRERVx1MkRFMC1cdTJERkZcdTJFMkZcdTMwMDUtXHUzMDA3XHUzMDIxLVx1MzAyRlx1MzAzMS1cdTMwMzVcdTMwMzgtXHUzMDNDXHUzMDQxLVx1MzA5Nlx1MzA5OVx1MzA5QVx1MzA5RC1cdTMwOUZcdTMwQTEtXHUzMEZBXHUzMEZDLVx1MzBGRlx1MzEwNS1cdTMxMkVcdTMxMzEtXHUzMThFXHUzMUEwLVx1MzFCQVx1MzFGMC1cdTMxRkZcdTM0MDAtXHU0REI1XHU0RTAwLVx1OUZFQVx1QTAwMC1cdUE0OENcdUE0RDAtXHVBNEZEXHVBNTAwLVx1QTYwQ1x1QTYxMC1cdUE2MkJcdUE2NDAtXHVBNjZGXHVBNjc0LVx1QTY3RFx1QTY3Ri1cdUE2RjFcdUE3MTctXHVBNzFGXHVBNzIyLVx1QTc4OFx1QTc4Qi1cdUE3QUVcdUE3QjAtXHVBN0I3XHVBN0Y3LVx1QTgyN1x1QTg0MC1cdUE4NzNcdUE4ODAtXHVBOEM1XHVBOEQwLVx1QThEOVx1QThFMC1cdUE4RjdcdUE4RkJcdUE4RkRcdUE5MDAtXHVBOTJEXHVBOTMwLVx1QTk1M1x1QTk2MC1cdUE5N0NcdUE5ODAtXHVBOUMwXHVBOUNGLVx1QTlEOVx1QTlFMC1cdUE5RkVcdUFBMDAtXHVBQTM2XHVBQTQwLVx1QUE0RFx1QUE1MC1cdUFBNTlcdUFBNjAtXHVBQTc2XHVBQTdBLVx1QUFDMlx1QUFEQi1cdUFBRERcdUFBRTAtXHVBQUVGXHVBQUYyLVx1QUFGNlx1QUIwMS1cdUFCMDZcdUFCMDktXHVBQjBFXHVBQjExLVx1QUIxNlx1QUIyMC1cdUFCMjZcdUFCMjgtXHVBQjJFXHVBQjMwLVx1QUI1QVx1QUI1Qy1cdUFCNjVcdUFCNzAtXHVBQkVBXHVBQkVDXHVBQkVEXHVBQkYwLVx1QUJGOVx1QUMwMC1cdUQ3QTNcdUQ3QjAtXHVEN0M2XHVEN0NCLVx1RDdGQlx1RjkwMC1cdUZBNkRcdUZBNzAtXHVGQUQ5XHVGQjAwLVx1RkIwNlx1RkIxMy1cdUZCMTdcdUZCMUQtXHVGQjI4XHVGQjJBLVx1RkIzNlx1RkIzOC1cdUZCM0NcdUZCM0VcdUZCNDBcdUZCNDFcdUZCNDNcdUZCNDRcdUZCNDYtXHVGQkIxXHVGQkQzLVx1RkQzRFx1RkQ1MC1cdUZEOEZcdUZEOTItXHVGREM3XHVGREYwLVx1RkRGQlx1RkUwMC1cdUZFMEZcdUZFMjAtXHVGRTJGXHVGRTMzXHVGRTM0XHVGRTRELVx1RkU0Rlx1RkU3MC1cdUZFNzRcdUZFNzYtXHVGRUZDXHVGRjEwLVx1RkYxOVx1RkYyMS1cdUZGM0FcdUZGM0ZcdUZGNDEtXHVGRjVBXHVGRjY2LVx1RkZCRVx1RkZDMi1cdUZGQzdcdUZGQ0EtXHVGRkNGXHVGRkQyLVx1RkZEN1x1RkZEQS1cdUZGRENdfFx1RDgwMFtcdURDMDAtXHVEQzBCXHVEQzBELVx1REMyNlx1REMyOC1cdURDM0FcdURDM0NcdURDM0RcdURDM0YtXHVEQzREXHVEQzUwLVx1REM1RFx1REM4MC1cdURDRkFcdURENDAtXHVERDc0XHVEREZEXHVERTgwLVx1REU5Q1x1REVBMC1cdURFRDBcdURFRTBcdURGMDAtXHVERjFGXHVERjJELVx1REY0QVx1REY1MC1cdURGN0FcdURGODAtXHVERjlEXHVERkEwLVx1REZDM1x1REZDOC1cdURGQ0ZcdURGRDEtXHVERkQ1XXxcdUQ4MDFbXHVEQzAwLVx1REM5RFx1RENBMC1cdURDQTlcdURDQjAtXHVEQ0QzXHVEQ0Q4LVx1RENGQlx1REQwMC1cdUREMjdcdUREMzAtXHVERDYzXHVERTAwLVx1REYzNlx1REY0MC1cdURGNTVcdURGNjAtXHVERjY3XXxcdUQ4MDJbXHVEQzAwLVx1REMwNVx1REMwOFx1REMwQS1cdURDMzVcdURDMzdcdURDMzhcdURDM0NcdURDM0YtXHVEQzU1XHVEQzYwLVx1REM3Nlx1REM4MC1cdURDOUVcdURDRTAtXHVEQ0YyXHVEQ0Y0XHVEQ0Y1XHVERDAwLVx1REQxNVx1REQyMC1cdUREMzlcdUREODAtXHVEREI3XHVEREJFXHVEREJGXHVERTAwLVx1REUwM1x1REUwNVx1REUwNlx1REUwQy1cdURFMTNcdURFMTUtXHVERTE3XHVERTE5LVx1REUzM1x1REUzOC1cdURFM0FcdURFM0ZcdURFNjAtXHVERTdDXHVERTgwLVx1REU5Q1x1REVDMC1cdURFQzdcdURFQzktXHVERUU2XHVERjAwLVx1REYzNVx1REY0MC1cdURGNTVcdURGNjAtXHVERjcyXHVERjgwLVx1REY5MV18XHVEODAzW1x1REMwMC1cdURDNDhcdURDODAtXHVEQ0IyXHVEQ0MwLVx1RENGMl18XHVEODA0W1x1REMwMC1cdURDNDZcdURDNjYtXHVEQzZGXHVEQzdGLVx1RENCQVx1RENEMC1cdURDRThcdURDRjAtXHVEQ0Y5XHVERDAwLVx1REQzNFx1REQzNi1cdUREM0ZcdURENTAtXHVERDczXHVERDc2XHVERDgwLVx1RERDNFx1RERDQS1cdUREQ0NcdURERDAtXHVERERBXHVERERDXHVERTAwLVx1REUxMVx1REUxMy1cdURFMzdcdURFM0VcdURFODAtXHVERTg2XHVERTg4XHVERThBLVx1REU4RFx1REU4Ri1cdURFOURcdURFOUYtXHVERUE4XHVERUIwLVx1REVFQVx1REVGMC1cdURFRjlcdURGMDAtXHVERjAzXHVERjA1LVx1REYwQ1x1REYwRlx1REYxMFx1REYxMy1cdURGMjhcdURGMkEtXHVERjMwXHVERjMyXHVERjMzXHVERjM1LVx1REYzOVx1REYzQy1cdURGNDRcdURGNDdcdURGNDhcdURGNEItXHVERjREXHVERjUwXHVERjU3XHVERjVELVx1REY2M1x1REY2Ni1cdURGNkNcdURGNzAtXHVERjc0XXxcdUQ4MDVbXHVEQzAwLVx1REM0QVx1REM1MC1cdURDNTlcdURDODAtXHVEQ0M1XHVEQ0M3XHVEQ0QwLVx1RENEOVx1REQ4MC1cdUREQjVcdUREQjgtXHVEREMwXHVEREQ4LVx1RERERFx1REUwMC1cdURFNDBcdURFNDRcdURFNTAtXHVERTU5XHVERTgwLVx1REVCN1x1REVDMC1cdURFQzlcdURGMDAtXHVERjE5XHVERjFELVx1REYyQlx1REYzMC1cdURGMzldfFx1RDgwNltcdURDQTAtXHVEQ0U5XHVEQ0ZGXHVERTAwLVx1REUzRVx1REU0N1x1REU1MC1cdURFODNcdURFODYtXHVERTk5XHVERUMwLVx1REVGOF18XHVEODA3W1x1REMwMC1cdURDMDhcdURDMEEtXHVEQzM2XHVEQzM4LVx1REM0MFx1REM1MC1cdURDNTlcdURDNzItXHVEQzhGXHVEQzkyLVx1RENBN1x1RENBOS1cdURDQjZcdUREMDAtXHVERDA2XHVERDA4XHVERDA5XHVERDBCLVx1REQzNlx1REQzQVx1REQzQ1x1REQzRFx1REQzRi1cdURENDdcdURENTAtXHVERDU5XXxcdUQ4MDhbXHVEQzAwLVx1REY5OV18XHVEODA5W1x1REMwMC1cdURDNkVcdURDODAtXHVERDQzXXxbXHVEODBDXHVEODFDLVx1RDgyMFx1RDg0MC1cdUQ4NjhcdUQ4NkEtXHVEODZDXHVEODZGLVx1RDg3Mlx1RDg3NC1cdUQ4NzldW1x1REMwMC1cdURGRkZdfFx1RDgwRFtcdURDMDAtXHVEQzJFXXxcdUQ4MTFbXHVEQzAwLVx1REU0Nl18XHVEODFBW1x1REMwMC1cdURFMzhcdURFNDAtXHVERTVFXHVERTYwLVx1REU2OVx1REVEMC1cdURFRURcdURFRjAtXHVERUY0XHVERjAwLVx1REYzNlx1REY0MC1cdURGNDNcdURGNTAtXHVERjU5XHVERjYzLVx1REY3N1x1REY3RC1cdURGOEZdfFx1RDgxQltcdURGMDAtXHVERjQ0XHVERjUwLVx1REY3RVx1REY4Ri1cdURGOUZcdURGRTBcdURGRTFdfFx1RDgyMVtcdURDMDAtXHVERkVDXXxcdUQ4MjJbXHVEQzAwLVx1REVGMl18XHVEODJDW1x1REMwMC1cdUREMUVcdURENzAtXHVERUZCXXxcdUQ4MkZbXHVEQzAwLVx1REM2QVx1REM3MC1cdURDN0NcdURDODAtXHVEQzg4XHVEQzkwLVx1REM5OVx1REM5RFx1REM5RV18XHVEODM0W1x1REQ2NS1cdURENjlcdURENkQtXHVERDcyXHVERDdCLVx1REQ4Mlx1REQ4NS1cdUREOEJcdUREQUEtXHVEREFEXHVERTQyLVx1REU0NF18XHVEODM1W1x1REMwMC1cdURDNTRcdURDNTYtXHVEQzlDXHVEQzlFXHVEQzlGXHVEQ0EyXHVEQ0E1XHVEQ0E2XHVEQ0E5LVx1RENBQ1x1RENBRS1cdURDQjlcdURDQkJcdURDQkQtXHVEQ0MzXHVEQ0M1LVx1REQwNVx1REQwNy1cdUREMEFcdUREMEQtXHVERDE0XHVERDE2LVx1REQxQ1x1REQxRS1cdUREMzlcdUREM0ItXHVERDNFXHVERDQwLVx1REQ0NFx1REQ0Nlx1REQ0QS1cdURENTBcdURENTItXHVERUE1XHVERUE4LVx1REVDMFx1REVDMi1cdURFREFcdURFREMtXHVERUZBXHVERUZDLVx1REYxNFx1REYxNi1cdURGMzRcdURGMzYtXHVERjRFXHVERjUwLVx1REY2RVx1REY3MC1cdURGODhcdURGOEEtXHVERkE4XHVERkFBLVx1REZDMlx1REZDNC1cdURGQ0JcdURGQ0UtXHVERkZGXXxcdUQ4MzZbXHVERTAwLVx1REUzNlx1REUzQi1cdURFNkNcdURFNzVcdURFODRcdURFOUItXHVERTlGXHVERUExLVx1REVBRl18XHVEODM4W1x1REMwMC1cdURDMDZcdURDMDgtXHVEQzE4XHVEQzFCLVx1REMyMVx1REMyM1x1REMyNFx1REMyNi1cdURDMkFdfFx1RDgzQVtcdURDMDAtXHVEQ0M0XHVEQ0QwLVx1RENENlx1REQwMC1cdURENEFcdURENTAtXHVERDU5XXxcdUQ4M0JbXHVERTAwLVx1REUwM1x1REUwNS1cdURFMUZcdURFMjFcdURFMjJcdURFMjRcdURFMjdcdURFMjktXHVERTMyXHVERTM0LVx1REUzN1x1REUzOVx1REUzQlx1REU0Mlx1REU0N1x1REU0OVx1REU0Qlx1REU0RC1cdURFNEZcdURFNTFcdURFNTJcdURFNTRcdURFNTdcdURFNTlcdURFNUJcdURFNURcdURFNUZcdURFNjFcdURFNjJcdURFNjRcdURFNjctXHVERTZBXHVERTZDLVx1REU3Mlx1REU3NC1cdURFNzdcdURFNzktXHVERTdDXHVERTdFXHVERTgwLVx1REU4OVx1REU4Qi1cdURFOUJcdURFQTEtXHVERUEzXHVERUE1LVx1REVBOVx1REVBQi1cdURFQkJdfFx1RDg2OVtcdURDMDAtXHVERUQ2XHVERjAwLVx1REZGRl18XHVEODZEW1x1REMwMC1cdURGMzRcdURGNDAtXHVERkZGXXxcdUQ4NkVbXHVEQzAwLVx1REMxRFx1REMyMC1cdURGRkZdfFx1RDg3M1tcdURDMDAtXHVERUExXHVERUIwLVx1REZGRl18XHVEODdBW1x1REMwMC1cdURGRTBdfFx1RDg3RVtcdURDMDAtXHVERTFEXXxcdURCNDBbXHVERDAwLVx1RERFRl0vfSxVPXtpc1NwYWNlU2VwYXJhdG9yOmZ1bmN0aW9uKHUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdSYmRy5TcGFjZV9TZXBhcmF0b3IudGVzdCh1KX0saXNJZFN0YXJ0Q2hhcjpmdW5jdGlvbih1KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHUmJih1Pj0iYSImJnU8PSJ6Inx8dT49IkEiJiZ1PD0iWiJ8fCIkIj09PXV8fCJfIj09PXV8fEcuSURfU3RhcnQudGVzdCh1KSl9LGlzSWRDb250aW51ZUNoYXI6ZnVuY3Rpb24odSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB1JiYodT49ImEiJiZ1PD0ieiJ8fHU+PSJBIiYmdTw9IloifHx1Pj0iMCImJnU8PSI5Inx8IiQiPT09dXx8Il8iPT09dXx8IuKAjCI9PT11fHwi4oCNIj09PXV8fEcuSURfQ29udGludWUudGVzdCh1KSl9LGlzRGlnaXQ6ZnVuY3Rpb24odSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB1JiYvWzAtOV0vLnRlc3QodSl9LGlzSGV4RGlnaXQ6ZnVuY3Rpb24odSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB1JiYvWzAtOUEtRmEtZl0vLnRlc3QodSl9fTtmdW5jdGlvbiBaKCl7Zm9yKFQ9ImRlZmF1bHQiLHo9IiIsSD0hMSwkPTE7Oyl7Uj1xKCk7dmFyIHU9WFtUXSgpO2lmKHUpcmV0dXJuIHV9fWZ1bmN0aW9uIHEoKXtpZihfW0ldKXJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChfLmNvZGVQb2ludEF0KEkpKX1mdW5jdGlvbiBXKCl7dmFyIHU9cSgpO3JldHVybiJcbiI9PT11PyhWKyssSj0wKTp1P0orPXUubGVuZ3RoOkorKyx1JiYoSSs9dS5sZW5ndGgpLHV9dmFyIFg9e2RlZmF1bHQ6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSJcdCI6Y2FzZSJcdiI6Y2FzZSJcZiI6Y2FzZSIgIjpjYXNlIiAiOmNhc2UiXHVmZWZmIjpjYXNlIlxuIjpjYXNlIlxyIjpjYXNlIlx1MjAyOCI6Y2FzZSJcdTIwMjkiOnJldHVybiB2b2lkIFcoKTtjYXNlIi8iOnJldHVybiBXKCksdm9pZChUPSJjb21tZW50Iik7Y2FzZSB2b2lkIDA6cmV0dXJuIFcoKSxLKCJlb2YiKX1pZighVS5pc1NwYWNlU2VwYXJhdG9yKFIpKXJldHVybiBYW09dKCk7VygpfSxjb21tZW50OmZ1bmN0aW9uKCl7c3dpdGNoKFIpe2Nhc2UiKiI6cmV0dXJuIFcoKSx2b2lkKFQ9Im11bHRpTGluZUNvbW1lbnQiKTtjYXNlIi8iOnJldHVybiBXKCksdm9pZChUPSJzaW5nbGVMaW5lQ29tbWVudCIpfXRocm93IHJ1KFcoKSl9LG11bHRpTGluZUNvbW1lbnQ6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSIqIjpyZXR1cm4gVygpLHZvaWQoVD0ibXVsdGlMaW5lQ29tbWVudEFzdGVyaXNrIik7Y2FzZSB2b2lkIDA6dGhyb3cgcnUoVygpKX1XKCl9LG11bHRpTGluZUNvbW1lbnRBc3RlcmlzazpmdW5jdGlvbigpe3N3aXRjaChSKXtjYXNlIioiOnJldHVybiB2b2lkIFcoKTtjYXNlIi8iOnJldHVybiBXKCksdm9pZChUPSJkZWZhdWx0Iik7Y2FzZSB2b2lkIDA6dGhyb3cgcnUoVygpKX1XKCksVD0ibXVsdGlMaW5lQ29tbWVudCJ9LHNpbmdsZUxpbmVDb21tZW50OmZ1bmN0aW9uKCl7c3dpdGNoKFIpe2Nhc2UiXG4iOmNhc2UiXHIiOmNhc2UiXHUyMDI4IjpjYXNlIlx1MjAyOSI6cmV0dXJuIFcoKSx2b2lkKFQ9ImRlZmF1bHQiKTtjYXNlIHZvaWQgMDpyZXR1cm4gVygpLEsoImVvZiIpfVcoKX0sdmFsdWU6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSJ7IjpjYXNlIlsiOnJldHVybiBLKCJwdW5jdHVhdG9yIixXKCkpO2Nhc2UibiI6cmV0dXJuIFcoKSxRKCJ1bGwiKSxLKCJudWxsIixudWxsKTtjYXNlInQiOnJldHVybiBXKCksUSgicnVlIiksSygiYm9vbGVhbiIsITApO2Nhc2UiZiI6cmV0dXJuIFcoKSxRKCJhbHNlIiksSygiYm9vbGVhbiIsITEpO2Nhc2UiLSI6Y2FzZSIrIjpyZXR1cm4iLSI9PT1XKCkmJigkPS0xKSx2b2lkKFQ9InNpZ24iKTtjYXNlIi4iOnJldHVybiB6PVcoKSx2b2lkKFQ9ImRlY2ltYWxQb2ludExlYWRpbmciKTtjYXNlIjAiOnJldHVybiB6PVcoKSx2b2lkKFQ9Inplcm8iKTtjYXNlIjEiOmNhc2UiMiI6Y2FzZSIzIjpjYXNlIjQiOmNhc2UiNSI6Y2FzZSI2IjpjYXNlIjciOmNhc2UiOCI6Y2FzZSI5IjpyZXR1cm4gej1XKCksdm9pZChUPSJkZWNpbWFsSW50ZWdlciIpO2Nhc2UiSSI6cmV0dXJuIFcoKSxRKCJuZmluaXR5IiksSygibnVtZXJpYyIsMS8wKTtjYXNlIk4iOnJldHVybiBXKCksUSgiYU4iKSxLKCJudW1lcmljIixOYU4pO2Nhc2UnIic6Y2FzZSInIjpyZXR1cm4gSD0nIic9PT1XKCksej0iIix2b2lkKFQ9InN0cmluZyIpfXRocm93IHJ1KFcoKSl9LGlkZW50aWZpZXJOYW1lU3RhcnRFc2NhcGU6ZnVuY3Rpb24oKXtpZigidSIhPT1SKXRocm93IHJ1KFcoKSk7VygpO3ZhciB1PVkoKTtzd2l0Y2godSl7Y2FzZSIkIjpjYXNlIl8iOmJyZWFrO2RlZmF1bHQ6aWYoIVUuaXNJZFN0YXJ0Q2hhcih1KSl0aHJvdyBudSgpfXorPXUsVD0iaWRlbnRpZmllck5hbWUifSxpZGVudGlmaWVyTmFtZTpmdW5jdGlvbigpe3N3aXRjaChSKXtjYXNlIiQiOmNhc2UiXyI6Y2FzZSLigIwiOmNhc2Ui4oCNIjpyZXR1cm4gdm9pZCh6Kz1XKCkpO2Nhc2UiXFwiOnJldHVybiBXKCksdm9pZChUPSJpZGVudGlmaWVyTmFtZUVzY2FwZSIpfWlmKCFVLmlzSWRDb250aW51ZUNoYXIoUikpcmV0dXJuIEsoImlkZW50aWZpZXIiLHopO3orPVcoKX0saWRlbnRpZmllck5hbWVFc2NhcGU6ZnVuY3Rpb24oKXtpZigidSIhPT1SKXRocm93IHJ1KFcoKSk7VygpO3ZhciB1PVkoKTtzd2l0Y2godSl7Y2FzZSIkIjpjYXNlIl8iOmNhc2Ui4oCMIjpjYXNlIuKAjSI6YnJlYWs7ZGVmYXVsdDppZighVS5pc0lkQ29udGludWVDaGFyKHUpKXRocm93IG51KCl9eis9dSxUPSJpZGVudGlmaWVyTmFtZSJ9LHNpZ246ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSIuIjpyZXR1cm4gej1XKCksdm9pZChUPSJkZWNpbWFsUG9pbnRMZWFkaW5nIik7Y2FzZSIwIjpyZXR1cm4gej1XKCksdm9pZChUPSJ6ZXJvIik7Y2FzZSIxIjpjYXNlIjIiOmNhc2UiMyI6Y2FzZSI0IjpjYXNlIjUiOmNhc2UiNiI6Y2FzZSI3IjpjYXNlIjgiOmNhc2UiOSI6cmV0dXJuIHo9VygpLHZvaWQoVD0iZGVjaW1hbEludGVnZXIiKTtjYXNlIkkiOnJldHVybiBXKCksUSgibmZpbml0eSIpLEsoIm51bWVyaWMiLCQqKDEvMCkpO2Nhc2UiTiI6cmV0dXJuIFcoKSxRKCJhTiIpLEsoIm51bWVyaWMiLE5hTil9dGhyb3cgcnUoVygpKX0semVybzpmdW5jdGlvbigpe3N3aXRjaChSKXtjYXNlIi4iOnJldHVybiB6Kz1XKCksdm9pZChUPSJkZWNpbWFsUG9pbnQiKTtjYXNlImUiOmNhc2UiRSI6cmV0dXJuIHorPVcoKSx2b2lkKFQ9ImRlY2ltYWxFeHBvbmVudCIpO2Nhc2UieCI6Y2FzZSJYIjpyZXR1cm4geis9VygpLHZvaWQoVD0iaGV4YWRlY2ltYWwiKX1yZXR1cm4gSygibnVtZXJpYyIsMCokKX0sZGVjaW1hbEludGVnZXI6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSIuIjpyZXR1cm4geis9VygpLHZvaWQoVD0iZGVjaW1hbFBvaW50Iik7Y2FzZSJlIjpjYXNlIkUiOnJldHVybiB6Kz1XKCksdm9pZChUPSJkZWNpbWFsRXhwb25lbnQiKX1pZighVS5pc0RpZ2l0KFIpKXJldHVybiBLKCJudW1lcmljIiwkKk51bWJlcih6KSk7eis9VygpfSxkZWNpbWFsUG9pbnRMZWFkaW5nOmZ1bmN0aW9uKCl7aWYoVS5pc0RpZ2l0KFIpKXJldHVybiB6Kz1XKCksdm9pZChUPSJkZWNpbWFsRnJhY3Rpb24iKTt0aHJvdyBydShXKCkpfSxkZWNpbWFsUG9pbnQ6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSJlIjpjYXNlIkUiOnJldHVybiB6Kz1XKCksdm9pZChUPSJkZWNpbWFsRXhwb25lbnQiKX1yZXR1cm4gVS5pc0RpZ2l0KFIpPyh6Kz1XKCksdm9pZChUPSJkZWNpbWFsRnJhY3Rpb24iKSk6SygibnVtZXJpYyIsJCpOdW1iZXIoeikpfSxkZWNpbWFsRnJhY3Rpb246ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSJlIjpjYXNlIkUiOnJldHVybiB6Kz1XKCksdm9pZChUPSJkZWNpbWFsRXhwb25lbnQiKX1pZighVS5pc0RpZ2l0KFIpKXJldHVybiBLKCJudW1lcmljIiwkKk51bWJlcih6KSk7eis9VygpfSxkZWNpbWFsRXhwb25lbnQ6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSIrIjpjYXNlIi0iOnJldHVybiB6Kz1XKCksdm9pZChUPSJkZWNpbWFsRXhwb25lbnRTaWduIil9aWYoVS5pc0RpZ2l0KFIpKXJldHVybiB6Kz1XKCksdm9pZChUPSJkZWNpbWFsRXhwb25lbnRJbnRlZ2VyIik7dGhyb3cgcnUoVygpKX0sZGVjaW1hbEV4cG9uZW50U2lnbjpmdW5jdGlvbigpe2lmKFUuaXNEaWdpdChSKSlyZXR1cm4geis9VygpLHZvaWQoVD0iZGVjaW1hbEV4cG9uZW50SW50ZWdlciIpO3Rocm93IHJ1KFcoKSl9LGRlY2ltYWxFeHBvbmVudEludGVnZXI6ZnVuY3Rpb24oKXtpZighVS5pc0RpZ2l0KFIpKXJldHVybiBLKCJudW1lcmljIiwkKk51bWJlcih6KSk7eis9VygpfSxoZXhhZGVjaW1hbDpmdW5jdGlvbigpe2lmKFUuaXNIZXhEaWdpdChSKSlyZXR1cm4geis9VygpLHZvaWQoVD0iaGV4YWRlY2ltYWxJbnRlZ2VyIik7dGhyb3cgcnUoVygpKX0saGV4YWRlY2ltYWxJbnRlZ2VyOmZ1bmN0aW9uKCl7aWYoIVUuaXNIZXhEaWdpdChSKSlyZXR1cm4gSygibnVtZXJpYyIsJCpOdW1iZXIoeikpO3orPVcoKX0sc3RyaW5nOmZ1bmN0aW9uKCl7c3dpdGNoKFIpe2Nhc2UiXFwiOnJldHVybiBXKCksdm9pZCh6Kz1mdW5jdGlvbigpe3N3aXRjaChxKCkpe2Nhc2UiYiI6cmV0dXJuIFcoKSwiXGIiO2Nhc2UiZiI6cmV0dXJuIFcoKSwiXGYiO2Nhc2UibiI6cmV0dXJuIFcoKSwiXG4iO2Nhc2UiciI6cmV0dXJuIFcoKSwiXHIiO2Nhc2UidCI6cmV0dXJuIFcoKSwiXHQiO2Nhc2UidiI6cmV0dXJuIFcoKSwiXHYiO2Nhc2UiMCI6aWYoVygpLFUuaXNEaWdpdChxKCkpKXRocm93IHJ1KFcoKSk7cmV0dXJuIlwwIjtjYXNlIngiOnJldHVybiBXKCksZnVuY3Rpb24oKXt2YXIgdT0iIixEPXEoKTtpZighVS5pc0hleERpZ2l0KEQpKXRocm93IHJ1KFcoKSk7aWYodSs9VygpLEQ9cSgpLCFVLmlzSGV4RGlnaXQoRCkpdGhyb3cgcnUoVygpKTtyZXR1cm4gdSs9VygpLFN0cmluZy5mcm9tQ29kZVBvaW50KHBhcnNlSW50KHUsMTYpKX0oKTtjYXNlInUiOnJldHVybiBXKCksWSgpO2Nhc2UiXG4iOmNhc2UiXHUyMDI4IjpjYXNlIlx1MjAyOSI6cmV0dXJuIFcoKSwiIjtjYXNlIlxyIjpyZXR1cm4gVygpLCJcbiI9PT1xKCkmJlcoKSwiIjtjYXNlIjEiOmNhc2UiMiI6Y2FzZSIzIjpjYXNlIjQiOmNhc2UiNSI6Y2FzZSI2IjpjYXNlIjciOmNhc2UiOCI6Y2FzZSI5IjpjYXNlIHZvaWQgMDp0aHJvdyBydShXKCkpfXJldHVybiBXKCl9KCkpO2Nhc2UnIic6cmV0dXJuIEg/KFcoKSxLKCJzdHJpbmciLHopKTp2b2lkKHorPVcoKSk7Y2FzZSInIjpyZXR1cm4gSD92b2lkKHorPVcoKSk6KFcoKSxLKCJzdHJpbmciLHopKTtjYXNlIlxuIjpjYXNlIlxyIjp0aHJvdyBydShXKCkpO2Nhc2UiXHUyMDI4IjpjYXNlIlx1MjAyOSI6IWZ1bmN0aW9uKHUpe2NvbnNvbGUud2FybigiSlNPTjU6ICciK0Z1KHUpKyInIGluIHN0cmluZ3MgaXMgbm90IHZhbGlkIEVDTUFTY3JpcHQ7IGNvbnNpZGVyIGVzY2FwaW5nIil9KFIpO2JyZWFrO2Nhc2Ugdm9pZCAwOnRocm93IHJ1KFcoKSl9eis9VygpfSxzdGFydDpmdW5jdGlvbigpe3N3aXRjaChSKXtjYXNlInsiOmNhc2UiWyI6cmV0dXJuIEsoInB1bmN0dWF0b3IiLFcoKSl9VD0idmFsdWUifSxiZWZvcmVQcm9wZXJ0eU5hbWU6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSIkIjpjYXNlIl8iOnJldHVybiB6PVcoKSx2b2lkKFQ9ImlkZW50aWZpZXJOYW1lIik7Y2FzZSJcXCI6cmV0dXJuIFcoKSx2b2lkKFQ9ImlkZW50aWZpZXJOYW1lU3RhcnRFc2NhcGUiKTtjYXNlIn0iOnJldHVybiBLKCJwdW5jdHVhdG9yIixXKCkpO2Nhc2UnIic6Y2FzZSInIjpyZXR1cm4gSD0nIic9PT1XKCksdm9pZChUPSJzdHJpbmciKX1pZihVLmlzSWRTdGFydENoYXIoUikpcmV0dXJuIHorPVcoKSx2b2lkKFQ9ImlkZW50aWZpZXJOYW1lIik7dGhyb3cgcnUoVygpKX0sYWZ0ZXJQcm9wZXJ0eU5hbWU6ZnVuY3Rpb24oKXtpZigiOiI9PT1SKXJldHVybiBLKCJwdW5jdHVhdG9yIixXKCkpO3Rocm93IHJ1KFcoKSl9LGJlZm9yZVByb3BlcnR5VmFsdWU6ZnVuY3Rpb24oKXtUPSJ2YWx1ZSJ9LGFmdGVyUHJvcGVydHlWYWx1ZTpmdW5jdGlvbigpe3N3aXRjaChSKXtjYXNlIiwiOmNhc2UifSI6cmV0dXJuIEsoInB1bmN0dWF0b3IiLFcoKSl9dGhyb3cgcnUoVygpKX0sYmVmb3JlQXJyYXlWYWx1ZTpmdW5jdGlvbigpe2lmKCJdIj09PVIpcmV0dXJuIEsoInB1bmN0dWF0b3IiLFcoKSk7VD0idmFsdWUifSxhZnRlckFycmF5VmFsdWU6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSIsIjpjYXNlIl0iOnJldHVybiBLKCJwdW5jdHVhdG9yIixXKCkpfXRocm93IHJ1KFcoKSl9LGVuZDpmdW5jdGlvbigpe3Rocm93IHJ1KFcoKSl9fTtmdW5jdGlvbiBLKHUsRCl7cmV0dXJue3R5cGU6dSx2YWx1ZTpELGxpbmU6Vixjb2x1bW46Sn19ZnVuY3Rpb24gUSh1KXtmb3IodmFyIEQ9MCxlPXU7RDxlLmxlbmd0aDtEKz0xKXt2YXIgcj1lW0RdO2lmKHEoKSE9PXIpdGhyb3cgcnUoVygpKTtXKCl9fWZ1bmN0aW9uIFkoKXtmb3IodmFyIHU9IiIsRD00O0QtLSA+MDspe3ZhciBlPXEoKTtpZighVS5pc0hleERpZ2l0KGUpKXRocm93IHJ1KFcoKSk7dSs9VygpfXJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChwYXJzZUludCh1LDE2KSl9dmFyIHV1PXtzdGFydDpmdW5jdGlvbigpe2lmKCJlb2YiPT09TS50eXBlKXRocm93IHR1KCk7RHUoKX0sYmVmb3JlUHJvcGVydHlOYW1lOmZ1bmN0aW9uKCl7c3dpdGNoKE0udHlwZSl7Y2FzZSJpZGVudGlmaWVyIjpjYXNlInN0cmluZyI6cmV0dXJuIGs9TS52YWx1ZSx2b2lkKE89ImFmdGVyUHJvcGVydHlOYW1lIik7Y2FzZSJwdW5jdHVhdG9yIjpyZXR1cm4gdm9pZCBldSgpO2Nhc2UiZW9mIjp0aHJvdyB0dSgpfX0sYWZ0ZXJQcm9wZXJ0eU5hbWU6ZnVuY3Rpb24oKXtpZigiZW9mIj09PU0udHlwZSl0aHJvdyB0dSgpO089ImJlZm9yZVByb3BlcnR5VmFsdWUifSxiZWZvcmVQcm9wZXJ0eVZhbHVlOmZ1bmN0aW9uKCl7aWYoImVvZiI9PT1NLnR5cGUpdGhyb3cgdHUoKTtEdSgpfSxiZWZvcmVBcnJheVZhbHVlOmZ1bmN0aW9uKCl7aWYoImVvZiI9PT1NLnR5cGUpdGhyb3cgdHUoKTsicHVuY3R1YXRvciIhPT1NLnR5cGV8fCJdIiE9PU0udmFsdWU/RHUoKTpldSgpfSxhZnRlclByb3BlcnR5VmFsdWU6ZnVuY3Rpb24oKXtpZigiZW9mIj09PU0udHlwZSl0aHJvdyB0dSgpO3N3aXRjaChNLnZhbHVlKXtjYXNlIiwiOnJldHVybiB2b2lkKE89ImJlZm9yZVByb3BlcnR5TmFtZSIpO2Nhc2UifSI6ZXUoKX19LGFmdGVyQXJyYXlWYWx1ZTpmdW5jdGlvbigpe2lmKCJlb2YiPT09TS50eXBlKXRocm93IHR1KCk7c3dpdGNoKE0udmFsdWUpe2Nhc2UiLCI6cmV0dXJuIHZvaWQoTz0iYmVmb3JlQXJyYXlWYWx1ZSIpO2Nhc2UiXSI6ZXUoKX19LGVuZDpmdW5jdGlvbigpe319O2Z1bmN0aW9uIER1KCl7dmFyIHU7c3dpdGNoKE0udHlwZSl7Y2FzZSJwdW5jdHVhdG9yIjpzd2l0Y2goTS52YWx1ZSl7Y2FzZSJ7Ijp1PXt9O2JyZWFrO2Nhc2UiWyI6dT1bXX1icmVhaztjYXNlIm51bGwiOmNhc2UiYm9vbGVhbiI6Y2FzZSJudW1lcmljIjpjYXNlInN0cmluZyI6dT1NLnZhbHVlfWlmKHZvaWQgMD09PUwpTD11O2Vsc2V7dmFyIEQ9altqLmxlbmd0aC0xXTtBcnJheS5pc0FycmF5KEQpP0QucHVzaCh1KTpPYmplY3QuZGVmaW5lUHJvcGVydHkoRCxrLHt2YWx1ZTp1LHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9aWYobnVsbCE9PXUmJiJvYmplY3QiPT10eXBlb2YgdSlqLnB1c2godSksTz1BcnJheS5pc0FycmF5KHUpPyJiZWZvcmVBcnJheVZhbHVlIjoiYmVmb3JlUHJvcGVydHlOYW1lIjtlbHNle3ZhciBlPWpbai5sZW5ndGgtMV07Tz1udWxsPT1lPyJlbmQiOkFycmF5LmlzQXJyYXkoZSk/ImFmdGVyQXJyYXlWYWx1ZSI6ImFmdGVyUHJvcGVydHlWYWx1ZSJ9fWZ1bmN0aW9uIGV1KCl7ai5wb3AoKTt2YXIgdT1qW2oubGVuZ3RoLTFdO089bnVsbD09dT8iZW5kIjpBcnJheS5pc0FycmF5KHUpPyJhZnRlckFycmF5VmFsdWUiOiJhZnRlclByb3BlcnR5VmFsdWUifWZ1bmN0aW9uIHJ1KHUpe3JldHVybiBDdSh2b2lkIDA9PT11PyJKU09ONTogaW52YWxpZCBlbmQgb2YgaW5wdXQgYXQgIitWKyI6IitKOiJKU09ONTogaW52YWxpZCBjaGFyYWN0ZXIgJyIrRnUodSkrIicgYXQgIitWKyI6IitKKX1mdW5jdGlvbiB0dSgpe3JldHVybiBDdSgiSlNPTjU6IGludmFsaWQgZW5kIG9mIGlucHV0IGF0ICIrVisiOiIrSil9ZnVuY3Rpb24gbnUoKXtyZXR1cm4gQ3UoIkpTT041OiBpbnZhbGlkIGlkZW50aWZpZXIgY2hhcmFjdGVyIGF0ICIrVisiOiIrKEotPTUpKX1mdW5jdGlvbiBGdSh1KXt2YXIgRD17IiciOiJcXCciLCciJzonXFwiJywiXFwiOiJcXFxcIiwiXGIiOiJcXGIiLCJcZiI6IlxcZiIsIlxuIjoiXFxuIiwiXHIiOiJcXHIiLCJcdCI6IlxcdCIsIlx2IjoiXFx2IiwiXDAiOiJcXDAiLCJcdTIwMjgiOiJcXHUyMDI4IiwiXHUyMDI5IjoiXFx1MjAyOSJ9O2lmKERbdV0pcmV0dXJuIERbdV07aWYodTwiICIpe3ZhciBlPXUuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNik7cmV0dXJuIlxceCIrKCIwMCIrZSkuc3Vic3RyaW5nKGUubGVuZ3RoKX1yZXR1cm4gdX1mdW5jdGlvbiBDdSh1KXt2YXIgRD1uZXcgU3ludGF4RXJyb3IodSk7cmV0dXJuIEQubGluZU51bWJlcj1WLEQuY29sdW1uTnVtYmVyPUosRH1yZXR1cm57cGFyc2U6ZnVuY3Rpb24odSxEKXtfPVN0cmluZyh1KSxPPSJzdGFydCIsaj1bXSxJPTAsVj0xLEo9MCxNPXZvaWQgMCxrPXZvaWQgMCxMPXZvaWQgMDtkb3tNPVooKSx1dVtPXSgpfXdoaWxlKCJlb2YiIT09TS50eXBlKTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgRD9mdW5jdGlvbiB1KEQsZSxyKXt2YXIgdD1EW2VdO2lmKG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdClpZihBcnJheS5pc0FycmF5KHQpKWZvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgRj1TdHJpbmcobiksQz11KHQsRixyKTt2b2lkIDA9PT1DP2RlbGV0ZSB0W0ZdOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LEYse3ZhbHVlOkMsd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KX1lbHNlIGZvcih2YXIgQSBpbiB0KXt2YXIgaT11KHQsQSxyKTt2b2lkIDA9PT1pP2RlbGV0ZSB0W0FdOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LEEse3ZhbHVlOmksd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KX1yZXR1cm4gci5jYWxsKEQsZSx0KX0oeyIiOkx9LCIiLEQpOkx9LHN0cmluZ2lmeTpmdW5jdGlvbih1LEQsZSl7dmFyIHIsdCxuLEY9W10sQz0iIixBPSIiO2lmKG51bGw9PUR8fCJvYmplY3QiIT10eXBlb2YgRHx8QXJyYXkuaXNBcnJheShEKXx8KGU9RC5zcGFjZSxuPUQucXVvdGUsRD1ELnJlcGxhY2VyKSwiZnVuY3Rpb24iPT10eXBlb2YgRCl0PUQ7ZWxzZSBpZihBcnJheS5pc0FycmF5KEQpKXtyPVtdO2Zvcih2YXIgaT0wLEU9RDtpPEUubGVuZ3RoO2krPTEpe3ZhciBvPUVbaV0sYT12b2lkIDA7InN0cmluZyI9PXR5cGVvZiBvP2E9bzooIm51bWJlciI9PXR5cGVvZiBvfHxvIGluc3RhbmNlb2YgU3RyaW5nfHxvIGluc3RhbmNlb2YgTnVtYmVyKSYmKGE9U3RyaW5nKG8pKSx2b2lkIDAhPT1hJiZyLmluZGV4T2YoYSk8MCYmci5wdXNoKGEpfX1yZXR1cm4gZSBpbnN0YW5jZW9mIE51bWJlcj9lPU51bWJlcihlKTplIGluc3RhbmNlb2YgU3RyaW5nJiYoZT1TdHJpbmcoZSkpLCJudW1iZXIiPT10eXBlb2YgZT9lPjAmJihlPU1hdGgubWluKDEwLE1hdGguZmxvb3IoZSkpLEE9IiAgICAgICAgICAiLnN1YnN0cigwLGUpKToic3RyaW5nIj09dHlwZW9mIGUmJihBPWUuc3Vic3RyKDAsMTApKSxjKCIiLHsiIjp1fSk7ZnVuY3Rpb24gYyh1LEQpe3ZhciBlPURbdV07c3dpdGNoKG51bGwhPWUmJigiZnVuY3Rpb24iPT10eXBlb2YgZS50b0pTT041P2U9ZS50b0pTT041KHUpOiJmdW5jdGlvbiI9PXR5cGVvZiBlLnRvSlNPTiYmKGU9ZS50b0pTT04odSkpKSx0JiYoZT10LmNhbGwoRCx1LGUpKSxlIGluc3RhbmNlb2YgTnVtYmVyP2U9TnVtYmVyKGUpOmUgaW5zdGFuY2VvZiBTdHJpbmc/ZT1TdHJpbmcoZSk6ZSBpbnN0YW5jZW9mIEJvb2xlYW4mJihlPWUudmFsdWVPZigpKSxlKXtjYXNlIG51bGw6cmV0dXJuIm51bGwiO2Nhc2UhMDpyZXR1cm4idHJ1ZSI7Y2FzZSExOnJldHVybiJmYWxzZSJ9cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP0IoZSk6Im51bWJlciI9PXR5cGVvZiBlP1N0cmluZyhlKToib2JqZWN0Ij09dHlwZW9mIGU/QXJyYXkuaXNBcnJheShlKT9mdW5jdGlvbih1KXtpZihGLmluZGV4T2YodSk+PTApdGhyb3cgVHlwZUVycm9yKCJDb252ZXJ0aW5nIGNpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09ONSIpO0YucHVzaCh1KTt2YXIgRD1DO0MrPUE7Zm9yKHZhciBlLHI9W10sdD0wO3Q8dS5sZW5ndGg7dCsrKXt2YXIgbj1jKFN0cmluZyh0KSx1KTtyLnB1c2godm9pZCAwIT09bj9uOiJudWxsIil9aWYoMD09PXIubGVuZ3RoKWU9IltdIjtlbHNlIGlmKCIiPT09QSl7dmFyIGk9ci5qb2luKCIsIik7ZT0iWyIraSsiXSJ9ZWxzZXt2YXIgRT0iLFxuIitDLG89ci5qb2luKEUpO2U9IltcbiIrQytvKyIsXG4iK0QrIl0ifXJldHVybiBGLnBvcCgpLEM9RCxlfShlKTpmdW5jdGlvbih1KXtpZihGLmluZGV4T2YodSk+PTApdGhyb3cgVHlwZUVycm9yKCJDb252ZXJ0aW5nIGNpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09ONSIpO0YucHVzaCh1KTt2YXIgRD1DO0MrPUE7Zm9yKHZhciBlLHQsbj1yfHxPYmplY3Qua2V5cyh1KSxpPVtdLEU9MCxvPW47RTxvLmxlbmd0aDtFKz0xKXt2YXIgYT1vW0VdLEI9YyhhLHUpO2lmKHZvaWQgMCE9PUIpe3ZhciBmPXMoYSkrIjoiOyIiIT09QSYmKGYrPSIgIiksZis9QixpLnB1c2goZil9fWlmKDA9PT1pLmxlbmd0aCllPSJ7fSI7ZWxzZSBpZigiIj09PUEpdD1pLmpvaW4oIiwiKSxlPSJ7Iit0KyJ9IjtlbHNle3ZhciBsPSIsXG4iK0M7dD1pLmpvaW4obCksZT0ie1xuIitDK3QrIixcbiIrRCsifSJ9cmV0dXJuIEYucG9wKCksQz1ELGV9KGUpOnZvaWQgMH1mdW5jdGlvbiBCKHUpe2Zvcih2YXIgRD17IiciOi4xLCciJzouMn0sZT17IiciOiJcXCciLCciJzonXFwiJywiXFwiOiJcXFxcIiwiXGIiOiJcXGIiLCJcZiI6IlxcZiIsIlxuIjoiXFxuIiwiXHIiOiJcXHIiLCJcdCI6IlxcdCIsIlx2IjoiXFx2IiwiXDAiOiJcXDAiLCJcdTIwMjgiOiJcXHUyMDI4IiwiXHUyMDI5IjoiXFx1MjAyOSJ9LHI9IiIsdD0wO3Q8dS5sZW5ndGg7dCsrKXt2YXIgRj11W3RdO3N3aXRjaChGKXtjYXNlIiciOmNhc2UnIic6RFtGXSsrLHIrPUY7Y29udGludWU7Y2FzZSJcMCI6aWYoVS5pc0RpZ2l0KHVbdCsxXSkpe3IrPSJcXHgwMCI7Y29udGludWV9fWlmKGVbRl0pcis9ZVtGXTtlbHNlIGlmKEY8IiAiKXt2YXIgQz1GLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpO3IrPSJcXHgiKygiMDAiK0MpLnN1YnN0cmluZyhDLmxlbmd0aCl9ZWxzZSByKz1GfXZhciBBPW58fE9iamVjdC5rZXlzKEQpLnJlZHVjZShmdW5jdGlvbih1LGUpe3JldHVybiBEW3VdPERbZV0/dTplfSk7cmV0dXJuIEErKHI9ci5yZXBsYWNlKG5ldyBSZWdFeHAoQSwiZyIpLGVbQV0pKStBfWZ1bmN0aW9uIHModSl7aWYoMD09PXUubGVuZ3RoKXJldHVybiBCKHUpO3ZhciBEPVN0cmluZy5mcm9tQ29kZVBvaW50KHUuY29kZVBvaW50QXQoMCkpO2lmKCFVLmlzSWRTdGFydENoYXIoRCkpcmV0dXJuIEIodSk7Zm9yKHZhciBlPUQubGVuZ3RoO2U8dS5sZW5ndGg7ZSsrKWlmKCFVLmlzSWRDb250aW51ZUNoYXIoU3RyaW5nLmZyb21Db2RlUG9pbnQodS5jb2RlUG9pbnRBdChlKSkpKXJldHVybiBCKHUpO3JldHVybiB1fX19fSk7`;
131861
134244
  //#endregion
131862
134245
  //#region src/client/api/view-server/request.ts
134246
+ var VIEW_REQUEST_HEADER = "X-Inspect-View-Request";
134247
+ var VIEW_REQUEST_HEADER_VALUE = "true";
131863
134248
  var ApiError = class extends Error {
131864
134249
  status;
131865
134250
  constructor(status, message) {
@@ -131890,6 +134275,9 @@ function unwrapFastapiDetail(body) {
131890
134275
  }
131891
134276
  function serverRequestApi(baseUrl, getHeaders) {
131892
134277
  const apiUrl = baseUrl || "";
134278
+ function addViewRequestHeader(method, headers) {
134279
+ if (method !== "GET") headers[VIEW_REQUEST_HEADER] = VIEW_REQUEST_HEADER_VALUE;
134280
+ }
131893
134281
  function buildApiUrl(path) {
131894
134282
  if (!apiUrl) return path;
131895
134283
  return (apiUrl.endsWith("/") ? apiUrl.slice(0, -1) : apiUrl) + (path.startsWith("/") ? path : `/${path}`);
@@ -131915,6 +134303,7 @@ function serverRequestApi(baseUrl, getHeaders) {
131915
134303
  Object.assign(responseHeaders, globalHeaders);
131916
134304
  }
131917
134305
  if (request.body) responseHeaders["Content-Type"] = "application/json";
134306
+ addViewRequestHeader(method, responseHeaders);
131918
134307
  const response = await fetch(url, {
131919
134308
  method,
131920
134309
  headers: responseHeaders,
@@ -131950,6 +134339,7 @@ function serverRequestApi(baseUrl, getHeaders) {
131950
134339
  Object.assign(requestHeaders, globalHeaders);
131951
134340
  }
131952
134341
  if (body) requestHeaders["Content-Type"] = "application/json";
134342
+ addViewRequestHeader(method, requestHeaders);
131953
134343
  const response = await fetch(url, {
131954
134344
  method,
131955
134345
  headers: requestHeaders,
@@ -131978,6 +134368,7 @@ function serverRequestApi(baseUrl, getHeaders) {
131978
134368
  const globalHeaders = await getHeaders();
131979
134369
  Object.assign(headers, globalHeaders);
131980
134370
  }
134371
+ addViewRequestHeader(method, headers);
131981
134372
  const response = await fetch(url, {
131982
134373
  method,
131983
134374
  headers,
@@ -132294,7 +134685,7 @@ var EditMetadataDialog = ({ showing, setShowing, currentMetadata, logFile, onSav
132294
134685
  }), /* @__PURE__ */ jsx("button", {
132295
134686
  type: "button",
132296
134687
  className: clsx("btn", "btn-primary", "text-size-smaller"),
132297
- onClick: handleSave,
134688
+ onClick: () => void handleSave(),
132298
134689
  disabled: !canSave,
132299
134690
  children: submitting ? "Saving…" : "Save"
132300
134691
  })]
@@ -132700,8 +135091,8 @@ var DownloadButton = ({ label, fileName, fileContents }) => {
132700
135091
  const api = useApi();
132701
135092
  return /* @__PURE__ */ jsx("button", {
132702
135093
  className: "btn btn-outline-primary download-button",
132703
- onClick: async () => {
132704
- await api.download_file(fileName, fileContents);
135094
+ onClick: () => {
135095
+ api.download_file(fileName, fileContents);
132705
135096
  },
132706
135097
  children: label
132707
135098
  });
@@ -133202,6 +135593,7 @@ var SampleList = memo((props) => {
133202
135593
  ]
133203
135594
  });
133204
135595
  });
135596
+ SampleList.displayName = "SampleList";
133205
135597
  var SamplesViewOptionsPopover_module_default = {
133206
135598
  container: "_container_1tduz_1",
133207
135599
  row: "_row_1tduz_8",
@@ -136904,7 +139296,7 @@ function add(elt, child) {
136904
139296
  else throw new RangeError("Unsupported child node: " + child);
136905
139297
  }
136906
139298
  //#endregion
136907
- //#region ../../node_modules/.pnpm/@codemirror+view@6.43.0/node_modules/@codemirror/view/dist/index.js
139299
+ //#region ../../node_modules/.pnpm/@codemirror+view@6.43.1/node_modules/@codemirror/view/dist/index.js
136908
139300
  var nav = typeof navigator != "undefined" ? navigator : {
136909
139301
  userAgent: "",
136910
139302
  vendor: "",
@@ -139058,6 +141450,7 @@ var TileUpdate = class {
139058
141450
  if (composition && next.fromA <= composition.range.fromA && next.toA >= composition.range.toA) {
139059
141451
  this.forward(next.fromA, composition.range.fromA, composition.range.fromA < composition.range.toA ? 1 : -1);
139060
141452
  this.emit(posB, composition.range.fromB);
141453
+ this.builder.flushBuffer();
139061
141454
  this.cache.clear();
139062
141455
  this.builder.addComposition(composition, compositionContext);
139063
141456
  this.text.skip(composition.range.toB - composition.range.fromB);
@@ -140099,6 +142492,10 @@ var InlineCoordsScan = class {
140099
142492
  }
140100
142493
  }
140101
142494
  if (!closestRect) {
142495
+ if (!below && !above) return {
142496
+ i: positions[0],
142497
+ after: false
142498
+ };
140102
142499
  let side = above && (!below || this.y - above.bottom < below.top - this.y) ? above : below;
140103
142500
  this.y = (side.top + side.bottom) / 2;
140104
142501
  return this.scan(positions, getRects, true);
@@ -142491,6 +144888,7 @@ var baseTheme$1$1 = /*@__PURE__*/ buildTheme("." + baseThemeID, {
142491
144888
  padding: "0 2px 0 6px"
142492
144889
  },
142493
144890
  ".cm-layer": {
144891
+ userSelect: "none",
142494
144892
  position: "absolute",
142495
144893
  left: 0,
142496
144894
  top: 0,
@@ -151107,7 +153505,7 @@ var completionKeymap = [
151107
153505
  ];
151108
153506
  var completionKeymapExt = /*@__PURE__*/ Prec.highest(/*@__PURE__*/ keymap.computeN([completionConfig], (state) => state.facet(completionConfig).defaultKeymap ? [completionKeymap] : []));
151109
153507
  //#endregion
151110
- //#region ../../node_modules/.pnpm/@codemirror+lint@6.9.6/node_modules/@codemirror/lint/dist/index.js
153508
+ //#region ../../node_modules/.pnpm/@codemirror+lint@6.9.7/node_modules/@codemirror/lint/dist/index.js
151111
153509
  var SelectedDiagnostic = class {
151112
153510
  constructor(from, to, diagnostic) {
151113
153511
  this.from = from;
@@ -151271,7 +153669,7 @@ function lintTooltip(view, pos, side) {
151271
153669
  return {
151272
153670
  pos: start,
151273
153671
  end,
151274
- above: view.state.doc.lineAt(start).to < end,
153672
+ above: true,
151275
153673
  create() {
151276
153674
  return { dom: diagnosticsTooltip(view, found) };
151277
153675
  }
@@ -155003,11 +157401,11 @@ var makeMetadataValueCompletion = (value) => {
155003
157401
  if (typeof value === "string") label = `"${value}"`;
155004
157402
  else if (typeof value === "boolean") label = value ? "True" : "False";
155005
157403
  else if (value === null) label = "None";
155006
- else label = String(value);
157404
+ else label = valueAsString(value);
155007
157405
  return {
155008
157406
  label,
155009
157407
  type: "text",
155010
- info: `Metadata value: ${value}`,
157408
+ info: `Metadata value: ${String(value)}`,
155011
157409
  boost: 25
155012
157410
  };
155013
157411
  };
@@ -155181,7 +157579,7 @@ function getCompletions(context, filterItems, samples) {
155181
157579
  const metadataValues = Array.from(getMetadataPropertyValues(samples, metadataPropertyPath));
155182
157580
  const currentQuery = currentToken?.text || "";
155183
157581
  return makeCompletions((currentQuery ? metadataValues.filter((value) => {
155184
- return (typeof value === "string" ? `"${value}"` : typeof value === "boolean" ? value ? "True" : "False" : value === null ? "None" : String(value)).toLowerCase().startsWith(currentQuery.toLowerCase());
157582
+ return (typeof value === "string" ? `"${value}"` : typeof value === "boolean" ? value ? "True" : "False" : value === null ? "None" : valueAsString(value)).toLowerCase().startsWith(currentQuery.toLowerCase());
155185
157583
  }) : metadataValues).map(makeMetadataValueCompletion), { includeDefault: false });
155186
157584
  }
155187
157585
  if (varName === "id" && samples) {
@@ -156676,7 +159074,7 @@ function buildScoreColumns(ctx) {
156676
159074
  filter: isNumeric ? "agNumberColumnFilter" : "agTextColumnFilter",
156677
159075
  resizable: true,
156678
159076
  cellStyle,
156679
- comparator: isNumeric ? comparators.number : (a, b) => String(a ?? "").localeCompare(String(b ?? "")),
159077
+ comparator: isNumeric ? comparators.number : (a, b) => valueAsString(a ?? "").localeCompare(valueAsString(b ?? "")),
156680
159078
  valueGetter: (params) => {
156681
159079
  const data = params.data?.data;
156682
159080
  if (!data) return void 0;
@@ -156743,7 +159141,7 @@ function buildScoreColumns(ctx) {
156743
159141
  if (typeof v === "number") return v.toFixed(3);
156744
159142
  return String(v);
156745
159143
  },
156746
- comparator: isUniformNumber ? comparators.number : (a, b) => String(a ?? "").localeCompare(String(b ?? ""))
159144
+ comparator: isUniformNumber ? comparators.number : (a, b) => valueAsString(a ?? "").localeCompare(valueAsString(b ?? ""))
156747
159145
  };
156748
159146
  });
156749
159147
  }
@@ -157398,7 +159796,7 @@ var EditTagsDialog = ({ showing, setShowing, currentTags, logFile, onSaved }) =>
157398
159796
  }), /* @__PURE__ */ jsx("button", {
157399
159797
  type: "button",
157400
159798
  className: clsx("btn", "btn-primary", "text-size-smaller"),
157401
- onClick: handleSave,
159799
+ onClick: () => void handleSave(),
157402
159800
  disabled: !canSave,
157403
159801
  children: submitting ? "Saving…" : "Save"
157404
159802
  })]
@@ -157630,10 +160028,14 @@ var TaskTab = ({ evalSpec, evalStats, earlyStopping, tags }) => {
157630
160028
  ["Task ID"]: evalSpec?.task_id,
157631
160029
  ["Run ID"]: evalSpec?.run_id
157632
160030
  };
157633
- if (revision) taskInformation[`${revision.type ? `${toTitleCase(revision.type)} ` : ""}Revision`] = { _html: /* @__PURE__ */ jsx("a", {
157634
- href: ghCommitUrl(revision.origin, revision.commit),
157635
- children: revision.commit
157636
- }) };
160031
+ if (revision) {
160032
+ const revisionKey = `${revision.type ? `${toTitleCase(revision.type)} ` : ""}Revision`;
160033
+ const commitUrl = ghCommitUrl(revision.origin, revision.commit);
160034
+ taskInformation[revisionKey] = commitUrl ? { _html: /* @__PURE__ */ jsx("a", {
160035
+ href: commitUrl,
160036
+ children: revision.commit
160037
+ }) } : revision.commit;
160038
+ }
157637
160039
  if (packages) {
157638
160040
  const names = Object.keys(packages).map((key) => {
157639
160041
  return `${key} ${packages[key]}`;
@@ -157731,14 +160133,14 @@ var metricDisplayName = (metric) => {
157731
160133
  };
157732
160134
  var clusterMetricModifier = (metric) => {
157733
160135
  if (metric.name !== "stderr") return;
157734
- const clusterValue = (metric.params || {})["cluster"];
160136
+ const clusterValue = metric.params?.["cluster"];
157735
160137
  if (clusterValue === void 0 || typeof clusterValue !== "string") return;
157736
160138
  return clusterValue;
157737
160139
  };
157738
160140
  var groupMetricModifier = (metric) => {
157739
- const groupKey = (metric.params || {})["group_key"];
160141
+ const groupKey = metric.params?.["group_key"];
157740
160142
  if (groupKey === void 0 || typeof groupKey !== "string") return;
157741
- const metricRaw = (metric.params || {})["metric"];
160143
+ const metricRaw = metric.params?.["metric"];
157742
160144
  if (metricRaw === void 0 || typeof metricRaw !== "object") return;
157743
160145
  return metricRaw["name"];
157744
160146
  };
@@ -158362,7 +160764,7 @@ var DownloadLogButton = ({ log_file, className = "", ariaLabel = "Download log a
158362
160764
  return /* @__PURE__ */ jsx("button", {
158363
160765
  type: "button",
158364
160766
  className: clsx("download-log-button", DownloadLogButton_module_default.downloadLogButton, className),
158365
- onClick: handleClick,
160767
+ onClick: () => void handleClick(),
158366
160768
  "aria-label": ariaLabel,
158367
160769
  disabled: downloadState !== "idle",
158368
160770
  children: /* @__PURE__ */ jsx("i", {
@@ -158666,7 +161068,7 @@ var ParamSummary = ({ params }) => {
158666
161068
  const paraValues = Object.keys(params).map((key) => {
158667
161069
  const val = params[key];
158668
161070
  if (Array.isArray(val) || typeof val === "object") return `${key}: ${JSON.stringify(val)}`;
158669
- else return `${key}: ${String(val)}`;
161071
+ else return `${key}: ${valueAsString(val)}`;
158670
161072
  });
158671
161073
  if (paraValues.length > 0) return /* @__PURE__ */ jsx("code", {
158672
161074
  style: {
@@ -159861,7 +162263,7 @@ var AppContent = () => {
159861
162263
  };
159862
162264
  if (selectedLogDetails?.status === "started") doPoll();
159863
162265
  }, [pollLog, selectedLogDetails?.status]);
159864
- const onMessage = useCallback(async (e) => {
162266
+ const onMessage = useCallback((e) => {
159865
162267
  switch (e.data.type) {
159866
162268
  case "updateState":
159867
162269
  if (e.data.url) {
@@ -161233,10 +163635,11 @@ function getZstdWorker() {
161233
163635
  blobURL = URL.createObjectURL(blob);
161234
163636
  zstdWorker = new Worker(blobURL);
161235
163637
  const initHandler = (event) => {
161236
- if (event.data.type === "init_complete") {
163638
+ const message = event.data;
163639
+ if (message.type === "init_complete") {
161237
163640
  zstdWorker.removeEventListener("message", initHandler);
161238
- if (event.data.success) resolve(zstdWorker);
161239
- else reject(new Error(event.data.error || "Worker initialization failed"));
163641
+ if (message.success) resolve(zstdWorker);
163642
+ else reject(new Error(message.error || "Worker initialization failed"));
161240
163643
  }
161241
163644
  };
161242
163645
  zstdWorker.addEventListener("message", initHandler);
@@ -161277,7 +163680,7 @@ async function decompressZstd(data) {
161277
163680
  const pending = pendingRequests.get(respId);
161278
163681
  if (!pending) return;
161279
163682
  pendingRequests.delete(respId);
161280
- if (success) pending.resolve(resultData);
163683
+ if (success && resultData) pending.resolve(resultData);
161281
163684
  else pending.reject(new Error(error || "Decompression failed"));
161282
163685
  });
161283
163686
  worker.addEventListener("error", (error) => {
@@ -161449,7 +163852,7 @@ var openRemoteZipFile = async (url, contentLength, fetchBytes = fetchRange) => {
161449
163852
  /**
161450
163853
  * Opens an in-memory ZIP buffer and provides a method to read files within it.
161451
163854
  */
161452
- var openZipFileFromBuffer = async (bytes) => {
163855
+ var openZipFileFromBuffer = (bytes) => {
161453
163856
  const contentLength = bytes.length;
161454
163857
  if (contentLength < 22) throw new Error("Buffer too small to be a ZIP file");
161455
163858
  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
@@ -161466,7 +163869,7 @@ var openZipFileFromBuffer = async (bytes) => {
161466
163869
  centralDirOffset = Number(view.getBigUint64(zip64EOCDOffset + 48, true));
161467
163870
  }
161468
163871
  const centralDirectory = parseCentralDirectory(bytes.slice(centralDirOffset, centralDirOffset + centralDirSize));
161469
- return {
163872
+ return Promise.resolve({
161470
163873
  centralDirectory,
161471
163874
  readFile: async (file, maxBytes) => {
161472
163875
  const entry = centralDirectory.get(file);
@@ -161479,7 +163882,7 @@ var openZipFileFromBuffer = async (bytes) => {
161479
163882
  const zipFileEntry = await parseZipFileEntry(file, bytes.slice(entry.fileOffset, entry.fileOffset + totalSize));
161480
163883
  return decompressData(zipFileEntry.data, zipFileEntry.compressionMethod, zipFileEntry.uncompressedSize, file);
161481
163884
  }
161482
- };
163885
+ });
161483
163886
  };
161484
163887
  var fetchSize = async (url) => {
161485
163888
  const acceptResponse = await fetch(url, { method: "HEAD" });
@@ -161505,7 +163908,7 @@ var fetchSize = async (url) => {
161505
163908
  /**
161506
163909
  * Extracts and parses the header and data of a compressed ZIP entry from raw binary data.
161507
163910
  */
161508
- var parseZipFileEntry = async (file, rawData) => {
163911
+ var parseZipFileEntry = (file, rawData) => {
161509
163912
  const view = new DataView(rawData.buffer);
161510
163913
  let offset = 0;
161511
163914
  if (view.getUint32(offset, true) !== 67324752) throw new Error(`Invalid ZIP entry signature for ${file}`);
@@ -161549,7 +163952,7 @@ var parseZipFileEntry = async (file, rawData) => {
161549
163952
  }
161550
163953
  offset += filenameLength + extraFieldLength;
161551
163954
  const data = rawData.subarray(offset, offset + compressedSize);
161552
- return {
163955
+ return Promise.resolve({
161553
163956
  versionNeeded,
161554
163957
  bitFlag,
161555
163958
  compressionMethod,
@@ -161559,7 +163962,7 @@ var parseZipFileEntry = async (file, rawData) => {
161559
163962
  filenameLength,
161560
163963
  extraFieldLength,
161561
163964
  data
161562
- };
163965
+ });
161563
163966
  };
161564
163967
  var kFileHeaderSize = 46;
161565
163968
  /**
@@ -161688,14 +164091,14 @@ var openRemoteLogFile = async (api, url, concurrency) => {
161688
164091
  /**
161689
164092
  * Lists all samples in the zip file.
161690
164093
  */
161691
- const listSamples = async () => {
161692
- return Array.from(remoteZipFile.centralDirectory.keys()).filter((filename) => filename.startsWith("samples/") && filename.endsWith(".json")).map((filename) => {
164094
+ const listSamples = () => {
164095
+ return Promise.resolve(Array.from(remoteZipFile.centralDirectory.keys()).filter((filename) => filename.startsWith("samples/") && filename.endsWith(".json")).map((filename) => {
161693
164096
  const [sampleId, epochStr] = filename.split("/")[1].split("_epoch_");
161694
164097
  return {
161695
164098
  sampleId,
161696
164099
  epoch: parseInt(epochStr.split(".")[0], 10)
161697
164100
  };
161698
- });
164101
+ }));
161699
164102
  };
161700
164103
  /**
161701
164104
  * Reads a specific sample file.
@@ -162275,8 +164678,9 @@ function staticHttpApiForLog(logInfo) {
162275
164678
  else return false;
162276
164679
  });
162277
164680
  },
162278
- log_message: async (log_file, message) => {
164681
+ log_message: (log_file, message) => {
162279
164682
  console.log(`[CLIENT MESSAGE] (${log_file}): ${message}`);
164683
+ return Promise.resolve();
162280
164684
  },
162281
164685
  get_log_contents: async (log_file, _headerOnly, _capabilities) => {
162282
164686
  const response = await fetchLogFile(log_file);
@@ -162319,7 +164723,7 @@ function staticHttpApiForLog(logInfo) {
162319
164723
  }
162320
164724
  throw new Error(`Failed to load a listing file using the directory: ${log_dir}. Please be sure you have deployed a manifest file (listing.json).`);
162321
164725
  },
162322
- get_app_config: async () => app_config,
164726
+ get_app_config: () => Promise.resolve(app_config),
162323
164727
  download_file,
162324
164728
  open_log_file
162325
164729
  };
@@ -162484,10 +164888,11 @@ function viewServerApi(options = {}) {
162484
164888
  const params = new URLSearchParams();
162485
164889
  params.append("log_file", log_file);
162486
164890
  params.append("message", message);
162487
- await requestApi.fetchType("GET", `/log-message?${params.toString()}`, {
164891
+ await requestApi.fetchType("POST", `/log-message?${params.toString()}`, {
162488
164892
  headers: { "Content-Type": "text/plain" },
162489
- parse: async (text) => {
164893
+ parse: (text) => {
162490
164894
  if (text !== "") throw new Error(`Unexpected response from log_message: ${text}`);
164895
+ return Promise.resolve();
162491
164896
  }
162492
164897
  });
162493
164898
  };
@@ -162576,6 +164981,7 @@ function viewServerApi(options = {}) {
162576
164981
  };
162577
164982
  if (if_match_etag) headers["If-Match"] = if_match_etag;
162578
164983
  if (headerProvider) Object.assign(headers, await headerProvider());
164984
+ headers[VIEW_REQUEST_HEADER] = VIEW_REQUEST_HEADER_VALUE;
162579
164985
  const isCrossOrigin = Boolean(apiBaseUrl && (() => {
162580
164986
  try {
162581
164987
  return new URL(apiBaseUrl).origin !== window.location.origin;
@@ -162626,7 +165032,7 @@ function viewServerApi(options = {}) {
162626
165032
  throw error;
162627
165033
  }
162628
165034
  };
162629
- const download_log = async (log_file) => {
165035
+ const download_log = (log_file) => {
162630
165036
  const url = `${apiBaseUrl || "/api"}/log-download/${encodeURIComponent(log_file)}`;
162631
165037
  const link = document.createElement("a");
162632
165038
  link.href = url;
@@ -162634,6 +165040,7 @@ function viewServerApi(options = {}) {
162634
165040
  document.body.appendChild(link);
162635
165041
  link.click();
162636
165042
  document.body.removeChild(link);
165043
+ return Promise.resolve();
162637
165044
  };
162638
165045
  return {
162639
165046
  client_events,