@mnaoumov/typescript-lib 0.0.0 → 1.0.1

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 (182) hide show
  1. package/@types/debug/package.json +4 -0
  2. package/LICENSE +21 -0
  3. package/README.md +15 -1
  4. package/dist/lib/cjs/@types/debug.d.cts +21 -0
  5. package/dist/lib/cjs/abort-controller.cjs +144 -0
  6. package/dist/lib/cjs/abort-controller.d.cts +136 -0
  7. package/dist/lib/cjs/aggregate-error.cjs +40 -0
  8. package/dist/lib/cjs/aggregate-error.d.cts +24 -0
  9. package/dist/lib/cjs/array-buffer.cjs +38 -0
  10. package/dist/lib/cjs/array-buffer.d.cts +16 -0
  11. package/dist/lib/cjs/array.cjs +76 -0
  12. package/dist/lib/cjs/array.d.cts +46 -0
  13. package/dist/lib/cjs/async-events.cjs +408 -0
  14. package/dist/lib/cjs/async-events.d.cts +456 -0
  15. package/dist/lib/cjs/async-operation-hook.cjs +55 -0
  16. package/dist/lib/cjs/async-operation-hook.d.cts +59 -0
  17. package/dist/lib/cjs/async.cjs +463 -0
  18. package/dist/lib/cjs/async.d.cts +415 -0
  19. package/dist/lib/cjs/beeper.cjs +68 -0
  20. package/dist/lib/cjs/beeper.d.cts +21 -0
  21. package/dist/lib/cjs/blob.cjs +102 -0
  22. package/dist/lib/cjs/blob.d.cts +60 -0
  23. package/dist/lib/cjs/bytes.cjs +56 -0
  24. package/dist/lib/cjs/bytes.d.cts +17 -0
  25. package/dist/lib/cjs/debug-controller.cjs +22 -0
  26. package/dist/lib/cjs/debug-controller.d.cts +87 -0
  27. package/dist/lib/cjs/debug.cjs +204 -0
  28. package/dist/lib/cjs/debug.d.cts +66 -0
  29. package/dist/lib/cjs/desktop-zip-extractor.cjs +157 -0
  30. package/dist/lib/cjs/desktop-zip-extractor.d.cts +96 -0
  31. package/dist/lib/cjs/disposable.cjs +364 -0
  32. package/dist/lib/cjs/disposable.d.cts +387 -0
  33. package/dist/lib/cjs/enum.cjs +42 -0
  34. package/dist/lib/cjs/enum.d.cts +24 -0
  35. package/dist/lib/cjs/error.cjs +239 -0
  36. package/dist/lib/cjs/error.d.cts +182 -0
  37. package/dist/lib/cjs/function.cjs +83 -0
  38. package/dist/lib/cjs/function.d.cts +128 -0
  39. package/dist/lib/cjs/html-element.cjs +283 -0
  40. package/dist/lib/cjs/html-element.d.cts +200 -0
  41. package/dist/lib/cjs/index.cjs +137 -0
  42. package/dist/lib/cjs/index.d.cts +33 -0
  43. package/dist/lib/cjs/jpeg-metadata.cjs +170 -0
  44. package/dist/lib/cjs/jpeg-metadata.d.cts +42 -0
  45. package/dist/lib/cjs/library-references.d.cts +2 -0
  46. package/dist/lib/cjs/library.cjs +100 -0
  47. package/dist/lib/cjs/library.d.cts +96 -0
  48. package/dist/lib/cjs/object-utils.cjs +559 -0
  49. package/dist/lib/cjs/object-utils.d.cts +298 -0
  50. package/dist/lib/cjs/path.cjs +171 -0
  51. package/dist/lib/cjs/path.d.cts +155 -0
  52. package/dist/lib/cjs/reg-exp.cjs +196 -0
  53. package/dist/lib/cjs/reg-exp.d.cts +87 -0
  54. package/dist/lib/cjs/string.cjs +268 -0
  55. package/dist/lib/cjs/string.d.cts +362 -0
  56. package/dist/lib/cjs/transformers/date-transformer.cjs +71 -0
  57. package/dist/lib/cjs/transformers/date-transformer.d.cts +39 -0
  58. package/dist/lib/cjs/transformers/group-transformer.cjs +115 -0
  59. package/dist/lib/cjs/transformers/group-transformer.d.cts +70 -0
  60. package/dist/lib/cjs/transformers/index.cjs +65 -0
  61. package/dist/lib/cjs/transformers/index.d.cts +9 -0
  62. package/dist/lib/cjs/transformers/map-transformer.cjs +71 -0
  63. package/dist/lib/cjs/transformers/map-transformer.d.cts +41 -0
  64. package/dist/lib/cjs/transformers/set-transformer.cjs +71 -0
  65. package/dist/lib/cjs/transformers/set-transformer.d.cts +39 -0
  66. package/dist/lib/cjs/transformers/skip-private-property-transformer.cjs +69 -0
  67. package/dist/lib/cjs/transformers/skip-private-property-transformer.d.cts +36 -0
  68. package/dist/lib/cjs/transformers/transformer.cjs +112 -0
  69. package/dist/lib/cjs/transformers/transformer.d.cts +70 -0
  70. package/dist/lib/cjs/transformers/two-way-map-transformer.cjs +72 -0
  71. package/dist/lib/cjs/transformers/two-way-map-transformer.d.cts +42 -0
  72. package/dist/lib/cjs/transformers/typed-transformer.cjs +36 -0
  73. package/dist/lib/cjs/transformers/typed-transformer.d.cts +39 -0
  74. package/dist/lib/cjs/two-way-map.cjs +150 -0
  75. package/dist/lib/cjs/two-way-map.d.cts +101 -0
  76. package/dist/lib/cjs/type-guards.cjs +70 -0
  77. package/dist/lib/cjs/type-guards.d.cts +84 -0
  78. package/dist/lib/cjs/type.cjs +63 -0
  79. package/dist/lib/cjs/type.d.cts +122 -0
  80. package/dist/lib/cjs/typescript-lib-state.cjs +68 -0
  81. package/dist/lib/cjs/typescript-lib-state.d.cts +56 -0
  82. package/dist/lib/cjs/url.cjs +78 -0
  83. package/dist/lib/cjs/url.d.cts +74 -0
  84. package/dist/lib/cjs/value-provider.cjs +42 -0
  85. package/dist/lib/cjs/value-provider.d.cts +29 -0
  86. package/dist/lib/cjs/value-wrapper.cjs +86 -0
  87. package/dist/lib/cjs/value-wrapper.d.cts +47 -0
  88. package/dist/lib/esm/@types/debug.d.mts +21 -0
  89. package/dist/lib/esm/abort-controller.d.mts +136 -0
  90. package/dist/lib/esm/abort-controller.mjs +115 -0
  91. package/dist/lib/esm/aggregate-error.d.mts +24 -0
  92. package/dist/lib/esm/aggregate-error.mjs +16 -0
  93. package/dist/lib/esm/array-buffer.d.mts +16 -0
  94. package/dist/lib/esm/array-buffer.mjs +14 -0
  95. package/dist/lib/esm/array.d.mts +46 -0
  96. package/dist/lib/esm/array.mjs +49 -0
  97. package/dist/lib/esm/async-events.d.mts +456 -0
  98. package/dist/lib/esm/async-events.mjs +383 -0
  99. package/dist/lib/esm/async-operation-hook.d.mts +59 -0
  100. package/dist/lib/esm/async-operation-hook.mjs +27 -0
  101. package/dist/lib/esm/async.d.mts +415 -0
  102. package/dist/lib/esm/async.mjs +435 -0
  103. package/dist/lib/esm/beeper.d.mts +21 -0
  104. package/dist/lib/esm/beeper.mjs +44 -0
  105. package/dist/lib/esm/blob.d.mts +60 -0
  106. package/dist/lib/esm/blob.mjs +77 -0
  107. package/dist/lib/esm/bytes.d.mts +17 -0
  108. package/dist/lib/esm/bytes.mjs +32 -0
  109. package/dist/lib/esm/debug-controller.d.mts +87 -0
  110. package/dist/lib/esm/debug-controller.mjs +6 -0
  111. package/dist/lib/esm/debug.d.mts +66 -0
  112. package/dist/lib/esm/debug.mjs +168 -0
  113. package/dist/lib/esm/desktop-zip-extractor.d.mts +96 -0
  114. package/dist/lib/esm/desktop-zip-extractor.mjs +136 -0
  115. package/dist/lib/esm/disposable.d.mts +387 -0
  116. package/dist/lib/esm/disposable.mjs +324 -0
  117. package/dist/lib/esm/enum.d.mts +24 -0
  118. package/dist/lib/esm/enum.mjs +17 -0
  119. package/dist/lib/esm/error.d.mts +182 -0
  120. package/dist/lib/esm/error.mjs +204 -0
  121. package/dist/lib/esm/function.d.mts +128 -0
  122. package/dist/lib/esm/function.mjs +52 -0
  123. package/dist/lib/esm/html-element.d.mts +200 -0
  124. package/dist/lib/esm/html-element.mjs +247 -0
  125. package/dist/lib/esm/index.d.mts +33 -0
  126. package/dist/lib/esm/index.mjs +72 -0
  127. package/dist/lib/esm/jpeg-metadata.d.mts +42 -0
  128. package/dist/lib/esm/jpeg-metadata.mjs +145 -0
  129. package/dist/lib/esm/library-references.d.mts +2 -0
  130. package/dist/lib/esm/library.d.mts +96 -0
  131. package/dist/lib/esm/library.mjs +74 -0
  132. package/dist/lib/esm/object-utils.d.mts +298 -0
  133. package/dist/lib/esm/object-utils.mjs +523 -0
  134. package/dist/lib/esm/path.d.mts +155 -0
  135. package/dist/lib/esm/path.mjs +122 -0
  136. package/dist/lib/esm/reg-exp.d.mts +87 -0
  137. package/dist/lib/esm/reg-exp.mjs +169 -0
  138. package/dist/lib/esm/string.d.mts +362 -0
  139. package/dist/lib/esm/string.mjs +230 -0
  140. package/dist/lib/esm/transformers/date-transformer.d.mts +39 -0
  141. package/dist/lib/esm/transformers/date-transformer.mjs +47 -0
  142. package/dist/lib/esm/transformers/group-transformer.d.mts +70 -0
  143. package/dist/lib/esm/transformers/group-transformer.mjs +94 -0
  144. package/dist/lib/esm/transformers/index.d.mts +9 -0
  145. package/dist/lib/esm/transformers/index.mjs +24 -0
  146. package/dist/lib/esm/transformers/map-transformer.d.mts +41 -0
  147. package/dist/lib/esm/transformers/map-transformer.mjs +47 -0
  148. package/dist/lib/esm/transformers/set-transformer.d.mts +39 -0
  149. package/dist/lib/esm/transformers/set-transformer.mjs +47 -0
  150. package/dist/lib/esm/transformers/skip-private-property-transformer.d.mts +36 -0
  151. package/dist/lib/esm/transformers/skip-private-property-transformer.mjs +45 -0
  152. package/dist/lib/esm/transformers/transformer.d.mts +70 -0
  153. package/dist/lib/esm/transformers/transformer.mjs +88 -0
  154. package/dist/lib/esm/transformers/two-way-map-transformer.d.mts +42 -0
  155. package/dist/lib/esm/transformers/two-way-map-transformer.mjs +48 -0
  156. package/dist/lib/esm/transformers/typed-transformer.d.mts +39 -0
  157. package/dist/lib/esm/transformers/typed-transformer.mjs +12 -0
  158. package/dist/lib/esm/two-way-map.d.mts +101 -0
  159. package/dist/lib/esm/two-way-map.mjs +126 -0
  160. package/dist/lib/esm/type-guards.d.mts +84 -0
  161. package/dist/lib/esm/type-guards.mjs +41 -0
  162. package/dist/lib/esm/type.d.mts +122 -0
  163. package/dist/lib/esm/type.mjs +39 -0
  164. package/dist/lib/esm/typescript-lib-state.d.mts +56 -0
  165. package/dist/lib/esm/typescript-lib-state.mjs +40 -0
  166. package/dist/lib/esm/url.d.mts +74 -0
  167. package/dist/lib/esm/url.mjs +50 -0
  168. package/dist/lib/esm/value-provider.d.mts +29 -0
  169. package/dist/lib/esm/value-provider.mjs +18 -0
  170. package/dist/lib/esm/value-wrapper.d.mts +47 -0
  171. package/dist/lib/esm/value-wrapper.mjs +62 -0
  172. package/package.json +153 -13
  173. package/transformers/date-transformer/package.json +6 -0
  174. package/transformers/group-transformer/package.json +6 -0
  175. package/transformers/index/package.json +6 -0
  176. package/transformers/map-transformer/package.json +6 -0
  177. package/transformers/package.json +6 -0
  178. package/transformers/set-transformer/package.json +6 -0
  179. package/transformers/skip-private-property-transformer/package.json +6 -0
  180. package/transformers/transformer/package.json +6 -0
  181. package/transformers/two-way-map-transformer/package.json +6 -0
  182. package/transformers/typed-transformer/package.json +6 -0
