obsidian-dev-utils 67.0.0 → 68.0.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 (140) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/dev/main.js +487 -267
  3. package/dist/lib/cjs/async-events.cjs +178 -18
  4. package/dist/lib/cjs/async-events.d.cts +260 -9
  5. package/dist/lib/cjs/error.cjs +6 -7
  6. package/dist/lib/cjs/function.cjs +6 -2
  7. package/dist/lib/cjs/function.d.cts +6 -0
  8. package/dist/lib/cjs/library.cjs +1 -1
  9. package/dist/lib/cjs/object-utils.cjs +1 -1
  10. package/dist/lib/cjs/object-utils.d.cts +2 -0
  11. package/dist/lib/cjs/obsidian/active-file-provider.cjs +1 -1
  12. package/dist/lib/cjs/obsidian/active-file-provider.d.cts +0 -1
  13. package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.cjs +4 -4
  14. package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.d.cts +3 -3
  15. package/dist/lib/cjs/obsidian/components/abort-signal-component.cjs +3 -7
  16. package/dist/lib/cjs/obsidian/components/abort-signal-component.d.cts +2 -6
  17. package/dist/lib/cjs/obsidian/components/all-windows-event-component.cjs +3 -3
  18. package/dist/lib/cjs/obsidian/components/all-windows-event-component.d.cts +2 -2
  19. package/dist/lib/cjs/obsidian/components/async-error-handler-component.cjs +3 -7
  20. package/dist/lib/cjs/obsidian/components/async-error-handler-component.d.cts +2 -6
  21. package/dist/lib/cjs/obsidian/components/async-events-component.cjs +2 -20
  22. package/dist/lib/cjs/obsidian/components/async-events-component.d.cts +1 -18
  23. package/dist/lib/cjs/obsidian/components/component-ex.cjs +235 -0
  24. package/dist/lib/cjs/obsidian/components/component-ex.d.cts +55 -0
  25. package/dist/lib/cjs/obsidian/components/console-debug-component.cjs +3 -7
  26. package/dist/lib/cjs/obsidian/components/console-debug-component.d.cts +2 -6
  27. package/dist/lib/cjs/obsidian/components/disposable-component.cjs +1 -9
  28. package/dist/lib/cjs/obsidian/components/disposable-component.d.cts +0 -10
  29. package/dist/lib/cjs/obsidian/components/i18n-component.cjs +4 -8
  30. package/dist/lib/cjs/obsidian/components/i18n-component.d.cts +3 -7
  31. package/dist/lib/cjs/obsidian/components/index.cjs +9 -6
  32. package/dist/lib/cjs/obsidian/components/index.d.cts +2 -1
  33. package/dist/lib/cjs/obsidian/components/layout-ready-component.cjs +3 -3
  34. package/dist/lib/cjs/obsidian/components/layout-ready-component.d.cts +2 -2
  35. package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.cjs +3 -3
  36. package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.d.cts +2 -3
  37. package/dist/lib/cjs/obsidian/components/monkey-around-component.cjs +4 -4
  38. package/dist/lib/cjs/obsidian/components/monkey-around-component.d.cts +3 -3
  39. package/dist/lib/cjs/obsidian/components/plugin-context-component.cjs +3 -7
  40. package/dist/lib/cjs/obsidian/components/plugin-context-component.d.cts +2 -6
  41. package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +3 -7
  42. package/dist/lib/cjs/obsidian/components/plugin-notice-component.d.cts +2 -6
  43. package/dist/lib/cjs/obsidian/components/plugin-settings-component.cjs +53 -12
  44. package/dist/lib/cjs/obsidian/components/plugin-settings-component.d.cts +53 -18
  45. package/dist/lib/cjs/obsidian/components/plugin-settings-tab-component.cjs +3 -3
  46. package/dist/lib/cjs/obsidian/components/plugin-settings-tab-component.d.cts +2 -2
  47. package/dist/lib/cjs/obsidian/components/registry-component.cjs +180 -0
  48. package/dist/lib/cjs/obsidian/components/registry-component.d.cts +36 -0
  49. package/dist/lib/cjs/obsidian/markdown.cjs +2 -3
  50. package/dist/lib/cjs/obsidian/menu-event-registrar.cjs +1 -1
  51. package/dist/lib/cjs/obsidian/menu-event-registrar.d.cts +0 -1
  52. package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.cjs +21 -20
  53. package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.d.cts +7 -3
  54. package/dist/lib/cjs/obsidian/plugin/plugin.cjs +35 -76
  55. package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +35 -36
  56. package/dist/lib/cjs/obsidian/rename-delete-handler.cjs +1 -2
  57. package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.cjs +3 -1
  58. package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.d.cts +2 -0
  59. package/dist/lib/cjs/obsidian/setting-ex.cjs +3 -1
  60. package/dist/lib/cjs/obsidian/setting-ex.d.cts +2 -0
  61. package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +2 -1
  62. package/dist/lib/cjs/script-utils/linters/eslint-rules/index.cjs +4 -1
  63. package/dist/lib/cjs/script-utils/linters/eslint-rules/index.d.cts +1 -0
  64. package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +3 -1
  65. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.cjs +2 -2
  66. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.cjs +222 -0
  67. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.d.cts +4 -0
  68. package/dist/lib/esm/async-events.d.mts +260 -9
  69. package/dist/lib/esm/async-events.mjs +175 -17
  70. package/dist/lib/esm/error.mjs +6 -7
  71. package/dist/lib/esm/function.d.mts +6 -0
  72. package/dist/lib/esm/function.mjs +5 -2
  73. package/dist/lib/esm/library.mjs +1 -1
  74. package/dist/lib/esm/object-utils.d.mts +2 -0
  75. package/dist/lib/esm/object-utils.mjs +1 -1
  76. package/dist/lib/esm/obsidian/active-file-provider.d.mts +0 -1
  77. package/dist/lib/esm/obsidian/active-file-provider.mjs +1 -1
  78. package/dist/lib/esm/obsidian/command-handlers/command-handler-component.d.mts +3 -3
  79. package/dist/lib/esm/obsidian/command-handlers/command-handler-component.mjs +4 -4
  80. package/dist/lib/esm/obsidian/components/abort-signal-component.d.mts +2 -6
  81. package/dist/lib/esm/obsidian/components/abort-signal-component.mjs +3 -7
  82. package/dist/lib/esm/obsidian/components/all-windows-event-component.d.mts +2 -2
  83. package/dist/lib/esm/obsidian/components/all-windows-event-component.mjs +3 -3
  84. package/dist/lib/esm/obsidian/components/async-error-handler-component.d.mts +2 -6
  85. package/dist/lib/esm/obsidian/components/async-error-handler-component.mjs +3 -7
  86. package/dist/lib/esm/obsidian/components/async-events-component.d.mts +1 -18
  87. package/dist/lib/esm/obsidian/components/async-events-component.mjs +2 -19
  88. package/dist/lib/esm/obsidian/components/component-ex.d.mts +55 -0
  89. package/dist/lib/esm/obsidian/components/component-ex.mjs +130 -0
  90. package/dist/lib/esm/obsidian/components/console-debug-component.d.mts +2 -6
  91. package/dist/lib/esm/obsidian/components/console-debug-component.mjs +3 -7
  92. package/dist/lib/esm/obsidian/components/disposable-component.d.mts +0 -10
  93. package/dist/lib/esm/obsidian/components/disposable-component.mjs +1 -8
  94. package/dist/lib/esm/obsidian/components/i18n-component.d.mts +3 -7
  95. package/dist/lib/esm/obsidian/components/i18n-component.mjs +4 -8
  96. package/dist/lib/esm/obsidian/components/index.d.mts +2 -1
  97. package/dist/lib/esm/obsidian/components/index.mjs +6 -4
  98. package/dist/lib/esm/obsidian/components/layout-ready-component.d.mts +2 -2
  99. package/dist/lib/esm/obsidian/components/layout-ready-component.mjs +3 -3
  100. package/dist/lib/esm/obsidian/components/menu-event-registrar-component.d.mts +2 -3
  101. package/dist/lib/esm/obsidian/components/menu-event-registrar-component.mjs +3 -3
  102. package/dist/lib/esm/obsidian/components/monkey-around-component.d.mts +3 -3
  103. package/dist/lib/esm/obsidian/components/monkey-around-component.mjs +4 -4
  104. package/dist/lib/esm/obsidian/components/plugin-context-component.d.mts +2 -6
  105. package/dist/lib/esm/obsidian/components/plugin-context-component.mjs +3 -7
  106. package/dist/lib/esm/obsidian/components/plugin-notice-component.d.mts +2 -6
  107. package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +3 -7
  108. package/dist/lib/esm/obsidian/components/plugin-settings-component.d.mts +53 -18
  109. package/dist/lib/esm/obsidian/components/plugin-settings-component.mjs +53 -12
  110. package/dist/lib/esm/obsidian/components/plugin-settings-tab-component.d.mts +2 -2
  111. package/dist/lib/esm/obsidian/components/plugin-settings-tab-component.mjs +3 -3
  112. package/dist/lib/esm/obsidian/components/registry-component.d.mts +36 -0
  113. package/dist/lib/esm/obsidian/components/registry-component.mjs +72 -0
  114. package/dist/lib/esm/obsidian/markdown.mjs +2 -3
  115. package/dist/lib/esm/obsidian/menu-event-registrar.d.mts +0 -1
  116. package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.d.mts +7 -3
  117. package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.mjs +22 -21
  118. package/dist/lib/esm/obsidian/plugin/plugin.d.mts +35 -36
  119. package/dist/lib/esm/obsidian/plugin/plugin.mjs +35 -77
  120. package/dist/lib/esm/obsidian/rename-delete-handler.mjs +1 -2
  121. package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.d.mts +2 -0
  122. package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.mjs +3 -1
  123. package/dist/lib/esm/obsidian/setting-ex.d.mts +2 -0
  124. package/dist/lib/esm/obsidian/setting-ex.mjs +3 -1
  125. package/dist/lib/esm/script-utils/linters/eslint-config.mjs +2 -1
  126. package/dist/lib/esm/script-utils/linters/eslint-rules/index.d.mts +1 -0
  127. package/dist/lib/esm/script-utils/linters/eslint-rules/index.mjs +3 -1
  128. package/dist/lib/esm/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +3 -1
  129. package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.mjs +2 -2
  130. package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.d.mts +4 -0
  131. package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.mjs +112 -0
  132. package/obsidian/Components/component-ex/package.json +6 -0
  133. package/obsidian/Components/registry-component/package.json +6 -0
  134. package/package.json +21 -20
  135. package/script-utils/linters/eslint-rules/require-method-template/package.json +6 -0
  136. package/dist/lib/cjs/obsidian/components/async-component.cjs +0 -183
  137. package/dist/lib/cjs/obsidian/components/async-component.d.cts +0 -43
  138. package/dist/lib/esm/obsidian/components/async-component.d.mts +0 -43
  139. package/dist/lib/esm/obsidian/components/async-component.mjs +0 -73
  140. package/obsidian/Components/async-component/package.json +0 -6
