@mnaoumov/typescript-lib 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/README.md +45 -1
  2. package/dist/lib/cjs/@types/debug.d.cts +1 -1
  3. package/dist/lib/cjs/abort-controller.cjs +1 -59
  4. package/dist/lib/cjs/abort-controller.d.cts +2 -1
  5. package/dist/lib/cjs/aggregate-error.cjs +1 -59
  6. package/dist/lib/cjs/aggregate-error.d.cts +1 -1
  7. package/dist/lib/cjs/api-contract.cjs +102 -0
  8. package/dist/lib/cjs/api-contract.d.cts +184 -0
  9. package/dist/lib/cjs/array-buffer.cjs +1 -59
  10. package/dist/lib/cjs/array-buffer.d.cts +1 -1
  11. package/dist/lib/cjs/array.cjs +1 -59
  12. package/dist/lib/cjs/array.d.cts +1 -1
  13. package/dist/lib/cjs/async-events.cjs +1 -59
  14. package/dist/lib/cjs/async-events.d.cts +1 -1
  15. package/dist/lib/cjs/async-operation-hook.cjs +1 -59
  16. package/dist/lib/cjs/async-operation-hook.d.cts +1 -1
  17. package/dist/lib/cjs/async.cjs +1 -59
  18. package/dist/lib/cjs/async.d.cts +2 -1
  19. package/dist/lib/cjs/beeper.cjs +1 -59
  20. package/dist/lib/cjs/beeper.d.cts +1 -1
  21. package/dist/lib/cjs/blob.cjs +1 -59
  22. package/dist/lib/cjs/blob.d.cts +2 -1
  23. package/dist/lib/cjs/bytes.cjs +1 -59
  24. package/dist/lib/cjs/bytes.d.cts +1 -1
  25. package/dist/lib/cjs/debug-controller.cjs +1 -59
  26. package/dist/lib/cjs/debug-controller.d.cts +1 -1
  27. package/dist/lib/cjs/debug.cjs +6 -37
  28. package/dist/lib/cjs/debug.d.cts +1 -1
  29. package/dist/lib/cjs/desktop-zip-extractor.cjs +1 -59
  30. package/dist/lib/cjs/desktop-zip-extractor.d.cts +2 -1
  31. package/dist/lib/cjs/disposable.cjs +4 -54
  32. package/dist/lib/cjs/disposable.d.cts +1 -1
  33. package/dist/lib/cjs/enum.cjs +1 -59
  34. package/dist/lib/cjs/enum.d.cts +1 -1
  35. package/dist/lib/cjs/error.cjs +1 -59
  36. package/dist/lib/cjs/error.d.cts +2 -1
  37. package/dist/lib/cjs/function.cjs +1 -59
  38. package/dist/lib/cjs/function.d.cts +1 -1
  39. package/dist/lib/cjs/html-element.cjs +1 -59
  40. package/dist/lib/cjs/html-element.d.cts +2 -1
  41. package/dist/lib/cjs/index.cjs +36 -91
  42. package/dist/lib/cjs/index.d.cts +2 -1
  43. package/dist/lib/cjs/jpeg-metadata.cjs +1 -59
  44. package/dist/lib/cjs/jpeg-metadata.d.cts +1 -1
  45. package/dist/lib/cjs/library-references.d.cts +2 -0
  46. package/dist/lib/cjs/library.cjs +1 -59
  47. package/dist/lib/cjs/object-utils.cjs +1 -59
  48. package/dist/lib/cjs/object-utils.d.cts +1 -1
  49. package/dist/lib/cjs/path.cjs +6 -37
  50. package/dist/lib/cjs/path.d.cts +2 -1
  51. package/dist/lib/cjs/reg-exp.cjs +1 -59
  52. package/dist/lib/cjs/reg-exp.d.cts +1 -1
  53. package/dist/lib/cjs/string.cjs +1 -59
  54. package/dist/lib/cjs/string.d.cts +2 -1
  55. package/dist/lib/cjs/transformers/date-transformer.cjs +1 -59
  56. package/dist/lib/cjs/transformers/date-transformer.d.cts +1 -1
  57. package/dist/lib/cjs/transformers/group-transformer.cjs +1 -59
  58. package/dist/lib/cjs/transformers/group-transformer.d.cts +1 -1
  59. package/dist/lib/cjs/transformers/index.cjs +9 -67
  60. package/dist/lib/cjs/transformers/index.d.cts +1 -1
  61. package/dist/lib/cjs/transformers/map-transformer.cjs +1 -59
  62. package/dist/lib/cjs/transformers/map-transformer.d.cts +1 -1
  63. package/dist/lib/cjs/transformers/set-transformer.cjs +1 -59
  64. package/dist/lib/cjs/transformers/set-transformer.d.cts +1 -1
  65. package/dist/lib/cjs/transformers/skip-private-property-transformer.cjs +1 -59
  66. package/dist/lib/cjs/transformers/skip-private-property-transformer.d.cts +1 -1
  67. package/dist/lib/cjs/transformers/transformer.cjs +1 -59
  68. package/dist/lib/cjs/transformers/transformer.d.cts +1 -1
  69. package/dist/lib/cjs/transformers/two-way-map-transformer.cjs +1 -59
  70. package/dist/lib/cjs/transformers/two-way-map-transformer.d.cts +1 -1
  71. package/dist/lib/cjs/transformers/typed-transformer.cjs +1 -59
  72. package/dist/lib/cjs/transformers/typed-transformer.d.cts +1 -1
  73. package/dist/lib/cjs/two-way-map.cjs +1 -59
  74. package/dist/lib/cjs/two-way-map.d.cts +1 -1
  75. package/dist/lib/cjs/type-guards.cjs +28 -61
  76. package/dist/lib/cjs/type-guards.d.cts +36 -1
  77. package/dist/lib/cjs/type.cjs +1 -59
  78. package/dist/lib/cjs/type.d.cts +1 -1
  79. package/dist/lib/cjs/typescript-lib-state.cjs +1 -59
  80. package/dist/lib/cjs/typescript-lib-state.d.cts +1 -1
  81. package/dist/lib/cjs/url.cjs +1 -59
  82. package/dist/lib/cjs/url.d.cts +1 -1
  83. package/dist/lib/cjs/value-provider.cjs +1 -59
  84. package/dist/lib/cjs/value-provider.d.cts +2 -1
  85. package/dist/lib/cjs/value-wrapper.cjs +1 -59
  86. package/dist/lib/cjs/value-wrapper.d.cts +1 -1
  87. package/dist/lib/esm/@types/debug.d.mts +1 -1
  88. package/dist/lib/esm/abort-controller.d.mts +2 -1
  89. package/dist/lib/esm/abort-controller.mjs +1 -45
  90. package/dist/lib/esm/aggregate-error.d.mts +1 -1
  91. package/dist/lib/esm/aggregate-error.mjs +1 -45
  92. package/dist/lib/esm/api-contract.d.mts +184 -0
  93. package/dist/lib/esm/api-contract.mjs +75 -0
  94. package/dist/lib/esm/array-buffer.d.mts +1 -1
  95. package/dist/lib/esm/array-buffer.mjs +1 -45
  96. package/dist/lib/esm/array.d.mts +1 -1
  97. package/dist/lib/esm/array.mjs +1 -45
  98. package/dist/lib/esm/async-events.d.mts +1 -1
  99. package/dist/lib/esm/async-events.mjs +1 -45
  100. package/dist/lib/esm/async-operation-hook.d.mts +1 -1
  101. package/dist/lib/esm/async-operation-hook.mjs +1 -45
  102. package/dist/lib/esm/async.d.mts +2 -1
  103. package/dist/lib/esm/async.mjs +1 -45
  104. package/dist/lib/esm/beeper.d.mts +1 -1
  105. package/dist/lib/esm/beeper.mjs +1 -45
  106. package/dist/lib/esm/blob.d.mts +2 -1
  107. package/dist/lib/esm/blob.mjs +1 -45
  108. package/dist/lib/esm/bytes.d.mts +1 -1
  109. package/dist/lib/esm/bytes.mjs +1 -45
  110. package/dist/lib/esm/debug-controller.d.mts +1 -1
  111. package/dist/lib/esm/debug-controller.mjs +0 -44
  112. package/dist/lib/esm/debug.d.mts +1 -1
  113. package/dist/lib/esm/debug.mjs +5 -22
  114. package/dist/lib/esm/desktop-zip-extractor.d.mts +2 -1
  115. package/dist/lib/esm/desktop-zip-extractor.mjs +1 -45
  116. package/dist/lib/esm/disposable.d.mts +1 -1
  117. package/dist/lib/esm/disposable.mjs +4 -40
  118. package/dist/lib/esm/enum.d.mts +1 -1
  119. package/dist/lib/esm/enum.mjs +1 -45
  120. package/dist/lib/esm/error.d.mts +2 -1
  121. package/dist/lib/esm/error.mjs +1 -45
  122. package/dist/lib/esm/function.d.mts +1 -1
  123. package/dist/lib/esm/function.mjs +1 -45
  124. package/dist/lib/esm/html-element.d.mts +2 -1
  125. package/dist/lib/esm/html-element.mjs +1 -45
  126. package/dist/lib/esm/index.d.mts +2 -1
  127. package/dist/lib/esm/index.mjs +3 -45
  128. package/dist/lib/esm/jpeg-metadata.d.mts +1 -1
  129. package/dist/lib/esm/jpeg-metadata.mjs +1 -45
  130. package/dist/lib/esm/library-references.d.mts +2 -0
  131. package/dist/lib/esm/library.mjs +1 -45
  132. package/dist/lib/esm/object-utils.d.mts +1 -1
  133. package/dist/lib/esm/object-utils.mjs +1 -45
  134. package/dist/lib/esm/path.d.mts +2 -1
  135. package/dist/lib/esm/path.mjs +5 -22
  136. package/dist/lib/esm/reg-exp.d.mts +1 -1
  137. package/dist/lib/esm/reg-exp.mjs +1 -45
  138. package/dist/lib/esm/string.d.mts +2 -1
  139. package/dist/lib/esm/string.mjs +1 -45
  140. package/dist/lib/esm/transformers/date-transformer.d.mts +1 -1
  141. package/dist/lib/esm/transformers/date-transformer.mjs +1 -45
  142. package/dist/lib/esm/transformers/group-transformer.d.mts +1 -1
  143. package/dist/lib/esm/transformers/group-transformer.mjs +1 -45
  144. package/dist/lib/esm/transformers/index.d.mts +1 -1
  145. package/dist/lib/esm/transformers/index.mjs +1 -45
  146. package/dist/lib/esm/transformers/map-transformer.d.mts +1 -1
  147. package/dist/lib/esm/transformers/map-transformer.mjs +1 -45
  148. package/dist/lib/esm/transformers/set-transformer.d.mts +1 -1
  149. package/dist/lib/esm/transformers/set-transformer.mjs +1 -45
  150. package/dist/lib/esm/transformers/skip-private-property-transformer.d.mts +1 -1
  151. package/dist/lib/esm/transformers/skip-private-property-transformer.mjs +1 -45
  152. package/dist/lib/esm/transformers/transformer.d.mts +1 -1
  153. package/dist/lib/esm/transformers/transformer.mjs +1 -45
  154. package/dist/lib/esm/transformers/two-way-map-transformer.d.mts +1 -1
  155. package/dist/lib/esm/transformers/two-way-map-transformer.mjs +1 -45
  156. package/dist/lib/esm/transformers/typed-transformer.d.mts +1 -1
  157. package/dist/lib/esm/transformers/typed-transformer.mjs +1 -45
  158. package/dist/lib/esm/two-way-map.d.mts +1 -1
  159. package/dist/lib/esm/two-way-map.mjs +1 -45
  160. package/dist/lib/esm/type-guards.d.mts +36 -1
  161. package/dist/lib/esm/type-guards.mjs +22 -46
  162. package/dist/lib/esm/type.d.mts +1 -1
  163. package/dist/lib/esm/type.mjs +1 -45
  164. package/dist/lib/esm/typescript-lib-state.d.mts +1 -1
  165. package/dist/lib/esm/typescript-lib-state.mjs +1 -45
  166. package/dist/lib/esm/url.d.mts +1 -1
  167. package/dist/lib/esm/url.mjs +1 -45
  168. package/dist/lib/esm/value-provider.d.mts +2 -1
  169. package/dist/lib/esm/value-provider.mjs +1 -45
  170. package/dist/lib/esm/value-wrapper.d.mts +1 -1
  171. package/dist/lib/esm/value-wrapper.mjs +1 -45
  172. package/package.json +62 -19
@@ -3,50 +3,6 @@ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
3
  if you want to view the source, please visit the github repository of this plugin
4
4
  */
5
5
 
6
- (function () {
7
- function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
- symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
9
- symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
10
- }
11
-
12
- function ensureBrowserProcess() {
13
- const browserProcess = {
14
- browser: true,
15
- cwd() {
16
- return '/';
17
- },
18
- env: {},
19
- platform: 'android'
20
- };
21
-
22
- // eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
23
- const existingProcess = globalThis.process;
24
-
25
- if (!existingProcess) {
26
- // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
27
- globalThis.process = browserProcess;
28
- return;
29
- }
30
-
31
- if (existingProcess.versions?.node) {
32
- return;
33
- }
34
-
35
- const existingProcessRecord = existingProcess;
36
-
37
- for (const [key, value] of Object.entries(browserProcess)) {
38
- existingProcessRecord[key] ??= value;
39
- }
40
-
41
- existingProcessRecord['browser'] = true;
42
- }
43
-
44
- (function initEsm() {
45
- ensureDisposeSymbols();
46
- ensureBrowserProcess();
47
- })();
48
- })();
49
-
50
6
  const APP0_MARKER = 224;
51
7
  const APP1_MARKER = 225;
52
8
  const APP2_MARKER = 226;
@@ -186,4 +142,4 @@ export {
186
142
  extractJpegMetadataSegments,
187
143
  injectJpegMetadataSegments
188
144
  };
