sliftutils 1.8.16 → 1.8.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CLAUDE.md CHANGED
@@ -48,6 +48,7 @@ from `.cursor/rules/*.mdc` so Claude reads them automatically.
48
48
  - `import { keyBy, keyByArray } from "socket-function/src/misc";` for building lookups.
49
49
  - Never use `alert`. Throw instead.
50
50
  - Always use the helper functions for potentially large numbers (> 1000), and time spans. For time spans, it takes the time in terms of milliseconds. For example, 5,000 would be formatted as 5 seconds. `import { formatNumber, formatTime } from "socket-function/src/formatting/format";`
51
+ - NEVER use "abstract" classes. Don't abuse inheritance. should almost never be used. It is bad. Inheritance is only used for things such as PReact component because the framework requires it.
51
52
 
52
53
  ## MobX state
53
54
 
package/index.d.ts CHANGED
@@ -813,6 +813,9 @@ declare module "sliftutils/render-utils/URLParam" {
813
813
  valueSeqNum: {
814
814
  value: number;
815
815
  };
816
+ private tickCache;
817
+ private setTickCache;
818
+ clearTickCache(): void;
816
819
  get(): T;
817
820
  set(value: T): void;
818
821
  reset(): void;
@@ -1,4 +1,4 @@
1
- "use strict";
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
3
  //exports.ellipsize = void 0;
4
4
  function ellipsize(text, maxLength) {
@@ -9,4 +9,4 @@ function ellipsize(text, maxLength) {
9
9
  }
10
10
  exports.ellipsize = ellipsize;
11
11
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5ncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN0cmluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsU0FBZ0IsU0FBUyxDQUFDLElBQVksRUFBRSxTQUFpQjtJQUNyRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksU0FBUyxFQUFFLENBQUM7UUFDM0IsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNoRCxDQUFDO0FBTEQsOEJBS0MiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gZWxsaXBzaXplKHRleHQ6IHN0cmluZywgbWF4TGVuZ3RoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA8PSBtYXhMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIHJldHVybiB0ZXh0LnNsaWNlKDAsIG1heExlbmd0aCAtIDMpICsgXCIuLi5cIjtcbn1cbiJdfQ==
12
- /* _JS_SOURCE_HASH = "42720f3fe753adb3976d4e2195d69f9ff6c408573751f8cdc6368d2988eac5c7"; */
12
+ /* _JS_SOURCE_HASH = "2940a18b46d3e6b0349b3768588927e9002bfc3a985f2b84c32f2ad2f84813ff"; */
@@ -1,4 +1,4 @@
1
- "use strict";
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
2
  /// <reference path="./node-forge-ed25519.d.ts" />
3
3
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
4
  if (k2 === undefined) k2 = k;
@@ -474,4 +474,4 @@ function getOwnNodeIdAllowUndefined() {
474
474
  }
475
475
  exports.getOwnNodeIdAllowUndefined = getOwnNodeIdAllowUndefined;
476
476
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjZXJ0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsa0RBQWtEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVsRCwrbkJBQStuQjtBQUMvbkIsc0lBQXNJO0FBRXRJLGlEQUFpRDtBQUVqRCx1RUFBK0Q7QUFDL0Qsa0RBQW9DO0FBR3BDLHlEQUEwRDtBQUUxRCwwREFBK0I7QUFDL0IsNkRBQWlFO0FBQ2pFLG1FQUE4RjtBQUM5Riw2REFBa0g7QUFDbEgsbUVBQWdFO0FBQ2hFLDZEQUEwRTtBQUMxRSxxRUFBa0c7QUFDbEcsd0NBQXVDO0FBRXZDLElBQUEsc0JBQU8sRUFBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNwRCxJQUFBLHNCQUFPLEVBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFFbkQsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRXpCLFFBQUEsa0JBQWtCLEdBQUcsc0NBQXNDLENBQUM7QUFFNUQsUUFBQSxrQkFBa0IsR0FBRyxjQUFjLENBQUM7QUFHakQsU0FBUyxnQkFBZ0IsQ0FBQyxNQUFjO0lBQ3BDLE9BQU8sSUFBQSxvQ0FBVyxFQUFzQixNQUFNLEVBQUUsMEJBQWtCLENBQUMsQ0FBQztBQUN4RSxDQUFDO0FBRUQsaUdBQWlHO0FBQ2pHLG1GQUFtRjtBQUNuRixTQUFnQix1QkFBdUIsQ0FBQyxNQUFjO0lBQ2xELE9BQU8sSUFBQSw0Q0FBbUIsRUFBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLDBCQUFrQixFQUFFLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRkQsMERBRUM7QUFFRCxrR0FBa0c7QUFDbEcsU0FBZ0IsdUJBQXVCO0lBQ25DLE9BQU8sSUFBQSw2Q0FBb0IsRUFBQywwQkFB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QUFDLENBQUMsQ0FBQyxDQUFDO0FBRUosU0FBZ0IsWUFBWTtJQUN4QixJQUFJLE1BQU0sR0FBRywrQkFBYyxDQUFDLGFBQWEsQ0FBQztJQUMxQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDVixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFORCxvQ0FNQztBQUVELFNBQWdCLDBCQUEwQjtJQUN0QyxPQUFPLCtCQUFjLENBQUMsYUFBYSxDQUFDO0FBQ3hDLENBQUM7QUFGRCxnRUFFQyIsInNvdXJjZXNDb250ZW50IjpbIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL25vZGUtZm9yZ2UtZWQyNTUxOS5kLnRzXCIgLz5cblxuLy8gTk9URTogV2UgY2FuJ3QgdXNlIGNyeXB0by5zdWJ0bGUgKG5vbi1leHRyYWN0YWJsZSBDcnlwdG9LZXlzKSBmb3Igb3VyIGtleXMsIGJlY2F1c2Ugc3VidGxlIGlzIGFzeW5jaHJvbm91cywgYW5kIGV2ZXJ5dGhpbmcgaGVyZSAoa2V5IGdlbmVyYXRpb24sIGNlcnQgY3JlYXRpb24sIHNpZ25pbmcpIG11c3QgYmUgYXZhaWxhYmxlIHN5bmNocm9ub3VzbHkuIFRoZSBvbmx5IHJlYWwgYmVuZWZpdCBvZiBzdWJ0bGUgaXMgdGhhdCBhIGNyb3NzLXNpdGUgc2NyaXB0aW5nIGF0dGFjayBjYW4ndCBleGZpbHRyYXRlIHRoZSBrZXkuIFdoaWNoLCB3aGlsZSBuaWNlLCBpcyBvZiBtaW5vciBiZW5lZml0LCBhcyB0aGUgY3Jvc3Mtc2l0ZSBzY3JpcHQgY2FuIGFscmVhZHkgZG8gcXVpdGUgYSBiaXQgb2YgZGFtYWdlIGFueXdheSB3aXRoIGFjY2Vzcy4gQW5kIGlmIHRoYXQgaGFwcGVucywgdGhlIGZpcnN0IHRoaW5nIHRoZSB1c2VyIGlzIHByb2JhYmx5IGdvaW5nIHRvIGRvIGlzIHJlc2V0IGFsbCB0aGVpciBjcmVkZW50aWFscywgd2hpY2ggc29sdmVzIHRoZSBjYXNlIG9mIHRoZSBrZXkgYmVpbmcgZXhmaWx0cmF0ZWQgYW55d2F5IChieSB0ZWxsaW5nIHRoZSBzZXJ2ZXIgdG8gc3RvcCB0cnVzdGluZyBhbGwgaWRlbnRpdGllcykuXG4vLyBOT1RFOiBXZSBhcmUganVzdCBub3QgZ29pbmcgdG8gc3VwcG9ydCBIVFRQUyBicm93c2VyIGNlcnRzLiBPdXIgY29kZSBpcyBwdXJlbHkgZm9yIGlkZW50aWZpY2F0aW9uLCBhbmQgc28gaXQgb25seSBzdXBwb3J0cyBFRDI1NTE5LlxuXG4vLyBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNTI4MCNwYWdlLTQyXG5cbmltcG9ydCB7IHNldEZsYWcgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3JlcXVpcmUvY29tcGlsZUZsYWdzXCI7XG5pbXBvcnQgKiBhcyBmb3JnZSBmcm9tIFwibm9kZS1mb3JnZVwiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IGZzU3luYyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGNhY2hlLCBsYXp5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHNoYTI2NSBmcm9tIFwianMtc2hhMjU2XCI7XG5pbXBvcnQgeyB0cnVzdENlcnRpZmljYXRlIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2VydFN0b3JlXCI7XG5pbXBvcnQgeyBtZWFzdXJlQmxvY2ssIG1lYXN1cmVGbmMsIG1lYXN1cmVXcmFwIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvcHJvZmlsaW5nL21lYXN1cmVcIjtcbmltcG9ydCB7IGdldE5vZGVJZERvbWFpbiwgZ2V0Tm9kZUlkRG9tYWluTWF5YmVVbmRlZmluZWQsIGdldE5vZGVJZExvY2F0aW9uIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbm9kZUNhY2hlXCI7XG5pbXBvcnQgeyBTb2NrZXRGdW5jdGlvbiB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vU29ja2V0RnVuY3Rpb25cIjtcbmltcG9ydCB7IHJlc2V0QWxsTm9kZUNhbGxGYWN0b3JpZXMgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9ub2RlQ2FjaGVcIjtcbmltcG9ydCB7IGdldEtleVN0b3JlLCBERVZfZ2V0S2V5U3RvcmVQYXRoLCBERVZfbGlzdEtleVN0b3JlQXBwcyB9IGZyb20gXCIuL3BlcnNpc3RlbnRMb2NhbFN0b3JhZ2VcIjtcbmltcG9ydCB7IGVsbGlwc2l6ZSB9IGZyb20gXCIuLi9zdHJpbmdzXCI7XG5cbnNldEZsYWcocmVxdWlyZSwgXCJub2RlLWZvcmdlXCIsIFwiYWxsb3djbGllbnRcIiwgdHJ1ZSk7XG5zZXRGbGFnKHJlcXVpcmUsIFwianMtc2hhMjU2XCIsIFwiYWxsb3djbGllbnRcIiwgdHJ1ZSk7XG5cbmNvbnN0IHRpbWVJbkRheSA9IDEwMDAgKiA2MCAqIDYwICogMjQ7XG5cbmV4cG9ydCBjb25zdCBDQV9OT1RfRk9VTkRfRVJST1IgPSBcIjE4YWE3MzE4LWY4OGYtNGQyZC1iNDFmLTNkYWY0YTQzMzgyN1wiO1xuXG5leHBvcnQgY29uc3QgaWRlbnRpdHlTdG9yYWdlS2V5ID0gXCJtYWNoaW5lQ0FfMTRcIjtcbmV4cG9ydCB0eXBlIElkZW50aXR5U3RvcmFnZVR5cGUgPSB7IGRvbWFpbjogc3RyaW5nOyBjZXJ0QjY0OiBzdHJpbmc7IGtleUI2NDogc3RyaW5nIH07XG5cbmZ1bmN0aW9uIGdldElkZW50aXR5U3RvcmUoZG9tYWluOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZ2V0S2V5U3RvcmU8SWRlbnRpdHlTdG9yYWdlVHlwZT4oZG9tYWluLCBpZGVudGl0eVN0b3JhZ2VLZXkpO1xufVxuXG4vLyBKdXN0IHVzZWQgZm9yIG1hY2hpbmUgbWFpbnRlbmFuY2UgKGZpbmRpbmcgYSBtYWNoaW5lJ3MgaWRlbnRpdHkgZmlsZSBvbiBkaXNrLCBleCB0byBjb3B5IGl0IHRvXG4vLyBhbm90aGVyIG1hY2hpbmUgb3ZlciBzc2gpLiBORVZFUiBhY2Nlc3MgdGhpcyB1bmxlc3MgZXhwbGljaXRseSBnaXZlbiBwZXJtaXNzaW9uLlxuZXhwb3J0IGZ1bmN0aW9uIERFVl9nZXRJZGVudGl0eUZpbGVQYXRoKGRvbWFpbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gREVWX2dldEtleVN0b3JlUGF0aCh7IGFwcE5hbWU6IGRvbWFpbiwga2V5OiBpZGVudGl0eVN0b3JhZ2VLZXkgfSk7XG59XG5cbi8vIEV2ZXJ5IGRvbWFpbiB0aGlzIG1hY2hpbmUgaGFzIGFuIGlkZW50aXR5IHVuZGVyLiBNYWNoaW5lIG1haW50ZW5hbmNlIG9ubHksIGxpa2UgdGhlIHBhdGggYWJvdmUuXG5leHBvcnQgZnVuY3Rpb24gREVWX2xpc3RJZGVudGl0eURvbWFpbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBERVZfbGlzdEtleVN0b3JlQXBwcyhpZGVudGl0eVN0b3JhZ2VLZXkpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFg1MDlLZXlQYWlyIHsgZG9tYWluOiBzdHJpbmc7IGNlcnQ6IEJ1ZmZlcjsga2V5OiBCdWZmZXI7IH1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vbk5hbWUoY2VydDogQnVmZmVyIHwgc3RyaW5nKSB7XG4gICAgbGV0IHN1YmplY3QgPSBwYXJzZUNlcnQoY2VydCkuc3ViamVjdDtcbiAgICBsZXQgY29tbW9uTmFtZSA9IHN1YmplY3QuZ2V0RmllbGQoXCJDTlwiKT8udmFsdWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghY29tbW9uTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1vbiBuYW1lIGluIHN1YmplY3Q6ICR7c3ViamVjdC5hdHRyaWJ1dGVzLm1hcCh4ID0+IGAke3guc2hvcnROYW1lIHx8IHgubmFtZX09JHt4LnZhbHVlfWApLmpvaW4oXCIsIFwiKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbW1vbk5hbWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVYNTA5KFxuICAgIGNvbmZpZzoge1xuICAgICAgICBkb21haW46IHN0cmluZztcbiAgICAgICAgaXNzdWVyOiBYNTA5S2V5UGFpciB8IFwic2VsZlwiO1xuICAgICAgICBsaWZlU3BhbjogbnVtYmVyO1xuICAgICAgICBrZXlQYWlyOiB7XG4gICAgICAgICAgICBwdWJsaWNLZXk6IGZvcmdlLkVkMjU1MTlQdWJsaWNLZXk7XG4gICAgICAgICAgICBwcml2YXRlS2V5OiBmb3JnZS5FZDI1NTE5UHJpdmF0ZUtleTtcbiAgICAgICAgfTtcbiAgICB9XG4pOiBYNTA5S2V5UGFpciB7XG4gICAgcmV0dXJuIG1lYXN1cmVCbG9jayhmdW5jdGlvbiBjcmVhdGVYNTA5KCkge1xuICAgICAgICBsZXQgeyBkb21haW4sIGlzc3VlciwgbGlmZVNwYW4sIGtleVBhaXIgfSA9IGNvbmZpZztcblxuICAgICAgICBsZXQgY2VydE9iaiA9IGZvcmdlLnBraS5jcmVhdGVDZXJ0aWZpY2F0ZSgpO1xuICAgICAgICBjZXJ0T2JqLnB1YmxpY0tleSA9IGtleVBhaXIucHVibGljS2V5IGFzIHVua25vd24gYXMgZm9yZ2UucGtpLlB1YmxpY0tleTtcbiAgICAgICAgY2VydE9iai5zZXJpYWxOdW1iZXIgPSBcIjAxXCI7XG4gICAgICAgIC8vIEdpdmUgaXQgNSBtaW51dGVzIGJlZm9yZSBub3cuIElmIHdlIGdpdmUgaXQgdG9vIG11Y2ggdGltZSwgaXQgY2FuIGxvb2sgbGlrZSB0aGUgY2VydCBpcyByZWFsbHkgb2xkLCB3aGljaCB3aWxsIHRyaWdnZXIgdmFyaW91cyBwcm9jZXNzZXMgdG8gdHJ5IHRvIGdldCBhIGZyZXNoZXIgb25lIChhcyBpZiBpdCBsYXN0cyBmb3IgMSBob3VyLCBidXQgd2Ugc2V0IG5vdEJlZm9yZSB0byAxIG1vbnRoIGFnbywgaXQgbG9va3MgMSBtb250aCBvbGQsIGFuZCBzbyBhbG1vc3QgZXhwaXJlZCwgd2hlbiBpdCBpc24ndC4uLilcbiAgICAgICAgY2VydE9iai52YWxpZGl0eS5ub3RCZWZvcmUgPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gMTAwMCAqIDYwICogNSk7XG4gICAgICAgIGNlcnRPYmoudmFsaWRpdHkubm90QWZ0ZXIgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgbGlmZVNwYW4pO1xuXG4gICAgICAgIGNvbnN0IGNvbW1vbk5hbWVBdHRycyA9IFt7IG5hbWU6IFwiY29tbW9uTmFtZVwiLCB2YWx1ZTogZG9tYWluIH1dO1xuICAgICAgICBjZXJ0T2JqLnNldFN1YmplY3QoY29tbW9uTmFtZUF0dHJzKTtcblxuICAgICAgICBpZiAoaXNzdWVyID09PSBcInNlbGZcIikge1xuICAgICAgICAgICAgY2VydE9iai5zZXRJc3N1ZXIoY29tbW9uTmFtZUF0dHJzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNlcnRPYmouc2V0SXNzdWVyKGZvcmdlLnBraS5jZXJ0aWZpY2F0ZUZyb21QZW0oaXNzdWVyLmNlcnQudG9TdHJpbmcoKSkuc3ViamVjdC5hdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBleHRlbnNpb25zID0gW107XG4gICAgICAgIGNvbnN0IGlzQ0EgPSBpc3N1ZXIgPT09IFwic2VsZlwiO1xuICAgICAgICBpZiAoaXNDQSkge1xuICAgICAgICAgICAgZXh0ZW5zaW9ucy5wdXNoKHsgbmFtZTogXCJiYXNpY0NvbnN0cmFpbnRzXCIsIGNBOiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsSG9zdERvbWFpbiA9IFwiMTI3LTAtMC0xLlwiICsgZG9tYWluLnNwbGl0KFwiLlwiKS5zbGljZSgtMikuam9pbihcIi5cIik7XG5cbiAgICAgICAgZXh0ZW5zaW9ucy5wdXNoKC4uLltcbiAgICAgICAgICAgIHsgbmFtZTogXCJrZXlVc2FnZVwiLCBrZXlDZXJ0U2lnbjogaXNDQSwgZGlnaXRhbFNpZ25hdHVyZTogdHJ1ZSwgbm9uUmVwdWRpYXRpb246IHRydWUsIGtleUVuY2lwaGVybWVudDogdHJ1ZSwgZGF0YUVuY2lwaGVybWVudDogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiBcInN1YmplY3RLZXlJZGVudGlmaWVyXCIgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcInN1YmplY3RBbHROYW1lXCIsXG4gICAgICAgICAgICAgICAgYWx0TmFtZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAyLCB2YWx1ZTogZG9tYWluIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgdHlwZTogMiwgdmFsdWU6IFwiKi5cIiArIGRvbWFpbiB9LFxuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6IDIsIHZhbHVlOiBsb2NhbEhvc3REb21haW4gfSxcbiAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogTm8gbG9uZ2VyIGFsbG93IDEyNy4wLjAuMSAoeyB0eXBlOiA3LCBpcDogXCIxMjcuMC4wLjFcIiB9KSwgdG8gbWFrZSB0aGlzIG1vcmUgc2VjdXJlLiBXZSBtaWdodCBlbmFibGUgdGhpcyBiZWhhdmlvciBiZWhpbmQgYSBmbGFnLCBmb3IgZGV2ZWxvcG1lbnQuXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIE5PVEU6IG5hbWVDb25zdHJhaW50cyByZXF1aXJlIG91ciBmb3JrZWQgbm9kZS1mb3JnZSAoXCJub2RlLWZvcmdlXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL3NsaWZ0aXN0L2ZvcmdlI2U2MTgxODFiNDY5YjA3YmRjNzBiOTY4YjAzOTFiZWI4ZWY1ZmVjZDZcIikuIENocm9tZSBpZ25vcmVzIHRoZW0gKGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTEwNzIwODMpLCBidXQgb3VyIG93biB2YWxpZGF0aW9uICh2YWxpZGF0ZUNBQ2VydC92YWxpZGF0ZUNlcnRpZmljYXRlKSBlbmZvcmNlcyB0aGVtLlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwibmFtZUNvbnN0cmFpbnRzXCIsXG4gICAgICAgICAgICAgICAgcGVybWl0dGVkU3VidHJlZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAyLCB2YWx1ZTogZm9yZ2UudXRpbC5lbmNvZGVVdGY4KGRvbWFpbikgfSxcbiAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAyLCB2YWx1ZTogZm9yZ2UudXRpbC5lbmNvZGVVdGY4KGxvY2FsSG9zdERvbWFpbikgfSxcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgY2VydE9iai5zZXRFeHRlbnNpb25zKGV4dGVuc2lvbnMpO1xuXG5cbiAgICAgICAgbWVhc3VyZUJsb2NrKGZ1bmN0aW9uIHNpZ24oKSB7XG4gICAgICAgICAgICBpZiAoaXNzdWVyID09PSBcInNlbGZcIikge1xuICAgICAgICAgICAgICAgIGNlcnRPYmouc2lnbihrZXlQYWlyLnByaXZhdGVLZXkgYXMgYW55KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2VydE9iai5zaWduKGZvcmdlLmVkMjU1MTkucHJpdmF0ZUtleUZyb21QZW0oaXNzdWVyLmtleS50b1N0cmluZygpKSBhcyBhbnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbWVhc3VyZUJsb2NrKGZ1bmN0aW9uIHRvUGVtcygpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZG9tYWluLFxuICAgICAgICAgICAgICAgIGNlcnQ6IEJ1ZmZlci5mcm9tKGZvcmdlLnBraS5jZXJ0aWZpY2F0ZVRvUGVtKGNlcnRPYmopKSxcbiAgICAgICAgICAgICAgICBrZXk6IEJ1ZmZlci5mcm9tKHByaXZhdGVLZXlUb1BlbShrZXlQYWlyLnByaXZhdGVLZXkpKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVLZXlUb1BlbShrZXk6IGZvcmdlLkVkMjU1MTlQcml2YXRlS2V5KSB7XG4gICAgcmV0dXJuIGZvcmdlLmVkMjU1MTkucHJpdmF0ZUtleVRvUGVtKGtleSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDZXJ0KFBFTW9yREVSOiBzdHJpbmcgfCBCdWZmZXIpIHtcbiAgICByZXR1cm4gZm9yZ2UucGtpLmNlcnRpZmljYXRlRnJvbVBlbShub3JtYWxpemVDZXJ0VG9QRU0oUEVNb3JERVIpKTtcbn1cblxuZnVuY3Rpb24gZ2V0RUQyNTUxOVB1YmxpY0tleShjZXJ0UGFyc2VkOiBmb3JnZS5wa2kuQ2VydGlmaWNhdGUpOiBmb3JnZS5FZDI1NTE5UHVibGljS2V5IHtcbiAgICBsZXQgcHVibGljS2V5ID0gY2VydFBhcnNlZC5wdWJsaWNLZXk7XG4gICAgaWYgKCEoXCJwdWJsaWNLZXlCeXRlc1wiIGluIHB1YmxpY0tleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPbmx5IEVEMjU1MTkgY2VydGlmaWNhdGVzIGFyZSBzdXBwb3J0ZWQsIHRoZSBjZXJ0aWZpY2F0ZSBwdWJsaWMga2V5IGlzIG5vdCBFRDI1NTE5IChzdWJqZWN0OiAke2NlcnRQYXJzZWQuc3ViamVjdC5nZXRGaWVsZChcIkNOXCIpPy52YWx1ZX0pYCk7XG4gICAgfVxuICAgIHJldHVybiBwdWJsaWNLZXkgYXMgdW5rbm93biBhcyBmb3JnZS5FZDI1NTE5UHVibGljS2V5O1xufVxuXG4vLyBHZXRzIGEgdW5pcXVlIHZhbHVlIHRvIHJlcHJlc2VudCB0aGUgcHVibGljIGtleVxuZXhwb3J0IGZ1bmN0aW9uIGdldFB1YmxpY0lkZW50aWZpZXIoUEVNb3JERVI6IHN0cmluZyB8IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGdldEVEMjU1MTlQdWJsaWNLZXkocGFyc2VDZXJ0KFBFTW9yREVSKSkucHVibGljS2V5Qnl0ZXMpO1xufVxuXG5leHBvcnQgY29uc3Qgc2lnbiA9IG1lYXN1cmVXcmFwKGZ1bmN0aW9uIHNpZ24oa2V5UGFpcjogeyBrZXk6IHN0cmluZyB8IEJ1ZmZlciB9LCBkYXRhOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICBsZXQgZGF0YVN0ciA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgIGxldCBwcml2YXRlS2V5ID0gZm9yZ2UuZWQyNTUxOS5wcml2YXRlS2V5RnJvbVBlbShrZXlQYWlyLmtleS50b1N0cmluZygpKTtcbiAgICByZXR1cm4gcHJpdmF0ZUtleS5zaWduKGRhdGFTdHIpO1xufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnkoY2VydDogc3RyaW5nLCBzaWduYXR1cmU6IHN0cmluZywgZGF0YTogdW5rbm93bikge1xuICAgIGxldCBjZXJ0T2JqID0gcGFyc2VDZXJ0KGNlcnQpO1xuICAgIGxldCBwdWJsaWNLZXkgPSBnZXRFRDI1NTE5UHVibGljS2V5KGNlcnRPYmopO1xuICAgIGxldCBkYXRhU3RyID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgaWYgKCFwdWJsaWNLZXkudmVyaWZ5KGRhdGFTdHIsIHNpZ25hdHVyZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZhaWxlZC4gU2lnbmF0dXJlOiAke0pTT04uc3RyaW5naWZ5KHNpZ25hdHVyZSl9IHwgRGF0YTogJHtlbGxpcHNpemUoZGF0YVN0ciwgMTAyNCl9YCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVDZXJ0VG9QRU0oUEVNb3JERVI6IHN0cmluZyB8IEJ1ZmZlcik6IHN0cmluZyB7XG4gICAgaWYgKFBFTW9yREVSLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChcIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVwiKSkge1xuICAgICAgICByZXR1cm4gUEVNb3JERVIudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgUEVNb3JERVIgPSBQRU1vckRFUi50b1N0cmluZyhcImJhc2U2NFwiKTtcbiAgICByZXR1cm4gXCItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cXG5cIiArIFBFTW9yREVSICsgXCJcXG4tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXCI7XG59XG5cbi8vIEJhc2UzMiAoUkZDIDQ2NDgsIGxvd2VyY2FzZSwgdW5wYWRkZWQpLCBhcyBkb21haW4gbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUsIHdoaWNoIHJ1bGVzIG91dCBiYXNlNjQvaGV4LXdpdGgtY2FzZVxuY29uc3QgYmFzZTMyQWxwaGFiZXQgPSBcImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MjM0NTY3XCI7XG5mdW5jdGlvbiBlbmNvZGVCYXNlMzIoYnl0ZXM6IEJ1ZmZlcik6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgbGV0IGJpdENvdW50ID0gMDtcbiAgICBsZXQgdmFsdWUgPSAwO1xuICAgIGZvciAobGV0IGJ5dGUgb2YgYnl0ZXMpIHtcbiAgICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCBieXRlO1xuICAgICAgICBiaXRDb3VudCArPSA4O1xuICAgICAgICB3aGlsZSAoYml0Q291bnQgPj0gNSkge1xuICAgICAgICAgICAgcmVzdWx0ICs9IGJhc2UzMkFscGhhYmV0Wyh2YWx1ZSA+Pj4gKGJpdENvdW50IC0gNSkpICYgMzFdO1xuICAgICAgICAgICAgYml0Q291bnQgLT0gNTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYml0Q291bnQgPiAwKSB7XG4gICAgICAgIHJlc3VsdCArPSBiYXNlMzJBbHBoYWJldFsodmFsdWUgPDwgKDUgLSBiaXRDb3VudCkpICYgMzFdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBnZXREb21haW5QYXJ0RnJvbVB1YmxpY0tleShwdWJsaWNLZXk6IHsgcHVibGljS2V5Qnl0ZXM6IEJ1ZmZlciB9IHwgQnVmZmVyKSB7XG4gICAgbGV0IGJ5dGVzOiBCdWZmZXI7XG4gICAgaWYgKFwicHVibGljS2V5Qnl0ZXNcIiBpbiBwdWJsaWNLZXkpIHtcbiAgICAgICAgYnl0ZXMgPSBwdWJsaWNLZXkucHVibGljS2V5Qnl0ZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYnl0ZXMgPSBwdWJsaWNLZXk7XG4gICAgfVxuICAgIHJldHVybiBcImJcIiArIGVuY29kZUJhc2UzMihCdWZmZXIuZnJvbShzaGEyNjUuc2hhMjU2LmFycmF5KEJ1ZmZlci5mcm9tKGJ5dGVzKSkpKS5zbGljZSgwLCAyMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNBQ2VydChkb21haW46IHN0cmluZywgY2VydDogc3RyaW5nIHwgQnVmZmVyKSB7XG4gICAgbGV0IGNlcnRQYXJzZWQgPSBwYXJzZUNlcnQoY2VydCk7XG5cbiAgICBsZXQgc3ViamVjdCA9IGNlcnRQYXJzZWQuc3ViamVjdC5nZXRGaWVsZChcIkNOXCIpLnZhbHVlIGFzIHN0cmluZztcbiAgICBsZXQgbG9jYWxob3N0RG9tYWluID0gXCIxMjctMC0wLTEuXCIgKyBzdWJqZWN0LnNwbGl0KFwiLlwiKS5zbGljZSgtMikuam9pbihcIi5cIik7XG5cbiAgICBsZXQgZG9tYWluUGFydHMgPSBzdWJqZWN0LnNwbGl0KFwiLlwiKS5yZXZlcnNlKCk7XG5cbiAgICBsZXQgcm9vdERvbWFpblBhcnNlZCA9IFtkb21haW5QYXJ0cy5zaGlmdCgpLCBkb21haW5QYXJ0cy5zaGlmdCgpXS5yZXZlcnNlKCkuam9pbihcIi5cIik7XG4gICAgaWYgKHJvb3REb21haW5QYXJzZWQgIT09IGRvbWFpbikge1xuICAgICAgICAvLyBUaGlzIGlzIGltcG9ydGFudCwgYXMgb3VyIHRydXN0IHN0b3JlIGNvbnRhaW5zIG1vcmUgdGhlbiBqdXN0IE9VUiBjZXJ0aWZpY2F0ZXMsIHNvIGlmIHdlIGFsbG93IGFueSBkb21haW5zIHRoZW4gcmVhbCBkb21haW5zIGNhbiBpbXBlcnNvbmF0ZSBhbnlvbmUhIEl0IGhhcyB0byBiZSBPVVIgZG9tYWluIHRvIGJlIHRydXN0ZWQhXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2VydGlmaWNhdGUgcm9vdCBkb21haW4gc2hvdWxkIGJlICR7ZG9tYWlufSwgYnV0IGlzICR7cm9vdERvbWFpblBhcnNlZH1gKTtcbiAgICB9XG4gICAgLy8gVE9ETzogTWF5YmUganVzdCBza2lwIGlmIGl0IGlzbid0IGEgaGFzaCBzdHJpbmc/XG4gICAgaWYgKGRvbWFpblBhcnRzWzBdID09PSBcIm5vcHJveHlcIikge1xuICAgICAgICBkb21haW5QYXJ0cy5zaGlmdCgpO1xuICAgIH1cblxuICAgIGxldCBjZXJ0RXhwZWN0ZWRQdWJsaWNLZXlQYXJ0ID0gKGRvbWFpblBhcnRzLnNoaWZ0KCkgfHwgXCJcIikuc3BsaXQoXCItXCIpLnNsaWNlKC0xKVswXTtcbiAgICBsZXQgY2VydEFjdHVhbFB1YmxpY0tleVBhcnQgPSBnZXREb21haW5QYXJ0RnJvbVB1YmxpY0tleShnZXRFRDI1NTE5UHVibGljS2V5KGNlcnRQYXJzZWQpKTtcbiAgICBpZiAoY2VydEV4cGVjdGVkUHVibGljS2V5UGFydCAhPT0gY2VydEFjdHVhbFB1YmxpY0tleVBhcnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDZXJ0aWZpY2F0ZSBwdWJsaWMga2V5IGluIHRoZSB1cmwgaXMgJHtjZXJ0RXhwZWN0ZWRQdWJsaWNLZXlQYXJ0fSwgYnV0IGluIHRoZSBjZXJ0IGlzICR7Y2VydEFjdHVhbFB1YmxpY0tleVBhcnR9YCk7XG4gICAgfVxuXG4gICAgLy8gQUxTTywgcmVxdWlyZSBuYW1lIGNvbnN0cmFpbnRzIHRvIGJlIHByZXNlbnQsIGFuZCB0byByZXN0cmljdCB0byB0aGUgXCJDTlwiXG4gICAgbGV0IG5hbWVDb25zdHJhaW50cyA9IGNlcnRQYXJzZWQuZ2V0RXh0ZW5zaW9uKFwibmFtZUNvbnN0cmFpbnRzXCIpIGFzIGFueTtcbiAgICBpZiAoIW5hbWVDb25zdHJhaW50cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENlcnRpZmljYXRlIG11c3QgaGF2ZSBuYW1lQ29uc3RyYWludHNgKTtcbiAgICB9XG4gICAgbGV0IHN1YnRyZWVzID0gbmFtZUNvbnN0cmFpbnRzLnBlcm1pdHRlZFN1YnRyZWVzO1xuICAgIGlmICghc3VidHJlZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDZXJ0aWZpY2F0ZSBtdXN0IGhhdmUgbmFtZUNvbnN0cmFpbnRzLnBlcm1pdHRlZFN1YnRyZWVzYCk7XG4gICAgfVxuICAgIGxldCBzdWJ0cmVlVmFsdWVzID0gc3VidHJlZXMubWFwKCh4OiBhbnkpID0+IHgudmFsdWUpO1xuICAgIC8vIElnbm9yZSBsb2NhbGhvc3REb21haW4sIGFzIGl0IGNhbiBhbHdheXMgc2FmZWx5IGJlIGFsbG93ZWQgKHRoZSBzYW1lIG1hY2hpbmUgaXMgYWx3YXlzIGFsbG93ZWQpLlxuICAgIHN1YnRyZWVWYWx1ZXMgPSBzdWJ0cmVlVmFsdWVzLmZpbHRlcigoeDogc3RyaW5nKSA9PiB4ICE9PSBsb2NhbGhvc3REb21haW4pO1xuICAgIGlmIChzdWJ0cmVlVmFsdWVzLmxlbmd0aCAhPT0gMSB8fCBzdWJ0cmVlVmFsdWVzWzBdICE9PSBzdWJqZWN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2VydGlmaWNhdGUgbXVzdCBoYXZlIGEgc2luZ2xlIGNvbnN0cmFpbmVkIGRvbWFpbiAoaGFkICR7SlNPTi5zdHJpbmdpZnkoc3VidHJlZVZhbHVlcyl9KWApO1xuICAgIH1cblxuICAgIHZhbGlkYXRlQWx0TmFtZXMoY2VydFBhcnNlZCwgc3ViamVjdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNlcnRpZmljYXRlKGRvbWFpbjogc3RyaW5nLCBjZXJ0OiBCdWZmZXIgfCBzdHJpbmcsIGlzc3VlckNlcnQ6IEJ1ZmZlciB8IHN0cmluZykge1xuICAgIHZhbGlkYXRlQ0FDZXJ0KGRvbWFpbiwgaXNzdWVyQ2VydCk7XG5cbiAgICBsZXQgY2VydFBhcnNlZCA9IHBhcnNlQ2VydChjZXJ0KTtcbiAgICBsZXQgc3ViamVjdCA9IGNlcnRQYXJzZWQuc3ViamVjdC5nZXRGaWVsZChcIkNOXCIpLnZhbHVlIGFzIHN0cmluZztcbiAgICBsZXQgbG9jYWxob3N0RG9tYWluID0gXCIxMjctMC0wLTEuXCIgKyBzdWJqZWN0LnNwbGl0KFwiLlwiKS5zbGljZSgtMikuam9pbihcIi5cIik7XG5cbiAgICBsZXQgZG9tYWluUGFydHMgPSBzdWJqZWN0LnNwbGl0KFwiLlwiKS5yZXZlcnNlKCk7XG5cbiAgICBsZXQgcm9vdERvbWFpblBhcnNlZCA9IFtkb21haW5QYXJ0cy5zaGlmdCgpLCBkb21haW5QYXJ0cy5zaGlmdCgpXS5yZXZlcnNlKCkuam9pbihcIi5cIik7XG4gICAgaWYgKHJvb3REb21haW5QYXJzZWQgIT09IGRvbWFpbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENlcnRpZmljYXRlIHJvb3QgZG9tYWluIHNob3VsZCBiZSAke2RvbWFpbn0sIGJ1dCBpcyAke3Jvb3REb21haW5QYXJzZWR9YCk7XG4gICAgfVxuICAgIC8vIFRPRE86IE1heWJlIGp1c3Qgc2tpcCBpZiBpdCBpc24ndCBhIGhhc2ggc3RyaW5nP1xuICAgIGlmIChkb21haW5QYXJ0c1swXSA9PT0gXCJub3Byb3h5XCIpIHtcbiAgICAgICAgZG9tYWluUGFydHMuc2hpZnQoKTtcbiAgICB9XG5cbiAgICBsZXQgaXNzdWVyQ2VydFBhcnNlZCA9IHBhcnNlQ2VydChpc3N1ZXJDZXJ0KTtcblxuICAgIGxldCBpc3N1ZXJFeHBlY3RlZFB1YmxpY0tleVBhcnQgPSBkb21haW5QYXJ0cy5zaGlmdCgpIHx8IFwiXCI7XG4gICAgbGV0IGlzc3VlckFjdHVhbFB1YmxpY0tleVBhcnQgPSBnZXREb21haW5QYXJ0RnJvbVB1YmxpY0tleShnZXRFRDI1NTE5UHVibGljS2V5KGlzc3VlckNlcnRQYXJzZWQpKTtcbiAgICBpZiAoaXNzdWVyRXhwZWN0ZWRQdWJsaWNLZXlQYXJ0ICE9PSBpc3N1ZXJBY3R1YWxQdWJsaWNLZXlQYXJ0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSXNzdWVyIHB1YmxpYyBrZXkgaW4gdGhlIHVybCBpcyAke2lzc3VlckV4cGVjdGVkUHVibGljS2V5UGFydH0sIGJ1dCBpbiB0aGUgY2VydCBpcyAke2lzc3VlckFjdHVhbFB1YmxpY0tleVBhcnR9YCk7XG4gICAgfVxuXG4gICAgLy8gVGFrZSB0aGUgbGFzdCBwYXJ0XG4gICAgbGV0IGNlcnRFeHBlY3RlZFB1YmxpY0tleVBhcnQgPSBkb21haW5QYXJ0cy5zaGlmdCgpIHx8IFwiXCI7XG4gICAgbGV0IGNlcnRBY3R1YWxQdWJsaWNLZXlQYXJ0ID0gZ2V0RG9tYWluUGFydEZyb21QdWJsaWNLZXkoZ2V0RUQyNTUxOVB1YmxpY0tleShjZXJ0UGFyc2VkKSk7XG4gICAgaWYgKGNlcnRFeHBlY3RlZFB1YmxpY0tleVBhcnQgIT09IGNlcnRBY3R1YWxQdWJsaWNLZXlQYXJ0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2VydGlmaWNhdGUgcHVibGljIGtleSBpbiB0aGUgdXJsIGlzICR7Y2VydEV4cGVjdGVkUHVibGljS2V5UGFydH0sIGJ1dCBpbiB0aGUgY2VydCBpcyAke2NlcnRBY3R1YWxQdWJsaWNLZXlQYXJ0fWApO1xuICAgIH1cblxuXG4gICAgbGV0IG5hbWVDb25zdHJhaW50cyA9IGlzc3VlckNlcnRQYXJzZWQuZ2V0RXh0ZW5zaW9uKFwibmFtZUNvbnN0cmFpbnRzXCIpIGFzIGFueTtcbiAgICBpZiAoIW5hbWVDb25zdHJhaW50cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENBIG11c3QgaGF2ZSBuYW1lQ29uc3RyYWludHNgKTtcbiAgICB9XG4gICAgbGV0IHN1YnRyZWVzID0gbmFtZUNvbnN0cmFpbnRzLnBlcm1pdHRlZFN1YnRyZWVzO1xuICAgIGlmICghc3VidHJlZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDQSBtdXN0IGhhdmUgbmFtZUNvbnN0cmFpbnRzLnBlcm1pdHRlZFN1YnRyZWVzYCk7XG4gICAgfVxuICAgIGxldCBzdWJ0cmVlVmFsdWVzID0gc3VidHJlZXMubWFwKCh4OiBhbnkpID0+IHgudmFsdWUpO1xuICAgIC8vIElnbm9yZSBsb2NhbGhvc3REb21haW4sIGFzIGl0IGNhbiBhbHdheXMgc2FmZWx5IGJlIGFsbG93ZWQgKHRoZSBzYW1lIG1hY2hpbmUgaXMgYWx3YXlzIGFsbG93ZWQpLlxuICAgIHN1YnRyZWVWYWx1ZXMgPSBzdWJ0cmVlVmFsdWVzLmZpbHRlcigoeDogc3RyaW5nKSA9PiB4ICE9PSBsb2NhbGhvc3REb21haW4pO1xuICAgIGlmIChzdWJ0cmVlVmFsdWVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENBIG11c3QgaGF2ZSBhIHNpbmdsZSBjb25zdHJhaW5lZCBkb21haW4gKGhhZCAke0pTT04uc3RyaW5naWZ5KHN1YnRyZWVWYWx1ZXMpfSlgKTtcbiAgICB9XG5cbiAgICBsZXQgc3VidHJlZSA9IHN1YnRyZWVWYWx1ZXNbMF07XG4gICAgaWYgKHN1YnRyZWUgIT09IHN1YmplY3QgJiYgIXN1YmplY3QuZW5kc1dpdGgoXCIuXCIgKyBzdWJ0cmVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENlcnRpZmljYXRlIG11c3QgYmUgYSBzdWJ0cmVlIG9mIHRoZSBDQSAoQ0E6ICR7c3VidHJlZX0sIGNlcnQ6ICR7c3ViamVjdH0pYCk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVBbHROYW1lcyhjZXJ0UGFyc2VkLCBzdWJqZWN0KTtcblxuICAgIC8vIFZlcmlmeSBpc3N1ZXIgQUNUVUFMTFkgc2lnbmVkIGNlcnRQYXJzZWRcbiAgICBpZiAoIWlzc3VlckNlcnRQYXJzZWQudmVyaWZ5KGNlcnRQYXJzZWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSXNzdWVyIGRpZCBub3Qgc2lnbiBjZXJ0aWZpY2F0ZWApO1xuICAgIH1cbn1cblxuLy8gUmVxdWlyZSBhbHQgbmFtZXMgdG8gYmUgZWl0aGVyIGVxdWFsIHRvIFwiQ05cIiwgb3IgYSBzdWJ0cmVlIG9mIFwiQ05cIlxuZnVuY3Rpb24gdmFsaWRhdGVBbHROYW1lcyhjZXJ0UGFyc2VkOiBmb3JnZS5wa2kuQ2VydGlmaWNhdGUsIHN1YmplY3Q6IHN0cmluZykge1xuICAgIGxldCBsb2NhbGhvc3REb21haW4gPSBcIjEyNy0wLTAtMS5cIiArIHN1YmplY3Quc3BsaXQoXCIuXCIpLnNsaWNlKC0yKS5qb2luKFwiLlwiKTtcblxuICAgIGxldCBhbHROYW1lc09iaiA9IGNlcnRQYXJzZWQuZ2V0RXh0ZW5zaW9uKFwic3ViamVjdEFsdE5hbWVcIikgYXMgYW55O1xuICAgIGxldCBhbHROYW1lcyA9IGFsdE5hbWVzT2JqPy5hbHROYW1lcy5tYXAoKHg6IGFueSkgPT4geC52YWx1ZSk7XG4gICAgLy8gQWxsb3cgbG9jYWxob3N0RG9tYWluLCBhcyBpdCBjYW4gYWx3YXlzIHNhZmVseSBiZSBhbGxvd2VkXG4gICAgYWx0TmFtZXMgPSBhbHROYW1lcy5maWx0ZXIoKHg6IHN0cmluZykgPT4geCAhPT0gbG9jYWxob3N0RG9tYWluKTtcbiAgICBpZiAoXG4gICAgICAgIGFsdE5hbWVzLnNvbWUoKHg6IHN0cmluZykgPT5cbiAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgeCA9PT0gc3ViamVjdFxuICAgICAgICAgICAgICAgIHx8IHguZW5kc1dpdGgoXCIuXCIgKyBzdWJqZWN0KVxuICAgICAgICAgICAgICAgIC8vIE5PVEU6IFdlIGRvbid0IGFsbG93IDEyNy4wLjAuMSAofHwgeCA9PT0gQnVmZmVyLmZyb20oWzEyNywgMCwgMCwgMV0pLnRvU3RyaW5nKCkpLCBiZWNhdXNlIGl0IGlzIHNvIGVhc3kgdG8gcHVibGlzaCBhIDEyNy4wLjAuMSBBIHJlY29yZCwgYW5kIGV2ZW4gdG8gZ2VuZXJhdGUgYSByZWFsIGNlcnQsIHNvIHdlIHNob3VsZCBqdXN0IGRvIHRoYXQsIGFuZCBrZWVwIGl0IHNlY3VyZS4gSWYgd2UgbmVlZCB0aGlzIGZvciBkZXZlbG9wbWVudCB3ZSBjYW4gcHV0IGl0IGJlaGluZCBhIGZsYWcsIHNvIG5vbi1kZXZlbG9wbWVudCBpbnN0YW5jZXMgYXJlIHN0aWxsIHNlY3VyZS5cbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYWx0IG5hbWVzLiBNdXN0IGJlIHN1YnRyZWVzIG9mIHRoZSBzdWJqZWN0IChDTikgJHtKU09OLnN0cmluZ2lmeShzdWJqZWN0KX0sIHdhcyAke0pTT04uc3RyaW5naWZ5KGFsdE5hbWVzKX1gKTtcbiAgICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlS2V5UGFpcigpIHtcbiAgICByZXR1cm4gbWVhc3VyZUJsb2NrKGZ1bmN0aW9uIGdlbmVyYXRlS2V5UGFpcigpIHtcbiAgICAgICAgLy8gTk9URTogV2UgdXNlIEVEMjU1MTkgYmVjYXVzZSBpdCBjYW4gZ2VuZXJhdGUga2V5cyBhYm91dCAxMFggZmFzdGVyIHRoYW4gUlNBICh3aGljaCBpcyBzdGlsbCBzbG93LCB+Nm1zIG9uIG15IG1hY2hpbmUsIHNvIHdlIERFRklOSVRFTFkgZG9uJ3Qgd2FudCBpdCB0byBiZSAxMFggc2xvd2VyISkgLSBodHRwczovL3NlY3VyaXR5LnN0YWNrZXhjaGFuZ2UuY29tL2EvMjM2OTQzLzI4MjM2N1xuICAgICAgICByZXR1cm4gZm9yZ2UuZWQyNTUxOS5nZW5lcmF0ZUtleVBhaXIoKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQ0EoZG9tYWluOiBzdHJpbmcpIHtcbiAgICBjb25zdCBrZXlQYWlyID0gZ2VuZXJhdGVLZXlQYWlyKCk7XG4gICAgbGV0IGNhUHVibGljS2V5UGFydCA9IGdldERvbWFpblBhcnRGcm9tUHVibGljS2V5KGtleVBhaXIucHVibGljS2V5KTtcbiAgICBsZXQgZnVsbERvbWFpbiA9IGAke2NhUHVibGljS2V5UGFydH0uJHtkb21haW59YDtcbiAgICByZXR1cm4gY3JlYXRlWDUwOSh7IGRvbWFpbjogZnVsbERvbWFpbiwgaXNzdWVyOiBcInNlbGZcIiwga2V5UGFpciwgbGlmZVNwYW46IHRpbWVJbkRheSAqIDM2NSAqIDIwIH0pO1xufVxuXG5sZXQgaWRlbnRpdHlDQSA9IGNhY2hlKChkb21haW46IHN0cmluZykgPT4gbGF6eSgoKTogWDUwOUtleVBhaXIgPT4ge1xuICAgIGxldCBpZGVudGl0eUNBQ2FjaGVkID0gZ2V0SWRlbnRpdHlTdG9yZShkb21haW4pO1xuICAgIGxldCBjYUNhY2hlZCA9IGlkZW50aXR5Q0FDYWNoZWQuZ2V0KCk7XG4gICAgaWYgKCFjYUNhY2hlZCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgR2VuZXJhdGluZyBuZXcgaWRlbnRpdHkgQ0FgKTtcbiAgICAgICAgbGV0IHZhbHVlID0gZ2VuZXJhdGVDQShkb21haW4pO1xuICAgICAgICBjYUNhY2hlZCA9IHtcbiAgICAgICAgICAgIGRvbWFpbjogdmFsdWUuZG9tYWluLFxuICAgICAgICAgICAgY2VydEI2NDogdmFsdWUuY2VydC50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICAgICAgICAgIGtleUI2NDogdmFsdWUua2V5LnRvU3RyaW5nKFwiYmFzZTY0XCIpLFxuICAgICAgICB9O1xuICAgICAgICBpZGVudGl0eUNBQ2FjaGVkLnNldChjYUNhY2hlZCk7XG4gICAgfVxuICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgIGRvbWFpbjogY2FDYWNoZWQuZG9tYWluLFxuICAgICAgICBjZXJ0OiBCdWZmZXIuZnJvbShjYUNhY2hlZC5jZXJ0QjY0LCBcImJhc2U2NFwiKSxcbiAgICAgICAga2V5OiBCdWZmZXIuZnJvbShjYUNhY2hlZC5rZXlCNjQsIFwiYmFzZTY0XCIpLFxuICAgIH07XG4gICAgdHJ1c3RDZXJ0aWZpY2F0ZShyZXN1bHQuY2VydC50b1N0cmluZygpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufSkpO1xuXG4vLyBJTVBPUlRBTlQhIFdlIGRvIG5vdCBlbWJlZCBhbnkgZGVidWcgaW5mbyBpbiB0aGlzIGRvbWFpbi4gSWYgd2UgZGlkLCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dC4uLiBwb3RlbnRhbGx5IGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSwgYXMgaWYgdGhlIGRlYnVnIGluZm8gKHN1Y2ggYXMgYSBwcmVmaXgpIGlzIHVzZWQgdG8gaWRlbnRpZnkgd2hhdCBhIGNlcnRpZmljYXRlIGlzIGZvciwgaXQgd291bGQgYmUgZWFzeSBmb3IgYW4gYXR0YWNrIHRvIGZvcmdlIHRoaXMgKGFzIHRoZSBkZWJ1ZyBpbmZvIHdvbid0IGJlIHNlY3VyZWQpLiBTbyBpdCBpcyBtdWNoIGJldHRlciB0byBrZWVwIHRoZSBjZXJ0aWZpY2F0ZSBvcGFxdWUsIGFuZCB0aGVuIHJlcXVpcmUgYW55IG1ldGFkYXRhIHRvIGJlIGFjdHVhbGx5IHZldHRlZCAoYW5kIGhvcGVmdWxseSBzdG9yZWQgaW4gYSBVSSwgc2hvd2luZyBJUCwgdGltZSwgZXRjKS5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDZXJ0RnJvbUNBKGNvbmZpZzoge1xuICAgIENBS2V5UGFpcjogWDUwOUtleVBhaXI7XG59KTogWDUwOUtleVBhaXIge1xuICAgIHJldHVybiBtZWFzdXJlQmxvY2soZnVuY3Rpb24gY3JlYXRlQ2VydEZyb21DQSgpIHtcbiAgICAgICAgbGV0IHsgQ0FLZXlQYWlyIH0gPSBjb25maWc7XG4gICAgICAgIGNvbnN0IGtleVBhaXIgPSBnZW5lcmF0ZUtleVBhaXIoKTtcbiAgICAgICAgbGV0IGRvbWFpbktleVBhcnQgPSBnZXREb21haW5QYXJ0RnJvbVB1YmxpY0tleShrZXlQYWlyLnB1YmxpY0tleSk7XG4gICAgICAgIGxldCBmdWxsRG9tYWluID0gYCR7ZG9tYWluS2V5UGFydH0uJHtjb25maWcuQ0FLZXlQYWlyLmRvbWFpbn1gO1xuICAgICAgICByZXR1cm4gY3JlYXRlWDUwOSh7XG4gICAgICAgICAgICBkb21haW46IGZ1bGxEb21haW4sXG4gICAgICAgICAgICBpc3N1ZXI6IENBS2V5UGFpcixcbiAgICAgICAgICAgIGtleVBhaXIsXG4gICAgICAgICAgICBsaWZlU3BhbjogdGltZUluRGF5ICogMzY1ICogMTAsXG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFjaGluZUlkKGRvbWFpbk5hbWVPck5vZGVJZDogc3RyaW5nLCBkb21haW46IHN0cmluZykge1xuICAgIHJldHVybiBkZWNvZGVOb2RlSWRBc3NlcnQoZG9tYWluTmFtZU9yTm9kZUlkLCBkb21haW4sIFwiYWxsb3dNaXNzaW5nVGhyZWFkSWRcIikubWFjaGluZUlkO1xufVxuXG5leHBvcnQgdHlwZSBOb2RlSWRQYXJ0cyA9IHtcbiAgICB0aHJlYWRJZDogc3RyaW5nO1xuICAgIG1hY2hpbmVJZDogc3RyaW5nO1xuICAgIGRvbWFpbjogc3RyaW5nO1xuICAgIHBvcnQ6IG51bWJlcjtcbn07XG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlTm9kZUlkKG5vZGVJZDogc3RyaW5nLCBkb21haW46IHN0cmluZywgYWxsb3dNaXNzaW5nVGhyZWFkSWQ/OiBcImFsbG93TWlzc2luZ1RocmVhZElkXCIpOiBOb2RlSWRQYXJ0cyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGxvY2F0aW9uT2JqID0gZ2V0Tm9kZUlkTG9jYXRpb24obm9kZUlkKTtcbiAgICBpZiAoIWxvY2F0aW9uT2JqKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGxldCBwYXJ0cyA9IGxvY2F0aW9uT2JqLmFkZHJlc3Muc3BsaXQoXCIuXCIpO1xuICAgIC8vIE5PVEU6IFdlIGhhdmUgdG8gb25seSBhbGxvdyBsb2NhbGhvc3QgZG9tYWlucyBvbiBvdXIgb3duIGRvbWFpbiwgYXMgdGhlIHVuZGVybHlpbmcgZG9tYWluIGdldHMgc3RyaXBwZWQgd2hlbiB3ZSdyZSBsb29raW5nIGF0IHRoZSBtYWNoaW5lSWQuIFNvIGlmIHdlIGFsbG93ZWQgbG9jYWxob3N0IGRvbWFpbnMgb24gb3RoZXIgZG9tYWlucywgYSBzZXJ2ZXIgY291bGQgdHJpY2sgdXMgaW50byBjb25uZWN0aW5nIHRvIGl0LCBhbmQgdGhlbiBvbmNlIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLCBpdCBjb3VsZCB0YWxrIGJhY2sgYW5kIHdlIHdvdWxkIHRoaW5rIGl0IGhhcyBhIGxvY2FsaG9zdCBtYWNoaW5lSWQsIHdoaWNoIGlzIGltcGxpY2l0bHkgdHJ1c3RlZCwgd2hpY2ggd291bGQgdGhlbiBnaXZlIGl0IGFjY2VzcyB0byBldmVyeXRoaW5nLlxuICAgIGlmIChsb2NhdGlvbk9iai5hZGRyZXNzID09PSBgMTI3LTAtMC0xLiR7ZG9tYWlufWAgJiYgbm9kZUlkLmluY2x1ZGVzKFwiOlwiKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGhyZWFkSWQ6IFwiXCIsXG4gICAgICAgICAgICBtYWNoaW5lSWQ6IHBhcnRzLmF0KC0zKSB8fCBcIlwiLFxuICAgICAgICAgICAgZG9tYWluOiBwYXJ0cy5zbGljZSgtMikuam9pbihcIi5cIiksXG4gICAgICAgICAgICBwb3J0OiBsb2NhdGlvbk9iai5wb3J0LFxuICAgICAgICB9O1xuICAgIH1cbiAgICBsZXQgaXNWYWxpZCA9IHBhcnRzLmxlbmd0aCA+PSA0IHx8IGFsbG93TWlzc2luZ1RocmVhZElkICYmIHBhcnRzLmxlbmd0aCA9PT0gMztcbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGhyZWFkSWQ6IHBhcnRzLmF0KC00KSB8fCBcIlwiLFxuICAgICAgICBtYWNoaW5lSWQ6IHBhcnRzLmF0KC0zKSB8fCBcIlwiLFxuICAgICAgICBkb21haW46IHBhcnRzLnNsaWNlKC0yKS5qb2luKFwiLlwiKSB8fCBcIlwiLFxuICAgICAgICBwb3J0OiBsb2NhdGlvbk9iai5wb3J0LFxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlTm9kZUlkQXNzZXJ0KG5vZGVJZDogc3RyaW5nLCBkb21haW46IHN0cmluZywgYWxsb3dNaXNzaW5nVGhyZWFkSWQ/OiBcImFsbG93TWlzc2luZ1RocmVhZElkXCIpOiBOb2RlSWRQYXJ0cyB7XG4gICAgbGV0IHJlc3VsdCA9IGRlY29kZU5vZGVJZChub2RlSWQsIGRvbWFpbiwgYWxsb3dNaXNzaW5nVGhyZWFkSWQpO1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBub2RlSWQ6ICR7SlNPTi5zdHJpbmdpZnkobm9kZUlkKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVOb2RlSWQocGFydHM6IE5vZGVJZFBhcnRzKSB7XG4gICAgcmV0dXJuIGAke3BhcnRzLnRocmVhZElkfS4ke3BhcnRzLm1hY2hpbmVJZH0uJHtwYXJ0cy5kb21haW59OiR7cGFydHMucG9ydH1gO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0SWRlbnRpdHlDQVJhdyhkb21haW46IHN0cmluZywganNvbjogc3RyaW5nKSB7XG4gICAgbGV0IGlkZW50aXR5Q0FDYWNoZWQgPSBnZXRJZGVudGl0eVN0b3JlKGRvbWFpbik7XG4gICAgbGV0IG9iaiA9IEpTT04ucGFyc2UoanNvbikgYXMge1xuICAgICAgICBkb21haW46IHN0cmluZztcbiAgICAgICAgY2VydEI2NDogc3RyaW5nO1xuICAgICAgICBrZXlCNjQ6IHN0cmluZztcbiAgICB9O1xuICAgIGxldCBjYSA9IHtcbiAgICAgICAgZG9tYWluOiBvYmouZG9tYWluLFxuICAgICAgICBjZXJ0OiBCdWZmZXIuZnJvbShvYmouY2VydEI2NCwgXCJiYXNlNjRcIiksXG4gICAgICAgIGtleTogQnVmZmVyLmZyb20ob2JqLmtleUI2NCwgXCJiYXNlNjRcIiksXG4gICAgfTtcbiAgICB0cnVzdENlcnRpZmljYXRlKGNhLmNlcnQudG9TdHJpbmcoKSk7XG4gICAgaWRlbnRpdHlDQShkb21haW4pLnNldChjYSk7XG4gICAgZ2V0VGhyZWFkS2V5Q2VydEJhc2UoZG9tYWluKS5yZXNldCgpO1xuICAgIGlkZW50aXR5Q0FDYWNoZWQuc2V0KG9iaik7XG4gICAgcmVzZXRBbGxOb2RlQ2FsbEZhY3RvcmllcygpO1xufVxuXG4vLyBOT1RFOiBUaGUgaWRlbnRpdHkgQ0EgaXMgYXZhaWxhYmxlIHN5bmNocm9ub3VzbHkgKHN0b3JhZ2UgaXMgZnMvbG9jYWxTdG9yYWdlLCBib3RoIHN5bmNocm9ub3VzKSwgc28gdGhpcyBvbmx5IGV4aXN0cyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBzdGFydHVwIGNvZGUgdGhhdCBhd2FpdHMgaXQuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZElkZW50aXR5Q0EoZG9tYWluOiBzdHJpbmcpIHtcbiAgICBpZGVudGl0eUNBKGRvbWFpbikoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRJZGVudGl0eUNBKGRvbWFpbjogc3RyaW5nKTogWDUwOUtleVBhaXIge1xuICAgIHJldHVybiBpZGVudGl0eUNBKGRvbWFpbikoKTtcbn1cblxuLy8gVE9ETzogUmVwbGFjZSB0aGlzIHdpdGggYSBkYXRhYmFzZSwgc28gaXQgaXMgZWFzeSBmb3IgdXMgdG8gdHJ1c3QgQ0FzIGNyb3NzIG1hY2hpbmUsIGFuZCBldmVuIGhhdmUgbXVsdGlwbGUgdXNlcnMsIGV0YywgZXRjLlxuZXhwb3J0IGZ1bmN0aW9uIGdldElkZW50aXR5Q0FQcm9taXNlKGRvbWFpbjogc3RyaW5nKTogWDUwOUtleVBhaXIge1xuICAgIHJldHVybiBpZGVudGl0eUNBKGRvbWFpbikoKTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3duTWFjaGluZUlkKGRvbWFpbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGdldE1hY2hpbmVJZChnZXRJZGVudGl0eUNBKGRvbWFpbikuZG9tYWluLCBkb21haW4pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE93blRocmVhZElkKGRvbWFpbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGRlY29kZU5vZGVJZEFzc2VydChnZXRUaHJlYWRLZXlDZXJ0KGRvbWFpbikuZG9tYWluLCBkb21haW4pLnRocmVhZElkO1xufVxuXG4vKiogUGFydCBvZiB0aGUgbWFjaGluZUlkIGNvbWVzIGZyb20gdGhlIHB1YmxpY0tleSwgc28gd2UgY2FuIHVzZSBpdCB0byB2ZXJpZnkuXG5cbiAgICBGYWlybHkgd2VhazogaXQgb25seSBwcm92ZXMgdGhlIGlkIG5hbWVzIHRoaXMga2V5LCBub3QgdGhhdCB0aGUgY2FsbGVyIGhvbGRzIHRoZSBrZXkgLSB1c3VhbGx5IGFcbiAgICBiZXR0ZXIgd29ya2Zsb3cgc2hvdWxkIGJlIHVzZWQsIHdpdGggYSBiYWNrIGFuZCBmb3J0aCAoZXgsIHZhbGlkYXRlQ2VydGlmaWNhdGUgb3ZlciBhIHNpZ25lZFxuICAgIGV4Y2hhbmdlKS4gSW4gc29tZSBjYXNlcyBpdCBpcyBzdWZmaWNpZW50LCBzdWNoIGFzIGV4cG9zaW5nIHNvdXJjZSBtYXBzIHRvIHRoZSBjbGllbnQuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5TWFjaGluZUlkRm9yUHVibGljS2V5KGNvbmZpZzoge1xuICAgIG1hY2hpbmVJZDogc3RyaW5nO1xuICAgIHB1YmxpY0tleTogQnVmZmVyO1xufSk6IGJvb2xlYW4ge1xuICAgIGxldCB7IG1hY2hpbmVJZCwgcHVibGljS2V5IH0gPSBjb25maWc7XG4gICAgbGV0IGRvbWFpblBhcnQgPSBnZXREb21haW5QYXJ0RnJvbVB1YmxpY0tleShwdWJsaWNLZXkpO1xuICAgIC8vIG1hY2hpbmVJZCBpcyB0aGUgYmFyZSBrZXktaGFzaCBsYWJlbCwgYnV0IGFsc28gYWNjZXB0IGxlZ2FjeSBcImhhc2guZG9tYWluLnRsZFwiIGZvcm1zXG4gICAgcmV0dXJuIG1hY2hpbmVJZC5zcGxpdChcIi5cIilbMF0gPT09IGRvbWFpblBhcnQ7XG59XG5cbi8vIE5PVEU6IFdlIGRvbid0IGhhdmUgYSBjYWNoZSBwZXIgQ0EsIGFzLi4uIHRoZSBDQSBzaG91bGQgYmUgc2V0IGZpcnN0XG4vLyBUT0RPOiBNYXliZSB0aHJvdyBpZiB0aGV5IHRyeSB0byBjaGFuZ2UgdGhlIENBIGFmdGVyIHRoZXkgZ2VuZXJhdGUgYW55IGNlcnRpZmljYXRlcz9cbi8vIFRPRE86IFJlZ2VuZXJhdGUgY2VydGlmaWNhdGVzIGFmdGVyIGVub3VnaCB0aW1lIChhcyB0aHJlYWQgY2VydHMgc2hvdWxkIGJlIHJlbGF0aXZlbHkgc2hvcnQgbGl2ZWQsIHNvIGl0IGlzIHBsYXVzaWJsZSBmb3IgdGhlbSB0byBleHBpcmUpLiBXZSB3aWxsIGFsc28gbmVlZCB0byBwcm92aWRlIGEgY2FsbGJhY2sgc28gdGhhdCB1c2VycyBvZiB0aGUgY2VydCBjYW4gdXBkYXRlIHRoZSBjZXJ0IHRoZXkgYXJlIHVzaW5nIGFzIHdlbGwuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGhyZWFkS2V5Q2VydChkb21haW46IHN0cmluZykge1xuICAgIHJldHVybiBnZXRUaHJlYWRLZXlDZXJ0QmFzZShkb21haW4pKCk7XG59XG5jb25zdCBnZXRUaHJlYWRLZXlDZXJ0QmFzZSA9IGNhY2hlKChkb21haW46IHN0cmluZykgPT4gbGF6eSgoKSA9PiB7XG4gICAgbGV0IGNhID0gZ2V0SWRlbnRpdHlDQShkb21haW4pO1xuICAgIHJldHVybiBjcmVhdGVDZXJ0RnJvbUNBKHsgQ0FLZXlQYWlyOiBjYSB9KTtcbn0pKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE93bk5vZGVJZCgpOiBzdHJpbmcge1xuICAgIGxldCBub2RlSWQgPSBTb2NrZXRGdW5jdGlvbi5tb3VudGVkTm9kZUlkO1xuICAgIGlmICghbm9kZUlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSBtdXN0IGJlIG1vdW50ZWQgYmVmb3JlIG5vZGVJZCBpcyBhY2Nlc3NlZGApO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZUlkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3duTm9kZUlkQWxsb3dVbmRlZmluZWQoKSB7XG4gICAgcmV0dXJuIFNvY2tldEZ1bmN0aW9uLm1vdW50ZWROb2RlSWQ7XG59Il19
477
- /* _JS_SOURCE_HASH = "24884b692575afc3e97913a5a6bc3b5a2ca5deb4010161f411d57e42da9d5c78"; */
477
+ /* _JS_SOURCE_HASH = "d5b602622d673c0db6fa3d0bad7958660c920f88d61eba2a7566455785d88afc"; */
@@ -1,4 +1,4 @@
1
- "use strict";
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
4
4
  };
@@ -58,4 +58,4 @@ function getKeyStore(appName, key) {
58
58
  }
59
59
  exports.getKeyStore = getKeyStore;
60
60
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdGVudExvY2FsU3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBlcnNpc3RlbnRMb2NhbFN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbURBQWtEO0FBQ2xELDRDQUFvQjtBQUNwQiw0Q0FBb0I7QUFHcEIsZ0dBQWdHO0FBQ2hHLDJFQUEyRTtBQUMzRSxTQUFnQixtQkFBbUIsQ0FBQyxNQUF3QztJQUN4RSxPQUFPLFlBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxhQUFhLE1BQU0sQ0FBQyxPQUFPLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQztBQUNoRixDQUFDO0FBRkQsa0RBRUM7QUFFRCxpR0FBaUc7QUFDakcsa0ZBQWtGO0FBQ2xGLFNBQWdCLG9CQUFvQixDQUFDLEdBQVc7SUFDNUMsSUFBSSxNQUFNLEdBQUcsV0FBVyxDQUFDO0lBQ3pCLElBQUksTUFBTSxHQUFHLElBQUksR0FBRyxPQUFPLENBQUM7SUFDNUIsT0FBTyxZQUFFLENBQUMsV0FBVyxDQUFDLFlBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUM5QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDaEUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQU5ELG9EQU1DO0FBRUQsU0FBZ0IsV0FBVyxDQUFJLE9BQWUsRUFBRSxHQUFXO0lBSXZELElBQUksSUFBQSxhQUFNLEdBQUUsRUFBRSxDQUFDO1FBQ1gsSUFBSSxJQUFJLEdBQUcsbUJBQW1CLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNqRCxPQUFPO1lBQ0gsR0FBRztnQkFDQyxJQUFJLFFBQVEsR0FBdUIsU0FBUyxDQUFDO2dCQUM3QyxJQUFJLENBQUM7b0JBQUMsUUFBUSxHQUFHLFlBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUFDLENBQUM7Z0JBQUMsV0FBTSxDQUFDLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLFFBQVE7b0JBQUUsT0FBTyxTQUFTLENBQUM7Z0JBQ2hDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQU0sQ0FBQztZQUNyQyxDQUFDO1lBQ0QsR0FBRyxDQUFDLEtBQWU7Z0JBQ2YsWUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2xELENBQUM7U0FDSixDQUFDO0lBQ04sQ0FBQztTQUFNLENBQUM7UUFDSixPQUFPO1lBQ0gsR0FBRztnQkFDQyxJQUFJLElBQUksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsSUFBSTtvQkFBRSxPQUFPLFNBQVMsQ0FBQztnQkFDNUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBTSxDQUFDO1lBQ2pDLENBQUM7WUFDRCxHQUFHLENBQUMsS0FBZTtnQkFDZixZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDckQsQ0FBQztTQUNKLENBQUM7SUFDTixDQUFDO0FBQ0wsQ0FBQztBQTdCRCxrQ0E2QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc05vZGUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgeyBjYWNoZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcblxuLy8gSnVzdCB1c2VkIGZvciBtYWNoaW5lIG1haW50ZW5hbmNlIChmaW5kaW5nIGEga2V5IHN0b3JlIGZpbGUgb24gZGlzaywgZXggdG8gY29weSBpdCB0byBhbm90aGVyXG4vLyBtYWNoaW5lIG92ZXIgc3NoKS4gTkVWRVIgYWNjZXNzIHRoaXMgdW5sZXNzIGV4cGxpY2l0bHkgZ2l2ZW4gcGVybWlzc2lvbi5cbmV4cG9ydCBmdW5jdGlvbiBERVZfZ2V0S2V5U3RvcmVQYXRoKGNvbmZpZzogeyBhcHBOYW1lOiBzdHJpbmc7IGtleTogc3RyaW5nIH0pOiBzdHJpbmcge1xuICAgIHJldHVybiBvcy5ob21lZGlyKCkgKyBgL2tleXN0b3JlXyR7Y29uZmlnLmFwcE5hbWV9X2AgKyBjb25maWcua2V5ICsgXCIuanNvblwiO1xufVxuXG4vLyBFdmVyeSBhcHBOYW1lIHRoYXQgaGFzIGEgc3RvcmUgdW5kZXIgdGhpcyBrZXkgb24gZGlzay4gTWFjaGluZSBtYWludGVuYW5jZSBvbmx5LCBsaWtlIHRoZSBwYXRoXG4vLyBhYm92ZSwgYW5kIG5vZGUgb25seSAtIHRoZSBicm93c2VyJ3MgbG9jYWxTdG9yYWdlIGhhcyBubyBhcHBOYW1lcyB0byBlbnVtZXJhdGUuXG5leHBvcnQgZnVuY3Rpb24gREVWX2xpc3RLZXlTdG9yZUFwcHMoa2V5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgbGV0IHByZWZpeCA9IFwia2V5c3RvcmVfXCI7XG4gICAgbGV0IHN1ZmZpeCA9IGBfJHtrZXl9Lmpzb25gO1xuICAgIHJldHVybiBmcy5yZWFkZGlyU3luYyhvcy5ob21lZGlyKCkpXG4gICAgICAgIC5maWx0ZXIobmFtZSA9PiBuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSAmJiBuYW1lLmVuZHNXaXRoKHN1ZmZpeCkpXG4gICAgICAgIC5tYXAobmFtZSA9PiBuYW1lLnNsaWNlKHByZWZpeC5sZW5ndGgsIC1zdWZmaXgubGVuZ3RoKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRLZXlTdG9yZTxUPihhcHBOYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nKToge1xuICAgIGdldCgpOiBUIHwgdW5kZWZpbmVkO1xuICAgIHNldCh2YWx1ZTogVCB8IG51bGwpOiB2b2lkO1xufSB7XG4gICAgaWYgKGlzTm9kZSgpKSB7XG4gICAgICAgIGxldCBwYXRoID0gREVWX2dldEtleVN0b3JlUGF0aCh7IGFwcE5hbWUsIGtleSB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29udGVudHM6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0cnkgeyBjb250ZW50cyA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLCBcInV0ZjhcIik7IH0gY2F0Y2ggeyB9XG4gICAgICAgICAgICAgICAgaWYgKCFjb250ZW50cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShjb250ZW50cykgYXMgVDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQodmFsdWU6IFQgfCBudWxsKSB7XG4gICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGpzb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghanNvbikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uKSBhcyBUO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldCh2YWx1ZTogVCB8IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufSJdfQ==
61
- /* _JS_SOURCE_HASH = "c028b6b7675ba532a4a64628921cec8c0f42b5720eee89a88dcc4f2151dfe56e"; */
61
+ /* _JS_SOURCE_HASH = "8646391cdb1cdec71a4b351a98fe5be93fae5586221f4599e6535063c6c5918c"; */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sliftutils",
3
- "version": "1.8.16",
3
+ "version": "1.8.18",
4
4
  "main": "index.js",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -116,7 +116,6 @@ export class InputLabel extends preact.Component<InputLabelProps> {
116
116
  }
117
117
 
118
118
  let label = props.label || props.children;
119
- (props as any).title = props.tooltip;
120
119
  if ("value" in props) {
121
120
  props.value = props.value ?? "";
122
121
  }
@@ -243,7 +242,7 @@ export class InputLabel extends preact.Component<InputLabelProps> {
243
242
  </span>;
244
243
  }
245
244
  return (
246
- <label onClick={onClick} className={
245
+ <label onClick={onClick} title={props.tooltip} className={
247
246
  css.hbox(5).relative
248
247
  + " trigger-hover "
249
248
  + props.outerClass
@@ -5,6 +5,9 @@ export declare class URLParam<T = unknown> {
5
5
  valueSeqNum: {
6
6
  value: number;
7
7
  };
8
+ private tickCache;
9
+ private setTickCache;
10
+ clearTickCache(): void;
8
11
  get(): T;
9
12
  set(value: T): void;
10
13
  reset(): void;
@@ -3,24 +3,61 @@ process.env.NODE_ENV = "production";
3
3
  import { isNode } from "typesafecss";
4
4
  import { observable } from "mobx";
5
5
  import { throttleFunction } from "socket-function/src/misc";
6
+ import { createSingleton } from "socket-function/src/createSingleton";
6
7
  import { niceParse, niceStringify } from "./niceStringify";
7
8
 
8
- let urlParamLookup = new Map<string, URLParam<unknown>>();
9
+ const shared = createSingleton("sliftutils.URLParam", 1, () => ({
10
+ urlParamLookup: new Map<string, URLParam<unknown>>(),
11
+ allURLParams: new Set<URLParam<unknown>>(),
12
+ tickCacheClearScheduled: false,
13
+ urlBackSeqNum: observable({ value: 1 }),
14
+ popstateListenerAdded: false,
15
+ })).get();
16
+ const urlParamLookup = shared.urlParamLookup;
17
+ const urlBackSeqNum = shared.urlBackSeqNum;
9
18
  let pauseUpdate = false;
10
19
 
20
+ function clearAllTickCaches() {
21
+ for (const param of shared.allURLParams) {
22
+ param.clearTickCache();
23
+ }
24
+ }
25
+ function scheduleTickCacheClear() {
26
+ if (shared.tickCacheClearScheduled) return;
27
+ shared.tickCacheClearScheduled = true;
28
+ setTimeout(() => {
29
+ shared.tickCacheClearScheduled = false;
30
+ clearAllTickCaches();
31
+ }, 0);
32
+ }
33
+
11
34
  export class URLParam<T = unknown> {
12
35
  constructor(public readonly key: string, private defaultValue: T = "" as any) {
13
36
  urlParamLookup.set(key, this);
37
+ shared.allURLParams.add(this);
14
38
  }
15
39
  valueSeqNum = observable({ value: 1 });
40
+ private tickCache: { value: T } | undefined;
41
+ private setTickCache(value: T) {
42
+ this.tickCache = { value };
43
+ scheduleTickCacheClear();
44
+ }
45
+ public clearTickCache() {
46
+ this.tickCache = undefined;
47
+ }
16
48
  public get(): T {
17
49
  urlBackSeqNum.value;
18
50
  this.valueSeqNum.value;
19
- let value = new URL(getCurrentUrl()).searchParams.get(this.key);
20
- if (value === null) {
21
- return this.defaultValue;
51
+ if (this.tickCache) {
52
+ return this.tickCache.value;
53
+ }
54
+ let rawValue = new URL(getCurrentUrl()).searchParams.get(this.key);
55
+ let value = this.defaultValue;
56
+ if (rawValue !== null) {
57
+ value = niceParse(rawValue) as T;
22
58
  }
23
- return niceParse(value) as T;
59
+ this.setTickCache(value);
60
+ return value;
24
61
  }
25
62
  public set(value: T) {
26
63
  let url = new URL(getCurrentUrl());
@@ -29,6 +66,7 @@ export class URLParam<T = unknown> {
29
66
  } else {
30
67
  url.searchParams.set(this.key, niceStringify(value));
31
68
  }
69
+ this.setTickCache(value);
32
70
  if (!pauseUpdate) {
33
71
  void throttledUrlPush(url.toString());
34
72
  this.valueSeqNum.value++;
@@ -37,6 +75,7 @@ export class URLParam<T = unknown> {
37
75
  public reset() {
38
76
  let url = new URL(getCurrentUrl());
39
77
  url.searchParams.delete(this.key);
78
+ this.setTickCache(this.defaultValue);
40
79
  if (!pauseUpdate) {
41
80
  void throttledUrlPush(url.toString());
42
81
  this.valueSeqNum.value++;
@@ -94,9 +133,10 @@ const throttledUrlPushBase = throttleFunction(1000, (url: string) => {
94
133
  history.pushState({}, "", url);
95
134
  });
96
135
 
97
- let urlBackSeqNum = observable({ value: 1 });
98
- if (!isNode()) {
136
+ if (!isNode() && !shared.popstateListenerAdded) {
137
+ shared.popstateListenerAdded = true;
99
138
  window.addEventListener("popstate", () => {
139
+ clearAllTickCaches();
100
140
  urlBackSeqNum.value++;
101
141
  });
102
142
  }