@@ -125,15 +125,19 @@ var __copyProps = (to, from, except, desc) => {
125
125
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
126
126
  var async_events_exports = {};
127
127
  __export(async_events_exports, {
128
- AsyncEvents: () => AsyncEvents
128
+ AsyncEvents: () => AsyncEvents,
129
+ AsyncEventsBase: () => AsyncEventsBase,
130
+ mixinAsyncEvents: () => mixinAsyncEvents
129
131
  });
130
132
  module.exports = __toCommonJS(async_events_exports);
131
133
  var import_array = require('./array.cjs');
132
- class AsyncEvents {
134
+ class AsyncEventsBase {
133
135
  eventRefsMap = /* @__PURE__ */ new Map();
134
136
  /**
135
137
  * Remove an event listener.
136
138
  *
139
+ * @typeParam EventName - The name of the event.
140
+ * @typeParam Args - The types of the arguments the event callback accepts.
137
141
  * @param name - The name of the event.
138
142
  * @param callback - The callback to remove.
139
143
  *
@@ -142,6 +146,7 @@ class AsyncEvents {
142
146
  * events.off('my-event', myListener);
143
147
  * ```
144
148
  */
149
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
145
150
  off(name, callback) {
146
151
  const eventRefs = this.eventRefsMap.get(name);
147
152
  if (!eventRefs) {
@@ -175,6 +180,8 @@ class AsyncEvents {
175
180
  /**
176
181
  * Add an event listener.
177
182
  *
183
+ * @typeParam EventName - The name of the event.
184
+ * @typeParam Args - The types of the arguments the event callback accepts.
178
185
  * @param name - The name of the event.
179
186
  * @param callback - The callback to call when the event is triggered.
180
187
  * @param thisArg - The context passed as `this` to the `callback`.
@@ -188,6 +195,7 @@ class AsyncEvents {
188
195
  * });
189
196
  * ```
190
197
  */
198
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
191
199
  on(name, callback, thisArg) {
192
200
  let eventRefs = this.eventRefsMap.get(name);
193
201
  if (!eventRefs) {
@@ -195,7 +203,7 @@ class AsyncEvents {
195
203
  this.eventRefsMap.set(name, eventRefs);
196
204
  }
197
205
  const eventRef = {
198
- asyncEvents: this,
206
+ asyncEventSource: this,
199
207
  callback,
200
208
  name,
201
209
  thisArg
@@ -206,6 +214,8 @@ class AsyncEvents {
206
214
  /**
207
215
  * Add an event listener that will be triggered only once.
208
216
  *
217
+ * @typeParam EventName - The name of the event.
218
+ * @typeParam Args - The types of the arguments the event callback accepts.
209
219
  * @param name - The name of the event.
210
220
  * @param callback - The callback to call when the event is triggered.
211
221
  * @param thisArg - The context passed as `this` to the `callback`.
@@ -219,6 +229,7 @@ class AsyncEvents {
219
229
  * });
220
230
  * ```
221
231
  */
232
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
222
233
  once(name, callback, thisArg) {
223
234
  const originalEventRef = this.on(name, callback, thisArg);
224
235
  const cleanupEventRef = this.on(name, () => {
@@ -230,6 +241,7 @@ class AsyncEvents {
230
241
  /**
231
242
  * Trigger an event, executing all the listeners in order even if some of them throw an error.
232
243
  *
244
+ * @typeParam EventName - The name of the event.
233
245
  * @param name - The name of the event.
234
246
  * @param args - The data to pass to the event listeners.
235
247
  *
@@ -238,7 +250,6 @@ class AsyncEvents {
238
250
  * events.trigger('my-event', 'arg1', 'arg2');
239
251
  * ```
240
252
  */
241
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
242
253
  trigger(name, ...args) {
243
254
  const eventRefs = this.eventRefsMap.get(name) ?? [];
244
255
  for (const eventRef of eventRefs.slice()) {
@@ -248,10 +259,11 @@ class AsyncEvents {
248
259
  /**
249
260
  * Trigger an event asynchronously, executing all the listeners in order even if some of them throw an error.
250
261
  *
262
+ * @typeParam EventName - The name of the event.
251
263
  * @param name - The name of the event.
252
264
  * @param args - The data to pass to the event listeners.
265
+ * @returns A {@link Promise} that resolves when all listeners have completed.
253
266
  */
254
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
255
267
  async triggerAsync(name, ...args) {
256
268
  const eventRefs = this.eventRefsMap.get(name) ?? [];
257
269
  for (const eventRef of eventRefs.slice()) {
@@ -261,6 +273,7 @@ class AsyncEvents {
261
273
  /**
262
274
  * Try to trigger an event, executing all the listeners in order even if some of them throw an error.
263
275
  *
276
+ * @typeParam Args - The types of the arguments the function accepts.
264
277
  * @param eventRef - The event reference.
265
278
  * @param args - The data to pass to the event listeners.
266
279
  *
@@ -274,37 +287,184 @@ class AsyncEvents {
274
287
  try {
275
288
  const result = eventRef.callback.call(eventRef.thisArg, ...args);
276
289
  if (result instanceof Promise) {
277
- result.catch((e) => {
278
- window.setTimeout(() => {
279
- throw e;
280
- }, 0);
281
- });
290
+ result.catch(throwDelayed);
282
291
  }
283
292
  } catch (e) {
284
- window.setTimeout(() => {
285
- throw e;
286
- }, 0);
293
+ throwDelayed(e);
287
294
  }
288
295
  }
289
296
  /**
290
297
  * Try to trigger an event asynchronously, executing all the listeners in order even if some of them throw an error.
291
298
  *
299
+ * @typeParam Args - The types of the arguments the function accepts.
292
300
  * @param eventRef - The event reference.
293
301
  * @param args - The data to pass to the event listeners.
302
+ * @returns A {@link Promise} that resolves when all listeners have completed.
294
303
  */
295
304
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
296
305
  async tryTriggerAsync(eventRef, args) {
297
306
  try {
298
307
  await eventRef.callback.call(eventRef.thisArg, ...args);
299
308
  } catch (e) {
300
- window.setTimeout(() => {
301
- throw e;
302
- }, 0);
309
+ throwDelayed(e);
303
310
  }
304
311
  }
305
312
  }
313
+ class AsyncEvents extends AsyncEventsBase {
314
+ /**
315
+ * Trigger an event, executing all the listeners in order even if some of them throw an error.
316
+ *
317
+ * @typeParam EventName - The name of the event.
318
+ * @param name - The name of the event.
319
+ * @param args - The data to pass to the event listeners.
320
+ */
321
+ trigger(name, ...args) {
322
+ super.trigger(name, ...args);
323
+ }
324
+ /**
325
+ * Trigger an event asynchronously, executing all the listeners in order even if some of them throw an error.
326
+ *
327
+ * @typeParam EventName - The name of the event.
328
+ * @param name - The name of the event.
329
+ * @param args - The data to pass to the event listeners.
330
+ * @returns A {@link Promise} that resolves when all listeners have completed.
331
+ */
332
+ triggerAsync(name, ...args) {
333
+ return super.triggerAsync(name, ...args);
334
+ }
335
+ /**
336
+ * Try to trigger an event, executing all the listeners in order even if some of them throw an error.
337
+ *
338
+ * @typeParam Args - The types of the arguments the function accepts.
339
+ * @param eventRef - The event reference.
340
+ * @param args - The data to pass to the event listeners.
341
+ */
342
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
343
+ tryTrigger(eventRef, args) {
344
+ super.tryTrigger(eventRef, args);
345
+ }
346
+ /**
347
+ * Try to trigger an event asynchronously, executing all the listeners in order even if some of them throw an error.
348
+ *
349
+ * @typeParam Args - The types of the arguments the function accepts.
350
+ * @param eventRef - The event reference.
351
+ * @param args - The data to pass to the event listeners.
352
+ * @returns A {@link Promise} that resolves when all listeners have completed.
353
+ */
354
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
355
+ async tryTriggerAsync(eventRef, args) {
356
+ return super.tryTriggerAsync(eventRef, args);
357
+ }
358
+ }
359
+ function mixinAsyncEvents() {
360
+ return function inner(baseClass) {
361
+ class AsyncEventsMixin extends baseClass {
362
+ #asyncEvents = new AsyncEvents();
363
+ /**
364
+ * Remove an event listener.
365
+ *
366
+ * @typeParam EventName - The name of the event.
367
+ * @typeParam Args - The types of the arguments the event callback accepts.
368
+ * @param name - The name of the event.
369
+ * @param callback - The callback to remove.
370
+ */
371
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
372
+ off(name, callback) {
373
+ this.#asyncEvents.off(name, callback);
374
+ }
375
+ /**
376
+ * Remove an event listener by reference.
377
+ *
378
+ * @param eventRef - The event reference to remove.
379
+ */
380
+ offref(eventRef) {
381
+ this.#asyncEvents.offref(eventRef);
382
+ }
383
+ /**
384
+ * Add an event listener.
385
+ *
386
+ * @typeParam EventName - The name of the event.
387
+ * @typeParam Args - The types of the arguments the event callback accepts.
388
+ * @param name - The name of the event.
389
+ * @param callback - The callback to call when the event is triggered.
390
+ * @param thisArg - The context passed as `this` to the `callback`.
391
+ * @returns A reference to the event listener.
392
+ */
393
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
394
+ on(name, callback, thisArg) {
395
+ return this.#asyncEvents.on(name, callback, thisArg);
396
+ }
397
+ /**
398
+ * Add an event listener that will be called only once.
399
+ *
400
+ * @typeParam EventName - The name of the event.
401
+ * @typeParam Args - The types of the arguments the event callback accepts.
402
+ * @param name - The name of the event.
403
+ * @param callback - The callback to call when the event is triggered.
404
+ * @param thisArg - The context passed as `this` to the `callback`.
405
+ * @returns A reference to the event listener.
406
+ */
407
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
408
+ once(name, callback, thisArg) {
409
+ return this.#asyncEvents.once(name, callback, thisArg);
410
+ }
411
+ /**
412
+ * Trigger an event, executing all the listeners in order even if some of them throw an error.
413
+ *
414
+ * @typeParam EventName - The name of the event.
415
+ * @param name - The name of the event.
416
+ * @param args - The data to pass to the event listeners.
417
+ */
418
+ trigger(name, ...args) {
419
+ this.#asyncEvents.trigger(name, ...args);
420
+ }
421
+ /**
422
+ * Trigger an event asynchronously.
423
+ *
424
+ * @typeParam EventName - The name of the event.
425
+ * @param name - The name of the event.
426
+ * @param args - The data to pass to the event listeners.
427
+ * @returns A {@link Promise} that resolves when all listeners have completed.
428
+ */
429
+ async triggerAsync(name, ...args) {
430
+ await this.#asyncEvents.triggerAsync(name, ...args);
431
+ }
432
+ /**
433
+ * Try to trigger an event, executing all the listeners in order even if some of them throw an error.
434
+ *
435
+ * @typeParam Args - The types of the arguments the function accepts.
436
+ * @param eventRef - The event reference.
437
+ * @param args - The data to pass to the event listeners.
438
+ */
439
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- Parity with Obsidian's Events.tryTrigger.
440
+ tryTrigger(eventRef, args) {
441
+ this.#asyncEvents.tryTrigger(eventRef, args);
442
+ }
443
+ /**
444
+ * Try to trigger an event asynchronously, executing all the listeners in order even if some of them throw an error.
445
+ *
446
+ * @typeParam Args - The types of the arguments the function accepts.
447
+ * @param eventRef - The event reference.
448
+ * @param args - The data to pass to the event listeners.
449
+ * @returns A {@link Promise} that resolves when all listeners have completed.
450
+ */
451
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- Parity with Obsidian's Events.tryTrigger.
452
+ async tryTriggerAsync(eventRef, args) {
453
+ await this.#asyncEvents.tryTriggerAsync(eventRef, args);
454
+ }
455
+ }
456
+ return AsyncEventsMixin;
457
+ };
458
+ }
459
+ function throwDelayed(error) {
460
+ window.setTimeout(() => {
461
+ throw error;
462
+ }, 0);
463
+ }
306
464
  // Annotate the CommonJS export names for ESM import in node:
307
465
  0 && (module.exports = {
308
- AsyncEvents
466
+ AsyncEvents,
467
+ AsyncEventsBase,
468
+ mixinAsyncEvents
309
469
  });
310
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FzeW5jLWV2ZW50cy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEFzeW5jIGV2ZW50IGVtaXR0ZXIuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBHZW5lcmljUHJvbWlzYWJsZVZvaWRGdW5jdGlvbiB9IGZyb20gJy4vZnVuY3Rpb24udHMnO1xuXG5pbXBvcnQgeyBmaWx0ZXJJblBsYWNlIH0gZnJvbSAnLi9hcnJheS50cyc7XG5cbi8qKlxuICogQXN5bmMgZXZlbnQgcmVmZXJlbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jRXZlbnRSZWYge1xuICAvKipcbiAgICogQW4gZXZlbnQgZW1pdHRlci5cbiAgICovXG4gIGFzeW5jRXZlbnRzOiBBc3luY0V2ZW50cztcblxuICAvKipcbiAgICogQSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAgICovXG4gIGNhbGxiYWNrOiBHZW5lcmljQ2FsbGJhY2s7XG5cbiAgLyoqXG4gICAqIEEgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgY29udGV4dCBwYXNzZWQgYXMgYHRoaXNgIHRvIHRoZSBgY2FsbGJhY2tgLlxuICAgKi9cbiAgdGhpc0FyZzogdW5rbm93bjtcbn1cblxudHlwZSBHZW5lcmljQ2FsbGJhY2sgPSBHZW5lcmljUHJvbWlzYWJsZVZvaWRGdW5jdGlvbjx1bmtub3duW10+O1xuXG4vKipcbiAqIEFzeW5jIGV2ZW50IGVtaXR0ZXIgaW1wbGVtZW50YXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIEFzeW5jRXZlbnRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudFJlZnNNYXAgPSBuZXcgTWFwPHN0cmluZywgQXN5bmNFdmVudFJlZltdPigpO1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gcmVtb3ZlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMub2ZmKCdteS1ldmVudCcsIG15TGlzdGVuZXIpO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBvZmY8QXJncyBleHRlbmRzIHVua25vd25bXT4obmFtZTogc3RyaW5nLCBjYWxsYmFjazogR2VuZXJpY1Byb21pc2FibGVWb2lkRnVuY3Rpb248QXJncz4pOiB2b2lkIHtcbiAgICBjb25zdCBldmVudFJlZnMgPSB0aGlzLmV2ZW50UmVmc01hcC5nZXQobmFtZSk7XG4gICAgaWYgKCFldmVudFJlZnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmaWx0ZXJJblBsYWNlKGV2ZW50UmVmcywgKGV2ZW50UmVmKSA9PiBldmVudFJlZi5jYWxsYmFjayAhPT0gY2FsbGJhY2spO1xuICAgIGlmIChldmVudFJlZnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmV2ZW50UmVmc01hcC5kZWxldGUobmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lciBieSByZWZlcmVuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMub2ZmcmVmKG15UmVmKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgb2ZmcmVmKGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmKTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnRSZWZzID0gdGhpcy5ldmVudFJlZnNNYXAuZ2V0KGV2ZW50UmVmLm5hbWUpO1xuICAgIGlmICghZXZlbnRSZWZzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmlsdGVySW5QbGFjZShldmVudFJlZnMsIChzdG9yZWRFdmVudFJlZikgPT4gc3RvcmVkRXZlbnRSZWYgIT09IGV2ZW50UmVmKTtcbiAgICBpZiAoZXZlbnRSZWZzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5ldmVudFJlZnNNYXAuZGVsZXRlKGV2ZW50UmVmLm5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gICAqIEBwYXJhbSB0aGlzQXJnIC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMub24oJ215LWV2ZW50JywgYXN5bmMgKGFyZzEsIGFyZzIpID0+IHtcbiAgICogICAgIGF3YWl0IHNsZWVwKDEwMCk7XG4gICAqICAgICBjb25zb2xlLmxvZyhhcmcxLCBhcmcyKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIG9uPEFyZ3MgZXh0ZW5kcyB1bmtub3duW10+KG5hbWU6IHN0cmluZywgY2FsbGJhY2s6IEdlbmVyaWNQcm9taXNhYmxlVm9pZEZ1bmN0aW9uPEFyZ3M+LCB0aGlzQXJnPzogdW5rbm93bik6IEFzeW5jRXZlbnRSZWYge1xuICAgIGxldCBldmVudFJlZnMgPSB0aGlzLmV2ZW50UmVmc01hcC5nZXQobmFtZSk7XG4gICAgaWYgKCFldmVudFJlZnMpIHtcbiAgICAgIGV2ZW50UmVmcyA9IFtdO1xuICAgICAgdGhpcy5ldmVudFJlZnNNYXAuc2V0KG5hbWUsIGV2ZW50UmVmcyk7XG4gICAgfVxuXG4gICAgY29uc3QgZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYgPSB7XG4gICAgICBhc3luY0V2ZW50czogdGhpcyxcbiAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayBhcyBHZW5lcmljQ2FsbGJhY2ssXG4gICAgICBuYW1lLFxuICAgICAgdGhpc0FyZ1xuICAgIH07XG4gICAgZXZlbnRSZWZzLnB1c2goZXZlbnRSZWYpO1xuICAgIHJldHVybiBldmVudFJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCBvbmx5IG9uY2UuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gICAqIEBwYXJhbSB0aGlzQXJnIC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMub25jZSgnbXktZXZlbnQnLCBhc3luYyAoYXJnMSwgYXJnMikgPT4ge1xuICAgKiAgICAgYXdhaXQgc2xlZXAoMTAwKTtcbiAgICogICAgIGNvbnNvbGUubG9nKGFyZzEsIGFyZzIpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgb25jZTxBcmdzIGV4dGVuZHMgdW5rbm93bltdPihuYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBHZW5lcmljUHJvbWlzYWJsZVZvaWRGdW5jdGlvbjxBcmdzPiwgdGhpc0FyZz86IHVua25vd24pOiBBc3luY0V2ZW50UmVmIHtcbiAgICBjb25zdCBvcmlnaW5hbEV2ZW50UmVmID0gdGhpcy5vbihuYW1lLCBjYWxsYmFjaywgdGhpc0FyZyk7XG4gICAgY29uc3QgY2xlYW51cEV2ZW50UmVmID0gdGhpcy5vbihuYW1lLCAoKSA9PiB7XG4gICAgICB0aGlzLm9mZnJlZihvcmlnaW5hbEV2ZW50UmVmKTtcbiAgICAgIHRoaXMub2ZmcmVmKGNsZWFudXBFdmVudFJlZik7XG4gICAgfSk7XG4gICAgcmV0dXJuIG9yaWdpbmFsRXZlbnRSZWY7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBhbiBldmVudCwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGFyZ3MgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy50cmlnZ2VyKCdteS1ldmVudCcsICdhcmcxJywgJ2FyZzInKTtcbiAgICogYGBgXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgcHVibGljIHRyaWdnZXI8QXJncyBleHRlbmRzIHVua25vd25bXT4obmFtZTogc3RyaW5nLCAuLi5hcmdzOiBBcmdzKTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnRSZWZzID0gdGhpcy5ldmVudFJlZnNNYXAuZ2V0KG5hbWUpID8/IFtdO1xuICAgIGZvciAoY29uc3QgZXZlbnRSZWYgb2YgZXZlbnRSZWZzLnNsaWNlKCkpIHtcbiAgICAgIHRoaXMudHJ5VHJpZ2dlcihldmVudFJlZiwgYXJncyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgYW4gZXZlbnQgYXN5bmNocm9ub3VzbHksIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBhcmdzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHB1YmxpYyBhc3luYyB0cmlnZ2VyQXN5bmM8QXJncyBleHRlbmRzIHVua25vd25bXT4obmFtZTogc3RyaW5nLCAuLi5hcmdzOiBBcmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXZlbnRSZWZzID0gdGhpcy5ldmVudFJlZnNNYXAuZ2V0KG5hbWUpID8/IFtdO1xuICAgIGZvciAoY29uc3QgZXZlbnRSZWYgb2YgZXZlbnRSZWZzLnNsaWNlKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMudHJ5VHJpZ2dlckFzeW5jKGV2ZW50UmVmLCBhcmdzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIHRyaWdnZXIgYW4gZXZlbnQsIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIGV2ZW50IHJlZmVyZW5jZS5cbiAgICogQHBhcmFtIGFyZ3MgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy50cnlUcmlnZ2VyKG15UmVmLCBbJ2FyZzEnLCAnYXJnMiddKTtcbiAgICogYGBgXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgcHVibGljIHRyeVRyaWdnZXI8QXJncyBleHRlbmRzIHVua25vd25bXT4oZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYsIGFyZ3M6IEFyZ3MpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gZXZlbnRSZWYuY2FsbGJhY2suY2FsbChldmVudFJlZi50aGlzQXJnLCAuLi5hcmdzKTtcbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIHJlc3VsdC5jYXRjaCgoZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcnkgdG8gdHJpZ2dlciBhbiBldmVudCBhc3luY2hyb25vdXNseSwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRSZWYgLSBUaGUgZXZlbnQgcmVmZXJlbmNlLlxuICAgKiBAcGFyYW0gYXJncyAtIFRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICBwdWJsaWMgYXN5bmMgdHJ5VHJpZ2dlckFzeW5jPEFyZ3MgZXh0ZW5kcyB1bmtub3duW10+KGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmLCBhcmdzOiBBcmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV2ZW50UmVmLmNhbGxiYWNrLmNhbGwoZXZlbnRSZWYudGhpc0FyZywgLi4uYXJncyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFRQSxtQkFBOEI7QUFnQ3ZCLE1BQU0sWUFBWTtBQUFBLEVBQ04sZUFBZSxvQkFBSSxJQUE2QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWExRCxJQUE0QixNQUFjLFVBQXFEO0FBQ3BHLFVBQU0sWUFBWSxLQUFLLGFBQWEsSUFBSSxJQUFJO0FBQzVDLFFBQUksQ0FBQyxXQUFXO0FBQ2Q7QUFBQSxJQUNGO0FBRUEsb0NBQWMsV0FBVyxDQUFDLGFBQWEsU0FBUyxhQUFhLFFBQVE7QUFDckUsUUFBSSxVQUFVLFdBQVcsR0FBRztBQUMxQixXQUFL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
470
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FzeW5jLWV2ZW50cy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEFzeW5jIGV2ZW50IGVtaXR0ZXIuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBYnN0cmFjdENvbnN0cnVjdG9yLFxuICBQcm9taXNhYmxlXG59IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgR2VuZXJpY1Byb21pc2FibGVWb2lkRnVuY3Rpb24gfSBmcm9tICcuL2Z1bmN0aW9uLnRzJztcbmltcG9ydCB0eXBlIHsgU3RyaW5nS2V5cyB9IGZyb20gJy4vdHlwZS50cyc7XG5cbmltcG9ydCB7IGZpbHRlckluUGxhY2UgfSBmcm9tICcuL2FycmF5LnRzJztcblxuLyoqXG4gKiBBc3luYyBldmVudCByZWZlcmVuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNFdmVudFJlZiB7XG4gIC8qKlxuICAgKiBBbiBldmVudCBzb3VyY2UuXG4gICAqL1xuICBhc3luY0V2ZW50U291cmNlOiBHZW5lcmljQXN5bmNFdmVudFNvdXJjZTtcblxuICAvKipcbiAgICogQSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAgICovXG4gIGNhbGxiYWNrOiBHZW5lcmljQ2FsbGJhY2s7XG5cbiAgLyoqXG4gICAqIEEgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgY29udGV4dCBwYXNzZWQgYXMgYHRoaXNgIHRvIHRoZSBgY2FsbGJhY2tgLlxuICAgKi9cbiAgdGhpc0FyZzogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBBc3luYyBldmVudCBlbWl0dGVyIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gRXZlbnRNYXAgLSBNYXBzIGV2ZW50IG5hbWVzIHRvIHRoZWlyIGFyZ3VtZW50IHR1cGxlcy5cbiAqIFdoZW4gb21pdHRlZCwgdGhlIGVtaXR0ZXIgYWNjZXB0cyBhbnkgc3RyaW5nIGV2ZW50IG5hbWUgd2l0aCBhbnkgYXJndW1lbnRzLlxuICogV2hlbiBwcm92aWRlZCwgbWV0aG9kcyBlbmZvcmNlIGNvcnJlY3QgZXZlbnQgbmFtZXMgYW5kIGFyZ3VtZW50IHR5cGVzXG4gKiB3aXRoIGZ1bGwgYXV0b2NvbXBsZXRlLiBXb3JrcyB3aXRoIGJvdGggYHR5cGVgIGFsaWFzZXMgYW5kIGBpbnRlcmZhY2VgIGRlY2xhcmF0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIFVudHlwZWQgKGRlZmF1bHQpIFx1MjAxNCBhbnkgZXZlbnQgbmFtZSwgYW55IGFyZ3M6XG4gKiBjb25zdCBldmVudHMgPSBuZXcgQXN5bmNFdmVudHMoKTtcbiAqIGV2ZW50cy5vbignbXktZXZlbnQnLCAoYXJnMTogc3RyaW5nKSA9PiB7IC4uLiB9KTtcbiAqXG4gKiAvLyBUeXBlZCBcdTIwMTQgb25seSBkZWNsYXJlZCBldmVudHMgd2l0aCBjb3JyZWN0IGFyZ3M6XG4gKiBpbnRlcmZhY2UgTXlFdmVudE1hcCB7XG4gKiAgIHNhdmU6IFtkYXRhOiBzdHJpbmddO1xuICogICBsb2FkOiBbaWQ6IG51bWJlciwgZm9yY2U6IGJvb2xlYW5dO1xuICogfVxuICogY29uc3QgZXZlbnRzID0gbmV3IEFzeW5jRXZlbnRzPE15RXZlbnRNYXA+KCk7XG4gKiBldmVudHMub24oJ3NhdmUnLCAoZGF0YSkgPT4geyAuLi4gfSk7ICAgLy8gZGF0YTogc3RyaW5nIFx1MjAxNCBhdXRvY29tcGxldGUgb24gZXZlbnQgbmFtZVxuICogZXZlbnRzLm9uKCdsb2FkJywgKGlkLCBmb3JjZSkgPT4geyAuLi4gfSk7IC8vIGlkOiBudW1iZXIsIGZvcmNlOiBib29sZWFuXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3luY0V2ZW50U291cmNlPEV2ZW50TWFwIGV4dGVuZHMgRXZlbnRNYXBDb25zdHJhaW50PEV2ZW50TWFwPiA9IEV2ZW50TWFwQmFzZT4gZXh0ZW5kcyBHZW5lcmljQXN5bmNFdmVudFNvdXJjZSB7XG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3MgLSBUaGUgYXJndW1lbnRzIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byByZW1vdmUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy5vZmYoJ215LWV2ZW50JywgbXlMaXN0ZW5lcik7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIG9mZjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPiwgQXJncyBleHRlbmRzIENhbGxiYWNrQXJnczxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgbmFtZTogRXZlbnROYW1lLFxuICAgIGNhbGxiYWNrOiAoLi4uYXJnczogQXJncykgPT4gUHJvbWlzYWJsZTx2b2lkPlxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3MgLSBUaGUgYXJndW1lbnRzIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAgICogQHBhcmFtIHRoaXNBcmcgLSBUaGUgY29udGV4dCBwYXNzZWQgYXMgYHRoaXNgIHRvIHRoZSBgY2FsbGJhY2tgLlxuICAgKiBAcmV0dXJucyBBIHJlZmVyZW5jZSB0byB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy5vbignbXktZXZlbnQnLCBhc3luYyAoYXJnMSwgYXJnMikgPT4ge1xuICAgKiAgICAgYXdhaXQgc2xlZXAoMTAwKTtcbiAgICogICAgIGNvbnNvbGUubG9nKGFyZzEsIGFyZzIpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgb248RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4sIEFyZ3MgZXh0ZW5kcyBDYWxsYmFja0FyZ3M8RXZlbnRNYXAsIEV2ZW50TmFtZT4+KFxuICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICBjYWxsYmFjazogKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2FibGU8dm9pZD4sXG4gICAgdGhpc0FyZz86IHVua25vd25cbiAgKTogQXN5bmNFdmVudFJlZjtcblxuICAvKipcbiAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgb25seSBvbmNlLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAgICogQHBhcmFtIHRoaXNBcmcgLSBUaGUgY29udGV4dCBwYXNzZWQgYXMgYHRoaXNgIHRvIHRoZSBgY2FsbGJhY2tgLlxuICAgKiBAcmV0dXJucyBBIHJlZmVyZW5jZSB0byB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy5vbmNlKCdteS1ldmVudCcsIGFzeW5jIChhcmcxLCBhcmcyKSA9PiB7XG4gICAqICAgICBhd2FpdCBzbGVlcCgxMDApO1xuICAgKiAgICAgY29uc29sZS5sb2coYXJnMSwgYXJnMik7XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICBvbmNlPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmdzIGV4dGVuZHMgQ2FsbGJhY2tBcmdzPEV2ZW50TWFwLCBFdmVudE5hbWU+PihcbiAgICBuYW1lOiBFdmVudE5hbWUsXG4gICAgY2FsbGJhY2s6ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+LFxuICAgIHRoaXNBcmc/OiB1bmtub3duXG4gICk6IEFzeW5jRXZlbnRSZWY7XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGV4cG9zaW5nIGV2ZW50LXRyaWdnZXJpbmcgbWV0aG9kcyBmb3Igc3ViY2xhc3NlcyBvZiBtaXhpbi1jcmVhdGVkIGNsYXNzZXMuXG4gKlxuICogVGhlc2UgbWV0aG9kcyBhcmUgYHByb3RlY3RlZGAgYXQgcnVudGltZSBidXQgc3VyZmFjZWQgaW4gdGhlIGRlY2xhcmF0aW9uIHR5cGVcbiAqIGJlY2F1c2UgVHlwZVNjcmlwdCBjYW5ub3QgcmVwcmVzZW50IGBwcm90ZWN0ZWRgIGluIGFub255bW91cy1jbGFzcyByZXR1cm4gdHlwZXMuXG4gKlxuICogQHR5cGVQYXJhbSBFdmVudE1hcCAtIE1hcHMgZXZlbnQgbmFtZXMgdG8gdGhlaXIgYXJndW1lbnQgdHVwbGVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jRXZlbnRUcmlnZ2VyPEV2ZW50TWFwIGV4dGVuZHMgRXZlbnRNYXBDb25zdHJhaW50PEV2ZW50TWFwPiA9IEV2ZW50TWFwQmFzZT4ge1xuICAvKipcbiAgICogVHJpZ2dlciBhbiBldmVudCwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBhcmdzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKi9cbiAgdHJpZ2dlcjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPj4obmFtZTogRXZlbnROYW1lLCAuLi5hcmdzOiBDYWxsYmFja0FyZ3M8RXZlbnRNYXAsIEV2ZW50TmFtZT4pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFuIGV2ZW50IGFzeW5jaHJvbm91c2x5LlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBhcmdzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICovXG4gIHRyaWdnZXJBc3luYzxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPj4obmFtZTogRXZlbnROYW1lLCAuLi5hcmdzOiBDYWxsYmFja0FyZ3M8RXZlbnRNYXAsIEV2ZW50TmFtZT4pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUcnkgdG8gdHJpZ2dlciBhbiBldmVudCwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEFyZ3MgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZnVuY3Rpb24gYWNjZXB0cy5cbiAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIGV2ZW50IHJlZmVyZW5jZS5cbiAgICogQHBhcmFtIGFyZ3MgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgdHJ5VHJpZ2dlcjxBcmdzIGV4dGVuZHMgdW5rbm93bltdPihldmVudFJlZjogQXN5bmNFdmVudFJlZiwgYXJnczogQXJncyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50IGFzeW5jaHJvbm91c2x5LlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEFyZ3MgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZnVuY3Rpb24gYWNjZXB0cy5cbiAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIGV2ZW50IHJlZmVyZW5jZS5cbiAgICogQHBhcmFtIGFyZ3MgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbGlzdGVuZXJzIGhhdmUgY29tcGxldGVkLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHRyeVRyaWdnZXJBc3luYzxBcmdzIGV4dGVuZHMgdW5rbm93bltdPihldmVudFJlZjogQXN5bmNFdmVudFJlZiwgYXJnczogQXJncyk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgY2FsbGJhY2sgYXJndW1lbnQgdHlwZXMgZm9yIGFuIGV2ZW50LlxuICpcbiAqIC0gV2hlbiBgRXZlbnRNYXBgIGhhcyBhbiBpbmRleCBzaWduYXR1cmUgKHVudHlwZWQgZGVmYXVsdCk6IHJldHVybnMgYHVua25vd25bXWAsXG4gKiAgIGFsbG93aW5nIGBBcmdzYCB0byBiZSBpbmZlcnJlZCBmcmVlbHkgZnJvbSB0aGUgY2FsbGJhY2suXG4gKiAtIFdoZW4gYEV2ZW50TWFwYCBoYXMgZXhwbGljaXQga2V5cyBvbmx5ICh0eXBlZCBtYXApOiByZXR1cm5zIGBFdmVudE1hcFtFdmVudE5hbWVdYCxcbiAqICAgZW5mb3JjaW5nIHRoZSBkZWNsYXJlZCBhcmd1bWVudCB0eXBlcyBhbmQgZW5hYmxpbmcgYXV0b2NvbXBsZXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRXZlbnRNYXAgLSBNYXBzIGV2ZW50IG5hbWVzIHRvIHRoZWlyIGFyZ3VtZW50IHR1cGxlcy5cbiAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICovXG5leHBvcnQgdHlwZSBDYWxsYmFja0FyZ3M8RXZlbnRNYXAsIEV2ZW50TmFtZSBleHRlbmRzIHN0cmluZz4gPSBzdHJpbmcgZXh0ZW5kcyBrZXlvZiBFdmVudE1hcCA/IHVua25vd25bXVxuICA6IChFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBFdmVudE1hcCA/IEV2ZW50TWFwW0V2ZW50TmFtZV0gOiB1bmtub3duW10pO1xuXG4vKipcbiAqIEJhc2UgZXZlbnQgbWFwIHR5cGUgZm9yIHVudHlwZWQgZW1pdHRlcnMuXG4gKi9cbmV4cG9ydCB0eXBlIEV2ZW50TWFwQmFzZSA9IFJlY29yZDxzdHJpbmcsIHVua25vd25bXT47XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBldmVudCBzb3VyY2UsIHVzZWQgYnkge0BsaW5rIEFzeW5jRXZlbnRSZWZ9XG4gKiBzbyB0aGF0IHJlZnMgY2FuIGJlIHN0b3JlZCByZWdhcmRsZXNzIG9mIHRoZSBlbWl0dGVyJ3MgYEV2ZW50TWFwYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmljQXN5bmNFdmVudFNvdXJjZSB7XG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIgYnkgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRSZWYgLSBUaGUgcmVmZXJlbmNlIHRvIHJlbW92ZS5cbiAgICovXG4gIG9mZnJlZihldmVudFJlZjogQXN5bmNFdmVudFJlZik6IHZvaWQ7XG59XG5cbnR5cGUgRXZlbnRNYXBDb25zdHJhaW50PFQ+ID0gUmVjb3JkPGtleW9mIFQsIHVua25vd25bXT47XG5cbnR5cGUgR2VuZXJpY0NhbGxiYWNrID0gR2VuZXJpY1Byb21pc2FibGVWb2lkRnVuY3Rpb248dW5rbm93bltdPjtcblxuLyoqXG4gKiBBc3luYyBldmVudCBzb3VyY2UgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHR5cGVQYXJhbSBFdmVudE1hcCAtIE1hcHMgZXZlbnQgbmFtZXMgdG8gdGhlaXIgYXJndW1lbnQgdHVwbGVzLlxuICogV2hlbiBvbWl0dGVkLCB0aGUgZW1pdHRlciBhY2NlcHRzIGFueSBzdHJpbmcgZXZlbnQgbmFtZSB3aXRoIGFueSBhcmd1bWVudHMuXG4gKiBXaGVuIHByb3ZpZGVkLCBtZXRob2RzIGVuZm9yY2UgY29ycmVjdCBldmVudCBuYW1lcyBhbmQgYXJndW1lbnQgdHlwZXNcbiAqIHdpdGggZnVsbCBhdXRvY29tcGxldGUuIFdvcmtzIHdpdGggYm90aCBgdHlwZWAgYWxpYXNlcyBhbmQgYGludGVyZmFjZWAgZGVjbGFyYXRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gVW50eXBlZCAoZGVmYXVsdCkgXHUyMDE0IGFueSBldmVudCBuYW1lLCBhbnkgYXJnczpcbiAqIGNvbnN0IGV2ZW50cyA9IG5ldyBBc3luY0V2ZW50cygpO1xuICogZXZlbnRzLm9uKCdteS1ldmVudCcsIChhcmcxOiBzdHJpbmcpID0+IHsgLi4uIH0pO1xuICpcbiAqIC8vIFR5cGVkIFx1MjAxNCBvbmx5IGRlY2xhcmVkIGV2ZW50cyB3aXRoIGNvcnJlY3QgYXJnczpcbiAqIGludGVyZmFjZSBNeUV2ZW50TWFwIHtcbiAqICAgc2F2ZTogW2RhdGE6IHN0cmluZ107XG4gKiAgIGxvYWQ6IFtpZDogbnVtYmVyLCBmb3JjZTogYm9vbGVhbl07XG4gKiB9XG4gKiBjb25zdCBldmVudHMgPSBuZXcgQXN5bmNFdmVudHM8TXlFdmVudE1hcD4oKTtcbiAqIGV2ZW50cy5vbignc2F2ZScsIChkYXRhKSA9PiB7IC4uLiB9KTsgICAvLyBkYXRhOiBzdHJpbmcgXHUyMDE0IGF1dG9jb21wbGV0ZSBvbiBldmVudCBuYW1lXG4gKiBldmVudHMub24oJ2xvYWQnLCAoaWQsIGZvcmNlKSA9PiB7IC4uLiB9KTsgLy8gaWQ6IG51bWJlciwgZm9yY2U6IGJvb2xlYW5cbiAqIGBgYFxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXN5bmNFdmVudHNCYXNlPEV2ZW50TWFwIGV4dGVuZHMgRXZlbnRNYXBDb25zdHJhaW50PEV2ZW50TWFwPiA9IEV2ZW50TWFwQmFzZT4gaW1wbGVtZW50cyBBc3luY0V2ZW50U291cmNlPEV2ZW50TWFwPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRSZWZzTWFwID0gbmV3IE1hcDxzdHJpbmcsIEFzeW5jRXZlbnRSZWZbXT4oKTtcblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHR5cGVQYXJhbSBBcmdzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGV2ZW50IGNhbGxiYWNrIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gcmVtb3ZlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMub2ZmKCdteS1ldmVudCcsIG15TGlzdGVuZXIpO1xuICAgKiBgYGBcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICBwdWJsaWMgb2ZmPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmdzIGV4dGVuZHMgQ2FsbGJhY2tBcmdzPEV2ZW50TWFwLCBFdmVudE5hbWU+PihcbiAgICBuYW1lOiBFdmVudE5hbWUsXG4gICAgY2FsbGJhY2s6ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGV2ZW50UmVmcyA9IHRoaXMuZXZlbnRSZWZzTWFwLmdldChuYW1lKTtcbiAgICBpZiAoIWV2ZW50UmVmcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZpbHRlckluUGxhY2UoZXZlbnRSZWZzLCAoZXZlbnRSZWYpID0+IGV2ZW50UmVmLmNhbGxiYWNrICE9PSBjYWxsYmFjayk7XG4gICAgaWYgKGV2ZW50UmVmcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZXZlbnRSZWZzTWFwLmRlbGV0ZShuYW1lKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyIGJ5IHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIHJlZmVyZW5jZSB0byB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy5vZmZyZWYobXlSZWYpO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBvZmZyZWYoZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYpOiB2b2lkIHtcbiAgICBjb25zdCBldmVudFJlZnMgPSB0aGlzLmV2ZW50UmVmc01hcC5nZXQoZXZlbnRSZWYubmFtZSk7XG4gICAgaWYgKCFldmVudFJlZnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmaWx0ZXJJblBsYWNlKGV2ZW50UmVmcywgKHN0b3JlZEV2ZW50UmVmKSA9PiBzdG9yZWRFdmVudFJlZiAhPT0gZXZlbnRSZWYpO1xuICAgIGlmIChldmVudFJlZnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmV2ZW50UmVmc01hcC5kZWxldGUoZXZlbnRSZWYubmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEB0eXBlUGFyYW0gQXJncyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgKiBAcGFyYW0gdGhpc0FyZyAtIFRoZSBjb250ZXh0IHBhc3NlZCBhcyBgdGhpc2AgdG8gdGhlIGBjYWxsYmFja2AuXG4gICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogZXZlbnRzLm9uKCdteS1ldmVudCcsIGFzeW5jIChhcmcxLCBhcmcyKSA9PiB7XG4gICAqICAgICBhd2FpdCBzbGVlcCgxMDApO1xuICAgKiAgICAgY29uc29sZS5sb2coYXJnMSwgYXJnMik7XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICBwdWJsaWMgb248RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4sIEFyZ3MgZXh0ZW5kcyBDYWxsYmFja0FyZ3M8RXZlbnRNYXAsIEV2ZW50TmFtZT4+KFxuICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICBjYWxsYmFjazogKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2FibGU8dm9pZD4sXG4gICAgdGhpc0FyZz86IHVua25vd25cbiAgKTogQXN5bmNFdmVudFJlZiB7XG4gICAgbGV0IGV2ZW50UmVmcyA9IHRoaXMuZXZlbnRSZWZzTWFwLmdldChuYW1lKTtcbiAgICBpZiAoIWV2ZW50UmVmcykge1xuICAgICAgZXZlbnRSZWZzID0gW107XG4gICAgICB0aGlzLmV2ZW50UmVmc01hcC5zZXQobmFtZSwgZXZlbnRSZWZzKTtcbiAgICB9XG5cbiAgICBjb25zdCBldmVudFJlZjogQXN5bmNFdmVudFJlZiA9IHtcbiAgICAgIGFzeW5jRXZlbnRTb3VyY2U6IHRoaXMsXG4gICAgICBjYWxsYmFjazogY2FsbGJhY2sgYXMgR2VuZXJpY0NhbGxiYWNrLFxuICAgICAgbmFtZSxcbiAgICAgIHRoaXNBcmdcbiAgICB9O1xuICAgIGV2ZW50UmVmcy5wdXNoKGV2ZW50UmVmKTtcbiAgICByZXR1cm4gZXZlbnRSZWY7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgb25seSBvbmNlLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHR5cGVQYXJhbSBBcmdzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGV2ZW50IGNhbGxiYWNrIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gICAqIEBwYXJhbSB0aGlzQXJnIC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMub25jZSgnbXktZXZlbnQnLCBhc3luYyAoYXJnMSwgYXJnMikgPT4ge1xuICAgKiAgICAgYXdhaXQgc2xlZXAoMTAwKTtcbiAgICogICAgIGNvbnNvbGUubG9nKGFyZzEsIGFyZzIpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgcHVibGljIG9uY2U8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4sIEFyZ3MgZXh0ZW5kcyBDYWxsYmFja0FyZ3M8RXZlbnRNYXAsIEV2ZW50TmFtZT4+KFxuICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICBjYWxsYmFjazogKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2FibGU8dm9pZD4sXG4gICAgdGhpc0FyZz86IHVua25vd25cbiAgKTogQXN5bmNFdmVudFJlZiB7XG4gICAgY29uc3Qgb3JpZ2luYWxFdmVudFJlZiA9IHRoaXMub24obmFtZSwgY2FsbGJhY2ssIHRoaXNBcmcpO1xuICAgIGNvbnN0IGNsZWFudXBFdmVudFJlZiA9IHRoaXMub24obmFtZSwgKCkgPT4ge1xuICAgICAgdGhpcy5vZmZyZWYob3JpZ2luYWxFdmVudFJlZik7XG4gICAgICB0aGlzLm9mZnJlZihjbGVhbnVwRXZlbnRSZWYpO1xuICAgIH0pO1xuICAgIHJldHVybiBvcmlnaW5hbEV2ZW50UmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgYW4gZXZlbnQsIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gYXJncyAtIFRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogZXZlbnRzLnRyaWdnZXIoJ215LWV2ZW50JywgJ2FyZzEnLCAnYXJnMicpO1xuICAgKiBgYGBcbiAgICovXG4gIHByb3RlY3RlZCB0cmlnZ2VyPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+PihuYW1lOiBFdmVudE5hbWUsIC4uLmFyZ3M6IENhbGxiYWNrQXJnczxFdmVudE1hcCwgRXZlbnROYW1lPik6IHZvaWQge1xuICAgIGNvbnN0IGV2ZW50UmVmcyA9IHRoaXMuZXZlbnRSZWZzTWFwLmdldChuYW1lKSA/PyBbXTtcbiAgICBmb3IgKGNvbnN0IGV2ZW50UmVmIG9mIGV2ZW50UmVmcy5zbGljZSgpKSB7XG4gICAgICB0aGlzLnRyeVRyaWdnZXIoZXZlbnRSZWYsIGFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFuIGV2ZW50IGFzeW5jaHJvbm91c2x5LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGFyZ3MgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbGlzdGVuZXJzIGhhdmUgY29tcGxldGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHRyaWdnZXJBc3luYzxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPj4obmFtZTogRXZlbnROYW1lLCAuLi5hcmdzOiBDYWxsYmFja0FyZ3M8RXZlbnRNYXAsIEV2ZW50TmFtZT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBldmVudFJlZnMgPSB0aGlzLmV2ZW50UmVmc01hcC5nZXQobmFtZSkgPz8gW107XG4gICAgZm9yIChjb25zdCBldmVudFJlZiBvZiBldmVudFJlZnMuc2xpY2UoKSkge1xuICAgICAgYXdhaXQgdGhpcy50cnlUcmlnZ2VyQXN5bmMoZXZlbnRSZWYsIGFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcnkgdG8gdHJpZ2dlciBhbiBldmVudCwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEFyZ3MgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZnVuY3Rpb24gYWNjZXB0cy5cbiAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIGV2ZW50IHJlZmVyZW5jZS5cbiAgICogQHBhcmFtIGFyZ3MgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy50cnlUcmlnZ2VyKG15UmVmLCBbJ2FyZzEnLCAnYXJnMiddKTtcbiAgICogYGBgXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgcHJvdGVjdGVkIHRyeVRyaWdnZXI8QXJncyBleHRlbmRzIHVua25vd25bXT4oZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYsIGFyZ3M6IEFyZ3MpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gZXZlbnRSZWYuY2FsbGJhY2suY2FsbChldmVudFJlZi50aGlzQXJnLCAuLi5hcmdzKTtcbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIHJlc3VsdC5jYXRjaCh0aHJvd0RlbGF5ZWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93RGVsYXllZChlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIHRyaWdnZXIgYW4gZXZlbnQgYXN5bmNocm9ub3VzbHksIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBBcmdzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSBhcmdzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICBwcm90ZWN0ZWQgYXN5bmMgdHJ5VHJpZ2dlckFzeW5jPEFyZ3MgZXh0ZW5kcyB1bmtub3duW10+KGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmLCBhcmdzOiBBcmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV2ZW50UmVmLmNhbGxiYWNrLmNhbGwoZXZlbnRSZWYudGhpc0FyZywgLi4uYXJncyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3dEZWxheWVkKGUpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBleHRlbmRzIHtAbGluayBBc3luY0V2ZW50c0Jhc2V9IGFuZCBwcm92aWRlcyBwdWJsaWMgbWV0aG9kcyBmb3IgdHJpZ2dlcmluZyBldmVudHMuXG4gKlxuICogVGhpcyBjbGFzcyBleGlzdHMgYXMgcGFyaXR5IHdpdGgge0BsaW5rIG9ic2lkaWFuI0V2ZW50c30uIEJ1dCBleHBvc2luZyBwdWJsaWNseSBgdHJpZ2dlcigpYCBtZXRob2RzIHZpb2xhdGVzIGVuY2Fwc3VsYXRpb24uXG4gKlxuICogQXZvaWQgdXNpbmcgaXQgaW4gZmF2b3Igb2Yge0BsaW5rIEFzeW5jRXZlbnRzQmFzZX0uXG4gKlxuICogQHR5cGVQYXJhbSBFdmVudE1hcCAtIFRoZSB0eXBlIG9mIHRoZSBldmVudCBtYXAuXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3luY0V2ZW50czxFdmVudE1hcCBleHRlbmRzIEV2ZW50TWFwQ29uc3RyYWludDxFdmVudE1hcD4gPSBFdmVudE1hcEJhc2U+IGV4dGVuZHMgQXN5bmNFdmVudHNCYXNlPEV2ZW50TWFwPiB7XG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGFyZ3MgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgdHJpZ2dlcjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPj4obmFtZTogRXZlbnROYW1lLCAuLi5hcmdzOiBDYWxsYmFja0FyZ3M8RXZlbnRNYXAsIEV2ZW50TmFtZT4pOiB2b2lkIHtcbiAgICBzdXBlci50cmlnZ2VyKG5hbWUsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgYW4gZXZlbnQgYXN5bmNocm9ub3VzbHksIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gYXJncyAtIFRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBsaXN0ZW5lcnMgaGF2ZSBjb21wbGV0ZWQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgdHJpZ2dlckFzeW5jPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+PihuYW1lOiBFdmVudE5hbWUsIC4uLmFyZ3M6IENhbGxiYWNrQXJnczxFdmVudE1hcCwgRXZlbnROYW1lPik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBzdXBlci50cmlnZ2VyQXN5bmMobmFtZSwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIHRyaWdnZXIgYW4gZXZlbnQsIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBBcmdzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSBhcmdzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHB1YmxpYyBvdmVycmlkZSB0cnlUcmlnZ2VyPEFyZ3MgZXh0ZW5kcyB1bmtub3duW10+KGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmLCBhcmdzOiBBcmdzKTogdm9pZCB7XG4gICAgc3VwZXIudHJ5VHJpZ2dlcihldmVudFJlZiwgYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIHRyaWdnZXIgYW4gZXZlbnQgYXN5bmNocm9ub3VzbHksIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBBcmdzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSBhcmdzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgdHJ5VHJpZ2dlckFzeW5jPEFyZ3MgZXh0ZW5kcyB1bmtub3duW10+KGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmLCBhcmdzOiBBcmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHN1cGVyLnRyeVRyaWdnZXJBc3luYyhldmVudFJlZiwgYXJncyk7XG4gIH1cbn1cblxuLyoqXG4gKiBNaXhpbiB0aGF0IGFkZHMge0BsaW5rIEFzeW5jRXZlbnRTb3VyY2V9IGRlbGVnYXRpb24gdG8gYSBiYXNlIGNsYXNzLlxuICpcbiAqIEFsbCBldmVudCBtZXRob2RzIGRlbGVnYXRlIHRvIGEgcHJpdmF0ZSB7QGxpbmsgQXN5bmNFdmVudHNCYXNlfSBpbnN0YW5jZS5cbiAqIFRoZSBgRXZlbnRNYXBgIGdlbmVyaWMgaXMgZml4ZWQgYXQgbWl4aW4tYXBwbGljYXRpb24gdGltZSBcdTIwMTQgaWYgeW91IG5lZWQgYSBjbGFzc1xuICogdGhhdCBpcyBpdHNlbGYgZ2VuZXJpYyBvdmVyIGl0cyBldmVudCBtYXAsIHVzZSBjb21wb3NpdGlvbiBpbnN0ZWFkLlxuICpcbiAqIEB0eXBlUGFyYW0gRXZlbnRNYXAgLSBNYXBzIGV2ZW50IG5hbWVzIHRvIHRoZWlyIGFyZ3VtZW50IHR1cGxlcy5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGJhc2UgY2xhc3MgYW5kIHJldHVybnMgYSBuZXcgY2xhc3MgZXh0ZW5kaW5nIGl0IHdpdGgge0BsaW5rIEFzeW5jRXZlbnRTb3VyY2V9LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW50ZXJmYWNlIE15RXZlbnRzIHtcbiAqICAgc2F2ZTogW2RhdGE6IHN0cmluZ107XG4gKiB9XG4gKiBjbGFzcyBNeUNvbXBvbmVudCBleHRlbmRzIG1peGluQXN5bmNFdmVudHM8TXlFdmVudHM+KCkoQ29tcG9uZW50KSB7XG4gKiAgIC8vIG9uKCksIG9mZigpLCBvbmNlKCksIG9mZnJlZigpIGFyZSBhdmFpbGFibGVcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWl4aW5Bc3luY0V2ZW50czxFdmVudE1hcCBleHRlbmRzIEV2ZW50TWFwQ29uc3RyYWludDxFdmVudE1hcD4gPSBFdmVudE1hcEJhc2U+KCkge1xuICByZXR1cm4gZnVuY3Rpb24gaW5uZXI8VEJhc2UgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cnVjdG9yPG9iamVjdD4+KFxuICAgIGJhc2VDbGFzczogVEJhc2VcbiAgKTogQWJzdHJhY3RDb25zdHJ1Y3RvcjxBc3luY0V2ZW50U291cmNlPEV2ZW50TWFwPiAmIEFzeW5jRXZlbnRUcmlnZ2VyPEV2ZW50TWFwPj4gJiBUQmFzZSB7XG4gICAgYWJzdHJhY3QgY2xhc3MgQXN5bmNFdmVudHNNaXhpbiBleHRlbmRzIGJhc2VDbGFzcyBpbXBsZW1lbnRzIEFzeW5jRXZlbnRTb3VyY2U8RXZlbnRNYXA+IHtcbiAgICAgIHJlYWRvbmx5ICNhc3luY0V2ZW50cyA9IG5ldyBBc3luY0V2ZW50czxFdmVudE1hcD4oKTtcblxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAgICAgKlxuICAgICAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICAgKiBAdHlwZVBhcmFtIEFyZ3MgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZXZlbnQgY2FsbGJhY2sgYWNjZXB0cy5cbiAgICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIHJlbW92ZS5cbiAgICAgICAqL1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gICAgICBwdWJsaWMgb2ZmPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmdzIGV4dGVuZHMgQ2FsbGJhY2tBcmdzPEV2ZW50TWFwLCBFdmVudE5hbWU+PihcbiAgICAgICAgbmFtZTogRXZlbnROYW1lLFxuICAgICAgICBjYWxsYmFjazogKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2FibGU8dm9pZD5cbiAgICAgICk6IHZvaWQge1xuICAgICAgICB0aGlzLiNhc3luY0V2ZW50cy5vZmYobmFtZSwgY2FsbGJhY2spO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lciBieSByZWZlcmVuY2UuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIGV2ZW50IHJlZmVyZW5jZSB0byByZW1vdmUuXG4gICAgICAgKi9cbiAgICAgIHB1YmxpYyBvZmZyZWYoZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYpOiB2b2lkIHtcbiAgICAgICAgdGhpcy4jYXN5bmNFdmVudHMub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAgICAgKlxuICAgICAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICAgKiBAdHlwZVBhcmFtIEFyZ3MgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZXZlbnQgY2FsbGJhY2sgYWNjZXB0cy5cbiAgICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgICAgICogQHBhcmFtIHRoaXNBcmcgLSBUaGUgY29udGV4dCBwYXNzZWQgYXMgYHRoaXNgIHRvIHRoZSBgY2FsbGJhY2tgLlxuICAgICAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgICovXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgICAgIHB1YmxpYyBvbjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPiwgQXJncyBleHRlbmRzIENhbGxiYWNrQXJnczxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICAgICAgY2FsbGJhY2s6ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+LFxuICAgICAgICB0aGlzQXJnPzogdW5rbm93blxuICAgICAgKTogQXN5bmNFdmVudFJlZiB7XG4gICAgICAgIHJldHVybiB0aGlzLiNhc3luY0V2ZW50cy5vbihuYW1lLCBjYWxsYmFjaywgdGhpc0FyZyk7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlLlxuICAgICAgICpcbiAgICAgICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHR5cGVQYXJhbSBBcmdzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGV2ZW50IGNhbGxiYWNrIGFjY2VwdHMuXG4gICAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAgICAgICAqIEBwYXJhbSB0aGlzQXJnIC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICAgICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICAgICAqL1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gICAgICBwdWJsaWMgb25jZTxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPiwgQXJncyBleHRlbmRzIENhbGxiYWNrQXJnczxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICAgICAgY2FsbGJhY2s6ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+LFxuICAgICAgICB0aGlzQXJnPzogdW5rbm93blxuICAgICAgKTogQXN5bmNFdmVudFJlZiB7XG4gICAgICAgIHJldHVybiB0aGlzLiNhc3luY0V2ZW50cy5vbmNlKG5hbWUsIGNhbGxiYWNrLCB0aGlzQXJnKTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBUcmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAgICAgKlxuICAgICAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgICAqIEBwYXJhbSBhcmdzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgICovXG4gICAgICBwcm90ZWN0ZWQgdHJpZ2dlcjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPj4obmFtZTogRXZlbnROYW1lLCAuLi5hcmdzOiBDYWxsYmFja0FyZ3M8RXZlbnRNYXAsIEV2ZW50TmFtZT4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy4jYXN5bmNFdmVudHMudHJpZ2dlcihuYW1lLCAuLi5hcmdzKTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBUcmlnZ2VyIGFuIGV2ZW50IGFzeW5jaHJvbm91c2x5LlxuICAgICAgICpcbiAgICAgICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICAgKiBAcGFyYW0gYXJncyAtIFRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbGlzdGVuZXJzIGhhdmUgY29tcGxldGVkLlxuICAgICAgICovXG4gICAgICBwcm90ZWN0ZWQgYXN5bmMgdHJpZ2dlckFzeW5jPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+PihuYW1lOiBFdmVudE5hbWUsIC4uLmFyZ3M6IENhbGxiYWNrQXJnczxFdmVudE1hcCwgRXZlbnROYW1lPik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLiNhc3luY0V2ZW50cy50cmlnZ2VyQXN5bmMobmFtZSwgLi4uYXJncyk7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogVHJ5IHRvIHRyaWdnZXIgYW4gZXZlbnQsIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICAgICAqXG4gICAgICAgKiBAdHlwZVBhcmFtIEFyZ3MgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZnVuY3Rpb24gYWNjZXB0cy5cbiAgICAgICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAgICAgKiBAcGFyYW0gYXJncyAtIFRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgICAqL1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gUGFyaXR5IHdpdGggT2JzaWRpYW4ncyBFdmVudHMudHJ5VHJpZ2dlci5cbiAgICAgIHByb3RlY3RlZCB0cnlUcmlnZ2VyPEFyZ3MgZXh0ZW5kcyB1bmtub3duW10+KGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmLCBhcmdzOiBBcmdzKTogdm9pZCB7XG4gICAgICAgIHRoaXMuI2FzeW5jRXZlbnRzLnRyeVRyaWdnZXIoZXZlbnRSZWYsIGFyZ3MpO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50IGFzeW5jaHJvbm91c2x5LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAgICAgKlxuICAgICAgICogQHR5cGVQYXJhbSBBcmdzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAgICAgKiBAcGFyYW0gZXZlbnRSZWYgLSBUaGUgZXZlbnQgcmVmZXJlbmNlLlxuICAgICAgICogQHBhcmFtIGFyZ3MgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAgICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICAgICAqL1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gUGFyaXR5IHdpdGggT2JzaWRpYW4ncyBFdmVudHMudHJ5VHJpZ2dlci5cbiAgICAgIHByb3RlY3RlZCBhc3luYyB0cnlUcmlnZ2VyQXN5bmM8QXJncyBleHRlbmRzIHVua25vd25bXT4oZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYsIGFyZ3M6IEFyZ3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy4jYXN5bmNFdmVudHMudHJ5VHJpZ2dlckFzeW5jKGV2ZW50UmVmLCBhcmdzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQXN5bmNFdmVudHNNaXhpbiBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPEFzeW5jRXZlbnRTb3VyY2U8RXZlbnRNYXA+ICYgQXN5bmNFdmVudFRyaWdnZXI8RXZlbnRNYXA+PiAmIFRCYXNlO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0aHJvd0RlbGF5ZWQoZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgIHRocm93IGVycm9yO1xuICB9LCAwKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFjQSxtQkFBOEI7QUF1T3ZCLE1BQWUsZ0JBQW9IO0FBQUEsRUFDdkgsZUFBZSxvQkFBSSxJQUE2QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWdCMUQsSUFDTCxNQUNBLFVBQ007QUFDTixVQUFNLFlBQVksS0FBSyxhQUFhLElBQUksSUFBSTtBQUM1QyxRQUFJLENBQUMsV0FBVztBQUNkO0FBQUEsSUFDRjtBQUVBLG9DQUFjLFdBQVcsQ0FBQyxhQUFh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