@@ -0,0 +1,128 @@
1
+ /// <reference path="./library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Contains utility functions and types for working with functions.
6
+ */
7
+ import type { Promisable } from 'type-fest' with { 'resolution-mode': 'import' };
8
+ /**
9
+ * Represents a generic async function.
10
+ *
11
+ * @typeParam Arguments - The arguments of the function.
12
+ * @typeParam Return - The awaited return type of the function.
13
+ */
14
+ export type GenericAsyncFunction<Arguments extends unknown[] = never[], Return = unknown> = GenericFunction<Arguments, Promise<Return>>;
15
+ /**
16
+ * Represents a generic async void function.
17
+ *
18
+ * @typeParam Arguments - The arguments of the function.
19
+ */
20
+ export type GenericAsyncVoidFunction<Arguments extends unknown[] = never[]> = GenericAsyncFunction<Arguments, void>;
21
+ /**
22
+ * Represents a generic function.
23
+ *
24
+ * @typeParam Arguments - The arguments of the function.
25
+ * @typeParam Return - The return type of the function.
26
+ */
27
+ export type GenericFunction<Arguments extends unknown[] = never[], Return = unknown> = (...$arguments: Arguments) => Return;
28
+ /**
29
+ * Represents a generic promisable function.
30
+ *
31
+ * @typeParam Arguments - The arguments of the function.
32
+ * @typeParam Return - The awaited return type of the function.
33
+ */
34
+ export type GenericPromisableFunction<Arguments extends unknown[] = never[], Return = unknown> = GenericFunction<Arguments, Promisable<Return>>;
35
+ /**
36
+ * Represents a generic promisable void function.
37
+ *
38
+ * @typeParam Arguments - The arguments of the function.
39
+ */
40
+ export type GenericPromisableVoidFunction<Arguments extends unknown[] = never[]> = GenericPromisableFunction<Arguments, void>;
41
+ /**
42
+ * Represents a generic void function.
43
+ *
44
+ * @typeParam Arguments - The arguments of the function.
45
+ */
46
+ export type GenericVoidFunction<Arguments extends unknown[] = never[]> = GenericFunction<Arguments, void>;
47
+ /**
48
+ * Converts a function into a string that is a valid function expression.
49
+ *
50
+ * `Function.prototype.toString()` on a shorthand method like `{ fn() {} }`
51
+ * returns `"fn() {}"`, which is not a valid expression.
52
+ * This helper detects that form and prefixes it with `function `.
53
+ *
54
+ * @param $function - The function to convert.
55
+ * @returns A string that is a valid function expression.
56
+ */
57
+ export declare function getFunctionExpressionString($function: Function): string;
58
+ /**
59
+ * A function that does nothing.
60
+ */
61
+ export declare function noop(): void;
62
+ /**
63
+ * A singleton no-op promise.
64
+ */
65
+ export declare const noopAsyncSingletonPromise: Promise<void>;
66
+ /**
67
+ * A function that does nothing.
68
+ *
69
+ * @returns A promise that resolves when the function is complete.
70
+ */
71
+ export declare function noopAsync(): Promise<void>;
72
+ /**
73
+ * Makes an async function that calls the original async function with the provided arguments and omits the return value.
74
+ *
75
+ * @typeParam Arguments - Arguments to be passed to the function.
76
+ * @param $function - Function to be called.
77
+ * @returns An async function that calls the original function with the provided arguments and omits the return value.
78
+ */
79
+ export declare function omitAsyncReturnType<Arguments extends unknown[]>($function: GenericAsyncFunction<Arguments>): GenericAsyncVoidFunction<Arguments>;
80
+ type ArgumentNamesOf<T extends GenericFunction> = MapToArgumentNames<Parameters<T>>;
81
+ interface CreateFunctionArgumentlessParams {
82
+ readonly functionBody: string;
83
+ }
84
+ interface CreateFunctionParams<TFunction extends GenericFunction> extends CreateFunctionArgumentlessParams {
85
+ readonly argumentNames: ArgumentNamesOf<TFunction>;
86
+ }
87
+ type MapToArgumentNames<TArguments extends readonly unknown[]> = {
88
+ readonly [K in keyof TArguments]: string;
89
+ };
90
+ /**
91
+ * Clone a function by creating a new function that calls the original function.
92
+ *
93
+ * This is useful for creating a new instance of a function that has the same behavior but is not strictly equal to the original function.
94
+ *
95
+ * @typeParam TFunction - The type of the function to clone.
96
+ * @param $function - The function to clone.
97
+ * @returns A new function that has the same behavior as the original function.
98
+ */
99
+ export declare function cloneFunction<TFunction extends GenericFunction>($function: TFunction): TFunction;
100
+ /**
101
+ * Creates a function from the provided parameters.
102
+ *
103
+ * Function is argumentless, so `argNames` is not needed.
104
+ *
105
+ * @typeParam TFunction - The type of the function to create.
106
+ * @param params - The parameters to create the function with.
107
+ * @returns A function created from the provided parameters.
108
+ */
109
+ export declare function createFunction<TFunction extends () => unknown>(params: CreateFunctionArgumentlessParams): TFunction;
110
+ /**
111
+ * Creates a function from the provided parameters.
112
+ *
113
+ * Function has arguments, so `argNames` is required.
114
+ *
115
+ * @typeParam TFunction - The type of the function to create.
116
+ * @param params - The parameters to create the function with.
117
+ * @returns A function created from the provided parameters.
118
+ */
119
+ export declare function createFunction<TFunction extends GenericFunction>(params: CreateFunctionParams<TFunction>): TFunction;
120
+ /**
121
+ * Makes a function that calls the original function with the provided arguments and omits the return value.
122
+ *
123
+ * @typeParam Arguments - Arguments to be passed to the function.
124
+ * @param $function - Function to be called.
125
+ * @returns A function that calls the original function with the provided arguments and omits the return value.
126
+ */
127
+ export declare function omitReturnType<Arguments extends unknown[]>($function: GenericFunction<Arguments>): GenericVoidFunction<Arguments>;
128
+ export {};
@@ -0,0 +1,283 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ "use strict";
7
+ var __defProp = Object.defineProperty;
8
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
9
+ var __getOwnPropNames = Object.getOwnPropertyNames;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __export = (target, all) => {
12
+ for (var name in all)
13
+ __defProp(target, name, { get: all[name], enumerable: true });
14
+ };
15
+ var __copyProps = (to, from, except, desc) => {
16
+ if (from && typeof from === "object" || typeof from === "function") {
17
+ for (let key of __getOwnPropNames(from))
18
+ if (!__hasOwnProp.call(to, key) && key !== except)
19
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
20
+ }
21
+ return to;
22
+ };
23
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
24
+ var html_element_exports = {};
25
+ __export(html_element_exports, {
26
+ createDivAsync: () => createDivAsync,
27
+ createElAsync: () => createElAsync,
28
+ createFragmentAsync: () => createFragmentAsync,
29
+ createSpanAsync: () => createSpanAsync,
30
+ createSvgAsync: () => createSvgAsync,
31
+ ensureLoaded: () => ensureLoaded,
32
+ getDocumentWindow: () => getDocumentWindow,
33
+ getZIndex: () => getZIndex,
34
+ isElementVisibleInOffsetParent: () => isElementVisibleInOffsetParent,
35
+ isLoaded: () => isLoaded,
36
+ onAncestorScrollOrResize: () => onAncestorScrollOrResize,
37
+ toPx: () => toPx,
38
+ waitUntilConnected: () => waitUntilConnected
39
+ });
40
+ module.exports = __toCommonJS(html_element_exports);
41
+ var import_disposable = require('./disposable.cjs');
42
+ var import_type_guards = require('./type-guards.cjs');
43
+ const SVG_NAMESPACE = "http://www.w3.org/2000/svg";
44
+ async function createDivAsync(o, callback) {
45
+ const div = createHtmlElement("div", o);
46
+ await callback?.(div);
47
+ return div;
48
+ }
49
+ async function createElAsync(tag, o, callback) {
50
+ const element = createHtmlElement(tag, o);
51
+ await callback?.(element);
52
+ return element;
53
+ }
54
+ async function createFragmentAsync(callback) {
55
+ const fragment = document.createDocumentFragment();
56
+ await callback?.(fragment);
57
+ return fragment;
58
+ }
59
+ async function createSpanAsync(o, callback) {
60
+ const span = createHtmlElement("span", o);
61
+ await callback?.(span);
62
+ return span;
63
+ }
64
+ async function createSvgAsync(tag, o, callback) {
65
+ const svg = createSvgElement(tag, o);
66
+ await callback?.(svg);
67
+ return svg;
68
+ }
69
+ async function ensureLoaded(element) {
70
+ if (isLoaded(element)) {
71
+ return;
72
+ }
73
+ const win = getNodeWindow(element);
74
+ if (isInstanceOf(element, win.HTMLBodyElement) || isInstanceOf(element, win.HTMLImageElement) || isInstanceOf(element, win.HTMLIFrameElement) || isInstanceOf(element, win.HTMLEmbedElement) || isInstanceOf(element, win.HTMLLinkElement) || isInstanceOf(element, win.HTMLObjectElement) || isInstanceOf(element, win.HTMLStyleElement) || isInstanceOf(element, win.HTMLTrackElement)) {
75
+ await new Promise((resolve) => {
76
+ element.addEventListener("load", resolve);
77
+ element.addEventListener("error", resolve);
78
+ });
79
+ return;
80
+ }
81
+ await Promise.all(getLoadableElements(element).map((loadableElement) => ensureLoaded(loadableElement)));
82
+ }
83
+ function getDocumentWindow(doc) {
84
+ return (0, import_type_guards.ensureNonNullable)(doc.defaultView, "The document has no window");
85
+ }
86
+ function getZIndex(element) {
87
+ let element2 = element;
88
+ while (element2) {
89
+ const zIndexString = getComputedStyle(element2).zIndex;
90
+ const zIndex = Number.parseInt(zIndexString, 10);
91
+ if (!Number.isNaN(zIndex)) {
92
+ return zIndex;
93
+ }
94
+ element2 = element2.parentElement;
95
+ }
96
+ return 0;
97
+ }
98
+ function isElementVisibleInOffsetParent(element) {
99
+ const parentElement = element.offsetParent;
100
+ if (!parentElement) {
101
+ return false;
102
+ }
103
+ const elementRect = element.getBoundingClientRect();
104
+ const parentElementRect = parentElement.getBoundingClientRect();
105
+ return parentElementRect.top <= elementRect.top && elementRect.bottom <= parentElementRect.bottom && parentElementRect.left <= elementRect.left && elementRect.right <= parentElementRect.right;
106
+ }
107
+ function isLoaded(element) {
108
+ const win = getNodeWindow(element);
109
+ if (isInstanceOf(element, win.HTMLBodyElement)) {
110
+ const readyState = element.ownerDocument.readyState;
111
+ return readyState === "complete" || readyState === "interactive";
112
+ }
113
+ if (isInstanceOf(element, win.HTMLImageElement)) {
114
+ return element.complete && element.naturalWidth > 0;
115
+ }
116
+ if (isInstanceOf(element, win.HTMLIFrameElement)) {
117
+ return !!element.contentDocument;
118
+ }
119
+ if (isInstanceOf(element, win.HTMLEmbedElement)) {
120
+ return !!element.getSVGDocument();
121
+ }
122
+ if (isInstanceOf(element, win.HTMLLinkElement)) {
123
+ return element.rel !== "stylesheet" || element.sheet !== null;
124
+ }
125
+ if (isInstanceOf(element, win.HTMLObjectElement)) {
126
+ return !!element.contentDocument || !!element.getSVGDocument();
127
+ }
128
+ if (isInstanceOf(element, win.HTMLScriptElement)) {
129
+ return true;
130
+ }
131
+ if (isInstanceOf(element, win.HTMLStyleElement)) {
132
+ return !!element.sheet;
133
+ }
134
+ if (isInstanceOf(element, win.HTMLTrackElement)) {
135
+ const READY_STATE_LOADED = 2;
136
+ return element.readyState === READY_STATE_LOADED;
137
+ }
138
+ return getLoadableElements(element).every((loadableElement) => isLoaded(loadableElement));
139
+ }
140
+ function onAncestorScrollOrResize(node, callback) {
141
+ const win = getNodeWindow(node);
142
+ const ancestors = [node.ownerDocument ?? win.document, win];
143
+ let currentNode = node;
144
+ while (currentNode) {
145
+ ancestors.push(currentNode);
146
+ currentNode = currentNode.parentNode;
147
+ }
148
+ let isEventTriggered = false;
149
+ for (const ancestor of ancestors) {
150
+ ancestor.addEventListener("scroll", callbackSmooth, { capture: true });
151
+ ancestor.addEventListener("resize", callbackSmooth, { capture: true });
152
+ }
153
+ return new import_disposable.CallbackDisposable({
154
+ callback: () => {
155
+ for (const ancestor of ancestors) {
156
+ ancestor.removeEventListener("scroll", callbackSmooth, { capture: true });
157
+ ancestor.removeEventListener("resize", callbackSmooth, { capture: true });
158
+ }
159
+ }
160
+ });
161
+ function callbackSmooth() {
162
+ if (isEventTriggered) {
163
+ return;
164
+ }
165
+ isEventTriggered = true;
166
+ win.requestAnimationFrame(() => {
167
+ try {
168
+ callback();
169
+ } finally {
170
+ isEventTriggered = false;
171
+ }
172
+ });
173
+ }
174
+ }
175
+ function toPx(value) {
176
+ return `${String(value)}px`;
177
+ }
178
+ function waitUntilConnected(element) {
179
+ return new Promise((resolve) => {
180
+ if (element.isConnected) {
181
+ resolve();
182
+ return;
183
+ }
184
+ const ownerDocument = element.ownerDocument;
185
+ const observer = new (getNodeWindow(element)).MutationObserver(() => {
186
+ if (!element.isConnected) {
187
+ return;
188
+ }
189
+ observer.disconnect();
190
+ resolve();
191
+ });
192
+ observer.observe(ownerDocument, { childList: true, subtree: true });
193
+ });
194
+ }
195
+ function applyDomElementInfo(element, o) {
196
+ const info = typeof o === "string" ? { cls: o } : o ?? {};
197
+ if (info.cls !== void 0) {
198
+ element.className = Array.isArray(info.cls) ? info.cls.join(" ") : info.cls;
199
+ }
200
+ if (info.text !== void 0) {
201
+ setElementText(element, info.text);
202
+ }
203
+ if (info.attr) {
204
+ setElementAttributes(element, info.attr);
205
+ }
206
+ if (info.title !== void 0) {
207
+ element.title = info.title;
208
+ }
209
+ insertIntoParent(element, info);
210
+ }
211
+ function createHtmlElement(tag, o) {
212
+ const element = document.createElement(tag);
213
+ applyDomElementInfo(element, o);
214
+ return element;
215
+ }
216
+ function createSvgElement(tag, o) {
217
+ const svg = document.createElementNS(SVG_NAMESPACE, tag);
218
+ const info = typeof o === "string" ? { cls: o } : o ?? {};
219
+ if (info.cls !== void 0) {
220
+ if (Array.isArray(info.cls)) {
221
+ svg.classList.add(...info.cls);
222
+ } else {
223
+ svg.classList.add(info.cls);
224
+ }
225
+ }
226
+ if (info.attr) {
227
+ setElementAttributes(svg, info.attr);
228
+ }
229
+ insertIntoParent(svg, info);
230
+ return svg;
231
+ }
232
+ function getLoadableElements(element) {
233
+ return [...element.querySelectorAll("body, img, iframe, embed, link, object, script, style, track")];
234
+ }
235
+ function getNodeWindow(node) {
236
+ return node.ownerDocument?.defaultView ?? window;
237
+ }
238
+ function insertIntoParent(element, info) {
239
+ if (!info.parent) {
240
+ return;
241
+ }
242
+ if (info.prepend) {
243
+ info.parent.insertBefore(element, info.parent.firstChild);
244
+ } else {
245
+ info.parent.appendChild(element);
246
+ }
247
+ }
248
+ function isInstanceOf(node, ctor) {
249
+ return node instanceof ctor;
250
+ }
251
+ function setElementAttributes(element, attribute) {
252
+ for (const [name, value] of Object.entries(attribute)) {
253
+ if (value === null) {
254
+ element.removeAttribute(name);
255
+ } else {
256
+ element.setAttribute(name, String(value));
257
+ }
258
+ }
259
+ }
260
+ function setElementText(element, text) {
261
+ if (text instanceof DocumentFragment) {
262
+ element.replaceChildren(text);
263
+ } else {
264
+ element.textContent = text;
265
+ }
266
+ }
267
+ // Annotate the CommonJS export names for ESM import in node:
268
+ 0 && (module.exports = {
269
+ createDivAsync,
270
+ createElAsync,
271
+ createFragmentAsync,
272
+ createSpanAsync,
273
+ createSvgAsync,
274
+ ensureLoaded,
275
+ getDocumentWindow,
276
+ getZIndex,
277
+ isElementVisibleInOffsetParent,
278
+ isLoaded,
279
+ onAncestorScrollOrResize,
280
+ toPx,
281
+ waitUntilConnected
282
+ });
283
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2h0bWwtZWxlbWVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE9ic2lkaWFuLXJ1bnRpbWUtYWdub3N0aWMgaGVscGVycyBmb3Igd29ya2luZyB3aXRoIEhUTUwgZWxlbWVudHMuXG4gKlxuICogU2V2ZXJhbCBoZWxwZXJzIGhlcmUgbWlycm9yIGJlaGF2aW9yIHRoYXQgdGhlIE9ic2lkaWFuIHJ1bnRpbWUgaW5qZWN0cyBvbnRvIHRoZSBET00gcHJvdG90eXBlc1xuICogKGBjcmVhdGVFbGAvYGNyZWF0ZURpdmAvYGNyZWF0ZVNwYW5gL2BjcmVhdGVTdmdgL2BjcmVhdGVGcmFnbWVudGAsIGBOb2RlLnByb3RvdHlwZS5pbnN0YW5jZU9mYCxcbiAqIGBFbGVtZW50LnByb3RvdHlwZS5zZXRUZXh0YC9gc2V0QXR0cnNgKS4gVG8gc3RheSBpbmRlcGVuZGVudCBvZiB0aGUgT2JzaWRpYW4gcnVudGltZSwgdGhhdCBiZWhhdmlvclxuICogaXMgcmVpbXBsZW1lbnRlZCBoZXJlIGluIHN0YW5kYXJkIERPTSwgcG9ydGVkIGZyb20gT2JzaWRpYW4ncyBvd24gaW1wbGVtZW50YXRpb24gaW5cbiAqIGBvYnNpZGlhbi5hc2FyL2VuaGFuY2UuanNgLiBTZWUgdGhlIGBvYnNpZGlhbi12ZXJzaW9uc2AgcHJvamVjdDsgcmV2YWxpZGF0ZSB0aGUgcG9ydCB3aGVuIE9ic2lkaWFuXG4gKiBjaGFuZ2VzIGBlbmhhbmNlLmpzYCAodGhlcmUgaXMgYSByZW1pbmRlciBpbiBgQ0xBVURFLm1kYCkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgQ2FsbGJhY2tEaXNwb3NhYmxlIH0gZnJvbSAnLi9kaXNwb3NhYmxlLnRzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnLi90eXBlLWd1YXJkcy50cyc7XG5cbmNvbnN0IFNWR19OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xuXG4vKipcbiAqIFRoZSBlbGVtZW50IGluZm9ybWF0aW9uIHtAbGluayBjcmVhdGVFbEFzeW5jfSBhbmQgaXRzIHNpYmxpbmdzIGFwcGx5OiB0aGUgZWxlbWVudC10eXBlLWFnbm9zdGljIHN1YnNldCBvZlxuICogT2JzaWRpYW4ncyBgRG9tRWxlbWVudEluZm9gLCBkZWNsYXJlZCBoZXJlIHNvIHRoaXMgbW9kdWxlIG5lZWRzIG5vIE9ic2lkaWFuIHR5cGluZ3MuIEFuIE9ic2lkaWFuXG4gKiBgRG9tRWxlbWVudEluZm9gIHZhbHVlIGlzIGFzc2lnbmFibGUgdG8gaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlSHRtbEVsZW1lbnRJbmZvIHtcbiAgLyoqXG4gICAqIFRoZSBhdHRyaWJ1dGVzIHRvIHNldDsgYG51bGxgIHJlbW92ZXMgdGhlIGF0dHJpYnV0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGF0dHI/OiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwgbnVsbCB8IG51bWJlciB8IHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFRoZSBDU1MgY2xhc3Mgb3IgY2xhc3Nlcy5cbiAgICovXG4gIHJlYWRvbmx5IGNscz86IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFyZW50IHRvIGluc2VydCB0aGUgZWxlbWVudCBpbnRvLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50PzogTm9kZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbnNlcnQgdGhlIGVsZW1lbnQgYXMgdGhlIHBhcmVudCdzIGZpcnN0IGNoaWxkIGluc3RlYWQgb2YgaXRzIGxhc3QuXG4gICAqL1xuICByZWFkb25seSBwcmVwZW5kPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHRleHQgY29udGVudC5cbiAgICovXG4gIHJlYWRvbmx5IHRleHQ/OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdG9vbHRpcCB0ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgdGl0bGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIFNWRyBlbGVtZW50IGluZm9ybWF0aW9uIHtAbGluayBjcmVhdGVTdmdBc3luY30gYXBwbGllczogdGhlIHN1YnNldCBvZiBPYnNpZGlhbidzIGBTdmdFbGVtZW50SW5mb2AgaXRcbiAqIHN1cHBvcnRzLCBkZWNsYXJlZCBoZXJlIHNvIHRoaXMgbW9kdWxlIG5lZWRzIG5vIE9ic2lkaWFuIHR5cGluZ3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlU3ZnRWxlbWVudEluZm8ge1xuICAvKipcbiAgICogVGhlIGF0dHJpYnV0ZXMgdG8gc2V0OyBgbnVsbGAgcmVtb3ZlcyB0aGUgYXR0cmlidXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXR0cj86IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4gfCBudWxsIHwgbnVtYmVyIHwgc3RyaW5nPjtcblxuICAvKipcbiAgICogVGhlIENTUyBjbGFzcyBvciBjbGFzc2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgY2xzPzogc3RyaW5nIHwgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJlbnQgdG8gaW5zZXJ0IHRoZSBlbGVtZW50IGludG8uXG4gICAqL1xuICByZWFkb25seSBwYXJlbnQ/OiBOb2RlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluc2VydCB0aGUgZWxlbWVudCBhcyB0aGUgcGFyZW50J3MgZmlyc3QgY2hpbGQgaW5zdGVhZCBvZiBpdHMgbGFzdC5cbiAgICovXG4gIHJlYWRvbmx5IHByZXBlbmQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgSFRNTCBlbGVtZW50IHRoYXQgY2FuIGJlIHZhbGlkYXRlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0b3JFbGVtZW50IGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICAvKipcbiAgICogQ2hlY2tzIHRoZSB2YWxpZGl0eSBvZiB0aGUgZWxlbWVudC5cbiAgICpcbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBlbGVtZW50IGlzIHZhbGlkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIGNoZWNrVmFsaWRpdHk6ICgpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgdGhlIHZhbGlkaXR5IG9mIHRoZSBlbGVtZW50LlxuICAgKi9cbiAgcmVwb3J0VmFsaWRpdHk6ICgpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgYSBjdXN0b20gZXJyb3IgbWVzc2FnZSBvbiB0aGUgZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIG1lc3NhZ2UgdG8gc2V0IG9uIHRoZSBlbGVtZW50LlxuICAgKi9cbiAgc2V0Q3VzdG9tVmFsaWRpdHk6IChlcnJvcjogc3RyaW5nKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBbiBlcnJvciBtZXNzYWdlIG9mIHRoZSBlbGVtZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsaWRhdGlvbk1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGl2IGFzeW5jaHJvbm91c2x5LlxuICpcbiAqIEBwYXJhbSBvIC0gVGhlIGVsZW1lbnQgaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBkaXYgaXMgY3JlYXRlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRpdi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURpdkFzeW5jKFxuICBvPzogQ3JlYXRlSHRtbEVsZW1lbnRJbmZvIHwgc3RyaW5nLFxuICBjYWxsYmFjaz86IChlbGVtZW50OiBIVE1MRGl2RWxlbWVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPlxuKTogUHJvbWlzZTxIVE1MRGl2RWxlbWVudD4ge1xuICBjb25zdCBkaXYgPSBjcmVhdGVIdG1sRWxlbWVudCgnZGl2Jywgbyk7XG4gIGF3YWl0IGNhbGxiYWNrPy4oZGl2KTtcbiAgcmV0dXJuIGRpdjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVsZW1lbnQgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQHR5cGVQYXJhbSBLIC0gVGhlIHRhZyBuYW1lIGtleSBmcm9tIGBIVE1MRWxlbWVudFRhZ05hbWVNYXBgLlxuICogQHBhcmFtIHRhZyAtIFRoZSB0YWcgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBjcmVhdGUuXG4gKiBAcGFyYW0gbyAtIFRoZSBlbGVtZW50IGluZm9ybWF0aW9uLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZWxlbWVudCBpcyBjcmVhdGVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZWxlbWVudC5cbiAqIEByZW1hcmtzIE5vdCByZWZhY3RvcmVkIHRvIHBhcmFtZXRlci1vYmplY3QgcGF0dGVybiwgdG8ga2VlcCB0aGUgcGFyaXR5IHdpdGggT2JzaWRpYW4ncyBgY3JlYXRlRWxgIChvciBjcmVhdGVTdmcsIGNvcnJlc3BvbmRpbmdseSkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVFbEFzeW5jPEsgZXh0ZW5kcyBrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXA+KFxuICB0YWc6IEssXG4gIG8/OiBDcmVhdGVIdG1sRWxlbWVudEluZm8gfCBzdHJpbmcsXG4gIGNhbGxiYWNrPzogKGVsZW1lbnQ6IEhUTUxFbGVtZW50VGFnTmFtZU1hcFtLXSkgPT4gUHJvbWlzYWJsZTx2b2lkPlxuKTogUHJvbWlzZTxIVE1MRWxlbWVudFRhZ05hbWVNYXBbS10+IHtcbiAgY29uc3QgZWxlbWVudCA9IGNyZWF0ZUh0bWxFbGVtZW50KHRhZywgbyk7XG4gIGF3YWl0IGNhbGxiYWNrPy4oZWxlbWVudCk7XG4gIHJldHVybiBlbGVtZW50O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBEb2N1bWVudEZyYWdtZW50IGFzeW5jaHJvbm91c2x5LlxuICpcbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIERvY3VtZW50RnJhZ21lbnQgaXMgY3JlYXRlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIERvY3VtZW50RnJhZ21lbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVGcmFnbWVudEFzeW5jKGNhbGxiYWNrPzogKGVsZW1lbnQ6IERvY3VtZW50RnJhZ21lbnQpID0+IFByb21pc2FibGU8dm9pZD4pOiBQcm9taXNlPERvY3VtZW50RnJhZ21lbnQ+IHtcbiAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gIGF3YWl0IGNhbGxiYWNrPy4oZnJhZ21lbnQpO1xuICByZXR1cm4gZnJhZ21lbnQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNwYW4gYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQHBhcmFtIG8gLSBUaGUgZWxlbWVudCBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHNwYW4gaXMgY3JlYXRlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHNwYW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTcGFuQXN5bmMoXG4gIG8/OiBDcmVhdGVIdG1sRWxlbWVudEluZm8gfCBzdHJpbmcsXG4gIGNhbGxiYWNrPzogKGVsZW1lbnQ6IEhUTUxTcGFuRWxlbWVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPlxuKTogUHJvbWlzZTxIVE1MU3BhbkVsZW1lbnQ+IHtcbiAgY29uc3Qgc3BhbiA9IGNyZWF0ZUh0bWxFbGVtZW50KCdzcGFuJywgbyk7XG4gIGF3YWl0IGNhbGxiYWNrPy4oc3Bhbik7XG4gIHJldHVybiBzcGFuO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdmcgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogQHR5cGVQYXJhbSBLIC0gVGhlIHRhZyBuYW1lIGtleSBmcm9tIGBTVkdFbGVtZW50VGFnTmFtZU1hcGAuXG4gKiBAcGFyYW0gdGFnIC0gVGhlIHRhZyBuYW1lIG9mIHRoZSBzdmcgdG8gY3JlYXRlLlxuICogQHBhcmFtIG8gLSBUaGUgc3ZnIGluZm9ybWF0aW9uLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgc3ZnIGlzIGNyZWF0ZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBzdmcuXG4gKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIE9ic2lkaWFuJ3MgYGNyZWF0ZVN2Z2AgKG9yIGNyZWF0ZUVsLCBjb3JyZXNwb25kaW5nbHkpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlU3ZnQXN5bmM8SyBleHRlbmRzIGtleW9mIFNWR0VsZW1lbnRUYWdOYW1lTWFwPihcbiAgdGFnOiBLLFxuICBvPzogQ3JlYXRlU3ZnRWxlbWVudEluZm8gfCBzdHJpbmcsXG4gIGNhbGxiYWNrPzogKGVsZW1lbnQ6IFNWR0VsZW1lbnRUYWdOYW1lTWFwW0tdKSA9PiBQcm9taXNhYmxlPHZvaWQ+XG4pOiBQcm9taXNlPFNWR0VsZW1lbnRUYWdOYW1lTWFwW0tdPiB7XG4gIGNvbnN0IHN2ZyA9IGNyZWF0ZVN2Z0VsZW1lbnQodGFnLCBvKTtcbiAgYXdhaXQgY2FsbGJhY2s/LihzdmcpO1xuICByZXR1cm4gc3ZnO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBsb2FkZWQuXG4gKlxuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBlbnN1cmUgaXMgbG9hZGVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBlbGVtZW50IGlzIGxvYWRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUxvYWRlZChlbGVtZW50OiBFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChpc0xvYWRlZChlbGVtZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB3aW4gPSBnZXROb2RlV2luZG93KGVsZW1lbnQpO1xuICBpZiAoXG4gICAgaXNJbnN0YW5jZU9mKGVsZW1lbnQsIHdpbi5IVE1MQm9keUVsZW1lbnQpXG4gICAgfHwgaXNJbnN0YW5jZU9mKGVsZW1lbnQsIHdpbi5IVE1MSW1hZ2VFbGVtZW50KVxuICAgIHx8IGlzSW5zdGFuY2VPZihlbGVtZW50LCB3aW4uSFRNTElGcmFtZUVsZW1lbnQpXG4gICAgfHwgaXNJbnN0YW5jZU9mKGVsZW1lbnQsIHdpbi5IVE1MRW1iZWRFbGVtZW50KVxuICAgIHx8IGlzSW5zdGFuY2VPZihlbGVtZW50LCB3aW4uSFRNTExpbmtFbGVtZW50KVxuICAgIHx8IGlzSW5zdGFuY2VPZihlbGVtZW50LCB3aW4uSFRNTE9iamVjdEVsZW1lbnQpXG4gICAgfHwgaXNJbnN0YW5jZU9mKGVsZW1lbnQsIHdpbi5IVE1MU3R5bGVFbGVtZW50KVxuICAgIHx8IGlzSW5zdGFuY2VPZihlbGVtZW50LCB3aW4uSFRNTFRyYWNrRWxlbWVudClcbiAgKSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHJlc29sdmUpO1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIHJlc29sdmUpO1xuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IFByb21pc2UuYWxsKGdldExvYWRhYmxlRWxlbWVudHMoZWxlbWVudCkubWFwKChsb2FkYWJsZUVsZW1lbnQpID0+IGVuc3VyZUxvYWRlZChsb2FkYWJsZUVsZW1lbnQpKSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgd2luZG93IGEgZG9jdW1lbnQgYmVsb25ncyB0by5cbiAqXG4gKiBBIGRvY3VtZW50IGlzIHRoZSBvbmUgbm9kZSB3aG9zZSBgb3duZXJEb2N1bWVudGAgaXMgYG51bGxgLCBzbyB0aGUgYG93bmVyRG9jdW1lbnRgLWNoYXNpbmcgbG9va3VwXG4gKiB1c2VkIGZvciBvcmRpbmFyeSBub2RlcyByZXNvbHZlcyBhIGRvY3VtZW50IHRvIHRoZSB3cm9uZyB3aW5kb3cuIFJlYWRpbmcgYGRlZmF1bHRWaWV3YCBvZmYgdGhlXG4gKiBkb2N1bWVudCBpdHNlbGYgaXMgd2hhdCBrZWVwcyBhIHBvcC1vdXQgd2luZG93J3MgY29vcmRpbmF0ZXMgbWVhc3VyZWQgYWdhaW5zdCB0aGF0IHdpbmRvdy5cbiAqXG4gKiBAcGFyYW0gZG9jIC0gVGhlIGRvY3VtZW50IHRvIGdldCB0aGUgd2luZG93IG9mLlxuICogQHJldHVybnMgVGhlIHdpbmRvdyB0aGUgZG9jdW1lbnQgYmVsb25ncyB0by5cbiAqIEB0aHJvd3MgQW4ge0BsaW5rIEVycm9yfSBpZiB0aGUgZG9jdW1lbnQgaXMgZGV0YWNoZWQgYW5kIHRoZXJlZm9yZSBoYXMgbm8gd2luZG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RG9jdW1lbnRXaW5kb3coZG9jOiBEb2N1bWVudCk6IFdpbmRvdyB7XG4gIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZShkb2MuZGVmYXVsdFZpZXcsICdUaGUgZG9jdW1lbnQgaGFzIG5vIHdpbmRvdycpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHotaW5kZXggb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBnZXQgdGhlIHotaW5kZXggb2YuXG4gKiBAcmV0dXJucyBUaGUgei1pbmRleCBvZiB0aGUgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFpJbmRleChlbGVtZW50OiBFbGVtZW50KTogbnVtYmVyIHtcbiAgbGV0IGVsZW1lbnQyOiBFbGVtZW50IHwgbnVsbCA9IGVsZW1lbnQ7XG5cbiAgd2hpbGUgKGVsZW1lbnQyKSB7XG4gICAgY29uc3QgekluZGV4U3RyaW5nID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50MikuekluZGV4O1xuICAgIGNvbnN0IHpJbmRleCA9IE51bWJlci5wYXJzZUludCh6SW5kZXhTdHJpbmcsIDEwKTtcbiAgICBpZiAoIU51bWJlci5pc05hTih6SW5kZXgpKSB7XG4gICAgICByZXR1cm4gekluZGV4O1xuICAgIH1cbiAgICBlbGVtZW50MiA9IGVsZW1lbnQyLnBhcmVudEVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBpbiB0aGUgb2Zmc2V0IHBhcmVudC5cbiAqXG4gKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gdGhlIG9mZnNldCBwYXJlbnQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbGVtZW50VmlzaWJsZUluT2Zmc2V0UGFyZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcmVudEVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDtcbiAgaWYgKCFwYXJlbnRFbGVtZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZWxlbWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCBwYXJlbnRFbGVtZW50UmVjdCA9IHBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgcmV0dXJuIChcbiAgICBwYXJlbnRFbGVtZW50UmVjdC50b3AgPD0gZWxlbWVudFJlY3QudG9wXG4gICAgJiYgZWxlbWVudFJlY3QuYm90dG9tIDw9IHBhcmVudEVsZW1lbnRSZWN0LmJvdHRvbVxuICAgICYmIHBhcmVudEVsZW1lbnRSZWN0LmxlZnQgPD0gZWxlbWVudFJlY3QubGVmdFxuICAgICYmIGVsZW1lbnRSZWN0LnJpZ2h0IDw9IHBhcmVudEVsZW1lbnRSZWN0LnJpZ2h0XG4gICk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBlbGVtZW50IGlzIGxvYWRlZC5cbiAqXG4gKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBlbGVtZW50IGlzIGxvYWRlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xvYWRlZChlbGVtZW50OiBFbGVtZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IHdpbiA9IGdldE5vZGVXaW5kb3coZWxlbWVudCk7XG5cbiAgaWYgKGlzSW5zdGFuY2VPZihlbGVtZW50LCB3aW4uSFRNTEJvZHlFbGVtZW50KSkge1xuICAgIGNvbnN0IHJlYWR5U3RhdGUgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQucmVhZHlTdGF0ZTtcbiAgICByZXR1cm4gcmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJyB8fCByZWFkeVN0YXRlID09PSAnaW50ZXJhY3RpdmUnO1xuICB9XG5cbiAgaWYgKGlzSW5zdGFuY2VPZihlbGVtZW50LCB3aW4uSFRNTEltYWdlRWxlbWVudCkpIHtcbiAgICByZXR1cm4gZWxlbWVudC5jb21wbGV0ZSAmJiBlbGVtZW50Lm5hdHVyYWxXaWR0aCA+IDA7XG4gIH1cblxuICBpZiAoaXNJbnN0YW5jZU9mKGVsZW1lbnQsIHdpbi5IVE1MSUZyYW1lRWxlbWVudCkpIHtcbiAgICByZXR1cm4gISFlbGVtZW50LmNvbnRlbnREb2N1bWVudDtcbiAgfVxuXG4gIGlmIChpc0luc3RhbmNlT2YoZWxlbWVudCwgd2luLkhUTUxFbWJlZEVsZW1lbnQpKSB7XG4gICAgcmV0dXJuICEhZWxlbWVudC5nZXRTVkdEb2N1bWVudCgpO1xuICB9XG5cbiAgaWYgKGlzSW5zdGFuY2VPZihlbGVtZW50LCB3aW4uSFRNTExpbmtFbGVtZW50KSkge1xuICAgIHJldHVybiBlbGVtZW50LnJlbCAhPT0gJ3N0eWxlc2hlZXQnIHx8IGVsZW1lbnQuc2hlZXQgIT09IG51bGw7XG4gIH1cblxuICBpZiAoaXNJbnN0YW5jZU9mKGVsZW1lbnQsIHdpbi5IVE1MT2JqZWN0RWxlbWVudCkpIHtcbiAgICByZXR1cm4gISFlbGVtZW50LmNvbnRlbnREb2N1bWVudCB8fCAhIWVsZW1lbnQuZ2V0U1ZHRG9jdW1lbnQoKTtcbiAgfVxuXG4gIGlmIChpc0luc3RhbmNlT2YoZWxlbWVudCwgd2luLkhUTUxTY3JpcHRFbGVtZW50KSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGlzSW5zdGFuY2VPZihlbGVtZW50LCB3aW4uSFRNTFN0eWxlRWxlbWVudCkpIHtcbiAgICByZXR1cm4gISFlbGVtZW50LnNoZWV0O1xuICB9XG5cbiAgaWYgKGlzSW5zdGFuY2VPZihlbGVtZW50LCB3aW4uSFRNTFRyYWNrRWxlbWVudCkpIHtcbiAgICBjb25zdCBSRUFEWV9TVEFURV9MT0FERUQgPSAyO1xuICAgIHJldHVybiBlbGVtZW50LnJlYWR5U3RhdGUgPT09IFJFQURZX1NUQVRFX0xPQURFRDtcbiAgfVxuXG4gIHJldHVybiBnZXRMb2FkYWJsZUVsZW1lbnRzKGVsZW1lbnQpLmV2ZXJ5KChsb2FkYWJsZUVsZW1lbnQpID0+IGlzTG9hZGVkKGxvYWRhYmxlRWxlbWVudCkpO1xufVxuXG4vKipcbiAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGFuY2VzdG9yIG5vZGVzIG9mIHRoZSBnaXZlbiBub2RlLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gYWRkIHRoZSBldmVudCBsaXN0ZW5lciB0by5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgcmVtb3ZlcyB0aGUgZXZlbnQgbGlzdGVuZXJzIHdoZW4gZGlzcG9zZWQsIGZvciB1c2Ugd2l0aCBgdXNpbmdgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb25BbmNlc3RvclNjcm9sbE9yUmVzaXplKG5vZGU6IE5vZGUsIGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogRGlzcG9zYWJsZSB7XG4gIGNvbnN0IHdpbiA9IGdldE5vZGVXaW5kb3cobm9kZSk7XG4gIGNvbnN0IGFuY2VzdG9yczogRXZlbnRUYXJnZXRbXSA9IFtub2RlLm93bmVyRG9jdW1lbnQgPz8gd2luLmRvY3VtZW50LCB3aW5dO1xuXG4gIGxldCBjdXJyZW50Tm9kZTogTm9kZSB8IG51bGwgPSBub2RlO1xuXG4gIHdoaWxlIChjdXJyZW50Tm9kZSkge1xuICAgIGFuY2VzdG9ycy5wdXNoKGN1cnJlbnROb2RlKTtcbiAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gIH1cblxuICBsZXQgaXNFdmVudFRyaWdnZXJlZCA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgYW5jZXN0b3Igb2YgYW5jZXN0b3JzKSB7XG4gICAgYW5jZXN0b3IuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgY2FsbGJhY2tTbW9vdGgsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICBhbmNlc3Rvci5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBjYWxsYmFja1Ntb290aCwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBDYWxsYmFja0Rpc3Bvc2FibGUoe1xuICAgIGNhbGxiYWNrOiAoKTogdm9pZCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGFuY2VzdG9yIG9mIGFuY2VzdG9ycykge1xuICAgICAgICBhbmNlc3Rvci5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBjYWxsYmFja1Ntb290aCwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgICAgICBhbmNlc3Rvci5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBjYWxsYmFja1Ntb290aCwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gY2FsbGJhY2tTbW9vdGgoKTogdm9pZCB7XG4gICAgaWYgKGlzRXZlbnRUcmlnZ2VyZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpc0V2ZW50VHJpZ2dlcmVkID0gdHJ1ZTtcblxuICAgIHdpbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlzRXZlbnRUcmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbnVtYmVyIHRvIGEgc3RyaW5nIHdpdGggJ3B4JyBhcHBlbmRlZC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgbnVtYmVyIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyIGFzIGEgc3RyaW5nIHdpdGggJ3B4JyBhcHBlbmRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUHgodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtTdHJpbmcodmFsdWUpfXB4YDtcbn1cblxuLyoqXG4gKiBXYWl0cyB1bnRpbCB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlIERPTS5cbiAqXG4gKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIGNoZWNrLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YWl0VW50aWxDb25uZWN0ZWQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgaWYgKGVsZW1lbnQuaXNDb25uZWN0ZWQpIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPYnNpZGlhbidzIGBlbC5vbk5vZGVJbnNlcnRlZGAgdXNlcyBhIGBub2RlLWluc2VydGVkYCBDU1Mga2V5ZnJhbWUgZnJvbSBPYnNpZGlhbidzIHN0eWxlc2hlZXQuXG4gICAgLy8gVGhlIGFnbm9zdGljIGVxdWl2YWxlbnQgaW5zdGVhZCBvYnNlcnZlcyB0aGUgZWxlbWVudCdzIGRvY3VtZW50IGZvciBpdCBiZWNvbWluZyBjb25uZWN0ZWQuXG4gICAgY29uc3Qgb3duZXJEb2N1bWVudCA9IGVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyAoZ2V0Tm9kZVdpbmRvdyhlbGVtZW50KSkuTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XG4gICAgICBpZiAoIWVsZW1lbnQuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShvd25lckRvY3VtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQXBwbGllcyB0aGUgZWxlbWVudC10eXBlLWFnbm9zdGljIHN1YnNldCBvZiBPYnNpZGlhbidzIGBEb21FbGVtZW50SW5mb2AgdGhhdCBpdHMgYGNyZWF0ZUVsYFxuICogc3VwcG9ydHMgXHUyMDE0IGBjbHNgLCBgdGV4dGAsIGBhdHRyYCwgYHRpdGxlYCwgYW5kIGBwYXJlbnRgL2BwcmVwZW5kYC4gVGhlIGVsZW1lbnQtdHlwZS1zcGVjaWZpY1xuICogZmllbGRzIChgdmFsdWVgLCBgdHlwZWAsIGBwbGFjZWhvbGRlcmAsIGBocmVmYCkgYW5kIHRoZSBgb24qYCBldmVudC1oYW5kbGVyIGtleXMgYXJlIGludGVudGlvbmFsbHlcbiAqIE5PVCBwb3J0ZWQgKG5vIGludGVybmFsIGNhbGxlciBuZWVkcyB0aGVtKTsgZXh0ZW5kIHRoaXMgaWYgYSBjb25zdW1lciBkb2VzIFx1MjAxNCBhbmQgcmV2YWxpZGF0ZSBhZ2FpbnN0XG4gKiBgZW5oYW5jZS5qc2AgKHNlZSB0aGUgYEBmaWxlYCBub3RlIGFuZCBgQ0xBVURFLm1kYCkuXG4gKlxuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBhcHBseSB0aGUgaW5mbyB0by5cbiAqIEBwYXJhbSBvIC0gVGhlIGVsZW1lbnQgaW5mbyAob3IgYSBiYXJlIGNsYXNzIHN0cmluZykuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5RG9tRWxlbWVudEluZm8oZWxlbWVudDogSFRNTEVsZW1lbnQsIG86IENyZWF0ZUh0bWxFbGVtZW50SW5mbyB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBjb25zdCBpbmZvOiBDcmVhdGVIdG1sRWxlbWVudEluZm8gPSB0eXBlb2YgbyA9PT0gJ3N0cmluZycgPyB7IGNsczogbyB9IDogbyA/PyB7fTtcblxuICBpZiAoaW5mby5jbHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gQXJyYXkuaXNBcnJheShpbmZvLmNscykgPyBpbmZvLmNscy5qb2luKCcgJykgOiBpbmZvLmNscztcbiAgfVxuICBpZiAoaW5mby50ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBzZXRFbGVtZW50VGV4dChlbGVtZW50LCBpbmZvLnRleHQpO1xuICB9XG4gIGlmIChpbmZvLmF0dHIpIHtcbiAgICBzZXRFbGVtZW50QXR0cmlidXRlcyhlbGVtZW50LCBpbmZvLmF0dHIpO1xuICB9XG4gIGlmIChpbmZvLnRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbGVtZW50LnRpdGxlID0gaW5mby50aXRsZTtcbiAgfVxuICBpbnNlcnRJbnRvUGFyZW50KGVsZW1lbnQsIGluZm8pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVIdG1sRWxlbWVudDxLIGV4dGVuZHMga2V5b2YgSFRNTEVsZW1lbnRUYWdOYW1lTWFwPih0YWc6IEssIG8/OiBDcmVhdGVIdG1sRWxlbWVudEluZm8gfCBzdHJpbmcpOiBIVE1MRWxlbWVudFRhZ05hbWVNYXBbS10ge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xuICBhcHBseURvbUVsZW1lbnRJbmZvKGVsZW1lbnQsIG8pO1xuICByZXR1cm4gZWxlbWVudDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3ZnRWxlbWVudDxLIGV4dGVuZHMga2V5b2YgU1ZHRWxlbWVudFRhZ05hbWVNYXA+KHRhZzogSywgbz86IENyZWF0ZVN2Z0VsZW1lbnRJbmZvIHwgc3RyaW5nKTogU1ZHRWxlbWVudFRhZ05hbWVNYXBbS10ge1xuICBjb25zdCBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05BTUVTUEFDRSwgdGFnKTtcbiAgY29uc3QgaW5mbzogQ3JlYXRlU3ZnRWxlbWVudEluZm8gPSB0eXBlb2YgbyA9PT0gJ3N0cmluZycgPyB7IGNsczogbyB9IDogbyA/PyB7fTtcblxuICBpZiAoaW5mby5jbHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGluZm8uY2xzKSkge1xuICAgICAgc3ZnLmNsYXNzTGlzdC5hZGQoLi4uaW5mby5jbHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdmcuY2xhc3NMaXN0LmFkZChpbmZvLmNscyk7XG4gICAgfVxuICB9XG4gIGlmIChpbmZvLmF0dHIpIHtcbiAgICBzZXRFbGVtZW50QXR0cmlidXRlcyhzdmcsIGluZm8uYXR0cik7XG4gIH1cbiAgaW5zZXJ0SW50b1BhcmVudChzdmcsIGluZm8pO1xuICByZXR1cm4gc3ZnO1xufVxuXG5mdW5jdGlvbiBnZXRMb2FkYWJsZUVsZW1lbnRzKGVsZW1lbnQ6IEVsZW1lbnQpOiBFbGVtZW50W10ge1xuICByZXR1cm4gWy4uLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYm9keSwgaW1nLCBpZnJhbWUsIGVtYmVkLCBsaW5rLCBvYmplY3QsIHNjcmlwdCwgc3R5bGUsIHRyYWNrJyldO1xufVxuXG5mdW5jdGlvbiBnZXROb2RlV2luZG93KG5vZGU6IE5vZGUpOiB0eXBlb2YgZ2xvYmFsVGhpcyAmIFdpbmRvdyB7XG4gIHJldHVybiBub2RlLm93bmVyRG9jdW1lbnQ/LmRlZmF1bHRWaWV3ID8/IHdpbmRvdztcbn1cblxuZnVuY3Rpb24gaW5zZXJ0SW50b1BhcmVudChlbGVtZW50OiBFbGVtZW50LCBpbmZvOiBDcmVhdGVIdG1sRWxlbWVudEluZm8gfCBDcmVhdGVTdmdFbGVtZW50SW5mbyk6IHZvaWQge1xuICBpZiAoIWluZm8ucGFyZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChpbmZvLnByZXBlbmQpIHtcbiAgICBpbmZvLnBhcmVudC5pbnNlcnRCZWZvcmUoZWxlbWVudCwgaW5mby5wYXJlbnQuZmlyc3RDaGlsZCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLWFwcGVuZCAtLSBgcGFyZW50YCBpcyBhIGBOb2RlYCwgYW5kIGBhcHBlbmRgIGlzIGRlY2xhcmVkIG9uIGBQYXJlbnROb2RlYCwgbm90IG9uIGBOb2RlYC5cbiAgICBpbmZvLnBhcmVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0luc3RhbmNlT2Y8VCBleHRlbmRzIE5vZGU+KG5vZGU6IE5vZGUsIGN0b3I6IGFic3RyYWN0IG5ldyAoLi4uJGFyZ3VtZW50czogbmV2ZXJbXSkgPT4gVCk6IG5vZGUgaXMgVCB7XG4gIC8vIEFnbm9zdGljIHJlaW1wbGVtZW50YXRpb24gb2YgT2JzaWRpYW4ncyBgTm9kZS5wcm90b3R5cGUuaW5zdGFuY2VPZmAgKGVuaGFuY2UuanMpLlxuICAvLyBUaGUgY2FsbGVyIHJlc29sdmVzIGBjdG9yYCBpbiB0aGUgbm9kZSdzIG93biByZWFsbSAodmlhIGBnZXROb2RlV2luZG93YCksIGtlZXBpbmcgaXQgY3Jvc3Mtd2luZG93IHNhZmUuXG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgY3Rvcjtcbn1cblxuZnVuY3Rpb24gc2V0RWxlbWVudEF0dHJpYnV0ZXMoZWxlbWVudDogRWxlbWVudCwgYXR0cmlidXRlOiBOb25OdWxsYWJsZTxDcmVhdGVIdG1sRWxlbWVudEluZm9bJ2F0dHInXT4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZSkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItdG9nZ2xlLWF0dHJpYnV0ZSAtLSBgdG9nZ2xlQXR0cmlidXRlYCBvbmx5IGV2ZXIgc2V0cyB0aGUgZW1wdHkgc3RyaW5nLCBzbyBpdCBjYW5ub3QgY2FycnkgYFN0cmluZyh2YWx1ZSlgLiBUaGUgcnVsZSBtYXRjaGVzIHRoZSByZW1vdmUvc2V0IHNoYXBlIHdpdGhvdXQgc2VlaW5nIHRoYXQgdGhlIHZhbHVlIGlzIHdoYXQgdGhpcyBicmFuY2ggZXhpc3RzIHRvIHdyaXRlLlxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUsIFN0cmluZyh2YWx1ZSkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRFbGVtZW50VGV4dChlbGVtZW50OiBIVE1MRWxlbWVudCwgdGV4dDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZyk6IHZvaWQge1xuICBpZiAodGV4dCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICBlbGVtZW50LnJlcGxhY2VDaGlsZHJlbih0ZXh0KTtcbiAgfSBlbHNlIHtcbiAgICBlbGVtZW50LnRleHRDb250ZW50ID0gdGV4dDtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZUEsd0JBQW1DO0FBQ25DLHlCQUFrQztBQUVsQyxNQUFNLGdCQUFnQjtBQXFHdEIsZUFBc0IsZUFDcEIsR0FDQSxVQUN5QjtBQUN6QixRQUFNLE1BQU0sa0JBQWtCLE9BQU8sQ0FBQztBQUN0QyxRQUFNLFdBQVcsR0FBRztBQUNwQixTQUFPO0FBQ1Q7QUFZQSxlQUFzQixjQUNwQixLQUNBLEdBQ0EsVUFDbUM7QUFDbkMsUUFBTSxVQUFVLGtCQUFrQixLQUFLLENBQUM7QUFDeEMsUUFBTSxXQUFXLE9BQU87QUFDeEIsU0FBTztBQUNUO0FBUUEsZUFBc0Isb0JBQW9CLFVBQXVGO0FBQy9ILFFBQU0sV0FBVyxTQUFTLHVCQUF1QjtBQUNqRCxRQUFNLFdBQVcsUUFBUTtBQUN6QixTQUFPO0FBQ1Q7QUFTQSxlQUFzQixnQkFDcEIsR0FDQSxVQUMwQjtBQUMxQixRQUFNLE9BQU8sa0JBQWtCLFFBQVEsQ0FBQztBQUN4QyxRQUFNLFdBQVcsSUFBSTtBQUNyQixTQUFPO0FBQ1Q7QUFZQSxlQUFzQixlQUNwQixLQUNBLEdBQ0EsVUFDa0M7QUFDbEMsUUFBTSxNQUFNLGlCQUFpQixLQUFLLENBQUM7QUFDbkMsUUFBTSxXQUFXLEdBQUc7QUFDcEIsU0FBTztBQUNUO0FBUUEsZUFBc0IsYUFBYSxTQUFpQztBQUNsRSxNQUFJLFNBQVMsT0FBTyxHQUFHO0FBQ3JCO0FBQUEsRUFDRjtBQUNBLFFBQU0sTUFBTSxjQUFjLE9BQU87QUFDakMsTUFDRSxhQUFhLFNBQVMsSUFBSSxlQUFlLEtBQ3RDLGFBQWEsU0FBUyxJQUFJLGdCQUFnQixLQUMxQyxhQUFhLFNBQVMsSUFBSSxpQkFBaUIsS0FDM0MsYUFBYSxTQUFTLElBQUksZ0JBQWdCLEtBQzFDLGFBQWEsU0FBUyxJQUFJLGVBQWUsS0FDekMsYUFBYSxTQUFTLElBQUksaUJBQWlCLEtBQzNDLGFBQWEsU0FBUyxJQUFJLGdCQUFnQixLQUMxQyxhQUFhLFNBQVMsSUFBSSxnQkFBZ0IsR0FDN0M7QUFDQSxVQUFNLElBQUksUUFBUSxDQUFDLFlBQVk7QUFDN0IsY0FBUSxpQkFBaUIsUUFBUSxPQUFPO0FBQ3hDLGNBQVEsaUJBQWlCLFNBQVMsT0FBTztBQUFBLElBQzNDLENBQUM7QUFDRDtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFFBQVEsSUFBSSxvQkFBb0IsT0FBTyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsYUFBYSxlQUFlLENBQUMsQ0FBQztBQUN4RztBQWFPLFNBQVMsa0JBQWtCLEtBQXVCO0FBQ3ZELGFBQU8sc0NBQWtCLElBQUksYUFBYSw0QkFBNEI7QUFDeEU7QUFRTyxTQUFTLFVBQVUsU0FBMEI7QUFDbEQsTUFBSSxXQUEyQjtBQUUvQixTQUFPLFVBQVU7QUFDZixVQUFNLGVBQWUsaUJBQWlCLFFBQVEsRUFBRTtBQUNoRCxVQUFNLFNBQVMsT0FBTyxTQUFTLGNBQWMsRUFBRTtBQUMvQyxRQUFJLENBQUMsT0FBTyxNQUFNLE1BQU0sR0FBRztBQUN6QixhQUFPO0FBQUEsSUFDVDtBQUNBLGVBQVcsU0FBUztBQUFBLEVBQ3RCO0FBRUEsU0FBTztBQUNUO0FBUU8sU0FBUywrQkFBK0IsU0FBK0I7QUFDNUUsUUFBTSxnQkFBZ0IsUUFBUTtBQUM5QixNQUFJLENBQUMsZUFBZTtBQUNsQixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sY0FBYyxRQUFRLHNCQUFzQjtBQUNsRCxRQUFNLG9CQUFvQixjQUFjLHNCQUFzQjtBQUU5RCxTQUNFLGtCQUFrQixPQUFPLFlBQVksT0FDbEMsWUFBWSxVQUFVLGtCQUFrQixVQUN4QyxrQkFBa0IsUUFBUSxZQUFZLFFBQ3RDLFlBQVksU0FBUyxrQkFBa0I7QUFFOUM7QUFRTyxTQUFTLFNBQVMsU0FBMkI7QUFDbEQsUUFBTSxNQUFNLGNBQWMsT0FBTztBQUVqQyxNQUFJLGFBQWEsU0FBUyxJQUFJLGVBQWUsR0FBRztBQUM5QyxVQUFNLGFBQWEsUUFBUSxjQUFjO0FBQ3pDLFdBQU8sZUFBZSxjQUFjLGVBQWU7QUFBQSxFQUNyRDtBQUVBLE1BQUksYUFBYSxTQUFTLElBQUksZ0JBQWdCLEdBQUc7QUFDL0MsV0FBTyxRQUFRLFlBQVksUUFBUSxlQUFlO0FBQUEsRUFDcEQ7QUFFQSxNQUFJLGFBQWEsU0FBUyxJQUFJLGlCQUFpQixHQUFHO0FBQ2hELFdBQU8sQ0FBQyxDQUFDLFFBQVE7QUFBQSxFQUNuQjtBQUVBLE1BQUksYUFBYSxTQUFTLElBQUksZ0JBQWdCLEdBQUc7QUFDL0MsV0FBTyxDQUFDLENBQUMsUUFBUSxlQUFlO0FBQUEsRUFDbEM7QUFFQSxNQUFJLGFBQWEsU0FBUyxJQUFJLGVBQWUsR0FBRztBQUM5QyxXQUFPLFFBQVEsUUFBUSxnQkFBZ0IsUUFBUSxVQUFVO0FBQUEsRUFDM0Q7QUFFQSxNQUFJLGFBQWEsU0FBUyxJQUFJLGlCQUFpQixHQUFHO0FBQ2hELFdBQU8sQ0FBQyxDQUFDLFFBQVEsbUJBQW1CLENBQUMsQ0FBQyxRQUFRLGVBQWU7QUFBQSxFQUMvRDtBQUVBLE1BQUksYUFBYSxTQUFTLElBQUksaUJBQWlCLEdBQUc7QUFDaEQsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLGFBQWEsU0FBUyxJQUFJLGdCQUFnQixHQUFHO0FBQy9DLFdBQU8sQ0FBQyxDQUFDLFFBQVE7QUFBQSxFQUNuQjtBQUVBLE1BQUksYUFBYSxTQUFTLElBQUksZ0JBQWdCLEdBQUc7QUFDL0MsVUFBTSxxQkFBcUI7QUFDM0IsV0FBTyxRQUFRLGVBQWU7QUFBQSxFQUNoQztBQUVBLFNBQU8sb0JBQW9CLE9BQU8sRUFBRSxNQUFNLENBQUMsb0JBQW9CLFNBQVMsZUFBZSxDQUFDO0FBQzFGO0FBU08sU0FBUyx5QkFBeUIsTUFBWSxVQUFrQztBQUNyRixRQUFNLE1BQU0sY0FBYyxJQUFJO0FBQzlCLFFBQU0sWUFBMkIsQ0FBQyxLQUFLLGlCQUFpQixJQUFJLFVBQVUsR0FBRztBQUV6RSxNQUFJLGNBQTJCO0FBRS9CLFNBQU8sYUFBYTtBQUNsQixjQUFVLEtBQUssV0FBVztBQUMxQixrQkFBYyxZQUFZO0FBQUEsRUFDNUI7QUFFQSxNQUFJLG1CQUFtQjtBQUV2QixhQUFXLFlBQVksV0FBVztBQUNoQyxhQUFTLGlCQUFpQixVQUFVLGdCQUFnQixFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQ3JFLGFBQVMsaUJBQWlCLFVBQVUsZ0JBQWdCLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFBQSxFQUN2RTtBQUVBLFNBQU8sSUFBSSxxQ0FBbUI7QUFBQSxJQUM1QixVQUFVLE1BQVk7QUFDcEIsaUJBQVcsWUFBWSxXQUFXO0FBQ2hDLGlCQUFTLG9CQUFvQixVQUFVLGdCQUFnQixFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQ3hFLGlCQUFTLG9CQUFvQixVQUFVLGdCQUFnQixFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQUEsTUFDMUU7QUFBQSxJQUNGO0FBQUEsRUFDRixDQUFDO0FBRUQsV0FBUyxpQkFBdUI7QUFDOUIsUUFBSSxrQkFBa0I7QUFDcEI7QUFBQSxJQUNGO0FBRUEsdUJBQW1CO0FBRW5CLFFBQUksc0JBQXNCLE1BQU07QUFDOUIsVUFBSTtBQUNGLGlCQUFTO0FBQUEsTUFDWCxVQUFFO0FBQ0EsMkJBQW1CO0FBQUEsTUFDckI7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBQ0Y7QUFRTyxTQUFTLEtBQUssT0FBdUI7QUFDMUMsU0FBTyxHQUFHLE9BQU8sS0FBSyxDQUFDO0FBQ3pCO0FBUU8sU0FBUyxtQkFBbUIsU0FBcUM7QUFDdEUsU0FBTyxJQUFJLFFBQVEsQ0FBQyxZQUFZO0FBQzlCLFFBQUksUUFBUSxhQUFhO0FBQ3ZCLGNBQVE7QUFDUjtBQUFBLElBQ0Y7QUFJQSxVQUFNLGdCQUFnQixRQUFRO0FBQzlCLFVBQU0sV0FBVyxLQUFLLGNBQWMsT0FBTyxHQUFHLGlCQUFpQixNQUFNO0FBQ25FLFVBQUksQ0FBQyxRQUFRLGFBQWE7QUFDeEI7QUFBQSxNQUNGO0FBRUEsZUFBUyxXQUFXO0FBQ3BCLGNBQVE7QUFBQSxJQUNWLENBQUM7QUFDRCxhQUFTLFFBQVEsZUFBZSxFQUFFLFdBQVcsTUFBTSxTQUFTLEtBQUssQ0FBQztBQUFBLEVBQ3BFLENBQUM7QUFDSDtBQVlBLFNBQVMsb0JBQW9CLFNBQXNCLEdBQXFEO0FBQ3RHLFFBQU0sT0FBOEIsT0FBTyxNQUFNLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUM7QUFFL0UsTUFBSSxLQUFLLFFBQVEsUUFBVztBQUMxQixZQUFRLFlBQVksTUFBTSxRQUFRLEtBQUssR0FBRyxJQUFJLEtBQUssSUFBSSxLQUFLLEdBQUcsSUFBSSxLQUFLO0FBQUEsRUFDMUU7QUFDQSxNQUFJLEtBQUssU0FBUyxRQUFXO0FBQzNCLG1CQUFlLFNBQVMsS0FBSyxJQUFJO0FBQUEsRUFDbkM7QUFDQSxNQUFJLEtBQUssTUFBTTtBQUNiLHlCQUFxQixTQUFTLEtBQUssSUFBSTtBQUFBLEVBQ3pDO0FBQ0EsTUFBSSxLQUFLLFVBQVUsUUFBVztBQUM1QixZQUFRLFFBQVEsS0FBSztBQUFBLEVBQ3ZCO0FBQ0EsbUJBQWlCLFNBQVMsSUFBSTtBQUNoQztBQUVBLFNBQVMsa0JBQXlELEtBQVEsR0FBOEQ7QUFDdEksUUFBTSxVQUFVLFNBQVMsY0FBYyxHQUFHO0FBQzFDLHNCQUFvQixTQUFTLENBQUM7QUFDOUIsU0FBTztBQUNUO0FBRUEsU0FBUyxpQkFBdUQsS0FBUSxHQUE0RDtBQUNsSSxRQUFNLE1BQU0sU0FBUyxnQkFBZ0IsZUFBZSxHQUFHO0FBQ3ZELFFBQU0sT0FBNkIsT0FBTyxNQUFNLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUM7QUFFOUUsTUFBSSxLQUFLLFFBQVEsUUFBVztBQUMxQixRQUFJLE1BQU0sUUFBUSxLQUFLLEdBQUcsR0FBRztBQUMzQixVQUFJLFVBQVUsSUFBSSxHQUFHLEtBQUssR0FBRztBQUFBLElBQy9CLE9BQU87QUFDTCxVQUFJLFVBQVUsSUFBSSxLQUFLLEdBQUc7QUFBQSxJQUM1QjtBQUFBLEVBQ0Y7QUFDQSxNQUFJLEtBQUssTUFBTTtBQUNiLHlCQUFxQixLQUFLLEtBQUssSUFBSTtBQUFBLEVBQ3JDO0FBQ0EsbUJBQWlCLEtBQUssSUFBSTtBQUMxQixTQUFPO0FBQ1Q7QUFFQSxTQUFTLG9CQUFvQixTQUE2QjtBQUN4RCxTQUFPLENBQUMsR0FBRyxRQUFRLGlCQUFpQiw4REFBOEQsQ0FBQztBQUNyRztBQUVBLFNBQVMsY0FBYyxNQUF3QztBQUM3RCxTQUFPLEtBQUssZUFBZSxlQUFlO0FBQzVDO0FBRUEsU0FBUyxpQkFBaUIsU0FBa0IsTUFBMEQ7QUFDcEcsTUFBSSxDQUFDLEtBQUssUUFBUTtBQUNoQjtBQUFBLEVBQ0Y7QUFDQSxNQUFJLEtBQUssU0FBUztBQUNoQixTQUFLLE9BQU8sYUFBYSxTQUFTLEtBQUssT0FBTyxVQUFVO0FBQUEsRUFDMUQsT0FBTztBQUVMLFNBQUssT0FBTyxZQUFZLE9BQU87QUFBQSxFQUNqQztBQUNGO0FBRUEsU0FBUyxhQUE2QixNQUFZLE1BQTZEO0FBRzdHLFNBQU8sZ0JBQWdCO0FBQ3pCO0FBRUEsU0FBUyxxQkFBcUIsU0FBa0IsV0FBNkQ7QUFDM0csYUFBVyxDQUFDLE1BQU0sS0FBSyxLQUFLLE9BQU8sUUFBUSxTQUFTLEdBQUc7QUFFckQsUUFBSSxVQUFVLE1BQU07QUFDbEIsY0FBUSxnQkFBZ0IsSUFBSTtBQUFBLElBQzlCLE9BQU87QUFDTCxjQUFRLGFBQWEsTUFBTSxPQUFPLEtBQUssQ0FBQztBQUFBLElBQzFDO0FBQUEsRUFDRjtBQUNGO0FBRUEsU0FBUyxlQUFlLFNBQXNCLE1BQXVDO0FBQ25GLE1BQUksZ0JBQWdCLGtCQUFrQjtBQUNwQyxZQUFRLGdCQUFnQixJQUFJO0FBQUEsRUFDOUIsT0FBTztBQUNMLFlBQVEsY0FBYztBQUFBLEVBQ3hCO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,200 @@
1
+ /// <reference path="./library-references.d.cts" />
2
+ /// <reference lib="dom" />
3
+ /**
4
+ * @file
5
+ *
6
+ * Obsidian-runtime-agnostic helpers for working with HTML elements.
7
+ *
8
+ * Several helpers here mirror behavior that the Obsidian runtime injects onto the DOM prototypes
9
+ * (`createEl`/`createDiv`/`createSpan`/`createSvg`/`createFragment`, `Node.prototype.instanceOf`,
10
+ * `Element.prototype.setText`/`setAttrs`). To stay independent of the Obsidian runtime, that behavior
11
+ * is reimplemented here in standard DOM, ported from Obsidian's own implementation in
12
+ * `obsidian.asar/enhance.js`. See the `obsidian-versions` project; revalidate the port when Obsidian
13
+ * changes `enhance.js` (there is a reminder in `CLAUDE.md`).
14
+ */
15
+ import type { Promisable } from 'type-fest' with { 'resolution-mode': 'import' };
16
+ /**
17
+ * The element information {@link createElAsync} and its siblings apply: the element-type-agnostic subset of
18
+ * Obsidian's `DomElementInfo`, declared here so this module needs no Obsidian typings. An Obsidian
19
+ * `DomElementInfo` value is assignable to it.
20
+ */
21
+ export interface CreateHtmlElementInfo {
22
+ /**
23
+ * The attributes to set; `null` removes the attribute.
24
+ */
25
+ readonly attr?: Record<string, boolean | null | number | string>;
26
+ /**
27
+ * The CSS class or classes.
28
+ */
29
+ readonly cls?: string | string[];
30
+ /**
31
+ * The parent to insert the element into.
32
+ */
33
+ readonly parent?: Node;
34
+ /**
35
+ * Whether to insert the element as the parent's first child instead of its last.
36
+ */
37
+ readonly prepend?: boolean;
38
+ /**
39
+ * The text content.
40
+ */
41
+ readonly text?: DocumentFragment | string;
42
+ /**
43
+ * The tooltip text.
44
+ */
45
+ readonly title?: string;
46
+ }
47
+ /**
48
+ * The SVG element information {@link createSvgAsync} applies: the subset of Obsidian's `SvgElementInfo` it
49
+ * supports, declared here so this module needs no Obsidian typings.
50
+ */
51
+ export interface CreateSvgElementInfo {
52
+ /**
53
+ * The attributes to set; `null` removes the attribute.
54
+ */
55
+ readonly attr?: Record<string, boolean | null | number | string>;
56
+ /**
57
+ * The CSS class or classes.
58
+ */
59
+ readonly cls?: string | string[];
60
+ /**
61
+ * The parent to insert the element into.
62
+ */
63
+ readonly parent?: Node;
64
+ /**
65
+ * Whether to insert the element as the parent's first child instead of its last.
66
+ */
67
+ readonly prepend?: boolean;
68
+ }
69
+ /**
70
+ * A HTML element that can be validated.
71
+ */
72
+ export interface ValidatorElement extends HTMLElement {
73
+ /**
74
+ * Checks the validity of the element.
75
+ *
76
+ * @returns `true` if the element is valid, `false` otherwise.
77
+ */
78
+ checkValidity: () => boolean;
79
+ /**
80
+ * Reports the validity of the element.
81
+ */
82
+ reportValidity: () => boolean;
83
+ /**
84
+ * Sets a custom error message on the element.
85
+ *
86
+ * @param error - The error message to set on the element.
87
+ */
88
+ setCustomValidity: (error: string) => void;
89
+ /**
90
+ * An error message of the element.
91
+ */
92
+ readonly validationMessage: string;
93
+ }
94
+ /**
95
+ * Creates a div asynchronously.
96
+ *
97
+ * @param o - The element information.
98
+ * @param callback - The callback to call when the div is created.
99
+ * @returns A {@link Promise} that resolves to the div.
100
+ */
101
+ export declare function createDivAsync(o?: CreateHtmlElementInfo | string, callback?: (element: HTMLDivElement) => Promisable<void>): Promise<HTMLDivElement>;
102
+ /**
103
+ * Creates an element asynchronously.
104
+ *
105
+ * @typeParam K - The tag name key from `HTMLElementTagNameMap`.
106
+ * @param tag - The tag name of the element to create.
107
+ * @param o - The element information.
108
+ * @param callback - The callback to call when the element is created.
109
+ * @returns A {@link Promise} that resolves to the element.
110
+ * @remarks Not refactored to parameter-object pattern, to keep the parity with Obsidian's `createEl` (or createSvg, correspondingly).
111
+ */
112
+ export declare function createElAsync<K extends keyof HTMLElementTagNameMap>(tag: K, o?: CreateHtmlElementInfo | string, callback?: (element: HTMLElementTagNameMap[K]) => Promisable<void>): Promise<HTMLElementTagNameMap[K]>;
113
+ /**
114
+ * Creates a DocumentFragment asynchronously.
115
+ *
116
+ * @param callback - The callback to call when the DocumentFragment is created.
117
+ * @returns A {@link Promise} that resolves to the DocumentFragment.
118
+ */
119
+ export declare function createFragmentAsync(callback?: (element: DocumentFragment) => Promisable<void>): Promise<DocumentFragment>;
120
+ /**
121
+ * Creates a span asynchronously.
122
+ *
123
+ * @param o - The element information.
124
+ * @param callback - The callback to call when the span is created.
125
+ * @returns A {@link Promise} that resolves to the span.
126
+ */
127
+ export declare function createSpanAsync(o?: CreateHtmlElementInfo | string, callback?: (element: HTMLSpanElement) => Promisable<void>): Promise<HTMLSpanElement>;
128
+ /**
129
+ * Creates a svg asynchronously.
130
+ *
131
+ * @typeParam K - The tag name key from `SVGElementTagNameMap`.
132
+ * @param tag - The tag name of the svg to create.
133
+ * @param o - The svg information.
134
+ * @param callback - The callback to call when the svg is created.
135
+ * @returns A {@link Promise} that resolves to the svg.
136
+ * @remarks Not refactored to parameter-object pattern, to keep the parity with Obsidian's `createSvg` (or createEl, correspondingly).
137
+ */
138
+ export declare function createSvgAsync<K extends keyof SVGElementTagNameMap>(tag: K, o?: CreateSvgElementInfo | string, callback?: (element: SVGElementTagNameMap[K]) => Promisable<void>): Promise<SVGElementTagNameMap[K]>;
139
+ /**
140
+ * Ensures that the given element is loaded.
141
+ *
142
+ * @param element - The element to ensure is loaded.
143
+ * @returns A {@link Promise} that resolves when the element is loaded.
144
+ */
145
+ export declare function ensureLoaded(element: Element): Promise<void>;
146
+ /**
147
+ * Gets the window a document belongs to.
148
+ *
149
+ * A document is the one node whose `ownerDocument` is `null`, so the `ownerDocument`-chasing lookup
150
+ * used for ordinary nodes resolves a document to the wrong window. Reading `defaultView` off the
151
+ * document itself is what keeps a pop-out window's coordinates measured against that window.
152
+ *
153
+ * @param doc - The document to get the window of.
154
+ * @returns The window the document belongs to.
155
+ * @throws An {@link Error} if the document is detached and therefore has no window.
156
+ */
157
+ export declare function getDocumentWindow(doc: Document): Window;
158
+ /**
159
+ * Gets the z-index of the given element.
160
+ *
161
+ * @param element - The element to get the z-index of.
162
+ * @returns The z-index of the element.
163
+ */
164
+ export declare function getZIndex(element: Element): number;
165
+ /**
166
+ * Checks if the element is visible in the offset parent.
167
+ *
168
+ * @param element - The element to check.
169
+ * @returns `true` if the element is visible in the offset parent, `false` otherwise.
170
+ */
171
+ export declare function isElementVisibleInOffsetParent(element: HTMLElement): boolean;
172
+ /**
173
+ * Checks if the element is loaded.
174
+ *
175
+ * @param element - The element to check.
176
+ * @returns `true` if the element is loaded, `false` otherwise.
177
+ */
178
+ export declare function isLoaded(element: Element): boolean;
179
+ /**
180
+ * Adds an event listener to the ancestor nodes of the given node.
181
+ *
182
+ * @param node - The node to add the event listener to.
183
+ * @param callback - The callback to call when the event is triggered.
184
+ * @returns A {@link Disposable} that removes the event listeners when disposed, for use with `using`.
185
+ */
186
+ export declare function onAncestorScrollOrResize(node: Node, callback: () => void): Disposable;
187
+ /**
188
+ * Converts a number to a string with 'px' appended.
189
+ *
190
+ * @param value - The number to convert.
191
+ * @returns The number as a string with 'px' appended.
192
+ */
193
+ export declare function toPx(value: number): string;
194
+ /**
195
+ * Waits until the given element is connected to the DOM.
196
+ *
197
+ * @param element - The element to check.
198
+ * @returns A promise that resolves when the element is connected.
199
+ */
200
+ export declare function waitUntilConnected(element: HTMLElement): Promise<void>;