189
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2pwZWctbWV0YWRhdGEudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBSZWFkcyBhbmQgcmUtYXR0YWNoZXMgYSBKUEVHJ3MgbWV0YWRhdGEgc2VnbWVudHMuXG4gKlxuICogUmUtZW5jb2RpbmcgYW4gaW1hZ2UgdGhyb3VnaCBhIGNhbnZhcyBrZWVwcyBvbmx5IHBpeGVsczogRVhJRiwgR1BTLCBYTVAgYW5kIHRoZSBJQ0MgcHJvZmlsZSBhcmUgYWxsXG4gKiBkcm9wcGVkIGJ5IGNvbnN0cnVjdGlvbiwgYmVjYXVzZSB0aGUgY2FudmFzIGhvbGRzIGRlY29kZWQgc2FtcGxlcyBhbmQgbm90aGluZyBlbHNlLiBUaGVzZSBoZWxwZXJzXG4gKiBsaWZ0IHRoZSBtZXRhZGF0YSBzZWdtZW50cyBvZmYgdGhlIG9yaWdpbmFsIGJ5dGVzIHNvIHRoZXkgY2FuIGJlIHNwbGljZWQgYmFjayBpbnRvIHRoZSByZS1lbmNvZGVkXG4gKiBKUEVHLlxuICovXG5cbmNvbnN0IEFQUDBfTUFSS0VSID0gMHhFMDtcbmNvbnN0IEFQUDFfTUFSS0VSID0gMHhFMTtcbmNvbnN0IEFQUDJfTUFSS0VSID0gMHhFMjtcbmNvbnN0IEVPSV9NQVJLRVIgPSAweEQ5O1xuY29uc3QgTUFSS0VSX1BSRUZJWCA9IDB4RkY7XG5jb25zdCBTT0lfTUFSS0VSID0gMHhEODtcbmNvbnN0IFNPU19NQVJLRVIgPSAweERBO1xuXG5jb25zdCBFWElGX0hFQURFUiA9ICdFeGlmXFwwXFwwJztcbmNvbnN0IElDQ19QUk9GSUxFX0hFQURFUiA9ICdJQ0NfUFJPRklMRVxcMCc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItaHR0cHMgLS0gVGhlIGxpdGVyYWwgYnl0ZXMgQWRvYmUgd3JpdGVzIGludG8gdGhlIGBBUFAxYCBzZWdtZW50LiBJdCBpcyBhIG5hbWVzcGFjZSBpZGVudGlmaWVyLCBuZXZlciBmZXRjaGVkLCBhbmQgcmV3cml0aW5nIGl0IHRvIGBodHRwc2Agd291bGQgc3RvcCBYTVAgZnJvbSBldmVyIG1hdGNoaW5nLlxuY29uc3QgWE1QX0hFQURFUiA9ICdodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvXFwwJztcblxuLyoqXG4gKiBCeXRlcyBmcm9tIHRoZSBzdGFydCBvZiBhIHNlZ21lbnQgdG8gaXRzIHBheWxvYWQ6IHRoZSB0d28gbWFya2VyIGJ5dGVzIHBsdXMgdGhlIHR3byBsZW5ndGggYnl0ZXMuXG4gKi9cbmNvbnN0IFNFR01FTlRfSEVBREVSX1NJWkUgPSA0O1xuXG4vKipcbiAqIFRoZSBzZWdtZW50IGxlbmd0aCBmaWVsZCBpdHNlbGYgY291bnRzIHRoZSB0d28gYnl0ZXMgaXQgb2NjdXBpZXMuXG4gKi9cbmNvbnN0IFNFR01FTlRfTEVOR1RIX1NJWkUgPSAyO1xuXG4vKipcbiAqIFRoZSBgU09JYCBtYXJrZXIgdGhhdCBvcGVucyBldmVyeSBKUEVHLlxuICovXG5jb25zdCBTT0lfU0laRSA9IDI7XG5cbmNvbnN0IEJJR19FTkRJQU5fVElGRl9CWVRFX09SREVSID0gMHg0RF80RDtcbmNvbnN0IElGRF9FTlRSWV9TSVpFID0gMTI7XG4vKipcbiAqIEJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIGFuIElGRCBlbnRyeSB0byBpdHMgaW5saW5lIHZhbHVlOiB0YWcgKDIpICsgdHlwZSAoMikgKyBjb3VudCAoNCkuXG4gKi9cbmNvbnN0IElGRF9FTlRSWV9WQUxVRV9PRkZTRVQgPSA4O1xuY29uc3QgSUZEX0VOVFJZX0NPVU5UX1NJWkUgPSAyO1xuY29uc3QgTElUVExFX0VORElBTl9USUZGX0JZVEVfT1JERVIgPSAweDQ5XzQ5O1xuY29uc3QgT1JJRU5UQVRJT05fVEFHID0gMHgwMV8xMjtcbmNvbnN0IE9SSUVOVEFUSU9OX1VQUklHSFQgPSAxO1xuY29uc3QgVElGRl9IRUFERVJfU0laRSA9IDg7XG5jb25zdCBUSUZGX0lGRF9QT0lOVEVSX09GRlNFVCA9IDQ7XG5jb25zdCBUSUZGX01BR0lDID0gMHgwMF8yQTtcbmNvbnN0IFRJRkZfTUFHSUNfT0ZGU0VUID0gMjtcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgbWV0YWRhdGEgc2VnbWVudHMgb2YgYSBKUEVHLlxuICpcbiAqIFJldHVybnMgZWFjaCBtYXRjaGluZyBzZWdtZW50IHdob2xlIFx1MjAxNCBtYXJrZXIsIGxlbmd0aCBhbmQgcGF5bG9hZCBcdTIwMTQgc29cbiAqIHtAbGluayBpbmplY3RKcGVnTWV0YWRhdGFTZWdtZW50c30gY2FuIHNwbGljZSBpdCBpbnRvIGFub3RoZXIgSlBFRyB1bnRvdWNoZWQuIE9ubHkgdGhlIHNlZ21lbnRzIHRoYXRcbiAqIGNhcnJ5IG1ldGFkYXRhIGFyZSByZXR1cm5lZDogdGhlIEVYSUYgYW5kIFhNUCBgQVBQMWBzIGFuZCB0aGUgSUNDIHByb2ZpbGUgYEFQUDJgLiBgQVBQMGAgKEpGSUYpIGlzXG4gKiBkZWxpYmVyYXRlbHkgbGVmdCBiZWhpbmQsIGJlY2F1c2UgdGhlIHJlLWVuY29kZWQgSlBFRyB3cml0ZXMgaXRzIG93bi5cbiAqXG4gKiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGZvciBhbnl0aGluZyB0aGF0IGlzIG5vdCBhIEpQRUcsIGluY2x1ZGluZyBhIHRydW5jYXRlZCBvciBtYWxmb3JtZWQgb25lIFx1MjAxNCBhXG4gKiBjYWxsZXIgdGhhdCBjYW5ub3QgcHJlc2VydmUgbWV0YWRhdGEgc2hvdWxkIGNhcnJ5IG9uIHdpdGhvdXQgaXQgcmF0aGVyIHRoYW4gZmFpbC5cbiAqXG4gKiBAcGFyYW0gYnl0ZXMgLSBUaGUgYnl0ZXMgb2YgdGhlIHNvdXJjZSBpbWFnZS5cbiAqIEByZXR1cm5zIFRoZSBtZXRhZGF0YSBzZWdtZW50cywgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0SnBlZ01ldGFkYXRhU2VnbWVudHMoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5W10ge1xuICBpZiAoIWNoZWNrSXNKcGVnKGJ5dGVzKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHZpZXcgPSBjcmVhdGVWaWV3KGJ5dGVzKTtcbiAgY29uc3Qgc2VnbWVudHM6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICBsZXQgb2Zmc2V0ID0gU09JX1NJWkU7XG5cbiAgd2hpbGUgKG9mZnNldCArIFNFR01FTlRfSEVBREVSX1NJWkUgPD0gYnl0ZXMubGVuZ3RoKSB7XG4gICAgaWYgKGJ5dGVzW29mZnNldF0gIT09IE1BUktFUl9QUkVGSVgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNvbnN0IG1hcmtlciA9IGJ5dGVzW29mZnNldCArIDFdO1xuICAgIGlmIChtYXJrZXIgPT09IFNPU19NQVJLRVIgfHwgbWFya2VyID09PSBFT0lfTUFSS0VSKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb25zdCBzZWdtZW50TGVuZ3RoID0gdmlldy5nZXRVaW50MTYob2Zmc2V0ICsgU0VHTUVOVF9MRU5HVEhfU0laRSk7XG4gICAgY29uc3Qgc2VnbWVudEVuZCA9IG9mZnNldCArIFNFR01FTlRfTEVOR1RIX1NJWkUgKyBzZWdtZW50TGVuZ3RoO1xuICAgIGlmIChzZWdtZW50TGVuZ3RoIDwgU0VHTUVOVF9MRU5HVEhfU0laRSB8fCBzZWdtZW50RW5kID4gYnl0ZXMubGVuZ3RoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tJc01ldGFkYXRhU2VnbWVudChieXRlcywgb2Zmc2V0LCBtYXJrZXIpKSB7XG4gICAgICBzZWdtZW50cy5wdXNoKGJ5dGVzLnNsaWNlKG9mZnNldCwgc2VnbWVudEVuZCkpO1xuICAgIH1cblxuICAgIG9mZnNldCA9IHNlZ21lbnRFbmQ7XG4gIH1cblxuICByZXR1cm4gc2VnbWVudHM7XG59XG5cbi8qKlxuICogU3BsaWNlcyBtZXRhZGF0YSBzZWdtZW50cyBpbnRvIGEgSlBFRy5cbiAqXG4gKiBUaGUgc2VnbWVudHMgZ28gZGlyZWN0bHkgYWZ0ZXIgdGhlIGBTT0lgIGFuZCB0aGUgcmUtZW5jb2RlZCBKUEVHJ3Mgb3duIGBBUFAwYCwgd2hpY2ggaXMgd2hlcmUgYVxuICogcmVhZGVyIGV4cGVjdHMgdG8gZmluZCB0aGVtLlxuICpcbiAqIEV2ZXJ5IGNvcGllZCBFWElGIGJsb2NrIGhhcyBpdHMgb3JpZW50YXRpb24gdGFnIHJlc2V0IHRvIHVwcmlnaHQuIFRoZSBjYW52YXMgZGVjb2RlIGFscmVhZHkgYXBwbGllZFxuICogdGhlIG9yaWdpbmFsIG9yaWVudGF0aW9uIHRvIHRoZSBwaXhlbHMsIHNvIGNhcnJ5aW5nIHRoZSB0YWcgYWNyb3NzIHZlcmJhdGltIHdvdWxkIHJvdGF0ZSB0aGUgaW1hZ2UgYVxuICogc2Vjb25kIHRpbWUgXHUyMDE0IHRoZSBvbmUgcGllY2Ugb2YgbWV0YWRhdGEgdGhhdCBpcyB3cm9uZyB0byBwcmVzZXJ2ZSBhcy1pcy5cbiAqXG4gKiBAcGFyYW0ganBlZ0J5dGVzIC0gVGhlIGJ5dGVzIG9mIHRoZSByZS1lbmNvZGVkIEpQRUcuXG4gKiBAcGFyYW0gc2VnbWVudHMgLSBUaGUgc2VnbWVudHMgcmV0dXJuZWQgYnkge0BsaW5rIGV4dHJhY3RKcGVnTWV0YWRhdGFTZWdtZW50c30uXG4gKiBAcmV0dXJucyBUaGUgSlBFRyB3aXRoIHRoZSBzZWdtZW50cyBzcGxpY2VkIGluLCBvciB0aGUgaW5wdXQgdW5jaGFuZ2VkIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0byBhZGRcbiAqICAgb3IgdGhlIGlucHV0IGlzIG5vdCBhIEpQRUcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RKcGVnTWV0YWRhdGFTZWdtZW50cyhqcGVnQnl0ZXM6IFVpbnQ4QXJyYXksIHNlZ21lbnRzOiByZWFkb25seSBVaW50OEFycmF5W10pOiBVaW50OEFycmF5IHtcbiAgaWYgKHNlZ21lbnRzLmxlbmd0aCA9PT0gMCB8fCAhY2hlY2tJc0pwZWcoanBlZ0J5dGVzKSkge1xuICAgIHJldHVybiBqcGVnQnl0ZXM7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkU2VnbWVudHMgPSBzZWdtZW50cy5tYXAoKHNlZ21lbnQpID0+IG5vcm1hbGl6ZU9yaWVudGF0aW9uKHNlZ21lbnQpKTtcbiAgY29uc3QgaW5zZXJ0QXQgPSBmaW5kSW5zZXJ0T2Zmc2V0KGpwZWdCeXRlcyk7XG4gIGNvbnN0IGFkZGVkTGVuZ3RoID0gbm9ybWFsaXplZFNlZ21lbnRzLnJlZHVjZSgodG90YWwsIHNlZ21lbnQpID0+IHRvdGFsICsgc2VnbWVudC5sZW5ndGgsIDApO1xuICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShqcGVnQnl0ZXMubGVuZ3RoICsgYWRkZWRMZW5ndGgpO1xuXG4gIHJlc3VsdC5zZXQoanBlZ0J5dGVzLnN1YmFycmF5KDAsIGluc2VydEF0KSwgMCk7XG4gIGxldCB3cml0ZUF0ID0gaW5zZXJ0QXQ7XG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBub3JtYWxpemVkU2VnbWVudHMpIHtcbiAgICByZXN1bHQuc2V0KHNlZ21lbnQsIHdyaXRlQXQpO1xuICAgIHdyaXRlQXQgKz0gc2VnbWVudC5sZW5ndGg7XG4gIH1cbiAgcmVzdWx0LnNldChqcGVnQnl0ZXMuc3ViYXJyYXkoaW5zZXJ0QXQpLCB3cml0ZUF0KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjaGVja0lzSnBlZyhieXRlczogVWludDhBcnJheSk6IGJvb2xlYW4ge1xuICByZXR1cm4gYnl0ZXMubGVuZ3RoID49IFNPSV9TSVpFICYmIGJ5dGVzWzBdID09PSBNQVJLRVJfUFJFRklYICYmIGJ5dGVzWzFdID09PSBTT0lfTUFSS0VSO1xufVxuXG5mdW5jdGlvbiBjaGVja0lzTWV0YWRhdGFTZWdtZW50KGJ5dGVzOiBVaW50OEFycmF5LCBvZmZzZXQ6IG51bWJlciwgbWFya2VyOiBudW1iZXIgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgY29uc3QgcGF5bG9hZE9mZnNldCA9IG9mZnNldCArIFNFR01FTlRfSEVBREVSX1NJWkU7XG4gIHJldHVybiBtYXJrZXIgPT09IEFQUDFfTUFSS0VSXG4gICAgPyBjaGVja01hdGNoZXNIZWFkZXIoYnl0ZXMsIHBheWxvYWRPZmZzZXQsIEVYSUZfSEVBREVSKSB8fCBjaGVja01hdGNoZXNIZWFkZXIoYnl0ZXMsIHBheWxvYWRPZmZzZXQsIFhNUF9IRUFERVIpXG4gICAgOiBtYXJrZXIgPT09IEFQUDJfTUFSS0VSICYmIGNoZWNrTWF0Y2hlc0hlYWRlcihieXRlcywgcGF5bG9hZE9mZnNldCwgSUNDX1BST0ZJTEVfSEVBREVSKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tNYXRjaGVzSGVhZGVyKGJ5dGVzOiBVaW50OEFycmF5LCBvZmZzZXQ6IG51bWJlciwgaGVhZGVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKG9mZnNldCArIGhlYWRlci5sZW5ndGggPiBieXRlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGhlYWRlci5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBpZiAoYnl0ZXNbb2Zmc2V0ICsgaW5kZXhdICE9PSBoZWFkZXIuY29kZVBvaW50QXQoaW5kZXgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVWaWV3KGJ5dGVzOiBVaW50OEFycmF5KTogRGF0YVZpZXcge1xuICByZXR1cm4gbmV3IERhdGFWaWV3KGJ5dGVzLmJ1ZmZlciwgYnl0ZXMuYnl0ZU9mZnNldCwgYnl0ZXMuYnl0ZUxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIGZpbmRJbnNlcnRPZmZzZXQoanBlZ0J5dGVzOiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgaWYgKFNPSV9TSVpFICsgU0VHTUVOVF9IRUFERVJfU0laRSA+IGpwZWdCeXRlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gU09JX1NJWkU7XG4gIH1cbiAgaWYgKGpwZWdCeXRlc1tTT0lfU0laRV0gIT09IE1BUktFUl9QUkVGSVggfHwganBlZ0J5dGVzW1NPSV9TSVpFICsgMV0gIT09IEFQUDBfTUFSS0VSKSB7XG4gICAgcmV0dXJuIFNPSV9TSVpFO1xuICB9XG5cbiAgY29uc3QgYXBwMEVuZCA9IFNPSV9TSVpFICsgU0VHTUVOVF9MRU5HVEhfU0laRSArIGNyZWF0ZVZpZXcoanBlZ0J5dGVzKS5nZXRVaW50MTYoU09JX1NJWkUgKyBTRUdNRU5UX0xFTkdUSF9TSVpFKTtcbiAgcmV0dXJuIGFwcDBFbmQgPiBqcGVnQnl0ZXMubGVuZ3RoID8gU09JX1NJWkUgOiBhcHAwRW5kO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVPcmllbnRhdGlvbihzZWdtZW50OiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gIGlmIChzZWdtZW50WzFdICE9PSBBUFAxX01BUktFUiB8fCAhY2hlY2tNYXRjaGVzSGVhZGVyKHNlZ21lbnQsIFNFR01FTlRfSEVBREVSX1NJWkUsIEVYSUZfSEVBREVSKSkge1xuICAgIHJldHVybiBzZWdtZW50O1xuICB9XG5cbiAgY29uc3QgdGlmZk9mZnNldCA9IFNFR01FTlRfSEVBREVSX1NJWkUgKyBFWElGX0hFQURFUi5sZW5ndGg7XG4gIGlmICh0aWZmT2Zmc2V0ICsgVElGRl9IRUFERVJfU0laRSA+IHNlZ21lbnQubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHNlZ21lbnQ7XG4gIH1cblxuICBjb25zdCB2aWV3ID0gY3JlYXRlVmlldyhzZWdtZW50KTtcbiAgY29uc3QgYnl0ZU9yZGVyID0gdmlldy5nZXRVaW50MTYodGlmZk9mZnNldCk7XG4gIGNvbnN0IGlzTGl0dGxlRW5kaWFuID0gYnl0ZU9yZGVyID09PSBMSVRUTEVfRU5ESUFOX1RJRkZfQllURV9PUkRFUjtcbiAgaWYgKCFpc0xpdHRsZUVuZGlhbiAmJiBieXRlT3JkZXIgIT09IEJJR19FTkRJQU5fVElGRl9CWVRFX09SREVSKSB7XG4gICAgcmV0dXJuIHNlZ21lbnQ7XG4gIH1cblxuICBpZiAodmlldy5nZXRVaW50MTYodGlmZk9mZnNldCArIFRJRkZfTUFHSUNfT0ZGU0VULCBpc0xpdHRsZUVuZGlhbikgIT09IFRJRkZfTUFHSUMpIHtcbiAgICByZXR1cm4gc2VnbWVudDtcbiAgfVxuXG4gIGNvbnN0IGlmZE9mZnNldCA9IHRpZmZPZmZzZXQgKyB2aWV3LmdldFVpbnQzMih0aWZmT2Zmc2V0ICsgVElGRl9JRkRfUE9JTlRFUl9PRkZTRVQsIGlzTGl0dGxlRW5kaWFuKTtcbiAgaWYgKGlmZE9mZnNldCArIElGRF9FTlRSWV9DT1VOVF9TSVpFID4gc2VnbWVudC5sZW5ndGgpIHtcbiAgICByZXR1cm4gc2VnbWVudDtcbiAgfVxuXG4gIGNvbnN0IGVudHJ5Q291bnQgPSB2aWV3LmdldFVpbnQxNihpZmRPZmZzZXQsIGlzTGl0dGxlRW5kaWFuKTtcbiAgY29uc3QgZW50cmllc09mZnNldCA9IGlmZE9mZnNldCArIElGRF9FTlRSWV9DT1VOVF9TSVpFO1xuICBpZiAoZW50cmllc09mZnNldCArIGVudHJ5Q291bnQgKiBJRkRfRU5UUllfU0laRSA+IHNlZ21lbnQubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHNlZ21lbnQ7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShzZWdtZW50KTtcbiAgY29uc3QgcmVzdWx0VmlldyA9IGNyZWF0ZVZpZXcocmVzdWx0KTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGVudHJ5Q291bnQ7IGluZGV4KyspIHtcbiAgICBjb25zdCBlbnRyeU9mZnNldCA9IGVudHJpZXNPZmZzZXQgKyBpbmRleCAqIElGRF9FTlRSWV9TSVpFO1xuICAgIGlmIChyZXN1bHRWaWV3LmdldFVpbnQxNihlbnRyeU9mZnNldCwgaXNMaXR0bGVFbmRpYW4pID09PSBPUklFTlRBVElPTl9UQUcpIHtcbiAgICAgIHJlc3VsdFZpZXcuc2V0VWludDE2KGVudHJ5T2Zmc2V0ICsgSUZEX0VOVFJZX1ZBTFVFX09GRlNFVCwgT1JJRU5UQVRJT05fVVBSSUdIVCwgaXNMaXR0bGVFbmRpYW4pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iXSwKICAibWFwcGlu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
145
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2pwZWctbWV0YWRhdGEudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBSZWFkcyBhbmQgcmUtYXR0YWNoZXMgYSBKUEVHJ3MgbWV0YWRhdGEgc2VnbWVudHMuXG4gKlxuICogUmUtZW5jb2RpbmcgYW4gaW1hZ2UgdGhyb3VnaCBhIGNhbnZhcyBrZWVwcyBvbmx5IHBpeGVsczogRVhJRiwgR1BTLCBYTVAgYW5kIHRoZSBJQ0MgcHJvZmlsZSBhcmUgYWxsXG4gKiBkcm9wcGVkIGJ5IGNvbnN0cnVjdGlvbiwgYmVjYXVzZSB0aGUgY2FudmFzIGhvbGRzIGRlY29kZWQgc2FtcGxlcyBhbmQgbm90aGluZyBlbHNlLiBUaGVzZSBoZWxwZXJzXG4gKiBsaWZ0IHRoZSBtZXRhZGF0YSBzZWdtZW50cyBvZmYgdGhlIG9yaWdpbmFsIGJ5dGVzIHNvIHRoZXkgY2FuIGJlIHNwbGljZWQgYmFjayBpbnRvIHRoZSByZS1lbmNvZGVkXG4gKiBKUEVHLlxuICovXG5cbmNvbnN0IEFQUDBfTUFSS0VSID0gMHhFMDtcbmNvbnN0IEFQUDFfTUFSS0VSID0gMHhFMTtcbmNvbnN0IEFQUDJfTUFSS0VSID0gMHhFMjtcbmNvbnN0IEVPSV9NQVJLRVIgPSAweEQ5O1xuY29uc3QgTUFSS0VSX1BSRUZJWCA9IDB4RkY7XG5jb25zdCBTT0lfTUFSS0VSID0gMHhEODtcbmNvbnN0IFNPU19NQVJLRVIgPSAweERBO1xuXG5jb25zdCBFWElGX0hFQURFUiA9ICdFeGlmXFwwXFwwJztcbmNvbnN0IElDQ19QUk9GSUxFX0hFQURFUiA9ICdJQ0NfUFJPRklMRVxcMCc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItaHR0cHMgLS0gVGhlIGxpdGVyYWwgYnl0ZXMgQWRvYmUgd3JpdGVzIGludG8gdGhlIGBBUFAxYCBzZWdtZW50LiBJdCBpcyBhIG5hbWVzcGFjZSBpZGVudGlmaWVyLCBuZXZlciBmZXRjaGVkLCBhbmQgcmV3cml0aW5nIGl0IHRvIGBodHRwc2Agd291bGQgc3RvcCBYTVAgZnJvbSBldmVyIG1hdGNoaW5nLlxuY29uc3QgWE1QX0hFQURFUiA9ICdodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvXFwwJztcblxuLyoqXG4gKiBCeXRlcyBmcm9tIHRoZSBzdGFydCBvZiBhIHNlZ21lbnQgdG8gaXRzIHBheWxvYWQ6IHRoZSB0d28gbWFya2VyIGJ5dGVzIHBsdXMgdGhlIHR3byBsZW5ndGggYnl0ZXMuXG4gKi9cbmNvbnN0IFNFR01FTlRfSEVBREVSX1NJWkUgPSA0O1xuXG4vKipcbiAqIFRoZSBzZWdtZW50IGxlbmd0aCBmaWVsZCBpdHNlbGYgY291bnRzIHRoZSB0d28gYnl0ZXMgaXQgb2NjdXBpZXMuXG4gKi9cbmNvbnN0IFNFR01FTlRfTEVOR1RIX1NJWkUgPSAyO1xuXG4vKipcbiAqIFRoZSBgU09JYCBtYXJrZXIgdGhhdCBvcGVucyBldmVyeSBKUEVHLlxuICovXG5jb25zdCBTT0lfU0laRSA9IDI7XG5cbmNvbnN0IEJJR19FTkRJQU5fVElGRl9CWVRFX09SREVSID0gMHg0RF80RDtcbmNvbnN0IElGRF9FTlRSWV9TSVpFID0gMTI7XG4vKipcbiAqIEJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIGFuIElGRCBlbnRyeSB0byBpdHMgaW5saW5lIHZhbHVlOiB0YWcgKDIpICsgdHlwZSAoMikgKyBjb3VudCAoNCkuXG4gKi9cbmNvbnN0IElGRF9FTlRSWV9WQUxVRV9PRkZTRVQgPSA4O1xuY29uc3QgSUZEX0VOVFJZX0NPVU5UX1NJWkUgPSAyO1xuY29uc3QgTElUVExFX0VORElBTl9USUZGX0JZVEVfT1JERVIgPSAweDQ5XzQ5O1xuY29uc3QgT1JJRU5UQVRJT05fVEFHID0gMHgwMV8xMjtcbmNvbnN0IE9SSUVOVEFUSU9OX1VQUklHSFQgPSAxO1xuY29uc3QgVElGRl9IRUFERVJfU0laRSA9IDg7XG5jb25zdCBUSUZGX0lGRF9QT0lOVEVSX09GRlNFVCA9IDQ7XG5jb25zdCBUSUZGX01BR0lDID0gMHgwMF8yQTtcbmNvbnN0IFRJRkZfTUFHSUNfT0ZGU0VUID0gMjtcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgbWV0YWRhdGEgc2VnbWVudHMgb2YgYSBKUEVHLlxuICpcbiAqIFJldHVybnMgZWFjaCBtYXRjaGluZyBzZWdtZW50IHdob2xlIFx1MjAxNCBtYXJrZXIsIGxlbmd0aCBhbmQgcGF5bG9hZCBcdTIwMTQgc29cbiAqIHtAbGluayBpbmplY3RKcGVnTWV0YWRhdGFTZWdtZW50c30gY2FuIHNwbGljZSBpdCBpbnRvIGFub3RoZXIgSlBFRyB1bnRvdWNoZWQuIE9ubHkgdGhlIHNlZ21lbnRzIHRoYXRcbiAqIGNhcnJ5IG1ldGFkYXRhIGFyZSByZXR1cm5lZDogdGhlIEVYSUYgYW5kIFhNUCBgQVBQMWBzIGFuZCB0aGUgSUNDIHByb2ZpbGUgYEFQUDJgLiBgQVBQMGAgKEpGSUYpIGlzXG4gKiBkZWxpYmVyYXRlbHkgbGVmdCBiZWhpbmQsIGJlY2F1c2UgdGhlIHJlLWVuY29kZWQgSlBFRyB3cml0ZXMgaXRzIG93bi5cbiAqXG4gKiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGZvciBhbnl0aGluZyB0aGF0IGlzIG5vdCBhIEpQRUcsIGluY2x1ZGluZyBhIHRydW5jYXRlZCBvciBtYWxmb3JtZWQgb25lIFx1MjAxNCBhXG4gKiBjYWxsZXIgdGhhdCBjYW5ub3QgcHJlc2VydmUgbWV0YWRhdGEgc2hvdWxkIGNhcnJ5IG9uIHdpdGhvdXQgaXQgcmF0aGVyIHRoYW4gZmFpbC5cbiAqXG4gKiBAcGFyYW0gYnl0ZXMgLSBUaGUgYnl0ZXMgb2YgdGhlIHNvdXJjZSBpbWFnZS5cbiAqIEByZXR1cm5zIFRoZSBtZXRhZGF0YSBzZWdtZW50cywgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0SnBlZ01ldGFkYXRhU2VnbWVudHMoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5W10ge1xuICBpZiAoIWNoZWNrSXNKcGVnKGJ5dGVzKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHZpZXcgPSBjcmVhdGVWaWV3KGJ5dGVzKTtcbiAgY29uc3Qgc2VnbWVudHM6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICBsZXQgb2Zmc2V0ID0gU09JX1NJWkU7XG5cbiAgd2hpbGUgKG9mZnNldCArIFNFR01FTlRfSEVBREVSX1NJWkUgPD0gYnl0ZXMubGVuZ3RoKSB7XG4gICAgaWYgKGJ5dGVzW29mZnNldF0gIT09IE1BUktFUl9QUkVGSVgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNvbnN0IG1hcmtlciA9IGJ5dGVzW29mZnNldCArIDFdO1xuICAgIGlmIChtYXJrZXIgPT09IFNPU19NQVJLRVIgfHwgbWFya2VyID09PSBFT0lfTUFSS0VSKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb25zdCBzZWdtZW50TGVuZ3RoID0gdmlldy5nZXRVaW50MTYob2Zmc2V0ICsgU0VHTUVOVF9MRU5HVEhfU0laRSk7XG4gICAgY29uc3Qgc2VnbWVudEVuZCA9IG9mZnNldCArIFNFR01FTlRfTEVOR1RIX1NJWkUgKyBzZWdtZW50TGVuZ3RoO1xuICAgIGlmIChzZWdtZW50TGVuZ3RoIDwgU0VHTUVOVF9MRU5HVEhfU0laRSB8fCBzZWdtZW50RW5kID4gYnl0ZXMubGVuZ3RoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tJc01ldGFkYXRhU2VnbWVudChieXRlcywgb2Zmc2V0LCBtYXJrZXIpKSB7XG4gICAgICBzZWdtZW50cy5wdXNoKGJ5dGVzLnNsaWNlKG9mZnNldCwgc2VnbWVudEVuZCkpO1xuICAgIH1cblxuICAgIG9mZnNldCA9IHNlZ21lbnRFbmQ7XG4gIH1cblxuICByZXR1cm4gc2VnbWVudHM7XG59XG5cbi8qKlxuICogU3BsaWNlcyBtZXRhZGF0YSBzZWdtZW50cyBpbnRvIGEgSlBFRy5cbiAqXG4gKiBUaGUgc2VnbWVudHMgZ28gZGlyZWN0bHkgYWZ0ZXIgdGhlIGBTT0lgIGFuZCB0aGUgcmUtZW5jb2RlZCBKUEVHJ3Mgb3duIGBBUFAwYCwgd2hpY2ggaXMgd2hlcmUgYVxuICogcmVhZGVyIGV4cGVjdHMgdG8gZmluZCB0aGVtLlxuICpcbiAqIEV2ZXJ5IGNvcGllZCBFWElGIGJsb2NrIGhhcyBpdHMgb3JpZW50YXRpb24gdGFnIHJlc2V0IHRvIHVwcmlnaHQuIFRoZSBjYW52YXMgZGVjb2RlIGFscmVhZHkgYXBwbGllZFxuICogdGhlIG9yaWdpbmFsIG9yaWVudGF0aW9uIHRvIHRoZSBwaXhlbHMsIHNvIGNhcnJ5aW5nIHRoZSB0YWcgYWNyb3NzIHZlcmJhdGltIHdvdWxkIHJvdGF0ZSB0aGUgaW1hZ2UgYVxuICogc2Vjb25kIHRpbWUgXHUyMDE0IHRoZSBvbmUgcGllY2Ugb2YgbWV0YWRhdGEgdGhhdCBpcyB3cm9uZyB0byBwcmVzZXJ2ZSBhcy1pcy5cbiAqXG4gKiBAcGFyYW0ganBlZ0J5dGVzIC0gVGhlIGJ5dGVzIG9mIHRoZSByZS1lbmNvZGVkIEpQRUcuXG4gKiBAcGFyYW0gc2VnbWVudHMgLSBUaGUgc2VnbWVudHMgcmV0dXJuZWQgYnkge0BsaW5rIGV4dHJhY3RKcGVnTWV0YWRhdGFTZWdtZW50c30uXG4gKiBAcmV0dXJucyBUaGUgSlBFRyB3aXRoIHRoZSBzZWdtZW50cyBzcGxpY2VkIGluLCBvciB0aGUgaW5wdXQgdW5jaGFuZ2VkIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0byBhZGRcbiAqICAgb3IgdGhlIGlucHV0IGlzIG5vdCBhIEpQRUcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RKcGVnTWV0YWRhdGFTZWdtZW50cyhqcGVnQnl0ZXM6IFVpbnQ4QXJyYXksIHNlZ21lbnRzOiByZWFkb25seSBVaW50OEFycmF5W10pOiBVaW50OEFycmF5IHtcbiAgaWYgKHNlZ21lbnRzLmxlbmd0aCA9PT0gMCB8fCAhY2hlY2tJc0pwZWcoanBlZ0J5dGVzKSkge1xuICAgIHJldHVybiBqcGVnQnl0ZXM7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkU2VnbWVudHMgPSBzZWdtZW50cy5tYXAoKHNlZ21lbnQpID0+IG5vcm1hbGl6ZU9yaWVudGF0aW9uKHNlZ21lbnQpKTtcbiAgY29uc3QgaW5zZXJ0QXQgPSBmaW5kSW5zZXJ0T2Zmc2V0KGpwZWdCeXRlcyk7XG4gIGNvbnN0IGFkZGVkTGVuZ3RoID0gbm9ybWFsaXplZFNlZ21lbnRzLnJlZHVjZSgodG90YWwsIHNlZ21lbnQpID0+IHRvdGFsICsgc2VnbWVudC5sZW5ndGgsIDApO1xuICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShqcGVnQnl0ZXMubGVuZ3RoICsgYWRkZWRMZW5ndGgpO1xuXG4gIHJlc3VsdC5zZXQoanBlZ0J5dGVzLnN1YmFycmF5KDAsIGluc2VydEF0KSwgMCk7XG4gIGxldCB3cml0ZUF0ID0gaW5zZXJ0QXQ7XG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBub3JtYWxpemVkU2VnbWVudHMpIHtcbiAgICByZXN1bHQuc2V0KHNlZ21lbnQsIHdyaXRlQXQpO1xuICAgIHdyaXRlQXQgKz0gc2VnbWVudC5sZW5ndGg7XG4gIH1cbiAgcmVzdWx0LnNldChqcGVnQnl0ZXMuc3ViYXJyYXkoaW5zZXJ0QXQpLCB3cml0ZUF0KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjaGVja0lzSnBlZyhieXRlczogVWludDhBcnJheSk6IGJvb2xlYW4ge1xuICByZXR1cm4gYnl0ZXMubGVuZ3RoID49IFNPSV9TSVpFICYmIGJ5dGVzWzBdID09PSBNQVJLRVJfUFJFRklYICYmIGJ5dGVzWzFdID09PSBTT0lfTUFSS0VSO1xufVxuXG5mdW5jdGlvbiBjaGVja0lzTWV0YWRhdGFTZWdtZW50KGJ5dGVzOiBVaW50OEFycmF5LCBvZmZzZXQ6IG51bWJlciwgbWFya2VyOiBudW1iZXIgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgY29uc3QgcGF5bG9hZE9mZnNldCA9IG9mZnNldCArIFNFR01FTlRfSEVBREVSX1NJWkU7XG4gIHJldHVybiBtYXJrZXIgPT09IEFQUDFfTUFSS0VSXG4gICAgPyBjaGVja01hdGNoZXNIZWFkZXIoYnl0ZXMsIHBheWxvYWRPZmZzZXQsIEVYSUZfSEVBREVSKSB8fCBjaGVja01hdGNoZXNIZWFkZXIoYnl0ZXMsIHBheWxvYWRPZmZzZXQsIFhNUF9IRUFERVIpXG4gICAgOiBtYXJrZXIgPT09IEFQUDJfTUFSS0VSICYmIGNoZWNrTWF0Y2hlc0hlYWRlcihieXRlcywgcGF5bG9hZE9mZnNldCwgSUNDX1BST0ZJTEVfSEVBREVSKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tNYXRjaGVzSGVhZGVyKGJ5dGVzOiBVaW50OEFycmF5LCBvZmZzZXQ6IG51bWJlciwgaGVhZGVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKG9mZnNldCArIGhlYWRlci5sZW5ndGggPiBieXRlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGhlYWRlci5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBpZiAoYnl0ZXNbb2Zmc2V0ICsgaW5kZXhdICE9PSBoZWFkZXIuY29kZVBvaW50QXQoaW5kZXgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVWaWV3KGJ5dGVzOiBVaW50OEFycmF5KTogRGF0YVZpZXcge1xuICByZXR1cm4gbmV3IERhdGFWaWV3KGJ5dGVzLmJ1ZmZlciwgYnl0ZXMuYnl0ZU9mZnNldCwgYnl0ZXMuYnl0ZUxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIGZpbmRJbnNlcnRPZmZzZXQoanBlZ0J5dGVzOiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgaWYgKFNPSV9TSVpFICsgU0VHTUVOVF9IRUFERVJfU0laRSA+IGpwZWdCeXRlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gU09JX1NJWkU7XG4gIH1cbiAgaWYgKGpwZWdCeXRlc1tTT0lfU0laRV0gIT09IE1BUktFUl9QUkVGSVggfHwganBlZ0J5dGVzW1NPSV9TSVpFICsgMV0gIT09IEFQUDBfTUFSS0VSKSB7XG4gICAgcmV0dXJuIFNPSV9TSVpFO1xuICB9XG5cbiAgY29uc3QgYXBwMEVuZCA9IFNPSV9TSVpFICsgU0VHTUVOVF9MRU5HVEhfU0laRSArIGNyZWF0ZVZpZXcoanBlZ0J5dGVzKS5nZXRVaW50MTYoU09JX1NJWkUgKyBTRUdNRU5UX0xFTkdUSF9TSVpFKTtcbiAgcmV0dXJuIGFwcDBFbmQgPiBqcGVnQnl0ZXMubGVuZ3RoID8gU09JX1NJWkUgOiBhcHAwRW5kO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVPcmllbnRhdGlvbihzZWdtZW50OiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gIGlmIChzZWdtZW50WzFdICE9PSBBUFAxX01BUktFUiB8fCAhY2hlY2tNYXRjaGVzSGVhZGVyKHNlZ21lbnQsIFNFR01FTlRfSEVBREVSX1NJWkUsIEVYSUZfSEVBREVSKSkge1xuICAgIHJldHVybiBzZWdtZW50O1xuICB9XG5cbiAgY29uc3QgdGlmZk9mZnNldCA9IFNFR01FTlRfSEVBREVSX1NJWkUgKyBFWElGX0hFQURFUi5sZW5ndGg7XG4gIGlmICh0aWZmT2Zmc2V0ICsgVElGRl9IRUFERVJfU0laRSA+IHNlZ21lbnQubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHNlZ21lbnQ7XG4gIH1cblxuICBjb25zdCB2aWV3ID0gY3JlYXRlVmlldyhzZWdtZW50KTtcbiAgY29uc3QgYnl0ZU9yZGVyID0gdmlldy5nZXRVaW50MTYodGlmZk9mZnNldCk7XG4gIGNvbnN0IGlzTGl0dGxlRW5kaWFuID0gYnl0ZU9yZGVyID09PSBMSVRUTEVfRU5ESUFOX1RJRkZfQllURV9PUkRFUjtcbiAgaWYgKCFpc0xpdHRsZUVuZGlhbiAmJiBieXRlT3JkZXIgIT09IEJJR19FTkRJQU5fVElGRl9CWVRFX09SREVSKSB7XG4gICAgcmV0dXJuIHNlZ21lbnQ7XG4gIH1cblxuICBpZiAodmlldy5nZXRVaW50MTYodGlmZk9mZnNldCArIFRJRkZfTUFHSUNfT0ZGU0VULCBpc0xpdHRsZUVuZGlhbikgIT09IFRJRkZfTUFHSUMpIHtcbiAgICByZXR1cm4gc2VnbWVudDtcbiAgfVxuXG4gIGNvbnN0IGlmZE9mZnNldCA9IHRpZmZPZmZzZXQgKyB2aWV3LmdldFVpbnQzMih0aWZmT2Zmc2V0ICsgVElGRl9JRkRfUE9JTlRFUl9PRkZTRVQsIGlzTGl0dGxlRW5kaWFuKTtcbiAgaWYgKGlmZE9mZnNldCArIElGRF9FTlRSWV9DT1VOVF9TSVpFID4gc2VnbWVudC5sZW5ndGgpIHtcbiAgICByZXR1cm4gc2VnbWVudDtcbiAgfVxuXG4gIGNvbnN0IGVudHJ5Q291bnQgPSB2aWV3LmdldFVpbnQxNihpZmRPZmZzZXQsIGlzTGl0dGxlRW5kaWFuKTtcbiAgY29uc3QgZW50cmllc09mZnNldCA9IGlmZE9mZnNldCArIElGRF9FTlRSWV9DT1VOVF9TSVpFO1xuICBpZiAoZW50cmllc09mZnNldCArIGVudHJ5Q291bnQgKiBJRkRfRU5UUllfU0laRSA+IHNlZ21lbnQubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHNlZ21lbnQ7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShzZWdtZW50KTtcbiAgY29uc3QgcmVzdWx0VmlldyA9IGNyZWF0ZVZpZXcocmVzdWx0KTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGVudHJ5Q291bnQ7IGluZGV4KyspIHtcbiAgICBjb25zdCBlbnRyeU9mZnNldCA9IGVudHJpZXNPZmZzZXQgKyBpbmRleCAqIElGRF9FTlRSWV9TSVpFO1xuICAgIGlmIChyZXN1bHRWaWV3LmdldFVpbnQxNihlbnRyeU9mZnNldCwgaXNMaXR0bGVFbmRpYW4pID09PSBPUklFTlRBVElPTl9UQUcpIHtcbiAgICAgIHJlc3VsdFZpZXcuc2V0VWludDE2KGVudHJ5T2Zmc2V0ICsgSUZEX0VOVFJZX1ZBTFVFX09GRlNFVCwgT1JJRU5UQVRJT05fVVBSSUdIVCwgaXNMaXR0bGVFbmRpYW4pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iXSwKICAibWFwcGlu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
@@ -0,0 +1,2 @@
1
+ /// <reference lib="es2022" />
2
+ /// <reference lib="esnext.disposable" />
@@ -3,50 +3,6 @@ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
3
  if you want to view the source, please visit the github repository of this plugin
