appium-xcuitest-driver 4.3.3 → 4.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/commands/app-management.js +10 -22
- package/build/lib/commands/certificate.js +7 -11
- package/build/lib/commands/context.js +43 -76
- package/build/lib/commands/cookies.js +4 -9
- package/build/lib/commands/element.js +2 -5
- package/build/lib/commands/execute.js +3 -6
- package/build/lib/commands/file-movement.js +9 -7
- package/build/lib/commands/find.js +7 -11
- package/build/lib/commands/general.js +14 -26
- package/build/lib/commands/gesture.js +10 -14
- package/build/lib/commands/location.js +6 -10
- package/build/lib/commands/navigation.js +5 -8
- package/build/lib/commands/pcap.js +16 -21
- package/build/lib/commands/performance.js +12 -16
- package/build/lib/commands/proxy-helper.js +6 -11
- package/build/lib/commands/record-audio.js +18 -26
- package/build/lib/commands/recordscreen.js +14 -19
- package/build/lib/commands/screenshots.js +7 -12
- package/build/lib/commands/timeouts.js +3 -8
- package/build/lib/commands/web.js +51 -64
- package/build/lib/commands/xctest.js +8 -9
- package/build/lib/driver.js +80 -126
- package/lib/commands/app-management.js +9 -10
- package/lib/commands/certificate.js +6 -7
- package/lib/commands/context.js +42 -43
- package/lib/commands/cookies.js +3 -4
- package/lib/commands/element.js +1 -2
- package/lib/commands/execute.js +2 -3
- package/lib/commands/file-movement.js +10 -9
- package/lib/commands/find.js +7 -8
- package/lib/commands/general.js +13 -14
- package/lib/commands/gesture.js +9 -9
- package/lib/commands/location.js +5 -6
- package/lib/commands/navigation.js +4 -5
- package/lib/commands/pcap.js +15 -13
- package/lib/commands/performance.js +11 -12
- package/lib/commands/proxy-helper.js +5 -6
- package/lib/commands/record-audio.js +17 -17
- package/lib/commands/recordscreen.js +13 -13
- package/lib/commands/screenshots.js +6 -7
- package/lib/commands/timeouts.js +2 -4
- package/lib/commands/web.js +45 -39
- package/lib/commands/xctest.js +8 -7
- package/lib/driver.js +79 -80
- package/npm-shrinkwrap.json +16 -11
- package/package.json +2 -2
|
@@ -15,8 +15,6 @@ var _baseDriver = require("@appium/base-driver");
|
|
|
15
15
|
|
|
16
16
|
var _support = require("@appium/support");
|
|
17
17
|
|
|
18
|
-
var _logger = _interopRequireDefault(require("../logger"));
|
|
19
|
-
|
|
20
18
|
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
21
19
|
|
|
22
20
|
var _iosPerformanceLog = _interopRequireDefault(require("../device-log/ios-performance-log"));
|
|
@@ -41,8 +39,7 @@ commands.getCurrentContext = async function getCurrentContext() {
|
|
|
41
39
|
};
|
|
42
40
|
|
|
43
41
|
extensions.getContextsAndViews = async function getContextsAndViews(useUrl = true) {
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
this.log.debug('Retrieving contexts and views');
|
|
46
43
|
let webviews = await this.listWebFrames(useUrl);
|
|
47
44
|
let ctxs = [{
|
|
48
45
|
id: NATIVE_WIN,
|
|
@@ -103,7 +100,7 @@ extensions.typeAndNavToUrl = async function typeAndNavToUrl() {
|
|
|
103
100
|
await this.nativeTap(el.ELEMENT);
|
|
104
101
|
} catch (err) {
|
|
105
102
|
if (_lodash.default.includes(err.message, 'could not be tapped')) {
|
|
106
|
-
|
|
103
|
+
this.log.error('Unable to submit URL because \'Go\' button could not be tapped. ' + 'Please make sure your keyboard is toggled on.');
|
|
107
104
|
}
|
|
108
105
|
|
|
109
106
|
throw err;
|
|
@@ -117,8 +114,7 @@ extensions.typeAndNavToUrl = async function typeAndNavToUrl() {
|
|
|
117
114
|
};
|
|
118
115
|
|
|
119
116
|
extensions.navToViewThroughFavorites = async function navToViewThroughFavorites() {
|
|
120
|
-
|
|
121
|
-
|
|
117
|
+
this.log.debug('We are on iOS7+ simulator: clicking apple button to get into a webview');
|
|
122
118
|
let oldImpWait = this.implicitWaitMs;
|
|
123
119
|
this.implicitWaitMs = 7000;
|
|
124
120
|
let el;
|
|
@@ -127,9 +123,7 @@ extensions.navToViewThroughFavorites = async function navToViewThroughFavorites(
|
|
|
127
123
|
el = await this.findElement('xpath', '//XCUIElementTypeScrollView[1]/XCUIElementTypeButton[1]');
|
|
128
124
|
} catch (err) {
|
|
129
125
|
let msg = 'Could not find button to click to get into webview. ' + 'Proceeding on the assumption we have a working one.';
|
|
130
|
-
|
|
131
|
-
_logger.default.error(msg);
|
|
132
|
-
|
|
126
|
+
this.log.error(msg);
|
|
133
127
|
this.implicitWaitMs = oldImpWait;
|
|
134
128
|
return await this.navToViewWithTitle(/.*/i);
|
|
135
129
|
}
|
|
@@ -140,16 +134,14 @@ extensions.navToViewThroughFavorites = async function navToViewThroughFavorites(
|
|
|
140
134
|
await this.nativeTap(el.ELEMENT);
|
|
141
135
|
} catch (err) {
|
|
142
136
|
let msg = 'Could not click button to get into webview. ' + 'Proceeding on the assumption we have a working one.';
|
|
143
|
-
|
|
144
|
-
_logger.default.error(msg);
|
|
137
|
+
this.log.error(msg);
|
|
145
138
|
}
|
|
146
139
|
|
|
147
140
|
await this.navToViewWithTitle(/apple/i);
|
|
148
141
|
};
|
|
149
142
|
|
|
150
143
|
extensions.navToViewWithTitle = async function navToViewWithTitle(titleRegex, urlRegExp) {
|
|
151
|
-
|
|
152
|
-
|
|
144
|
+
this.log.debug('Navigating to most recently opened webview');
|
|
153
145
|
let start = Date.now();
|
|
154
146
|
let spinTime = 500;
|
|
155
147
|
|
|
@@ -165,14 +157,12 @@ extensions.navToViewWithTitle = async function navToViewWithTitle(titleRegex, ur
|
|
|
165
157
|
throw error;
|
|
166
158
|
}
|
|
167
159
|
|
|
168
|
-
|
|
160
|
+
this.log.debug('Could not navigate to webview. Retrying if possible.');
|
|
169
161
|
}
|
|
170
162
|
|
|
171
163
|
if (res) {
|
|
172
164
|
let latestWindow = res;
|
|
173
|
-
|
|
174
|
-
_logger.default.debug(`Picking webview '${latestWindow}'`);
|
|
175
|
-
|
|
165
|
+
this.log.debug(`Picking webview '${latestWindow}'`);
|
|
176
166
|
await this.setContext(latestWindow);
|
|
177
167
|
await this.remote.cancelPageLoad();
|
|
178
168
|
return;
|
|
@@ -182,7 +172,7 @@ extensions.navToViewWithTitle = async function navToViewWithTitle(titleRegex, ur
|
|
|
182
172
|
throw new Error('Could not navigate to webview; there are none!');
|
|
183
173
|
}
|
|
184
174
|
|
|
185
|
-
|
|
175
|
+
this.log.warn('Could not find any webviews yet, refreshing/retrying');
|
|
186
176
|
|
|
187
177
|
if (this.isRealDevice() || !this.opts.safari) {
|
|
188
178
|
await _bluebird.default.delay(spinTime);
|
|
@@ -192,15 +182,12 @@ extensions.navToViewWithTitle = async function navToViewWithTitle(titleRegex, ur
|
|
|
192
182
|
let element;
|
|
193
183
|
|
|
194
184
|
try {
|
|
195
|
-
|
|
196
|
-
|
|
185
|
+
this.log.debug('Finding and tapping reload button');
|
|
197
186
|
element = await this.findUIElementOrElements('accessibility id', 'ReloadButton', '', false);
|
|
198
187
|
await this.nativeTap(element.ELEMENT);
|
|
199
188
|
} catch (err) {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
_logger.default.warn('Retrying.');
|
|
203
|
-
|
|
189
|
+
this.log.warn(`Error finding and tapping reload button: ${err.message}`);
|
|
190
|
+
this.log.warn('Retrying.');
|
|
204
191
|
await _bluebird.default.delay(spinTime);
|
|
205
192
|
}
|
|
206
193
|
|
|
@@ -212,7 +199,7 @@ extensions.navToViewWithTitle = async function navToViewWithTitle(titleRegex, ur
|
|
|
212
199
|
|
|
213
200
|
helpers.stopRemote = async function stopRemote(closeWindowBeforeDisconnecting = false) {
|
|
214
201
|
if (!this.remote) {
|
|
215
|
-
|
|
202
|
+
this.log.errorAndThrow('Tried to leave a web frame but were not in one');
|
|
216
203
|
}
|
|
217
204
|
|
|
218
205
|
if (closeWindowBeforeDisconnecting) {
|
|
@@ -315,11 +302,10 @@ commands.setContext = async function setContext(name, callback, skipReadyCheck)
|
|
|
315
302
|
name = name.id;
|
|
316
303
|
}
|
|
317
304
|
|
|
318
|
-
|
|
305
|
+
this.log.debug(`Attempting to set context to '${name || NATIVE_WIN}' from '${this.curContext ? this.curContext : NATIVE_WIN}'`);
|
|
319
306
|
|
|
320
307
|
if (alreadyInContext(name, this.curContext) || alreadyInContext(_lodash.default.replace(name, WEBVIEW_BASE, ''), this.curContext)) {
|
|
321
|
-
|
|
322
|
-
|
|
308
|
+
this.log.debug(`Already in '${name || NATIVE_WIN}' context. Doing nothing.`);
|
|
323
309
|
return;
|
|
324
310
|
}
|
|
325
311
|
|
|
@@ -358,8 +344,7 @@ commands.setContext = async function setContext(name, callback, skipReadyCheck)
|
|
|
358
344
|
}
|
|
359
345
|
|
|
360
346
|
if (this.opts.enablePerformanceLogging && this.remote) {
|
|
361
|
-
|
|
362
|
-
|
|
347
|
+
this.log.debug(`Starting performance log on '${this.curContext}'`);
|
|
363
348
|
this.logs.performance = new _iosPerformanceLog.default(this.remote);
|
|
364
349
|
await this.logs.performance.startCapture();
|
|
365
350
|
}
|
|
@@ -380,7 +365,7 @@ extensions.connectToRemoteDebugger = async function connectToRemoteDebugger() {
|
|
|
380
365
|
this.remote.on(_appiumRemoteDebugger.RemoteDebugger.EVENT_PAGE_CHANGE, this.onPageChange.bind(this));
|
|
381
366
|
this.remote.on(_appiumRemoteDebugger.RemoteDebugger.EVENT_FRAMES_DETACHED, () => {
|
|
382
367
|
if (!_lodash.default.isEmpty(this.curWebFrames)) {
|
|
383
|
-
|
|
368
|
+
this.log.debug(`Clearing ${_support.util.pluralize('frame', this.curWebFrames.length, true)}: ${this.curWebFrames.join(', ')}`);
|
|
384
369
|
}
|
|
385
370
|
|
|
386
371
|
this.curWebFrames = [];
|
|
@@ -390,9 +375,7 @@ extensions.connectToRemoteDebugger = async function connectToRemoteDebugger() {
|
|
|
390
375
|
|
|
391
376
|
extensions.listWebFrames = async function listWebFrames(useUrl = true) {
|
|
392
377
|
useUrl = useUrl && !this.isRealDevice() && !!this.getCurrentUrl();
|
|
393
|
-
|
|
394
|
-
_logger.default.debug(`Selecting by url: ${useUrl} ${useUrl ? `(expected url: '${this.getCurrentUrl()}')` : ''}`);
|
|
395
|
-
|
|
378
|
+
this.log.debug(`Selecting by url: ${useUrl} ${useUrl ? `(expected url: '${this.getCurrentUrl()}')` : ''}`);
|
|
396
379
|
const currentUrl = useUrl ? this.getCurrentUrl() : undefined;
|
|
397
380
|
let pageArray = [];
|
|
398
381
|
|
|
@@ -400,8 +383,7 @@ extensions.listWebFrames = async function listWebFrames(useUrl = true) {
|
|
|
400
383
|
try {
|
|
401
384
|
return await this.remote.selectApp(currentUrl, this.opts.webviewConnectRetries, this.opts.ignoreAboutBlankUrl);
|
|
402
385
|
} catch (err) {
|
|
403
|
-
|
|
404
|
-
|
|
386
|
+
this.log.debug(`No available web pages: ${err.message}`);
|
|
405
387
|
return [];
|
|
406
388
|
}
|
|
407
389
|
};
|
|
@@ -425,21 +407,20 @@ extensions.listWebFrames = async function listWebFrames(useUrl = true) {
|
|
|
425
407
|
});
|
|
426
408
|
} catch (err) {
|
|
427
409
|
if (err.message !== alertErrorMsg) {
|
|
428
|
-
|
|
410
|
+
this.log.errorAndThrow(err);
|
|
429
411
|
}
|
|
430
412
|
}
|
|
431
413
|
}
|
|
432
414
|
|
|
433
415
|
if (pageArray.length === 0) {
|
|
434
|
-
|
|
416
|
+
this.log.debug('No web frames found.');
|
|
435
417
|
}
|
|
436
418
|
|
|
437
419
|
return pageArray;
|
|
438
420
|
};
|
|
439
421
|
|
|
440
422
|
commands.getContexts = async function getContexts() {
|
|
441
|
-
|
|
442
|
-
|
|
423
|
+
this.log.debug('Getting list of available contexts');
|
|
443
424
|
const contexts = await this.getContextsAndViews(false);
|
|
444
425
|
const mapFn = this.opts.fullContextList ? function (context) {
|
|
445
426
|
return {
|
|
@@ -476,12 +457,11 @@ extensions.mobileGetContexts = async function mobileGetContexts(opts = {}) {
|
|
|
476
457
|
contexts = await this.getContexts();
|
|
477
458
|
|
|
478
459
|
if (contexts.length >= 2) {
|
|
479
|
-
|
|
480
|
-
|
|
460
|
+
this.log.debug(`Found webview context after ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);
|
|
481
461
|
return contexts;
|
|
482
462
|
}
|
|
483
463
|
|
|
484
|
-
|
|
464
|
+
this.log.debug(`No webviews found in ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`);
|
|
485
465
|
} while (timer.getDuration().asMilliSeconds < waitForWebviewMs);
|
|
486
466
|
|
|
487
467
|
return contexts;
|
|
@@ -503,8 +483,7 @@ commands.getWindowHandle = async function getWindowHandle() {
|
|
|
503
483
|
throw new _baseDriver.errors.NotImplementedError();
|
|
504
484
|
}
|
|
505
485
|
|
|
506
|
-
|
|
507
|
-
|
|
486
|
+
this.log.debug(`Getting current window handle`);
|
|
508
487
|
return this.curContext;
|
|
509
488
|
};
|
|
510
489
|
|
|
@@ -513,24 +492,21 @@ commands.getWindowHandles = async function getWindowHandles() {
|
|
|
513
492
|
throw new _baseDriver.errors.NotImplementedError();
|
|
514
493
|
}
|
|
515
494
|
|
|
516
|
-
|
|
517
|
-
|
|
495
|
+
this.log.debug('Getting list of available window handles');
|
|
518
496
|
const contexts = await this.getContextsAndViews(false);
|
|
519
497
|
return contexts.filter(context => context.id !== NATIVE_WIN).map(context => context.view.id.toString());
|
|
520
498
|
};
|
|
521
499
|
|
|
522
500
|
extensions.onPageChange = async function onPageChange(pageChangeNotification) {
|
|
523
|
-
|
|
501
|
+
this.log.debug(`Remote debugger notified us of a new page listing: ${JSON.stringify(pageChangeNotification)}`);
|
|
524
502
|
|
|
525
503
|
if (this.selectingNewPage) {
|
|
526
|
-
|
|
527
|
-
|
|
504
|
+
this.log.debug('We are in the middle of selecting a page, ignoring');
|
|
528
505
|
return;
|
|
529
506
|
}
|
|
530
507
|
|
|
531
508
|
if (!this.remote || !this.remote.isConnected) {
|
|
532
|
-
|
|
533
|
-
|
|
509
|
+
this.log.debug('We have not yet connected, ignoring');
|
|
534
510
|
return;
|
|
535
511
|
}
|
|
536
512
|
|
|
@@ -574,7 +550,7 @@ extensions.onPageChange = async function onPageChange(pageChangeNotification) {
|
|
|
574
550
|
|
|
575
551
|
if (!_lodash.default.includes(this.contexts, contextId)) {
|
|
576
552
|
if (isUrlIgnored(page.url, this.opts.safariIgnoreWebHostnames)) {
|
|
577
|
-
|
|
553
|
+
this.log.info(`Not tracking '${page.url}' page because it is blacklisted. ` + `'safariIgnoreWebHostnames'=${this.opts.safariIgnoreWebHostnames}`);
|
|
578
554
|
} else {
|
|
579
555
|
newPages.push(id);
|
|
580
556
|
this.contexts.push(contextId);
|
|
@@ -583,22 +559,19 @@ extensions.onPageChange = async function onPageChange(pageChangeNotification) {
|
|
|
583
559
|
}
|
|
584
560
|
|
|
585
561
|
if (!keyId) {
|
|
586
|
-
|
|
587
|
-
|
|
562
|
+
this.log.debug('No key id found. Choosing first id from page array');
|
|
588
563
|
keyId = newIds[0] || null;
|
|
589
564
|
}
|
|
590
565
|
|
|
591
566
|
if (!_support.util.hasValue(this.curContext)) {
|
|
592
|
-
|
|
593
|
-
|
|
567
|
+
this.log.debug('We do not appear to have window set yet, ignoring');
|
|
594
568
|
return;
|
|
595
569
|
}
|
|
596
570
|
|
|
597
571
|
const [curAppIdKey, curPageIdKey] = this.curContext.split('.');
|
|
598
572
|
|
|
599
573
|
if (curAppIdKey !== appIdKey) {
|
|
600
|
-
|
|
601
|
-
|
|
574
|
+
this.log.debug('Page change not referring to currently selected app, ignoring.');
|
|
602
575
|
return;
|
|
603
576
|
}
|
|
604
577
|
|
|
@@ -606,24 +579,21 @@ extensions.onPageChange = async function onPageChange(pageChangeNotification) {
|
|
|
606
579
|
|
|
607
580
|
if (newPages.length) {
|
|
608
581
|
newPage = _lodash.default.last(newPages);
|
|
609
|
-
|
|
610
|
-
_logger.default.debug(`We have new pages, selecting page '${newPage}'`);
|
|
582
|
+
this.log.debug(`We have new pages, selecting page '${newPage}'`);
|
|
611
583
|
} else if (!_lodash.default.includes(newIds, curPageIdKey)) {
|
|
612
|
-
|
|
584
|
+
this.log.debug('New page listing from remote debugger does not contain ' + 'current window; assuming it is closed');
|
|
613
585
|
|
|
614
586
|
if (!_support.util.hasValue(keyId)) {
|
|
615
|
-
|
|
616
|
-
|
|
587
|
+
this.log.error('Do not have our current window anymore, and there ' + 'are not any more to load! Doing nothing...');
|
|
617
588
|
this.setCurrentUrl(undefined);
|
|
618
589
|
return;
|
|
619
590
|
}
|
|
620
591
|
|
|
621
|
-
|
|
622
|
-
|
|
592
|
+
this.log.debug(`Debugger already selected page '${keyId}', ` + `confirming that choice.`);
|
|
623
593
|
this.curContext = `${appIdKey}.${keyId}`;
|
|
624
594
|
newPage = keyId;
|
|
625
595
|
} else {
|
|
626
|
-
|
|
596
|
+
this.log.debug('Checking if page needs to load');
|
|
627
597
|
|
|
628
598
|
const needsPageLoad = (() => {
|
|
629
599
|
const contextArray = _lodash.default.map(pageArray, page => `${appIdKey}.${page.id}`);
|
|
@@ -632,12 +602,11 @@ extensions.onPageChange = async function onPageChange(pageChangeNotification) {
|
|
|
632
602
|
})();
|
|
633
603
|
|
|
634
604
|
if (needsPageLoad) {
|
|
635
|
-
|
|
636
|
-
|
|
605
|
+
this.log.debug('Page load needed. Loading...');
|
|
637
606
|
await this.remote.pageLoad();
|
|
638
607
|
}
|
|
639
608
|
|
|
640
|
-
|
|
609
|
+
this.log.debug('New page listing is same as old, doing nothing');
|
|
641
610
|
}
|
|
642
611
|
|
|
643
612
|
if (_support.util.hasValue(this.curContext)) {
|
|
@@ -646,8 +615,7 @@ extensions.onPageChange = async function onPageChange(pageChangeNotification) {
|
|
|
646
615
|
let page = _lodash.default.find(pageArray, p => parseInt(p.id, 10) === currentPageId);
|
|
647
616
|
|
|
648
617
|
if (page && page.url !== this.getCurrentUrl()) {
|
|
649
|
-
|
|
650
|
-
|
|
618
|
+
this.log.debug(`Redirected from '${this.getCurrentUrl()}' to '${page.url}'`);
|
|
651
619
|
this.setCurrentUrl(page.url);
|
|
652
620
|
}
|
|
653
621
|
}
|
|
@@ -657,8 +625,7 @@ extensions.onPageChange = async function onPageChange(pageChangeNotification) {
|
|
|
657
625
|
const oldContext = this.curContext;
|
|
658
626
|
this.curContext = `${appIdKey}.${newPage}`;
|
|
659
627
|
this.remote.selectPage(appIdKey, parseInt(newPage, 10)).catch(err => {
|
|
660
|
-
|
|
661
|
-
|
|
628
|
+
this.log.warn(`Failed to select page: ${err.message}`);
|
|
662
629
|
this.curContext = oldContext;
|
|
663
630
|
});
|
|
664
631
|
this.selectingNewPage = false;
|
|
@@ -672,4 +639,4 @@ var _default = commands;
|
|
|
672
639
|
exports.default = _default;require('source-map-support').install();
|
|
673
640
|
|
|
674
641
|
|
|
675
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9jb250ZXh0LmpzIl0sIm5hbWVzIjpbIk5BVElWRV9XSU4iLCJXRUJWSUVXX1dJTiIsIldFQlZJRVdfQkFTRSIsImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJnZXRDdXJyZW50Q29udGV4dCIsImN1ckNvbnRleHQiLCJnZXRDb250ZXh0c0FuZFZpZXdzIiwidXNlVXJsIiwibG9nIiwiZGVidWciLCJ3ZWJ2aWV3cyIsImxpc3RXZWJGcmFtZXMiLCJjdHhzIiwiaWQiLCJ2aWV3IiwiY29udGV4dHMiLCJwdXNoIiwidG9TdHJpbmciLCJ1c2VOZXdTYWZhcmkiLCJwYXJzZUZsb2F0IiwiaW9zU2RrVmVyc2lvbiIsIm9wdHMiLCJwbGF0Zm9ybVZlcnNpb24iLCJpc1JlYWxEZXZpY2UiLCJzYWZhcmkiLCJ0eXBlQW5kTmF2VG9VcmwiLCJhZGRyZXNzIiwic2V0Q3VycmVudFVybCIsImNhcHMiLCJzYWZhcmlJbml0aWFsVXJsIiwicG9ydCIsInRyaWVzIiwiTUFYX1RSSUVTIiwibmF2aWdhdGUiLCJvbGRJbXBXYWl0IiwiaW1wbGljaXRXYWl0TXMiLCJlbCIsImZpbmRFbGVtZW50IiwibmF0aXZlVGFwIiwiRUxFTUVOVCIsImVyciIsIl8iLCJpbmNsdWRlcyIsIm1lc3NhZ2UiLCJuZXdQYWdlQnV0dG9uIiwic2V0VmFsdWVJbW1lZGlhdGUiLCJnZXRDdXJyZW50VXJsIiwiZXJyb3IiLCJuYXZUb1ZpZXdXaXRoVGl0bGUiLCJ1bmRlZmluZWQiLCJSZWdFeHAiLCJyZW1vdGUiLCJwYWdlVW5sb2FkIiwibmF2VG9WaWV3VGhyb3VnaEZhdm9yaXRlcyIsIm1zZyIsInRpdGxlUmVnZXgiLCJ1cmxSZWdFeHAiLCJzdGFydCIsIkRhdGUiLCJub3ciLCJzcGluVGltZSIsInNwaW5IYW5kbGVzIiwicmVzIiwiZ2V0TGF0ZXN0V2Vidmlld0NvbnRleHRGb3JUaXRsZSIsIkVycm9yIiwic3RhY2siLCJsYXRlc3RXaW5kb3ciLCJzZXRDb250ZXh0IiwiY2FuY2VsUGFnZUxvYWQiLCJ3YXJuIiwiQiIsImRlbGF5IiwiZWxlbWVudCIsImZpbmRVSUVsZW1lbnRPckVsZW1lbnRzIiwic3RvcFJlbW90ZSIsImNsb3NlV2luZG93QmVmb3JlRGlzY29ubmVjdGluZyIsImVycm9yQW5kVGhyb3ciLCJjbG9zZVdpbmRvdyIsImRpc2Nvbm5lY3QiLCJjdXJXZWJGcmFtZXMiLCJjdXJXZWJDb29yZHMiLCJ1cmwiLCJfY3VycmVudFVybCIsImNsb3NlQWxlcnRCZWZvcmVUZXN0IiwibmF2VG9Jbml0aWFsV2VidmlldyIsInJlZ0V4cCIsImN1cnJlbnRVcmwiLCJmaWx0ZXIiLCJjdHgiLCJ0aXRsZSIsInRlc3QiLCJpc1dlYkNvbnRleHQiLCJpc1dlYnZpZXciLCJnZXROZXdSZW1vdGVEZWJ1Z2dlciIsInNvY2tldFBhdGgiLCJkZXZpY2UiLCJnZXRXZWJJbnNwZWN0b3JTb2NrZXQiLCJidW5kbGVJZCIsImFkZGl0aW9uYWxCdW5kbGVJZHMiLCJhZGRpdGlvbmFsV2Vidmlld0J1bmRsZUlkcyIsImlzU2FmYXJpIiwiaW5jbHVkZVNhZmFyaSIsImluY2x1ZGVTYWZhcmlJbldlYnZpZXdzIiwicGFnZUxvYWRNcyIsInJlbW90ZURlYnVnUHJveHkiLCJnYXJiYWdlQ29sbGVjdE9uRXhlY3V0ZSIsInV0aWwiLCJoYXNWYWx1ZSIsInNhZmFyaUdhcmJhZ2VDb2xsZWN0IiwidWRpZCIsImxvZ0FsbENvbW11bmljYXRpb24iLCJzYWZhcmlMb2dBbGxDb21tdW5pY2F0aW9uIiwibG9nQWxsQ29tbXVuaWNhdGlvbkhleER1bXAiLCJzYWZhcmlMb2dBbGxDb21tdW5pY2F0aW9uSGV4RHVtcCIsInNvY2tldENodW5rU2l6ZSIsInNhZmFyaVNvY2tldENodW5rU2l6ZSIsIndlYkluc3BlY3Rvck1heEZyYW1lTGVuZ3RoIiwic2FmYXJpV2ViSW5zcGVjdG9yTWF4RnJhbWVMZW5ndGgiLCJuYW1lIiwiY2FsbGJhY2siLCJza2lwUmVhZHlDaGVjayIsImFscmVhZHlJbkNvbnRleHQiLCJkZXNpcmVkIiwiY3VycmVudCIsImlzTmF0aXZlQ29udGV4dCIsImNvbnRleHQiLCJyZXBsYWNlIiwiaXNVbmRlZmluZWQiLCJnZXRDb250ZXh0cyIsImNvbnRleHRJZCIsImVycm9ycyIsIk5vU3VjaENvbnRleHRFcnJvciIsIm9sZENvbnRleHQiLCJjdXJXaW5kb3dIYW5kbGUiLCJhcHBJZEtleSIsInBhZ2VJZEtleSIsIm1hcCIsInNwbGl0IiwicGFyc2VJbnQiLCJzZWxlY3RpbmdOZXdQYWdlIiwic2VsZWN0UGFnZSIsImVuYWJsZVBlcmZvcm1hbmNlTG9nZ2luZyIsImxvZ3MiLCJwZXJmb3JtYW5jZSIsIklPU1BlcmZvcm1hbmNlTG9nIiwic3RhcnRDYXB0dXJlIiwic2FmYXJpQ29uc29sZSIsInN0YXJ0Q29uc29sZSIsImFkZExvZ0xpbmUiLCJiaW5kIiwic2FmYXJpTmV0d29yayIsInN0YXJ0TmV0d29yayIsImNvbm5lY3RUb1JlbW90ZURlYnVnZ2VyIiwib24iLCJSZW1vdGVEZWJ1Z2dlciIsIkVWRU5UX1BBR0VfQ0hBTkdFIiwib25QYWdlQ2hhbmdlIiwiRVZFTlRfRlJBTUVTX0RFVEFDSEVEIiwiaXNFbXB0eSIsInBsdXJhbGl6ZSIsImxlbmd0aCIsImpvaW4iLCJjb25uZWN0Iiwid2Vidmlld0Nvbm5lY3RUaW1lb3V0IiwicGFnZUFycmF5IiwiZ2V0V2Vidmlld1BhZ2VzIiwic2VsZWN0QXBwIiwid2Vidmlld0Nvbm5lY3RSZXRyaWVzIiwiaWdub3JlQWJvdXRCbGFua1VybCIsInNldENvbm5lY3Rpb25LZXkiLCJhbGVydEVycm9yTXNnIiwibWFwRm4iLCJmdWxsQ29udGV4dExpc3QiLCJtb2JpbGVHZXRDb250ZXh0cyIsIndhaXRGb3JXZWJ2aWV3TXMiLCJpc051bWJlciIsImlzTmFOIiwiY3VyT3B0IiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJ0b0ZpeGVkIiwic2V0V2luZG93Iiwibm9vcCIsIk5vU3VjaFdpbmRvd0Vycm9yIiwiZ2V0V2luZG93SGFuZGxlIiwiTm90SW1wbGVtZW50ZWRFcnJvciIsImdldFdpbmRvd0hhbmRsZXMiLCJwYWdlQ2hhbmdlTm90aWZpY2F0aW9uIiwiSlNPTiIsInN0cmluZ2lmeSIsImlzQ29ubmVjdGVkIiwibmV3SWRzIiwibmV3UGFnZXMiLCJrZXlJZCIsImlzVXJsSWdub3JlZCIsInNhZmFyaUlnbm9yZVdlYkhvc3RuYW1lcyIsImlnbm9yZWRIb3N0cyIsImIiLCJ0cmltIiwiaWdub3JlZEhvc3QiLCJob3N0bmFtZSIsIlVSTCIsImlnbiIsInBhZ2UiLCJpc0tleSIsImluZm8iLCJjdXJBcHBJZEtleSIsImN1clBhZ2VJZEtleSIsIm5ld1BhZ2UiLCJsYXN0IiwibmVlZHNQYWdlTG9hZCIsImNvbnRleHRBcnJheSIsImlzRXF1YWwiLCJmaW5kIiwicGFnZUxvYWQiLCJjdXJyZW50UGFnZUlkIiwicCIsImNhdGNoIiwid2luZG93SGFuZGxlQ2FjaGUiLCJPYmplY3QiLCJhc3NpZ24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsVUFBVSxHQUFHLFlBQW5CO0FBQ0EsTUFBTUMsV0FBVyxHQUFHLFNBQXBCO0FBQ0EsTUFBTUMsWUFBWSxHQUFJLEdBQUVELFdBQVksR0FBcEM7QUFFQSxNQUFNRSxRQUFRLEdBQUcsRUFBakI7QUFBQSxNQUFxQkMsT0FBTyxHQUFHLEVBQS9CO0FBQUEsTUFBbUNDLFVBQVUsR0FBRyxFQUFoRDs7QUFHQUYsUUFBUSxDQUFDRyxpQkFBVCxHQUE2QixlQUFlQSxpQkFBZixHQUFvQztBQUMvRCxNQUFJLEtBQUtDLFVBQUwsSUFBbUIsS0FBS0EsVUFBTCxLQUFvQlAsVUFBM0MsRUFBdUQ7QUFDckQsV0FBUSxHQUFFRSxZQUFhLEdBQUUsS0FBS0ssVUFBVyxFQUF6QztBQUNEOztBQUNELFNBQU9QLFVBQVA7QUFDRCxDQUxEOztBQU9BSyxVQUFVLENBQUNHLG1C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Q0EsV0FBS3RDLFVBQUwsR0FBa0IrSCxVQUFsQjtBQUNELEtBSEQ7QUFJQSxTQUFLTyxnQkFBTCxHQUF3QixLQUF4QjtBQUNEOztBQUNELE9BQUtrRixpQkFBTCxHQUF5QnpELFNBQXpCO0FBQ0QsQ0E3SUQ7O0FBZ0pBMEQsTUFBTSxDQUFDQyxNQUFQLENBQWM5TixRQUFkLEVBQXdCRSxVQUF4QixFQUFvQ0QsT0FBcEM7ZUFDZUQsUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZVJlbW90ZURlYnVnZ2VyLCBSZW1vdGVEZWJ1Z2dlciB9IGZyb20gJ2FwcGl1bS1yZW1vdGUtZGVidWdnZXInO1xuaW1wb3J0IHsgZXJyb3JzLCBpc0Vycm9yVHlwZSB9IGZyb20gJ0BhcHBpdW0vYmFzZS1kcml2ZXInO1xuaW1wb3J0IHsgdXRpbCwgdGltaW5nIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBJT1NQZXJmb3JtYW5jZUxvZyBmcm9tICcuLi9kZXZpY2UtbG9nL2lvcy1wZXJmb3JtYW5jZS1sb2cnO1xuaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmNvbnN0IE5BVElWRV9XSU4gPSAnTkFUSVZFX0FQUCc7XG5jb25zdCBXRUJWSUVXX1dJTiA9ICdXRUJWSUVXJztcbmNvbnN0IFdFQlZJRVdfQkFTRSA9IGAke1dFQlZJRVdfV0lOfV9gO1xuXG5jb25zdCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuXG5jb21tYW5kcy5nZXRDdXJyZW50Q29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRDb250ZXh0ICgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gIGlmICh0aGlzLmN1ckNvbnRleHQgJiYgdGhpcy5jdXJDb250ZXh0ICE9PSBOQVRJVkVfV0lOKSB7XG4gICAgcmV0dXJuIGAke1dFQlZJRVdfQkFTRX0ke3RoaXMuY3VyQ29udGV4dH1gO1xuICB9XG4gIHJldHVybiBOQVRJVkVfV0lOO1xufTtcblxuZXh0ZW5zaW9ucy5nZXRDb250ZXh0c0FuZFZpZXdzID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q29udGV4dHNBbmRWaWV3cyAodXNlVXJsID0gdHJ1ZSkge1xuICBsb2cuZGVidWcoJ1JldHJpZXZpbmcgY29udGV4dHMgYW5kIHZpZXdzJyk7XG4gIGxldCB3ZWJ2aWV3cyA9IGF3YWl0IHRoaXMubGlzdFdlYkZyYW1lcyh1c2VVcmwpO1xuXG4gIGxldCBjdHhzID0gW3tpZDogTkFUSVZFX1dJTiwgdmlldzoge319XTtcbiAgdGhpcy5jb250ZXh0cyA9IFtOQVRJVkVfV0lOXTtcbiAgZm9yIChsZXQgdmlldyBvZiB3ZWJ2aWV3cykge1xuICAgIGN0eHMucHVzaCh7aWQ6IGAke1dFQlZJRVdfQkFTRX0ke3ZpZXcuaWR9YCwgdmlld30pO1xuICAgIHRoaXMuY29udGV4dHMucHVzaCh2aWV3LmlkLnRvU3RyaW5nKCkpO1xuICB9XG4gIHJldHVybiBjdHhzO1xufTtcblxuLy8gUmlnaHQgbm93IHdlIGRvbid0IG5lY2Vzc2FyaWx5IHdhaXQgZm9yIHdlYnZpZXdcbi8vIGFuZCBmcmFtZSB0byBsb2FkLCB3aGljaCBsZWFkcyB0byByYWNlIGNvbmRpdGlvbnMgYW5kIGZsYWtpbmVzcyxcbi8vIGxldCdzIHNlZSBpZiB3ZSBjYW4gdHJhbnNpdGlvbiB0byBzb21ldGhpbmcgYmV0dGVyXG5leHRlbnNpb25zLnVzZU5ld1NhZmFyaSA9IGZ1bmN0aW9uIHVzZU5ld1NhZmFyaSAoKSB7XG4gIHJldHVybiBwYXJzZUZsb2F0KHRoaXMuaW9zU2RrVmVyc2lvbikgPj0gOC4xICYmXG4gICAgcGFyc2VGbG9hdCh0aGlzLm9wdHMucGxhdGZvcm1WZXJzaW9uKSA+PSA4LjEgJiZcbiAgICAhdGhpcy5pc1JlYWxEZXZpY2UoKSAmJlxuICAgIHRoaXMub3B0cy5zYWZhcmk7XG59O1xuXG5leHRlbnNpb25zLnR5cGVBbmROYXZUb1VybCA9IGFzeW5jIGZ1bmN0aW9uIHR5cGVBbmROYXZUb1VybCAoKSB7XG4gIGxldCBhZGRyZXNzID0gdGhpcy5vcHRzLmFkZHJlc3MgPyB0aGlzLm9wdHMuYWRkcmVzcyA6ICcxMjcuMC4wLjEnO1xuICB0aGlzLnNldEN1cnJlbnRVcmwodGhpcy5jYXBzLnNhZmFyaUluaXRpYWxVcmwgfHwgYGh0dHA6Ly8ke2FkZHJlc3N9OiR7dGhpcy5vcHRzLnBvcnR9L3dlbGNvbWVgKTtcblxuICBsZXQgdHJpZXMgPSAwO1xuICBjb25zdCBNQVhfVFJJRVMgPSAyO1xuICBsZXQgbmF2aWdhdGUgPSBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG9sZEltcFdhaXQgPSB0aGlzLmltcGxpY2l0V2FpdE1zO1xuICAgIHRoaXMuaW1wbGljaXRXYWl0TXMgPSA3MDAwO1xuXG4gICAgLy8gZmluZCB0aGUgdXJsIGJhciwgYW5kIHRhcCBvbiBpdC4gcmV0cnkgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHRyeVxuICAgIC8vIHRvbyBzb29uIHdoaWxlIHRoZSB2aWV3IGlzIHN0aWxsIGxvYWRpbmdcbiAgICBsZXQgZWwgPSBhd2FpdCByZXRyeUludGVydmFsKDMsIDEwMDAsIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuZmluZEVsZW1lbnQoJ2FjY2Vzc2liaWxpdHkgaWQnLCAnVVJMJykpO1xuICAgIHRoaXMuaW1wbGljaXRXYWl0TXMgPSBvbGRJbXBXYWl0O1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMubmF0aXZlVGFwKGVsLkVMRU1FTlQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKF8uaW5jbHVkZXMoZXJyLm1lc3NhZ2UsICdjb3VsZCBub3QgYmUgdGFwcGVkJykpIHtcbiAgICAgICAgaWYgKHRyaWVzKysgPj0gTUFYX1RSSUVTKSB0aHJvdyBlcnI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcblxuICAgICAgICAvLyBnZW5lcmFsbHkgdGhpcyBtZWFucyB0aGF0IFNhZmFyaSBpcyBpbiBwYWdlIHZpZXdpbmcgbW9kZVxuICAgICAgICAvLyBzbyB0cnkgdG8gb3BlbiBhIG5ldyBwYWdlIGFuZCB0aGVuIHJlZG8gdGhlIG5hdmlnYXRpb25cbiAgICAgICAgbGV0IG5ld1BhZ2VCdXR0b24gPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50KCd4cGF0aCcsIFwiLy9YQ1VJRWxlbWVudFR5cGVCdXR0b25bY29udGFpbnMoQG5hbWUsJ05ldyBwYWdlJyldXCIpO1xuICAgICAgICBhd2FpdCB0aGlzLm5hdGl2ZVRhcChuZXdQYWdlQnV0dG9uLkVMRU1FTlQpO1xuICAgICAgICByZXR1cm4gYXdhaXQgbmF2aWdhdGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBnZXQgdGhlIGxhc3QgYWRkcmVzcyBlbGVtZW50IGFuZCBzZXQgdGhlIHVybFxuICAgIHRyeSB7XG4gICAgICBsZXQgZWwgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50KCdjbGFzcyBuYW1lJywgJ1hDVUlFbGVtZW50VHlwZVRleHRGaWVsZCcpO1xuICAgICAgYXdhaXQgdGhpcy5zZXRWYWx1ZUltbWVkaWF0ZSh0aGlzLmdldEN1cnJlbnRVcmwoKSwgZWwpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gdGhpcyBpcyBmbGFrZXkgb24gY2VydGFpbiBzeXN0ZW1zIHNvIHdlIHJldHJ5IHVudGlsIHdlIGdldCBzb21ldGhpbmdcbiAgICAgIC8vIGlvcyBzaW1zOiBzYWZhcmkgb3BlbnMgYnV0IHRoZSB0ZXh0IGZpZWxkIGNhbid0IGJlIGZvdW5kXG4gICAgICBpZiAodHJpZXMrKyA+PSBNQVhfVFJJRVMpIHRocm93IGVycjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjdXJseVxuICAgICAgcmV0dXJuIGF3YWl0IG5hdmlnYXRlKCk7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBpdCBoYXBwZW5cbiAgICB0cnkge1xuICAgICAgZWwgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50KCdhY2Nlc3NpYmlsaXR5IGlkJywgJ0dvJyk7XG4gICAgICBhd2FpdCB0aGlzLm5hdGl2ZVRhcChlbC5FTEVNRU5UKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChfLmluY2x1ZGVzKGVyci5tZXNzYWdlLCAnY291bGQgbm90IGJlIHRhcHBlZCcpKSB7XG4gICAgICAgIGxvZy5lcnJvcignVW5hYmxlIHRvIHN1Ym1pdCBVUkwgYmVjYXVzZSBcXCdHb1xcJyBidXR0b24gY291bGQgbm90IGJlIHRhcHBlZC4gJyArXG4gICAgICAgICAgJ1BsZWFzZSBtYWtlIHN1cmUgeW91ciBrZXlib2FyZCBpcyB0b2dnbGVkIG9uLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLm5hdlRvVmlld1dpdGhUaXRsZSh1bmRlZmluZWQsIG5ldyBSZWdFeHAodGhpcy5nZXRDdXJyZW50VXJsKCksICdpJykpO1xuXG4gICAgLy8gd2FpdCBmb3IgcGFnZSB0byBmaW5pc2ggbG9hZGluZy5cbiAgICBhd2FpdCB0aGlzLnJlbW90ZS5wYWdlVW5sb2FkKCk7XG4gIH07XG4gIGF3YWl0IG5hdmlnYXRlKCk7XG59O1xuXG5leHRlbnNpb25zLm5hdlRvVmlld1Rocm91Z2hGYXZvcml0ZXMgPSBhc3luYyBmdW5jdGlvbiBuYXZUb1ZpZXdUaHJvdWdoRmF2b3JpdGVzICgpIHtcbiAgbG9nLmRlYnVnKCdXZSBhcmUgb24gaU9TNysgc2ltdWxhdG9yOiBjbGlja2luZyBhcHBsZSBidXR0b24gdG8gZ2V0IGludG8gYSB3ZWJ2aWV3Jyk7XG4gIGxldCBvbGRJbXBXYWl0ID0gdGhpcy5pbXBsaWNpdFdhaXRNcztcbiAgdGhpcy5pbXBsaWNpdFdhaXRNcyA9IDcwMDA7IC8vIHdhaXQgN3MgZm9yIGFwcGxlIGJ1dHRvbiB0byBleGlzdFxuXG4gIGxldCBlbDtcbiAgdHJ5IHtcbiAgICBlbCA9IGF3YWl0IHRoaXMuZmluZEVsZW1lbnQoJ3hwYXRoJywgJy8vWENVSUVsZW1lbnRUeXBlU2Nyb2xsVmlld1sxXS9YQ1VJRWxlbWVudFR5cGVCdXR0b25bMV0nKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbGV0IG1zZyA9ICdDb3VsZCBub3QgZmluZCBidXR0b24gdG8gY2xpY2sgdG8gZ2V0IGludG8gd2Vidmlldy4gJyArXG4gICAgICAgICAgICAgICdQcm9jZWVkaW5nIG9uIHRoZSBhc3N1bXB0aW9uIHdlIGhhdmUgYSB3b3JraW5nIG9uZS4nO1xuICAgIGxvZy5lcnJvcihtc2cpO1xuICAgIHRoaXMuaW1wbGljaXRXYWl0TXMgPSBvbGRJbXBXYWl0O1xuICAgIHJldHVybiBhd2FpdCB0aGlzLm5hdlRvVmlld1dpdGhUaXRsZSgvLiovaSk7XG4gIH1cbiAgdGhpcy5pbXBsaWNpdFdhaXRNcyA9IG9sZEltcFdhaXQ7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5uYXRpdmVUYXAoZWwuRUxFTUVOVCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxldCBtc2cgPSAnQ291bGQgbm90IGNsaWNrIGJ1dHRvbiB0byBnZXQgaW50byB3ZWJ2aWV3LiAnICtcbiAgICAgICAgICAgICAgJ1Byb2NlZWRpbmcgb24gdGhlIGFzc3VtcHRpb24gd2UgaGF2ZSBhIHdvcmtpbmcgb25lLic7XG4gICAgbG9nLmVycm9yKG1zZyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5uYXZUb1ZpZXdXaXRoVGl0bGUoL2FwcGxlL2kpO1xufTtcblxuZXh0ZW5zaW9ucy5uYXZUb1ZpZXdXaXRoVGl0bGUgPSBhc3luYyBmdW5jdGlvbiBuYXZUb1ZpZXdXaXRoVGl0bGUgKHRpdGxlUmVnZXgsIHVybFJlZ0V4cCkge1xuICBsb2cuZGVidWcoJ05hdmlnYXRpbmcgdG8gbW9zdCByZWNlbnRseSBvcGVuZWQgd2VidmlldycpO1xuICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICBsZXQgc3BpblRpbWUgPSA1MDA7XG4gIGxldCBzcGluSGFuZGxlcyA9IGFzeW5jICgpID0+IHtcbiAgICBsZXQgcmVzO1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBhd2FpdCB0aGlzLmdldExhdGVzdFdlYnZpZXdDb250ZXh0Rm9yVGl0bGUodGl0bGVSZWdleCB8fCB1cmxSZWdFeHApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKCFlcnIubWVzc2FnZS5pbmNsdWRlcygnQ291bGQgbm90IGNvbm5lY3QgdG8gYSB2YWxpZCBhcHAgYWZ0ZXInKSkge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgQ291bGQgbm90IG5hdmlnYXRlIHRvIHdlYnZpZXchIEVycjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgZXJyb3Iuc3RhY2sgKz0gYFxcbkNhdXNlZCBieTogJHtlcnIuc3RhY2t9YDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoJ0NvdWxkIG5vdCBuYXZpZ2F0ZSB0byB3ZWJ2aWV3LiBSZXRyeWluZyBpZiBwb3NzaWJsZS4nKTtcbiAgICB9XG4gICAgaWYgKHJlcykge1xuICAgICAgbGV0IGxhdGVzdFdpbmRvdyA9IHJlcztcbiAgICAgIGxvZy5kZWJ1ZyhgUGlja2luZyB3ZWJ2aWV3ICcke2xhdGVzdFdpbmRvd30nYCk7XG4gICAgICBhd2FpdCB0aGlzLnNldENvbnRleHQobGF0ZXN0V2luZG93KTtcbiAgICAgIGF3YWl0IHRoaXMucmVtb3RlLmNhbmNlbFBhZ2VMb2FkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gbm8gd2VidmlldyB3YXMgZm91bmRcbiAgICBpZiAoKERhdGUubm93KCkgLSBzdGFydCkgPj0gOTAwMDApIHtcbiAgICAgIC8vIHRvbyBzbG93LCBnZXQgb3V0XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBuYXZpZ2F0ZSB0byB3ZWJ2aWV3OyB0aGVyZSBhcmUgbm9uZSEnKTtcbiAgICB9XG5cbiAgICBsb2cud2FybignQ291bGQgbm90IGZpbmQgYW55IHdlYnZpZXdzIHlldCwgcmVmcmVzaGluZy9yZXRyeWluZycpO1xuICAgIGlmICh0aGlzLmlzUmVhbERldmljZSgpIHx8ICF0aGlzLm9wdHMuc2FmYXJpKSB7XG4gICAgICAvLyBvbiBhIHJlYWwgZGV2aWNlLCB3aGVuIG5vdCB1c2luZyBTYWZhcmksIHdlIGp1c3Qgd2FudCB0byB0cnkgYWdhaW5cbiAgICAgIGF3YWl0IEIuZGVsYXkoc3BpblRpbWUpO1xuICAgICAgcmV0dXJuIGF3YWl0IHNwaW5IYW5kbGVzKCk7XG4gICAgfVxuXG4gICAgLy8gZmluZCB0aGUgcmVsb2FkIGJ1dHRvbiBhbmQgdGFwIGl0LCBpZiBwb3NzaWJsZVxuICAgIGxldCBlbGVtZW50O1xuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoJ0ZpbmRpbmcgYW5kIHRhcHBpbmcgcmVsb2FkIGJ1dHRvbicpO1xuICAgICAgZWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZFVJRWxlbWVudE9yRWxlbWVudHMoJ2FjY2Vzc2liaWxpdHkgaWQnLCAnUmVsb2FkQnV0dG9uJywgJycsIGZhbHNlKTtcbiAgICAgIGF3YWl0IHRoaXMubmF0aXZlVGFwKGVsZW1lbnQuRUxFTUVOVCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cud2FybihgRXJyb3IgZmluZGluZyBhbmQgdGFwcGluZyByZWxvYWQgYnV0dG9uOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgbG9nLndhcm4oJ1JldHJ5aW5nLicpO1xuICAgICAgYXdhaXQgQi5kZWxheShzcGluVGltZSk7XG4gICAgfVxuXG4gICAgLy8gdHJ5IGl0IGFsbCBhZ2FpblxuICAgIHJldHVybiBhd2FpdCBzcGluSGFuZGxlcygpO1xuICB9O1xuICBhd2FpdCBzcGluSGFuZGxlcygpO1xufTtcblxuaGVscGVycy5zdG9wUmVtb3RlID0gYXN5bmMgZnVuY3Rpb24gc3RvcFJlbW90ZSAoY2xvc2VXaW5kb3dCZWZvcmVEaXNjb25uZWN0aW5nID0gZmFsc2UpIHtcbiAgaWYgKCF0aGlzLnJlbW90ZSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KCdUcmllZCB0byBsZWF2ZSBhIHdlYiBmcmFtZSBidXQgd2VyZSBub3QgaW4gb25lJyk7XG4gIH1cblxuICBpZiAoY2xvc2VXaW5kb3dCZWZvcmVEaXNjb25uZWN0aW5nKSB7XG4gICAgYXdhaXQgdGhpcy5jbG9zZVdpbmRvdygpO1xuICB9XG4gIGF3YWl0IHRoaXMucmVtb3RlLmRpc2Nvbm5lY3QoKTtcbiAgdGhpcy5jdXJDb250ZXh0ID0gbnVsbDtcbiAgdGhpcy5jdXJXZWJGcmFtZXMgPSBbXTtcbiAgdGhpcy5jdXJXZWJDb29yZHMgPSBudWxsO1xuICB0aGlzLnJlbW90ZSA9IG51bGw7XG59O1xuXG5oZWxwZXJzLnNldEN1cnJlbnRVcmwgPSBmdW5jdGlvbiBzZXRDdXJyZW50VXJsICh1cmwpIHtcbiAgdGhpcy5fY3VycmVudFVybCA9IHVybDtcbn07XG5cbmhlbHBlcnMuZ2V0Q3VycmVudFVybCA9IGZ1bmN0aW9uIGdldEN1cnJlbnRVcmwgKCkge1xuICByZXR1cm4gdGhpcy5fY3VycmVudFVybDtcbn07XG5cbmV4dGVuc2lvbnMuY2xvc2VBbGVydEJlZm9yZVRlc3QgPSBhc3luYyBmdW5jdGlvbiBjbG9zZUFsZXJ0QmVmb3JlVGVzdCAoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1hd2FpdFxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4dGVuc2lvbnMubmF2VG9Jbml0aWFsV2VidmlldyA9IGFzeW5jIGZ1bmN0aW9uIG5hdlRvSW5pdGlhbFdlYnZpZXcgKCkge1xuICBpZiAodGhpcy51c2VOZXdTYWZhcmkoKSkge1xuICAgIGF3YWl0IHRoaXMudHlwZUFuZE5hdlRvVXJsKCk7XG4gIH0gZWxzZSBpZiAoIXRoaXMuaXNSZWFsRGV2aWNlKCkgJiYgdGhpcy5vcHRzLnNhZmFyaSkge1xuICAgIGF3YWl0IHRoaXMubmF2VG9WaWV3VGhyb3VnaEZhdm9yaXRlcygpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IHRoaXMubmF2VG9WaWV3V2l0aFRpdGxlKC8uKi8pO1xuICB9XG59O1xuXG5leHRlbnNpb25zLmdldExhdGVzdFdlYnZpZXdDb250ZXh0Rm9yVGl0bGUgPSBhc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RXZWJ2aWV3Q29udGV4dEZvclRpdGxlIChyZWdFeHApIHtcbiAgY29uc3QgY3VycmVudFVybCA9IHRoaXMuZ2V0Q3VycmVudFVybCgpO1xuXG4gIGNvbnN0IGNvbnRleHRzID0gXy5maWx0ZXIoYXdhaXQgdGhpcy5nZXRDb250ZXh0c0FuZFZpZXdzKCksICd2aWV3Jyk7XG5cbiAgaWYgKGN1cnJlbnRVcmwpIHtcbiAgICAvLyBmaXJzdCB0cnkgdG8gbWF0Y2ggYnkgY3VycmVudCB1cmxcbiAgICBmb3IgKGNvbnN0IGN0eCBvZiBjb250ZXh0cykge1xuICAgICAgaWYgKChjdHgudmlldy51cmwgfHwgJycpID09PSB0aGlzLmdldEN1cnJlbnRVcmwoKSkge1xuICAgICAgICByZXR1cm4gY3R4LmlkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGlmIG5vdCwgdHJ5IHRvIG1hdGNoIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvblxuICBmb3IgKGNvbnN0IGN0eCBvZiBjb250ZXh0cykge1xuICAgIGlmICgoY3R4LnZpZXcudGl0bGUgJiYgcmVnRXhwLnRlc3QoY3R4LnZpZXcudGl0bGUpKSB8fCAoY3R4LnZpZXcudXJsICYmIHJlZ0V4cC50ZXN0KGN0eC52aWV3LnVybCkpKSB7XG4gICAgICByZXR1cm4gY3R4LmlkO1xuICAgIH1cbiAgfVxufTtcblxuZXh0ZW5zaW9ucy5pc1dlYkNvbnRleHQgPSBmdW5jdGlvbiBpc1dlYkNvbnRleHQgKCkge1xuICByZXR1cm4gISF0aGlzLmN1ckNvbnRleHQgJiYgdGhpcy5jdXJDb250ZXh0ICE9PSBOQVRJVkVfV0lOO1xufTtcblxuZXh0ZW5zaW9ucy5pc1dlYnZpZXcgPSBmdW5jdGlvbiBpc1dlYnZpZXcgKCkge1xuICByZXR1cm4gdGhpcy5pc1dlYkNvbnRleHQoKTtcbn07XG5cbmV4dGVuc2lvbnMuZ2V0TmV3UmVtb3RlRGVidWdnZXIgPSBhc3luYyBmdW5jdGlvbiBnZXROZXdSZW1vdGVEZWJ1Z2dlciAoKSB7XG4gIGxldCBzb2NrZXRQYXRoO1xuICBpZiAoIXRoaXMuaXNSZWFsRGV2aWNlKCkpIHtcbiAgICBzb2NrZXRQYXRoID0gYXdhaXQgdGhpcy5vcHRzLmRldmljZS5nZXRXZWJJbnNwZWN0b3JTb2NrZXQoKTtcbiAgfVxuICByZXR1cm4gY3JlYXRlUmVtb3RlRGVidWdnZXIoe1xuICAgIGJ1bmRsZUlkOiB0aGlzLm9wdHMuYnVuZGxlSWQsXG4gICAgYWRkaXRpb25hbEJ1bmRsZUlkczogdGhpcy5vcHRzLmFkZGl0aW9uYWxXZWJ2aWV3QnVuZGxlSWRzLFxuICAgIGlzU2FmYXJpOiB0aGlzLmlzU2FmYXJpKCksXG4gICAgaW5jbHVkZVNhZmFyaTogdGhpcy5vcHRzLmluY2x1ZGVTYWZhcmlJbldlYnZpZXdzLFxuICAgIHVzZU5ld1NhZmFyaTogdGhpcy51c2VOZXdTYWZhcmkoKSxcbiAgICBwYWdlTG9hZE1zOiB0aGlzLnBhZ2VMb2FkTXMsXG4gICAgcGxhdGZvcm1WZXJzaW9uOiB0aGlzLm9wdHMucGxhdGZvcm1WZXJzaW9uLFxuICAgIHNvY2tldFBhdGgsXG4gICAgcmVtb3RlRGVidWdQcm94eTogdGhpcy5vcHRzLnJlbW90ZURlYnVnUHJveHksXG4gICAgZ2FyYmFnZUNvbGxlY3RPbkV4ZWN1dGU6IHV0aWwuaGFzVmFsdWUodGhpcy5vcHRzLnNhZmFyaUdhcmJhZ2VDb2xsZWN0KVxuICAgICAgPyAhIXRoaXMub3B0cy5zYWZhcmlHYXJiYWdlQ29sbGVjdFxuICAgICAgOiBmYWxzZSxcbiAgICB1ZGlkOiB0aGlzLm9wdHMudWRpZCxcbiAgICBsb2dBbGxDb21tdW5pY2F0aW9uOiB0aGlzLm9wdHMuc2FmYXJpTG9nQWxsQ29tbXVuaWNhdGlvbixcbiAgICBsb2dBbGxDb21tdW5pY2F0aW9uSGV4RHVtcDogdGhpcy5vcHRzLnNhZmFyaUxvZ0FsbENvbW11bmljYXRpb25IZXhEdW1wLFxuICAgIHNvY2tldENodW5rU2l6ZTogdGhpcy5vcHRzLnNhZmFyaVNvY2tldENodW5rU2l6ZSxcbiAgICB3ZWJJbnNwZWN0b3JNYXhGcmFtZUxlbmd0aDogdGhpcy5vcHRzLnNhZmFyaVdlYkluc3BlY3Rvck1heEZyYW1lTGVuZ3RoXG4gIH0sIHRoaXMuaXNSZWFsRGV2aWNlKCkpO1xufTtcblxuLyoqXG4gKiBTZXQgY29udGV4dFxuICpcbiAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIGNvbnRleHQgdG8gc2V0LiBJdCBjb3VsZCBiZSAnbnVsbCcgYXMgTkFUSVZFX1dJTi5cbiAqIEBwYXJhbSB7Y2FsbGJhY2t9IGNhbGxiYWNrIFRoZSBjYWxsYmFjay4gKEl0IGlzIG5vdCBjYWxsZWQgaW4gdGhpcyBtZXRob2QpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNraXBSZWFkeUNoZWNrIC0gV2hldGhlciBpdCB3YWl0cyBmb3IgdGhlIG5ldyBjb250ZXh0IGlzIHJlYWR5XG4gKi9cbmNvbW1hbmRzLnNldENvbnRleHQgPSBhc3luYyBmdW5jdGlvbiBzZXRDb250ZXh0IChuYW1lLCBjYWxsYmFjaywgc2tpcFJlYWR5Q2hlY2spIHtcbiAgZnVuY3Rpb24gYWxyZWFkeUluQ29udGV4dCAoZGVzaXJlZCwgY3VycmVudCkge1xuICAgIHJldHVybiAoZGVzaXJlZCA9PT0gY3VycmVudCB8fFxuICAgICAgKGRlc2lyZWQgPT09IG51bGwgJiYgY3VycmVudCA9PT0gTkFUSVZFX1dJTikgfHxcbiAgICAgIChkZXNpcmVkID09PSBOQVRJVkVfV0lOICYmIGN1cnJlbnQgPT09IG51bGwpKTtcbiAgfVxuICBmdW5jdGlvbiBpc05hdGl2ZUNvbnRleHQgKGNvbnRleHQpIHtcbiAgICByZXR1cm4gY29udGV4dCA9PT0gTkFUSVZFX1dJTiB8fCBjb250ZXh0ID09PSBudWxsO1xuICB9XG5cbiAgLy8gYWxsb3cgdGhlIGZ1bGwgY29udGV4dCBsaXN0IHRvIGJlIHBhc3NlZCBpblxuICBpZiAobmFtZSAmJiBuYW1lLmlkKSB7XG4gICAgbmFtZSA9IG5hbWUuaWQ7XG4gIH1cblxuICBsb2cuZGVidWcoYEF0dGVtcHRpbmcgdG8gc2V0IGNvbnRleHQgdG8gJyR7bmFtZSB8fCBOQVRJVkVfV0lOfScgZnJvbSAnJHt0aGlzLmN1ckNvbnRleHQgPyB0aGlzLmN1ckNvbnRleHQgOiBOQVRJVkVfV0lOfSdgKTtcblxuICBpZiAoYWxyZWFkeUluQ29udGV4dChuYW1lLCB0aGlzLmN1ckNvbnRleHQpIHx8IGFscmVhZHlJbkNvbnRleHQoXy5yZXBsYWNlKG5hbWUsIFdFQlZJRVdfQkFTRSwgJycpLCB0aGlzLmN1ckNvbnRleHQpKSB7XG4gICAgLy8gYWxyZWFkeSBpbiB0aGUgbmFtZWQgY29udGV4dCwgbm8gbmVlZCB0byBkbyBhbnl0aGluZ1xuICAgIGxvZy5kZWJ1ZyhgQWxyZWFkeSBpbiAnJHtuYW1lIHx8IE5BVElWRV9XSU59JyBjb250ZXh0LiBEb2luZyBub3RoaW5nLmApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaXNOYXRpdmVDb250ZXh0KG5hbWUpKSB7XG4gICAgLy8gc3dpdGNoaW5nIGludG8gdGhlIG5hdGl2ZSBjb250ZXh0XG4gICAgdGhpcy5jdXJDb250ZXh0ID0gbnVsbDtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBzd2l0Y2hpbmcgaW50byBhIHdlYnZpZXcgY29udGV4dFxuXG4gIC8vIGlmIGNvbnRleHRzIGhhdmUgbm90IGFscmVhZHkgYmVlbiByZXRyaWV2ZWQsIGdldCB0aGVtXG4gIGlmIChfLmlzVW5kZWZpbmVkKHRoaXMuY29udGV4dHMpKSB7XG4gICAgYXdhaXQgdGhpcy5nZXRDb250ZXh0cygpO1xuICB9XG5cbiAgbGV0IGNvbnRleHRJZCA9IF8ucmVwbGFjZShuYW1lLCBXRUJWSUVXX0JBU0UsICcnKTtcbiAgaWYgKGNvbnRleHRJZCA9PT0gJycpIHtcbiAgICAvLyBhbGxvdyB1c2VyIHRvIHBhc3MgaW4gXCJXRUJWSUVXXCIgd2l0aG91dCBhbiBpbmRleFxuICAgIC8vIHRoZSBzZWNvbmQgY29udGV4dCB3aWxsIGJlIHRoZSBmaXJzdCB3ZWJ2aWV3IGFzXG4gICAgLy8gdGhlIGZpcnN0IGlzIGFsd2F5cyBOQVRJVkVfQVBQXG4gICAgY29udGV4dElkID0gdGhpcy5jb250ZXh0c1sxXTtcbiAgfVxuICBpZiAoIV8uaW5jbHVkZXModGhpcy5jb250ZXh0cywgY29udGV4dElkKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoQ29udGV4dEVycm9yKCk7XG4gIH1cblxuICBjb25zdCBvbGRDb250ZXh0ID0gdGhpcy5jdXJDb250ZXh0O1xuICB0aGlzLmN1ckNvbnRleHQgPSB0aGlzLmN1cldpbmRvd0hhbmRsZSA9IGNvbnRleHRJZDtcblxuICAvLyBgY29udGV4dElkYCB3aWxsIGJlIGluIHRoZSBmb3JtIG9mIGBhcHBJZC5wYWdlSWRgIGluIHRoaXMgY2FzZVxuICBjb25zdCBbYXBwSWRLZXksIHBhZ2VJZEtleV0gPSBfLm1hcChjb250ZXh0SWQuc3BsaXQoJy4nKSwgKGlkKSA9PiBwYXJzZUludChpZCwgMTApKTtcbiAgdHJ5IHtcbiAgICB0aGlzLnNlbGVjdGluZ05ld1BhZ2UgPSB0cnVlO1xuICAgIGF3YWl0IHRoaXMucmVtb3RlLnNlbGVjdFBhZ2UoYXBwSWRLZXksIHBhZ2VJZEtleSwgc2tpcFJlYWR5Q2hlY2spO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aGlzLmN1ckNvbnRleHQgPSB0aGlzLmN1cldpbmRvd0hhbmRsZSA9IG9sZENvbnRleHQ7XG4gICAgdGhyb3cgZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRoaXMuc2VsZWN0aW5nTmV3UGFnZSA9IGZhbHNlO1xuICB9XG5cbiAgLy8gYXR0ZW1wdCB0byBzdGFydCBwZXJmb3JtYW5jZSBsb2dnaW5nLCBpZiByZXF1ZXN0ZWRcbiAgaWYgKHRoaXMub3B0cy5lbmFibGVQZXJmb3JtYW5jZUxvZ2dpbmcgJiYgdGhpcy5yZW1vdGUpIHtcbiAgICBsb2cuZGVidWcoYFN0YXJ0aW5nIHBlcmZvcm1hbmNlIGxvZyBvbiAnJHt0aGlzLmN1ckNvbnRleHR9J2ApO1xuICAgIHRoaXMubG9ncy5wZXJmb3JtYW5jZSA9IG5ldyBJT1NQZXJmb3JtYW5jZUxvZyh0aGlzLnJlbW90ZSk7XG4gICAgYXdhaXQgdGhpcy5sb2dzLnBlcmZvcm1hbmNlLnN0YXJ0Q2FwdHVyZSgpO1xuICB9XG5cbiAgLy8gc3RhcnQgc2FmYXJpIGxvZ2dpbmcgaWYgdGhlIGxvZ3MgaGFuZGxlcnMgYXJlIGFjdGl2ZVxuICBpZiAobmFtZSAmJiBuYW1lICE9PSBOQVRJVkVfV0lOICYmIHRoaXMubG9ncykge1xuICAgIGlmICh0aGlzLmxvZ3Muc2FmYXJpQ29uc29sZSkge1xuICAgICAgYXdhaXQgdGhpcy5yZW1vdGUuc3RhcnRDb25zb2xlKHRoaXMubG9ncy5zYWZhcmlDb25zb2xlLmFkZExvZ0xpbmUuYmluZCh0aGlzLmxvZ3Muc2FmYXJpQ29uc29sZSkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb2dzLnNhZmFyaU5ldHdvcmspIHtcbiAgICAgIGF3YWl0IHRoaXMucmVtb3RlLnN0YXJ0TmV0d29yayh0aGlzLmxvZ3Muc2FmYXJpTmV0d29yay5hZGRMb2dMaW5lLmJpbmQodGhpcy5sb2dzLnNhZmFyaU5ldHdvcmspKTtcbiAgICB9XG4gIH1cbn07XG5cbmV4dGVuc2lvbnMuY29ubmVjdFRvUmVtb3RlRGVidWdnZXIgPSBhc3luYyBmdW5jdGlvbiBjb25uZWN0VG9SZW1vdGVEZWJ1Z2dlciAoKSB7XG4gIHRoaXMucmVtb3RlID0gYXdhaXQgdGhpcy5nZXROZXdSZW1vdGVEZWJ1Z2dlcigpO1xuXG4gIHRoaXMucmVtb3RlLm9uKFJlbW90ZURlYnVnZ2VyLkVWRU5UX1BBR0VfQ0hBTkdFLCB0aGlzLm9uUGFnZUNoYW5nZS5iaW5kKHRoaXMpKTtcbiAgdGhpcy5yZW1vdGUub24oUmVtb3RlRGVidWdnZXIuRVZFTlRfRlJBTUVTX0RFVEFDSEVELCAoKSA9PiB7XG4gICAgaWYgKCFfLmlzRW1wdHkodGhpcy5jdXJXZWJGcmFtZXMpKSB7XG4gICAgICBsb2cuZGVidWcoYENsZWFyaW5nICR7dXRpbC5wbHVyYWxpemUoJ2ZyYW1lJywgdGhpcy5jdXJXZWJGcmFtZXMubGVuZ3RoLCB0cnVlKX06ICR7dGhpcy5jdXJXZWJGcmFtZXMuam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgdGhpcy5jdXJXZWJGcmFtZXMgPSBbXTtcbiAgfSk7XG5cbiAgYXdhaXQgdGhpcy5yZW1vdGUuY29ubmVjdCh0aGlzLm9wdHMud2Vidmlld0Nvbm5lY3RUaW1lb3V0KTtcbn07XG5cbmV4dGVuc2lvbnMubGlzdFdlYkZyYW1lcyA9IGFzeW5jIGZ1bmN0aW9uIGxpc3RXZWJGcmFtZXMgKHVzZVVybCA9IHRydWUpIHtcbiAgdXNlVXJsID0gdXNlVXJsICYmICF0aGlzLmlzUmVhbERldmljZSgpICYmICEhdGhpcy5nZXRDdXJyZW50VXJsKCk7XG4gIGxvZy5kZWJ1ZyhgU2VsZWN0aW5nIGJ5IHVybDogJHt1c2VVcmx9ICR7dXNlVXJsID8gYChleHBlY3RlZCB1cmw6ICcke3RoaXMuZ2V0Q3VycmVudFVybCgpfScpYCA6ICcnfWApO1xuXG4gIGNvbnN0IGN1cnJlbnRVcmwgPSB1c2VVcmwgPyB0aGlzLmdldEN1cnJlbnRVcmwoKSA6IHVuZGVmaW5lZDtcbiAgbGV0IHBhZ2VBcnJheSA9IFtdO1xuICBjb25zdCBnZXRXZWJ2aWV3UGFnZXMgPSBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlbW90ZS5zZWxlY3RBcHAoY3VycmVudFVybCwgdGhpcy5vcHRzLndlYnZpZXdDb25uZWN0UmV0cmllcywgdGhpcy5vcHRzLmlnbm9yZUFib3V0QmxhbmtVcmwpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLmRlYnVnKGBObyBhdmFpbGFibGUgd2ViIHBhZ2VzOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfTtcblxuICBpZiAodGhpcy5yZW1vdGUgJiYgdGhpcy5yZW1vdGUuYXBwSWRLZXkpIHtcbiAgICAvLyBhbHJlYWR5IGNvbm5lY3RlZFxuICAgIHBhZ2VBcnJheSA9IGF3YWl0IGdldFdlYnZpZXdQYWdlcygpO1xuICB9IGVsc2Uge1xuICAgIGlmICghdGhpcy5yZW1vdGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuY29ubmVjdFRvUmVtb3RlRGVidWdnZXIoKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5yZW1vdGUuc2V0Q29ubmVjdGlvbktleSgpO1xuXG4gICAgcGFnZUFycmF5ID0gYXdhaXQgZ2V0V2Vidmlld1BhZ2VzKCk7XG5cbiAgICBjb25zdCBhbGVydEVycm9yTXNnID0gJ0Nsb3NlIGFsZXJ0IGZhaWxlZC4gUmV0cnkuJztcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcmV0cnlJbnRlcnZhbCg2LCAxMDAwLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghYXdhaXQgdGhpcy5jbG9zZUFsZXJ0QmVmb3JlVGVzdCgpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGFsZXJ0RXJyb3JNc2cpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGlmIHRoZSBsb29wIHRvIGNsb3NlIGFsZXJ0cyBmYWlsZWQgdG8gZGlzbWlzcywgaWdub3JlLFxuICAgICAgLy8gb3RoZXJ3aXNlIGxvZyBhbmQgdGhyb3cgdGhlIGVycm9yXG4gICAgICBpZiAoZXJyLm1lc3NhZ2UgIT09IGFsZXJ0RXJyb3JNc2cpIHtcbiAgICAgICAgbG9nLmVycm9yQW5kVGhyb3coZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAocGFnZUFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIHdlIGhhdmUgbm8gd2ViIGZyYW1lcywgYnV0IGNvbnRpbnVlIGFueXdheVxuICAgIGxvZy5kZWJ1ZygnTm8gd2ViIGZyYW1lcyBmb3VuZC4nKTtcbiAgfVxuICByZXR1cm4gcGFnZUFycmF5O1xufTtcblxuY29tbWFuZHMuZ2V0Q29udGV4dHMgPSBhc3luYyBmdW5jdGlvbiBnZXRDb250ZXh0cyAoKSB7XG4gIGxvZy5kZWJ1ZygnR2V0dGluZyBsaXN0IG9mIGF2YWlsYWJsZSBjb250ZXh0cycpO1xuICBjb25zdCBjb250ZXh0cyA9IGF3YWl0IHRoaXMuZ2V0Q29udGV4dHNBbmRWaWV3cyhmYWxzZSk7XG5cbiAgY29uc3QgbWFwRm4gPSB0aGlzLm9wdHMuZnVsbENvbnRleHRMaXN0XG4gICAgPyBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGNvbnRleHQuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgdGl0bGU6IGNvbnRleHQudmlldy50aXRsZSxcbiAgICAgICAgdXJsOiBjb250ZXh0LnZpZXcudXJsLFxuICAgICAgICBidW5kbGVJZDogY29udGV4dC52aWV3LmJ1bmRsZUlkLFxuICAgICAgfTtcbiAgICB9XG4gICAgOiAoY29udGV4dCkgPT4gY29udGV4dC5pZC50b1N0cmluZygpO1xuICByZXR1cm4gY29udGV4dHMubWFwKG1hcEZuKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ29udGV4dFxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBjb250ZXh0LiBUaGUgbmF0aXZlIGNvbnRleHRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlICdOQVRJVkVfQVBQJyBhbmQgdGhlIHdlYnZpZXdzIHdpbGwgYmVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAnV0VCVklFV194eHgnXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHRpdGxlIC0gVGhlIHRpdGxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2VidmlldyBjb250ZW50XG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHVybCAtIFRoZSB1cmwgYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWJ2aWV3IGNvbnRlbnRcbiAqL1xuXG4vKipcbiAqIEdldCB0aGUgY29udGV4dHMgYXZhaWxhYmxlLCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1cmwgYW5kIHRpdGxlIG9mIGVhY2hcbiAqIHdlYnZpZXdcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIE9wdGlvbnMgc2V0LCB3aGljaCBjYW4gaW5jbHVkZSBgd2FpdEZvcldlYnZpZXdNc2AgdG9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSB0aGUgcGVyaW9kIHRvIHBvbGwgZm9yIGF2YWlsYWJsZSB3ZWJ2aWV3c1xuICogQHJldHVybnMge0FycmF5fSBMaXN0IG9mIENvbnRleHQgb2JqZWN0c1xuICovXG5leHRlbnNpb25zLm1vYmlsZUdldENvbnRleHRzID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0Q29udGV4dHMgKG9wdHMgPSB7fSkge1xuICBsZXQge1xuICAgIHdhaXRGb3JXZWJ2aWV3TXMgPSAwLFxuICB9ID0gb3B0cztcblxuICAvLyBtYWtlIHN1cmUgaXQgaXMgYSBudW1iZXIsIHNvIHRoZSBkdXJhdGlvbiBjaGVjayB3b3JrcyBwcm9wZXJseVxuICBpZiAoIV8uaXNOdW1iZXIod2FpdEZvcldlYnZpZXdNcykpIHtcbiAgICB3YWl0Rm9yV2Vidmlld01zID0gcGFyc2VJbnQod2FpdEZvcldlYnZpZXdNcywgMTApO1xuICAgIGlmIChpc05hTih3YWl0Rm9yV2Vidmlld01zKSkge1xuICAgICAgd2FpdEZvcldlYnZpZXdNcyA9IDA7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY3VyT3B0ID0gdGhpcy5vcHRzLmZ1bGxDb250ZXh0TGlzdDtcbiAgdGhpcy5vcHRzLmZ1bGxDb250ZXh0TGlzdCA9IHRydWU7XG5cbiAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcbiAgdHJ5IHtcbiAgICBsZXQgY29udGV4dHM7XG4gICAgZG8ge1xuICAgICAgY29udGV4dHMgPSBhd2FpdCB0aGlzLmdldENvbnRleHRzKCk7XG5cbiAgICAgIGlmIChjb250ZXh0cy5sZW5ndGggPj0gMikge1xuICAgICAgICBsb2cuZGVidWcoYEZvdW5kIHdlYnZpZXcgY29udGV4dCBhZnRlciAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xuICAgICAgICByZXR1cm4gY29udGV4dHM7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYE5vIHdlYnZpZXdzIGZvdW5kIGluICR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcy50b0ZpeGVkKDApfW1zYCk7XG4gICAgfSB3aGlsZSAodGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcyA8IHdhaXRGb3JXZWJ2aWV3TXMpO1xuICAgIHJldHVybiBjb250ZXh0cztcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyByZXNldCB0aGUgb3B0aW9uIHNvIHRoZXJlIGFyZSBubyBzaWRlIGVmZmVjdHNcbiAgICB0aGlzLm9wdHMuZnVsbENvbnRleHRMaXN0ID0gY3VyT3B0O1xuICB9XG59O1xuXG5jb21tYW5kcy5zZXRXaW5kb3cgPSBhc3luYyBmdW5jdGlvbiBzZXRXaW5kb3cgKG5hbWUsIHNraXBSZWFkeUNoZWNrKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zZXRDb250ZXh0KG5hbWUsIF8ubm9vcCwgc2tpcFJlYWR5Q2hlY2spO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyB0cmFuc2xhdGUgdGhlIGVycm9yIGluIHRlcm1zIG9mIHdpbmRvd3NcbiAgICB0aHJvdyBpc0Vycm9yVHlwZShlcnIsIGVycm9ycy5Ob1N1Y2hDb250ZXh0RXJyb3IpXG4gICAgICA/IG5ldyBlcnJvcnMuTm9TdWNoV2luZG93RXJyb3IoKVxuICAgICAgOiBlcnI7XG4gIH1cbn07XG5cbmNvbW1hbmRzLmdldFdpbmRvd0hhbmRsZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFdpbmRvd0hhbmRsZSAoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1hd2FpdFxuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuICBsb2cuZGVidWcoYEdldHRpbmcgY3VycmVudCB3aW5kb3cgaGFuZGxlYCk7XG4gIHJldHVybiB0aGlzLmN1ckNvbnRleHQ7XG59O1xuXG5jb21tYW5kcy5nZXRXaW5kb3dIYW5kbGVzID0gYXN5bmMgZnVuY3Rpb24gZ2V0V2luZG93SGFuZGxlcyAoKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG4gIGxvZy5kZWJ1ZygnR2V0dGluZyBsaXN0IG9mIGF2YWlsYWJsZSB3aW5kb3cgaGFuZGxlcycpO1xuICBjb25zdCBjb250ZXh0cyA9IGF3YWl0IHRoaXMuZ2V0Q29udGV4dHNBbmRWaWV3cyhmYWxzZSk7XG4gIHJldHVybiBjb250ZXh0c1xuICAgIC8vIGdldCByaWQgb2YgdGhlIG5hdGl2ZSBhcHAgY29udGV4dFxuICAgIC5maWx0ZXIoKGNvbnRleHQpID0+IGNvbnRleHQuaWQgIT09IE5BVElWRV9XSU4pXG4gICAgLy8gZ2V0IHRoZSBgYXBwLmlkYCBmb3JtYXQgZXhwZWN0ZWRcbiAgICAubWFwKChjb250ZXh0KSA9PiBjb250ZXh0LnZpZXcuaWQudG9TdHJpbmcoKSk7XG59O1xuXG5leHRlbnNpb25zLm9uUGFnZUNoYW5nZSA9IGFzeW5jIGZ1bmN0aW9uIG9uUGFnZUNoYW5nZSAocGFnZUNoYW5nZU5vdGlmaWNhdGlvbikge1xuICBsb2cuZGVidWcoYFJlbW90ZSBkZWJ1Z2dlciBub3RpZmllZCB1cyBvZiBhIG5ldyBwYWdlIGxpc3Rpbmc6ICR7SlNPTi5zdHJpbmdpZnkocGFnZUNoYW5nZU5vdGlmaWNhdGlvbil9YCk7XG4gIGlmICh0aGlzLnNlbGVjdGluZ05ld1BhZ2UpIHtcbiAgICBsb2cuZGVidWcoJ1dlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIHNlbGVjdGluZyBhIHBhZ2UsIGlnbm9yaW5nJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghdGhpcy5yZW1vdGUgfHwgIXRoaXMucmVtb3RlLmlzQ29ubmVjdGVkKSB7XG4gICAgbG9nLmRlYnVnKCdXZSBoYXZlIG5vdCB5ZXQgY29ubmVjdGVkLCBpZ25vcmluZycpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHthcHBJZEtleSwgcGFnZUFycmF5fSA9IHBhZ2VDaGFuZ2VOb3RpZmljYXRpb247XG5cbiAgbGV0IG5ld0lkcyA9IFtdO1xuICBsZXQgbmV3UGFnZXMgPSBbXTtcbiAgbGV0IGtleUlkID0gbnVsbDtcblxuICAvLyBDaGVja3MgaWYgYSBVUkwgaXMgYmxhY2tsaXN0ZWQgaW4gdGhlICdzYWZhcmlJZ25vcmVXZWJIb3N0bmFtZXMnIGNhcGFiaWxpdHlcbiAgZnVuY3Rpb24gaXNVcmxJZ25vcmVkICh1cmwsIHNhZmFyaUlnbm9yZVdlYkhvc3RuYW1lcykge1xuICAgIGNvbnN0IGlnbm9yZWRIb3N0cyA9IChzYWZhcmlJZ25vcmVXZWJIb3N0bmFtZXMgfHwgJycpXG4gICAgICAuc3BsaXQoJywnKVxuICAgICAgLm1hcCgoYikgPT4gYi50cmltKCkpXG4gICAgICAuZmlsdGVyKChiKSA9PiAhXy5pc0VtcHR5KGIpKTtcbiAgICBmb3IgKGNvbnN0IGlnbm9yZWRIb3N0IG9mIGlnbm9yZWRIb3N0cykge1xuICAgICAgaWYgKGlnbm9yZWRIb3N0ID09PSAnYWJvdXQ6YmxhbmsnICYmIHVybCA9PT0gJ2Fib3V0OmJsYW5rJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaG9zdG5hbWUgPSBuZXcgVVJMKHVybCkuaG9zdG5hbWU7XG4gICAgICAgICAgaWYgKGhvc3RuYW1lID09PSBpZ25vcmVkSG9zdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nIGlmIGludmFsaWQgVVJMXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yIChjb25zdCBwYWdlIG9mIHBhZ2VBcnJheSkge1xuICAgIGNvbnN0IGlkID0gcGFnZS5pZC50b1N0cmluZygpO1xuICAgIG5ld0lkcy5wdXNoKGlkKTtcbiAgICBpZiAocGFnZS5pc0tleSkge1xuICAgICAga2V5SWQgPSBpZDtcbiAgICB9XG4gICAgY29uc3QgY29udGV4dElkID0gYCR7YXBwSWRLZXl9LiR7aWR9YDtcblxuICAgIC8vIGFkZCBpZiB0aGlzIGlzIGEgbmV3IHBhZ2VcbiAgICBpZiAoIV8uaW5jbHVkZXModGhpcy5jb250ZXh0cywgY29udGV4dElkKSkge1xuICAgICAgaWYgKGlzVXJsSWdub3JlZChwYWdlLnVybCwgdGhpcy5vcHRzLnNhZmFyaUlnbm9yZVdlYkhvc3RuYW1lcykpIHtcbiAgICAgICAgbG9nLmluZm8oYE5vdCB0cmFja2luZyAnJHtwYWdlLnVybH0nIHBhZ2UgYmVjYXVzZSBpdCBpcyBibGFja2xpc3RlZC4gYCArXG4gICAgICAgICAgYCdzYWZhcmlJZ25vcmVXZWJIb3N0bmFtZXMnPSR7dGhpcy5vcHRzLnNhZmFyaUlnbm9yZVdlYkhvc3RuYW1lc31gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1BhZ2VzLnB1c2goaWQpO1xuICAgICAgICB0aGlzLmNvbnRleHRzLnB1c2goY29udGV4dElkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIWtleUlkKSB7XG4gICAgLy8gaWYgdGhlcmUgaXMgbm8ga2V5IGlkLCBwdWxsIHRoZSBmaXJzdCBpZCBmcm9tIHRoZSBwYWdlIGFycmF5IGFuZCB1c2UgdGhhdFxuICAgIC8vIGFzIGEgc3RhbmQgaW5cbiAgICBsb2cuZGVidWcoJ05vIGtleSBpZCBmb3VuZC4gQ2hvb3NpbmcgZmlyc3QgaWQgZnJvbSBwYWdlIGFycmF5Jyk7XG4gICAga2V5SWQgPSBuZXdJZHNbMF0gfHwgbnVsbDtcbiAgfVxuXG4gIGlmICghdXRpbC5oYXNWYWx1ZSh0aGlzLmN1ckNvbnRleHQpKSB7XG4gICAgbG9nLmRlYnVnKCdXZSBkbyBub3QgYXBwZWFyIHRvIGhhdmUgd2luZG93IHNldCB5ZXQsIGlnbm9yaW5nJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgW2N1ckFwcElkS2V5LCBjdXJQYWdlSWRLZXldID0gdGhpcy5jdXJDb250ZXh0LnNwbGl0KCcuJyk7XG5cbiAgaWYgKGN1ckFwcElkS2V5ICE9PSBhcHBJZEtleSkge1xuICAgIGxvZy5kZWJ1ZygnUGFnZSBjaGFuZ2Ugbm90IHJlZmVycmluZyB0byBjdXJyZW50bHkgc2VsZWN0ZWQgYXBwLCBpZ25vcmluZy4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgbmV3UGFnZSA9IG51bGw7XG4gIGlmIChuZXdQYWdlcy5sZW5ndGgpIHtcbiAgICBuZXdQYWdlID0gXy5sYXN0KG5ld1BhZ2VzKTtcbiAgICBsb2cuZGVidWcoYFdlIGhhdmUgbmV3IHBhZ2VzLCBzZWxlY3RpbmcgcGFnZSAnJHtuZXdQYWdlfSdgKTtcbiAgfSBlbHNlIGlmICghXy5pbmNsdWRlcyhuZXdJZHMsIGN1clBhZ2VJZEtleSkpIHtcbiAgICBsb2cuZGVidWcoJ05ldyBwYWdlIGxpc3RpbmcgZnJvbSByZW1vdGUgZGVidWdnZXIgZG9lcyBub3QgY29udGFpbiAnICtcbiAgICAgICAgICAgICAgICAgJ2N1cnJlbnQgd2luZG93OyBhc3N1bWluZyBpdCBpcyBjbG9zZWQnKTtcbiAgICBpZiAoIXV0aWwuaGFzVmFsdWUoa2V5SWQpKSB7XG4gICAgICBsb2cuZXJyb3IoJ0RvIG5vdCBoYXZlIG91ciBjdXJyZW50IHdpbmRvdyBhbnltb3JlLCBhbmQgdGhlcmUgJyArXG4gICAgICAgICAgICAgICAgICAgJ2FyZSBub3QgYW55IG1vcmUgdG8gbG9hZCEgRG9pbmcgbm90aGluZy4uLicpO1xuICAgICAgdGhpcy5zZXRDdXJyZW50VXJsKHVuZGVmaW5lZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nLmRlYnVnKGBEZWJ1Z2dlciBhbHJlYWR5IHNlbGVjdGVkIHBhZ2UgJyR7a2V5SWR9JywgYCArXG4gICAgICAgICAgICAgICAgIGBjb25maXJtaW5nIHRoYXQgY2hvaWNlLmApO1xuICAgIHRoaXMuY3VyQ29udGV4dCA9IGAke2FwcElkS2V5fS4ke2tleUlkfWA7XG4gICAgbmV3UGFnZSA9IGtleUlkO1xuICB9IGVsc2Uge1xuICAgIC8vIGF0IHRoaXMgcG9pbnQsIHRoZXJlIGFyZSBubyBuZXcgcGFnZXMsIGFuZCB0aGUgY3VycmVudCBwYWdlIHN0aWxsIGV4aXN0c1xuICAgIGxvZy5kZWJ1ZygnQ2hlY2tpbmcgaWYgcGFnZSBuZWVkcyB0byBsb2FkJyk7XG4gICAgLy8gSWYgYSB3aW5kb3cgbmF2aWdhdGVzIHRvIGFuIGFuY2hvciBpdCBkb2Vzbid0IGFsd2F5cyBmaXJlIGEgcGFnZVxuICAgIC8vIGNhbGxiYWNrIGV2ZW50LiBMZXQncyBjaGVjayBpZiB3ZSB3b3VuZCB1cCBpbiBzdWNoIGEgc2l0dWF0aW9uLlxuICAgIGNvbnN0IG5lZWRzUGFnZUxvYWQgPSAoKCkgPT4ge1xuICAgICAgLy8gbmVlZCB0byBtYXAgdGhlIHBhZ2UgaWRzIHRvIGNvbnRleHQgaWRzXG4gICAgICBjb25zdCBjb250ZXh0QXJyYXkgPSBfLm1hcChwYWdlQXJyYXksIChwYWdlKSA9PiBgJHthcHBJZEtleX0uJHtwYWdlLmlkfWApO1xuICAgICAgLy8gY2hlY2sgaWYgdGhlIGN1cnJlbnQgY29udGV4dCBleGlzdHMgaW4gYm90aCBvdXIgcmVjb3JkZWQgY29udGV4dHMsXG4gICAgICAvLyBhbmQgdGhlIHBhZ2UgYXJyYXlcbiAgICAgIHJldHVybiAhXy5pc0VxdWFsKF8uZmluZCh0aGlzLmNvbnRleHRzLCB0aGlzLmN1ckNvbnRleHQpLCBfLmZpbmQoY29udGV4dEFycmF5LCB0aGlzLmN1ckNvbnRleHQpKTtcbiAgICB9KSgpO1xuXG4gICAgaWYgKG5lZWRzUGFnZUxvYWQpIHtcbiAgICAgIGxvZy5kZWJ1ZygnUGFnZSBsb2FkIG5lZWRlZC4gTG9hZGluZy4uLicpO1xuICAgICAgYXdhaXQgdGhpcy5yZW1vdGUucGFnZUxvYWQoKTtcbiAgICB9XG5cbiAgICBsb2cuZGVidWcoJ05ldyBwYWdlIGxpc3RpbmcgaXMgc2FtZSBhcyBvbGQsIGRvaW5nIG5vdGhpbmcnKTtcbiAgfVxuXG4gIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBwYWdlIGxpc3RpbmcgaXNuJ3QgaW5kaWNhdGluZyBhIHJlZGlyZWN0XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHRoaXMuY3VyQ29udGV4dCkpIHtcbiAgICBsZXQgY3VycmVudFBhZ2VJZCA9IHBhcnNlSW50KF8ubGFzdCh0aGlzLmN1ckNvbnRleHQuc3BsaXQoJy4nKSksIDEwKTtcbiAgICBsZXQgcGFnZSA9IF8uZmluZChwYWdlQXJyYXksIChwKSA9PiBwYXJzZUludChwLmlkLCAxMCkgPT09IGN1cnJlbnRQYWdlSWQpO1xuICAgIGlmIChwYWdlICYmIHBhZ2UudXJsICE9PSB0aGlzLmdldEN1cnJlbnRVcmwoKSkge1xuICAgICAgbG9nLmRlYnVnKGBSZWRpcmVjdGVkIGZyb20gJyR7dGhpcy5nZXRDdXJyZW50VXJsKCl9JyB0byAnJHtwYWdlLnVybH0nYCk7XG4gICAgICB0aGlzLnNldEN1cnJlbnRVcmwocGFnZS51cmwpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh1dGlsLmhhc1ZhbHVlKG5ld1BhZ2UpKSB7XG4gICAgdGhpcy5zZWxlY3RpbmdOZXdQYWdlID0gdHJ1ZTtcbiAgICBjb25zdCBvbGRDb250ZXh0ID0gdGhpcy5jdXJDb250ZXh0O1xuICAgIHRoaXMuY3VyQ29udGV4dCA9IGAke2FwcElkS2V5fS4ke25ld1BhZ2V9YDtcbiAgICAvLyBkbyBub3Qgd2FpdCwgYXMgdGhpcyBjYW4gdGFrZSBhIGxvbmcgdGltZSwgYW5kIHRoZSByZXNwb25zZSBpcyBub3QgbmVjZXNzYXJ5XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLWNhbGxiYWNrcywgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tdGhlblxuICAgIHRoaXMucmVtb3RlLnNlbGVjdFBhZ2UoYXBwSWRLZXksIHBhcnNlSW50KG5ld1BhZ2UsIDEwKSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgbG9nLndhcm4oYEZhaWxlZCB0byBzZWxlY3QgcGFnZTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIHRoaXMuY3VyQ29udGV4dCA9IG9sZENvbnRleHQ7XG4gICAgfSk7XG4gICAgdGhpcy5zZWxlY3RpbmdOZXdQYWdlID0gZmFsc2U7XG4gIH1cbiAgdGhpcy53aW5kb3dIYW5kbGVDYWNoZSA9IHBhZ2VBcnJheTtcbn07XG5cblxuT2JqZWN0LmFzc2lnbihjb21tYW5kcywgZXh0ZW5zaW9ucywgaGVscGVycyk7XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJmaWxlIjoibGliL2NvbW1hbmRzL2NvbnRleHQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
|
642
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9jb250ZXh0LmpzIl0sIm5hbWVzIjpbIk5BVElWRV9XSU4iLCJXRUJWSUVXX1dJTiIsIldFQlZJRVdfQkFTRSIsImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJnZXRDdXJyZW50Q29udGV4dCIsImN1ckNvbnRleHQiLCJnZXRDb250ZXh0c0FuZFZpZXdzIiwidXNlVXJsIiwibG9nIiwiZGVidWciLCJ3ZWJ2aWV3cyIsImxpc3RXZWJGcmFtZXMiLCJjdHhzIiwiaWQiLCJ2aWV3IiwiY29udGV4dHMiLCJwdXNoIiwidG9TdHJpbmciLCJ1c2VOZXdTYWZhcmkiLCJwYXJzZUZsb2F0IiwiaW9zU2RrVmVyc2lvbiIsIm9wdHMiLCJwbGF0Zm9ybVZlcnNpb24iLCJpc1JlYWxEZXZpY2UiLCJzYWZhcmkiLCJ0eXBlQW5kTmF2VG9VcmwiLCJhZGRyZXNzIiwic2V0Q3VycmVudFVybCIsImNhcHMiLCJzYWZhcmlJbml0aWFsVXJsIiwicG9ydCIsInRyaWVzIiwiTUFYX1RSSUVTIiwibmF2aWdhdGUiLCJvbGRJbXBXYWl0IiwiaW1wbGljaXRXYWl0TXMiLCJlbCIsImZpbmRFbGVtZW50IiwibmF0aXZlVGFwIiwiRUxFTUVOVCIsImVyciIsIl8iLCJpbmNsdWRlcyIsIm1lc3NhZ2UiLCJuZXdQYWdlQnV0dG9uIiwic2V0VmFsdWVJbW1lZGlhdGUiLCJnZXRDdXJyZW50VXJsIiwiZXJyb3IiLCJuYXZUb1ZpZXdXaXRoVGl0bGUiLCJ1bmRlZmluZWQiLCJSZWdFeHAiLCJyZW1vdGUiLCJwYWdlVW5sb2FkIiwibmF2VG9WaWV3VGhyb3VnaEZhdm9yaXRlcyIsIm1zZyIsInRpdGxlUmVnZXgiLCJ1cmxSZWdFeHAiLCJzdGFydCIsIkRhdGUiLCJub3ciLCJzcGluVGltZSIsInNwaW5IYW5kbGVzIiwicmVzIiwiZ2V0TGF0ZXN0V2Vidmlld0NvbnRleHRGb3JUaXRsZSIsIkVycm9yIiwic3RhY2siLCJsYXRlc3RXaW5kb3ciLCJzZXRDb250ZXh0IiwiY2FuY2VsUGFnZUxvYWQiLCJ3YXJuIiwiQiIsImRlbGF5IiwiZWxlbWVudCIsImZpbmRVSUVsZW1lbnRPckVsZW1lbnRzIiwic3RvcFJlbW90ZSIsImNsb3NlV2luZG93QmVmb3JlRGlzY29ubmVjdGluZyIsImVycm9yQW5kVGhyb3ciLCJjbG9zZVdpbmRvdyIsImRpc2Nvbm5lY3QiLCJjdXJXZWJGcmFtZXMiLCJjdXJXZWJDb29yZHMiLCJ1cmwiLCJfY3VycmVudFVybCIsImNsb3NlQWxlcnRCZWZvcmVUZXN0IiwibmF2VG9Jbml0aWFsV2VidmlldyIsInJlZ0V4cCIsImN1cnJlbnRVcmwiLCJmaWx0ZXIiLCJjdHgiLCJ0aXRsZSIsInRlc3QiLCJpc1dlYkNvbnRleHQiLCJpc1dlYnZpZXciLCJnZXROZXdSZW1vdGVEZWJ1Z2dlciIsInNvY2tldFBhdGgiLCJkZXZpY2UiLCJnZXRXZWJJbnNwZWN0b3JTb2NrZXQiLCJidW5kbGVJZCIsImFkZGl0aW9uYWxCdW5kbGVJZHMiLCJhZGRpdGlvbmFsV2Vidmlld0J1bmRsZUlkcyIsImlzU2FmYXJpIiwiaW5jbHVkZVNhZmFyaSIsImluY2x1ZGVTYWZhcmlJbldlYnZpZXdzIiwicGFnZUxvYWRNcyIsInJlbW90ZURlYnVnUHJveHkiLCJnYXJiYWdlQ29sbGVjdE9uRXhlY3V0ZSIsInV0aWwiLCJoYXNWYWx1ZSIsInNhZmFyaUdhcmJhZ2VDb2xsZWN0IiwidWRpZCIsImxvZ0FsbENvbW11bmljYXRpb24iLCJzYWZhcmlMb2dBbGxDb21tdW5pY2F0aW9uIiwibG9nQWxsQ29tbXVuaWNhdGlvbkhleER1bXAiLCJzYWZhcmlMb2dBbGxDb21tdW5pY2F0aW9uSGV4RHVtcCIsInNvY2tldENodW5rU2l6ZSIsInNhZmFyaVNvY2tldENodW5rU2l6ZSIsIndlYkluc3BlY3Rvck1heEZyYW1lTGVuZ3RoIiwic2FmYXJpV2ViSW5zcGVjdG9yTWF4RnJhbWVMZW5ndGgiLCJuYW1lIiwiY2FsbGJhY2siLCJza2lwUmVhZHlDaGVjayIsImFscmVhZHlJbkNvbnRleHQiLCJkZXNpcmVkIiwiY3VycmVudCIsImlzTmF0aXZlQ29udGV4dCIsImNvbnRleHQiLCJyZXBsYWNlIiwiaXNVbmRlZmluZWQiLCJnZXRDb250ZXh0cyIsImNvbnRleHRJZCIsImVycm9ycyIsIk5vU3VjaENvbnRleHRFcnJvciIsIm9sZENvbnRleHQiLCJjdXJXaW5kb3dIYW5kbGUiLCJhcHBJZEtleSIsInBhZ2VJZEtleSIsIm1hcCIsInNwbGl0IiwicGFyc2VJbnQiLCJzZWxlY3RpbmdOZXdQYWdlIiwic2VsZWN0UGFnZSIsImVuYWJsZVBlcmZvcm1hbmNlTG9nZ2luZyIsImxvZ3MiLCJwZXJmb3JtYW5jZSIsIklPU1BlcmZvcm1hbmNlTG9nIiwic3RhcnRDYXB0dXJlIiwic2FmYXJpQ29uc29sZSIsInN0YXJ0Q29uc29sZSIsImFkZExvZ0xpbmUiLCJiaW5kIiwic2FmYXJpTmV0d29yayIsInN0YXJ0TmV0d29yayIsImNvbm5lY3RUb1JlbW90ZURlYnVnZ2VyIiwib24iLCJSZW1vdGVEZWJ1Z2dlciIsIkVWRU5UX1BBR0VfQ0hBTkdFIiwib25QYWdlQ2hhbmdlIiwiRVZFTlRfRlJBTUVTX0RFVEFDSEVEIiwiaXNFbXB0eSIsInBsdXJhbGl6ZSIsImxlbmd0aCIsImpvaW4iLCJjb25uZWN0Iiwid2Vidmlld0Nvbm5lY3RUaW1lb3V0IiwicGFnZUFycmF5IiwiZ2V0V2Vidmlld1BhZ2VzIiwic2VsZWN0QXBwIiwid2Vidmlld0Nvbm5lY3RSZXRyaWVzIiwiaWdub3JlQWJvdXRCbGFua1VybCIsInNldENvbm5lY3Rpb25LZXkiLCJhbGVydEVycm9yTXNnIiwibWFwRm4iLCJmdWxsQ29udGV4dExpc3QiLCJtb2JpbGVHZXRDb250ZXh0cyIsIndhaXRGb3JXZWJ2aWV3TXMiLCJpc051bWJlciIsImlzTmFOIiwiY3VyT3B0IiwidGltZXIiLCJ0aW1pbmciLCJUaW1lciIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJ0b0ZpeGVkIiwic2V0V2luZG93Iiwibm9vcCIsIk5vU3VjaFdpbmRvd0Vycm9yIiwiZ2V0V2luZG93SGFuZGxlIiwiTm90SW1wbGVtZW50ZWRFcnJvciIsImdldFdpbmRvd0hhbmRsZXMiLCJwYWdlQ2hhbmdlTm90aWZpY2F0aW9uIiwiSlNPTiIsInN0cmluZ2lmeSIsImlzQ29ubmVjdGVkIiwibmV3SWRzIiwibmV3UGFnZXMiLCJrZXlJZCIsImlzVXJsSWdub3JlZCIsInNhZmFyaUlnbm9yZVdlYkhvc3RuYW1lcyIsImlnbm9yZWRIb3N0cyIsImIiLCJ0cmltIiwiaWdub3JlZEhvc3QiLCJob3N0bmFtZSIsIlVSTCIsImlnbiIsInBhZ2UiLCJpc0tleSIsImluZm8iLCJjdXJBcHBJZEtleSIsImN1clBhZ2VJZEtleSIsIm5ld1BhZ2UiLCJsYXN0IiwibmVlZHNQYWdlTG9hZCIsImNvbnRleHRBcnJheSIsImlzRXF1YWwiLCJmaW5kIiwicGFnZUxvYWQiLCJjdXJyZW50UGFnZUlkIiwicCIsImNhdGNoIiwid2luZG93SGFuZGxlQ2FjaGUiLCJPYmplY3QiLCJhc3NpZ24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsVUFBVSxHQUFHLFlBQW5CO0FBQ0EsTUFBTUMsV0FBVyxHQUFHLFNBQXBCO0FBQ0EsTUFBTUMsWUFBWSxHQUFJLEdBQUVELFdBQVksR0FBcEM7QUFFQSxNQUFNRSxRQUFRLEdBQUcsRUFBakI7QUFBQSxNQUFxQkMsT0FBTyxHQUFHLEVBQS9CO0FBQUEsTUFBbUNDLFVBQVUsR0FBRyxFQUFoRDs7QUFHQUYsUUFBUSxDQUFDRyxpQkFBVCxHQUE2QixlQUFlQSxpQkFBZixHQUFvQztBQUMvRCxNQUFJLEtBQUtDLFVBQUwsSUFBbUIsS0FBS0EsVUFBTCxLQUFvQlAsVUFBM0MsRUFBdUQ7QUFDckQsV0FBUSxHQUFFRSxZQUFhLEdBQUUsS0FBS0ssVUFBVyxFQUF6QztBQUNEOztBQUNELFNBQU9QLFVBQVA7QUFDRCxDQUxEOztBQU9BSyxVQUFVLENBQUNHLG1CQUFYLEdB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O0FBQ0Q7QUFDRjs7QUFFRCxNQUFJeUIsY0FBS0MsUUFBTCxDQUFjd0csT0FBZCxDQUFKLEVBQTRCO0FBQzFCLFNBQUt4RSxnQkFBTCxHQUF3QixJQUF4QjtBQUNBLFVBQU1QLFVBQVUsR0FBRyxLQUFLL0gsVUFBeEI7QUFDQSxTQUFLQSxVQUFMLEdBQW1CLEdBQUVpSSxRQUFTLElBQUc2RSxPQUFRLEVBQXpDO0FBR0EsU0FBS2hLLE1BQUwsQ0FBWXlGLFVBQVosQ0FBdUJOLFFBQXZCLEVBQWlDSSxRQUFRLENBQUN5RSxPQUFELEVBQVUsRUFBVixDQUF6QyxFQUF3RFMsS0FBeEQsQ0FBK0RwTCxHQUFELElBQVM7QUFDckUsV0FBS2hDLEdBQUwsQ0FBUzZELElBQVQsQ0FBZSwwQkFBeUI3QixHQUFHLENBQUNHLE9BQVEsRUFBcEQ7QUFDQSxXQUFLdEMsVUFBTCxHQUFrQitILFVBQWxCO0FBQ0QsS0FIRDtBQUlBLFNBQUtPLGdCQUFMLEdBQXdCLEtBQXhCO0FBQ0Q7O0FBQ0QsT0FBS2tGLGlCQUFMLEdBQXlCekQsU0FBekI7QUFDRCxDQTdJRDs7QUFnSkEwRCxNQUFNLENBQUNDLE1BQVAsQ0FBYzlOLFFBQWQsRUFBd0JFLFVBQXhCLEVBQW9DRCxPQUFwQztlQUNlRCxRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlUmVtb3RlRGVidWdnZXIsIFJlbW90ZURlYnVnZ2VyIH0gZnJvbSAnYXBwaXVtLXJlbW90ZS1kZWJ1Z2dlcic7XG5pbXBvcnQgeyBlcnJvcnMsIGlzRXJyb3JUeXBlIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyB1dGlsLCB0aW1pbmcgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IElPU1BlcmZvcm1hbmNlTG9nIGZyb20gJy4uL2RldmljZS1sb2cvaW9zLXBlcmZvcm1hbmNlLWxvZyc7XG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuY29uc3QgTkFUSVZFX1dJTiA9ICdOQVRJVkVfQVBQJztcbmNvbnN0IFdFQlZJRVdfV0lOID0gJ1dFQlZJRVcnO1xuY29uc3QgV0VCVklFV19CQVNFID0gYCR7V0VCVklFV19XSU59X2A7XG5cbmNvbnN0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5cbmNvbW1hbmRzLmdldEN1cnJlbnRDb250ZXh0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q3VycmVudENvbnRleHQgKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgaWYgKHRoaXMuY3VyQ29udGV4dCAmJiB0aGlzLmN1ckNvbnRleHQgIT09IE5BVElWRV9XSU4pIHtcbiAgICByZXR1cm4gYCR7V0VCVklFV19CQVNFfSR7dGhpcy5jdXJDb250ZXh0fWA7XG4gIH1cbiAgcmV0dXJuIE5BVElWRV9XSU47XG59O1xuXG5leHRlbnNpb25zLmdldENvbnRleHRzQW5kVmlld3MgPSBhc3luYyBmdW5jdGlvbiBnZXRDb250ZXh0c0FuZFZpZXdzICh1c2VVcmwgPSB0cnVlKSB7XG4gIHRoaXMubG9nLmRlYnVnKCdSZXRyaWV2aW5nIGNvbnRleHRzIGFuZCB2aWV3cycpO1xuICBsZXQgd2Vidmlld3MgPSBhd2FpdCB0aGlzLmxpc3RXZWJGcmFtZXModXNlVXJsKTtcblxuICBsZXQgY3R4cyA9IFt7aWQ6IE5BVElWRV9XSU4sIHZpZXc6IHt9fV07XG4gIHRoaXMuY29udGV4dHMgPSBbTkFUSVZFX1dJTl07XG4gIGZvciAobGV0IHZpZXcgb2Ygd2Vidmlld3MpIHtcbiAgICBjdHhzLnB1c2goe2lkOiBgJHtXRUJWSUVXX0JBU0V9JHt2aWV3LmlkfWAsIHZpZXd9KTtcbiAgICB0aGlzLmNvbnRleHRzLnB1c2godmlldy5pZC50b1N0cmluZygpKTtcbiAgfVxuICByZXR1cm4gY3R4cztcbn07XG5cbi8vIFJpZ2h0IG5vdyB3ZSBkb24ndCBuZWNlc3NhcmlseSB3YWl0IGZvciB3ZWJ2aWV3XG4vLyBhbmQgZnJhbWUgdG8gbG9hZCwgd2hpY2ggbGVhZHMgdG8gcmFjZSBjb25kaXRpb25zIGFuZCBmbGFraW5lc3MsXG4vLyBsZXQncyBzZWUgaWYgd2UgY2FuIHRyYW5zaXRpb24gdG8gc29tZXRoaW5nIGJldHRlclxuZXh0ZW5zaW9ucy51c2VOZXdTYWZhcmkgPSBmdW5jdGlvbiB1c2VOZXdTYWZhcmkgKCkge1xuICByZXR1cm4gcGFyc2VGbG9hdCh0aGlzLmlvc1Nka1ZlcnNpb24pID49IDguMSAmJlxuICAgIHBhcnNlRmxvYXQodGhpcy5vcHRzLnBsYXRmb3JtVmVyc2lvbikgPj0gOC4xICYmXG4gICAgIXRoaXMuaXNSZWFsRGV2aWNlKCkgJiZcbiAgICB0aGlzLm9wdHMuc2FmYXJpO1xufTtcblxuZXh0ZW5zaW9ucy50eXBlQW5kTmF2VG9VcmwgPSBhc3luYyBmdW5jdGlvbiB0eXBlQW5kTmF2VG9VcmwgKCkge1xuICBsZXQgYWRkcmVzcyA9IHRoaXMub3B0cy5hZGRyZXNzID8gdGhpcy5vcHRzLmFkZHJlc3MgOiAnMTI3LjAuMC4xJztcbiAgdGhpcy5zZXRDdXJyZW50VXJsKHRoaXMuY2Fwcy5zYWZhcmlJbml0aWFsVXJsIHx8IGBodHRwOi8vJHthZGRyZXNzfToke3RoaXMub3B0cy5wb3J0fS93ZWxjb21lYCk7XG5cbiAgbGV0IHRyaWVzID0gMDtcbiAgY29uc3QgTUFYX1RSSUVTID0gMjtcbiAgbGV0IG5hdmlnYXRlID0gYXN5bmMgKCkgPT4ge1xuICAgIGxldCBvbGRJbXBXYWl0ID0gdGhpcy5pbXBsaWNpdFdhaXRNcztcbiAgICB0aGlzLmltcGxpY2l0V2FpdE1zID0gNzAwMDtcblxuICAgIC8vIGZpbmQgdGhlIHVybCBiYXIsIGFuZCB0YXAgb24gaXQuIHJldHJ5IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCB0cnlcbiAgICAvLyB0b28gc29vbiB3aGlsZSB0aGUgdmlldyBpcyBzdGlsbCBsb2FkaW5nXG4gICAgbGV0IGVsID0gYXdhaXQgcmV0cnlJbnRlcnZhbCgzLCAxMDAwLCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmZpbmRFbGVtZW50KCdhY2Nlc3NpYmlsaXR5IGlkJywgJ1VSTCcpKTtcbiAgICB0aGlzLmltcGxpY2l0V2FpdE1zID0gb2xkSW1wV2FpdDtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLm5hdGl2ZVRhcChlbC5FTEVNRU5UKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChfLmluY2x1ZGVzKGVyci5tZXNzYWdlLCAnY291bGQgbm90IGJlIHRhcHBlZCcpKSB7XG4gICAgICAgIGlmICh0cmllcysrID49IE1BWF9UUklFUykgdGhyb3cgZXJyOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICAgICAgLy8gZ2VuZXJhbGx5IHRoaXMgbWVhbnMgdGhhdCBTYWZhcmkgaXMgaW4gcGFnZSB2aWV3aW5nIG1vZGVcbiAgICAgICAgLy8gc28gdHJ5IHRvIG9wZW4gYSBuZXcgcGFnZSBhbmQgdGhlbiByZWRvIHRoZSBuYXZpZ2F0aW9uXG4gICAgICAgIGxldCBuZXdQYWdlQnV0dG9uID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudCgneHBhdGgnLCBcIi8vWENVSUVsZW1lbnRUeXBlQnV0dG9uW2NvbnRhaW5zKEBuYW1lLCdOZXcgcGFnZScpXVwiKTtcbiAgICAgICAgYXdhaXQgdGhpcy5uYXRpdmVUYXAobmV3UGFnZUJ1dHRvbi5FTEVNRU5UKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG5hdmlnYXRlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZ2V0IHRoZSBsYXN0IGFkZHJlc3MgZWxlbWVudCBhbmQgc2V0IHRoZSB1cmxcbiAgICB0cnkge1xuICAgICAgbGV0IGVsID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudCgnY2xhc3MgbmFtZScsICdYQ1VJRWxlbWVudFR5cGVUZXh0RmllbGQnKTtcbiAgICAgIGF3YWl0IHRoaXMuc2V0VmFsdWVJbW1lZGlhdGUodGhpcy5nZXRDdXJyZW50VXJsKCksIGVsKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIHRoaXMgaXMgZmxha2V5IG9uIGNlcnRhaW4gc3lzdGVtcyBzbyB3ZSByZXRyeSB1bnRpbCB3ZSBnZXQgc29tZXRoaW5nXG4gICAgICAvLyBpb3Mgc2ltczogc2FmYXJpIG9wZW5zIGJ1dCB0aGUgdGV4dCBmaWVsZCBjYW4ndCBiZSBmb3VuZFxuICAgICAgaWYgKHRyaWVzKysgPj0gTUFYX1RSSUVTKSB0aHJvdyBlcnI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcbiAgICAgIHJldHVybiBhd2FpdCBuYXZpZ2F0ZSgpO1xuICAgIH1cblxuICAgIC8vIG1ha2UgaXQgaGFwcGVuXG4gICAgdHJ5IHtcbiAgICAgIGVsID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudCgnYWNjZXNzaWJpbGl0eSBpZCcsICdHbycpO1xuICAgICAgYXdhaXQgdGhpcy5uYXRpdmVUYXAoZWwuRUxFTUVOVCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoXy5pbmNsdWRlcyhlcnIubWVzc2FnZSwgJ2NvdWxkIG5vdCBiZSB0YXBwZWQnKSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvcignVW5hYmxlIHRvIHN1Ym1pdCBVUkwgYmVjYXVzZSBcXCdHb1xcJyBidXR0b24gY291bGQgbm90IGJlIHRhcHBlZC4gJyArXG4gICAgICAgICAgJ1BsZWFzZSBtYWtlIHN1cmUgeW91ciBrZXlib2FyZCBpcyB0b2dnbGVkIG9uLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLm5hdlRvVmlld1dpdGhUaXRsZSh1bmRlZmluZWQsIG5ldyBSZWdFeHAodGhpcy5nZXRDdXJyZW50VXJsKCksICdpJykpO1xuXG4gICAgLy8gd2FpdCBmb3IgcGFnZSB0byBmaW5pc2ggbG9hZGluZy5cbiAgICBhd2FpdCB0aGlzLnJlbW90ZS5wYWdlVW5sb2FkKCk7XG4gIH07XG4gIGF3YWl0IG5hdmlnYXRlKCk7XG59O1xuXG5leHRlbnNpb25zLm5hdlRvVmlld1Rocm91Z2hGYXZvcml0ZXMgPSBhc3luYyBmdW5jdGlvbiBuYXZUb1ZpZXdUaHJvdWdoRmF2b3JpdGVzICgpIHtcbiAgdGhpcy5sb2cuZGVidWcoJ1dlIGFyZSBvbiBpT1M3KyBzaW11bGF0b3I6IGNsaWNraW5nIGFwcGxlIGJ1dHRvbiB0byBnZXQgaW50byBhIHdlYnZpZXcnKTtcbiAgbGV0IG9sZEltcFdhaXQgPSB0aGlzLmltcGxpY2l0V2FpdE1zO1xuICB0aGlzLmltcGxpY2l0V2FpdE1zID0gNzAwMDsgLy8gd2FpdCA3cyBmb3IgYXBwbGUgYnV0dG9uIHRvIGV4aXN0XG5cbiAgbGV0IGVsO1xuICB0cnkge1xuICAgIGVsID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudCgneHBhdGgnLCAnLy9YQ1VJRWxlbWVudFR5cGVTY3JvbGxWaWV3WzFdL1hDVUlFbGVtZW50VHlwZUJ1dHRvblsxXScpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsZXQgbXNnID0gJ0NvdWxkIG5vdCBmaW5kIGJ1dHRvbiB0byBjbGljayB0byBnZXQgaW50byB3ZWJ2aWV3LiAnICtcbiAgICAgICAgICAgICAgJ1Byb2NlZWRpbmcgb24gdGhlIGFzc3VtcHRpb24gd2UgaGF2ZSBhIHdvcmtpbmcgb25lLic7XG4gICAgdGhpcy5sb2cuZXJyb3IobXNnKTtcbiAgICB0aGlzLmltcGxpY2l0V2FpdE1zID0gb2xkSW1wV2FpdDtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5uYXZUb1ZpZXdXaXRoVGl0bGUoLy4qL2kpO1xuICB9XG4gIHRoaXMuaW1wbGljaXRXYWl0TXMgPSBvbGRJbXBXYWl0O1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMubmF0aXZlVGFwKGVsLkVMRU1FTlQpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsZXQgbXNnID0gJ0NvdWxkIG5vdCBjbGljayBidXR0b24gdG8gZ2V0IGludG8gd2Vidmlldy4gJyArXG4gICAgICAgICAgICAgICdQcm9jZWVkaW5nIG9uIHRoZSBhc3N1bXB0aW9uIHdlIGhhdmUgYSB3b3JraW5nIG9uZS4nO1xuICAgIHRoaXMubG9nLmVycm9yKG1zZyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5uYXZUb1ZpZXdXaXRoVGl0bGUoL2FwcGxlL2kpO1xufTtcblxuZXh0ZW5zaW9ucy5uYXZUb1ZpZXdXaXRoVGl0bGUgPSBhc3luYyBmdW5jdGlvbiBuYXZUb1ZpZXdXaXRoVGl0bGUgKHRpdGxlUmVnZXgsIHVybFJlZ0V4cCkge1xuICB0aGlzLmxvZy5kZWJ1ZygnTmF2aWdhdGluZyB0byBtb3N0IHJlY2VudGx5IG9wZW5lZCB3ZWJ2aWV3Jyk7XG4gIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gIGxldCBzcGluVGltZSA9IDUwMDtcbiAgbGV0IHNwaW5IYW5kbGVzID0gYXN5bmMgKCkgPT4ge1xuICAgIGxldCByZXM7XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IGF3YWl0IHRoaXMuZ2V0TGF0ZXN0V2Vidmlld0NvbnRleHRGb3JUaXRsZSh0aXRsZVJlZ2V4IHx8IHVybFJlZ0V4cCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoIWVyci5tZXNzYWdlLmluY2x1ZGVzKCdDb3VsZCBub3QgY29ubmVjdCB0byBhIHZhbGlkIGFwcCBhZnRlcicpKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBDb3VsZCBub3QgbmF2aWdhdGUgdG8gd2VidmlldyEgRXJyOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICBlcnJvci5zdGFjayArPSBgXFxuQ2F1c2VkIGJ5OiAke2Vyci5zdGFja31gO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nLmRlYnVnKCdDb3VsZCBub3QgbmF2aWdhdGUgdG8gd2Vidmlldy4gUmV0cnlpbmcgaWYgcG9zc2libGUuJyk7XG4gICAgfVxuICAgIGlmIChyZXMpIHtcbiAgICAgIGxldCBsYXRlc3RXaW5kb3cgPSByZXM7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgUGlja2luZyB3ZWJ2aWV3ICcke2xhdGVzdFdpbmRvd30nYCk7XG4gICAgICBhd2FpdCB0aGlzLnNldENvbnRleHQobGF0ZXN0V2luZG93KTtcbiAgICAgIGF3YWl0IHRoaXMucmVtb3RlLmNhbmNlbFBhZ2VMb2FkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gbm8gd2VidmlldyB3YXMgZm91bmRcbiAgICBpZiAoKERhdGUubm93KCkgLSBzdGFydCkgPj0gOTAwMDApIHtcbiAgICAgIC8vIHRvbyBzbG93LCBnZXQgb3V0XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBuYXZpZ2F0ZSB0byB3ZWJ2aWV3OyB0aGVyZSBhcmUgbm9uZSEnKTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZy53YXJuKCdDb3VsZCBub3QgZmluZCBhbnkgd2Vidmlld3MgeWV0LCByZWZyZXNoaW5nL3JldHJ5aW5nJyk7XG4gICAgaWYgKHRoaXMuaXNSZWFsRGV2aWNlKCkgfHwgIXRoaXMub3B0cy5zYWZhcmkpIHtcbiAgICAgIC8vIG9uIGEgcmVhbCBkZXZpY2UsIHdoZW4gbm90IHVzaW5nIFNhZmFyaSwgd2UganVzdCB3YW50IHRvIHRyeSBhZ2FpblxuICAgICAgYXdhaXQgQi5kZWxheShzcGluVGltZSk7XG4gICAgICByZXR1cm4gYXdhaXQgc3BpbkhhbmRsZXMoKTtcbiAgICB9XG5cbiAgICAvLyBmaW5kIHRoZSByZWxvYWQgYnV0dG9uIGFuZCB0YXAgaXQsIGlmIHBvc3NpYmxlXG4gICAgbGV0IGVsZW1lbnQ7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdGaW5kaW5nIGFuZCB0YXBwaW5nIHJlbG9hZCBidXR0b24nKTtcbiAgICAgIGVsZW1lbnQgPSBhd2FpdCB0aGlzLmZpbmRVSUVsZW1lbnRPckVsZW1lbnRzKCdhY2Nlc3NpYmlsaXR5IGlkJywgJ1JlbG9hZEJ1dHRvbicsICcnLCBmYWxzZSk7XG4gICAgICBhd2FpdCB0aGlzLm5hdGl2ZVRhcChlbGVtZW50LkVMRU1FTlQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cud2FybihgRXJyb3IgZmluZGluZyBhbmQgdGFwcGluZyByZWxvYWQgYnV0dG9uOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgdGhpcy5sb2cud2FybignUmV0cnlpbmcuJyk7XG4gICAgICBhd2FpdCBCLmRlbGF5KHNwaW5UaW1lKTtcbiAgICB9XG5cbiAgICAvLyB0cnkgaXQgYWxsIGFnYWluXG4gICAgcmV0dXJuIGF3YWl0IHNwaW5IYW5kbGVzKCk7XG4gIH07XG4gIGF3YWl0IHNwaW5IYW5kbGVzKCk7XG59O1xuXG5oZWxwZXJzLnN0b3BSZW1vdGUgPSBhc3luYyBmdW5jdGlvbiBzdG9wUmVtb3RlIChjbG9zZVdpbmRvd0JlZm9yZURpc2Nvbm5lY3RpbmcgPSBmYWxzZSkge1xuICBpZiAoIXRoaXMucmVtb3RlKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnVHJpZWQgdG8gbGVhdmUgYSB3ZWIgZnJhbWUgYnV0IHdlcmUgbm90IGluIG9uZScpO1xuICB9XG5cbiAgaWYgKGNsb3NlV2luZG93QmVmb3JlRGlzY29ubmVjdGluZykge1xuICAgIGF3YWl0IHRoaXMuY2xvc2VXaW5kb3coKTtcbiAgfVxuICBhd2FpdCB0aGlzLnJlbW90ZS5kaXNjb25uZWN0KCk7XG4gIHRoaXMuY3VyQ29udGV4dCA9IG51bGw7XG4gIHRoaXMuY3VyV2ViRnJhbWVzID0gW107XG4gIHRoaXMuY3VyV2ViQ29vcmRzID0gbnVsbDtcbiAgdGhpcy5yZW1vdGUgPSBudWxsO1xufTtcblxuaGVscGVycy5zZXRDdXJyZW50VXJsID0gZnVuY3Rpb24gc2V0Q3VycmVudFVybCAodXJsKSB7XG4gIHRoaXMuX2N1cnJlbnRVcmwgPSB1cmw7XG59O1xuXG5oZWxwZXJzLmdldEN1cnJlbnRVcmwgPSBmdW5jdGlvbiBnZXRDdXJyZW50VXJsICgpIHtcbiAgcmV0dXJuIHRoaXMuX2N1cnJlbnRVcmw7XG59O1xuXG5leHRlbnNpb25zLmNsb3NlQWxlcnRCZWZvcmVUZXN0ID0gYXN5bmMgZnVuY3Rpb24gY2xvc2VBbGVydEJlZm9yZVRlc3QgKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHRlbnNpb25zLm5hdlRvSW5pdGlhbFdlYnZpZXcgPSBhc3luYyBmdW5jdGlvbiBuYXZUb0luaXRpYWxXZWJ2aWV3ICgpIHtcbiAgaWYgKHRoaXMudXNlTmV3U2FmYXJpKCkpIHtcbiAgICBhd2FpdCB0aGlzLnR5cGVBbmROYXZUb1VybCgpO1xuICB9IGVsc2UgaWYgKCF0aGlzLmlzUmVhbERldmljZSgpICYmIHRoaXMub3B0cy5zYWZhcmkpIHtcbiAgICBhd2FpdCB0aGlzLm5hdlRvVmlld1Rocm91Z2hGYXZvcml0ZXMoKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCB0aGlzLm5hdlRvVmlld1dpdGhUaXRsZSgvLiovKTtcbiAgfVxufTtcblxuZXh0ZW5zaW9ucy5nZXRMYXRlc3RXZWJ2aWV3Q29udGV4dEZvclRpdGxlID0gYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0V2Vidmlld0NvbnRleHRGb3JUaXRsZSAocmVnRXhwKSB7XG4gIGNvbnN0IGN1cnJlbnRVcmwgPSB0aGlzLmdldEN1cnJlbnRVcmwoKTtcblxuICBjb25zdCBjb250ZXh0cyA9IF8uZmlsdGVyKGF3YWl0IHRoaXMuZ2V0Q29udGV4dHNBbmRWaWV3cygpLCAndmlldycpO1xuXG4gIGlmIChjdXJyZW50VXJsKSB7XG4gICAgLy8gZmlyc3QgdHJ5IHRvIG1hdGNoIGJ5IGN1cnJlbnQgdXJsXG4gICAgZm9yIChjb25zdCBjdHggb2YgY29udGV4dHMpIHtcbiAgICAgIGlmICgoY3R4LnZpZXcudXJsIHx8ICcnKSA9PT0gdGhpcy5nZXRDdXJyZW50VXJsKCkpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBpZiBub3QsIHRyeSB0byBtYXRjaCBieSByZWd1bGFyIGV4cHJlc3Npb25cbiAgZm9yIChjb25zdCBjdHggb2YgY29udGV4dHMpIHtcbiAgICBpZiAoKGN0eC52aWV3LnRpdGxlICYmIHJlZ0V4cC50ZXN0KGN0eC52aWV3LnRpdGxlKSkgfHwgKGN0eC52aWV3LnVybCAmJiByZWdFeHAudGVzdChjdHgudmlldy51cmwpKSkge1xuICAgICAgcmV0dXJuIGN0eC5pZDtcbiAgICB9XG4gIH1cbn07XG5cbmV4dGVuc2lvbnMuaXNXZWJDb250ZXh0ID0gZnVuY3Rpb24gaXNXZWJDb250ZXh0ICgpIHtcbiAgcmV0dXJuICEhdGhpcy5jdXJDb250ZXh0ICYmIHRoaXMuY3VyQ29udGV4dCAhPT0gTkFUSVZFX1dJTjtcbn07XG5cbmV4dGVuc2lvbnMuaXNXZWJ2aWV3ID0gZnVuY3Rpb24gaXNXZWJ2aWV3ICgpIHtcbiAgcmV0dXJuIHRoaXMuaXNXZWJDb250ZXh0KCk7XG59O1xuXG5leHRlbnNpb25zLmdldE5ld1JlbW90ZURlYnVnZ2VyID0gYXN5bmMgZnVuY3Rpb24gZ2V0TmV3UmVtb3RlRGVidWdnZXIgKCkge1xuICBsZXQgc29ja2V0UGF0aDtcbiAgaWYgKCF0aGlzLmlzUmVhbERldmljZSgpKSB7XG4gICAgc29ja2V0UGF0aCA9IGF3YWl0IHRoaXMub3B0cy5kZXZpY2UuZ2V0V2ViSW5zcGVjdG9yU29ja2V0KCk7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZVJlbW90ZURlYnVnZ2VyKHtcbiAgICBidW5kbGVJZDogdGhpcy5vcHRzLmJ1bmRsZUlkLFxuICAgIGFkZGl0aW9uYWxCdW5kbGVJZHM6IHRoaXMub3B0cy5hZGRpdGlvbmFsV2Vidmlld0J1bmRsZUlkcyxcbiAgICBpc1NhZmFyaTogdGhpcy5pc1NhZmFyaSgpLFxuICAgIGluY2x1ZGVTYWZhcmk6IHRoaXMub3B0cy5pbmNsdWRlU2FmYXJpSW5XZWJ2aWV3cyxcbiAgICB1c2VOZXdTYWZhcmk6IHRoaXMudXNlTmV3U2FmYXJpKCksXG4gICAgcGFnZUxvYWRNczogdGhpcy5wYWdlTG9hZE1zLFxuICAgIHBsYXRmb3JtVmVyc2lvbjogdGhpcy5vcHRzLnBsYXRmb3JtVmVyc2lvbixcbiAgICBzb2NrZXRQYXRoLFxuICAgIHJlbW90ZURlYnVnUHJveHk6IHRoaXMub3B0cy5yZW1vdGVEZWJ1Z1Byb3h5LFxuICAgIGdhcmJhZ2VDb2xsZWN0T25FeGVjdXRlOiB1dGlsLmhhc1ZhbHVlKHRoaXMub3B0cy5zYWZhcmlHYXJiYWdlQ29sbGVjdClcbiAgICAgID8gISF0aGlzLm9wdHMuc2FmYXJpR2FyYmFnZUNvbGxlY3RcbiAgICAgIDogZmFsc2UsXG4gICAgdWRpZDogdGhpcy5vcHRzLnVkaWQsXG4gICAgbG9nQWxsQ29tbXVuaWNhdGlvbjogdGhpcy5vcHRzLnNhZmFyaUxvZ0FsbENvbW11bmljYXRpb24sXG4gICAgbG9nQWxsQ29tbXVuaWNhdGlvbkhleER1bXA6IHRoaXMub3B0cy5zYWZhcmlMb2dBbGxDb21tdW5pY2F0aW9uSGV4RHVtcCxcbiAgICBzb2NrZXRDaHVua1NpemU6IHRoaXMub3B0cy5zYWZhcmlTb2NrZXRDaHVua1NpemUsXG4gICAgd2ViSW5zcGVjdG9yTWF4RnJhbWVMZW5ndGg6IHRoaXMub3B0cy5zYWZhcmlXZWJJbnNwZWN0b3JNYXhGcmFtZUxlbmd0aFxuICB9LCB0aGlzLmlzUmVhbERldmljZSgpKTtcbn07XG5cbi8qKlxuICogU2V0IGNvbnRleHRcbiAqXG4gKiBAcGFyYW0gez9zdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiBjb250ZXh0IHRvIHNldC4gSXQgY291bGQgYmUgJ251bGwnIGFzIE5BVElWRV9XSU4uXG4gKiBAcGFyYW0ge2NhbGxiYWNrfSBjYWxsYmFjayBUaGUgY2FsbGJhY2suIChJdCBpcyBub3QgY2FsbGVkIGluIHRoaXMgbWV0aG9kKVxuICogQHBhcmFtIHtib29sZWFufSBza2lwUmVhZHlDaGVjayAtIFdoZXRoZXIgaXQgd2FpdHMgZm9yIHRoZSBuZXcgY29udGV4dCBpcyByZWFkeVxuICovXG5jb21tYW5kcy5zZXRDb250ZXh0ID0gYXN5bmMgZnVuY3Rpb24gc2V0Q29udGV4dCAobmFtZSwgY2FsbGJhY2ssIHNraXBSZWFkeUNoZWNrKSB7XG4gIGZ1bmN0aW9uIGFscmVhZHlJbkNvbnRleHQgKGRlc2lyZWQsIGN1cnJlbnQpIHtcbiAgICByZXR1cm4gKGRlc2lyZWQgPT09IGN1cnJlbnQgfHxcbiAgICAgIChkZXNpcmVkID09PSBudWxsICYmIGN1cnJlbnQgPT09IE5BVElWRV9XSU4pIHx8XG4gICAgICAoZGVzaXJlZCA9PT0gTkFUSVZFX1dJTiAmJiBjdXJyZW50ID09PSBudWxsKSk7XG4gIH1cbiAgZnVuY3Rpb24gaXNOYXRpdmVDb250ZXh0IChjb250ZXh0KSB7XG4gICAgcmV0dXJuIGNvbnRleHQgPT09IE5BVElWRV9XSU4gfHwgY29udGV4dCA9PT0gbnVsbDtcbiAgfVxuXG4gIC8vIGFsbG93IHRoZSBmdWxsIGNvbnRleHQgbGlzdCB0byBiZSBwYXNzZWQgaW5cbiAgaWYgKG5hbWUgJiYgbmFtZS5pZCkge1xuICAgIG5hbWUgPSBuYW1lLmlkO1xuICB9XG5cbiAgdGhpcy5sb2cuZGVidWcoYEF0dGVtcHRpbmcgdG8gc2V0IGNvbnRleHQgdG8gJyR7bmFtZSB8fCBOQVRJVkVfV0lOfScgZnJvbSAnJHt0aGlzLmN1ckNvbnRleHQgPyB0aGlzLmN1ckNvbnRleHQgOiBOQVRJVkVfV0lOfSdgKTtcblxuICBpZiAoYWxyZWFkeUluQ29udGV4dChuYW1lLCB0aGlzLmN1ckNvbnRleHQpIHx8IGFscmVhZHlJbkNvbnRleHQoXy5yZXBsYWNlKG5hbWUsIFdFQlZJRVdfQkFTRSwgJycpLCB0aGlzLmN1ckNvbnRleHQpKSB7XG4gICAgLy8gYWxyZWFkeSBpbiB0aGUgbmFtZWQgY29udGV4dCwgbm8gbmVlZCB0byBkbyBhbnl0aGluZ1xuICAgIHRoaXMubG9nLmRlYnVnKGBBbHJlYWR5IGluICcke25hbWUgfHwgTkFUSVZFX1dJTn0nIGNvbnRleHQuIERvaW5nIG5vdGhpbmcuYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChpc05hdGl2ZUNvbnRleHQobmFtZSkpIHtcbiAgICAvLyBzd2l0Y2hpbmcgaW50byB0aGUgbmF0aXZlIGNvbnRleHRcbiAgICB0aGlzLmN1ckNvbnRleHQgPSBudWxsO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIHN3aXRjaGluZyBpbnRvIGEgd2VidmlldyBjb250ZXh0XG5cbiAgLy8gaWYgY29udGV4dHMgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIHJldHJpZXZlZCwgZ2V0IHRoZW1cbiAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5jb250ZXh0cykpIHtcbiAgICBhd2FpdCB0aGlzLmdldENvbnRleHRzKCk7XG4gIH1cblxuICBsZXQgY29udGV4dElkID0gXy5yZXBsYWNlKG5hbWUsIFdFQlZJRVdfQkFTRSwgJycpO1xuICBpZiAoY29udGV4dElkID09PSAnJykge1xuICAgIC8vIGFsbG93IHVzZXIgdG8gcGFzcyBpbiBcIldFQlZJRVdcIiB3aXRob3V0IGFuIGluZGV4XG4gICAgLy8gdGhlIHNlY29uZCBjb250ZXh0IHdpbGwgYmUgdGhlIGZpcnN0IHdlYnZpZXcgYXNcbiAgICAvLyB0aGUgZmlyc3QgaXMgYWx3YXlzIE5BVElWRV9BUFBcbiAgICBjb250ZXh0SWQgPSB0aGlzLmNvbnRleHRzWzFdO1xuICB9XG4gIGlmICghXy5pbmNsdWRlcyh0aGlzLmNvbnRleHRzLCBjb250ZXh0SWQpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob1N1Y2hDb250ZXh0RXJyb3IoKTtcbiAgfVxuXG4gIGNvbnN0IG9sZENvbnRleHQgPSB0aGlzLmN1ckNvbnRleHQ7XG4gIHRoaXMuY3VyQ29udGV4dCA9IHRoaXMuY3VyV2luZG93SGFuZGxlID0gY29udGV4dElkO1xuXG4gIC8vIGBjb250ZXh0SWRgIHdpbGwgYmUgaW4gdGhlIGZvcm0gb2YgYGFwcElkLnBhZ2VJZGAgaW4gdGhpcyBjYXNlXG4gIGNvbnN0IFthcHBJZEtleSwgcGFnZUlkS2V5XSA9IF8ubWFwKGNvbnRleHRJZC5zcGxpdCgnLicpLCAoaWQpID0+IHBhcnNlSW50KGlkLCAxMCkpO1xuICB0cnkge1xuICAgIHRoaXMuc2VsZWN0aW5nTmV3UGFnZSA9IHRydWU7XG4gICAgYXdhaXQgdGhpcy5yZW1vdGUuc2VsZWN0UGFnZShhcHBJZEtleSwgcGFnZUlkS2V5LCBza2lwUmVhZHlDaGVjayk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMuY3VyQ29udGV4dCA9IHRoaXMuY3VyV2luZG93SGFuZGxlID0gb2xkQ29udGV4dDtcbiAgICB0aHJvdyBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5zZWxlY3RpbmdOZXdQYWdlID0gZmFsc2U7XG4gIH1cblxuICAvLyBhdHRlbXB0IHRvIHN0YXJ0IHBlcmZvcm1hbmNlIGxvZ2dpbmcsIGlmIHJlcXVlc3RlZFxuICBpZiAodGhpcy5vcHRzLmVuYWJsZVBlcmZvcm1hbmNlTG9nZ2luZyAmJiB0aGlzLnJlbW90ZSkge1xuICAgIHRoaXMubG9nLmRlYnVnKGBTdGFydGluZyBwZXJmb3JtYW5jZSBsb2cgb24gJyR7dGhpcy5jdXJDb250ZXh0fSdgKTtcbiAgICB0aGlzLmxvZ3MucGVyZm9ybWFuY2UgPSBuZXcgSU9TUGVyZm9ybWFuY2VMb2codGhpcy5yZW1vdGUpO1xuICAgIGF3YWl0IHRoaXMubG9ncy5wZXJmb3JtYW5jZS5zdGFydENhcHR1cmUoKTtcbiAgfVxuXG4gIC8vIHN0YXJ0IHNhZmFyaSBsb2dnaW5nIGlmIHRoZSBsb2dzIGhhbmRsZXJzIGFyZSBhY3RpdmVcbiAgaWYgKG5hbWUgJiYgbmFtZSAhPT0gTkFUSVZFX1dJTiAmJiB0aGlzLmxvZ3MpIHtcbiAgICBpZiAodGhpcy5sb2dzLnNhZmFyaUNvbnNvbGUpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVtb3RlLnN0YXJ0Q29uc29sZSh0aGlzLmxvZ3Muc2FmYXJpQ29uc29sZS5hZGRMb2dMaW5lLmJpbmQodGhpcy5sb2dzLnNhZmFyaUNvbnNvbGUpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubG9ncy5zYWZhcmlOZXR3b3JrKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlbW90ZS5zdGFydE5ldHdvcmsodGhpcy5sb2dzLnNhZmFyaU5ldHdvcmsuYWRkTG9nTGluZS5iaW5kKHRoaXMubG9ncy5zYWZhcmlOZXR3b3JrKSk7XG4gICAgfVxuICB9XG59O1xuXG5leHRlbnNpb25zLmNvbm5lY3RUb1JlbW90ZURlYnVnZ2VyID0gYXN5bmMgZnVuY3Rpb24gY29ubmVjdFRvUmVtb3RlRGVidWdnZXIgKCkge1xuICB0aGlzLnJlbW90ZSA9IGF3YWl0IHRoaXMuZ2V0TmV3UmVtb3RlRGVidWdnZXIoKTtcblxuICB0aGlzLnJlbW90ZS5vbihSZW1vdGVEZWJ1Z2dlci5FVkVOVF9QQUdFX0NIQU5HRSwgdGhpcy5vblBhZ2VDaGFuZ2UuYmluZCh0aGlzKSk7XG4gIHRoaXMucmVtb3RlLm9uKFJlbW90ZURlYnVnZ2VyLkVWRU5UX0ZSQU1FU19ERVRBQ0hFRCwgKCkgPT4ge1xuICAgIGlmICghXy5pc0VtcHR5KHRoaXMuY3VyV2ViRnJhbWVzKSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYENsZWFyaW5nICR7dXRpbC5wbHVyYWxpemUoJ2ZyYW1lJywgdGhpcy5jdXJXZWJGcmFtZXMubGVuZ3RoLCB0cnVlKX06ICR7dGhpcy5jdXJXZWJGcmFtZXMuam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgdGhpcy5jdXJXZWJGcmFtZXMgPSBbXTtcbiAgfSk7XG5cbiAgYXdhaXQgdGhpcy5yZW1vdGUuY29ubmVjdCh0aGlzLm9wdHMud2Vidmlld0Nvbm5lY3RUaW1lb3V0KTtcbn07XG5cbmV4dGVuc2lvbnMubGlzdFdlYkZyYW1lcyA9IGFzeW5jIGZ1bmN0aW9uIGxpc3RXZWJGcmFtZXMgKHVzZVVybCA9IHRydWUpIHtcbiAgdXNlVXJsID0gdXNlVXJsICYmICF0aGlzLmlzUmVhbERldmljZSgpICYmICEhdGhpcy5nZXRDdXJyZW50VXJsKCk7XG4gIHRoaXMubG9nLmRlYnVnKGBTZWxlY3RpbmcgYnkgdXJsOiAke3VzZVVybH0gJHt1c2VVcmwgPyBgKGV4cGVjdGVkIHVybDogJyR7dGhpcy5nZXRDdXJyZW50VXJsKCl9JylgIDogJyd9YCk7XG5cbiAgY29uc3QgY3VycmVudFVybCA9IHVzZVVybCA/IHRoaXMuZ2V0Q3VycmVudFVybCgpIDogdW5kZWZpbmVkO1xuICBsZXQgcGFnZUFycmF5ID0gW107XG4gIGNvbnN0IGdldFdlYnZpZXdQYWdlcyA9IGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVtb3RlLnNlbGVjdEFwcChjdXJyZW50VXJsLCB0aGlzLm9wdHMud2Vidmlld0Nvbm5lY3RSZXRyaWVzLCB0aGlzLm9wdHMuaWdub3JlQWJvdXRCbGFua1VybCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgTm8gYXZhaWxhYmxlIHdlYiBwYWdlczogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH07XG5cbiAgaWYgKHRoaXMucmVtb3RlICYmIHRoaXMucmVtb3RlLmFwcElkS2V5KSB7XG4gICAgLy8gYWxyZWFkeSBjb25uZWN0ZWRcbiAgICBwYWdlQXJyYXkgPSBhd2FpdCBnZXRXZWJ2aWV3UGFnZXMoKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIXRoaXMucmVtb3RlKSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbm5lY3RUb1JlbW90ZURlYnVnZ2VyKCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMucmVtb3RlLnNldENvbm5lY3Rpb25LZXkoKTtcblxuICAgIHBhZ2VBcnJheSA9IGF3YWl0IGdldFdlYnZpZXdQYWdlcygpO1xuXG4gICAgY29uc3QgYWxlcnRFcnJvck1zZyA9ICdDbG9zZSBhbGVydCBmYWlsZWQuIFJldHJ5Lic7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJldHJ5SW50ZXJ2YWwoNiwgMTAwMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoIWF3YWl0IHRoaXMuY2xvc2VBbGVydEJlZm9yZVRlc3QoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihhbGVydEVycm9yTXNnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBpZiB0aGUgbG9vcCB0byBjbG9zZSBhbGVydHMgZmFpbGVkIHRvIGRpc21pc3MsIGlnbm9yZSxcbiAgICAgIC8vIG90aGVyd2lzZSBsb2cgYW5kIHRocm93IHRoZSBlcnJvclxuICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSBhbGVydEVycm9yTXNnKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAocGFnZUFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIHdlIGhhdmUgbm8gd2ViIGZyYW1lcywgYnV0IGNvbnRpbnVlIGFueXdheVxuICAgIHRoaXMubG9nLmRlYnVnKCdObyB3ZWIgZnJhbWVzIGZvdW5kLicpO1xuICB9XG4gIHJldHVybiBwYWdlQXJyYXk7XG59O1xuXG5jb21tYW5kcy5nZXRDb250ZXh0cyA9IGFzeW5jIGZ1bmN0aW9uIGdldENvbnRleHRzICgpIHtcbiAgdGhpcy5sb2cuZGVidWcoJ0dldHRpbmcgbGlzdCBvZiBhdmFpbGFibGUgY29udGV4dHMnKTtcbiAgY29uc3QgY29udGV4dHMgPSBhd2FpdCB0aGlzLmdldENvbnRleHRzQW5kVmlld3MoZmFsc2UpO1xuXG4gIGNvbnN0IG1hcEZuID0gdGhpcy5vcHRzLmZ1bGxDb250ZXh0TGlzdFxuICAgID8gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBjb250ZXh0LmlkLnRvU3RyaW5nKCksXG4gICAgICAgIHRpdGxlOiBjb250ZXh0LnZpZXcudGl0bGUsXG4gICAgICAgIHVybDogY29udGV4dC52aWV3LnVybCxcbiAgICAgICAgYnVuZGxlSWQ6IGNvbnRleHQudmlldy5idW5kbGVJZCxcbiAgICAgIH07XG4gICAgfVxuICAgIDogKGNvbnRleHQpID0+IGNvbnRleHQuaWQudG9TdHJpbmcoKTtcbiAgcmV0dXJuIGNvbnRleHRzLm1hcChtYXBGbik7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENvbnRleHRcbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgY29udGV4dC4gVGhlIG5hdGl2ZSBjb250ZXh0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSAnTkFUSVZFX0FQUCcgYW5kIHRoZSB3ZWJ2aWV3cyB3aWxsIGJlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dFQlZJRVdfeHh4J1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSB0aXRsZSAtIFRoZSB0aXRsZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYnZpZXcgY29udGVudFxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB1cmwgLSBUaGUgdXJsIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2VidmlldyBjb250ZW50XG4gKi9cblxuLyoqXG4gKiBHZXQgdGhlIGNvbnRleHRzIGF2YWlsYWJsZSwgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXJsIGFuZCB0aXRsZSBvZiBlYWNoXG4gKiB3ZWJ2aWV3XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBPcHRpb25zIHNldCwgd2hpY2ggY2FuIGluY2x1ZGUgYHdhaXRGb3JXZWJ2aWV3TXNgIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhlIHBlcmlvZCB0byBwb2xsIGZvciBhdmFpbGFibGUgd2Vidmlld3NcbiAqIEByZXR1cm5zIHtBcnJheX0gTGlzdCBvZiBDb250ZXh0IG9iamVjdHNcbiAqL1xuZXh0ZW5zaW9ucy5tb2JpbGVHZXRDb250ZXh0cyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUdldENvbnRleHRzIChvcHRzID0ge30pIHtcbiAgbGV0IHtcbiAgICB3YWl0Rm9yV2Vidmlld01zID0gMCxcbiAgfSA9IG9wdHM7XG5cbiAgLy8gbWFrZSBzdXJlIGl0IGlzIGEgbnVtYmVyLCBzbyB0aGUgZHVyYXRpb24gY2hlY2sgd29ya3MgcHJvcGVybHlcbiAgaWYgKCFfLmlzTnVtYmVyKHdhaXRGb3JXZWJ2aWV3TXMpKSB7XG4gICAgd2FpdEZvcldlYnZpZXdNcyA9IHBhcnNlSW50KHdhaXRGb3JXZWJ2aWV3TXMsIDEwKTtcbiAgICBpZiAoaXNOYU4od2FpdEZvcldlYnZpZXdNcykpIHtcbiAgICAgIHdhaXRGb3JXZWJ2aWV3TXMgPSAwO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGN1ck9wdCA9IHRoaXMub3B0cy5mdWxsQ29udGV4dExpc3Q7XG4gIHRoaXMub3B0cy5mdWxsQ29udGV4dExpc3QgPSB0cnVlO1xuXG4gIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gIHRyeSB7XG4gICAgbGV0IGNvbnRleHRzO1xuICAgIGRvIHtcbiAgICAgIGNvbnRleHRzID0gYXdhaXQgdGhpcy5nZXRDb250ZXh0cygpO1xuXG4gICAgICBpZiAoY29udGV4dHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYEZvdW5kIHdlYnZpZXcgY29udGV4dCBhZnRlciAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xuICAgICAgICByZXR1cm4gY29udGV4dHM7XG4gICAgICB9XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgTm8gd2Vidmlld3MgZm91bmQgaW4gJHt0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzLnRvRml4ZWQoMCl9bXNgKTtcbiAgICB9IHdoaWxlICh0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzIDwgd2FpdEZvcldlYnZpZXdNcyk7XG4gICAgcmV0dXJuIGNvbnRleHRzO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIHJlc2V0IHRoZSBvcHRpb24gc28gdGhlcmUgYXJlIG5vIHNpZGUgZWZmZWN0c1xuICAgIHRoaXMub3B0cy5mdWxsQ29udGV4dExpc3QgPSBjdXJPcHQ7XG4gIH1cbn07XG5cbmNvbW1hbmRzLnNldFdpbmRvdyA9IGFzeW5jIGZ1bmN0aW9uIHNldFdpbmRvdyAobmFtZSwgc2tpcFJlYWR5Q2hlY2spIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNldENvbnRleHQobmFtZSwgXy5ub29wLCBza2lwUmVhZHlDaGVjayk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIHRyYW5zbGF0ZSB0aGUgZXJyb3IgaW4gdGVybXMgb2Ygd2luZG93c1xuICAgIHRocm93IGlzRXJyb3JUeXBlKGVyciwgZXJyb3JzLk5vU3VjaENvbnRleHRFcnJvcilcbiAgICAgID8gbmV3IGVycm9ycy5Ob1N1Y2hXaW5kb3dFcnJvcigpXG4gICAgICA6IGVycjtcbiAgfVxufTtcblxuY29tbWFuZHMuZ2V0V2luZG93SGFuZGxlID0gYXN5bmMgZnVuY3Rpb24gZ2V0V2luZG93SGFuZGxlICgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG4gIHRoaXMubG9nLmRlYnVnKGBHZXR0aW5nIGN1cnJlbnQgd2luZG93IGhhbmRsZWApO1xuICByZXR1cm4gdGhpcy5jdXJDb250ZXh0O1xufTtcblxuY29tbWFuZHMuZ2V0V2luZG93SGFuZGxlcyA9IGFzeW5jIGZ1bmN0aW9uIGdldFdpbmRvd0hhbmRsZXMgKCkge1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuICB0aGlzLmxvZy5kZWJ1ZygnR2V0dGluZyBsaXN0IG9mIGF2YWlsYWJsZSB3aW5kb3cgaGFuZGxlcycpO1xuICBjb25zdCBjb250ZXh0cyA9IGF3YWl0IHRoaXMuZ2V0Q29udGV4dHNBbmRWaWV3cyhmYWxzZSk7XG4gIHJldHVybiBjb250ZXh0c1xuICAgIC8vIGdldCByaWQgb2YgdGhlIG5hdGl2ZSBhcHAgY29udGV4dFxuICAgIC5maWx0ZXIoKGNvbnRleHQpID0+IGNvbnRleHQuaWQgIT09IE5BVElWRV9XSU4pXG4gICAgLy8gZ2V0IHRoZSBgYXBwLmlkYCBmb3JtYXQgZXhwZWN0ZWRcbiAgICAubWFwKChjb250ZXh0KSA9PiBjb250ZXh0LnZpZXcuaWQudG9TdHJpbmcoKSk7XG59O1xuXG5leHRlbnNpb25zLm9uUGFnZUNoYW5nZSA9IGFzeW5jIGZ1bmN0aW9uIG9uUGFnZUNoYW5nZSAocGFnZUNoYW5nZU5vdGlmaWNhdGlvbikge1xuICB0aGlzLmxvZy5kZWJ1ZyhgUmVtb3RlIGRlYnVnZ2VyIG5vdGlmaWVkIHVzIG9mIGEgbmV3IHBhZ2UgbGlzdGluZzogJHtKU09OLnN0cmluZ2lmeShwYWdlQ2hhbmdlTm90aWZpY2F0aW9uKX1gKTtcbiAgaWYgKHRoaXMuc2VsZWN0aW5nTmV3UGFnZSkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdXZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBzZWxlY3RpbmcgYSBwYWdlLCBpZ25vcmluZycpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIXRoaXMucmVtb3RlIHx8ICF0aGlzLnJlbW90ZS5pc0Nvbm5lY3RlZCkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdXZSBoYXZlIG5vdCB5ZXQgY29ubmVjdGVkLCBpZ25vcmluZycpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHthcHBJZEtleSwgcGFnZUFycmF5fSA9IHBhZ2VDaGFuZ2VOb3RpZmljYXRpb247XG5cbiAgbGV0IG5ld0lkcyA9IFtdO1xuICBsZXQgbmV3UGFnZXMgPSBbXTtcbiAgbGV0IGtleUlkID0gbnVsbDtcblxuICAvLyBDaGVja3MgaWYgYSBVUkwgaXMgYmxhY2tsaXN0ZWQgaW4gdGhlICdzYWZhcmlJZ25vcmVXZWJIb3N0bmFtZXMnIGNhcGFiaWxpdHlcbiAgZnVuY3Rpb24gaXNVcmxJZ25vcmVkICh1cmwsIHNhZmFyaUlnbm9yZVdlYkhvc3RuYW1lcykge1xuICAgIGNvbnN0IGlnbm9yZWRIb3N0cyA9IChzYWZhcmlJZ25vcmVXZWJIb3N0bmFtZXMgfHwgJycpXG4gICAgICAuc3BsaXQoJywnKVxuICAgICAgLm1hcCgoYikgPT4gYi50cmltKCkpXG4gICAgICAuZmlsdGVyKChiKSA9PiAhXy5pc0VtcHR5KGIpKTtcbiAgICBmb3IgKGNvbnN0IGlnbm9yZWRIb3N0IG9mIGlnbm9yZWRIb3N0cykge1xuICAgICAgaWYgKGlnbm9yZWRIb3N0ID09PSAnYWJvdXQ6YmxhbmsnICYmIHVybCA9PT0gJ2Fib3V0OmJsYW5rJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaG9zdG5hbWUgPSBuZXcgVVJMKHVybCkuaG9zdG5hbWU7XG4gICAgICAgICAgaWYgKGhvc3RuYW1lID09PSBpZ25vcmVkSG9zdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nIGlmIGludmFsaWQgVVJMXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yIChjb25zdCBwYWdlIG9mIHBhZ2VBcnJheSkge1xuICAgIGNvbnN0IGlkID0gcGFnZS5pZC50b1N0cmluZygpO1xuICAgIG5ld0lkcy5wdXNoKGlkKTtcbiAgICBpZiAocGFnZS5pc0tleSkge1xuICAgICAga2V5SWQgPSBpZDtcbiAgICB9XG4gICAgY29uc3QgY29udGV4dElkID0gYCR7YXBwSWRLZXl9LiR7aWR9YDtcblxuICAgIC8vIGFkZCBpZiB0aGlzIGlzIGEgbmV3IHBhZ2VcbiAgICBpZiAoIV8uaW5jbHVkZXModGhpcy5jb250ZXh0cywgY29udGV4dElkKSkge1xuICAgICAgaWYgKGlzVXJsSWdub3JlZChwYWdlLnVybCwgdGhpcy5vcHRzLnNhZmFyaUlnbm9yZVdlYkhvc3RuYW1lcykpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgTm90IHRyYWNraW5nICcke3BhZ2UudXJsfScgcGFnZSBiZWNhdXNlIGl0IGlzIGJsYWNrbGlzdGVkLiBgICtcbiAgICAgICAgICBgJ3NhZmFyaUlnbm9yZVdlYkhvc3RuYW1lcyc9JHt0aGlzLm9wdHMuc2FmYXJpSWdub3JlV2ViSG9zdG5hbWVzfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3UGFnZXMucHVzaChpZCk7XG4gICAgICAgIHRoaXMuY29udGV4dHMucHVzaChjb250ZXh0SWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICgha2V5SWQpIHtcbiAgICAvLyBpZiB0aGVyZSBpcyBubyBrZXkgaWQsIHB1bGwgdGhlIGZpcnN0IGlkIGZyb20gdGhlIHBhZ2UgYXJyYXkgYW5kIHVzZSB0aGF0XG4gICAgLy8gYXMgYSBzdGFuZCBpblxuICAgIHRoaXMubG9nLmRlYnVnKCdObyBrZXkgaWQgZm91bmQuIENob29zaW5nIGZpcnN0IGlkIGZyb20gcGFnZSBhcnJheScpO1xuICAgIGtleUlkID0gbmV3SWRzWzBdIHx8IG51bGw7XG4gIH1cblxuICBpZiAoIXV0aWwuaGFzVmFsdWUodGhpcy5jdXJDb250ZXh0KSkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdXZSBkbyBub3QgYXBwZWFyIHRvIGhhdmUgd2luZG93IHNldCB5ZXQsIGlnbm9yaW5nJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgW2N1ckFwcElkS2V5LCBjdXJQYWdlSWRLZXldID0gdGhpcy5jdXJDb250ZXh0LnNwbGl0KCcuJyk7XG5cbiAgaWYgKGN1ckFwcElkS2V5ICE9PSBhcHBJZEtleSkge1xuICAgIHRoaXMubG9nLmRlYnVnKCdQYWdlIGNoYW5nZSBub3QgcmVmZXJyaW5nIHRvIGN1cnJlbnRseSBzZWxlY3RlZCBhcHAsIGlnbm9yaW5nLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBuZXdQYWdlID0gbnVsbDtcbiAgaWYgKG5ld1BhZ2VzLmxlbmd0aCkge1xuICAgIG5ld1BhZ2UgPSBfLmxhc3QobmV3UGFnZXMpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBXZSBoYXZlIG5ldyBwYWdlcywgc2VsZWN0aW5nIHBhZ2UgJyR7bmV3UGFnZX0nYCk7XG4gIH0gZWxzZSBpZiAoIV8uaW5jbHVkZXMobmV3SWRzLCBjdXJQYWdlSWRLZXkpKSB7XG4gICAgdGhpcy5sb2cuZGVidWcoJ05ldyBwYWdlIGxpc3RpbmcgZnJvbSByZW1vdGUgZGVidWdnZXIgZG9lcyBub3QgY29udGFpbiAnICtcbiAgICAgICAgICAgICAgICAgJ2N1cnJlbnQgd2luZG93OyBhc3N1bWluZyBpdCBpcyBjbG9zZWQnKTtcbiAgICBpZiAoIXV0aWwuaGFzVmFsdWUoa2V5SWQpKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvcignRG8gbm90IGhhdmUgb3VyIGN1cnJlbnQgd2luZG93IGFueW1vcmUsIGFuZCB0aGVyZSAnICtcbiAgICAgICAgICAgICAgICAgICAnYXJlIG5vdCBhbnkgbW9yZSB0byBsb2FkISBEb2luZyBub3RoaW5nLi4uJyk7XG4gICAgICB0aGlzLnNldEN1cnJlbnRVcmwodW5kZWZpbmVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvZy5kZWJ1ZyhgRGVidWdnZXIgYWxyZWFkeSBzZWxlY3RlZCBwYWdlICcke2tleUlkfScsIGAgK1xuICAgICAgICAgICAgICAgICBgY29uZmlybWluZyB0aGF0IGNob2ljZS5gKTtcbiAgICB0aGlzLmN1ckNvbnRleHQgPSBgJHthcHBJZEtleX0uJHtrZXlJZH1gO1xuICAgIG5ld1BhZ2UgPSBrZXlJZDtcbiAgfSBlbHNlIHtcbiAgICAvLyBhdCB0aGlzIHBvaW50LCB0aGVyZSBhcmUgbm8gbmV3IHBhZ2VzLCBhbmQgdGhlIGN1cnJlbnQgcGFnZSBzdGlsbCBleGlzdHNcbiAgICB0aGlzLmxvZy5kZWJ1ZygnQ2hlY2tpbmcgaWYgcGFnZSBuZWVkcyB0byBsb2FkJyk7XG4gICAgLy8gSWYgYSB3aW5kb3cgbmF2aWdhdGVzIHRvIGFuIGFuY2hvciBpdCBkb2Vzbid0IGFsd2F5cyBmaXJlIGEgcGFnZVxuICAgIC8vIGNhbGxiYWNrIGV2ZW50LiBMZXQncyBjaGVjayBpZiB3ZSB3b3VuZCB1cCBpbiBzdWNoIGEgc2l0dWF0aW9uLlxuICAgIGNvbnN0IG5lZWRzUGFnZUxvYWQgPSAoKCkgPT4ge1xuICAgICAgLy8gbmVlZCB0byBtYXAgdGhlIHBhZ2UgaWRzIHRvIGNvbnRleHQgaWRzXG4gICAgICBjb25zdCBjb250ZXh0QXJyYXkgPSBfLm1hcChwYWdlQXJyYXksIChwYWdlKSA9PiBgJHthcHBJZEtleX0uJHtwYWdlLmlkfWApO1xuICAgICAgLy8gY2hlY2sgaWYgdGhlIGN1cnJlbnQgY29udGV4dCBleGlzdHMgaW4gYm90aCBvdXIgcmVjb3JkZWQgY29udGV4dHMsXG4gICAgICAvLyBhbmQgdGhlIHBhZ2UgYXJyYXlcbiAgICAgIHJldHVybiAhXy5pc0VxdWFsKF8uZmluZCh0aGlzLmNvbnRleHRzLCB0aGlzLmN1ckNvbnRleHQpLCBfLmZpbmQoY29udGV4dEFycmF5LCB0aGlzLmN1ckNvbnRleHQpKTtcbiAgICB9KSgpO1xuXG4gICAgaWYgKG5lZWRzUGFnZUxvYWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdQYWdlIGxvYWQgbmVlZGVkLiBMb2FkaW5nLi4uJyk7XG4gICAgICBhd2FpdCB0aGlzLnJlbW90ZS5wYWdlTG9hZCgpO1xuICAgIH1cblxuICAgIHRoaXMubG9nLmRlYnVnKCdOZXcgcGFnZSBsaXN0aW5nIGlzIHNhbWUgYXMgb2xkLCBkb2luZyBub3RoaW5nJyk7XG4gIH1cblxuICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgcGFnZSBsaXN0aW5nIGlzbid0IGluZGljYXRpbmcgYSByZWRpcmVjdFxuICBpZiAodXRpbC5oYXNWYWx1ZSh0aGlzLmN1ckNvbnRleHQpKSB7XG4gICAgbGV0IGN1cnJlbnRQYWdlSWQgPSBwYXJzZUludChfLmxhc3QodGhpcy5jdXJDb250ZXh0LnNwbGl0KCcuJykpLCAxMCk7XG4gICAgbGV0IHBhZ2UgPSBfLmZpbmQocGFnZUFycmF5LCAocCkgPT4gcGFyc2VJbnQocC5pZCwgMTApID09PSBjdXJyZW50UGFnZUlkKTtcbiAgICBpZiAocGFnZSAmJiBwYWdlLnVybCAhPT0gdGhpcy5nZXRDdXJyZW50VXJsKCkpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBSZWRpcmVjdGVkIGZyb20gJyR7dGhpcy5nZXRDdXJyZW50VXJsKCl9JyB0byAnJHtwYWdlLnVybH0nYCk7XG4gICAgICB0aGlzLnNldEN1cnJlbnRVcmwocGFnZS51cmwpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh1dGlsLmhhc1ZhbHVlKG5ld1BhZ2UpKSB7XG4gICAgdGhpcy5zZWxlY3RpbmdOZXdQYWdlID0gdHJ1ZTtcbiAgICBjb25zdCBvbGRDb250ZXh0ID0gdGhpcy5jdXJDb250ZXh0O1xuICAgIHRoaXMuY3VyQ29udGV4dCA9IGAke2FwcElkS2V5fS4ke25ld1BhZ2V9YDtcbiAgICAvLyBkbyBub3Qgd2FpdCwgYXMgdGhpcyBjYW4gdGFrZSBhIGxvbmcgdGltZSwgYW5kIHRoZSByZXNwb25zZSBpcyBub3QgbmVjZXNzYXJ5XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLWNhbGxiYWNrcywgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tdGhlblxuICAgIHRoaXMucmVtb3RlLnNlbGVjdFBhZ2UoYXBwSWRLZXksIHBhcnNlSW50KG5ld1BhZ2UsIDEwKSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgdGhpcy5sb2cud2FybihgRmFpbGVkIHRvIHNlbGVjdCBwYWdlOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgdGhpcy5jdXJDb250ZXh0ID0gb2xkQ29udGV4dDtcbiAgICB9KTtcbiAgICB0aGlzLnNlbGVjdGluZ05ld1BhZ2UgPSBmYWxzZTtcbiAgfVxuICB0aGlzLndpbmRvd0hhbmRsZUNhY2hlID0gcGFnZUFycmF5O1xufTtcblxuXG5PYmplY3QuYXNzaWduKGNvbW1hbmRzLCBleHRlbnNpb25zLCBoZWxwZXJzKTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|