@angular/core 18.0.0-rc.0 → 18.0.0-rc.2

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 (73) hide show
  1. package/esm2022/primitives/event-dispatch/contract_binary.mjs +3 -3
  2. package/esm2022/primitives/event-dispatch/index.mjs +2 -2
  3. package/esm2022/primitives/event-dispatch/src/action_resolver.mjs +221 -0
  4. package/esm2022/primitives/event-dispatch/src/attribute.mjs +63 -65
  5. package/esm2022/primitives/event-dispatch/src/cache.mjs +10 -10
  6. package/esm2022/primitives/event-dispatch/src/dispatcher.mjs +52 -176
  7. package/esm2022/primitives/event-dispatch/src/earlyeventcontract.mjs +15 -9
  8. package/esm2022/primitives/event-dispatch/src/event_contract_defines.mjs +1 -19
  9. package/esm2022/primitives/event-dispatch/src/eventcontract.mjs +24 -362
  10. package/esm2022/primitives/event-dispatch/src/key_code.mjs +11 -13
  11. package/esm2022/primitives/event-dispatch/src/legacy_dispatcher.mjs +252 -2
  12. package/esm2022/primitives/event-dispatch/src/property.mjs +30 -27
  13. package/esm2022/primitives/event-dispatch/src/register_events.mjs +16 -17
  14. package/esm2022/primitives/event-dispatch/src/restriction.mjs +2 -2
  15. package/esm2022/src/application/application_ref.mjs +6 -3
  16. package/esm2022/src/application/create_application.mjs +12 -5
  17. package/esm2022/src/change_detection/scheduling/exhaustive_check_no_changes.mjs +150 -0
  18. package/esm2022/src/change_detection/scheduling/ng_zone_scheduling.mjs +6 -4
  19. package/esm2022/src/change_detection/scheduling/zoneless_scheduling.mjs +3 -1
  20. package/esm2022/src/change_detection/scheduling/zoneless_scheduling_impl.mjs +9 -6
  21. package/esm2022/src/core.mjs +2 -1
  22. package/esm2022/src/core_private_export.mjs +2 -1
  23. package/esm2022/src/core_reactivity_export_internal.mjs +1 -3
  24. package/esm2022/src/core_render3_private_export.mjs +1 -3
  25. package/esm2022/src/defer/instructions.mjs +20 -12
  26. package/esm2022/src/defer/interfaces.mjs +1 -3
  27. package/esm2022/src/errors.mjs +1 -1
  28. package/esm2022/src/hydration/event_replay.mjs +67 -79
  29. package/esm2022/src/hydration/utils.mjs +1 -2
  30. package/esm2022/src/metadata/directives.mjs +1 -1
  31. package/esm2022/src/platform/platform_ref.mjs +10 -4
  32. package/esm2022/src/render3/after_render_hooks.mjs +4 -2
  33. package/esm2022/src/render3/component_ref.mjs +1 -1
  34. package/esm2022/src/render3/index.mjs +1 -3
  35. package/esm2022/src/render3/instructions/change_detection.mjs +13 -10
  36. package/esm2022/src/render3/instructions/listener.mjs +12 -1
  37. package/esm2022/src/render3/interfaces/public_definitions.mjs +1 -1
  38. package/esm2022/src/render3/state.mjs +14 -4
  39. package/esm2022/src/render3/view_ref.mjs +3 -2
  40. package/esm2022/src/util/callback_scheduler.mjs +12 -26
  41. package/esm2022/src/version.mjs +1 -1
  42. package/esm2022/src/zone/ng_zone.mjs +9 -23
  43. package/esm2022/testing/src/component_fixture.mjs +2 -4
  44. package/esm2022/testing/src/defer.mjs +1 -2
  45. package/esm2022/testing/src/logger.mjs +3 -3
  46. package/esm2022/testing/src/test_bed.mjs +1 -3
  47. package/esm2022/testing/src/test_bed_compiler.mjs +3 -6
  48. package/event-dispatch-contract.min.js +1 -1
  49. package/fesm2022/core.mjs +800 -660
  50. package/fesm2022/core.mjs.map +1 -1
  51. package/fesm2022/primitives/event-dispatch.mjs +484 -807
  52. package/fesm2022/primitives/event-dispatch.mjs.map +1 -1
  53. package/fesm2022/primitives/signals.mjs +1 -1
  54. package/fesm2022/rxjs-interop.mjs +1 -1
  55. package/fesm2022/testing.mjs +4 -10
  56. package/fesm2022/testing.mjs.map +1 -1
  57. package/index.d.ts +36 -4
  58. package/package.json +1 -1
  59. package/primitives/event-dispatch/index.d.ts +111 -162
  60. package/primitives/signals/index.d.ts +1 -1
  61. package/rxjs-interop/index.d.ts +1 -1
  62. package/schematics/migrations/http-providers/bundle.js +110 -71
  63. package/schematics/migrations/http-providers/bundle.js.map +3 -3
  64. package/schematics/migrations/invalid-two-way-bindings/bundle.js +197 -167
  65. package/schematics/migrations/invalid-two-way-bindings/bundle.js.map +2 -2
  66. package/schematics/ng-generate/control-flow-migration/bundle.js +205 -175
  67. package/schematics/ng-generate/control-flow-migration/bundle.js.map +2 -2
  68. package/schematics/ng-generate/standalone-migration/bundle.js +481 -451
  69. package/schematics/ng-generate/standalone-migration/bundle.js.map +2 -2
  70. package/testing/index.d.ts +1 -4
  71. package/esm2022/primitives/event-dispatch/src/base_dispatcher.mjs +0 -96
  72. package/esm2022/primitives/event-dispatch/src/custom_events.mjs +0 -63
  73. package/esm2022/primitives/event-dispatch/src/replay.mjs +0 -389