4
4
  */
5
5
 
6
- (function () {
7
- function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
- symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
9
- symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
10
- }
11
-
12
- function ensureBrowserProcess() {
13
- const browserProcess = {
14
- browser: true,
15
- cwd() {
16
- return '/';
17
- },
18
- env: {},
19
- platform: 'android'
20
- };
21
-
22
- // eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
23
- const existingProcess = globalThis.process;
24
-
25
- if (!existingProcess) {
26
- // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
27
- globalThis.process = browserProcess;
28
- return;
29
- }
30
-
31
- if (existingProcess.versions?.node) {
32
- return;
33
- }
34
-
35
- const existingProcessRecord = existingProcess;
36
-
37
- for (const [key, value] of Object.entries(browserProcess)) {
38
- existingProcessRecord[key] ??= value;
39
- }
40
-
41
- existingProcessRecord['browser'] = true;
42
- }
43
-
44
- (function initEsm() {
45
- ensureDisposeSymbols();
46
- ensureBrowserProcess();
47
- })();
48
- })();
49
-
50
6
  const LIBRARY_NAME = "@mnaoumov/typescript-lib";
51
7
  const DEFAULT_DEBUG_NAMESPACE = "typescript-lib";
52
8
  const DEFAULT_PARAMS = {
@@ -115,4 +71,4 @@ export {
115
71
  LIBRARY_NAME,
116
72
  Library
117
73
  };
118
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2xpYnJhcnkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBIZWxwZXJzIGZvciB3b3JraW5nIHdpdGggdGhlIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWJgIGxpYnJhcnkuXG4gKi9cblxuLyoqXG4gKiBBIG5hbWUgb2YgdGhlIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWJgIGxpYnJhcnkuXG4gKi9cbmV4cG9ydCBjb25zdCBMSUJSQVJZX05BTUUgPSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliJztcblxuLyoqXG4gKiBUaGUgZGVidWcgbmFtZXNwYWNlIHRoZSBsaWJyYXJ5J3Mgb3duIGRlYnVnZ2VycyBsaXZlIHVuZGVyIHVudGlsIHtAbGluayBMaWJyYXJ5LmluaXR9IHN1cHBsaWVzIGFub3RoZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0RFQlVHX05BTUVTUEFDRSA9ICd0eXBlc2NyaXB0LWxpYic7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIExpYnJhcnkuaW5pdH0uXG4gKlxuICogVGhlc2UgYXJlIHB1cmVseSBjb3NtZXRpYyB2YWx1ZXMgdGhlIGhvc3QgaW5qZWN0cyBvbmNlIGF0IGluaXRpYWxpemF0aW9uLCBzbyB0aGUgbGlicmFyeSBpdHNlbGYgY2Fycmllc1xuICogbm8ga25vd2xlZGdlIG9mIHdobyBob3N0cyBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWJyYXJ5SW5pdFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgVVJMIG9mIHRoZSBndWlkZSBleHBsYWluaW5nIGhvdyB0byB0dXJuIGRlYnVnIG1lc3NhZ2VzIG9uIGFuZCBvZmYsIG5hbWVkIGluIHRoZSBsaWJyYXJ5J3MgZGVidWcgbWVzc2FnZXMuXG4gICAqIFdpdGhvdXQgb25lLCB0aGUgbWVzc2FnZXMgbmFtZSBubyBndWlkZS5cbiAgICovXG4gIHJlYWRvbmx5IGRlYnVnR3VpZGVVcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lc3BhY2UgdGhlIGxpYnJhcnkncyBvd24gZGVidWdnZXJzIGxpdmUgdW5kZXIuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0RFQlVHX05BTUVTUEFDRX0uXG4gICAqIEEgaG9zdCB0aGF0IHB1Ymxpc2hlcyBpdHMgb3duIGRlYnVnIG5hbWVzcGFjZSB0byBpdHMgdXNlcnMgcGFzc2VzIGl0IGhlcmUsIHNvIHRoZWlyIGZpbHRlcnMga2VlcCBtYXRjaGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGRlYnVnTmFtZXNwYWNlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZXNwYWNlIHByZWZpeCBwcmVwZW5kZWQgdG8gdGhlIGxpYnJhcnkncyBkZWJ1ZyBuYW1lc3BhY2VzIChlLmcuIGAke3BsdWdpbklkfTpgKS5cbiAgICovXG4gIHJlYWRvbmx5IGRlYnVnUHJlZml4TmFtZXNwYWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZGVidWcgbG9nZ2luZyBzaG91bGQgYXBwZW5kIGEgcmljaCBEZXZUb29scyBzdGFjayB0cmFjZS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFByaW50U3RhY2tUcmFjZTogYm9vbGVhbjtcbn1cblxuY29uc3QgREVGQVVMVF9QQVJBTVM6IExpYnJhcnlJbml0UGFyYW1zID0ge1xuICBkZWJ1Z1ByZWZpeE5hbWVzcGFjZTogJycsXG4gIHNob3VsZFByaW50U3RhY2tUcmFjZTogZmFsc2Vcbn07XG5cbi8qKlxuICogVGhlIHNpbmdsZSwgZGV0ZXJtaW5pc3RpYyBpbml0aWFsaXphdGlvbiBlbnRyeSBwb2ludCBmb3IgdGhlIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWJgIGxpYnJhcnkuXG4gKlxuICogVGhlIGhvc3QgY2FsbHMge0BsaW5rIExpYnJhcnkuaW5pdH0gZXhhY3RseSBvbmNlIHRvIHB1c2ggaXRzIGNvc21ldGljIGNvbmZpZ3VyYXRpb247IHRoZSBsaWJyYXJ5IG9ubHlcbiAqIHJlYWRzIGl0IHRocm91Z2ggdGhlIGdldHRlcnMuIENhbGxpbmcge0BsaW5rIExpYnJhcnkuaW5pdH0gbW9yZSB0aGFuIG9uY2UgdGhyb3dzIFx1MjAxNFxuICoge0BsaW5rIExpYnJhcnkucmVzZXRUb0RlZmF1bHR9IGNsZWFycyB0aGUgc3RhdGUgKGUuZy4gYmV0d2VlbiB0ZXN0cywgb3Igb24gdW5sb2FkKSBhbmQgYWxsb3dzXG4gKiByZS1pbml0aWFsaXphdGlvbi5cbiAqL1xuY2xhc3MgTGlicmFyeUNvbnRleHQge1xuICAvKipcbiAgICogVGhlIFVSTCBvZiB0aGUgZ3VpZGUgZXhwbGFpbmluZyBob3cgdG8gdHVybiBkZWJ1ZyBtZXNzYWdlcyBvbiBhbmQgb2ZmLiBFbXB0eSB1bnRpbCB7QGxpbmsgaW5pdH0gaXMgY2FsbGVkIHdpdGggb25lLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZGVidWcgZ3VpZGUgVVJMLlxuICAgKi9cbiAgcHVibGljIGdldCBkZWJ1Z0d1aWRlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zLmRlYnVnR3VpZGVVcmwgPz8gJyc7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5hbWVzcGFjZSB0aGUgbGlicmFyeSdzIG93biBkZWJ1Z2dlcnMgbGl2ZSB1bmRlci5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGRlYnVnIG5hbWVzcGFjZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZGVidWdOYW1lc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbXMuZGVidWdOYW1lc3BhY2UgPz8gREVGQVVMVF9ERUJVR19OQU1FU1BBQ0U7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5hbWVzcGFjZSBwcmVmaXggcHJlcGVuZGVkIHRvIHRoZSBsaWJyYXJ5J3MgZGVidWcgbmFtZXNwYWNlcy4gRW1wdHkgdW50aWwge0BsaW5rIGluaXR9IGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGRlYnVnIG5hbWVzcGFjZSBwcmVmaXguXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlYnVnUHJlZml4TmFtZXNwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zLmRlYnVnUHJlZml4TmFtZXNwYWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZGVidWcgbG9nZ2luZyBzaG91bGQgYXBwZW5kIGEgcmljaCBEZXZUb29scyBzdGFjayB0cmFjZS4gYGZhbHNlYCB1bnRpbCB7QGxpbmsgaW5pdH0gaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRvIHByaW50IHN0YWNrIHRyYWNlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvdWxkUHJpbnRTdGFja1RyYWNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBhcmFtcy5zaG91bGRQcmludFN0YWNrVHJhY2U7XG4gIH1cblxuICBwcml2YXRlIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIHBhcmFtczogTGlicmFyeUluaXRQYXJhbXMgPSB7IC4uLkRFRkFVTFRfUEFSQU1TIH07XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IHdpdGggdGhlIGhvc3QncyBjb3NtZXRpYyBjb25maWd1cmF0aW9uLiBNdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2U7IGNhbGxpbmcgaXRcbiAgICogYWdhaW4gYmVmb3JlIHtAbGluayByZXNldFRvRGVmYXVsdH0gdGhyb3dzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNvc21ldGljIGNvbmZpZ3VyYXRpb24gdG8gaW5qZWN0LlxuICAgKi9cbiAgcHVibGljIGluaXQocGFyYW1zOiBMaWJyYXJ5SW5pdFBhcmFtcyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtMSUJSQVJZX05BTUV9IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQuIENhbGwgTGlicmFyeS5yZXNldFRvRGVmYXVsdCgpIGJlZm9yZSBpbml0aWFsaXppbmcgYWdhaW4uYCk7XG4gICAgfVxuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgdGhpcy5wYXJhbXMgPSB7IC4uLnBhcmFtcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgbGlicmFyeSBiYWNrIHRvIGl0cyBkZWZhdWx0ICh1bmluaXRpYWxpemVkKSBzdGF0ZSwgYWxsb3dpbmcge0BsaW5rIGluaXR9IHRvIGJlIGNhbGxlZCBhZ2Fpbi5cbiAgICovXG4gIHB1YmxpYyByZXNldFRvRGVmYXVsdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnBhcmFtcyA9IHsgLi4uREVGQVVMVF9QQVJBTVMgfTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBzaW5nbGUge0BsaW5rIExpYnJhcnlDb250ZXh0fSBpbnN0YW5jZSBcdTIwMTQgdGhlIGxpYnJhcnkncyBkZXRlcm1pbmlzdGljIGluaXRpYWxpemF0aW9uIGVudHJ5IHBvaW50LlxuICovXG5leHBvcnQgY29uc3QgTGlicmFyeSA9IG5ldyBMaWJyYXJ5Q29udGV4dCgpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVNPLE1BQU0sZUFBZTtBQUtyQixNQUFNLDBCQUEwQjtBQWdDdkMsTUFBTSxpQkFBb0M7QUFBQSxFQUN4QyxzQkFBc0I7QUFBQSxFQUN0Qix1QkFBdUI7QUFDekI7QUFVQSxNQUFNLGVBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNbkIsSUFBVyxnQkFBd0I7QUFDakMsV0FBTyxLQUFLLE9BQU8saUJBQWlCO0FBQUEsRUFDdEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxJQUFXLGlCQUF5QjtBQUNsQyxXQUFPLEtBQUssT0FBTyxrQkFBa0I7QUFBQSxFQUN2QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLElBQVcsdUJBQStCO0FBQ3hDLFdBQU8sS0FBSyxPQUFPO0FBQUEsRUFDckI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxJQUFXLHdCQUFpQztBQUMxQyxXQUFPLEtBQUssT0FBTztBQUFBLEVBQ3JCO0FBQUEsRUFFUSxnQkFBZ0I7QUFBQSxFQUVoQixTQUE0QixFQUFFLEdBQUcsZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUWpELEtBQUssUUFBaUM7QUFDM0MsUUFBSSxLQUFLLGVBQWU7QUFDdEIsWUFBTSxJQUFJLE1BQU0sR0FBRyxZQUFZLG1GQUFtRjtBQUFBLElBQ3BIO0FBQ0EsU0FBSyxnQkFBZ0I7QUFDckIsU0FBSyxTQUFTLEVBQUUsR0FBRyxPQUFPO0FBQUEsRUFDNUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLGlCQUF1QjtBQUM1QixTQUFLLGdCQUFnQjtBQUNyQixTQUFLLFNBQVMsRUFBRSxHQUFHLGVBQWU7QUFBQSxFQUNwQztBQUNGO0FBS08sTUFBTSxVQUFVLElBQUksZUFBZTsiLAogICJuYW1lcyI6IFtdCn0K
74
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2xpYnJhcnkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBIZWxwZXJzIGZvciB3b3JraW5nIHdpdGggdGhlIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWJgIGxpYnJhcnkuXG4gKi9cblxuLyoqXG4gKiBBIG5hbWUgb2YgdGhlIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWJgIGxpYnJhcnkuXG4gKi9cbmV4cG9ydCBjb25zdCBMSUJSQVJZX05BTUUgPSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliJztcblxuLyoqXG4gKiBUaGUgZGVidWcgbmFtZXNwYWNlIHRoZSBsaWJyYXJ5J3Mgb3duIGRlYnVnZ2VycyBsaXZlIHVuZGVyIHVudGlsIHtAbGluayBMaWJyYXJ5LmluaXR9IHN1cHBsaWVzIGFub3RoZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0RFQlVHX05BTUVTUEFDRSA9ICd0eXBlc2NyaXB0LWxpYic7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIExpYnJhcnkuaW5pdH0uXG4gKlxuICogVGhlc2UgYXJlIHB1cmVseSBjb3NtZXRpYyB2YWx1ZXMgdGhlIGhvc3QgaW5qZWN0cyBvbmNlIGF0IGluaXRpYWxpemF0aW9uLCBzbyB0aGUgbGlicmFyeSBpdHNlbGYgY2Fycmllc1xuICogbm8ga25vd2xlZGdlIG9mIHdobyBob3N0cyBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWJyYXJ5SW5pdFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgVVJMIG9mIHRoZSBndWlkZSBleHBsYWluaW5nIGhvdyB0byB0dXJuIGRlYnVnIG1lc3NhZ2VzIG9uIGFuZCBvZmYsIG5hbWVkIGluIHRoZSBsaWJyYXJ5J3MgZGVidWcgbWVzc2FnZXMuXG4gICAqIFdpdGhvdXQgb25lLCB0aGUgbWVzc2FnZXMgbmFtZSBubyBndWlkZS5cbiAgICovXG4gIHJlYWRvbmx5IGRlYnVnR3VpZGVVcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lc3BhY2UgdGhlIGxpYnJhcnkncyBvd24gZGVidWdnZXJzIGxpdmUgdW5kZXIuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0RFQlVHX05BTUVTUEFDRX0uXG4gICAqIEEgaG9zdCB0aGF0IHB1Ymxpc2hlcyBpdHMgb3duIGRlYnVnIG5hbWVzcGFjZSB0byBpdHMgdXNlcnMgcGFzc2VzIGl0IGhlcmUsIHNvIHRoZWlyIGZpbHRlcnMga2VlcCBtYXRjaGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGRlYnVnTmFtZXNwYWNlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZXNwYWNlIHByZWZpeCBwcmVwZW5kZWQgdG8gdGhlIGxpYnJhcnkncyBkZWJ1ZyBuYW1lc3BhY2VzIChlLmcuIGAke3BsdWdpbklkfTpgKS5cbiAgICovXG4gIHJlYWRvbmx5IGRlYnVnUHJlZml4TmFtZXNwYWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZGVidWcgbG9nZ2luZyBzaG91bGQgYXBwZW5kIGEgcmljaCBEZXZUb29scyBzdGFjayB0cmFjZS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFByaW50U3RhY2tUcmFjZTogYm9vbGVhbjtcbn1cblxuY29uc3QgREVGQVVMVF9QQVJBTVM6IExpYnJhcnlJbml0UGFyYW1zID0ge1xuICBkZWJ1Z1ByZWZpeE5hbWVzcGFjZTogJycsXG4gIHNob3VsZFByaW50U3RhY2tUcmFjZTogZmFsc2Vcbn07XG5cbi8qKlxuICogVGhlIHNpbmdsZSwgZGV0ZXJtaW5pc3RpYyBpbml0aWFsaXphdGlvbiBlbnRyeSBwb2ludCBmb3IgdGhlIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWJgIGxpYnJhcnkuXG4gKlxuICogVGhlIGhvc3QgY2FsbHMge0BsaW5rIExpYnJhcnkuaW5pdH0gZXhhY3RseSBvbmNlIHRvIHB1c2ggaXRzIGNvc21ldGljIGNvbmZpZ3VyYXRpb247IHRoZSBsaWJyYXJ5IG9ubHlcbiAqIHJlYWRzIGl0IHRocm91Z2ggdGhlIGdldHRlcnMuIENhbGxpbmcge0BsaW5rIExpYnJhcnkuaW5pdH0gbW9yZSB0aGFuIG9uY2UgdGhyb3dzIFx1MjAxNFxuICoge0BsaW5rIExpYnJhcnkucmVzZXRUb0RlZmF1bHR9IGNsZWFycyB0aGUgc3RhdGUgKGUuZy4gYmV0d2VlbiB0ZXN0cywgb3Igb24gdW5sb2FkKSBhbmQgYWxsb3dzXG4gKiByZS1pbml0aWFsaXphdGlvbi5cbiAqL1xuY2xhc3MgTGlicmFyeUNvbnRleHQge1xuICAvKipcbiAgICogVGhlIFVSTCBvZiB0aGUgZ3VpZGUgZXhwbGFpbmluZyBob3cgdG8gdHVybiBkZWJ1ZyBtZXNzYWdlcyBvbiBhbmQgb2ZmLiBFbXB0eSB1bnRpbCB7QGxpbmsgaW5pdH0gaXMgY2FsbGVkIHdpdGggb25lLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZGVidWcgZ3VpZGUgVVJMLlxuICAgKi9cbiAgcHVibGljIGdldCBkZWJ1Z0d1aWRlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zLmRlYnVnR3VpZGVVcmwgPz8gJyc7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5hbWVzcGFjZSB0aGUgbGlicmFyeSdzIG93biBkZWJ1Z2dlcnMgbGl2ZSB1bmRlci5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGRlYnVnIG5hbWVzcGFjZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZGVidWdOYW1lc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbXMuZGVidWdOYW1lc3BhY2UgPz8gREVGQVVMVF9ERUJVR19OQU1FU1BBQ0U7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5hbWVzcGFjZSBwcmVmaXggcHJlcGVuZGVkIHRvIHRoZSBsaWJyYXJ5J3MgZGVidWcgbmFtZXNwYWNlcy4gRW1wdHkgdW50aWwge0BsaW5rIGluaXR9IGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGRlYnVnIG5hbWVzcGFjZSBwcmVmaXguXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlYnVnUHJlZml4TmFtZXNwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zLmRlYnVnUHJlZml4TmFtZXNwYWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZGVidWcgbG9nZ2luZyBzaG91bGQgYXBwZW5kIGEgcmljaCBEZXZUb29scyBzdGFjayB0cmFjZS4gYGZhbHNlYCB1bnRpbCB7QGxpbmsgaW5pdH0gaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRvIHByaW50IHN0YWNrIHRyYWNlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvdWxkUHJpbnRTdGFja1RyYWNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBhcmFtcy5zaG91bGRQcmludFN0YWNrVHJhY2U7XG4gIH1cblxuICBwcml2YXRlIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIHBhcmFtczogTGlicmFyeUluaXRQYXJhbXMgPSB7IC4uLkRFRkFVTFRfUEFSQU1TIH07XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IHdpdGggdGhlIGhvc3QncyBjb3NtZXRpYyBjb25maWd1cmF0aW9uLiBNdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2U7IGNhbGxpbmcgaXRcbiAgICogYWdhaW4gYmVmb3JlIHtAbGluayByZXNldFRvRGVmYXVsdH0gdGhyb3dzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNvc21ldGljIGNvbmZpZ3VyYXRpb24gdG8gaW5qZWN0LlxuICAgKi9cbiAgcHVibGljIGluaXQocGFyYW1zOiBMaWJyYXJ5SW5pdFBhcmFtcyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtMSUJSQVJZX05BTUV9IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQuIENhbGwgTGlicmFyeS5yZXNldFRvRGVmYXVsdCgpIGJlZm9yZSBpbml0aWFsaXppbmcgYWdhaW4uYCk7XG4gICAgfVxuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgdGhpcy5wYXJhbXMgPSB7IC4uLnBhcmFtcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgbGlicmFyeSBiYWNrIHRvIGl0cyBkZWZhdWx0ICh1bmluaXRpYWxpemVkKSBzdGF0ZSwgYWxsb3dpbmcge0BsaW5rIGluaXR9IHRvIGJlIGNhbGxlZCBhZ2Fpbi5cbiAgICovXG4gIHB1YmxpYyByZXNldFRvRGVmYXVsdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnBhcmFtcyA9IHsgLi4uREVGQVVMVF9QQVJBTVMgfTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBzaW5nbGUge0BsaW5rIExpYnJhcnlDb250ZXh0fSBpbnN0YW5jZSBcdTIwMTQgdGhlIGxpYnJhcnkncyBkZXRlcm1pbmlzdGljIGluaXRpYWxpemF0aW9uIGVudHJ5IHBvaW50LlxuICovXG5leHBvcnQgY29uc3QgTGlicmFyeSA9IG5ldyBMaWJyYXJ5Q29udGV4dCgpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFTTyxNQUFNLGVBQWU7QUFLckIsTUFBTSwwQkFBMEI7QUFnQ3ZDLE1BQU0saUJBQW9DO0FBQUEsRUFDeEMsc0JBQXNCO0FBQUEsRUFDdEIsdUJBQXVCO0FBQ3pCO0FBVUEsTUFBTSxlQUFlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTW5CLElBQVcsZ0JBQXdCO0FBQ2pDLFdBQU8sS0FBSyxPQUFPLGlCQUFpQjtBQUFBLEVBQ3RDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsSUFBVyxpQkFBeUI7QUFDbEMsV0FBTyxLQUFLLE9BQU8sa0JBQWtCO0FBQUEsRUFDdkM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxJQUFXLHVCQUErQjtBQUN4QyxXQUFPLEtBQUssT0FBTztBQUFBLEVBQ3JCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsSUFBVyx3QkFBaUM7QUFDMUMsV0FBTyxLQUFLLE9BQU87QUFBQSxFQUNyQjtBQUFBLEVBRVEsZ0JBQWdCO0FBQUEsRUFFaEIsU0FBNEIsRUFBRSxHQUFHLGVBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFqRCxLQUFLLFFBQWlDO0FBQzNDLFFBQUksS0FBSyxlQUFlO0FBQ3RCLFlBQU0sSUFBSSxNQUFNLEdBQUcsWUFBWSxtRkFBbUY7QUFBQSxJQUNwSDtBQUNBLFNBQUssZ0JBQWdCO0FBQ3JCLFNBQUssU0FBUyxFQUFFLEdBQUcsT0FBTztBQUFBLEVBQzVCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxpQkFBdUI7QUFDNUIsU0FBSyxnQkFBZ0I7QUFDckIsU0FBSyxTQUFTLEVBQUUsR0FBRyxlQUFlO0FBQUEsRUFDcEM7QUFDRjtBQUtPLE1BQU0sVUFBVSxJQUFJLGVBQWU7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -1,4 +1,4 @@
1
- /// <reference path="./library.d.mts" />
1
+ /// <reference path="./library-references.d.mts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -3,50 +3,6 @@ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
3
  if you want to view the source, please visit the github repository of this plugin
4
4
  */
5
5
 
6
- (function () {
7
- function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
- symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
9
- symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
10
- }
11
-
12
- function ensureBrowserProcess() {
13
- const browserProcess = {
14
- browser: true,
15
- cwd() {
16
- return '/';
17
- },
18
- env: {},
19
- platform: 'android'
20
- };
21
-
22
- // eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
23
- const existingProcess = globalThis.process;
24
-
25
- if (!existingProcess) {
26
- // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
27
- globalThis.process = browserProcess;
28
- return;
29
- }
30
-
31
- if (existingProcess.versions?.node) {
32
- return;
33
- }
34
-
35
- const existingProcessRecord = existingProcess;
36
-
37
- for (const [key, value] of Object.entries(browserProcess)) {
38
- existingProcessRecord[key] ??= value;
39
- }
40
-
41
- existingProcessRecord['browser'] = true;
42
- }
43
-
44
- (function initEsm() {
45
- ensureDisposeSymbols();
46
- ensureBrowserProcess();
47
- })();
48
- })();
49
-
50
6
  import { errorToString } from "./error.mjs";
51
7
  import { getFunctionExpressionString } from "./function.mjs";
52
8
  import { escapeRegExp } from "./reg-exp.mjs";
@@ -564,4 +520,4 @@ export {
564
520
  setNestedPropertyValue,
565
521
  toJson
566
522
  };
567
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29iamVjdC11dGlscy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBPYmplY3RzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ29uc3RydWN0b3IsXG4gIFJlcXVpcmVkS2V5c09mLFxuICBVbmRlZmluZWRPblBhcnRpYWxEZWVwXG59IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgR2VuZXJpY09iamVjdCB9IGZyb20gJy4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHR5cGUge1xuICBFeGFjdE1lbWJlcnMsXG4gIE1heWJlUmV0dXJuLFxuICBTdHJpbmdLZXlzXG59IGZyb20gJy4vdHlwZS50cyc7XG5cbmltcG9ydCB7IGVycm9yVG9TdHJpbmcgfSBmcm9tICcuL2Vycm9yLnRzJztcbmltcG9ydCB7IGdldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyB9IGZyb20gJy4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnLi9yZWctZXhwLnRzJztcbmltcG9ydCB7IHJlcGxhY2VBbGwgfSBmcm9tICcuL3N0cmluZy50cyc7XG5pbXBvcnQge1xuICBhc3NlcnROZXZlcixcbiAgZW5zdXJlR2VuZXJpY09iamVjdCxcbiAgZW5zdXJlTm9uTnVsbGFibGVcbn0gZnJvbSAnLi90eXBlLWd1YXJkcy50cyc7XG5cbi8qKlxuICogU3BlY2lmaWVzIGhvdyBmdW5jdGlvbnMgc2hvdWxkIGJlIGhhbmRsZWQgaW4gdGhlIEpTT04gb3V0cHV0LlxuICovXG5leHBvcnQgZW51bSBGdW5jdGlvbkhhbmRsaW5nTW9kZSB7XG4gIC8qKlxuICAgKiBFeGNsdWRlcyBmdW5jdGlvbnMgZnJvbSB0aGUgSlNPTiBvdXRwdXQuXG4gICAqL1xuICBFeGNsdWRlID0gJ2V4Y2x1ZGUnLFxuICAvKipcbiAgICogSW5jbHVkZXMgdGhlIGZ1bGwgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiB0aGUgSlNPTiBvdXRwdXQuXG4gICAqL1xuICBGdWxsID0gJ2Z1bGwnLFxuICAvKipcbiAgICogSW5jbHVkZXMgb25seSB0aGUgZnVuY3Rpb24gbmFtZSBpbiB0aGUgSlNPTiBvdXRwdXQuXG4gICAqL1xuICBOYW1lT25seSA9ICduYW1lT25seSdcbn1cblxuZW51bSBUb2tlblN1YnN0aXR1dGlvbktleSB7XG4gIENpcmN1bGFyUmVmZXJlbmNlID0gJ0NpcmN1bGFyUmVmZXJlbmNlJyxcbiAgRnVuY3Rpb24gPSAnRnVuY3Rpb24nLFxuICBNYXhEZXB0aExpbWl0UmVhY2hlZCA9ICdNYXhEZXB0aExpbWl0UmVhY2hlZCcsXG4gIE1heERlcHRoTGltaXRSZWFjaGVkQXJyYXkgPSAnTWF4RGVwdGhMaW1pdFJlYWNoZWRBcnJheScsXG4gIFRvSlNPTkZhaWxlZCA9ICdUb0pTT05GYWlsZWQnLFxuICBVbmRlZmluZWQgPSAnVW5kZWZpbmVkJ1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB0b0pzb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvSnNvbk9wdGlvbnMge1xuICAvKipcbiAgICogU3BlY2lmaWVzIGhvdyBmdW5jdGlvbnMgc2hvdWxkIGJlIGhhbmRsZWQgaW4gdGhlIEpTT04gb3V0cHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgRnVuY3Rpb25IYW5kbGluZ01vZGUuRXhjbHVkZX1cbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uSGFuZGxpbmdNb2RlOiBGdW5jdGlvbkhhbmRsaW5nTW9kZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGRlcHRoIG9mIG5lc3RlZCBvYmplY3RzIHRvIGluY2x1ZGUgaW4gdGhlIEpTT04gb3V0cHV0LlxuICAgKiBVc2UgYC0xYCBmb3Igbm8gbGltaXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAtMWBcbiAgICovXG4gIHJlYWRvbmx5IG1heERlcHRoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGNhdGNoIGVycm9ycyBpbiBgdG9KU09OKClgIGFuZCByZXBsYWNlIHRoZW0gd2l0aCBhIHBsYWNlaG9sZGVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRDYXRjaFRvSlNPTkVycm9yczogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gaGFuZGxlIGNpcmN1bGFyIHJlZmVyZW5jZXMgaW4gdGhlIEpTT04gb3V0cHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRIYW5kbGVDaXJjdWxhclJlZmVyZW5jZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGhhbmRsZSBlcnJvcnMgaW4gdGhlIEpTT04gb3V0cHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRIYW5kbGVFcnJvcnM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGhhbmRsZSBgdW5kZWZpbmVkYCB2YWx1ZXMgaW4gdGhlIEpTT04gb3V0cHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRIYW5kbGVVbmRlZmluZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHNvcnQgdGhlIGtleXMgb2YgdGhlIEpTT04gb3V0cHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTb3J0S2V5czogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgSlNPTiBvdXRwdXQuIFRoaXMgY2FuIGJlIGEgbnVtYmVyIG9mIHNwYWNlcyBvciBhIHN0cmluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDJgXG4gICAqL1xuICByZWFkb25seSBzcGFjZTogbnVtYmVyIHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHN1YnN0aXR1dGlvbnMgdG8gdXNlIGluIHRoZSBKU09OIG91dHB1dC5cbiAgICovXG4gIHJlYWRvbmx5IHRva2VuU3Vic3RpdHV0aW9uczogUGFydGlhbDxUb2tlblN1YnN0aXR1dGlvbnM+O1xufVxuXG5pbnRlcmZhY2UgQXBwbHlTdWJzdGl0dXRpb25zUGFyYW1zIHtcbiAgcmVhZG9ubHkgZnVuY3Rpb25UZXh0czogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG4gIHJlYWRvbmx5IGtleTogVG9rZW5TdWJzdGl0dXRpb25LZXk7XG4gIHJlYWRvbmx5IHN1YnN0aXR1dGlvbnM6IFRva2VuU3Vic3RpdHV0aW9ucztcbn1cblxuaW50ZXJmYWNlIEVxdWFsaXR5Q29tcGFyZXJFbnRyeTxUPiB7XG4gIGNvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxUPjtcbiAgZXF1YWxpdHlDb21wYXJlcjogKGE6IFQsIGI6IFQpID0+IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBKU09OU2VyaWFsaXphYmxlIHtcbiAgdG9KU09OOiAoLi4uJGFyZ3VtZW50czogdW5rbm93bltdKSA9PiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgTW9kdWxlV2l0aERlZmF1bHRFeHBvcnQ8VD4ge1xuICBkZWZhdWx0OiBUO1xufVxuXG5pbnRlcmZhY2UgUmVzb2x2ZWRUb0pzb25PcHRpb25zIGV4dGVuZHMgVG9Kc29uT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHRva2VuU3Vic3RpdHV0aW9uczogVG9rZW5TdWJzdGl0dXRpb25zO1xufVxuXG5pbnRlcmZhY2UgVG9rZW5TdWJzdGl0dXRpb25zIHtcbiAgY2lyY3VsYXJSZWZlcmVuY2U6IHN0cmluZztcbiAgbWF4RGVwdGhMaW1pdFJlYWNoZWQ6IHN0cmluZztcbiAgdG9KU09ORmFpbGVkOiBzdHJpbmc7XG59XG5cbmNvbnN0IEtFWV9TRVBBUkFUT1IgPSAnLic7XG5jb25zdCBQTEFDRUhPTERFUl9LRVlfUFJFRklYID0gJ3RvSnNvbjonO1xuY29uc3QgZXF1YWxpdHlDb21wYXJlckVudHJpZXM6IHJlYWRvbmx5IEVxdWFsaXR5Q29tcGFyZXJFbnRyeTx1bmtub3duPltdID0gW1xuICBjcmVhdGVFcXVhbGl0eUNvbXBhcmVyRW50cnkoQXJyYXlCdWZmZXIsIGlzRGVlcEVxdWFsQXJyYXlCdWZmZXIpLFxuICBjcmVhdGVFcXVhbGl0eUNvbXBhcmVyRW50cnkoRGF0ZSwgaXNEZWVwRXF1YWxEYXRlKSxcbiAgY3JlYXRlRXF1YWxpdHlDb21wYXJlckVudHJ5KFJlZ0V4cCwgaXNEZWVwRXF1YWxSZWdFeHApLFxuICBjcmVhdGVFcXVhbGl0eUNvbXBhcmVyRW50cnk8TWFwPHVua25vd24sIHVua25vd24+PihNYXAsIGlzRGVlcEVxdWFsTWFwKSxcbiAgY3JlYXRlRXF1YWxpdHlDb21wYXJlckVudHJ5PFNldDx1bmtub3duPj4oU2V0LCBpc0RlZXBFcXVhbFNldClcbl07XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNldE5lc3RlZFByb3BlcnR5VmFsdWV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNldE5lc3RlZFByb3BlcnR5VmFsdWVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG9iamVjdCB0byBzZXQgdGhlIG5lc3RlZCBwcm9wZXJ0eSB2YWx1ZSBpbi5cbiAgICovXG4gIHJlYWRvbmx5ICRvYmplY3Q6IEdlbmVyaWNPYmplY3Q7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBuZXN0ZWQgcHJvcGVydHkuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogdW5rbm93bjtcbn1cblxuaW50ZXJmYWNlIEhhbmRsZUFycmF5UGFyYW1zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYHRvSlNPTigpYCBtYXkgYmUgdXNlZCBkdXJpbmcgY29udmVyc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IGNhblVzZVRvSlNPTjogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgcmVjdXJzaW9uIGRlcHRoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGFycmF5IHZhbHVlIHRvIGNvbnZlcnQuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogdW5rbm93bltdO1xufVxuXG5pbnRlcmZhY2UgSGFuZGxlT2JqZWN0UGFyYW1zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYHRvSlNPTigpYCBtYXkgYmUgdXNlZCBkdXJpbmcgY29udmVyc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IGNhblVzZVRvSlNPTjogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgcmVjdXJzaW9uIGRlcHRoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGtleSB1bmRlciB3aGljaCB0aGUgdmFsdWUgaXMgc3RvcmVkIGluIGl0cyBwYXJlbnQuXG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB2YWx1ZSB0byBjb252ZXJ0LlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IG9iamVjdDtcbn1cblxuaW50ZXJmYWNlIEhhbmRsZVBsYWluT2JqZWN0UGFyYW1zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYHRvSlNPTigpYCBtYXkgYmUgdXNlZCBkdXJpbmcgY29udmVyc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IGNhblVzZVRvSlNPTjogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgcmVjdXJzaW9uIGRlcHRoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHBsYWluIG9iamVjdCB2YWx1ZSB0byBjb252ZXJ0LlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IG9iamVjdDtcbn1cblxudHlwZSBLZXlzV2l0aFVuZGVmaW5lZDxUPiA9IEtleXNXaXRoVW5kZWZpbmVkTWFwPFQ+W2tleW9mIFRdO1xuXG50eXBlIEtleXNXaXRoVW5kZWZpbmVkTWFwPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXS0/OiB1bmRlZmluZWQgZXh0ZW5kcyBUW0tdID8gSyA6IG5ldmVyO1xufTtcbnR5cGUgTWFuZGF0b3J5S2V5c1dpdGhVbmRlZmluZWQ8VCBleHRlbmRzIG9iamVjdD4gPSBFeHRyYWN0PFJlcXVpcmVkS2V5c09mPFQ+ICYgU3RyaW5nS2V5czxUPiwgS2V5c1dpdGhVbmRlZmluZWQ8VD4+O1xudHlwZSBSZW1vdmVVbmRlZmluZWRPdmVybG9hZDxUIGV4dGVuZHMgb2JqZWN0PiA9IE1hbmRhdG9yeUtleXNXaXRoVW5kZWZpbmVkPFQ+IGV4dGVuZHMgbmV2ZXIgPyBbb2JqOiBUXVxuICA6IG5ldmVyO1xuXG50eXBlIFJlbW92ZVVuZGVmaW5lZFdpdGhLZXlzT3ZlcmxvYWQ8VCBleHRlbmRzIG9iamVjdCwgSyBleHRlbmRzIHJlYWRvbmx5IHN0cmluZ1tdPiA9IFtvYmo6IFQsIGtleXNUb0tlZXA6IEV4YWN0TWVtYmVyczxNYW5kYXRvcnlLZXlzV2l0aFVuZGVmaW5lZDxUPiwgSz5dO1xuXG5pbnRlcmZhY2UgVG9QbGFpbk9iamVjdFBhcmFtcyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGB0b0pTT04oKWAgbWF5IGJlIHVzZWQgZHVyaW5nIGNvbnZlcnNpb24uXG4gICAqL1xuICByZWFkb25seSBjYW5Vc2VUb0pTT046IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHJlY3Vyc2lvbiBkZXB0aC5cbiAgICovXG4gIHJlYWRvbmx5IGRlcHRoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBrZXkgdW5kZXIgd2hpY2ggdGhlIHZhbHVlIGlzIHN0b3JlZCBpbiBpdHMgcGFyZW50LlxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IHVua25vd247XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHRyeUVudHJ5RXF1YWxpdHl9LlxuICovXG5pbnRlcmZhY2UgVHJ5RW50cnlFcXVhbGl0eVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZmlyc3QgdmFsdWUgdG8gY29tcGFyZS5cbiAgICovXG4gIHJlYWRvbmx5IGE6IHVua25vd247XG5cbiAgLyoqXG4gICAqIFRoZSBzZWNvbmQgdmFsdWUgdG8gY29tcGFyZS5cbiAgICovXG4gIHJlYWRvbmx5IGI6IHVua25vd247XG5cbiAgLyoqXG4gICAqIFRoZSBlcXVhbGl0eSBjb21wYXJlciBlbnRyeSB0byB1c2UuXG4gICAqL1xuICByZWFkb25seSBlbnRyeTogRXF1YWxpdHlDb21wYXJlckVudHJ5PHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgVHJ5SGFuZGxlVG9KU09OUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHJlY3Vyc2lvbiBkZXB0aC5cbiAgICovXG4gIHJlYWRvbmx5IGRlcHRoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBrZXkgdW5kZXIgd2hpY2ggdGhlIHZhbHVlIGlzIHN0b3JlZCBpbiBpdHMgcGFyZW50LlxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdmFsdWUgdG8gY29udmVydC5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiBvYmplY3Q7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSB2YWx1ZSB0byBhIEpTT04tc2VyaWFsaXphYmxlIHBsYWluIG9iamVjdCBhbmQgcmVuZGVycyBpdCBhcyBhIEpTT04gc3RyaW5nLlxuICpcbiAqIEEgZnJlc2ggaW5zdGFuY2UgaXMgY3JlYXRlZCBwZXIge0BsaW5rIHRvSnNvbn0gY2FsbCBzbyB0aGF0IHRoZSBhY2N1bXVsYXRlZCBgZnVuY3Rpb25UZXh0c2BcbiAqIGFuZCB0aGUgYHVzZWRPYmplY3RzYCBjaXJjdWxhci1yZWZlcmVuY2Ugc2V0IG5ldmVyIGxlYWsgYmV0d2VlbiBjb252ZXJzaW9ucy5cbiAqL1xuY2xhc3MgVG9Kc29uQ29udmVydGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBmdWxsT3B0aW9uczogUmVzb2x2ZWRUb0pzb25PcHRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IGZ1bmN0aW9uVGV4dHM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlZE9iamVjdHMgPSBuZXcgV2Vha1NldCgpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGNvbnZlcnRlciwgcmVzb2x2aW5nIHRoZSBwcm92aWRlZCBvcHRpb25zIGFnYWluc3QgdGhlIGRlZmF1bHRzLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgSlNPTiBjb252ZXJzaW9uLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFBhcnRpYWw8VG9Kc29uT3B0aW9ucz4pIHtcbiAgICBjb25zdCBERUZBVUxUX09QVElPTlM6IFJlc29sdmVkVG9Kc29uT3B0aW9ucyA9IHtcbiAgICAgIGZ1bmN0aW9uSGFuZGxpbmdNb2RlOiBGdW5jdGlvbkhhbmRsaW5nTW9kZS5FeGNsdWRlLFxuICAgICAgbWF4RGVwdGg6IC0xLFxuICAgICAgc2hvdWxkQ2F0Y2hUb0pTT05FcnJvcnM6IGZhbHNlLFxuICAgICAgc2hvdWxkSGFuZGxlQ2lyY3VsYXJSZWZlcmVuY2VzOiBmYWxzZSxcbiAgICAgIHNob3VsZEhhbmRsZUVycm9yczogZmFsc2UsXG4gICAgICBzaG91bGRIYW5kbGVVbmRlZmluZWQ6IGZhbHNlLFxuICAgICAgc2hvdWxkU29ydEtleXM6IGZhbHNlLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnMgLS0gRXh0cmFjdGluZyBtYWdpYyBudW1iZXIgYXMgYSBjb25zdGFudCB3b3VsZCBiZSByZXBldGl0aXZlLCBhcyB0aGUgdmFsdWUgaXMgdXNlZCBvbmx5IG9uY2UgYW5kIGl0cyBuYW1lIHdvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBwcm9wZXJ0eS5cbiAgICAgIHNwYWNlOiAyLFxuICAgICAgdG9rZW5TdWJzdGl0dXRpb25zOiB7XG4gICAgICAgIGNpcmN1bGFyUmVmZXJlbmNlOiBtYWtlT2JqZWN0VG9rZW5TdWJzdGl0dXRpb24oVG9rZW5TdWJzdGl0dXRpb25LZXkuQ2lyY3VsYXJSZWZlcmVuY2UpLFxuICAgICAgICBtYXhEZXB0aExpbWl0UmVhY2hlZDogbWFrZU9iamVjdFRva2VuU3Vic3RpdHV0aW9uKFRva2VuU3Vic3RpdHV0aW9uS2V5Lk1heERlcHRoTGltaXRSZWFjaGVkKSxcbiAgICAgICAgdG9KU09ORmFpbGVkOiBtYWtlT2JqZWN0VG9rZW5TdWJzdGl0dXRpb24oVG9rZW5TdWJzdGl0dXRpb25LZXkuVG9KU09ORmFpbGVkKVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBmdWxsT3B0aW9ucyA9IHtcbiAgICAgIC4uLkRFRkFVTFRfT1BUSU9OUyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB0b2tlblN1YnN0aXR1dGlvbnM6IHtcbiAgICAgICAgLi4uREVGQVVMVF9PUFRJT05TLnRva2VuU3Vic3RpdHV0aW9ucyxcbiAgICAgICAgLi4ub3B0aW9ucy50b2tlblN1YnN0aXR1dGlvbnNcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKGZ1bGxPcHRpb25zLm1heERlcHRoID09PSAtMSkge1xuICAgICAgZnVsbE9wdGlvbnMubWF4RGVwdGggPSBJbmZpbml0eTtcbiAgICB9XG5cbiAgICB0aGlzLmZ1bGxPcHRpb25zID0gZnVsbE9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgdGhlIGdpdmVuIHZhbHVlIHRvIGEgSlNPTiBzdHJpbmcsIGFwcGx5aW5nIHRoZSBjb25maWd1cmVkIHRva2VuIHN1YnN0aXR1dGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyBUaGUgSlNPTiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGNvbnZlcnQodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGNvbnN0IHBsYWluT2JqZWN0ID0gdGhpcy50b1BsYWluT2JqZWN0KHtcbiAgICAgIGNhblVzZVRvSlNPTjogdHJ1ZSxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAga2V5OiAnJyxcbiAgICAgIHZhbHVlXG4gICAgfSk7XG4gICAgbGV0IGpzb24gPSBlbnN1cmVOb25OdWxsYWJsZShKU09OLnN0cmluZ2lmeShwbGFpbk9iamVjdCwgbnVsbCwgdGhpcy5mdWxsT3B0aW9ucy5zcGFjZSkpO1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyUmVnRXhwID0gbmV3IFJlZ0V4cChTdHJpbmcucmF3YFwiXFxbXFxbJHtlc2NhcGVSZWdFeHAoUExBQ0VIT0xERVJfS0VZX1BSRUZJWCl9KD88S2V5PltBLVphLXpdKykoPzxJbmRleD5cXGQqKVxcXVxcXVwiYCwgJ2cnKTtcbiAgICBqc29uID0gcmVwbGFjZUFsbCh7XG4gICAgICAkc3RyaW5nOiBqc29uLFxuICAgICAgcmVwbGFjZXI6ICh7IGNhcHR1cmVkR3JvdXBBcmd1bWVudHM6IFtrZXkgPSAnJywgaW5kZXhTdHJpbmcgPSAnJ10gfSkgPT5cbiAgICAgICAgYXBwbHlTdWJzdGl0dXRpb25zKHtcbiAgICAgICAgICBmdW5jdGlvblRleHRzOiB0aGlzLmZ1bmN0aW9uVGV4dHMsXG4gICAgICAgICAgaW5kZXg6IGluZGV4U3RyaW5nID8gcGFyc2VJbnQoaW5kZXhTdHJpbmcsIDEwKSA6IDAsXG4gICAgICAgICAga2V5OiBjYXN0VG88VG9rZW5TdWJzdGl0dXRpb25LZXk+KGtleSksXG4gICAgICAgICAgc3Vic3RpdHV0aW9uczogdGhpcy5mdWxsT3B0aW9ucy50b2tlblN1YnN0aXR1dGlvbnNcbiAgICAgICAgfSksXG4gICAgICBzZWFyY2hWYWx1ZTogcGxhY2Vob2xkZXJSZWdFeHBcbiAgICB9KTtcbiAgICByZXR1cm4ganNvbjtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQXJyYXkocGFyYW1zOiBIYW5kbGVBcnJheVBhcmFtcyk6IHVua25vd24ge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhblVzZVRvSlNPTixcbiAgICAgIGRlcHRoLFxuICAgICAgdmFsdWVcbiAgICB9ID0gcGFyYW1zO1xuICAgIHJldHVybiBkZXB0aCA+IHRoaXMuZnVsbE9wdGlvbnMubWF4RGVwdGhcbiAgICAgID8gbWFrZVBsYWNlaG9sZGVyKFRva2VuU3Vic3RpdHV0aW9uS2V5Lk1heERlcHRoTGltaXRSZWFjaGVkQXJyYXksIHZhbHVlLmxlbmd0aClcbiAgICAgIDogdmFsdWUubWFwKChpdGVtLCBpbmRleCkgPT5cbiAgICAgICAgdGhpcy50b1BsYWluT2JqZWN0KHtcbiAgICAgICAgICBjYW5Vc2VUb0pTT04sXG4gICAgICAgICAgZGVwdGg6IGRlcHRoICsgMSxcbiAgICAgICAgICBrZXk6IFN0cmluZyhpbmRleCksXG4gICAgICAgICAgdmFsdWU6IGl0ZW1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNpcmN1bGFyUmVmZXJlbmNlKHZhbHVlOiBvYmplY3QsIGtleTogc3RyaW5nKTogdW5rbm93biB7XG4gICAgaWYgKHRoaXMuZnVsbE9wdGlvbnMuc2hvdWxkSGFuZGxlQ2lyY3VsYXJSZWZlcmVuY2VzKSB7XG4gICAgICByZXR1cm4gbWFrZVBsYWNlaG9sZGVyKFRva2VuU3Vic3RpdHV0aW9uS2V5LkNpcmN1bGFyUmVmZXJlbmNlKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVDb25zdHJ1Y3Rvck5hbWUgPSB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYENvbnZlcnRpbmcgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEpTT05cbi0tPiBzdGFydGluZyBhdCBvYmplY3Qgd2l0aCBjb25zdHJ1Y3RvciAnJHt2YWx1ZUNvbnN0cnVjdG9yTmFtZX0nXG4tLS0gcHJvcGVydHkgJyR7a2V5fScgY2xvc2VzIHRoZSBjaXJjbGVgKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGUgLS0gV2UgbmVlZCB0byB1c2UgYEZ1bmN0aW9uYCB0eXBlIHRvIGhhbmRsZSB0aGVtIHNlcGFyYXRlbHkuXG4gIHByaXZhdGUgaGFuZGxlRnVuY3Rpb24odmFsdWU6IEZ1bmN0aW9uKTogdW5rbm93biB7XG4gICAgaWYgKHRoaXMuZnVsbE9wdGlvbnMuZnVuY3Rpb25IYW5kbGluZ01vZGUgPT09IEZ1bmN0aW9uSGFuZGxpbmdNb2RlLkV4Y2x1ZGUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5mdW5jdGlvblRleHRzLmxlbmd0aDtcbiAgICBjb25zdCBmdW5jdGlvblRleHQgPSB0aGlzLmZ1bGxPcHRpb25zLmZ1bmN0aW9uSGFuZGxpbmdNb2RlID09PSBGdW5jdGlvbkhhbmRsaW5nTW9kZS5GdWxsXG4gICAgICA/IGdldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyh2YWx1ZSlcbiAgICAgIDogYGZ1bmN0aW9uICR7dmFsdWUubmFtZSB8fCAnYW5vbnltb3VzJ30oKSB7IC8qIC4uLiAqLyB9YDtcbiAgICB0aGlzLmZ1bmN0aW9uVGV4dHMucHVzaChmdW5jdGlvblRleHQpO1xuICAgIHJldHVybiBtYWtlUGxhY2Vob2xkZXIoVG9rZW5TdWJzdGl0dXRpb25LZXkuRnVuY3Rpb24sIGluZGV4KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlT2JqZWN0KHBhcmFtczogSGFuZGxlT2JqZWN0UGFyYW1zKTogdW5rbm93biB7XG4gICAgY29uc3Qge1xuICAgICAgY2FuVXNlVG9KU09OLFxuICAgICAgZGVwdGgsXG4gICAgICBrZXksXG4gICAgICB2YWx1ZVxuICAgIH0gPSBwYXJhbXM7XG4gICAgaWYgKHRoaXMudXNlZE9iamVjdHMuaGFzKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlQ2lyY3VsYXJSZWZlcmVuY2UodmFsdWUsIGtleSk7XG4gICAgfVxuXG4gICAgdGhpcy51c2VkT2JqZWN0cy5hZGQodmFsdWUpO1xuXG4gICAgaWYgKGNhblVzZVRvSlNPTikge1xuICAgICAgY29uc3QgdG9KU09OUmVzdWx0ID0gdGhpcy50cnlIYW5kbGVUb0pTT04oe1xuICAgICAgICBkZXB0aCxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZVxuICAgICAgfSk7XG4gICAgICBpZiAodG9KU09OUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRvSlNPTlJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUFycmF5KHtcbiAgICAgICAgY2FuVXNlVG9KU09OLFxuICAgICAgICBkZXB0aCxcbiAgICAgICAgdmFsdWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChkZXB0aCA+IHRoaXMuZnVsbE9wdGlvbnMubWF4RGVwdGgpIHtcbiAgICAgIHJldHVybiBtYWtlUGxhY2Vob2xkZXIoVG9rZW5TdWJzdGl0dXRpb25LZXkuTWF4RGVwdGhMaW1pdFJlYWNoZWQpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIEVycm9yICYmIHRoaXMuZnVsbE9wdGlvbnMuc2hvdWxkSGFuZGxlRXJyb3JzXG4gICAgICA/IGVycm9yVG9TdHJpbmcodmFsdWUpXG4gICAgICA6IHRoaXMuaGFuZGxlUGxhaW5PYmplY3Qoe1xuICAgICAgICBjYW5Vc2VUb0pTT04sXG4gICAgICAgIGRlcHRoLFxuICAgICAgICB2YWx1ZVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVBsYWluT2JqZWN0KHBhcmFtczogSGFuZGxlUGxhaW5PYmplY3RQYXJhbXMpOiB1bmtub3duIHtcbiAgICBjb25zdCB7XG4gICAgICBjYW5Vc2VUb0pTT04sXG4gICAgICBkZXB0aCxcbiAgICAgIHZhbHVlXG4gICAgfSA9IHBhcmFtcztcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModmFsdWUpO1xuICAgIGlmICh0aGlzLmZ1bGxPcHRpb25zLnNob3VsZFNvcnRLZXlzKSB7XG4gICAgICBlbnRyaWVzLnNvcnQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBlbnRyaWVzLm1hcCgoW2tleTIsIHZhbHVlMl0pID0+IFtcbiAgICAgICAga2V5MixcbiAgICAgICAgdGhpcy50b1BsYWluT2JqZWN0KHtcbiAgICAgICAgICBjYW5Vc2VUb0pTT04sXG4gICAgICAgICAgZGVwdGg6IGRlcHRoICsgMSxcbiAgICAgICAgICBrZXk6IGtleTIsXG4gICAgICAgICAgdmFsdWU6IHZhbHVlMlxuICAgICAgICB9KVxuICAgICAgXSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB0b1BsYWluT2JqZWN0KHBhcmFtczogVG9QbGFpbk9iamVjdFBhcmFtcyk6IHVua25vd24ge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhblVzZVRvSlNPTixcbiAgICAgIGRlcHRoLFxuICAgICAga2V5LFxuICAgICAgdmFsdWVcbiAgICB9ID0gcGFyYW1zO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gKGRlcHRoID09PSAwIHx8IHRoaXMuZnVsbE9wdGlvbnMuc2hvdWxkSGFuZGxlVW5kZWZpbmVkKVxuICAgICAgICA/IG1ha2VQbGFjZWhvbGRlcihUb2tlblN1YnN0aXR1dGlvbktleS5VbmRlZmluZWQpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUZ1bmN0aW9uKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbFxuICAgICAgPyB2YWx1ZVxuICAgICAgOiB0aGlzLmhhbmRsZU9iamVjdCh7XG4gICAgICAgIGNhblVzZVRvSlNPTixcbiAgICAgICAgZGVwdGgsXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWVcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB0cnlIYW5kbGVUb0pTT04ocGFyYW1zOiBUcnlIYW5kbGVUb0pTT05QYXJhbXMpOiB1bmtub3duIHtcbiAgICBjb25zdCB7XG4gICAgICBkZXB0aCxcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlXG4gICAgfSA9IHBhcmFtcztcbiAgICBjb25zdCB0b0pTT04gPSAodmFsdWUgYXMgUGFydGlhbDxKU09OU2VyaWFsaXphYmxlPikudG9KU09OO1xuICAgIGlmICh0eXBlb2YgdG9KU09OID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRvSlNPTi5jYWxsKHZhbHVlLCBrZXkpO1xuICAgICAgICByZXR1cm4gdGhpcy50b1BsYWluT2JqZWN0KHtcbiAgICAgICAgICBjYW5Vc2VUb0pTT046IGZhbHNlLFxuICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICB2YWx1ZTogbmV3VmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAodGhpcy5mdWxsT3B0aW9ucy5zaG91bGRDYXRjaFRvSlNPTkVycm9ycykge1xuICAgICAgICAgIHJldHVybiBtYWtlUGxhY2Vob2xkZXIoVG9rZW5TdWJzdGl0dXRpb25LZXkuVG9KU09ORmFpbGVkKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuLyoqXG4gKiBBc3NpZ25zIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhIHRhcmdldCBvYmplY3QsIGluY2x1ZGluZyBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0YXJnZXQgb2JqZWN0IHR5cGUuXG4gKiBAdHlwZVBhcmFtIFUgLSBUaGUgc291cmNlIG9iamVjdCB0eXBlLlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRvIGFzc2lnbiBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBzb3VyY2Ugb2JqZWN0IHRvIGFzc2lnbiBwcm9wZXJ0aWVzIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgdGFyZ2V0IG9iamVjdCB3aXRoIHRoZSBhc3NpZ25lZCBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduV2l0aE5vbkVudW1lcmFibGVQcm9wZXJ0aWVzPFQgZXh0ZW5kcyBvYmplY3QsIFU+KHRhcmdldDogVCwgc291cmNlOiBVKTogVCAmIFU7XG4vKipcbiAqIEFzc2lnbnMgcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGEgdGFyZ2V0IG9iamVjdCwgaW5jbHVkaW5nIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHRhcmdldCBvYmplY3QgdHlwZS5cbiAqIEB0eXBlUGFyYW0gVSAtIFRoZSBmaXJzdCBzb3VyY2Ugb2JqZWN0IHR5cGUuXG4gKiBAdHlwZVBhcmFtIFYgLSBUaGUgc2Vjb25kIHNvdXJjZSBvYmplY3QgdHlwZS5cbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG9iamVjdCB0byBhc3NpZ24gcHJvcGVydGllcyB0by5cbiAqIEBwYXJhbSBzb3VyY2UxIC0gVGhlIGZpcnN0IHNvdXJjZSBvYmplY3QgdG8gYXNzaWduIHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSBzb3VyY2UyIC0gVGhlIHNlY29uZCBzb3VyY2Ugb2JqZWN0IHRvIGFzc2lnbiBwcm9wZXJ0aWVzIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgdGFyZ2V0IG9iamVjdCB3aXRoIHRoZSBhc3NpZ25lZCBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduV2l0aE5vbkVudW1lcmFibGVQcm9wZXJ0aWVzPFQgZXh0ZW5kcyBvYmplY3QsIFUsIFY+KHRhcmdldDogVCwgc291cmNlMTogVSwgc291cmNlMjogVik6IFQgJiBVICYgVjtcbi8qKlxuICogQXNzaWducyBwcm9wZXJ0aWVzIGZyb20gb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgdG8gYSB0YXJnZXQgb2JqZWN0LCBpbmNsdWRpbmcgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdGFyZ2V0IG9iamVjdCB0eXBlLlxuICogQHR5cGVQYXJhbSBVIC0gVGhlIGZpcnN0IHNvdXJjZSBvYmplY3QgdHlwZS5cbiAqIEB0eXBlUGFyYW0gViAtIFRoZSBzZWNvbmQgc291cmNlIG9iamVjdCB0eXBlLlxuICogQHR5cGVQYXJhbSBXIC0gVGhlIHRoaXJkIHNvdXJjZSBvYmplY3QgdHlwZS5cbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG9iamVjdCB0byBhc3NpZ24gcHJvcGVydGllcyB0by5cbiAqIEBwYXJhbSBzb3VyY2UxIC0gVGhlIGZpcnN0IHNvdXJjZSBvYmplY3QgdG8gYXNzaWduIHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSBzb3VyY2UyIC0gVGhlIHNlY29uZCBzb3VyY2Ugb2JqZWN0IHRvIGFzc2lnbiBwcm9wZXJ0aWVzIGZyb20uXG4gKiBAcGFyYW0gc291cmNlMyAtIFRoZSB0aGlyZCBzb3VyY2Ugb2JqZWN0IHRvIGFzc2lnbiBwcm9wZXJ0aWVzIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgdGFyZ2V0IG9iamVjdCB3aXRoIHRoZSBhc3NpZ25lZCBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduV2l0aE5vbkVudW1lcmFibGVQcm9wZXJ0aWVzPFQgZXh0ZW5kcyBvYmplY3QsIFUsIFYsIFc+KHRhcmdldDogVCwgc291cmNlMTogVSwgc291cmNlMjogViwgc291cmNlMzogVyk6IFQgJiBVICYgViAmIFc7XG4vKipcbiAqIEFzc2lnbnMgcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGEgdGFyZ2V0IG9iamVjdCwgaW5jbHVkaW5nIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRvIGFzc2lnbiBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHNvdXJjZXMgLSBUaGUgc291cmNlIG9iamVjdHMgdG8gYXNzaWduIHByb3BlcnRpZXMgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSB0YXJnZXQgb2JqZWN0IHdpdGggdGhlIGFzc2lnbmVkIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ25XaXRoTm9uRW51bWVyYWJsZVByb3BlcnRpZXModGFyZ2V0OiBvYmplY3QsIC4uLnNvdXJjZXM6IG9iamVjdFtdKTogb2JqZWN0IHtcbiAgcmV0dXJuIGFzc2lnbldpdGhOb25FbnVtZXJhYmxlUHJvcGVydGllc0ltcGwodGFyZ2V0LCAuLi5zb3VyY2VzKTtcbn1cblxuLyoqXG4gKiBDYXN0cyBhIHZhbHVlIHRvIGEgc3BlY2lmaWMgdHlwZS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdGFyZ2V0IHR5cGUgdG8gY2FzdCB0by5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjYXN0LlxuICogQHJldHVybnMgVGhlIHZhbHVlIGFzIHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byBjYXN0LlxuZXhwb3J0IGZ1bmN0aW9uIGNhc3RUbzxUPih2YWx1ZTogdW5rbm93bik6IFQge1xuICByZXR1cm4gdmFsdWUgYXMgVDtcbn1cblxuLyoqXG4gKiBDbG9uZXMgYW4gb2JqZWN0LCBpbmNsdWRpbmcgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgb2JqZWN0LlxuICogQHBhcmFtICRvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHJldHVybnMgQSBuZXcgb2JqZWN0IHdpdGggdGhlIHNhbWUgcHJvcGVydGllcyBhcyB0aGUgb3JpZ2luYWwgb2JqZWN0LCBpbmNsdWRpbmcgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsb25lV2l0aE5vbkVudW1lcmFibGVQcm9wZXJ0aWVzPFQgZXh0ZW5kcyBvYmplY3Q+KCRvYmplY3Q6IFQpOiBUIHtcbiAgcmV0dXJuIE9iamVjdC5jcmVhdGUoZ2V0UHJvdG90eXBlT2YoJG9iamVjdCksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKCRvYmplY3QpKSBhcyBUO1xufVxuXG4vKipcbiAqIERlbGV0ZXMgbXVsdGlwbGUgcHJvcGVydGllcyBmcm9tIGFuIG9iamVjdC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgb2JqZWN0LlxuICogQHBhcmFtICRvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGRlbGV0ZSB0aGUgcHJvcGVydGllcyBmcm9tLlxuICogQHBhcmFtIHByb3BlcnR5TmFtZXMgLSBUaGUgbmFtZXMgb2YgdGhlIHByb3BlcnRpZXMgdG8gZGVsZXRlLlxuICogQHJldHVybnMgYHRydWVgIGlmIGFueSBvZiB0aGUgcHJvcGVydGllcyB3ZXJlIHByZXNlbnQsIG90aGVyd2lzZSBgZmFsc2VgLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWJvb2xlYW4tbmFtZSAtLSBUaGUgbmFtZSBzdGF0ZXMgdGhlIGFjdGlvbjsgdGhlIGJvb2xlYW4gb25seSByZXBvcnRzIHdoZXRoZXIgYW55dGhpbmcgd2FzIGRlbGV0ZWQuXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlUHJvcGVydGllczxUIGV4dGVuZHMgb2JqZWN0Pigkb2JqZWN0OiBULCBwcm9wZXJ0eU5hbWVzOiAoa2V5b2YgVClbXSk6IGJvb2xlYW4ge1xuICBsZXQgaGFzRGVsZXRlZEFueSA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIHByb3BlcnR5TmFtZXMpIHtcbiAgICBoYXNEZWxldGVkQW55ID0gZGVsZXRlUHJvcGVydHkoJG9iamVjdCwgcHJvcGVydHlOYW1lKSB8fCBoYXNEZWxldGVkQW55O1xuICB9XG5cbiAgcmV0dXJuIGhhc0RlbGV0ZWRBbnk7XG59XG5cbi8qKlxuICogRGVsZXRlcyBhIHByb3BlcnR5IGZyb20gYW4gb2JqZWN0LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QuXG4gKiBAcGFyYW0gJG9iamVjdCAtIFRoZSBvYmplY3QgdG8gZGVsZXRlIHRoZSBwcm9wZXJ0eSBmcm9tLlxuICogQHBhcmFtIHByb3BlcnR5TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBkZWxldGUuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHByb3BlcnR5IHdhcyBwcmVzZW50LCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1ib29sZWFuLW5hbWUgLS0gVGhlIG5hbWUgc3RhdGVzIHRoZSBhY3Rpb247IHRoZSBib29sZWFuIG9ubHkgcmVwb3J0cyB3aGV0aGVyIHRoZSBwcm9wZXJ0eSB3YXMgZGVsZXRlZC5cbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVQcm9wZXJ0eTxUIGV4dGVuZHMgb2JqZWN0Pigkb2JqZWN0OiBULCBwcm9wZXJ0eU5hbWU6IGtleW9mIFQpOiBib29sZWFuIHtcbiAgaWYgKCFPYmplY3QuaGFzT3duKCRvYmplY3QsIHByb3BlcnR5TmFtZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBXZSBoYXZlIG5vIG90aGVyIHdheSB0byBkZWxldGUgdGhlIHByb3BlcnR5LlxuICBkZWxldGUgJG9iamVjdFtwcm9wZXJ0eU5hbWVdO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgZGVmYXVsdCBleHBvcnQgZnJvbSBhIG1vZHVsZS5cbiAqXG4gKiBVc2VmdWwgdG8gaGFuZGxlIGluY29ycmVjdCBkZWZhdWx0IGV4cG9ydCBpbnRlcm9wIGJldHdlZW4gRVNNIGFuZCBDSlMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIGRlZmF1bHQgZXhwb3J0LlxuICogQHBhcmFtIG1vZHVsZSAtIFRoZSBtb2R1bGUgdG8gZXh0cmFjdCB0aGUgZGVmYXVsdCBleHBvcnQgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSBkZWZhdWx0IGV4cG9ydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3REZWZhdWx0RXhwb3J0SW50ZXJvcDxUPihtb2R1bGU6IE1vZHVsZVdpdGhEZWZhdWx0RXhwb3J0PFQ+IHwgVCk6IFQge1xuICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ29iamVjdCcgfHwgbW9kdWxlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG1vZHVsZTtcbiAgfVxuXG4gIHJldHVybiAnZGVmYXVsdCcgaW4gbW9kdWxlID8gbW9kdWxlLmRlZmF1bHQgOiBtb2R1bGU7XG59XG5cbi8qKlxuICogR2V0cyBhbGwgZW50cmllcyBvZiBhbiBvYmplY3QuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9iamVjdC5cbiAqIEBwYXJhbSAkb2JqZWN0IC0gVGhlIG9iamVjdCB0byBnZXQgdGhlIGVudHJpZXMgb2YuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbGwgZW50cmllcyBvZiB0aGUgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsRW50cmllczxUIGV4dGVuZHMgb2JqZWN0Pigkb2JqZWN0OiBUKTogW1N0cmluZ0tleXM8VD4sIFRbU3RyaW5nS2V5czxUPl1dW10ge1xuICByZXR1cm4gZ2V0QWxsS2V5cygkb2JqZWN0KS5tYXAoKGtleSkgPT4gW2tleSwgJG9iamVjdFtrZXldXSk7XG59XG5cbi8qKlxuICogR2V0cyBhbGwga2V5cyBvZiBhbiBvYmplY3QuXG4gKiBJbmNsdWRlcyBmaWVsZHMgYW5kIHByb3BlcnRpZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9iamVjdC5cbiAqIEBwYXJhbSAkb2JqZWN0IC0gVGhlIG9iamVjdCB0byBnZXQgdGhlIGtleXMgb2YuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbGwga2V5cyBvZiB0aGUgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsS2V5czxUIGV4dGVuZHMgb2JqZWN0Pigkb2JqZWN0OiBUKTogU3RyaW5nS2V5czxUPltdIHtcbiAgY29uc3Qga2V5czogU3RyaW5nS2V5czxUPltdID0gW107XG4gIGxldCBjdXJyZW50OiBudWxsIHwgb2JqZWN0ID0gJG9iamVjdDtcbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGN1cnJlbnQpO1xuICAgIGZvciAoY29uc3QgW2tleSwgZGVzY3JpcHRvcl0gb2YgT2JqZWN0LmVudHJpZXMoZGVzY3JpcHRvcnMpKSB7XG4gICAgICBpZiAoKGtleSA9PT0gJ19fcHJvdG9fXycpIHx8ICh0eXBlb2YgZGVzY3JpcHRvci52YWx1ZSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhc0dldHRlciA9IHR5cGVvZiBkZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgIGNvbnN0IGhhc1NldHRlciA9IHR5cGVvZiBkZXNjcmlwdG9yLnNldCA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgIGlmIChoYXNHZXR0ZXIgfHwgaGFzU2V0dGVyKSB7XG4gICAgICAgIGlmIChoYXNHZXR0ZXIgJiYgaGFzU2V0dGVyKSB7XG4gICAgICAgICAga2V5cy5wdXNoKGtleSBhcyBTdHJpbmdLZXlzPFQ+KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlc2NyaXB0b3IuZW51bWVyYWJsZSAmJiBkZXNjcmlwdG9yLndyaXRhYmxlKSB7XG4gICAgICAgIGtleXMucHVzaChrZXkgYXMgU3RyaW5nS2V5czxUPik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KSBhcyBudWxsIHwgb2JqZWN0O1xuICB9XG4gIHJldHVybiBrZXlzLnNvcnQoKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIG5lc3RlZCBwcm9wZXJ0eSBmcm9tIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gJG9iamVjdCAtIFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBuZXN0ZWQgcHJvcGVydHkgdmFsdWUgZnJvbS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIG5lc3RlZCBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgbmVzdGVkIHByb3BlcnR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmVzdGVkUHJvcGVydHlWYWx1ZSgkb2JqZWN0OiBHZW5lcmljT2JqZWN0LCBwYXRoOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgbGV0IG5vZGU6IEdlbmVyaWNPYmplY3QgfCB1bmRlZmluZWQgPSAkb2JqZWN0O1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChLRVlfU0VQQVJBVE9SKTtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIG5vZGUgPSBub2RlW2tleV0gYXMgR2VuZXJpY09iamVjdCB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHByb3RvdHlwZSBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgb2JqZWN0LlxuICogQHBhcmFtIGluc3RhbmNlIC0gVGhlIG9iamVjdCBpbnN0YW5jZSB0byByZXRyaWV2ZSB0aGUgcHJvdG90eXBlIG9mLlxuICogQHJldHVybnMgVGhlIHByb3RvdHlwZSBvZiB0aGUgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvdG90eXBlT2Y8VD4oaW5zdGFuY2U6IFQpOiBUIHtcbiAgcmV0dXJuIGluc3RhbmNlID09PSB1bmRlZmluZWQgfHwgaW5zdGFuY2UgPT09IG51bGwgPyBpbnN0YW5jZSA6IChPYmplY3QuZ2V0UHJvdG90eXBlT2YoaW5zdGFuY2UpIGFzIFQpO1xufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGRlZXBseSBlcXVhbC5cbiAqXG4gKiBAcGFyYW0gYSAtIFRoZSBmaXJzdCB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIGIgLSBUaGUgc2Vjb25kIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZGVlcGx5IGVxdWFsLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGVlcEVxdWFsKGE6IHVua25vd24sIGI6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYSAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIGIgIT09ICdvYmplY3QnIHx8IGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGFDb25zdHJ1Y3RvciA9IGEuY29uc3RydWN0b3I7XG4gIGNvbnN0IGJDb25zdHJ1Y3RvciA9IGIuY29uc3RydWN0b3I7XG5cbiAgaWYgKGFDb25zdHJ1Y3RvciAhPT0gYkNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGFDb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gZGVlcEVxdWFsVHlwZWQoYSwgYik7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGtleXNBID0gZ2V0QWxsS2V5cyhhKTtcbiAgY29uc3Qga2V5c0IgPSBnZXRBbGxLZXlzKGIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGFSZWNvcmQgPSBlbnN1cmVHZW5lcmljT2JqZWN0KGEpO1xuICBjb25zdCBiUmVjb3JkID0gZW5zdXJlR2VuZXJpY09iamVjdChiKTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzQSkge1xuICAgIGlmICgha2V5c0IuaW5jbHVkZXMoa2V5KSB8fCAhaXNEZWVwRXF1YWwoYVJlY29yZFtrZXldLCBiUmVjb3JkW2tleV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbmFtZSBvZiBhIHByb3BlcnR5IG9mIGEgZ2l2ZW4gdHlwZSBgVGAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0eS5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGFzIGEgc3RyaW5nLlxuICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmFtZW9mPFQgZXh0ZW5kcyBvYmplY3Q+KG5hbWU6IFN0cmluZ0tleXM8VD4pOiBTdHJpbmdLZXlzPFQ+IHtcbiAgcmV0dXJuIG5hbWU7XG59XG4vKipcbiAqIE5vcm1hbGl6ZXMgb3B0aW9uYWwgcHJvcGVydGllcyB0byBhbGxvdyBgdW5kZWZpbmVkYCBhc3NpZ25tZW50IGluIHN0cmljdCBtb2RlLlxuICpcbiAqIFRoaXMgdXRpbGl0eSBwcm92aWRlcyBhIHdvcmthcm91bmQgZm9yIHRoZSBgZXhhY3RPcHRpb25hbFByb3BlcnR5VHlwZXNgIFR5cGVTY3JpcHQgZmxhZyxcbiAqIHdoaWNoIHByb2hpYml0cyBkaXJlY3RseSBhc3NpZ25pbmcgYHVuZGVmaW5lZGAgdG8gb3B0aW9uYWwgcHJvcGVydGllcyB3aGVuIHRoZSB0eXBlXG4gKiBleHBsaWNpdGx5IG9taXRzIGB1bmRlZmluZWRgLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBXaXRoIGBleGFjdE9wdGlvbmFsUHJvcGVydHlUeXBlczogdHJ1ZWBcbiAqIGNvbnN0IHg6IHsgcHJvcD86IHN0cmluZyB9ID0geyBwcm9wOiB1bmRlZmluZWQgfTsgLy8gQ29tcGlsZXIgZXJyb3JcbiAqXG4gKiAvLyBVc2luZyB0aGlzIHV0aWxpdHk6XG4gKiBjb25zdCB5OiB7IHByb3A/OiBzdHJpbmcgfSA9IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczx7IHByb3A/OiBzdHJpbmcgfT4oeyBwcm9wOiB1bmRlZmluZWQgfSk7IC8vIFdvcmtzXG4gKiBgYGBcbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdGFyZ2V0IHR5cGUgd2l0aCBvcHRpb25hbCBwcm9wZXJ0aWVzIHRvIG5vcm1hbGl6ZS5cbiAqIEBwYXJhbSAkb2JqZWN0IC0gVGhlIG9iamVjdCB0byBub3JtYWxpemUsIGFsbG93aW5nIGV4cGxpY2l0IGB1bmRlZmluZWRgIGZvciBvcHRpb25hbCBwcm9wZXJ0aWVzLlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgb2JqZWN0LCBjb21wYXRpYmxlIHdpdGggYGV4YWN0T3B0aW9uYWxQcm9wZXJ0eVR5cGVzYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxUPigkb2JqZWN0OiBVbmRlZmluZWRPblBhcnRpYWxEZWVwPFQ+KTogVCB7XG4gIHJldHVybiAkb2JqZWN0IGFzIFQ7XG59XG4vKipcbiAqIFJlbW92ZXMgYWxsIGB1bmRlZmluZWRgIHByb3BlcnRpZXMgZnJvbSBhbiBvYmplY3Qgd2hlbiB0aGVyZSBhcmUgbm8gbWFuZGF0b3J5IGtleXMgd2l0aCBgdW5kZWZpbmVkYCB2YWx1ZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUeXBlIC0gVGhlIHR5cGUgb2YgdGhlIG9iamVjdC5cbiAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGFyZ3VtZW50cyB0byB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgb2JqZWN0IHdpdGggYWxsIGB1bmRlZmluZWRgIHByb3BlcnRpZXMgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXM8VHlwZSBleHRlbmRzIG9iamVjdD4oXG4gIC4uLiRhcmd1bWVudHM6IFJlbW92ZVVuZGVmaW5lZE92ZXJsb2FkPFR5cGU+XG4pOiBUeXBlO1xuLyoqXG4gKiBSZW1vdmVzIGFsbCBgdW5kZWZpbmVkYCBwcm9wZXJ0aWVzIGZyb20gYW4gb2JqZWN0IHdoZW4gdGhlcmUgYXJlIG1hbmRhdG9yeSBrZXlzIHdpdGggYHVuZGVmaW5lZGAgdmFsdWVzLlxuICpcbiAqIEB0eXBlUGFyYW0gVHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QuXG4gKiBAdHlwZVBhcmFtIEtleXNUb0tlZXAgLSBUaGUga2V5cyB0byBrZWVwLlxuICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIHRvIHRoZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBvYmplY3Qgd2l0aCBhbGwgYHVuZGVmaW5lZGAgcHJvcGVydGllcyByZW1vdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVW5kZWZpbmVkUHJvcGVydGllczxUeXBlIGV4dGVuZHMgb2JqZWN0LCBjb25zdCBLZXlzVG9LZWVwIGV4dGVuZHMgcmVhZG9ubHkgc3RyaW5nW10+KFxuICAuLi4kYXJndW1lbnRzOiBSZW1vdmVVbmRlZmluZWRXaXRoS2V5c092ZXJsb2FkPFR5cGUsIEtleXNUb0tlZXA+XG4pOiBUeXBlO1xuLyoqXG4gKiBSZW1vdmVzIGFsbCBgdW5kZWZpbmVkYCBwcm9wZXJ0aWVzIGZyb20gYW4gb2JqZWN0LlxuICpcbiAqIEB0eXBlUGFyYW0gVHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QuXG4gKiBAcGFyYW0gJG9iamVjdCAtIFRoZSBvYmplY3QgdG8gcmVtb3ZlIGB1bmRlZmluZWRgIHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSBrZXlzVG9LZWVwIC0gVGhlIGtleXMgdG8ga2VlcC5cbiAqIEByZXR1cm5zIFRoZSBvYmplY3Qgd2l0aCBhbGwgYHVuZGVmaW5lZGAgcHJvcGVydGllcyByZW1vdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVW5kZWZpbmVkUHJvcGVydGllczxUeXBlIGV4dGVuZHMgb2JqZWN0Pigkb2JqZWN0OiBUeXBlLCBrZXlzVG9LZWVwPzogcmVhZG9ubHkgc3RyaW5nW10pOiBUeXBlIHtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoJG9iamVjdCkgYXMgW1N0cmluZ0tleXM8VHlwZT4sIHVua25vd25dW10pIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAha2V5c1RvS2VlcD8uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBXZSBoYXZlIG5vIG90aGVyIHdheSB0byBkZWxldGUgdGhlIHByb3BlcnR5LlxuICAgICAgZGVsZXRlICRvYmplY3Rba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuICRvYmplY3Q7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgdmFsdWUgb2YgYSBuZXN0ZWQgcHJvcGVydHkgaW4gYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3Igc2V0dGluZyB0aGUgbmVzdGVkIHByb3BlcnR5IHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TmVzdGVkUHJvcGVydHlWYWx1ZShwYXJhbXM6IFNldE5lc3RlZFByb3BlcnR5VmFsdWVQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgICRvYmplY3QsXG4gICAgcGF0aCxcbiAgICB2YWx1ZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgUHJvcGVydHkgcGF0aCAke3BhdGh9IG5vdCBmb3VuZGApO1xuICBsZXQgbm9kZTogR2VuZXJpY09iamVjdCB8IHVuZGVmaW5lZCA9ICRvYmplY3Q7XG4gIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KEtFWV9TRVBBUkFUT1IpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzLnNsaWNlKDAsIC0xKSkge1xuICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBub2RlID0gbm9kZVtrZXldIGFzIEdlbmVyaWNPYmplY3QgfCB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBsYXN0S2V5ID0gZW5zdXJlTm9uTnVsbGFibGUoa2V5cy5hdCgtMSkpO1xuICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBub2RlW2xhc3RLZXldID0gdmFsdWU7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBnaXZlbiB2YWx1ZSB0byBhIEpTT04gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQgdG8gSlNPTi4gVGhpcyBjYW4gYmUgb2YgYW55IHR5cGUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGN1c3RvbWl6aW5nIHRoZSBKU09OIGNvbnZlcnNpb24gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIFRoZSBKU09OIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5wdXQgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb24odmFsdWU6IHVua25vd24sIG9wdGlvbnM6IFBhcnRpYWw8VG9Kc29uT3B0aW9ucz4gPSB7fSk6IHN0cmluZyB7XG4gIHJldHVybiBuZXcgVG9Kc29uQ29udmVydGVyKG9wdGlvbnMpLmNvbnZlcnQodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBhcHBseVN1YnN0aXR1dGlvbnMocGFyYW1zOiBBcHBseVN1YnN0aXR1dGlvbnNQYXJhbXMpOiBNYXliZVJldHVybjxzdHJpbmc+IHtcbiAgc3dpdGNoIChwYXJhbXMua2V5KSB7XG4gICAgY2FzZSBUb2tlblN1YnN0aXR1dGlvbktleS5DaXJjdWxhclJlZmVyZW5jZToge1xuICAgICAgcmV0dXJuIHBhcmFtcy5zdWJzdGl0dXRpb25zLmNpcmN1bGFyUmVmZXJlbmNlO1xuICAgIH1cbiAgICBjYXNlIFRva2VuU3Vic3RpdHV0aW9uS2V5LkZ1bmN0aW9uOiB7XG4gICAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUocGFyYW1zLmZ1bmN0aW9uVGV4dHNbcGFyYW1zLmluZGV4XSwgYEZ1bmN0aW9uIHdpdGggaW5kZXggJHtTdHJpbmcocGFyYW1zLmluZGV4KX0gbm90IGZvdW5kYCk7XG4gICAgfVxuICAgIGNhc2UgVG9rZW5TdWJzdGl0dXRpb25LZXkuTWF4RGVwdGhMaW1pdFJlYWNoZWQ6IHtcbiAgICAgIHJldHVybiBwYXJhbXMuc3Vic3RpdHV0aW9ucy5tYXhEZXB0aExpbWl0UmVhY2hlZDtcbiAgICB9XG4gICAgY2FzZSBUb2tlblN1YnN0aXR1dGlvbktleS5NYXhEZXB0aExpbWl0UmVhY2hlZEFycmF5OiB7XG4gICAgICByZXR1cm4gYEFycmF5KCR7U3RyaW5nKHBhcmFtcy5pbmRleCl9KWA7XG4gICAgfVxuICAgIGNhc2UgVG9rZW5TdWJzdGl0dXRpb25LZXkuVG9KU09ORmFpbGVkOiB7XG4gICAgICByZXR1cm4gcGFyYW1zLnN1YnN0aXR1dGlvbnMudG9KU09ORmFpbGVkO1xuICAgIH1cbiAgICBjYXNlIFRva2VuU3Vic3RpdHV0aW9uS2V5LlVuZGVmaW5lZDoge1xuICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gRXhoYXVzdGl2ZSBzd2l0Y2ggZ3VhcmQ7IGRlZmF1bHQgYnJhbmNoIGlzIHVucmVhY2hhYmxlLiAqL1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGFzc2VydE5ldmVyKHBhcmFtcy5rZXkpO1xuICAgIH1cbiAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzaWduV2l0aE5vbkVudW1lcmFibGVQcm9wZXJ0aWVzSW1wbCh0YXJnZXQ6IG9iamVjdCwgLi4uc291cmNlczogb2JqZWN0W10pOiBvYmplY3Qge1xuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpO1xuXG4gICAgZm9yIChjb25zdCBba2V5LCBkZXNjcmlwdG9yXSBvZiBPYmplY3QuZW50cmllcyhkZXNjcmlwdG9ycykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEF2b2lkIHJlZGVmaW5pbmcgcmVhZC1vbmx5IHByb3BlcnRpZXMgKGVzcGVjaWFsbHkgYHByb3RvdHlwZWApXG4gICAgICAgIGlmIChcbiAgICAgICAgICBrZXkgPT09ICdwcm90b3R5cGUnXG4gICAgICAgICAgfHwgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpPy53cml0YWJsZSA9PT0gZmFsc2VcbiAgICAgICAgICAgICYmICFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KT8uY29uZmlndXJhYmxlKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gU2lsZW50bHkgaWdub3JlIGlmIGRlZmluZVByb3BlcnR5IGZhaWxzXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc291cmNlUHJvdG90eXBlcyA9IHNvdXJjZXNcbiAgICAubWFwKChzb3VyY2UpID0+IGdldFByb3RvdHlwZU9mPG9iamVjdCB8IHVuZGVmaW5lZD4oc291cmNlKSlcbiAgICAuZmlsdGVyKChwcm90b3R5cGUpOiBwcm90b3R5cGUgaXMgb2JqZWN0ID0+ICEhcHJvdG90eXBlKTtcblxuICBpZiAoc291cmNlUHJvdG90eXBlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdGFyZ2V0UHJvdG90eXBlID0gYXNzaWduV2l0aE5vbkVudW1lcmFibGVQcm9wZXJ0aWVzSW1wbCh7fSwgZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSwgLi4uc291cmNlUHJvdG90eXBlcyk7XG5cbiAgICB0cnkge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRhcmdldCwgdGFyZ2V0UHJvdG90eXBlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFNpbGVudGx5IGlnbm9yZSBpZiBzZXRQcm90b3R5cGVPZiBmYWlsc1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qXG4gKiBUaGUgb25lIHBsYWNlIHdoZXJlIHRoZSBsaXN0J3MgaGV0ZXJvZ2VuZWl0eSBpcyBicmlkZ2VkLCBhbmQgaXQgbmVlZHMgYSBjYXN0IGJlY2F1c2UgdGhlIGNvcnJlbGF0aW9uIHRoYXQgbWFrZXMgaXRcbiAqIHNhZmUgaXMgYSBydW50aW1lIG9uZTogYHRyeUVudHJ5RXF1YWxpdHlgIGNhbGxzIHRoZSBjb21wYXJlciBvbmx5IGFmdGVyIGBhIGluc3RhbmNlb2YgZW50cnkuY29uc3RydWN0b3JgIGhhcyBoZWxkIGZvclxuICogYm90aCBvcGVyYW5kcywgYW5kIG5vIHR5cGUgY2FuIHRpZSB0aGF0IGBpbnN0YW5jZW9mYCB0byB0aGlzIGVudHJ5J3MgYFRgLiBDb25maW5pbmcgdGhlIGNhc3QgaGVyZSBidXlzIHRoZSBjaGVjayB0aGVcbiAqIGxpc3QgdXNlZCB0byBsYWNrIC0gdGhlIGNvbnN0cnVjdG9yIGFuZCB0aGUgY29tcGFyZXIgYXJlIGluZmVycmVkIGZyb20gT05FIGBUYCwgc28gYSBtaXNtYXRjaGVkIHBhaXIgaXMgYSBjb21waWxlXG4gKiBlcnJvciBhdCB0aGUgY2FsbCBzaXRlIGluc3RlYWQgb2YgYmVpbmcgd2F2ZWQgdGhyb3VnaCBieSBhbiBgYW55YC10eXBlZCBlbnRyeSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRXF1YWxpdHlDb21wYXJlckVudHJ5PFQ+KGNvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxUPiwgY2hlY2tJc0VxdWFsOiAoYTogVCwgYjogVCkgPT4gYm9vbGVhbik6IEVxdWFsaXR5Q29tcGFyZXJFbnRyeTx1bmtub3duPiB7XG4gIHJldHVybiB7XG4gICAgY29uc3RydWN0b3IsXG4gICAgZXF1YWxpdHlDb21wYXJlcjogKGEsIGIpID0+IGNoZWNrSXNFcXVhbChhIGFzIFQsIGIgYXMgVClcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVlcEVxdWFsVHlwZWQoYTogdW5rbm93biwgYjogdW5rbm93bik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVxdWFsaXR5Q29tcGFyZXJFbnRyaWVzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdHJ5RW50cnlFcXVhbGl0eSh7XG4gICAgICBhLFxuICAgICAgYixcbiAgICAgIGVudHJ5XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc0RlZXBFcXVhbEFycmF5QnVmZmVyKGE6IEFycmF5QnVmZmVyLCBiOiBBcnJheUJ1ZmZlcik6IGJvb2xlYW4ge1xuICBpZiAoYS5ieXRlTGVuZ3RoICE9PSBiLmJ5dGVMZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB2aWV3QSA9IG5ldyBVaW50OEFycmF5KGEpO1xuICBjb25zdCB2aWV3QiA9IG5ldyBVaW50OEFycmF5KGIpO1xuICByZXR1cm4gaXNEZWVwRXF1YWwodmlld0EsIHZpZXdCKTtcbn1cblxuZnVuY3Rpb24gaXNEZWVwRXF1YWxEYXRlKGE6IERhdGUsIGI6IERhdGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGEuZ2V0VGltZSgpID09PSBiLmdldFRpbWUoKTtcbn1cblxuZnVuY3Rpb24gaXNEZWVwRXF1YWxNYXAoYTogTWFwPHVua25vd24sIHVua25vd24+LCBiOiBNYXA8dW5rbm93biwgdW5rbm93bj4pOiBib29sZWFuIHtcbiAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgYSkge1xuICAgIGlmICghYi5oYXMoa2V5KSB8fCAhaXNEZWVwRXF1YWwodmFsdWUsIGIuZ2V0KGtleSkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzRGVlcEVxdWFsUmVnRXhwKGE6IFJlZ0V4cCwgYjogUmVnRXhwKTogYm9vbGVhbiB7XG4gIHJldHVybiBhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYi5mbGFncztcbn1cblxuZnVuY3Rpb24gaXNEZWVwRXF1YWxTZXQoYTogU2V0PHVua25vd24+LCBiOiBTZXQ8dW5rbm93bj4pOiBib29sZWFuIHtcbiAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yIChjb25zdCB2YWx1ZUEgb2YgYSkge1xuICAgIGlmIChiLmhhcyh2YWx1ZUEpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgbGV0IGhhc01hdGNoID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCB2YWx1ZUIgb2YgYikge1xuICAgICAgaWYgKGlzRGVlcEVxdWFsKHZhbHVlQSwgdmFsdWVCKSkge1xuICAgICAgICBoYXNNYXRjaCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc01hdGNoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIG1ha2VPYmplY3RUb2tlblN1YnN0aXR1dGlvbihrZXk6IFRva2VuU3Vic3RpdHV0aW9uS2V5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGB7IFwiW1ske2tleX1dXVwiOiBudWxsIH1gO1xufVxuXG5mdW5jdGlvbiBtYWtlUGxhY2Vob2xkZXIoa2V5OiBUb2tlblN1YnN0aXR1dGlvbktleSwgaW5kZXg/OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYFtbJHtQTEFDRUhPTERFUl9LRVlfUFJFRklYfSR7a2V5fSR7aW5kZXggPyBTdHJpbmcoaW5kZXgpIDogJyd9XV1gO1xufVxuXG5mdW5jdGlvbiB0cnlFbnRyeUVxdWFsaXR5KHBhcmFtczogVHJ5RW50cnlFcXVhbGl0eVBhcmFtcyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBjb25zdCB7XG4gICAgYSxcbiAgICBiLFxuICAgIGVudHJ5XG4gIH0gPSBwYXJhbXM7XG4gIHJldHVybiBhIGluc3RhbmNlb2YgZW50cnkuY29uc3RydWN0b3IgJiYgYiBpbnN0YW5jZW9mIGVudHJ5LmNvbnN0cnVjdG9yID8gZW50cnkuZXF1YWxpdHlDb21wYXJlcihhLCBiKSA6IHVuZGVmaW5lZDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQkEsU0FBUyxxQkFBcUI7QUFDOUIsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUyxvQkFBb0I7QUFDN0IsU0FBUyxrQkFBa0I7QUFDM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBS0EsSUFBSyx1QkFBTCxrQkFBS0EsMEJBQUw7QUFJTCxFQUFBQSxzQkFBQSxhQUFVO0FBSVYsRUFBQUEsc0JBQUEsVUFBTztBQUlQLEVBQUFBLHNCQUFBLGNBQVc7QUFaRCxTQUFBQTtBQUFBLEdBQUE7QUF5SFosTUFBTSxnQkFBZ0I7QUFDdEIsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSwwQkFBcUU7QUFBQSxFQUN6RSw0QkFBNEIsYUFBYSxzQkFBc0I7QUFBQSxFQUMvRCw0QkFBNEIsTUFBTSxlQUFlO0FBQUEsRUFDakQsNEJBQTRCLFFBQVEsaUJBQWlCO0FBQUEsRUFDckQsNEJBQW1ELEtBQUssY0FBYztBQUFBLEVBQ3RFLDRCQUEwQyxLQUFLLGNBQWM7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
523
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29iamVjdC11dGlscy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBPYmplY3RzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ29uc3RydWN0b3IsXG4gIFJlcXVpcmVkS2V5c09mLFxuICBVbmRlZmluZWRPblBhcnRpYWxEZWVwXG59IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgR2VuZXJpY09iamVjdCB9IGZyb20gJy4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHR5cGUge1xuICBFeGFjdE1lbWJlcnMsXG4gIE1heWJlUmV0dXJuLFxuICBTdHJpbmdLZXlzXG59IGZyb20gJy4vdHlwZS50cyc7XG5cbmltcG9ydCB7IGVycm9yVG9TdHJpbmcgfSBmcm9tICcuL2Vycm9yLnRzJztcbmltcG9ydCB7IGdldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyB9IGZyb20gJy4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnLi9yZWctZXhwLnRzJztcbmltcG9ydCB7IHJlcGxhY2VBbGwgfSBmcm9tICcuL3N0cmluZy50cyc7XG5pbXBvcnQge1xuICBhc3NlcnROZXZlcixcbiAgZW5zdXJlR2VuZXJpY09iamVjdCxcbiAgZW5zdXJlTm9uTnVsbGFibGVcbn0gZnJvbSAnLi90eXBlLWd1YXJkcy50cyc7XG5cbi8qKlxuICogU3BlY2lmaWVzIGhvdyBmdW5jdGlvbnMgc2hvdWxkIGJlIGhhbmRsZWQgaW4gdGhlIEpTT04gb3V0cHV0LlxuICovXG5leHBvcnQgZW51bSBGdW5jdGlvbkhhbmRsaW5nTW9kZSB7XG4gIC8qKlxuICAgKiBFeGNsdWRlcyBmdW5jdGlvbnMgZnJvbSB0aGUgSlNPTiBvdXRwdXQuXG4gICAqL1xuICBFeGNsdWRlID0gJ2V4Y2x1ZGUnLFxuICAvKipcbiAgICogSW5jbHVkZXMgdGhlIGZ1bGwgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiB0aGUgSlNPTiBvdXRwdXQuXG4gICAqL1xuICBGdWxsID0gJ2Z1bGwnLFxuICAvKipcbiAgICogSW5jbHVkZXMgb25seSB0aGUgZnVuY3Rpb24gbmFtZSBpbiB0aGUgSlNPTiBvdXRwdXQuXG4gICAqL1xuICBOYW1lT25seSA9ICduYW1lT25seSdcbn1cblxuZW51bSBUb2tlblN1YnN0aXR1dGlvbktleSB7XG4gIENpcmN1bGFyUmVmZXJlbmNlID0gJ0NpcmN1bGFyUmVmZXJlbmNlJyxcbiAgRnVuY3Rpb24gPSAnRnVuY3Rpb24nLFxuICBNYXhEZXB0aExpbWl0UmVhY2hlZCA9ICdNYXhEZXB0aExpbWl0UmVhY2hlZCcsXG4gIE1heERlcHRoTGltaXRSZWFjaGVkQXJyYXkgPSAnTWF4RGVwdGhMaW1pdFJlYWNoZWRBcnJheScsXG4gIFRvSlNPTkZhaWxlZCA9ICdUb0pTT05GYWlsZWQnLFxuICBVbmRlZmluZWQgPSAnVW5kZWZpbmVkJ1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB0b0pzb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvSnNvbk9wdGlvbnMge1xuICAvKipcbiAgICogU3BlY2lmaWVzIGhvdyBmdW5jdGlvbnMgc2hvdWxkIGJlIGhhbmRsZWQgaW4gdGhlIEpTT04gb3V0cHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgRnVuY3Rpb25IYW5kbGluZ01vZGUuRXhjbHVkZX1cbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uSGFuZGxpbmdNb2RlOiBGdW5jdGlvbkhhbmRsaW5nTW9kZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGRlcHRoIG9mIG5lc3RlZCBvYmplY3RzIHRvIGluY2x1ZGUgaW4gdGhlIEpTT04gb3V0cHV0LlxuICAgKiBVc2UgYC0xYCBmb3Igbm8gbGltaXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAtMWBcbiAgICovXG4gIHJlYWRvbmx5IG1heERlcHRoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGNhdGNoIGVycm9ycyBpbiBgdG9KU09OKClgIGFuZCByZXBsYWNlIHRoZW0gd2l0aCBhIHBsYWNlaG9sZGVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRDYXRjaFRvSlNPTkVycm9yczogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gaGFuZGxlIGNpcmN1bGFyIHJlZmVyZW5jZXMgaW4gdGhlIEpTT04gb3V0cHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRIYW5kbGVDaXJjdWxhclJlZmVyZW5jZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGhhbmRsZSBlcnJvcnMgaW4gdGhlIEpTT04gb3V0cHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRIYW5kbGVFcnJvcnM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGhhbmRsZSBgdW5kZWZpbmVkYCB2YWx1ZXMgaW4gdGhlIEpTT04gb3V0cHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRIYW5kbGVVbmRlZmluZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHNvcnQgdGhlIGtleXMgb2YgdGhlIEpTT04gb3V0cHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTb3J0S2V5czogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgSlNPTiBvdXRwdXQuIFRoaXMgY2FuIGJlIGEgbnVtYmVyIG9mIHNwYWNlcyBvciBhIHN0cmluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDJgXG4gICAqL1xuICByZWFkb25seSBzcGFjZTogbnVtYmVyIHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHN1YnN0aXR1dGlvbnMgdG8gdXNlIGluIHRoZSBKU09OIG91dHB1dC5cbiAgICovXG4gIHJlYWRvbmx5IHRva2VuU3Vic3RpdHV0aW9uczogUGFydGlhbDxUb2tlblN1YnN0aXR1dGlvbnM+O1xufVxuXG5pbnRlcmZhY2UgQXBwbHlTdWJzdGl0dXRpb25zUGFyYW1zIHtcbiAgcmVhZG9ubHkgZnVuY3Rpb25UZXh0czogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG4gIHJlYWRvbmx5IGtleTogVG9rZW5TdWJzdGl0dXRpb25LZXk7XG4gIHJlYWRvbmx5IHN1YnN0aXR1dGlvbnM6IFRva2VuU3Vic3RpdHV0aW9ucztcbn1cblxuaW50ZXJmYWNlIEVxdWFsaXR5Q29tcGFyZXJFbnRyeTxUPiB7XG4gIGNvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxUPjtcbiAgZXF1YWxpdHlDb21wYXJlcjogKGE6IFQsIGI6IFQpID0+IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBKU09OU2VyaWFsaXphYmxlIHtcbiAgdG9KU09OOiAoLi4uJGFyZ3VtZW50czogdW5rbm93bltdKSA9PiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgTW9kdWxlV2l0aERlZmF1bHRFeHBvcnQ8VD4ge1xuICBkZWZhdWx0OiBUO1xufVxuXG5pbnRlcmZhY2UgUmVzb2x2ZWRUb0pzb25PcHRpb25zIGV4dGVuZHMgVG9Kc29uT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHRva2VuU3Vic3RpdHV0aW9uczogVG9rZW5TdWJzdGl0dXRpb25zO1xufVxuXG5pbnRlcmZhY2UgVG9rZW5TdWJzdGl0dXRpb25zIHtcbiAgY2lyY3VsYXJSZWZlcmVuY2U6IHN0cmluZztcbiAgbWF4RGVwdGhMaW1pdFJlYWNoZWQ6IHN0cmluZztcbiAgdG9KU09ORmFpbGVkOiBzdHJpbmc7XG59XG5cbmNvbnN0IEtFWV9TRVBBUkFUT1IgPSAnLic7XG5jb25zdCBQTEFDRUhPTERFUl9LRVlfUFJFRklYID0gJ3RvSnNvbjonO1xuY29uc3QgZXF1YWxpdHlDb21wYXJlckVudHJpZXM6IHJlYWRvbmx5IEVxdWFsaXR5Q29tcGFyZXJFbnRyeTx1bmtub3duPltdID0gW1xuICBjcmVhdGVFcXVhbGl0eUNvbXBhcmVyRW50cnkoQXJyYXlCdWZmZXIsIGlzRGVlcEVxdWFsQXJyYXlCdWZmZXIpLFxuICBjcmVhdGVFcXVhbGl0eUNvbXBhcmVyRW50cnkoRGF0ZSwgaXNEZWVwRXF1YWxEYXRlKSxcbiAgY3JlYXRlRXF1YWxpdHlDb21wYXJlckVudHJ5KFJlZ0V4cCwgaXNEZWVwRXF1YWxSZWdFeHApLFxuICBjcmVhdGVFcXVhbGl0eUNvbXBhcmVyRW50cnk8TWFwPHVua25vd24sIHVua25vd24+PihNYXAsIGlzRGVlcEVxdWFsTWFwKSxcbiAgY3JlYXRlRXF1YWxpdHlDb21wYXJlckVudHJ5PFNldDx1bmtub3duPj4oU2V0LCBpc0RlZXBFcXVhbFNldClcbl07XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNldE5lc3RlZFByb3BlcnR5VmFsdWV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNldE5lc3RlZFByb3BlcnR5VmFsdWVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG9iamVjdCB0byBzZXQgdGhlIG5lc3RlZCBwcm9wZXJ0eSB2YWx1ZSBpbi5cbiAgICovXG4gIHJlYWRvbmx5ICRvYmplY3Q6IEdlbmVyaWNPYmplY3Q7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBuZXN0ZWQgcHJvcGVydHkuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogdW5rbm93bjtcbn1cblxuaW50ZXJmYWNlIEhhbmRsZUFycmF5UGFyYW1zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYHRvSlNPTigpYCBtYXkgYmUgdXNlZCBkdXJpbmcgY29udmVyc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IGNhblVzZVRvSlNPTjogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgcmVjdXJzaW9uIGRlcHRoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGFycmF5IHZhbHVlIHRvIGNvbnZlcnQuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogdW5rbm93bltdO1xufVxuXG5pbnRlcmZhY2UgSGFuZGxlT2JqZWN0UGFyYW1zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYHRvSlNPTigpYCBtYXkgYmUgdXNlZCBkdXJpbmcgY29udmVyc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IGNhblVzZVRvSlNPTjogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgcmVjdXJzaW9uIGRlcHRoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGtleSB1bmRlciB3aGljaCB0aGUgdmFsdWUgaXMgc3RvcmVkIGluIGl0cyBwYXJlbnQuXG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB2YWx1ZSB0byBjb252ZXJ0LlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IG9iamVjdDtcbn1cblxuaW50ZXJmYWNlIEhhbmRsZVBsYWluT2JqZWN0UGFyYW1zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYHRvSlNPTigpYCBtYXkgYmUgdXNlZCBkdXJpbmcgY29udmVyc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IGNhblVzZVRvSlNPTjogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgcmVjdXJzaW9uIGRlcHRoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHBsYWluIG9iamVjdCB2YWx1ZSB0byBjb252ZXJ0LlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IG9iamVjdDtcbn1cblxudHlwZSBLZXlzV2l0aFVuZGVmaW5lZDxUPiA9IEtleXNXaXRoVW5kZWZpbmVkTWFwPFQ+W2tleW9mIFRdO1xuXG50eXBlIEtleXNXaXRoVW5kZWZpbmVkTWFwPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXS0/OiB1bmRlZmluZWQgZXh0ZW5kcyBUW0tdID8gSyA6IG5ldmVyO1xufTtcbnR5cGUgTWFuZGF0b3J5S2V5c1dpdGhVbmRlZmluZWQ8VCBleHRlbmRzIG9iamVjdD4gPSBFeHRyYWN0PFJlcXVpcmVkS2V5c09mPFQ+ICYgU3RyaW5nS2V5czxUPiwgS2V5c1dpdGhVbmRlZmluZWQ8VD4+O1xudHlwZSBSZW1vdmVVbmRlZmluZWRPdmVybG9hZDxUIGV4dGVuZHMgb2JqZWN0PiA9IE1hbmRhdG9yeUtleXNXaXRoVW5kZWZpbmVkPFQ+IGV4dGVuZHMgbmV2ZXIgPyBbb2JqOiBUXVxuICA6IG5ldmVyO1xuXG50eXBlIFJlbW92ZVVuZGVmaW5lZFdpdGhLZXlzT3ZlcmxvYWQ8VCBleHRlbmRzIG9iamVjdCwgSyBleHRlbmRzIHJlYWRvbmx5IHN0cmluZ1tdPiA9IFtvYmo6IFQsIGtleXNUb0tlZXA6IEV4YWN0TWVtYmVyczxNYW5kYXRvcnlLZXlzV2l0aFVuZGVmaW5lZDxUPiwgSz5dO1xuXG5pbnRlcmZhY2UgVG9QbGFpbk9iamVjdFBhcmFtcyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGB0b0pTT04oKWAgbWF5IGJlIHVzZWQgZHVyaW5nIGNvbnZlcnNpb24uXG4gICAqL1xuICByZWFkb25seSBjYW5Vc2VUb0pTT046IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHJlY3Vyc2lvbiBkZXB0aC5cbiAgICovXG4gIHJlYWRvbmx5IGRlcHRoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBrZXkgdW5kZXIgd2hpY2ggdGhlIHZhbHVlIGlzIHN0b3JlZCBpbiBpdHMgcGFyZW50LlxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IHVua25vd247XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHRyeUVudHJ5RXF1YWxpdHl9LlxuICovXG5pbnRlcmZhY2UgVHJ5RW50cnlFcXVhbGl0eVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZmlyc3QgdmFsdWUgdG8gY29tcGFyZS5cbiAgICovXG4gIHJlYWRvbmx5IGE6IHVua25vd247XG5cbiAgLyoqXG4gICAqIFRoZSBzZWNvbmQgdmFsdWUgdG8gY29tcGFyZS5cbiAgICovXG4gIHJlYWRvbmx5IGI6IHVua25vd247XG5cbiAgLyoqXG4gICAqIFRoZSBlcXVhbGl0eSBjb21wYXJlciBlbnRyeSB0byB1c2UuXG4gICAqL1xuICByZWFkb25seSBlbnRyeTogRXF1YWxpdHlDb21wYXJlckVudHJ5PHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgVHJ5SGFuZGxlVG9KU09OUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHJlY3Vyc2lvbiBkZXB0aC5cbiAgICovXG4gIHJlYWRvbmx5IGRlcHRoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBrZXkgdW5kZXIgd2hpY2ggdGhlIHZhbHVlIGlzIHN0b3JlZCBpbiBpdHMgcGFyZW50LlxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdmFsdWUgdG8gY29udmVydC5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiBvYmplY3Q7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSB2YWx1ZSB0byBhIEpTT04tc2VyaWFsaXphYmxlIHBsYWluIG9iamVjdCBhbmQgcmVuZGVycyBpdCBhcyBhIEpTT04gc3RyaW5nLlxuICpcbiAqIEEgZnJlc2ggaW5zdGFuY2UgaXMgY3JlYXRlZCBwZXIge0BsaW5rIHRvSnNvbn0gY2FsbCBzbyB0aGF0IHRoZSBhY2N1bXVsYXRlZCBgZnVuY3Rpb25UZXh0c2BcbiAqIGFuZCB0aGUgYHVzZWRPYmplY3RzYCBjaXJjdWxhci1yZWZlcmVuY2Ugc2V0IG5ldmVyIGxlYWsgYmV0d2VlbiBjb252ZXJzaW9ucy5cbiAqL1xuY2xhc3MgVG9Kc29uQ29udmVydGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBmdWxsT3B0aW9uczogUmVzb2x2ZWRUb0pzb25PcHRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IGZ1bmN0aW9uVGV4dHM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlZE9iamVjdHMgPSBuZXcgV2Vha1NldCgpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGNvbnZlcnRlciwgcmVzb2x2aW5nIHRoZSBwcm92aWRlZCBvcHRpb25zIGFnYWluc3QgdGhlIGRlZmF1bHRzLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgSlNPTiBjb252ZXJzaW9uLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFBhcnRpYWw8VG9Kc29uT3B0aW9ucz4pIHtcbiAgICBjb25zdCBERUZBVUxUX09QVElPTlM6IFJlc29sdmVkVG9Kc29uT3B0aW9ucyA9IHtcbiAgICAgIGZ1bmN0aW9uSGFuZGxpbmdNb2RlOiBGdW5jdGlvbkhhbmRsaW5nTW9kZS5FeGNsdWRlLFxuICAgICAgbWF4RGVwdGg6IC0xLFxuICAgICAgc2hvdWxkQ2F0Y2hUb0pTT05FcnJvcnM6IGZhbHNlLFxuICAgICAgc2hvdWxkSGFuZGxlQ2lyY3VsYXJSZWZlcmVuY2VzOiBmYWxzZSxcbiAgICAgIHNob3VsZEhhbmRsZUVycm9yczogZmFsc2UsXG4gICAgICBzaG91bGRIYW5kbGVVbmRlZmluZWQ6IGZhbHNlLFxuICAgICAgc2hvdWxkU29ydEtleXM6IGZhbHNlLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnMgLS0gRXh0cmFjdGluZyBtYWdpYyBudW1iZXIgYXMgYSBjb25zdGFudCB3b3VsZCBiZSByZXBldGl0aXZlLCBhcyB0aGUgdmFsdWUgaXMgdXNlZCBvbmx5IG9uY2UgYW5kIGl0cyBuYW1lIHdvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBwcm9wZXJ0eS5cbiAgICAgIHNwYWNlOiAyLFxuICAgICAgdG9rZW5TdWJzdGl0dXRpb25zOiB7XG4gICAgICAgIGNpcmN1bGFyUmVmZXJlbmNlOiBtYWtlT2JqZWN0VG9rZW5TdWJzdGl0dXRpb24oVG9rZW5TdWJzdGl0dXRpb25LZXkuQ2lyY3VsYXJSZWZlcmVuY2UpLFxuICAgICAgICBtYXhEZXB0aExpbWl0UmVhY2hlZDogbWFrZU9iamVjdFRva2VuU3Vic3RpdHV0aW9uKFRva2VuU3Vic3RpdHV0aW9uS2V5Lk1heERlcHRoTGltaXRSZWFjaGVkKSxcbiAgICAgICAgdG9KU09ORmFpbGVkOiBtYWtlT2JqZWN0VG9rZW5TdWJzdGl0dXRpb24oVG9rZW5TdWJzdGl0dXRpb25LZXkuVG9KU09ORmFpbGVkKVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBmdWxsT3B0aW9ucyA9IHtcbiAgICAgIC4uLkRFRkFVTFRfT1BUSU9OUyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB0b2tlblN1YnN0aXR1dGlvbnM6IHtcbiAgICAgICAgLi4uREVGQVVMVF9PUFRJT05TLnRva2VuU3Vic3RpdHV0aW9ucyxcbiAgICAgICAgLi4ub3B0aW9ucy50b2tlblN1YnN0aXR1dGlvbnNcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKGZ1bGxPcHRpb25zLm1heERlcHRoID09PSAtMSkge1xuICAgICAgZnVsbE9wdGlvbnMubWF4RGVwdGggPSBJbmZpbml0eTtcbiAgICB9XG5cbiAgICB0aGlzLmZ1bGxPcHRpb25zID0gZnVsbE9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgdGhlIGdpdmVuIHZhbHVlIHRvIGEgSlNPTiBzdHJpbmcsIGFwcGx5aW5nIHRoZSBjb25maWd1cmVkIHRva2VuIHN1YnN0aXR1dGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyBUaGUgSlNPTiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGNvbnZlcnQodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGNvbnN0IHBsYWluT2JqZWN0ID0gdGhpcy50b1BsYWluT2JqZWN0KHtcbiAgICAgIGNhblVzZVRvSlNPTjogdHJ1ZSxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAga2V5OiAnJyxcbiAgICAgIHZhbHVlXG4gICAgfSk7XG4gICAgbGV0IGpzb24gPSBlbnN1cmVOb25OdWxsYWJsZShKU09OLnN0cmluZ2lmeShwbGFpbk9iamVjdCwgbnVsbCwgdGhpcy5mdWxsT3B0aW9ucy5zcGFjZSkpO1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyUmVnRXhwID0gbmV3IFJlZ0V4cChTdHJpbmcucmF3YFwiXFxbXFxbJHtlc2NhcGVSZWdFeHAoUExBQ0VIT0xERVJfS0VZX1BSRUZJWCl9KD88S2V5PltBLVphLXpdKykoPzxJbmRleD5cXGQqKVxcXVxcXVwiYCwgJ2cnKTtcbiAgICBqc29uID0gcmVwbGFjZUFsbCh7XG4gICAgICAkc3RyaW5nOiBqc29uLFxuICAgICAgcmVwbGFjZXI6ICh7IGNhcHR1cmVkR3JvdXBBcmd1bWVudHM6IFtrZXkgPSAnJywgaW5kZXhTdHJpbmcgPSAnJ10gfSkgPT5cbiAgICAgICAgYXBwbHlTdWJzdGl0dXRpb25zKHtcbiAgICAgICAgICBmdW5jdGlvblRleHRzOiB0aGlzLmZ1bmN0aW9uVGV4dHMsXG4gICAgICAgICAgaW5kZXg6IGluZGV4U3RyaW5nID8gcGFyc2VJbnQoaW5kZXhTdHJpbmcsIDEwKSA6IDAsXG4gICAgICAgICAga2V5OiBjYXN0VG88VG9rZW5TdWJzdGl0dXRpb25LZXk+KGtleSksXG4gICAgICAgICAgc3Vic3RpdHV0aW9uczogdGhpcy5mdWxsT3B0aW9ucy50b2tlblN1YnN0aXR1dGlvbnNcbiAgICAgICAgfSksXG4gICAgICBzZWFyY2hWYWx1ZTogcGxhY2Vob2xkZXJSZWdFeHBcbiAgICB9KTtcbiAgICByZXR1cm4ganNvbjtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQXJyYXkocGFyYW1zOiBIYW5kbGVBcnJheVBhcmFtcyk6IHVua25vd24ge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhblVzZVRvSlNPTixcbiAgICAgIGRlcHRoLFxuICAgICAgdmFsdWVcbiAgICB9ID0gcGFyYW1zO1xuICAgIHJldHVybiBkZXB0aCA+IHRoaXMuZnVsbE9wdGlvbnMubWF4RGVwdGhcbiAgICAgID8gbWFrZVBsYWNlaG9sZGVyKFRva2VuU3Vic3RpdHV0aW9uS2V5Lk1heERlcHRoTGltaXRSZWFjaGVkQXJyYXksIHZhbHVlLmxlbmd0aClcbiAgICAgIDogdmFsdWUubWFwKChpdGVtLCBpbmRleCkgPT5cbiAgICAgICAgdGhpcy50b1BsYWluT2JqZWN0KHtcbiAgICAgICAgICBjYW5Vc2VUb0pTT04sXG4gICAgICAgICAgZGVwdGg6IGRlcHRoICsgMSxcbiAgICAgICAgICBrZXk6IFN0cmluZyhpbmRleCksXG4gICAgICAgICAgdmFsdWU6IGl0ZW1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNpcmN1bGFyUmVmZXJlbmNlKHZhbHVlOiBvYmplY3QsIGtleTogc3RyaW5nKTogdW5rbm93biB7XG4gICAgaWYgKHRoaXMuZnVsbE9wdGlvbnMuc2hvdWxkSGFuZGxlQ2lyY3VsYXJSZWZlcmVuY2VzKSB7XG4gICAgICByZXR1cm4gbWFrZVBsYWNlaG9sZGVyKFRva2VuU3Vic3RpdHV0aW9uS2V5LkNpcmN1bGFyUmVmZXJlbmNlKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVDb25zdHJ1Y3Rvck5hbWUgPSB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYENvbnZlcnRpbmcgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEpTT05cbi0tPiBzdGFydGluZyBhdCBvYmplY3Qgd2l0aCBjb25zdHJ1Y3RvciAnJHt2YWx1ZUNvbnN0cnVjdG9yTmFtZX0nXG4tLS0gcHJvcGVydHkgJyR7a2V5fScgY2xvc2VzIHRoZSBjaXJjbGVgKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGUgLS0gV2UgbmVlZCB0byB1c2UgYEZ1bmN0aW9uYCB0eXBlIHRvIGhhbmRsZSB0aGVtIHNlcGFyYXRlbHkuXG4gIHByaXZhdGUgaGFuZGxlRnVuY3Rpb24odmFsdWU6IEZ1bmN0aW9uKTogdW5rbm93biB7XG4gICAgaWYgKHRoaXMuZnVsbE9wdGlvbnMuZnVuY3Rpb25IYW5kbGluZ01vZGUgPT09IEZ1bmN0aW9uSGFuZGxpbmdNb2RlLkV4Y2x1ZGUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5mdW5jdGlvblRleHRzLmxlbmd0aDtcbiAgICBjb25zdCBmdW5jdGlvblRleHQgPSB0aGlzLmZ1bGxPcHRpb25zLmZ1bmN0aW9uSGFuZGxpbmdNb2RlID09PSBGdW5jdGlvbkhhbmRsaW5nTW9kZS5GdWxsXG4gICAgICA/IGdldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyh2YWx1ZSlcbiAgICAgIDogYGZ1bmN0aW9uICR7dmFsdWUubmFtZSB8fCAnYW5vbnltb3VzJ30oKSB7IC8qIC4uLiAqLyB9YDtcbiAgICB0aGlzLmZ1bmN0aW9uVGV4dHMucHVzaChmdW5jdGlvblRleHQpO1xuICAgIHJldHVybiBtYWtlUGxhY2Vob2xkZXIoVG9rZW5TdWJzdGl0dXRpb25LZXkuRnVuY3Rpb24sIGluZGV4KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlT2JqZWN0KHBhcmFtczogSGFuZGxlT2JqZWN0UGFyYW1zKTogdW5rbm93biB7XG4gICAgY29uc3Qge1xuICAgICAgY2FuVXNlVG9KU09OLFxuICAgICAgZGVwdGgsXG4gICAgICBrZXksXG4gICAgICB2YWx1ZVxuICAgIH0gPSBwYXJhbXM7XG4gICAgaWYgKHRoaXMudXNlZE9iamVjdHMuaGFzKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlQ2lyY3VsYXJSZWZlcmVuY2UodmFsdWUsIGtleSk7XG4gICAgfVxuXG4gICAgdGhpcy51c2VkT2JqZWN0cy5hZGQodmFsdWUpO1xuXG4gICAgaWYgKGNhblVzZVRvSlNPTikge1xuICAgICAgY29uc3QgdG9KU09OUmVzdWx0ID0gdGhpcy50cnlIYW5kbGVUb0pTT04oe1xuICAgICAgICBkZXB0aCxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZVxuICAgICAgfSk7XG4gICAgICBpZiAodG9KU09OUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRvSlNPTlJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUFycmF5KHtcbiAgICAgICAgY2FuVXNlVG9KU09OLFxuICAgICAgICBkZXB0aCxcbiAgICAgICAgdmFsdWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChkZXB0aCA+IHRoaXMuZnVsbE9wdGlvbnMubWF4RGVwdGgpIHtcbiAgICAgIHJldHVybiBtYWtlUGxhY2Vob2xkZXIoVG9rZW5TdWJzdGl0dXRpb25LZXkuTWF4RGVwdGhMaW1pdFJlYWNoZWQpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIEVycm9yICYmIHRoaXMuZnVsbE9wdGlvbnMuc2hvdWxkSGFuZGxlRXJyb3JzXG4gICAgICA/IGVycm9yVG9TdHJpbmcodmFsdWUpXG4gICAgICA6IHRoaXMuaGFuZGxlUGxhaW5PYmplY3Qoe1xuICAgICAgICBjYW5Vc2VUb0pTT04sXG4gICAgICAgIGRlcHRoLFxuICAgICAgICB2YWx1ZVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVBsYWluT2JqZWN0KHBhcmFtczogSGFuZGxlUGxhaW5PYmplY3RQYXJhbXMpOiB1bmtub3duIHtcbiAgICBjb25zdCB7XG4gICAgICBjYW5Vc2VUb0pTT04sXG4gICAgICBkZXB0aCxcbiAgICAgIHZhbHVlXG4gICAgfSA9IHBhcmFtcztcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModmFsdWUpO1xuICAgIGlmICh0aGlzLmZ1bGxPcHRpb25zLnNob3VsZFNvcnRLZXlzKSB7XG4gICAgICBlbnRyaWVzLnNvcnQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBlbnRyaWVzLm1hcCgoW2tleTIsIHZhbHVlMl0pID0+IFtcbiAgICAgICAga2V5MixcbiAgICAgICAgdGhpcy50b1BsYWluT2JqZWN0KHtcbiAgICAgICAgICBjYW5Vc2VUb0pTT04sXG4gICAgICAgICAgZGVwdGg6IGRlcHRoICsgMSxcbiAgICAgICAgICBrZXk6IGtleTIsXG4gICAgICAgICAgdmFsdWU6IHZhbHVlMlxuICAgICAgICB9KVxuICAgICAgXSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB0b1BsYWluT2JqZWN0KHBhcmFtczogVG9QbGFpbk9iamVjdFBhcmFtcyk6IHVua25vd24ge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhblVzZVRvSlNPTixcbiAgICAgIGRlcHRoLFxuICAgICAga2V5LFxuICAgICAgdmFsdWVcbiAgICB9ID0gcGFyYW1zO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gKGRlcHRoID09PSAwIHx8IHRoaXMuZnVsbE9wdGlvbnMuc2hvdWxkSGFuZGxlVW5kZWZpbmVkKVxuICAgICAgICA/IG1ha2VQbGFjZWhvbGRlcihUb2tlblN1YnN0aXR1dGlvbktleS5VbmRlZmluZWQpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUZ1bmN0aW9uKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbFxuICAgICAgPyB2YWx1ZVxuICAgICAgOiB0aGlzLmhhbmRsZU9iamVjdCh7XG4gICAgICAgIGNhblVzZVRvSlNPTixcbiAgICAgICAgZGVwdGgsXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWVcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB0cnlIYW5kbGVUb0pTT04ocGFyYW1zOiBUcnlIYW5kbGVUb0pTT05QYXJhbXMpOiB1bmtub3duIHtcbiAgICBjb25zdCB7XG4gICAgICBkZXB0aCxcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlXG4gICAgfSA9IHBhcmFtcztcbiAgICBjb25zdCB0b0pTT04gPSAodmFsdWUgYXMgUGFydGlhbDxKU09OU2VyaWFsaXphYmxlPikudG9KU09OO1xuICAgIGlmICh0eXBlb2YgdG9KU09OID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRvSlNPTi5jYWxsKHZhbHVlLCBrZXkpO1xuICAgICAgICByZXR1cm4gdGhpcy50b1BsYWluT2JqZWN0KHtcbiAgICAgICAgICBjYW5Vc2VUb0pTT046IGZhbHNlLFxuICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICB2YWx1ZTogbmV3VmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAodGhpcy5mdWxsT3B0aW9ucy5zaG91bGRDYXRjaFRvSlNPTkVycm9ycykge1xuICAgICAgICAgIHJldHVybiBtYWtlUGxhY2Vob2xkZXIoVG9rZW5TdWJzdGl0dXRpb25LZXkuVG9KU09ORmFpbGVkKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuLyoqXG4gKiBBc3NpZ25zIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhIHRhcmdldCBvYmplY3QsIGluY2x1ZGluZyBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0YXJnZXQgb2JqZWN0IHR5cGUuXG4gKiBAdHlwZVBhcmFtIFUgLSBUaGUgc291cmNlIG9iamVjdCB0eXBlLlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRvIGFzc2lnbiBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBzb3VyY2Ugb2JqZWN0IHRvIGFzc2lnbiBwcm9wZXJ0aWVzIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgdGFyZ2V0IG9iamVjdCB3aXRoIHRoZSBhc3NpZ25lZCBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduV2l0aE5vbkVudW1lcmFibGVQcm9wZXJ0aWVzPFQgZXh0ZW5kcyBvYmplY3QsIFU+KHRhcmdldDogVCwgc291cmNlOiBVKTogVCAmIFU7XG4vKipcbiAqIEFzc2lnbnMgcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGEgdGFyZ2V0IG9iamVjdCwgaW5jbHVkaW5nIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHRhcmdldCBvYmplY3QgdHlwZS5cbiAqIEB0eXBlUGFyYW0gVSAtIFRoZSBmaXJzdCBzb3VyY2Ugb2JqZWN0IHR5cGUuXG4gKiBAdHlwZVBhcmFtIFYgLSBUaGUgc2Vjb25kIHNvdXJjZSBvYmplY3QgdHlwZS5cbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG9iamVjdCB0byBhc3NpZ24gcHJvcGVydGllcyB0by5cbiAqIEBwYXJhbSBzb3VyY2UxIC0gVGhlIGZpcnN0IHNvdXJjZSBvYmplY3QgdG8gYXNzaWduIHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSBzb3VyY2UyIC0gVGhlIHNlY29uZCBzb3VyY2Ugb2JqZWN0IHRvIGFzc2lnbiBwcm9wZXJ0aWVzIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgdGFyZ2V0IG9iamVjdCB3aXRoIHRoZSBhc3NpZ25lZCBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduV2l0aE5vbkVudW1lcmFibGVQcm9wZXJ0aWVzPFQgZXh0ZW5kcyBvYmplY3QsIFUsIFY+KHRhcmdldDogVCwgc291cmNlMTogVSwgc291cmNlMjogVik6IFQgJiBVICYgVjtcbi8qKlxuICogQXNzaWducyBwcm9wZXJ0aWVzIGZyb20gb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgdG8gYSB0YXJnZXQgb2JqZWN0LCBpbmNsdWRpbmcgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdGFyZ2V0IG9iamVjdCB0eXBlLlxuICogQHR5cGVQYXJhbSBVIC0gVGhlIGZpcnN0IHNvdXJjZSBvYmplY3QgdHlwZS5cbiAqIEB0eXBlUGFyYW0gViAtIFRoZSBzZWNvbmQgc291cmNlIG9iamVjdCB0eXBlLlxuICogQHR5cGVQYXJhbSBXIC0gVGhlIHRoaXJkIHNvdXJjZSBvYmplY3QgdHlwZS5cbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG9iamVjdCB0byBhc3NpZ24gcHJvcGVydGllcyB0by5cbiAqIEBwYXJhbSBzb3VyY2UxIC0gVGhlIGZpcnN0IHNvdXJjZSBvYmplY3QgdG8gYXNzaWduIHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSBzb3VyY2UyIC0gVGhlIHNlY29uZCBzb3VyY2Ugb2JqZWN0IHRvIGFzc2lnbiBwcm9wZXJ0aWVzIGZyb20uXG4gKiBAcGFyYW0gc291cmNlMyAtIFRoZSB0aGlyZCBzb3VyY2Ugb2JqZWN0IHRvIGFzc2lnbiBwcm9wZXJ0aWVzIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgdGFyZ2V0IG9iamVjdCB3aXRoIHRoZSBhc3NpZ25lZCBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduV2l0aE5vbkVudW1lcmFibGVQcm9wZXJ0aWVzPFQgZXh0ZW5kcyBvYmplY3QsIFUsIFYsIFc+KHRhcmdldDogVCwgc291cmNlMTogVSwgc291cmNlMjogViwgc291cmNlMzogVyk6IFQgJiBVICYgViAmIFc7XG4vKipcbiAqIEFzc2lnbnMgcHJvcGVydGllcyBmcm9tIG9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIHRvIGEgdGFyZ2V0IG9iamVjdCwgaW5jbHVkaW5nIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRvIGFzc2lnbiBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHNvdXJjZXMgLSBUaGUgc291cmNlIG9iamVjdHMgdG8gYXNzaWduIHByb3BlcnRpZXMgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSB0YXJnZXQgb2JqZWN0IHdpdGggdGhlIGFzc2lnbmVkIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ25XaXRoTm9uRW51bWVyYWJsZVByb3BlcnRpZXModGFyZ2V0OiBvYmplY3QsIC4uLnNvdXJjZXM6IG9iamVjdFtdKTogb2JqZWN0IHtcbiAgcmV0dXJuIGFzc2lnbldpdGhOb25FbnVtZXJhYmxlUHJvcGVydGllc0ltcGwodGFyZ2V0LCAuLi5zb3VyY2VzKTtcbn1cblxuLyoqXG4gKiBDYXN0cyBhIHZhbHVlIHRvIGEgc3BlY2lmaWMgdHlwZS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdGFyZ2V0IHR5cGUgdG8gY2FzdCB0by5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjYXN0LlxuICogQHJldHVybnMgVGhlIHZhbHVlIGFzIHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byBjYXN0LlxuZXhwb3J0IGZ1bmN0aW9uIGNhc3RUbzxUPih2YWx1ZTogdW5rbm93bik6IFQge1xuICByZXR1cm4gdmFsdWUgYXMgVDtcbn1cblxuLyoqXG4gKiBDbG9uZXMgYW4gb2JqZWN0LCBpbmNsdWRpbmcgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgb2JqZWN0LlxuICogQHBhcmFtICRvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHJldHVybnMgQSBuZXcgb2JqZWN0IHdpdGggdGhlIHNhbWUgcHJvcGVydGllcyBhcyB0aGUgb3JpZ2luYWwgb2JqZWN0LCBpbmNsdWRpbmcgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsb25lV2l0aE5vbkVudW1lcmFibGVQcm9wZXJ0aWVzPFQgZXh0ZW5kcyBvYmplY3Q+KCRvYmplY3Q6IFQpOiBUIHtcbiAgcmV0dXJuIE9iamVjdC5jcmVhdGUoZ2V0UHJvdG90eXBlT2YoJG9iamVjdCksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKCRvYmplY3QpKSBhcyBUO1xufVxuXG4vKipcbiAqIERlbGV0ZXMgbXVsdGlwbGUgcHJvcGVydGllcyBmcm9tIGFuIG9iamVjdC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgb2JqZWN0LlxuICogQHBhcmFtICRvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGRlbGV0ZSB0aGUgcHJvcGVydGllcyBmcm9tLlxuICogQHBhcmFtIHByb3BlcnR5TmFtZXMgLSBUaGUgbmFtZXMgb2YgdGhlIHByb3BlcnRpZXMgdG8gZGVsZXRlLlxuICogQHJldHVybnMgYHRydWVgIGlmIGFueSBvZiB0aGUgcHJvcGVydGllcyB3ZXJlIHByZXNlbnQsIG90aGVyd2lzZSBgZmFsc2VgLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWJvb2xlYW4tbmFtZSAtLSBUaGUgbmFtZSBzdGF0ZXMgdGhlIGFjdGlvbjsgdGhlIGJvb2xlYW4gb25seSByZXBvcnRzIHdoZXRoZXIgYW55dGhpbmcgd2FzIGRlbGV0ZWQuXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlUHJvcGVydGllczxUIGV4dGVuZHMgb2JqZWN0Pigkb2JqZWN0OiBULCBwcm9wZXJ0eU5hbWVzOiAoa2V5b2YgVClbXSk6IGJvb2xlYW4ge1xuICBsZXQgaGFzRGVsZXRlZEFueSA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIHByb3BlcnR5TmFtZXMpIHtcbiAgICBoYXNEZWxldGVkQW55ID0gZGVsZXRlUHJvcGVydHkoJG9iamVjdCwgcHJvcGVydHlOYW1lKSB8fCBoYXNEZWxldGVkQW55O1xuICB9XG5cbiAgcmV0dXJuIGhhc0RlbGV0ZWRBbnk7XG59XG5cbi8qKlxuICogRGVsZXRlcyBhIHByb3BlcnR5IGZyb20gYW4gb2JqZWN0LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QuXG4gKiBAcGFyYW0gJG9iamVjdCAtIFRoZSBvYmplY3QgdG8gZGVsZXRlIHRoZSBwcm9wZXJ0eSBmcm9tLlxuICogQHBhcmFtIHByb3BlcnR5TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBkZWxldGUuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHByb3BlcnR5IHdhcyBwcmVzZW50LCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1ib29sZWFuLW5hbWUgLS0gVGhlIG5hbWUgc3RhdGVzIHRoZSBhY3Rpb247IHRoZSBib29sZWFuIG9ubHkgcmVwb3J0cyB3aGV0aGVyIHRoZSBwcm9wZXJ0eSB3YXMgZGVsZXRlZC5cbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVQcm9wZXJ0eTxUIGV4dGVuZHMgb2JqZWN0Pigkb2JqZWN0OiBULCBwcm9wZXJ0eU5hbWU6IGtleW9mIFQpOiBib29sZWFuIHtcbiAgaWYgKCFPYmplY3QuaGFzT3duKCRvYmplY3QsIHByb3BlcnR5TmFtZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBXZSBoYXZlIG5vIG90aGVyIHdheSB0byBkZWxldGUgdGhlIHByb3BlcnR5LlxuICBkZWxldGUgJG9iamVjdFtwcm9wZXJ0eU5hbWVdO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgZGVmYXVsdCBleHBvcnQgZnJvbSBhIG1vZHVsZS5cbiAqXG4gKiBVc2VmdWwgdG8gaGFuZGxlIGluY29ycmVjdCBkZWZhdWx0IGV4cG9ydCBpbnRlcm9wIGJldHdlZW4gRVNNIGFuZCBDSlMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIGRlZmF1bHQgZXhwb3J0LlxuICogQHBhcmFtIG1vZHVsZSAtIFRoZSBtb2R1bGUgdG8gZXh0cmFjdCB0aGUgZGVmYXVsdCBleHBvcnQgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSBkZWZhdWx0IGV4cG9ydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3REZWZhdWx0RXhwb3J0SW50ZXJvcDxUPihtb2R1bGU6IE1vZHVsZVdpdGhEZWZhdWx0RXhwb3J0PFQ+IHwgVCk6IFQge1xuICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ29iamVjdCcgfHwgbW9kdWxlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG1vZHVsZTtcbiAgfVxuXG4gIHJldHVybiAnZGVmYXVsdCcgaW4gbW9kdWxlID8gbW9kdWxlLmRlZmF1bHQgOiBtb2R1bGU7XG59XG5cbi8qKlxuICogR2V0cyBhbGwgZW50cmllcyBvZiBhbiBvYmplY3QuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9iamVjdC5cbiAqIEBwYXJhbSAkb2JqZWN0IC0gVGhlIG9iamVjdCB0byBnZXQgdGhlIGVudHJpZXMgb2YuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbGwgZW50cmllcyBvZiB0aGUgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsRW50cmllczxUIGV4dGVuZHMgb2JqZWN0Pigkb2JqZWN0OiBUKTogW1N0cmluZ0tleXM8VD4sIFRbU3RyaW5nS2V5czxUPl1dW10ge1xuICByZXR1cm4gZ2V0QWxsS2V5cygkb2JqZWN0KS5tYXAoKGtleSkgPT4gW2tleSwgJG9iamVjdFtrZXldXSk7XG59XG5cbi8qKlxuICogR2V0cyBhbGwga2V5cyBvZiBhbiBvYmplY3QuXG4gKiBJbmNsdWRlcyBmaWVsZHMgYW5kIHByb3BlcnRpZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9iamVjdC5cbiAqIEBwYXJhbSAkb2JqZWN0IC0gVGhlIG9iamVjdCB0byBnZXQgdGhlIGtleXMgb2YuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbGwga2V5cyBvZiB0aGUgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsS2V5czxUIGV4dGVuZHMgb2JqZWN0Pigkb2JqZWN0OiBUKTogU3RyaW5nS2V5czxUPltdIHtcbiAgY29uc3Qga2V5czogU3RyaW5nS2V5czxUPltdID0gW107XG4gIGxldCBjdXJyZW50OiBudWxsIHwgb2JqZWN0ID0gJG9iamVjdDtcbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGN1cnJlbnQpO1xuICAgIGZvciAoY29uc3QgW2tleSwgZGVzY3JpcHRvcl0gb2YgT2JqZWN0LmVudHJpZXMoZGVzY3JpcHRvcnMpKSB7XG4gICAgICBpZiAoKGtleSA9PT0gJ19fcHJvdG9fXycpIHx8ICh0eXBlb2YgZGVzY3JpcHRvci52YWx1ZSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhc0dldHRlciA9IHR5cGVvZiBkZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgIGNvbnN0IGhhc1NldHRlciA9IHR5cGVvZiBkZXNjcmlwdG9yLnNldCA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgIGlmIChoYXNHZXR0ZXIgfHwgaGFzU2V0dGVyKSB7XG4gICAgICAgIGlmIChoYXNHZXR0ZXIgJiYgaGFzU2V0dGVyKSB7XG4gICAgICAgICAga2V5cy5wdXNoKGtleSBhcyBTdHJpbmdLZXlzPFQ+KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlc2NyaXB0b3IuZW51bWVyYWJsZSAmJiBkZXNjcmlwdG9yLndyaXRhYmxlKSB7XG4gICAgICAgIGtleXMucHVzaChrZXkgYXMgU3RyaW5nS2V5czxUPik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KSBhcyBudWxsIHwgb2JqZWN0O1xuICB9XG4gIHJldHVybiBrZXlzLnNvcnQoKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIG5lc3RlZCBwcm9wZXJ0eSBmcm9tIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gJG9iamVjdCAtIFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBuZXN0ZWQgcHJvcGVydHkgdmFsdWUgZnJvbS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIG5lc3RlZCBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgbmVzdGVkIHByb3BlcnR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmVzdGVkUHJvcGVydHlWYWx1ZSgkb2JqZWN0OiBHZW5lcmljT2JqZWN0LCBwYXRoOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgbGV0IG5vZGU6IEdlbmVyaWNPYmplY3QgfCB1bmRlZmluZWQgPSAkb2JqZWN0O1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChLRVlfU0VQQVJBVE9SKTtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIG5vZGUgPSBub2RlW2tleV0gYXMgR2VuZXJpY09iamVjdCB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHByb3RvdHlwZSBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgb2JqZWN0LlxuICogQHBhcmFtIGluc3RhbmNlIC0gVGhlIG9iamVjdCBpbnN0YW5jZSB0byByZXRyaWV2ZSB0aGUgcHJvdG90eXBlIG9mLlxuICogQHJldHVybnMgVGhlIHByb3RvdHlwZSBvZiB0aGUgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvdG90eXBlT2Y8VD4oaW5zdGFuY2U6IFQpOiBUIHtcbiAgcmV0dXJuIGluc3RhbmNlID09PSB1bmRlZmluZWQgfHwgaW5zdGFuY2UgPT09IG51bGwgPyBpbnN0YW5jZSA6IChPYmplY3QuZ2V0UHJvdG90eXBlT2YoaW5zdGFuY2UpIGFzIFQpO1xufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGRlZXBseSBlcXVhbC5cbiAqXG4gKiBAcGFyYW0gYSAtIFRoZSBmaXJzdCB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIGIgLSBUaGUgc2Vjb25kIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZGVlcGx5IGVxdWFsLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGVlcEVxdWFsKGE6IHVua25vd24sIGI6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYSAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIGIgIT09ICdvYmplY3QnIHx8IGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGFDb25zdHJ1Y3RvciA9IGEuY29uc3RydWN0b3I7XG4gIGNvbnN0IGJDb25zdHJ1Y3RvciA9IGIuY29uc3RydWN0b3I7XG5cbiAgaWYgKGFDb25zdHJ1Y3RvciAhPT0gYkNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGFDb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gZGVlcEVxdWFsVHlwZWQoYSwgYik7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGtleXNBID0gZ2V0QWxsS2V5cyhhKTtcbiAgY29uc3Qga2V5c0IgPSBnZXRBbGxLZXlzKGIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGFSZWNvcmQgPSBlbnN1cmVHZW5lcmljT2JqZWN0KGEpO1xuICBjb25zdCBiUmVjb3JkID0gZW5zdXJlR2VuZXJpY09iamVjdChiKTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzQSkge1xuICAgIGlmICgha2V5c0IuaW5jbHVkZXMoa2V5KSB8fCAhaXNEZWVwRXF1YWwoYVJlY29yZFtrZXldLCBiUmVjb3JkW2tleV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbmFtZSBvZiBhIHByb3BlcnR5IG9mIGEgZ2l2ZW4gdHlwZSBgVGAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0eS5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGFzIGEgc3RyaW5nLlxuICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmFtZW9mPFQgZXh0ZW5kcyBvYmplY3Q+KG5hbWU6IFN0cmluZ0tleXM8VD4pOiBTdHJpbmdLZXlzPFQ+IHtcbiAgcmV0dXJuIG5hbWU7XG59XG4vKipcbiAqIE5vcm1hbGl6ZXMgb3B0aW9uYWwgcHJvcGVydGllcyB0byBhbGxvdyBgdW5kZWZpbmVkYCBhc3NpZ25tZW50IGluIHN0cmljdCBtb2RlLlxuICpcbiAqIFRoaXMgdXRpbGl0eSBwcm92aWRlcyBhIHdvcmthcm91bmQgZm9yIHRoZSBgZXhhY3RPcHRpb25hbFByb3BlcnR5VHlwZXNgIFR5cGVTY3JpcHQgZmxhZyxcbiAqIHdoaWNoIHByb2hpYml0cyBkaXJlY3RseSBhc3NpZ25pbmcgYHVuZGVmaW5lZGAgdG8gb3B0aW9uYWwgcHJvcGVydGllcyB3aGVuIHRoZSB0eXBlXG4gKiBleHBsaWNpdGx5IG9taXRzIGB1bmRlZmluZWRgLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBXaXRoIGBleGFjdE9wdGlvbmFsUHJvcGVydHlUeXBlczogdHJ1ZWBcbiAqIGNvbnN0IHg6IHsgcHJvcD86IHN0cmluZyB9ID0geyBwcm9wOiB1bmRlZmluZWQgfTsgLy8gQ29tcGlsZXIgZXJyb3JcbiAqXG4gKiAvLyBVc2luZyB0aGlzIHV0aWxpdHk6XG4gKiBjb25zdCB5OiB7IHByb3A/OiBzdHJpbmcgfSA9IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczx7IHByb3A/OiBzdHJpbmcgfT4oeyBwcm9wOiB1bmRlZmluZWQgfSk7IC8vIFdvcmtzXG4gKiBgYGBcbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdGFyZ2V0IHR5cGUgd2l0aCBvcHRpb25hbCBwcm9wZXJ0aWVzIHRvIG5vcm1hbGl6ZS5cbiAqIEBwYXJhbSAkb2JqZWN0IC0gVGhlIG9iamVjdCB0byBub3JtYWxpemUsIGFsbG93aW5nIGV4cGxpY2l0IGB1bmRlZmluZWRgIGZvciBvcHRpb25hbCBwcm9wZXJ0aWVzLlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgb2JqZWN0LCBjb21wYXRpYmxlIHdpdGggYGV4YWN0T3B0aW9uYWxQcm9wZXJ0eVR5cGVzYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxUPigkb2JqZWN0OiBVbmRlZmluZWRPblBhcnRpYWxEZWVwPFQ+KTogVCB7XG4gIHJldHVybiAkb2JqZWN0IGFzIFQ7XG59XG4vKipcbiAqIFJlbW92ZXMgYWxsIGB1bmRlZmluZWRgIHByb3BlcnRpZXMgZnJvbSBhbiBvYmplY3Qgd2hlbiB0aGVyZSBhcmUgbm8gbWFuZGF0b3J5IGtleXMgd2l0aCBgdW5kZWZpbmVkYCB2YWx1ZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUeXBlIC0gVGhlIHR5cGUgb2YgdGhlIG9iamVjdC5cbiAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGFyZ3VtZW50cyB0byB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgb2JqZWN0IHdpdGggYWxsIGB1bmRlZmluZWRgIHByb3BlcnRpZXMgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXM8VHlwZSBleHRlbmRzIG9iamVjdD4oXG4gIC4uLiRhcmd1bWVudHM6IFJlbW92ZVVuZGVmaW5lZE92ZXJsb2FkPFR5cGU+XG4pOiBUeXBlO1xuLyoqXG4gKiBSZW1vdmVzIGFsbCBgdW5kZWZpbmVkYCBwcm9wZXJ0aWVzIGZyb20gYW4gb2JqZWN0IHdoZW4gdGhlcmUgYXJlIG1hbmRhdG9yeSBrZXlzIHdpdGggYHVuZGVmaW5lZGAgdmFsdWVzLlxuICpcbiAqIEB0eXBlUGFyYW0gVHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QuXG4gKiBAdHlwZVBhcmFtIEtleXNUb0tlZXAgLSBUaGUga2V5cyB0byBrZWVwLlxuICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIHRvIHRoZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBvYmplY3Qgd2l0aCBhbGwgYHVuZGVmaW5lZGAgcHJvcGVydGllcyByZW1vdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVW5kZWZpbmVkUHJvcGVydGllczxUeXBlIGV4dGVuZHMgb2JqZWN0LCBjb25zdCBLZXlzVG9LZWVwIGV4dGVuZHMgcmVhZG9ubHkgc3RyaW5nW10+KFxuICAuLi4kYXJndW1lbnRzOiBSZW1vdmVVbmRlZmluZWRXaXRoS2V5c092ZXJsb2FkPFR5cGUsIEtleXNUb0tlZXA+XG4pOiBUeXBlO1xuLyoqXG4gKiBSZW1vdmVzIGFsbCBgdW5kZWZpbmVkYCBwcm9wZXJ0aWVzIGZyb20gYW4gb2JqZWN0LlxuICpcbiAqIEB0eXBlUGFyYW0gVHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QuXG4gKiBAcGFyYW0gJG9iamVjdCAtIFRoZSBvYmplY3QgdG8gcmVtb3ZlIGB1bmRlZmluZWRgIHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSBrZXlzVG9LZWVwIC0gVGhlIGtleXMgdG8ga2VlcC5cbiAqIEByZXR1cm5zIFRoZSBvYmplY3Qgd2l0aCBhbGwgYHVuZGVmaW5lZGAgcHJvcGVydGllcyByZW1vdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVW5kZWZpbmVkUHJvcGVydGllczxUeXBlIGV4dGVuZHMgb2JqZWN0Pigkb2JqZWN0OiBUeXBlLCBrZXlzVG9LZWVwPzogcmVhZG9ubHkgc3RyaW5nW10pOiBUeXBlIHtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoJG9iamVjdCkgYXMgW1N0cmluZ0tleXM8VHlwZT4sIHVua25vd25dW10pIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAha2V5c1RvS2VlcD8uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBXZSBoYXZlIG5vIG90aGVyIHdheSB0byBkZWxldGUgdGhlIHByb3BlcnR5LlxuICAgICAgZGVsZXRlICRvYmplY3Rba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuICRvYmplY3Q7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgdmFsdWUgb2YgYSBuZXN0ZWQgcHJvcGVydHkgaW4gYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3Igc2V0dGluZyB0aGUgbmVzdGVkIHByb3BlcnR5IHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TmVzdGVkUHJvcGVydHlWYWx1ZShwYXJhbXM6IFNldE5lc3RlZFByb3BlcnR5VmFsdWVQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgICRvYmplY3QsXG4gICAgcGF0aCxcbiAgICB2YWx1ZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgUHJvcGVydHkgcGF0aCAke3BhdGh9IG5vdCBmb3VuZGApO1xuICBsZXQgbm9kZTogR2VuZXJpY09iamVjdCB8IHVuZGVmaW5lZCA9ICRvYmplY3Q7XG4gIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KEtFWV9TRVBBUkFUT1IpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzLnNsaWNlKDAsIC0xKSkge1xuICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBub2RlID0gbm9kZVtrZXldIGFzIEdlbmVyaWNPYmplY3QgfCB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBsYXN0S2V5ID0gZW5zdXJlTm9uTnVsbGFibGUoa2V5cy5hdCgtMSkpO1xuICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBub2RlW2xhc3RLZXldID0gdmFsdWU7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBnaXZlbiB2YWx1ZSB0byBhIEpTT04gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQgdG8gSlNPTi4gVGhpcyBjYW4gYmUgb2YgYW55IHR5cGUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGN1c3RvbWl6aW5nIHRoZSBKU09OIGNvbnZlcnNpb24gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIFRoZSBKU09OIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5wdXQgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb24odmFsdWU6IHVua25vd24sIG9wdGlvbnM6IFBhcnRpYWw8VG9Kc29uT3B0aW9ucz4gPSB7fSk6IHN0cmluZyB7XG4gIHJldHVybiBuZXcgVG9Kc29uQ29udmVydGVyKG9wdGlvbnMpLmNvbnZlcnQodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBhcHBseVN1YnN0aXR1dGlvbnMocGFyYW1zOiBBcHBseVN1YnN0aXR1dGlvbnNQYXJhbXMpOiBNYXliZVJldHVybjxzdHJpbmc+IHtcbiAgc3dpdGNoIChwYXJhbXMua2V5KSB7XG4gICAgY2FzZSBUb2tlblN1YnN0aXR1dGlvbktleS5DaXJjdWxhclJlZmVyZW5jZToge1xuICAgICAgcmV0dXJuIHBhcmFtcy5zdWJzdGl0dXRpb25zLmNpcmN1bGFyUmVmZXJlbmNlO1xuICAgIH1cbiAgICBjYXNlIFRva2VuU3Vic3RpdHV0aW9uS2V5LkZ1bmN0aW9uOiB7XG4gICAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUocGFyYW1zLmZ1bmN0aW9uVGV4dHNbcGFyYW1zLmluZGV4XSwgYEZ1bmN0aW9uIHdpdGggaW5kZXggJHtTdHJpbmcocGFyYW1zLmluZGV4KX0gbm90IGZvdW5kYCk7XG4gICAgfVxuICAgIGNhc2UgVG9rZW5TdWJzdGl0dXRpb25LZXkuTWF4RGVwdGhMaW1pdFJlYWNoZWQ6IHtcbiAgICAgIHJldHVybiBwYXJhbXMuc3Vic3RpdHV0aW9ucy5tYXhEZXB0aExpbWl0UmVhY2hlZDtcbiAgICB9XG4gICAgY2FzZSBUb2tlblN1YnN0aXR1dGlvbktleS5NYXhEZXB0aExpbWl0UmVhY2hlZEFycmF5OiB7XG4gICAgICByZXR1cm4gYEFycmF5KCR7U3RyaW5nKHBhcmFtcy5pbmRleCl9KWA7XG4gICAgfVxuICAgIGNhc2UgVG9rZW5TdWJzdGl0dXRpb25LZXkuVG9KU09ORmFpbGVkOiB7XG4gICAgICByZXR1cm4gcGFyYW1zLnN1YnN0aXR1dGlvbnMudG9KU09ORmFpbGVkO1xuICAgIH1cbiAgICBjYXNlIFRva2VuU3Vic3RpdHV0aW9uS2V5LlVuZGVmaW5lZDoge1xuICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gRXhoYXVzdGl2ZSBzd2l0Y2ggZ3VhcmQ7IGRlZmF1bHQgYnJhbmNoIGlzIHVucmVhY2hhYmxlLiAqL1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGFzc2VydE5ldmVyKHBhcmFtcy5rZXkpO1xuICAgIH1cbiAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzaWduV2l0aE5vbkVudW1lcmFibGVQcm9wZXJ0aWVzSW1wbCh0YXJnZXQ6IG9iamVjdCwgLi4uc291cmNlczogb2JqZWN0W10pOiBvYmplY3Qge1xuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpO1xuXG4gICAgZm9yIChjb25zdCBba2V5LCBkZXNjcmlwdG9yXSBvZiBPYmplY3QuZW50cmllcyhkZXNjcmlwdG9ycykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEF2b2lkIHJlZGVmaW5pbmcgcmVhZC1vbmx5IHByb3BlcnRpZXMgKGVzcGVjaWFsbHkgYHByb3RvdHlwZWApXG4gICAgICAgIGlmIChcbiAgICAgICAgICBrZXkgPT09ICdwcm90b3R5cGUnXG4gICAgICAgICAgfHwgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpPy53cml0YWJsZSA9PT0gZmFsc2VcbiAgICAgICAgICAgICYmICFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KT8uY29uZmlndXJhYmxlKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gU2lsZW50bHkgaWdub3JlIGlmIGRlZmluZVByb3BlcnR5IGZhaWxzXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc291cmNlUHJvdG90eXBlcyA9IHNvdXJjZXNcbiAgICAubWFwKChzb3VyY2UpID0+IGdldFByb3RvdHlwZU9mPG9iamVjdCB8IHVuZGVmaW5lZD4oc291cmNlKSlcbiAgICAuZmlsdGVyKChwcm90b3R5cGUpOiBwcm90b3R5cGUgaXMgb2JqZWN0ID0+ICEhcHJvdG90eXBlKTtcblxuICBpZiAoc291cmNlUHJvdG90eXBlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdGFyZ2V0UHJvdG90eXBlID0gYXNzaWduV2l0aE5vbkVudW1lcmFibGVQcm9wZXJ0aWVzSW1wbCh7fSwgZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSwgLi4uc291cmNlUHJvdG90eXBlcyk7XG5cbiAgICB0cnkge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRhcmdldCwgdGFyZ2V0UHJvdG90eXBlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFNpbGVudGx5IGlnbm9yZSBpZiBzZXRQcm90b3R5cGVPZiBmYWlsc1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qXG4gKiBUaGUgb25lIHBsYWNlIHdoZXJlIHRoZSBsaXN0J3MgaGV0ZXJvZ2VuZWl0eSBpcyBicmlkZ2VkLCBhbmQgaXQgbmVlZHMgYSBjYXN0IGJlY2F1c2UgdGhlIGNvcnJlbGF0aW9uIHRoYXQgbWFrZXMgaXRcbiAqIHNhZmUgaXMgYSBydW50aW1lIG9uZTogYHRyeUVudHJ5RXF1YWxpdHlgIGNhbGxzIHRoZSBjb21wYXJlciBvbmx5IGFmdGVyIGBhIGluc3RhbmNlb2YgZW50cnkuY29uc3RydWN0b3JgIGhhcyBoZWxkIGZvclxuICogYm90aCBvcGVyYW5kcywgYW5kIG5vIHR5cGUgY2FuIHRpZSB0aGF0IGBpbnN0YW5jZW9mYCB0byB0aGlzIGVudHJ5J3MgYFRgLiBDb25maW5pbmcgdGhlIGNhc3QgaGVyZSBidXlzIHRoZSBjaGVjayB0aGVcbiAqIGxpc3QgdXNlZCB0byBsYWNrIC0gdGhlIGNvbnN0cnVjdG9yIGFuZCB0aGUgY29tcGFyZXIgYXJlIGluZmVycmVkIGZyb20gT05FIGBUYCwgc28gYSBtaXNtYXRjaGVkIHBhaXIgaXMgYSBjb21waWxlXG4gKiBlcnJvciBhdCB0aGUgY2FsbCBzaXRlIGluc3RlYWQgb2YgYmVpbmcgd2F2ZWQgdGhyb3VnaCBieSBhbiBgYW55YC10eXBlZCBlbnRyeSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRXF1YWxpdHlDb21wYXJlckVudHJ5PFQ+KGNvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxUPiwgY2hlY2tJc0VxdWFsOiAoYTogVCwgYjogVCkgPT4gYm9vbGVhbik6IEVxdWFsaXR5Q29tcGFyZXJFbnRyeTx1bmtub3duPiB7XG4gIHJldHVybiB7XG4gICAgY29uc3RydWN0b3IsXG4gICAgZXF1YWxpdHlDb21wYXJlcjogKGEsIGIpID0+IGNoZWNrSXNFcXVhbChhIGFzIFQsIGIgYXMgVClcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVlcEVxdWFsVHlwZWQoYTogdW5rbm93biwgYjogdW5rbm93bik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVxdWFsaXR5Q29tcGFyZXJFbnRyaWVzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdHJ5RW50cnlFcXVhbGl0eSh7XG4gICAgICBhLFxuICAgICAgYixcbiAgICAgIGVudHJ5XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc0RlZXBFcXVhbEFycmF5QnVmZmVyKGE6IEFycmF5QnVmZmVyLCBiOiBBcnJheUJ1ZmZlcik6IGJvb2xlYW4ge1xuICBpZiAoYS5ieXRlTGVuZ3RoICE9PSBiLmJ5dGVMZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB2aWV3QSA9IG5ldyBVaW50OEFycmF5KGEpO1xuICBjb25zdCB2aWV3QiA9IG5ldyBVaW50OEFycmF5KGIpO1xuICByZXR1cm4gaXNEZWVwRXF1YWwodmlld0EsIHZpZXdCKTtcbn1cblxuZnVuY3Rpb24gaXNEZWVwRXF1YWxEYXRlKGE6IERhdGUsIGI6IERhdGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGEuZ2V0VGltZSgpID09PSBiLmdldFRpbWUoKTtcbn1cblxuZnVuY3Rpb24gaXNEZWVwRXF1YWxNYXAoYTogTWFwPHVua25vd24sIHVua25vd24+LCBiOiBNYXA8dW5rbm93biwgdW5rbm93bj4pOiBib29sZWFuIHtcbiAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgYSkge1xuICAgIGlmICghYi5oYXMoa2V5KSB8fCAhaXNEZWVwRXF1YWwodmFsdWUsIGIuZ2V0KGtleSkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzRGVlcEVxdWFsUmVnRXhwKGE6IFJlZ0V4cCwgYjogUmVnRXhwKTogYm9vbGVhbiB7XG4gIHJldHVybiBhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYi5mbGFncztcbn1cblxuZnVuY3Rpb24gaXNEZWVwRXF1YWxTZXQoYTogU2V0PHVua25vd24+LCBiOiBTZXQ8dW5rbm93bj4pOiBib29sZWFuIHtcbiAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yIChjb25zdCB2YWx1ZUEgb2YgYSkge1xuICAgIGlmIChiLmhhcyh2YWx1ZUEpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgbGV0IGhhc01hdGNoID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCB2YWx1ZUIgb2YgYikge1xuICAgICAgaWYgKGlzRGVlcEVxdWFsKHZhbHVlQSwgdmFsdWVCKSkge1xuICAgICAgICBoYXNNYXRjaCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc01hdGNoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIG1ha2VPYmplY3RUb2tlblN1YnN0aXR1dGlvbihrZXk6IFRva2VuU3Vic3RpdHV0aW9uS2V5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGB7IFwiW1ske2tleX1dXVwiOiBudWxsIH1gO1xufVxuXG5mdW5jdGlvbiBtYWtlUGxhY2Vob2xkZXIoa2V5OiBUb2tlblN1YnN0aXR1dGlvbktleSwgaW5kZXg/OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYFtbJHtQTEFDRUhPTERFUl9LRVlfUFJFRklYfSR7a2V5fSR7aW5kZXggPyBTdHJpbmcoaW5kZXgpIDogJyd9XV1gO1xufVxuXG5mdW5jdGlvbiB0cnlFbnRyeUVxdWFsaXR5KHBhcmFtczogVHJ5RW50cnlFcXVhbGl0eVBhcmFtcyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBjb25zdCB7XG4gICAgYSxcbiAgICBiLFxuICAgIGVudHJ5XG4gIH0gPSBwYXJhbXM7XG4gIHJldHVybiBhIGluc3RhbmNlb2YgZW50cnkuY29uc3RydWN0b3IgJiYgYiBpbnN0YW5jZW9mIGVudHJ5LmNvbnN0cnVjdG9yID8gZW50cnkuZXF1YWxpdHlDb21wYXJlcihhLCBiKSA6IHVuZGVmaW5lZDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBbUJBLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsbUNBQW1DO0FBQzVDLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsa0JBQWtCO0FBQzNCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUtBLElBQUssdUJBQUwsa0JBQUtBLDBCQUFMO0FBSUwsRUFBQUEsc0JBQUEsYUFBVTtBQUlWLEVBQUFBLHNCQUFBLFVBQU87QUFJUCxFQUFBQSxzQkFBQSxjQUFXO0FBWkQsU0FBQUE7QUFBQSxHQUFBO0FBeUhaLE1BQU0sZ0JBQWdCO0FBQ3RCLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sMEJBQXFFO0FBQUEsRUFDekUsNEJBQTRCLGFBQWEsc0JBQXNCO0FBQUEsRUFDL0QsNEJBQTRCLE1BQU0sZUFBZTtBQUFBLEVBQ2pELDRCQUE0QixRQUFRLGlCQUFpQjtBQUFBLEVBQ3JELDRCQUFtRCxLQUFLLGNBQWM7QUFBQSxFQUN0RSw0QkFBMEMsS0FBSyxjQUFjO0FBQy9EO0FBMEpBLE1BQU0sZ0JBQWdCO0FBQUEsRUFDSDtBQUFBLEVBQ0Es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
@@ -1,4 +1,5 @@
1
- /// <reference path="./library.d.mts" />
1
+ /// <reference path="./library-references.d.mts" />
2
+ /// <reference types="node" />
2
3
  /**
3
4
  * @file
4
5
  *