@@ -1,389 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright Google LLC All Rights Reserved.
4
- *
5
- * Use of this source code is governed by an MIT-style license that can be
6
- * found in the LICENSE file at https://angular.io/license
7
- */
8
- /**
9
- * @fileoverview Functions for replaying events by the jsaction
10
- * Dispatcher.
11
- * All ts-ignores in this file are due to APIs that are no longer in the browser.
12
- */
13
- import { createCustomEvent } from './/custom_events';
14
- import * as jsactionEvent from './/event';
15
- import { EventType } from './/event_type';
16
- /**
17
- * Replays an event.
18
- */
19
- export function replayEvent(event, targetElement, eventType) {
20
- triggerEvent(targetElement, createEvent(event, eventType));
21
- }
22
- /**
23
- * Checks if a given event was triggered by the keyboard.
24
- * @param eventType The event type.
25
- * @return Whether it's a keyboard event.
26
- */
27
- function isKeyboardEvent(eventType) {
28
- return (eventType === EventType.KEYPRESS ||
29
- eventType === EventType.KEYDOWN ||
30
- eventType === EventType.KEYUP);
31
- }
32
- /**
33
- * Checks if a given event was triggered by the mouse.
34
- * @param eventType The event type.
35
- * @return Whether it's a mouse event.
36
- */
37
- function isMouseEvent(eventType) {
38
- // TODO: Verify if Drag events should be bound here.
39
- return (eventType === EventType.CLICK ||
40
- eventType === EventType.DBLCLICK ||
41
- eventType === EventType.MOUSEDOWN ||
42
- eventType === EventType.MOUSEOVER ||
43
- eventType === EventType.MOUSEOUT ||
44
- eventType === EventType.MOUSEMOVE);
45
- }
46
- /**
47
- * Checks if a given event is a general UI event.
48
- * @param eventType The event type.
49
- * @return Whether it's a focus event.
50
- */
51
- function isUiEvent(eventType) {
52
- // Almost nobody supports the W3C method of creating FocusEvents.
53
- // For now, we're going to use the UIEvent as a super-interface.
54
- return (eventType === EventType.FOCUS ||
55
- eventType === EventType.BLUR ||
56
- eventType === EventType.FOCUSIN ||
57
- eventType === EventType.FOCUSOUT ||
58
- eventType === EventType.SCROLL);
59
- }
60
- /**
61
- * Create a whitespace-delineated list of modifier keys that should be
62
- * considered to be active on the event's key. See details at
63
- * https://developer.mozilla.org/en/DOM/KeyboardEvent.
64
- * @param alt Alt pressed.
65
- * @param ctrl Control pressed.
66
- * @param meta Command pressed (OSX only).
67
- * @param shift Shift pressed.
68
- * @return The constructed modifier keys string.
69
- */
70
- function createKeyboardModifiersList(alt, ctrl, meta, shift) {
71
- const keys = [];
72
- if (alt) {
73
- keys.push('Alt');
74
- }
75
- if (ctrl) {
76
- keys.push('Control');
77
- }
78
- if (meta) {
79
- keys.push('Meta');
80
- }
81
- if (shift) {
82
- keys.push('Shift');
83
- }
84
- return keys.join(' ');
85
- }
86
- /**
87
- * Creates a UI event object for replaying through the DOM.
88
- * @param original The event to create a new event from.
89
- * @param opt_eventType The type this event is being handled as by jsaction.
90
- * e.g. blur events are handled as focusout
91
- * @return The event object.
92
- */
93
- export function createUiEvent(original, opt_eventType) {
94
- let event;
95
- if (document.createEvent) {
96
- const originalUiEvent = original;
97
- // Event creation as per W3C event model specification. This codepath
98
- // is used by most non-IE browsers and also by IE 9 and later.
99
- event = document.createEvent('UIEvent');
100
- // On IE and Opera < 12, we must provide non-undefined values to
101
- // initEvent, otherwise it will fail.
102
- event.initUIEvent(opt_eventType || originalUiEvent.type, originalUiEvent.bubbles !== undefined ? originalUiEvent.bubbles : true, originalUiEvent.cancelable || false, originalUiEvent.view || window, original.detail || 0);
103
- // detail
104
- }
105
- else {
106
- // Older versions of IE (up to version 8) do not support the
107
- // W3C event model. Use the IE specific function instead.
108
- // Suppressing errors for ts-migration.
109
- // TS2339: Property 'createEventObject' does not exist on type 'Document'.
110
- // @ts-ignore
111
- event = document.createEventObject();
112
- event.type = opt_eventType || original.type;
113
- event.bubbles = original.bubbles !== undefined ? original.bubbles : true;
114
- event.cancelable = original.cancelable || false;
115
- event.view = original.view || window;
116
- event.detail = original.detail || 0;
117
- }
118
- // Some focus events also have a nullable relatedTarget value which isn't
119
- // directly supported in the initUIEvent() method.
120
- event.relatedTarget = original.relatedTarget || null;
121
- event.originalTimestamp = original.timeStamp;
122
- return event;
123
- }
124
- /**
125
- * Creates a keyboard event object for replaying through the DOM.
126
- * @param original The event to create a new event from.
127
- * @param opt_eventType The type this event is being handled as by jsaction.
128
- * E.g. a keypress is handled as click in some cases.
129
- * @return The event object.
130
- * @suppress {strictMissingProperties} Two definitions of initKeyboardEvent.
131
- */
132
- export function createKeyboardEvent(original, opt_eventType) {
133
- let event;
134
- const keyboardEvent = original;
135
- if (document.createEvent) {
136
- // Event creation as per W3C event model specification. This codepath
137
- // is used by most non-IE browsers and also by IE 9 and later.
138
- event = document.createEvent('KeyboardEvent');
139
- if (event.initKeyboardEvent) {
140
- if (jsactionEvent.isIe) {
141
- // IE9+
142
- // https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/ff975945(v=vs.85)
143
- const modifiers = createKeyboardModifiersList(keyboardEvent.altKey, keyboardEvent.ctrlKey, keyboardEvent.metaKey, keyboardEvent.shiftKey);
144
- event.initKeyboardEvent(opt_eventType || keyboardEvent.type, true, true, window, keyboardEvent.key, keyboardEvent.location,
145
- // Suppressing errors for ts-migration.
146
- // TS2345: Argument of type 'string' is not assignable to
147
- // parameter of type 'boolean | undefined'.
148
- // @ts-ignore
149
- modifiers, keyboardEvent.repeat,
150
- // @ts-ignore This doesn't exist
151
- keyboardEvent.locale);
152
- }
153
- else {
154
- // W3C DOM Level 3 Events model.
155
- // https://www.w3.org/TR/uievents/#idl-interface-KeyboardEvent-initializers
156
- event.initKeyboardEvent(opt_eventType || original.type, true, true, window, keyboardEvent.key, keyboardEvent.location, keyboardEvent.ctrlKey, keyboardEvent.altKey, keyboardEvent.shiftKey, keyboardEvent.metaKey);
157
- Object.defineProperty(event, 'repeat', {
158
- get: () => original.repeat,
159
- enumerable: true,
160
- });
161
- // Add missing 'locale' which is not part of the spec.
162
- // https://bugs.chromium.org/p/chromium/issues/detail?id=168971
163
- Object.defineProperty(event, 'locale', {
164
- // Suppressing errors for ts-migration.
165
- // TS2339: Property 'locale' does not exist on type 'Event'.
166
- // @ts-ignore
167
- get: () => original.locale,
168
- enumerable: true,
169
- });
170
- // Apple WebKit has a non-standard altGraphKey that is not implemented
171
- // here.
172
- // https://developer.apple.com/documentation/webkitjs/keyboardevent/1633753-initkeyboardevent
173
- }
174
- // Blink and Webkit had a bug that causes the `charCode`, `keyCode`, and
175
- // `which` properties to always be unset when synthesizing a keyboard
176
- // event. Details at: https://bugs.webkit.org/show_bug.cgi?id=16735. With
177
- // these properties being deprecated, the bug has evolved into affecting
178
- // the `key` property. We work around it by redefining the `key` and
179
- // deprecated properties; a simple assignment here would fail because the
180
- // native properties are readonly.
181
- if (jsactionEvent.isWebKit) {
182
- if (keyboardEvent.key && event.key === '') {
183
- Object.defineProperty(event, 'key', {
184
- get: () => keyboardEvent.key,
185
- enumerable: true,
186
- });
187
- }
188
- }
189
- // Re-implement the deprecated `charCode`, `keyCode` and `which` which
190
- // are also an issue on IE9+.
191
- if (jsactionEvent.isWebKit || jsactionEvent.isIe || jsactionEvent.isGecko) {
192
- Object.defineProperty(event, 'charCode', {
193
- get: () => original.charCode,
194
- enumerable: true,
195
- });
196
- const keyCodeGetter = () => original.keyCode;
197
- Object.defineProperty(event, 'keyCode', {
198
- get: keyCodeGetter,
199
- enumerable: true,
200
- });
201
- Object.defineProperty(event, 'which', {
202
- get: keyCodeGetter,
203
- enumerable: true,
204
- });
205
- }
206
- }
207
- else {
208
- // Gecko only supports an older/deprecated version from DOM Level 2. See
209
- // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/initKeyEvent
210
- // for details.
211
- // @ts-ignore ditto
212
- event.initKeyEvent(opt_eventType || original.type, true, true, window,
213
- // Suppressing errors for ts-migration.
214
- // TS2339: Property 'ctrlKey' does not exist on type 'Event'.
215
- // @ts-ignore
216
- original.ctrlKey,
217
- // Suppressing errors for ts-migration.
218
- // TS2339: Property 'altKey' does not exist on type 'Event'.
219
- // @ts-ignore
220
- original.altKey,
221
- // Suppressing errors for ts-migration.
222
- // TS2339: Property 'shiftKey' does not exist on type 'Event'.
223
- // @ts-ignore
224
- original.shiftKey,
225
- // Suppressing errors for ts-migration.
226
- // TS2339: Property 'metaKey' does not exist on type 'Event'.
227
- // @ts-ignore
228
- original.metaKey,
229
- // Suppressing errors for ts-migration.
230
- // TS2339: Property 'keyCode' does not exist on type 'Event'.
231
- // @ts-ignore
232
- original.keyCode,
233
- // Suppressing errors for ts-migration.
234
- // TS2339: Property 'charCode' does not exist on type 'Event'.
235
- // @ts-ignore
236
- original.charCode);
237
- }
238
- }
239
- else {
240
- // Older versions of IE (up to version 8) do not support the
241
- // W3C event model. Use the IE specific function instead.
242
- // Suppressing errors for ts-migration.
243
- // @ts-ignore
244
- event = document.createEventObject();
245
- event.type = opt_eventType || original.type;
246
- const originalKeyboardEvent = original;
247
- event.repeat = originalKeyboardEvent.repeat;
248
- event.ctrlKey = originalKeyboardEvent.ctrlKey;
249
- event.altKey = originalKeyboardEvent.altKey;
250
- event.shiftKey = originalKeyboardEvent.shiftKey;
251
- event.metaKey = originalKeyboardEvent.metaKey;
252
- event.key = originalKeyboardEvent.key;
253
- event.keyCode = originalKeyboardEvent.keyCode;
254
- event.charCode = originalKeyboardEvent.charCode;
255
- }
256
- event.originalTimestamp = original.timeStamp;
257
- return event;
258
- }
259
- /**
260
- * Creates a mouse event object for replaying through the DOM.
261
- * @param original The event to create a new event from.
262
- * @param opt_eventType The type this event is being handled as by jsaction.
263
- * E.g. a keypress is handled as click in some cases.
264
- * @return The event object.
265
- */
266
- export function createMouseEvent(original, opt_eventType) {
267
- let event;
268
- const originalMouseEvent = original;
269
- if (document.createEvent) {
270
- // Event creation as per W3C event model specification. This codepath
271
- // is used by most non-IE browsers and also by IE 9 and later.
272
- event = document.createEvent('MouseEvent');
273
- // On IE and Opera < 12, we must provide non-undefined values to
274
- // initMouseEvent, otherwise it will fail.
275
- event.initMouseEvent(opt_eventType || original.type, true, // canBubble
276
- true, // cancelable
277
- window, original.detail || 1, originalMouseEvent.screenX || 0, originalMouseEvent.screenY || 0, originalMouseEvent.clientX || 0, originalMouseEvent.clientY || 0, originalMouseEvent.ctrlKey || false, originalMouseEvent.altKey || false, originalMouseEvent.shiftKey || false, originalMouseEvent.metaKey || false, originalMouseEvent.button || 0, originalMouseEvent.relatedTarget || null);
278
- }
279
- else {
280
- // Older versions of IE (up to version 8) do not support the
281
- // W3C event model. Use the IE specific function instead.
282
- // @ts-ignore
283
- event = document.createEventObject();
284
- event.type = opt_eventType || original.type;
285
- event.clientX = originalMouseEvent.clientX;
286
- event.clientY = originalMouseEvent.clientY;
287
- event.button = originalMouseEvent.button;
288
- event.detail = original.detail;
289
- event.ctrlKey = originalMouseEvent.ctrlKey;
290
- event.altKey = originalMouseEvent.altKey;
291
- event.shiftKey = originalMouseEvent.shiftKey;
292
- event.metaKey = originalMouseEvent.metaKey;
293
- }
294
- event.originalTimestamp = original.timeStamp;
295
- return event;
296
- }
297
- /**
298
- * Creates a generic event object for replaying through the DOM.
299
- * @param original The event to create a new event from.
300
- * @param opt_eventType The type this event is being handled as by jsaction.
301
- * E.g. a keypress is handled as click in some cases.
302
- * @return The event object.
303
- */
304
- function createGenericEvent(original, opt_eventType) {
305
- let event;
306
- if (document.createEvent) {
307
- // Event creation as per W3C event model specification. This codepath
308
- // is used by most non-IE browsers and also by IE 9 and later.
309
- event = document.createEvent('Event');
310
- event.initEvent(opt_eventType || original.type, true, true);
311
- }
312
- else {
313
- // Older versions of IE (up to version 8) do not support the
314
- // W3C event model. Use the IE specific function instead.
315
- // Suppressing errors for ts-migration.
316
- // TS2339: Property 'createEventObject' does not exist on type 'Document'.
317
- // @ts-ignore
318
- event = document.createEventObject();
319
- event.type = opt_eventType || original.type;
320
- }
321
- event.originalTimestamp = original.timeStamp;
322
- return event;
323
- }
324
- /**
325
- * Creates an event object for replaying through the DOM.
326
- * NOTE: This function is visible just for testing. Please don't use
327
- * it outside JsAction internal testing.
328
- * TODO: Add support for FocusEvent and WheelEvent.
329
- * @param base The event to create a new event from.
330
- * @param opt_eventType The type this event is being handled as by jsaction.
331
- * E.g. a keypress is handled as click in some cases.
332
- * @return The event object.
333
- */
334
- export function createEvent(base, opt_eventType) {
335
- const original = base;
336
- let event;
337
- let eventType;
338
- if (original.type === EventType.CUSTOM) {
339
- eventType = EventType.CUSTOM;
340
- }
341
- else {
342
- eventType = opt_eventType || original.type;
343
- }
344
- if (isKeyboardEvent(eventType)) {
345
- event = createKeyboardEvent(original, opt_eventType);
346
- }
347
- else if (isMouseEvent(eventType)) {
348
- event = createMouseEvent(original, opt_eventType);
349
- }
350
- else if (isUiEvent(eventType)) {
351
- event = createUiEvent(original, opt_eventType);
352
- }
353
- else if (eventType === EventType.CUSTOM) {
354
- event = createCustomEvent(opt_eventType, original['detail']['data'], original['detail']['triggeringEvent']);
355
- event.originalTimestamp = original.timeStamp;
356
- }
357
- else {
358
- // This ensures we don't send an undefined event object to the replayer.
359
- event = createGenericEvent(original, opt_eventType);
360
- }
361
- return event;
362
- }
363
- /**
364
- * Sends an event for replay to the DOM.
365
- * @param target The target for the event.
366
- * @param event The event object.
367
- * @return The return value of the event replay, i.e., whether preventDefault()
368
- * was called on it.
369
- */
370
- export function triggerEvent(target, event) {
371
- if (target.dispatchEvent) {
372
- return target.dispatchEvent(event);
373
- }
374
- else {
375
- // Suppressing errors for ts-migration.
376
- // TS2339: Property 'fireEvent' does not exist on type 'Element'.
377
- // @ts-ignore
378
- return target.fireEvent('on' + event.type, event);
379
- }
380
- }
381
- /** Do not use outiside of testing. */
382
- export const testing = {
383
- createKeyboardModifiersList,
384
- createGenericEvent,
385
- isKeyboardEvent,
386
- isMouseEvent,
387
- isUiEvent,
388
- };
389
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbGF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9wcmltaXRpdmVzL2V2ZW50LWRpc3BhdGNoL3NyYy9yZXBsYXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUg7Ozs7R0FJRztBQUVILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxhQUFhLE1BQU0sVUFBVSxDQUFDO0FBQzFDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFNeEM7O0dBRUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLEtBQVksRUFBRSxhQUFzQixFQUFFLFNBQWtCO0lBQ2xGLFlBQVksQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQzdELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxlQUFlLENBQUMsU0FBaUI7SUFDeEMsT0FBTyxDQUNMLFNBQVMsS0FBSyxTQUFTLENBQUMsUUFBUTtRQUNoQyxTQUFTLEtBQUssU0FBUyxDQUFDLE9BQU87UUFDL0IsU0FBUyxLQUFLLFNBQVMsQ0FBQyxLQUFLLENBQzlCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsWUFBWSxDQUFDLFNBQWlCO0lBQ3JDLG9EQUFvRDtJQUNwRCxPQUFPLENBQ0wsU0FBUyxLQUFLLFNBQVMsQ0FBQyxLQUFLO1FBQzdCLFNBQVMsS0FBSyxTQUFTLENBQUMsUUFBUTtRQUNoQyxTQUFTLEtBQUssU0FBUyxDQUFDLFNBQVM7UUFDakMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxTQUFTO1FBQ2pDLFNBQVMsS0FBSyxTQUFTLENBQUMsUUFBUTtRQUNoQyxTQUFTLEtBQUssU0FBUyxDQUFDLFNBQVMsQ0FDbEMsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FB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QUNILE1BQU0sVUFBVSxZQUFZLENBQUMsTUFBbUIsRUFBRSxLQUFZO0lBQzVELElBQUksTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQyxDQUFDO1NBQU0sQ0FBQztRQUNOLHVDQUF1QztRQUN2QyxtRUFBbUU7UUFDbkUsYUFBYTtRQUNiLE9BQVEsTUFBa0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakUsQ0FBQztBQUNILENBQUM7QUFFRCxzQ0FBc0M7QUFDdEMsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHO0lBQ3JCLDJCQUEyQjtJQUMzQixrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLFlBQVk7SUFDWixTQUFTO0NBQ1YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgRnVuY3Rpb25zIGZvciByZXBsYXlpbmcgZXZlbnRzIGJ5IHRoZSBqc2FjdGlvblxuICogRGlzcGF0Y2hlci5cbiAqIEFsbCB0cy1pZ25vcmVzIGluIHRoaXMgZmlsZSBhcmUgZHVlIHRvIEFQSXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBicm93c2VyLlxuICovXG5cbmltcG9ydCB7Y3JlYXRlQ3VzdG9tRXZlbnR9IGZyb20gJy4vL2N1c3RvbV9ldmVudHMnO1xuaW1wb3J0ICogYXMganNhY3Rpb25FdmVudCBmcm9tICcuLy9ldmVudCc7XG5pbXBvcnQge0V2ZW50VHlwZX0gZnJvbSAnLi8vZXZlbnRfdHlwZSc7XG5cbnR5cGUgV3JpdGVhYmxlPFQ+ID0ge1xuICAtcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFRbUF07XG59O1xuXG4vKipcbiAqIFJlcGxheXMgYW4gZXZlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBsYXlFdmVudChldmVudDogRXZlbnQsIHRhcmdldEVsZW1lbnQ6IEVsZW1lbnQsIGV2ZW50VHlwZT86IHN0cmluZykge1xuICB0cmlnZ2VyRXZlbnQodGFyZ2V0RWxlbWVudCwgY3JlYXRlRXZlbnQoZXZlbnQsIGV2ZW50VHlwZSkpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGdpdmVuIGV2ZW50IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIGtleWJvYXJkLlxuICogQHBhcmFtIGV2ZW50VHlwZSBUaGUgZXZlbnQgdHlwZS5cbiAqIEByZXR1cm4gV2hldGhlciBpdCdzIGEga2V5Ym9hcmQgZXZlbnQuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5Ym9hcmRFdmVudChldmVudFR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLktFWVBSRVNTIHx8XG4gICAgZXZlbnRUeXBlID09PSBFdmVudFR5cGUuS0VZRE9XTiB8fFxuICAgIGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLktFWVVQXG4gICk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZ2l2ZW4gZXZlbnQgd2FzIHRyaWdnZXJlZCBieSB0aGUgbW91c2UuXG4gKiBAcGFyYW0gZXZlbnRUeXBlIFRoZSBldmVudCB0eXBlLlxuICogQHJldHVybiBXaGV0aGVyIGl0J3MgYSBtb3VzZSBldmVudC5cbiAqL1xuZnVuY3Rpb24gaXNNb3VzZUV2ZW50KGV2ZW50VHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIFRPRE86IFZlcmlmeSBpZiBEcmFnIGV2ZW50cyBzaG91bGQgYmUgYm91bmQgaGVyZS5cbiAgcmV0dXJuIChcbiAgICBldmVudFR5cGUgPT09IEV2ZW50VHlwZS5DTElDSyB8fFxuICAgIGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLkRCTENMSUNLIHx8XG4gICAgZXZlbnRUeXBlID09PSBFdmVudFR5cGUuTU9VU0VET1dOIHx8XG4gICAgZXZlbnRUeXBlID09PSBFdmVudFR5cGUuTU9VU0VPVkVSIHx8XG4gICAgZXZlbnRUeXBlID09PSBFdmVudFR5cGUuTU9VU0VPVVQgfHxcbiAgICBldmVudFR5cGUgPT09IEV2ZW50VHlwZS5NT1VTRU1PVkVcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBldmVudCBpcyBhIGdlbmVyYWwgVUkgZXZlbnQuXG4gKiBAcGFyYW0gZXZlbnRUeXBlIFRoZSBldmVudCB0eXBlLlxuICogQHJldHVybiBXaGV0aGVyIGl0J3MgYSBmb2N1cyBldmVudC5cbiAqL1xuZnVuY3Rpb24gaXNVaUV2ZW50KGV2ZW50VHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIEFsbW9zdCBub2JvZHkgc3VwcG9ydHMgdGhlIFczQyBtZXRob2Qgb2YgY3JlYXRpbmcgRm9jdXNFdmVudHMuXG4gIC8vIEZvciBub3csIHdlJ3JlIGdvaW5nIHRvIHVzZSB0aGUgVUlFdmVudCBhcyBhIHN1cGVyLWludGVyZmFjZS5cbiAgcmV0dXJuIChcbiAgICBldmVudFR5cGUgPT09IEV2ZW50VHlwZS5GT0NVUyB8fFxuICAgIGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLkJMVVIgfHxcbiAgICBldmVudFR5cGUgPT09IEV2ZW50VHlwZS5GT0NVU0lOIHx8XG4gICAgZXZlbnRUeXBlID09PSBFdmVudFR5cGUuRk9DVVNPVVQgfHxcbiAgICBldmVudFR5cGUgPT09IEV2ZW50VHlwZS5TQ1JPTExcbiAgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSB3aGl0ZXNwYWNlLWRlbGluZWF0ZWQgbGlzdCBvZiBtb2RpZmllciBrZXlzIHRoYXQgc2hvdWxkIGJlXG4gKiBjb25zaWRlcmVkIHRvIGJlIGFjdGl2ZSBvbiB0aGUgZXZlbnQncyBrZXkuIFNlZSBkZXRhaWxzIGF0XG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9ET00vS2V5Ym9hcmRFdmVudC5cbiAqIEBwYXJhbSBhbHQgQWx0IHByZXNzZWQuXG4gKiBAcGFyYW0gY3RybCBDb250cm9sIHByZXNzZWQuXG4gKiBAcGFyYW0gbWV0YSBDb21tYW5kIHByZXNzZWQgKE9TWCBvbmx5KS5cbiAqIEBwYXJhbSBzaGlmdCBTaGlmdCBwcmVzc2VkLlxuICogQHJldHVybiBUaGUgY29uc3RydWN0ZWQgbW9kaWZpZXIga2V5cyBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUtleWJvYXJkTW9kaWZpZXJzTGlzdChcbiAgYWx0OiBib29sZWFuLFxuICBjdHJsOiBib29sZWFuLFxuICBtZXRhOiBib29sZWFuLFxuICBzaGlmdDogYm9vbGVhbixcbik6IHN0cmluZyB7XG4gIGNvbnN0IGtleXMgPSBbXTtcbiAgaWYgKGFsdCkge1xuICAgIGtleXMucHVzaCgnQWx0Jyk7XG4gIH1cbiAgaWYgKGN0cmwpIHtcbiAgICBrZXlzLnB1c2goJ0NvbnRyb2wnKTtcbiAgfVxuICBpZiAobWV0YSkge1xuICAgIGtleXMucHVzaCgnTWV0YScpO1xuICB9XG4gIGlmIChzaGlmdCkge1xuICAgIGtleXMucHVzaCgnU2hpZnQnKTtcbiAgfVxuICByZXR1cm4ga2V5cy5qb2luKCcgJyk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIFVJIGV2ZW50IG9iamVjdCBmb3IgcmVwbGF5aW5nIHRocm91Z2ggdGhlIERPTS5cbiAqIEBwYXJhbSBvcmlnaW5hbCBUaGUgZXZlbnQgdG8gY3JlYXRlIGEgbmV3IGV2ZW50IGZyb20uXG4gKiBAcGFyYW0gb3B0X2V2ZW50VHlwZSBUaGUgdHlwZSB0aGlzIGV2ZW50IGlzIGJlaW5nIGhhbmRsZWQgYXMgYnkganNhY3Rpb24uXG4gKiAgICAgZS5nLiBibHVyIGV2ZW50cyBhcmUgaGFuZGxlZCBhcyBmb2N1c291dFxuICogQHJldHVybiBUaGUgZXZlbnQgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVWlFdmVudChvcmlnaW5hbDogRXZlbnQsIG9wdF9ldmVudFR5cGU/OiBzdHJpbmcpOiBFdmVudCB7XG4gIGxldCBldmVudDogV3JpdGVhYmxlPFVJRXZlbnQ+ICYge29yaWdpbmFsVGltZXN0YW1wPzogRE9NSGlnaFJlc1RpbWVTdGFtcH07XG4gIGlmIChkb2N1bWVudC5jcmVhdGVFdmVudCkge1xuICAgIGNvbnN0IG9yaWdpbmFsVWlFdmVudCA9IG9yaWdpbmFsIGFzIFVJRXZlbnQ7XG4gICAgLy8gRXZlbnQgY3JlYXRpb24gYXMgcGVyIFczQyBldmVudCBtb2RlbCBzcGVjaWZpY2F0aW9uLiAgVGhpcyBjb2RlcGF0aFxuICAgIC8vIGlzIHVzZWQgYnkgbW9zdCBub24tSUUgYnJvd3NlcnMgYW5kIGFsc28gYnkgSUUgOSBhbmQgbGF0ZXIuXG4gICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnVUlFdmVudCcpO1xuICAgIC8vIE9uIElFIGFuZCBPcGVyYSA8IDEyLCB3ZSBtdXN0IHByb3ZpZGUgbm9uLXVuZGVmaW5lZCB2YWx1ZXMgdG9cbiAgICAvLyBpbml0RXZlbnQsIG90aGVyd2lzZSBpdCB3aWxsIGZhaWwuXG4gICAgZXZlbnQuaW5pdFVJRXZlbnQoXG4gICAgICBvcHRfZXZlbnRUeXBlIHx8IG9yaWdpbmFsVWlFdmVudC50eXBlLFxuICAgICAgb3JpZ2luYWxVaUV2ZW50LmJ1YmJsZXMgIT09IHVuZGVmaW5lZCA/IG9yaWdpbmFsVWlFdmVudC5idWJibGVzIDogdHJ1ZSxcbiAgICAgIG9yaWdpbmFsVWlFdmVudC5jYW5jZWxhYmxlIHx8IGZhbHNlLFxuICAgICAgb3JpZ2luYWxVaUV2ZW50LnZpZXcgfHwgd2luZG93LFxuICAgICAgKG9yaWdpbmFsIGFzIEN1c3RvbUV2ZW50KS5kZXRhaWwgfHwgMCxcbiAgICApO1xuICAgIC8vIGRldGFpbFxuICB9IGVsc2Uge1xuICAgIC8vIE9sZGVyIHZlcnNpb25zIG9mIElFICh1cCB0byB2ZXJzaW9uIDgpIGRvIG5vdCBzdXBwb3J0IHRoZVxuICAgIC8vIFczQyBldmVudCBtb2RlbC4gVXNlIHRoZSBJRSBzcGVjaWZpYyBmdW5jdGlvbiBpbnN0ZWFkLlxuICAgIC8vIFN1cHByZXNzaW5nIGVycm9ycyBmb3IgdHMtbWlncmF0aW9uLlxuICAgIC8vICAgVFMyMzM5OiBQcm9wZXJ0eSAnY3JlYXRlRXZlbnRPYmplY3QnIGRvZXMgbm90IGV4aXN0IG9uIHR5cGUgJ0RvY3VtZW50Jy5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCgpO1xuICAgIGV2ZW50LnR5cGUgPSBvcHRfZXZlbnRUeXBlIHx8IG9yaWdpbmFsLnR5cGU7XG4gICAgZXZlbnQuYnViYmxlcyA9IG9yaWdpbmFsLmJ1YmJsZXMgIT09IHVuZGVmaW5lZCA/IG9yaWdpbmFsLmJ1YmJsZXMgOiB0cnVlO1xuICAgIGV2ZW50LmNhbmNlbGFibGUgPSBvcmlnaW5hbC5jYW5jZWxhYmxlIHx8IGZhbHNlO1xuICAgIGV2ZW50LnZpZXcgPSAob3JpZ2luYWwgYXMgV3JpdGVhYmxlPFVJRXZlbnQ+KS52aWV3IHx8IHdpbmRvdztcbiAgICBldmVudC5kZXRhaWwgPSAob3JpZ2luYWwgYXMgQ3VzdG9tRXZlbnQpLmRldGFpbCB8fCAwO1xuICB9XG4gIC8vIFNvbWUgZm9jdXMgZXZlbnRzIGFsc28gaGF2ZSBhIG51bGxhYmxlIHJlbGF0ZWRUYXJnZXQgdmFsdWUgd2hpY2ggaXNuJ3RcbiAgLy8gZGlyZWN0bHkgc3VwcG9ydGVkIGluIHRoZSBpbml0VUlFdmVudCgpIG1ldGhvZC5cbiAgKGV2ZW50IGFzIFdyaXRlYWJsZTxGb2N1c0V2ZW50PikucmVsYXRlZFRhcmdldCA9IChvcmlnaW5hbCBhcyBGb2N1c0V2ZW50KS5yZWxhdGVkVGFyZ2V0IHx8IG51bGw7XG4gIGV2ZW50Lm9yaWdpbmFsVGltZXN0YW1wID0gb3JpZ2luYWwudGltZVN0YW1wO1xuICByZXR1cm4gZXZlbnQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGtleWJvYXJkIGV2ZW50IG9iamVjdCBmb3IgcmVwbGF5aW5nIHRocm91Z2ggdGhlIERPTS5cbiAqIEBwYXJhbSBvcmlnaW5hbCBUaGUgZXZlbnQgdG8gY3JlYXRlIGEgbmV3IGV2ZW50IGZyb20uXG4gKiBAcGFyYW0gb3B0X2V2ZW50VHlwZSBUaGUgdHlwZSB0aGlzIGV2ZW50IGlzIGJlaW5nIGhhbmRsZWQgYXMgYnkganNhY3Rpb24uXG4gKiAgICAgRS5nLiBhIGtleXByZXNzIGlzIGhhbmRsZWQgYXMgY2xpY2sgaW4gc29tZSBjYXNlcy5cbiAqIEByZXR1cm4gVGhlIGV2ZW50IG9iamVjdC5cbiAqIEBzdXBwcmVzcyB7c3RyaWN0TWlzc2luZ1Byb3BlcnRpZXN9IFR3byBkZWZpbml0aW9ucyBvZiBpbml0S2V5Ym9hcmRFdmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUtleWJvYXJkRXZlbnQob3JpZ2luYWw6IEV2ZW50LCBvcHRfZXZlbnRUeXBlPzogc3RyaW5nKTogRXZlbnQge1xuICBsZXQgZXZlbnQ7XG4gIGNvbnN0IGtleWJvYXJkRXZlbnQgPSBvcmlnaW5hbCBhcyBLZXlib2FyZEV2ZW50O1xuICBpZiAoZG9jdW1lbnQuY3JlYXRlRXZlbnQpIHtcbiAgICAvLyBFdmVudCBjcmVhdGlvbiBhcyBwZXIgVzNDIGV2ZW50IG1vZGVsIHNwZWNpZmljYXRpb24uICBUaGlzIGNvZGVwYXRoXG4gICAgLy8gaXMgdXNlZCBieSBtb3N0IG5vbi1JRSBicm93c2VycyBhbmQgYWxzbyBieSBJRSA5IGFuZCBsYXRlci5cbiAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdLZXlib2FyZEV2ZW50Jyk7XG4gICAgaWYgKGV2ZW50LmluaXRLZXlib2FyZEV2ZW50KSB7XG4gICAgICBpZiAoanNhY3Rpb25FdmVudC5pc0llKSB7XG4gICAgICAgIC8vIElFOStcbiAgICAgICAgLy8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcHJldmlvdXMtdmVyc2lvbnMvd2luZG93cy9pbnRlcm5ldC1leHBsb3Jlci9pZS1kZXZlbG9wZXIvcGxhdGZvcm0tYXBpcy9mZjk3NTk0NSh2PXZzLjg1KVxuICAgICAgICBjb25zdCBtb2RpZmllcnMgPSBjcmVhdGVLZXlib2FyZE1vZGlmaWVyc0xpc3QoXG4gICAgICAgICAga2V5Ym9hcmRFdmVudC5hbHRLZXksXG4gICAgICAgICAga2V5Ym9hcmRFdmVudC5jdHJsS2V5LFxuICAgICAgICAgIGtleWJvYXJkRXZlbnQubWV0YUtleSxcbiAgICAgICAgICBrZXlib2FyZEV2ZW50LnNoaWZ0S2V5LFxuICAgICAgICApO1xuICAgICAgICBldmVudC5pbml0S2V5Ym9hcmRFdmVudChcbiAgICAgICAgICBvcHRfZXZlbnRUeXBlIHx8IGtleWJvYXJkRXZlbnQudHlwZSxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgd2luZG93LFxuICAgICAgICAgIGtleWJvYXJkRXZlbnQua2V5LFxuICAgICAgICAgIGtleWJvYXJkRXZlbnQubG9jYXRpb24sXG4gICAgICAgICAgLy8gU3VwcHJlc3NpbmcgZXJyb3JzIGZvciB0cy1taWdyYXRpb24uXG4gICAgICAgICAgLy8gICBUUzIzNDU6IEFyZ3VtZW50IG9mIHR5cGUgJ3N0cmluZycgaXMgbm90IGFzc2lnbmFibGUgdG9cbiAgICAgICAgICAvLyAgIHBhcmFtZXRlciBvZiB0eXBlICdib29sZWFuIHwgdW5kZWZpbmVkJy5cbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgbW9kaWZpZXJzLFxuICAgICAgICAgIGtleWJvYXJkRXZlbnQucmVwZWF0LFxuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgVGhpcyBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAga2V5Ym9hcmRFdmVudC5sb2NhbGUsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXM0MgRE9NIExldmVsIDMgRXZlbnRzIG1vZGVsLlxuICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvdWlldmVudHMvI2lkbC1pbnRlcmZhY2UtS2V5Ym9hcmRFdmVudC1pbml0aWFsaXplcnNcbiAgICAgICAgZXZlbnQuaW5pdEtleWJvYXJkRXZlbnQoXG4gICAgICAgICAgb3B0X2V2ZW50VHlwZSB8fCBvcmlnaW5hbC50eXBlLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICB3aW5kb3csXG4gICAgICAgICAga2V5Ym9hcmRFdmVudC5rZXksXG4gICAgICAgICAga2V5Ym9hcmRFdmVudC5sb2NhdGlvbixcbiAgICAgICAgICBrZXlib2FyZEV2ZW50LmN0cmxLZXksXG4gICAgICAgICAga2V5Ym9hcmRFdmVudC5hbHRLZXksXG4gICAgICAgICAga2V5Ym9hcmRFdmVudC5zaGlmdEtleSxcbiAgICAgICAgICBrZXlib2FyZEV2ZW50Lm1ldGFLZXksXG4gICAgICAgICk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShldmVudCwgJ3JlcGVhdCcsIHtcbiAgICAgICAgICBnZXQ6ICgpID0+IChvcmlnaW5hbCBhcyBLZXlib2FyZEV2ZW50KS5yZXBlYXQsXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEFkZCBtaXNzaW5nICdsb2NhbGUnIHdoaWNoIGlzIG5vdCBwYXJ0IG9mIHRoZSBzcGVjLlxuICAgICAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xNjg5NzFcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV2ZW50LCAnbG9jYWxlJywge1xuICAgICAgICAgIC8vIFN1cHByZXNzaW5nIGVycm9ycyBmb3IgdHMtbWlncmF0aW9uLlxuICAgICAgICAgIC8vICAgVFMyMzM5OiBQcm9wZXJ0eSAnbG9jYWxlJyBkb2VzIG5vdCBleGlzdCBvbiB0eXBlICdFdmVudCcuXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGdldDogKCkgPT4gb3JpZ2luYWwubG9jYWxlLFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBBcHBsZSBXZWJLaXQgaGFzIGEgbm9uLXN0YW5kYXJkIGFsdEdyYXBoS2V5IHRoYXQgaXMgbm90IGltcGxlbWVudGVkXG4gICAgICAgIC8vIGhlcmUuXG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL3dlYmtpdGpzL2tleWJvYXJkZXZlbnQvMTYzMzc1My1pbml0a2V5Ym9hcmRldmVudFxuICAgICAgfVxuICAgICAgLy8gQmxpbmsgYW5kIFdlYmtpdCBoYWQgYSBidWcgdGhhdCBjYXVzZXMgdGhlIGBjaGFyQ29kZWAsIGBrZXlDb2RlYCwgYW5kXG4gICAgICAvLyBgd2hpY2hgIHByb3BlcnRpZXMgdG8gYWx3YXlzIGJlIHVuc2V0IHdoZW4gc3ludGhlc2l6aW5nIGEga2V5Ym9hcmRcbiAgICAgIC8vIGV2ZW50LiBEZXRhaWxzIGF0OiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY3MzUuIFdpdGhcbiAgICAgIC8vIHRoZXNlIHByb3BlcnRpZXMgYmVpbmcgZGVwcmVjYXRlZCwgdGhlIGJ1ZyBoYXMgZXZvbHZlZCBpbnRvIGFmZmVjdGluZ1xuICAgICAgLy8gdGhlIGBrZXlgIHByb3BlcnR5LiBXZSB3b3JrIGFyb3VuZCBpdCBieSByZWRlZmluaW5nIHRoZSBga2V5YCBhbmRcbiAgICAgIC8vIGRlcHJlY2F0ZWQgcHJvcGVydGllczsgYSBzaW1wbGUgYXNzaWdubWVudCBoZXJlIHdvdWxkIGZhaWwgYmVjYXVzZSB0aGVcbiAgICAgIC8vIG5hdGl2ZSBwcm9wZXJ0aWVzIGFyZSByZWFkb25seS5cbiAgICAgIGlmIChqc2FjdGlvbkV2ZW50LmlzV2ViS2l0KSB7XG4gICAgICAgIGlmIChrZXlib2FyZEV2ZW50LmtleSAmJiBldmVudC5rZXkgPT09ICcnKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV2ZW50LCAna2V5Jywge1xuICAgICAgICAgICAgZ2V0OiAoKSA9PiBrZXlib2FyZEV2ZW50LmtleSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFJlLWltcGxlbWVudCB0aGUgZGVwcmVjYXRlZCBgY2hhckNvZGVgLCBga2V5Q29kZWAgYW5kIGB3aGljaGAgd2hpY2hcbiAgICAgIC8vIGFyZSBhbHNvIGFuIGlzc3VlIG9uIElFOSsuXG4gICAgICBpZiAoanNhY3Rpb25FdmVudC5pc1dlYktpdCB8fCBqc2FjdGlvbkV2ZW50LmlzSWUgfHwganNhY3Rpb25FdmVudC5pc0dlY2tvKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShldmVudCwgJ2NoYXJDb2RlJywge1xuICAgICAgICAgIGdldDogKCkgPT4gKG9yaWdpbmFsIGFzIEtleWJvYXJkRXZlbnQpLmNoYXJDb2RlLFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBrZXlDb2RlR2V0dGVyID0gKCkgPT4gKG9yaWdpbmFsIGFzIEtleWJvYXJkRXZlbnQpLmtleUNvZGU7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShldmVudCwgJ2tleUNvZGUnLCB7XG4gICAgICAgICAgZ2V0OiBrZXlDb2RlR2V0dGVyLFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXZlbnQsICd3aGljaCcsIHtcbiAgICAgICAgICBnZXQ6IGtleUNvZGVHZXR0ZXIsXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEdlY2tvIG9ubHkgc3VwcG9ydHMgYW4gb2xkZXIvZGVwcmVjYXRlZCB2ZXJzaW9uIGZyb20gRE9NIExldmVsIDIuIFNlZVxuICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQvaW5pdEtleUV2ZW50XG4gICAgICAvLyBmb3IgZGV0YWlscy5cbiAgICAgIC8vIEB0cy1pZ25vcmUgZGl0dG9cbiAgICAgIGV2ZW50LmluaXRLZXlFdmVudChcbiAgICAgICAgb3B0X2V2ZW50VHlwZSB8fCBvcmlnaW5hbC50eXBlLFxuICAgICAgICB0cnVlLFxuICAgICAgICB0cnVlLFxuICAgICAgICB3aW5kb3csXG4gICAgICAgIC8vIFN1cHByZXNzaW5nIGVycm9ycyBmb3IgdHMtbWlncmF0aW9uLlxuICAgICAgICAvLyAgIFRTMjMzOTogUHJvcGVydHkgJ2N0cmxLZXknIGRvZXMgbm90IGV4aXN0IG9uIHR5cGUgJ0V2ZW50Jy5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBvcmlnaW5hbC5jdHJsS2V5LFxuICAgICAgICAvLyBTdXBwcmVzc2luZyBlcnJvcnMgZm9yIHRzLW1pZ3JhdGlvbi5cbiAgICAgICAgLy8gICBUUzIzMzk6IFByb3BlcnR5ICdhbHRLZXknIGRvZXMgbm90IGV4aXN0IG9uIHR5cGUgJ0V2ZW50Jy5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBvcmlnaW5hbC5hbHRLZXksXG4gICAgICAgIC8vIFN1cHByZXNzaW5nIGVycm9ycyBmb3IgdHMtbWlncmF0aW9uLlxuICAgICAgICAvLyAgIFRTMjMzOTogUHJvcGVydHkgJ3NoaWZ0S2V5JyBkb2VzIG5vdCBleGlzdCBvbiB0eXBlICdFdmVudCcuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgb3JpZ2luYWwuc2hpZnRLZXksXG4gICAgICAgIC8vIFN1cHByZXNzaW5nIGVycm9ycyBmb3IgdHMtbWlncmF0aW9uLlxuICAgICAgICAvLyAgIFRTMjMzOTogUHJvcGVydHkgJ21ldGFLZXknIGRvZXMgbm90IGV4aXN0IG9uIHR5cGUgJ0V2ZW50Jy5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBvcmlnaW5hbC5tZXRhS2V5LFxuICAgICAgICAvLyBTdXBwcmVzc2luZyBlcnJvcnMgZm9yIHRzLW1pZ3JhdGlvbi5cbiAgICAgICAgLy8gICBUUzIzMzk6IFByb3BlcnR5ICdrZXlDb2RlJyBkb2VzIG5vdCBleGlzdCBvbiB0eXBlICdFdmVudCcuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgb3JpZ2luYWwua2V5Q29kZSxcbiAgICAgICAgLy8gU3VwcHJlc3NpbmcgZXJyb3JzIGZvciB0cy1taWdyYXRpb24uXG4gICAgICAgIC8vICAgVFMyMzM5OiBQcm9wZXJ0eSAnY2hhckNvZGUnIGRvZXMgbm90IGV4aXN0IG9uIHR5cGUgJ0V2ZW50Jy5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBvcmlnaW5hbC5jaGFyQ29kZSxcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIE9sZGVyIHZlcnNpb25zIG9mIElFICh1cCB0byB2ZXJzaW9uIDgpIGRvIG5vdCBzdXBwb3J0IHRoZVxuICAgIC8vIFczQyBldmVudCBtb2RlbC4gVXNlIHRoZSBJRSBzcGVjaWZpYyBmdW5jdGlvbiBpbnN0ZWFkLlxuICAgIC8vIFN1cHByZXNzaW5nIGVycm9ycyBmb3IgdHMtbWlncmF0aW9uLlxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50T2JqZWN0KCk7XG4gICAgZXZlbnQudHlwZSA9IG9wdF9ldmVudFR5cGUgfHwgb3JpZ2luYWwudHlwZTtcbiAgICBjb25zdCBvcmlnaW5hbEtleWJvYXJkRXZlbnQgPSBvcmlnaW5hbCBhcyBLZXlib2FyZEV2ZW50O1xuICAgIGV2ZW50LnJlcGVhdCA9IG9yaWdpbmFsS2V5Ym9hcmRFdmVudC5yZXBlYXQ7XG4gICAgZXZlbnQuY3RybEtleSA9IG9yaWdpbmFsS2V5Ym9hcmRFdmVudC5jdHJsS2V5O1xuICAgIGV2ZW50LmFsdEtleSA9IG9yaWdpbmFsS2V5Ym9hcmRFdmVudC5hbHRLZXk7XG4gICAgZXZlbnQuc2hpZnRLZXkgPSBvcmlnaW5hbEtleWJvYXJkRXZlbnQuc2hpZnRLZXk7XG4gICAgZXZlbnQubWV0YUtleSA9IG9yaWdpbmFsS2V5Ym9hcmRFdmVudC5tZXRhS2V5O1xuICAgIGV2ZW50LmtleSA9IG9yaWdpbmFsS2V5Ym9hcmRFdmVudC5rZXk7XG4gICAgZXZlbnQua2V5Q29kZSA9IG9yaWdpbmFsS2V5Ym9hcmRFdmVudC5rZXlDb2RlO1xuICAgIGV2ZW50LmNoYXJDb2RlID0gb3JpZ2luYWxLZXlib2FyZEV2ZW50LmNoYXJDb2RlO1xuICB9XG4gIGV2ZW50Lm9yaWdpbmFsVGltZXN0YW1wID0gb3JpZ2luYWwudGltZVN0YW1wO1xuICByZXR1cm4gZXZlbnQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1vdXNlIGV2ZW50IG9iamVjdCBmb3IgcmVwbGF5aW5nIHRocm91Z2ggdGhlIERPTS5cbiAqIEBwYXJhbSBvcmlnaW5hbCBUaGUgZXZlbnQgdG8gY3JlYXRlIGEgbmV3IGV2ZW50IGZyb20uXG4gKiBAcGFyYW0gb3B0X2V2ZW50VHlwZSBUaGUgdHlwZSB0aGlzIGV2ZW50IGlzIGJlaW5nIGhhbmRsZWQgYXMgYnkganNhY3Rpb24uXG4gKiAgICAgRS5nLiBhIGtleXByZXNzIGlzIGhhbmRsZWQgYXMgY2xpY2sgaW4gc29tZSBjYXNlcy5cbiAqIEByZXR1cm4gVGhlIGV2ZW50IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vdXNlRXZlbnQob3JpZ2luYWw6IEV2ZW50LCBvcHRfZXZlbnRUeXBlPzogc3RyaW5nKTogTW91c2VFdmVudCB7XG4gIGxldCBldmVudDtcbiAgY29uc3Qgb3JpZ2luYWxNb3VzZUV2ZW50ID0gb3JpZ2luYWwgYXMgTW91c2VFdmVudDtcbiAgaWYgKGRvY3VtZW50LmNyZWF0ZUV2ZW50KSB7XG4gICAgLy8gRXZlbnQgY3JlYXRpb24gYXMgcGVyIFczQyBldmVudCBtb2RlbCBzcGVjaWZpY2F0aW9uLiAgVGhpcyBjb2RlcGF0aFxuICAgIC8vIGlzIHVzZWQgYnkgbW9zdCBub24tSUUgYnJvd3NlcnMgYW5kIGFsc28gYnkgSUUgOSBhbmQgbGF0ZXIuXG4gICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudCcpO1xuICAgIC8vIE9uIElFIGFuZCBPcGVyYSA8IDEyLCB3ZSBtdXN0IHByb3ZpZGUgbm9uLXVuZGVmaW5lZCB2YWx1ZXMgdG9cbiAgICAvLyBpbml0TW91c2VFdmVudCwgb3RoZXJ3aXNlIGl0IHdpbGwgZmFpbC5cbiAgICBldmVudC5pbml0TW91c2VFdmVudChcbiAgICAgIG9wdF9ldmVudFR5cGUgfHwgb3JpZ2luYWwudHlwZSxcbiAgICAgIHRydWUsIC8vIGNhbkJ1YmJsZVxuICAgICAgdHJ1ZSwgLy8gY2FuY2VsYWJsZVxuICAgICAgd2luZG93LFxuICAgICAgKG9yaWdpbmFsIGFzIEN1c3RvbUV2ZW50KS5kZXRhaWwgfHwgMSxcbiAgICAgIG9yaWdpbmFsTW91c2VFdmVudC5zY3JlZW5YIHx8IDAsXG4gICAgICBvcmlnaW5hbE1vdXNlRXZlbnQuc2NyZWVuWSB8fCAwLFxuICAgICAgb3JpZ2luYWxNb3VzZUV2ZW50LmNsaWVudFggfHwgMCxcbiAgICAgIG9yaWdpbmFsTW91c2VFdmVudC5jbGllbnRZIHx8IDAsXG4gICAgICBvcmlnaW5hbE1vdXNlRXZlbnQuY3RybEtleSB8fCBmYWxzZSxcbiAgICAgIG9yaWdpbmFsTW91c2VFdmVudC5hbHRLZXkgfHwgZmFsc2UsXG4gICAgICBvcmlnaW5hbE1vdXNlRXZlbnQuc2hpZnRLZXkgfHwgZmFsc2UsXG4gICAgICBvcmlnaW5hbE1vdXNlRXZlbnQubWV0YUtleSB8fCBmYWxzZSxcbiAgICAgIG9yaWdpbmFsTW91c2VFdmVudC5idXR0b24gfHwgMCxcbiAgICAgIG9yaWdpbmFsTW91c2VFdmVudC5yZWxhdGVkVGFyZ2V0IHx8IG51bGwsXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBPbGRlciB2ZXJzaW9ucyBvZiBJRSAodXAgdG8gdmVyc2lvbiA4KSBkbyBub3Qgc3VwcG9ydCB0aGVcbiAgICAvLyBXM0MgZXZlbnQgbW9kZWwuIFVzZSB0aGUgSUUgc3BlY2lmaWMgZnVuY3Rpb24gaW5zdGVhZC5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCgpO1xuICAgIGV2ZW50LnR5cGUgPSBvcHRfZXZlbnRUeXBlIHx8IG9yaWdpbmFsLnR5cGU7XG4gICAgZXZlbnQuY2xpZW50WCA9IG9yaWdpbmFsTW91c2VFdmVudC5jbGllbnRYO1xuICAgIGV2ZW50LmNsaWVudFkgPSBvcmlnaW5hbE1vdXNlRXZlbnQuY2xpZW50WTtcbiAgICBldmVudC5idXR0b24gPSBvcmlnaW5hbE1vdXNlRXZlbnQuYnV0dG9uO1xuICAgIGV2ZW50LmRldGFpbCA9IChvcmlnaW5hbCBhcyBDdXN0b21FdmVudCkuZGV0YWlsO1xuICAgIGV2ZW50LmN0cmxLZXkgPSBvcmlnaW5hbE1vdXNlRXZlbnQuY3RybEtleTtcbiAgICBldmVudC5hbHRLZXkgPSBvcmlnaW5hbE1vdXNlRXZlbnQuYWx0S2V5O1xuICAgIGV2ZW50LnNoaWZ0S2V5ID0gb3JpZ2luYWxNb3VzZUV2ZW50LnNoaWZ0S2V5O1xuICAgIGV2ZW50Lm1ldGFLZXkgPSBvcmlnaW5hbE1vdXNlRXZlbnQubWV0YUtleTtcbiAgfVxuICBldmVudC5vcmlnaW5hbFRpbWVzdGFtcCA9IG9yaWdpbmFsLnRpbWVTdGFtcDtcbiAgcmV0dXJuIGV2ZW50O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBnZW5lcmljIGV2ZW50IG9iamVjdCBmb3IgcmVwbGF5aW5nIHRocm91Z2ggdGhlIERPTS5cbiAqIEBwYXJhbSBvcmlnaW5hbCBUaGUgZXZlbnQgdG8gY3JlYXRlIGEgbmV3IGV2ZW50IGZyb20uXG4gKiBAcGFyYW0gb3B0X2V2ZW50VHlwZSBUaGUgdHlwZSB0aGlzIGV2ZW50IGlzIGJlaW5nIGhhbmRsZWQgYXMgYnkganNhY3Rpb24uXG4gKiAgICAgRS5nLiBhIGtleXByZXNzIGlzIGhhbmRsZWQgYXMgY2xpY2sgaW4gc29tZSBjYXNlcy5cbiAqIEByZXR1cm4gVGhlIGV2ZW50IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlR2VuZXJpY0V2ZW50KG9yaWdpbmFsOiBFdmVudCwgb3B0X2V2ZW50VHlwZT86IHN0cmluZyk6IEV2ZW50IHtcbiAgbGV0IGV2ZW50O1xuICBpZiAoZG9jdW1lbnQuY3JlYXRlRXZlbnQpIHtcbiAgICAvLyBFdmVudCBjcmVhdGlvbiBhcyBwZXIgVzNDIGV2ZW50IG1vZGVsIHNwZWNpZmljYXRpb24uICBUaGlzIGNvZGVwYXRoXG4gICAgLy8gaXMgdXNlZCBieSBtb3N0IG5vbi1JRSBicm93c2VycyBhbmQgYWxzbyBieSBJRSA5IGFuZCBsYXRlci5cbiAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIGV2ZW50LmluaXRFdmVudChvcHRfZXZlbnRUeXBlIHx8IG9yaWdpbmFsLnR5cGUsIHRydWUsIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIC8vIE9sZGVyIHZlcnNpb25zIG9mIElFICh1cCB0byB2ZXJzaW9uIDgpIGRvIG5vdCBzdXBwb3J0IHRoZVxuICAgIC8vIFczQyBldmVudCBtb2RlbC4gVXNlIHRoZSBJRSBzcGVjaWZpYyBmdW5jdGlvbiBpbnN0ZWFkLlxuICAgIC8vIFN1cHByZXNzaW5nIGVycm9ycyBmb3IgdHMtbWlncmF0aW9uLlxuICAgIC8vICAgVFMyMzM5OiBQcm9wZXJ0eSAnY3JlYXRlRXZlbnRPYmplY3QnIGRvZXMgbm90IGV4aXN0IG9uIHR5cGUgJ0RvY3VtZW50Jy5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCgpO1xuICAgIGV2ZW50LnR5cGUgPSBvcHRfZXZlbnRUeXBlIHx8IG9yaWdpbmFsLnR5cGU7XG4gIH1cbiAgZXZlbnQub3JpZ2luYWxUaW1lc3RhbXAgPSBvcmlnaW5hbC50aW1lU3RhbXA7XG4gIHJldHVybiBldmVudDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGV2ZW50IG9iamVjdCBmb3IgcmVwbGF5aW5nIHRocm91Z2ggdGhlIERPTS5cbiAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgdmlzaWJsZSBqdXN0IGZvciB0ZXN0aW5nLiAgUGxlYXNlIGRvbid0IHVzZVxuICogaXQgb3V0c2lkZSBKc0FjdGlvbiBpbnRlcm5hbCB0ZXN0aW5nLlxuICogVE9ETzogQWRkIHN1cHBvcnQgZm9yIEZvY3VzRXZlbnQgYW5kIFdoZWVsRXZlbnQuXG4gKiBAcGFyYW0gYmFzZSBUaGUgZXZlbnQgdG8gY3JlYXRlIGEgbmV3IGV2ZW50IGZyb20uXG4gKiBAcGFyYW0gb3B0X2V2ZW50VHlwZSBUaGUgdHlwZSB0aGlzIGV2ZW50IGlzIGJlaW5nIGhhbmRsZWQgYXMgYnkganNhY3Rpb24uXG4gKiAgICAgRS5nLiBhIGtleXByZXNzIGlzIGhhbmRsZWQgYXMgY2xpY2sgaW4gc29tZSBjYXNlcy5cbiAqIEByZXR1cm4gVGhlIGV2ZW50IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50KGJhc2U6IHVua25vd24sIG9wdF9ldmVudFR5cGU/OiBzdHJpbmcpOiBFdmVudCB7XG4gIGNvbnN0IG9yaWdpbmFsID0gYmFzZSBhcyBFdmVudDtcbiAgbGV0IGV2ZW50O1xuICBsZXQgZXZlbnRUeXBlO1xuICBpZiAob3JpZ2luYWwudHlwZSA9PT0gRXZlbnRUeXBlLkNVU1RPTSkge1xuICAgIGV2ZW50VHlwZSA9IEV2ZW50VHlwZS5DVVNUT007XG4gIH0gZWxzZSB7XG4gICAgZXZlbnRUeXBlID0gb3B0X2V2ZW50VHlwZSB8fCBvcmlnaW5hbC50eXBlO1xuICB9XG5cbiAgaWYgKGlzS2V5Ym9hcmRFdmVudChldmVudFR5cGUpKSB7XG4gICAgZXZlbnQgPSBjcmVhdGVLZXlib2FyZEV2ZW50KG9yaWdpbmFsLCBvcHRfZXZlbnRUeXBlKTtcbiAgfSBlbHNlIGlmIChpc01vdXNlRXZlbnQoZXZlbnRUeXBlKSkge1xuICAgIGV2ZW50ID0gY3JlYXRlTW91c2VFdmVudChvcmlnaW5hbCwgb3B0X2V2ZW50VHlwZSk7XG4gIH0gZWxzZSBpZiAoaXNVaUV2ZW50KGV2ZW50VHlwZSkpIHtcbiAgICBldmVudCA9IGNyZWF0ZVVpRXZlbnQob3JpZ2luYWwsIG9wdF9ldmVudFR5cGUpO1xuICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLkNVU1RPTSkge1xuICAgIGV2ZW50ID0gY3JlYXRlQ3VzdG9tRXZlbnQoXG4gICAgICBvcHRfZXZlbnRUeXBlISxcbiAgICAgIChvcmlnaW5hbCBhcyBDdXN0b21FdmVudClbJ2RldGFpbCddWydkYXRhJ10sXG4gICAgICAob3JpZ2luYWwgYXMgQ3VzdG9tRXZlbnQpWydkZXRhaWwnXVsndHJpZ2dlcmluZ0V2ZW50J10sXG4gICAgKTtcbiAgICAoZXZlbnQgYXMge29yaWdpbmFsVGltZXN0YW1wPzogbnVtYmVyIHwgbnVsbH0gfCBudWxsKSEub3JpZ2luYWxUaW1lc3RhbXAgPSBvcmlnaW5hbC50aW1lU3RhbXA7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBlbnN1cmVzIHdlIGRvbid0IHNlbmQgYW4gdW5kZWZpbmVkIGV2ZW50IG9iamVjdCB0byB0aGUgcmVwbGF5ZXIuXG4gICAgZXZlbnQgPSBjcmVhdGVHZW5lcmljRXZlbnQob3JpZ2luYWwsIG9wdF9ldmVudFR5cGUpO1xuICB9XG4gIHJldHVybiBldmVudDtcbn1cblxuLyoqXG4gKiBTZW5kcyBhbiBldmVudCBmb3IgcmVwbGF5IHRvIHRoZSBET00uXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgZm9yIHRoZSBldmVudC5cbiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgb2JqZWN0LlxuICogQHJldHVybiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBldmVudCByZXBsYXksIGkuZS4sIHdoZXRoZXIgcHJldmVudERlZmF1bHQoKVxuICogICAgIHdhcyBjYWxsZWQgb24gaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyRXZlbnQodGFyZ2V0OiBFdmVudFRhcmdldCwgZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XG4gIGlmICh0YXJnZXQuZGlzcGF0Y2hFdmVudCkge1xuICAgIHJldHVybiB0YXJnZXQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gU3VwcHJlc3NpbmcgZXJyb3JzIGZvciB0cy1taWdyYXRpb24uXG4gICAgLy8gICBUUzIzMzk6IFByb3BlcnR5ICdmaXJlRXZlbnQnIGRvZXMgbm90IGV4aXN0IG9uIHR5cGUgJ0VsZW1lbnQnLlxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gKHRhcmdldCBhcyBFbGVtZW50KS5maXJlRXZlbnQoJ29uJyArIGV2ZW50LnR5cGUsIGV2ZW50KTtcbiAgfVxufVxuXG4vKiogRG8gbm90IHVzZSBvdXRpc2lkZSBvZiB0ZXN0aW5nLiAqL1xuZXhwb3J0IGNvbnN0IHRlc3RpbmcgPSB7XG4gIGNyZWF0ZUtleWJvYXJkTW9kaWZpZXJzTGlzdCxcbiAgY3JlYXRlR2VuZXJpY0V2ZW50LFxuICBpc0tleWJvYXJkRXZlbnQsXG4gIGlzTW91c2VFdmVudCxcbiAgaXNVaUV2ZW50LFxufTtcbiJdfQ==