vg-coder-cli 2.0.31 → 2.0.32
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/ARCHITECTURE.md +255 -0
- package/README.md +0 -11
- package/change.sh +0 -0
- package/dist/vg-coder-bundle.js +42 -0
- package/gulpfile.js +111 -0
- package/package.json +19 -11
- package/src/index.js +28 -220
- package/src/server/api-server.js +120 -428
- package/src/server/views/css/bubble.css +81 -0
- package/src/server/views/css/code-viewer.css +58 -0
- package/src/server/views/css/terminal.css +59 -155
- package/src/server/views/dashboard.css +78 -678
- package/src/server/views/dashboard.html +39 -278
- package/src/server/views/js/api.js +2 -22
- package/src/server/views/js/config.js +27 -15
- package/src/server/views/js/event-protocol.js +263 -0
- package/src/server/views/js/features/bubble-features/index.js +125 -0
- package/src/server/views/js/features/bubble-features/paste-run-feature.js +16 -0
- package/src/server/views/js/features/bubble-features/terminal-feature.js +16 -0
- package/src/server/views/js/features/bubble.js +175 -0
- package/src/server/views/js/features/code-viewer.js +90 -0
- package/src/server/views/js/features/commands.js +34 -81
- package/src/server/views/js/features/editor-tabs.js +19 -46
- package/src/server/views/js/features/git-view.js +63 -81
- package/src/server/views/js/features/iframe-manager.js +3 -97
- package/src/server/views/js/features/monaco-manager.js +19 -39
- package/src/server/views/js/features/project-switcher.js +7 -63
- package/src/server/views/js/features/resize.js +5 -16
- package/src/server/views/js/features/structure.js +38 -106
- package/src/server/views/js/features/terminal.js +102 -418
- package/src/server/views/js/handlers.js +60 -43
- package/src/server/views/js/main.js +75 -179
- package/src/server/views/js/shadow-entry.js +21 -0
- package/src/server/views/js/utils.js +48 -28
- package/src/server/views/vg-coder/_metadata/generated_indexed_rulesets/_ruleset1 +0 -0
- package/src/server/views/vg-coder/controller.js +33 -258
- package/vetgo-auto/chrome/src/utils/injector-script.ts +33 -258
- package/vetgo-auto/vg-coder.zip +0 -0
- package/src/server/views/dashboard.js +0 -457
- package/test-pty.js +0 -31
|
@@ -375,275 +375,50 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
375
375
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
376
376
|
/* harmony export */ VG_CODER_INJECTOR_SCRIPT: () => (/* binding */ VG_CODER_INJECTOR_SCRIPT)
|
|
377
377
|
/* harmony export */ });
|
|
378
|
-
// VG Coder
|
|
379
|
-
//
|
|
378
|
+
// VG Coder Shadow DOM Bundle Loader
|
|
379
|
+
// This script fetches the compiled bundle from the local server and executes it.
|
|
380
380
|
const VG_CODER_INJECTOR_SCRIPT = `
|
|
381
381
|
(function() {
|
|
382
382
|
'use strict';
|
|
383
383
|
|
|
384
384
|
const CONFIG = {
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
CONTAINER_ID: 'vg-coder-
|
|
388
|
-
CONTROLS_ID: 'vg-coder-controls',
|
|
389
|
-
RESIZE_HANDLE_ID: 'vg-coder-resize-handle',
|
|
390
|
-
DEFAULT_WIDTH: '420px',
|
|
391
|
-
FULLSCREEN_WIDTH: '100%',
|
|
392
|
-
MIN_WIDTH: 300,
|
|
393
|
-
MAX_WIDTH_PERCENT: 70,
|
|
394
|
-
STATE_DEFAULT: 'default',
|
|
395
|
-
STATE_FULLSCREEN: 'fullscreen',
|
|
396
|
-
STATE_COLLAPSED: 'collapsed',
|
|
397
|
-
Z_INDEX: 9999,
|
|
398
|
-
STORAGE_KEY_WIDTH: 'vg_coder_width',
|
|
399
|
-
STORAGE_KEY_STATE: 'vg_coder_state',
|
|
385
|
+
// Trỏ tới file bundle vừa build
|
|
386
|
+
BUNDLE_URL: 'http://localhost:6868/dist/vg-coder-bundle.js',
|
|
387
|
+
CONTAINER_ID: 'vg-coder-shadow-host'
|
|
400
388
|
};
|
|
401
389
|
|
|
402
|
-
|
|
403
|
-
console.log('🚫 VG Coder iframe injection skipped - nested context');
|
|
404
|
-
return;
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
if (window.self !== window.top && document.referrer.includes(':6868')) {
|
|
408
|
-
console.log('🚫 VG Coder iframe injection skipped - parent is :6868');
|
|
409
|
-
return;
|
|
410
|
-
}
|
|
411
|
-
|
|
390
|
+
// 1. Kiểm tra nếu đã inject rồi
|
|
412
391
|
if (document.getElementById(CONFIG.CONTAINER_ID)) {
|
|
413
|
-
console.log('
|
|
392
|
+
console.log('⚡ VG Coder already injected');
|
|
414
393
|
return;
|
|
415
394
|
}
|
|
395
|
+
|
|
396
|
+
console.log('🚀 Loading VG Coder Bundle from:', CONFIG.BUNDLE_URL);
|
|
397
|
+
|
|
398
|
+
// 2. Tạo Script Tag để load bundle
|
|
399
|
+
// Cách này tốt hơn fetch+eval vì tận dụng cache và debug dễ hơn
|
|
400
|
+
const script = document.createElement('script');
|
|
401
|
+
script.src = CONFIG.BUNDLE_URL;
|
|
402
|
+
script.type = 'text/javascript';
|
|
403
|
+
script.async = true;
|
|
416
404
|
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
function getWidth() {
|
|
422
|
-
return localStorage.getItem(CONFIG.STORAGE_KEY_WIDTH) || CONFIG.DEFAULT_WIDTH;
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
function setState(state) {
|
|
426
|
-
localStorage.setItem(CONFIG.STORAGE_KEY_STATE, state);
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
function setWidth(width) {
|
|
430
|
-
localStorage.setItem(CONFIG.STORAGE_KEY_WIDTH, width);
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
function updateBodyMargin(width) {
|
|
434
|
-
if (!document.body.style.transition.includes('margin')) {
|
|
435
|
-
document.body.style.transition = 'margin-left 0.3s ease';
|
|
436
|
-
}
|
|
437
|
-
document.body.style.marginLeft = width;
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
function removeBodyMargin() {
|
|
441
|
-
document.body.style.marginLeft = '0';
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
function injectStyles() {
|
|
445
|
-
const style = document.createElement('style');
|
|
446
|
-
style.textContent = '#' + CONFIG.CONTAINER_ID + ' {' +
|
|
447
|
-
'position: fixed; top: 0; left: 0; bottom: 0;' +
|
|
448
|
-
'width: ' + getWidth() + ';' +
|
|
449
|
-
'background: #1a1a1a; z-index: ' + CONFIG.Z_INDEX + ';' +
|
|
450
|
-
'display: flex; flex-direction: column;' +
|
|
451
|
-
'box-shadow: 4px 0 12px rgba(0, 0, 0, 0.3);' +
|
|
452
|
-
'transition: width 0.3s ease, transform 0.3s ease;' +
|
|
453
|
-
'}' +
|
|
454
|
-
'#' + CONFIG.CONTAINER_ID + '.collapsed { transform: translateX(-100%); }' +
|
|
455
|
-
'#' + CONFIG.IFRAME_ID + ' {' +
|
|
456
|
-
'flex: 1; border: none; width: 100%; height: 100%; background: white;' +
|
|
457
|
-
'}' +
|
|
458
|
-
'#' + CONFIG.CONTROLS_ID + ' {' +
|
|
459
|
-
'position: absolute; top: 50%; right: -36px; transform: translateY(-50%);' +
|
|
460
|
-
'z-index: ' + (CONFIG.Z_INDEX + 1) + '; display: flex; flex-direction: column; gap: 4px;' +
|
|
461
|
-
'transition: right 0.3s ease;' +
|
|
462
|
-
'}' +
|
|
463
|
-
'#' + CONFIG.CONTROLS_ID + '.fullscreen {' +
|
|
464
|
-
'right: 12px;' +
|
|
465
|
-
'}' +
|
|
466
|
-
'#' + CONFIG.CONTROLS_ID + ' button {' +
|
|
467
|
-
'background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);' +
|
|
468
|
-
'color: white; border: none; border-radius: 0 6px 6px 0;' +
|
|
469
|
-
'padding: 8px 6px; cursor: pointer; font-size: 18px;' +
|
|
470
|
-
'box-shadow: -2px 2px 6px rgba(0, 0, 0, 0.2);' +
|
|
471
|
-
'transition: all 0.2s ease; width: 32px; height: 32px;' +
|
|
472
|
-
'display: flex; align-items: center; justify-content: center;' +
|
|
473
|
-
'}' +
|
|
474
|
-
'#' + CONFIG.CONTROLS_ID + ' button.hidden {' +
|
|
475
|
-
'display: none;' +
|
|
476
|
-
'}' +
|
|
477
|
-
'#' + CONFIG.CONTROLS_ID + ' button:hover {' +
|
|
478
|
-
'background: linear-gradient(135deg, #764ba2 0%, #667eea 100%);' +
|
|
479
|
-
'box-shadow: -3px 3px 8px rgba(0, 0, 0, 0.3);' +
|
|
480
|
-
'}' +
|
|
481
|
-
'#' + CONFIG.RESIZE_HANDLE_ID + ' {' +
|
|
482
|
-
'position: absolute; right: 0; top: 0; bottom: 0; width: 6px;' +
|
|
483
|
-
'cursor: ew-resize; background: transparent; transition: background 0.2s ease;' +
|
|
484
|
-
'}' +
|
|
485
|
-
'#' + CONFIG.RESIZE_HANDLE_ID + ':hover { background: rgba(102, 126, 234, 0.5); }' +
|
|
486
|
-
'#' + CONFIG.RESIZE_HANDLE_ID + '.resizing { background: rgba(102, 126, 234, 0.8); }';
|
|
487
|
-
document.head.appendChild(style);
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
function createContainer() {
|
|
491
|
-
const container = document.createElement('div');
|
|
492
|
-
container.id = CONFIG.CONTAINER_ID;
|
|
493
|
-
const currentState = getState();
|
|
494
|
-
if (currentState === CONFIG.STATE_COLLAPSED) {
|
|
495
|
-
container.classList.add('collapsed');
|
|
496
|
-
} else if (currentState === CONFIG.STATE_FULLSCREEN) {
|
|
497
|
-
container.style.width = CONFIG.FULLSCREEN_WIDTH;
|
|
498
|
-
}
|
|
499
|
-
return container;
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
function createIframe() {
|
|
503
|
-
const iframe = document.createElement('iframe');
|
|
504
|
-
iframe.id = CONFIG.IFRAME_ID;
|
|
505
|
-
iframe.src = CONFIG.VG_CODER_URL;
|
|
506
|
-
iframe.title = 'VG Coder Dashboard';
|
|
507
|
-
iframe.allow = 'clipboard-read; clipboard-write';
|
|
508
|
-
return iframe;
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
function createResizeHandle() {
|
|
512
|
-
const handle = document.createElement('div');
|
|
513
|
-
handle.id = CONFIG.RESIZE_HANDLE_ID;
|
|
514
|
-
return handle;
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
function createControls() {
|
|
518
|
-
const controls = document.createElement('div');
|
|
519
|
-
controls.id = CONFIG.CONTROLS_ID;
|
|
520
|
-
const currentState = getState();
|
|
521
|
-
if (currentState === CONFIG.STATE_FULLSCREEN) {
|
|
522
|
-
controls.classList.add('fullscreen');
|
|
523
|
-
}
|
|
524
|
-
const btnFullscreen = document.createElement('button');
|
|
525
|
-
btnFullscreen.innerHTML = currentState === CONFIG.STATE_FULLSCREEN ? '◧' : '▣';
|
|
526
|
-
btnFullscreen.title = currentState === CONFIG.STATE_FULLSCREEN ? 'Default (45%)' : 'Fullscreen (100%)';
|
|
527
|
-
if (currentState === CONFIG.STATE_COLLAPSED) {
|
|
528
|
-
btnFullscreen.classList.add('hidden');
|
|
529
|
-
}
|
|
530
|
-
const btnCollapse = document.createElement('button');
|
|
531
|
-
btnCollapse.innerHTML = currentState === CONFIG.STATE_COLLAPSED ? '▶' : '◄';
|
|
532
|
-
btnCollapse.title = currentState === CONFIG.STATE_COLLAPSED ? 'Expand' : 'Collapse';
|
|
533
|
-
controls.appendChild(btnFullscreen);
|
|
534
|
-
controls.appendChild(btnCollapse);
|
|
535
|
-
return controls;
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
function initResize(container, handle, controls) {
|
|
539
|
-
let isResizing = false, startX = 0, startWidth = 0;
|
|
540
|
-
handle.addEventListener('mousedown', (e) => {
|
|
541
|
-
isResizing = true; startX = e.clientX; startWidth = container.offsetWidth;
|
|
542
|
-
handle.classList.add('resizing');
|
|
543
|
-
document.body.style.cursor = 'ew-resize';
|
|
544
|
-
document.body.style.userSelect = 'none';
|
|
545
|
-
e.preventDefault();
|
|
546
|
-
});
|
|
547
|
-
document.addEventListener('mousemove', (e) => {
|
|
548
|
-
if (!isResizing) return;
|
|
549
|
-
const deltaX = e.clientX - startX;
|
|
550
|
-
const newWidth = startWidth + deltaX;
|
|
551
|
-
const maxWidth = window.innerWidth * (CONFIG.MAX_WIDTH_PERCENT / 100);
|
|
552
|
-
if (newWidth >= CONFIG.MIN_WIDTH && newWidth <= maxWidth) {
|
|
553
|
-
const widthPercent = (newWidth / window.innerWidth) * 100;
|
|
554
|
-
container.style.width = widthPercent + '%';
|
|
555
|
-
setWidth(widthPercent + '%');
|
|
556
|
-
updateBodyMargin(widthPercent + '%');
|
|
557
|
-
}
|
|
558
|
-
});
|
|
559
|
-
document.addEventListener('mouseup', () => {
|
|
560
|
-
if (isResizing) {
|
|
561
|
-
isResizing = false; handle.classList.remove('resizing');
|
|
562
|
-
document.body.style.cursor = '';
|
|
563
|
-
document.body.style.userSelect = '';
|
|
564
|
-
}
|
|
565
|
-
});
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
function initControls(container, controls) {
|
|
569
|
-
const buttons = controls.querySelectorAll('button');
|
|
570
|
-
const btnFullscreen = buttons[0];
|
|
571
|
-
const btnCollapse = buttons[1];
|
|
572
|
-
btnFullscreen.addEventListener('click', () => {
|
|
573
|
-
const currentState = getState();
|
|
574
|
-
if (currentState === CONFIG.STATE_FULLSCREEN) {
|
|
575
|
-
setState(CONFIG.STATE_DEFAULT);
|
|
576
|
-
container.style.width = CONFIG.DEFAULT_WIDTH;
|
|
577
|
-
controls.classList.remove('fullscreen');
|
|
578
|
-
btnFullscreen.innerHTML = '▣';
|
|
579
|
-
btnFullscreen.title = 'Fullscreen (100%)';
|
|
580
|
-
updateBodyMargin(CONFIG.DEFAULT_WIDTH);
|
|
581
|
-
} else {
|
|
582
|
-
setState(CONFIG.STATE_FULLSCREEN);
|
|
583
|
-
container.style.width = CONFIG.FULLSCREEN_WIDTH;
|
|
584
|
-
controls.classList.add('fullscreen');
|
|
585
|
-
btnFullscreen.innerHTML = '◧';
|
|
586
|
-
btnFullscreen.title = 'Default (45%)';
|
|
587
|
-
updateBodyMargin(CONFIG.FULLSCREEN_WIDTH);
|
|
588
|
-
}
|
|
589
|
-
});
|
|
590
|
-
btnCollapse.addEventListener('click', () => {
|
|
591
|
-
const currentState = getState();
|
|
592
|
-
if (currentState === CONFIG.STATE_COLLAPSED) {
|
|
593
|
-
setState(CONFIG.STATE_DEFAULT);
|
|
594
|
-
container.classList.remove('collapsed');
|
|
595
|
-
container.style.width = CONFIG.DEFAULT_WIDTH;
|
|
596
|
-
controls.classList.remove('fullscreen');
|
|
597
|
-
btnCollapse.innerHTML = '◄';
|
|
598
|
-
btnCollapse.title = 'Collapse';
|
|
599
|
-
btnFullscreen.classList.remove('hidden');
|
|
600
|
-
btnFullscreen.innerHTML = '▣';
|
|
601
|
-
btnFullscreen.title = 'Fullscreen (100%)';
|
|
602
|
-
updateBodyMargin(CONFIG.DEFAULT_WIDTH);
|
|
603
|
-
} else {
|
|
604
|
-
const wasFullscreen = currentState === CONFIG.STATE_FULLSCREEN;
|
|
605
|
-
setState(CONFIG.STATE_COLLAPSED);
|
|
606
|
-
container.classList.add('collapsed');
|
|
607
|
-
if (wasFullscreen) {
|
|
608
|
-
controls.classList.remove('fullscreen');
|
|
609
|
-
}
|
|
610
|
-
btnFullscreen.classList.add('hidden');
|
|
611
|
-
btnCollapse.innerHTML = '▶';
|
|
612
|
-
btnCollapse.title = 'Expand';
|
|
613
|
-
removeBodyMargin();
|
|
614
|
-
}
|
|
615
|
-
});
|
|
616
|
-
}
|
|
405
|
+
script.onload = () => {
|
|
406
|
+
console.log('✅ VG Coder Bundle Loaded Successfully');
|
|
407
|
+
};
|
|
617
408
|
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
container.appendChild(controls);
|
|
632
|
-
document.body.appendChild(container);
|
|
633
|
-
initResize(container, resizeHandle, controls);
|
|
634
|
-
initControls(container, controls);
|
|
635
|
-
const currentState = getState();
|
|
636
|
-
if (currentState !== CONFIG.STATE_COLLAPSED) {
|
|
637
|
-
const width = currentState === CONFIG.STATE_FULLSCREEN ? CONFIG.FULLSCREEN_WIDTH : getWidth();
|
|
638
|
-
updateBodyMargin(width);
|
|
639
|
-
}
|
|
640
|
-
console.log('✅ VG Coder iframe injected successfully');
|
|
641
|
-
}
|
|
642
|
-
if (document.readyState === 'loading') {
|
|
643
|
-
document.addEventListener('DOMContentLoaded', init);
|
|
644
|
-
} else {
|
|
645
|
-
init();
|
|
646
|
-
}
|
|
409
|
+
script.onerror = () => {
|
|
410
|
+
console.error('❌ Failed to load VG Coder Bundle. Is the server running at port 6868?');
|
|
411
|
+
// Optional: Show a visual error toast on the page
|
|
412
|
+
const toast = document.createElement('div');
|
|
413
|
+
toast.style.cssText = 'position:fixed; top:20px; right:20px; background:#ff3b30; color:white; padding:10px 20px; border-radius:8px; z-index:999999; font-family:sans-serif; box-shadow:0 4px 12px rgba(0,0,0,0.2);';
|
|
414
|
+
toast.textContent = '⚠️ VG Coder Connection Failed (Is Server Running?)';
|
|
415
|
+
document.body.appendChild(toast);
|
|
416
|
+
setTimeout(() => toast.remove(), 5000);
|
|
417
|
+
};
|
|
418
|
+
|
|
419
|
+
// 3. Inject vào Head hoặc Body
|
|
420
|
+
(document.head || document.body).appendChild(script);
|
|
421
|
+
|
|
647
422
|
})();
|
|
648
423
|
`;
|
|
649
424
|
|
|
@@ -888,4 +663,4 @@ setupRemoveExtensionListener();
|
|
|
888
663
|
|
|
889
664
|
/******/ })()
|
|
890
665
|
;
|
|
891
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QyxTQUFTLEVBQUU7b0JBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDMUQsT0FBTztpQkFDUjtnQkFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzdDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7S0FDSjtJQUFDLE9BQU8sR0FBRyxFQUFFO1FBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsRUFBRSxHQUFHLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsRUFBQztBQUVGLGtDQUFrQztBQUNsQyw0QkFBNEIsRUFBRSxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vdmctY29kZXIvLi9jaHJvbWUvc3JjL3NjcmlwdC1pbmplY3Rvci50cyIsIndlYnBhY2s6Ly92Zy1jb2Rlci8uL2Nocm9tZS9zcmMvdXRpbHMvYWktZG9tYWlucy50cyIsIndlYnBhY2s6Ly92Zy1jb2Rlci8uL2Nocm9tZS9zcmMvdXRpbHMvaW5qZWN0b3Itc2NyaXB0LnRzIiwid2VicGFjazovL3ZnLWNvZGVyL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3ZnLWNvZGVyL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly92Zy1jb2Rlci93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3ZnLWNvZGVyL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vdmctY29kZXIvLi9jaHJvbWUvc3JjL2NvbnRyb2xsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQWx0ZXJuYXRpdmUgc2NyaXB0IGluamVjdGlvbiBtZXRob2RzIGZvciBDU1AtcmVzdHJpY3RlZCBlbnZpcm9ubWVudHNcblxuZXhwb3J0IGNsYXNzIFNjcmlwdEluamVjdG9yIHtcblxuICAvKipcbiAgICogRGV0ZWN0IGlmIHNpdGUgaGFzIHN0cmljdCBDU1AgdGhhdCBibG9ja3MgYmxvYi9kYXRhIFVSTHNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRldGVjdFN0cmljdENTUCgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgZm9yIENTUCBtZXRhIHRhZ3NcbiAgICAgIGNvbnN0IGNzcE1ldGFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbWV0YVtodHRwLWVxdWl2PVwiQ29udGVudC1TZWN1cml0eS1Qb2xpY3lcIl0nKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3NwTWV0YXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IGNzcE1ldGFzW2ldO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gbWV0YS5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKSB8fCAnJztcbiAgICAgICAgaWYgKGNvbnRlbnQuaW5jbHVkZXMoJ3NjcmlwdC1zcmMnKSAmJiAhY29udGVudC5pbmNsdWRlcygnYmxvYjonKSAmJiAhY29udGVudC5pbmNsdWRlcygnZGF0YTonKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGNvbW1vbiBzdHJpY3QgQ1NQIGRvbWFpbnNcbiAgICAgIGNvbnN0IHN0cmljdERvbWFpbnMgPSBbXG4gICAgICAgICdtaWRqb3VybmV5LmNvbScsXG4gICAgICAgICdvcGVuYWkuY29tJyxcbiAgICAgICAgJ2dpdGh1Yi5jb20nLFxuICAgICAgICAnZ29vZ2xlLmNvbScsXG4gICAgICAgICdnb29nbGV0YWdtYW5hZ2VyLmNvbScsXG4gICAgICAgICdmYWNlYm9vay5jb20nLFxuICAgICAgICAndHdpdHRlci5jb20nLFxuICAgICAgICAnbGlua2VkaW4uY29tJ1xuICAgICAgXTtcblxuICAgICAgY29uc3QgaG9zdG5hbWUgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBzdHJpY3REb21haW5zLnNvbWUoZG9tYWluID0+IGhvc3RuYW1lLmluY2x1ZGVzKGRvbWFpbikpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDU1AgZGV0ZWN0aW9uIGVycm9yOicsIGVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2FmZWx5IGdldCBoZWFkIGVsZW1lbnQgb3Igd2FpdCBmb3IgaXRcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldEhlYWRFbGVtZW50KCk6IFByb21pc2U8SFRNTEhlYWRFbGVtZW50PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCB0cnlHZXRIZWFkID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBoZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdO1xuICAgICAgICBpZiAoaGVhZCkge1xuICAgICAgICAgIHJlc29sdmUoaGVhZCBhcyBIVE1MSGVhZEVsZW1lbnQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG5vIGhlYWQsIHdhaXQgZm9yIERPTVxuICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHRyeUdldEhlYWQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBDcmVhdGUgaGVhZCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgY29uc3QgbmV3SGVhZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2hlYWQnKTtcbiAgICAgICAgICBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3SGVhZCk7XG4gICAgICAgICAgICByZXNvbHZlKG5ld0hlYWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBMYXN0IHJlc29ydDogd2FpdCBhIGJpdCBhbmQgdHJ5IGFnYWluXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHRyeUdldEhlYWQsIDEwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0cnlHZXRIZWFkKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIDE6IEJsb2IgVVJMIGluamVjdGlvbiAod29ya3MgaW4gbW9zdCBjYXNlcylcbiAgICovXG4gIHN0YXRpYyBhc3luYyBpbmplY3RWaWFCbG9iKHNjcmlwdDogc3RyaW5nLCBhY3Rpb25UeXBlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtzY3JpcHRdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JyB9KTtcbiAgICAgIGNvbnN0IGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXG4gICAgICBjb25zdCBzY3JpcHRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICBzY3JpcHRFbGVtZW50LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JztcbiAgICAgIHNjcmlwdEVsZW1lbnQuaWQgPSBhY3Rpb25UeXBlO1xuICAgICAgc2NyaXB0RWxlbWVudC5zcmMgPSBibG9iVXJsO1xuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2NyaXB0RWxlbWVudC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChibG9iVXJsKTtcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNjcmlwdEVsZW1lbnQub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGJsb2JVcmwpO1xuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaGVhZCA9IGF3YWl0IHRoaXMuZ2V0SGVhZEVsZW1lbnQoKTtcbiAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKHNjcmlwdEVsZW1lbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBnZXQgaGVhZCBlbGVtZW50OicsIGVycm9yKTtcbiAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGJsb2JVcmwpO1xuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignQmxvYiBpbmplY3Rpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIDI6IERhdGEgVVJMIGluamVjdGlvbiAoZmFsbGJhY2spXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW5qZWN0VmlhRGF0YVVybChzY3JpcHQ6IHN0cmluZywgYWN0aW9uVHlwZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGFVcmwgPSAnZGF0YTphcHBsaWNhdGlvbi9qYXZhc2NyaXB0O2Jhc2U2NCwnICsgYnRvYShzY3JpcHQpO1xuICAgICAgY29uc3Qgc2NyaXB0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgc2NyaXB0RWxlbWVudC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgICBzY3JpcHRFbGVtZW50LmlkID0gYWN0aW9uVHlwZSArICdfZGF0YSc7XG4gICAgICBzY3JpcHRFbGVtZW50LnNyYyA9IGRhdGFVcmw7XG5cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzY3JpcHRFbGVtZW50Lm9ubG9hZCA9ICgpID0+IHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIHNjcmlwdEVsZW1lbnQub25lcnJvciA9ICgpID0+IHJlc29sdmUoZmFsc2UpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaGVhZCA9IGF3YWl0IHRoaXMuZ2V0SGVhZEVsZW1lbnQoKTtcbiAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKHNjcmlwdEVsZW1lbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBnZXQgaGVhZCBlbGVtZW50IGZvciBkYXRhIFVSTDonLCBlcnJvcik7XG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdEYXRhIFVSTCBpbmplY3Rpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIDM6IFBvc3RNZXNzYWdlIGJyaWRnZSBpbmplY3Rpb25cbiAgICovXG4gIHN0YXRpYyBpbmplY3RWaWFQb3N0TWVzc2FnZShzY3JpcHQ6IHN0cmluZywgYWN0aW9uVHlwZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBDcmVhdGUgYSBicmlkZ2Ugc2NyaXB0IHRoYXQgbGlzdGVucyBmb3IgcG9zdE1lc3NhZ2VcbiAgICAgICAgY29uc3QgYnJpZGdlU2NyaXB0ID0gYFxuICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgIT09IHdpbmRvdyB8fCAhZXZlbnQuZGF0YS50eXBlIHx8IGV2ZW50LmRhdGEudHlwZSAhPT0gJ1ZFVEdPX1NDUklQVF9JTkpFQ1QnKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZ1bmMgPSBuZXcgRnVuY3Rpb24oZXZlbnQuZGF0YS5zY3JpcHQpO1xuICAgICAgICAgICAgICBmdW5jKCk7XG4gICAgICAgICAgICAgIHdpbmRvdy5wb3N0TWVzc2FnZSh7dHlwZTogJ1ZFVEdPX1NDUklQVF9TVUNDRVNTJywgYWN0aW9uVHlwZTogZXZlbnQuZGF0YS5hY3Rpb25UeXBlfSwgJyonKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Bvc3RNZXNzYWdlIHNjcmlwdCBleGVjdXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgICAgICAgd2luZG93LnBvc3RNZXNzYWdlKHt0eXBlOiAnVkVUR09fU0NSSVBUX0VSUk9SJywgYWN0aW9uVHlwZTogZXZlbnQuZGF0YS5hY3Rpb25UeXBlLCBlcnJvcjogZXJyb3IubWVzc2FnZX0sICcqJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIGA7XG4gICAgICAgIFxuICAgICAgICAvLyBGaXJzdCBpbmplY3QgdGhlIGJyaWRnZVxuICAgICAgICB0aGlzLmluamVjdFZpYUJsb2IoYnJpZGdlU2NyaXB0LCBhY3Rpb25UeXBlICsgJ19icmlkZ2UnKS50aGVuKChicmlkZ2VTdWNjZXNzKSA9PiB7XG4gICAgICAgICAgaWYgKGJyaWRnZVN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIC8vIExpc3RlbiBmb3IgcmVzcG9uc2VcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgIT09IHdpbmRvdyB8fCAhZXZlbnQuZGF0YS50eXBlKSByZXR1cm47XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS50eXBlID09PSAnVkVUR09fU0NSSVBUX1NVQ0NFU1MnICYmIGV2ZW50LmRhdGEuYWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgcmVzcG9uc2VIYW5kbGVyKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmRhdGEudHlwZSA9PT0gJ1ZFVEdPX1NDUklQVF9FUlJPUicgJiYgZXZlbnQuZGF0YS5hY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCByZXNwb25zZUhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHJlc3BvbnNlSGFuZGxlcik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFNlbmQgc2NyaXB0IHZpYSBwb3N0TWVzc2FnZVxuICAgICAgICAgICAgd2luZG93LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgdHlwZTogJ1ZFVEdPX1NDUklQVF9JTkpFQ1QnLFxuICAgICAgICAgICAgICBzY3JpcHQ6IHNjcmlwdCxcbiAgICAgICAgICAgICAgYWN0aW9uVHlwZTogYWN0aW9uVHlwZVxuICAgICAgICAgICAgfSwgJyonKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVGltZW91dCBhZnRlciA1IHNlY29uZHNcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHJlc3BvbnNlSGFuZGxlcik7XG4gICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgfSwgNTAwMCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdQb3N0TWVzc2FnZSBpbmplY3Rpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIDQ6IEJhY2tncm91bmQgc2NyaXB0IGluamVjdGlvbiB2aWEgY2hyb21lLnNjcmlwdGluZ1xuICAgKi9cbiAgc3RhdGljIGluamVjdFZpYUJhY2tncm91bmQoc2NyaXB0OiBzdHJpbmcsIGFjdGlvblR5cGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2Uoe1xuICAgICAgICAgIGFjdGlvbjogXCJJTkpFQ1RfU0NSSVBUXCIsXG4gICAgICAgICAgc2NyaXB0OiBzY3JpcHQsXG4gICAgICAgICAgYWN0aW9uVHlwZTogYWN0aW9uVHlwZVxuICAgICAgICB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAoY2hyb21lLnJ1bnRpbWUubGFzdEVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdCYWNrZ3JvdW5kIGluamVjdGlvbiBmYWlsZWQ6JywgY2hyb21lLnJ1bnRpbWUubGFzdEVycm9yKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlICYmIHJlc3BvbnNlLnN1Y2Nlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdCYWNrZ3JvdW5kIHNjcmlwdCBpbmplY3Rpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIDU6IERpcmVjdCBldmFsIGluIGNvbnRlbnQgc2NyaXB0IGNvbnRleHQgKGxhc3QgcmVzb3J0KVxuICAgKi9cbiAgc3RhdGljIGluamVjdFZpYUV2YWwoc2NyaXB0OiBzdHJpbmcsIGFjdGlvblR5cGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc29sZS5sb2coYEF0dGVtcHRpbmcgZGlyZWN0IGV2YWwgZm9yICR7YWN0aW9uVHlwZX1gKTtcblxuICAgICAgICAvLyBDcmVhdGUgaXNvbGF0ZWQgZnVuY3Rpb24gdG8gYXZvaWQgcG9sbHV0aW5nIGdsb2JhbCBzY29wZVxuICAgICAgICBjb25zdCBpc29sYXRlZEV4ZWN1dGlvbiA9IG5ldyBGdW5jdGlvbignc2NyaXB0JywgYFxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAke3NjcmlwdH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmFsIGV4ZWN1dGlvbiBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICBgKTtcblxuICAgICAgICBjb25zdCBzdWNjZXNzID0gaXNvbGF0ZWRFeGVjdXRpb24oc2NyaXB0KTtcbiAgICAgICAgcmVzb2x2ZShzdWNjZXNzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V2YWwgaW5qZWN0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSBhbGwgbWV0aG9kcyBpbiBzbWFydCBvcmRlciBiYXNlZCBvbiBDU1AgZGV0ZWN0aW9uXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW5qZWN0U2NyaXB0KHNjcmlwdDogc3RyaW5nLCBhY3Rpb25UeXBlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBoYXNTdHJpY3RDU1AgPSB0aGlzLmRldGVjdFN0cmljdENTUCgpO1xuXG4gICAgLy8gU21hcnQgbWV0aG9kIG9yZGVyaW5nIGJhc2VkIG9uIENTUCBkZXRlY3Rpb25cbiAgICBjb25zdCBtZXRob2RzID0gaGFzU3RyaWN0Q1NQID8gW1xuICAgICAgLy8gRm9yIHN0cmljdCBDU1Agc2l0ZXMsIHRyeSBiYWNrZ3JvdW5kIGluamVjdGlvbiBmaXJzdFxuICAgICAgKCkgPT4gdGhpcy5pbmplY3RWaWFCYWNrZ3JvdW5kKHNjcmlwdCwgYWN0aW9uVHlwZSksXG4gICAgICAoKSA9PiB0aGlzLmluamVjdFZpYUV2YWwoc2NyaXB0LCBhY3Rpb25UeXBlKSxcbiAgICAgICgpID0+IHRoaXMuaW5qZWN0VmlhUG9zdE1lc3NhZ2Uoc2NyaXB0LCBhY3Rpb25UeXBlKSxcbiAgICAgICgpID0+IHRoaXMuaW5qZWN0VmlhQmxvYihzY3JpcHQsIGFjdGlvblR5cGUpLFxuICAgICAgKCkgPT4gdGhpcy5pbmplY3RWaWFEYXRhVXJsKHNjcmlwdCwgYWN0aW9uVHlwZSlcbiAgICBdIDogW1xuICAgICAgLy8gRm9yIG5vcm1hbCBzaXRlcywgdHJ5IGJsb2IgZmlyc3QgKGZhc3Rlc3QpXG4gICAgICAoKSA9PiB0aGlzLmluamVjdFZpYUJsb2Ioc2NyaXB0LCBhY3Rpb25UeXBlKSxcbiAgICAgICgpID0+IHRoaXMuaW5qZWN0VmlhRGF0YVVybChzY3JpcHQsIGFjdGlvblR5cGUpLFxuICAgICAgKCkgPT4gdGhpcy5pbmplY3RWaWFCYWNrZ3JvdW5kKHNjcmlwdCwgYWN0aW9uVHlwZSksXG4gICAgICAoKSA9PiB0aGlzLmluamVjdFZpYUV2YWwoc2NyaXB0LCBhY3Rpb25UeXBlKSxcbiAgICAgICgpID0+IHRoaXMuaW5qZWN0VmlhUG9zdE1lc3NhZ2Uoc2NyaXB0LCBhY3Rpb25UeXBlKVxuICAgIF07XG5cbiAgICBjb25zb2xlLmxvZyhgSW5qZWN0aW5nIHNjcmlwdCBmb3IgJHthY3Rpb25UeXBlfSAoU3RyaWN0IENTUDogJHtoYXNTdHJpY3RDU1B9KWApO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBtZXRob2QgPSBtZXRob2RzW2ldO1xuICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IGhhc1N0cmljdENTUCA/XG4gICAgICAgIFsnQmFja2dyb3VuZCcsICdFdmFsJywgJ1Bvc3RNZXNzYWdlJywgJ0Jsb2InLCAnRGF0YVVSTCddW2ldIDpcbiAgICAgICAgWydCbG9iJywgJ0RhdGFVUkwnLCAnQmFja2dyb3VuZCcsICdFdmFsJywgJ1Bvc3RNZXNzYWdlJ11baV07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBUcnlpbmcgJHttZXRob2ROYW1lfSBpbmplY3Rpb24uLi5gKTtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IG1ldGhvZCgpO1xuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGDinIUgU2NyaXB0IGluamVjdGlvbiBzdWNjZXNzZnVsIHZpYSAke21ldGhvZE5hbWV9IGZvciAke2FjdGlvblR5cGV9YCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYOKdjCAke21ldGhvZE5hbWV9IGluamVjdGlvbiBmYWlsZWQgZm9yICR7YWN0aW9uVHlwZX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihg4p2MICR7bWV0aG9kTmFtZX0gaW5qZWN0aW9uIGVycm9yOmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmVycm9yKGDinYwgQWxsIGluamVjdGlvbiBtZXRob2RzIGZhaWxlZCBmb3IgJHthY3Rpb25UeXBlfWApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwiLy8gQUkgQ2hhdCBQcm92aWRlcnMgQ29uZmlndXJhdGlvblxuLy8gRG9tYWlucyBmb3IgYXV0b21hdGljIFZHIENvZGVyIGlmcmFtZSBpbmplY3Rpb25cblxuZXhwb3J0IGNvbnN0IEFJX0RPTUFJTlMgPSBbXG4gICdjaGF0Lm9wZW5haS5jb20nLCAgICAgICAgICAgLy8gQ2hhdEdQVCAob2xkIFVSTClcbiAgJ2NoYXRncHQuY29tJywgICAgICAgICAgICAgICAvLyBDaGF0R1BUIChuZXcgVVJMKVxuICAnZ2VtaW5pLmdvb2dsZS5jb20nLCAgICAgICAgIC8vIEdvb2dsZSBHZW1pbmlcbiAgJ2Fpc3R1ZGlvLmdvb2dsZS5jb20nLCAgICAgICAvLyBHb29nbGUgQUkgU3R1ZGlvXG4gICdjaGF0LmRlZXBzZWVrLmNvbScsICAgICAgICAgLy8gRGVlcFNlZWtcbiAgJ2tpbWkuY29tJywgICAgICAgICAgICAgICAgICAvLyBLaW1pIEFJXG4gICd3d3cua2ltaS5jb20nLCAgICAgICAgICAgICAvLyBLaW1pIEFJICh3d3cpXG4gICdncm9rLmNvbScsICAgICAgICAgICAgICAgICAgLy8gR3Jva1xuICAnY2xhdWRlLmFpJywgICAgICAgICAgICAgICAgIC8vIENsYXVkZSAoQW50aHJvcGljKVxuICAncG9lLmNvbScsICAgICAgICAgICAgICAgICAgIC8vIFBvZVxuICAncGVycGxleGl0eS5haScsICAgICAgICAgICAgLy8gUGVycGxleGl0eVxuICAnd3d3LnBlcnBsZXhpdHkuYWknLCAgICAgICAgLy8gUGVycGxleGl0eSAod3d3KVxuXTtcblxuLyoqXG4gKiBDaGVjayBpZiBkb21haW4gc2hvdWxkIGhhdmUgVkcgQ29kZXIgaWZyYW1lIGluamVjdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FJQ2hhdERvbWFpbihob3N0bmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNsZWFuSG9zdG5hbWUgPSBob3N0bmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL153d3dcXC4vLCAnJyk7XG4gIGNvbnNvbGUubG9nKCfwn5SNIENoZWNraW5nIEFJIGRvbWFpbjonLCBjbGVhbkhvc3RuYW1lKTtcbiAgXG4gIGNvbnN0IGlzTWF0Y2ggPSBBSV9ET01BSU5TLnNvbWUoZG9tYWluID0+IHtcbiAgICBjb25zdCBjbGVhbkRvbWFpbiA9IGRvbWFpbi50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL153d3dcXC4vLCAnJyk7XG4gICAgcmV0dXJuIGNsZWFuSG9zdG5hbWUgPT09IGNsZWFuRG9tYWluIHx8IGNsZWFuSG9zdG5hbWUuZW5kc1dpdGgoJy4nICsgY2xlYW5Eb21haW4pO1xuICB9KTtcbiAgXG4gIGNvbnNvbGUubG9nKCfwn46vIEFJIGRvbWFpbiBtYXRjaDonLCBpc01hdGNoKTtcbiAgcmV0dXJuIGlzTWF0Y2g7XG59XG4iLCIvLyBWRyBDb2RlciBJZnJhbWUgSW5qZWN0b3IgU2NyaXB0IChCdW5kbGVkIGZvciBFeHRlbnNpb24pXG4vLyBUd28tQnV0dG9uIFRvZ2dsZSB3aXRoIGhpZGRlbiBmdWxsc2NyZWVuIHdoZW4gY29sbGFwc2VkXG5cbmV4cG9ydCBjb25zdCBWR19DT0RFUl9JTkpFQ1RPUl9TQ1JJUFQgPSBgXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgXG4gIGNvbnN0IENPTkZJRyA9IHtcbiAgICBWR19DT0RFUl9VUkw6ICdodHRwOi8vbG9jYWxob3N0OjY4Njg/ZW1iZWRkZWQ9dHJ1ZScsXG4gICAgSUZSQU1FX0lEOiAndmctY29kZXItc2lkZS1pZnJhbWUnLFxuICAgIENPTlRBSU5FUl9JRDogJ3ZnLWNvZGVyLWNvbnRhaW5lcicsXG4gICAgQ09OVFJPTFNfSUQ6ICd2Zy1jb2Rlci1jb250cm9scycsXG4gICAgUkVTSVpFX0hBTkRMRV9JRDogJ3ZnLWNvZGVyLXJlc2l6ZS1oYW5kbGUnLFxuICAgIERFRkFVTFRfV0lEVEg6ICc0MjBweCcsXG4gICAgRlVMTFNDUkVFTl9XSURUSDogJzEwMCUnLFxuICAgIE1JTl9XSURUSDogMzAwLFxuICAgIE1BWF9XSURUSF9QRVJDRU5UOiA3MCxcbiAgICBTVEFURV9ERUZBVUxUOiAnZGVmYXVsdCcsXG4gICAgU1RBVEVfRlVMTFNDUkVFTjogJ2Z1bGxzY3JlZW4nLFxuICAgIFNUQVRFX0NPTExBUFNFRDogJ2NvbGxhcHNlZCcsXG4gICAgWl9JTkRFWDogOTk5OSxcbiAgICBTVE9SQUdFX0tFWV9XSURUSDogJ3ZnX2NvZGVyX3dpZHRoJyxcbiAgICBTVE9SQUdFX0tFWV9TVEFURTogJ3ZnX2NvZGVyX3N0YXRlJyxcbiAgfTtcbiAgXG4gIGlmIChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdWR19DT0RFUl9ORVNURUQnKSA9PT0gJ3RydWUnKSB7XG4gICAgY29uc29sZS5sb2coJ/CfmqsgVkcgQ29kZXIgaWZyYW1lIGluamVjdGlvbiBza2lwcGVkIC0gbmVzdGVkIGNvbnRleHQnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgXG4gIGlmICh3aW5kb3cuc2VsZiAhPT0gd2luZG93LnRvcCAmJiBkb2N1bWVudC5yZWZlcnJlci5pbmNsdWRlcygnOjY4NjgnKSkge1xuICAgIGNvbnNvbGUubG9nKCfwn5qrIFZHIENvZGVyIGlmcmFtZSBpbmplY3Rpb24gc2tpcHBlZCAtIHBhcmVudCBpcyA6Njg2OCcpO1xuICAgIHJldHVybjtcbiAgfVxuICBcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKENPTkZJRy5DT05UQUlORVJfSUQpKSB7XG4gICAgY29uc29sZS5sb2coJ+KaoO+4jyBWRyBDb2RlciBpZnJhbWUgYWxyZWFkeSBpbmplY3RlZCcpO1xuICAgIHJldHVybjtcbiAgfVxuICBcbiAgZnVuY3Rpb24gZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKENPTkZJRy5TVE9SQUdFX0tFWV9TVEFURSkgfHwgQ09ORklHLlNUQVRFX0RFRkFVTFQ7XG4gIH1cbiAgXG4gIGZ1bmN0aW9uIGdldFdpZHRoKCkge1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShDT05GSUcuU1RPUkFHRV9LRVlfV0lEVEgpIHx8IENPTkZJRy5ERUZBVUxUX1dJRFRIO1xuICB9XG4gIFxuICBmdW5jdGlvbiBzZXRTdGF0ZShzdGF0ZSkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKENPTkZJRy5TVE9SQUdFX0tFWV9TVEFURSwgc3RhdGUpO1xuICB9XG4gIFxuICBmdW5jdGlvbiBzZXRXaWR0aCh3aWR0aCkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKENPTkZJRy5TVE9SQUdFX0tFWV9XSURUSCwgd2lkdGgpO1xuICB9XG4gIFxuICBmdW5jdGlvbiB1cGRhdGVCb2R5TWFyZ2luKHdpZHRoKSB7XG4gICAgaWYgKCFkb2N1bWVudC5ib2R5LnN0eWxlLnRyYW5zaXRpb24uaW5jbHVkZXMoJ21hcmdpbicpKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnRyYW5zaXRpb24gPSAnbWFyZ2luLWxlZnQgMC4zcyBlYXNlJztcbiAgICB9XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5tYXJnaW5MZWZ0ID0gd2lkdGg7XG4gIH1cbiAgXG4gIGZ1bmN0aW9uIHJlbW92ZUJvZHlNYXJnaW4oKSB7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5tYXJnaW5MZWZ0ID0gJzAnO1xuICB9XG4gIFxuICBmdW5jdGlvbiBpbmplY3RTdHlsZXMoKSB7XG4gICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlLnRleHRDb250ZW50ID0gJyMnICsgQ09ORklHLkNPTlRBSU5FUl9JRCArICcgeycgK1xuICAgICAgJ3Bvc2l0aW9uOiBmaXhlZDsgdG9wOiAwOyBsZWZ0OiAwOyBib3R0b206IDA7JyArXG4gICAgICAnd2lkdGg6ICcgKyBnZXRXaWR0aCgpICsgJzsnICtcbiAgICAgICdiYWNrZ3JvdW5kOiAjMWExYTFhOyB6LWluZGV4OiAnICsgQ09ORklHLlpfSU5ERVggKyAnOycgK1xuICAgICAgJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47JyArXG4gICAgICAnYm94LXNoYWRvdzogNHB4IDAgMTJweCByZ2JhKDAsIDAsIDAsIDAuMyk7JyArXG4gICAgICAndHJhbnNpdGlvbjogd2lkdGggMC4zcyBlYXNlLCB0cmFuc2Zvcm0gMC4zcyBlYXNlOycgK1xuICAgICAgJ30nICtcbiAgICAgICcjJyArIENPTkZJRy5DT05UQUlORVJfSUQgKyAnLmNvbGxhcHNlZCB7IHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7IH0nICtcbiAgICAgICcjJyArIENPTkZJRy5JRlJBTUVfSUQgKyAnIHsnICtcbiAgICAgICdmbGV4OiAxOyBib3JkZXI6IG5vbmU7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IGJhY2tncm91bmQ6IHdoaXRlOycgK1xuICAgICAgJ30nICtcbiAgICAgICcjJyArIENPTkZJRy5DT05UUk9MU19JRCArICcgeycgK1xuICAgICAgJ3Bvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiA1MCU7IHJpZ2h0OiAtMzZweDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpOycgK1xuICAgICAgJ3otaW5kZXg6ICcgKyAoQ09ORklHLlpfSU5ERVggKyAxKSArICc7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNHB4OycgK1xuICAgICAgJ3RyYW5zaXRpb246IHJpZ2h0IDAuM3MgZWFzZTsnICtcbiAgICAgICd9JyArXG4gICAgICAnIycgKyBDT05GSUcuQ09OVFJPTFNfSUQgKyAnLmZ1bGxzY3JlZW4geycgK1xuICAgICAgJ3JpZ2h0OiAxMnB4OycgK1xuICAgICAgJ30nICtcbiAgICAgICcjJyArIENPTkZJRy5DT05UUk9MU19JRCArICcgYnV0dG9uIHsnICtcbiAgICAgICdiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjNjY3ZWVhIDAlLCAjNzY0YmEyIDEwMCUpOycgK1xuICAgICAgJ2NvbG9yOiB3aGl0ZTsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiAwIDZweCA2cHggMDsnICtcbiAgICAgICdwYWRkaW5nOiA4cHggNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMThweDsnICtcbiAgICAgICdib3gtc2hhZG93OiAtMnB4IDJweCA2cHggcmdiYSgwLCAwLCAwLCAwLjIpOycgK1xuICAgICAgJ3RyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7IHdpZHRoOiAzMnB4OyBoZWlnaHQ6IDMycHg7JyArXG4gICAgICAnZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7JyArXG4gICAgICAnfScgK1xuICAgICAgJyMnICsgQ09ORklHLkNPTlRST0xTX0lEICsgJyBidXR0b24uaGlkZGVuIHsnICtcbiAgICAgICdkaXNwbGF5OiBub25lOycgK1xuICAgICAgJ30nICtcbiAgICAgICcjJyArIENPTkZJRy5DT05UUk9MU19JRCArICcgYnV0dG9uOmhvdmVyIHsnICtcbiAgICAgICdiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjNzY0YmEyIDAlLCAjNjY3ZWVhIDEwMCUpOycgK1xuICAgICAgJ2JveC1zaGFkb3c6IC0zcHggM3B4IDhweCByZ2JhKDAsIDAsIDAsIDAuMyk7JyArXG4gICAgICAnfScgK1xuICAgICAgJyMnICsgQ09ORklHLlJFU0laRV9IQU5ETEVfSUQgKyAnIHsnICtcbiAgICAgICdwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiAwOyB0b3A6IDA7IGJvdHRvbTogMDsgd2lkdGg6IDZweDsnICtcbiAgICAgICdjdXJzb3I6IGV3LXJlc2l6ZTsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4ycyBlYXNlOycgK1xuICAgICAgJ30nICtcbiAgICAgICcjJyArIENPTkZJRy5SRVNJWkVfSEFORExFX0lEICsgJzpob3ZlciB7IGJhY2tncm91bmQ6IHJnYmEoMTAyLCAxMjYsIDIzNCwgMC41KTsgfScgK1xuICAgICAgJyMnICsgQ09ORklHLlJFU0laRV9IQU5ETEVfSUQgKyAnLnJlc2l6aW5nIHsgYmFja2dyb3VuZDogcmdiYSgxMDIsIDEyNiwgMjM0LCAwLjgpOyB9JztcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgfVxuICBcbiAgZnVuY3Rpb24gY3JlYXRlQ29udGFpbmVyKCkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnRhaW5lci5pZCA9IENPTkZJRy5DT05UQUlORVJfSUQ7XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gZ2V0U3RhdGUoKTtcbiAgICBpZiAoY3VycmVudFN0YXRlID09PSBDT05GSUcuU1RBVEVfQ09MTEFQU0VEKSB7XG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnY29sbGFwc2VkJyk7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50U3RhdGUgPT09IENPTkZJRy5TVEFURV9GVUxMU0NSRUVOKSB7XG4gICAgICBjb250YWluZXIuc3R5bGUud2lkdGggPSBDT05GSUcuRlVMTFNDUkVFTl9XSURUSDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgfVxuICBcbiAgZnVuY3Rpb24gY3JlYXRlSWZyYW1lKCkge1xuICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgIGlmcmFtZS5pZCA9IENPTkZJRy5JRlJBTUVfSUQ7XG4gICAgaWZyYW1lLnNyYyA9IENPTkZJRy5WR19DT0RFUl9VUkw7XG4gICAgaWZyYW1lLnRpdGxlID0gJ1ZHIENvZGVyIERhc2hib2FyZCc7XG4gICAgaWZyYW1lLmFsbG93ID0gJ2NsaXBib2FyZC1yZWFkOyBjbGlwYm9hcmQtd3JpdGUnO1xuICAgIHJldHVybiBpZnJhbWU7XG4gIH1cbiAgXG4gIGZ1bmN0aW9uIGNyZWF0ZVJlc2l6ZUhhbmRsZSgpIHtcbiAgICBjb25zdCBoYW5kbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBoYW5kbGUuaWQgPSBDT05GSUcuUkVTSVpFX0hBTkRMRV9JRDtcbiAgICByZXR1cm4gaGFuZGxlO1xuICB9XG4gIFxuICBmdW5jdGlvbiBjcmVhdGVDb250cm9scygpIHtcbiAgICBjb25zdCBjb250cm9scyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnRyb2xzLmlkID0gQ09ORklHLkNPTlRST0xTX0lEO1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGdldFN0YXRlKCk7XG4gICAgaWYgKGN1cnJlbnRTdGF0ZSA9PT0gQ09ORklHLlNUQVRFX0ZVTExTQ1JFRU4pIHtcbiAgICAgIGNvbnRyb2xzLmNsYXNzTGlzdC5hZGQoJ2Z1bGxzY3JlZW4nKTtcbiAgICB9XG4gICAgY29uc3QgYnRuRnVsbHNjcmVlbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIGJ0bkZ1bGxzY3JlZW4uaW5uZXJIVE1MID0gY3VycmVudFN0YXRlID09PSBDT05GSUcuU1RBVEVfRlVMTFNDUkVFTiA/ICfil6cnIDogJ+KWoyc7XG4gICAgYnRuRnVsbHNjcmVlbi50aXRsZSA9IGN1cnJlbnRTdGF0ZSA9PT0gQ09ORklHLlNUQVRFX0ZVTExTQ1JFRU4gPyAnRGVmYXVsdCAoNDUlKScgOiAnRnVsbHNjcmVlbiAoMTAwJSknO1xuICAgIGlmIChjdXJyZW50U3RhdGUgPT09IENPTkZJRy5TVEFURV9DT0xMQVBTRUQpIHtcbiAgICAgIGJ0bkZ1bGxzY3JlZW4uY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgfVxuICAgIGNvbnN0IGJ0bkNvbGxhcHNlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgYnRuQ29sbGFwc2UuaW5uZXJIVE1MID0gY3VycmVudFN0YXRlID09PSBDT05GSUcuU1RBVEVfQ09MTEFQU0VEID8gJ+KWticgOiAn4peEJztcbiAgICBidG5Db2xsYXBzZS50aXRsZSA9IGN1cnJlbnRTdGF0ZSA9PT0gQ09ORklHLlNUQVRFX0NPTExBUFNFRCA/ICdFeHBhbmQnIDogJ0NvbGxhcHNlJztcbiAgICBjb250cm9scy5hcHBlbmRDaGlsZChidG5GdWxsc2NyZWVuKTtcbiAgICBjb250cm9scy5hcHBlbmRDaGlsZChidG5Db2xsYXBzZSk7XG4gICAgcmV0dXJuIGNvbnRyb2xzO1xuICB9XG4gIFxuICBmdW5jdGlvbiBpbml0UmVzaXplKGNvbnRhaW5lciwgaGFuZGxlLCBjb250cm9scykge1xuICAgIGxldCBpc1Jlc2l6aW5nID0gZmFsc2UsIHN0YXJ0WCA9IDAsIHN0YXJ0V2lkdGggPSAwO1xuICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZSkgPT4ge1xuICAgICAgaXNSZXNpemluZyA9IHRydWU7IHN0YXJ0WCA9IGUuY2xpZW50WDsgc3RhcnRXaWR0aCA9IGNvbnRhaW5lci5vZmZzZXRXaWR0aDtcbiAgICAgIGhhbmRsZS5jbGFzc0xpc3QuYWRkKCdyZXNpemluZycpO1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnZXctcmVzaXplJztcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUudXNlclNlbGVjdCA9ICdub25lJztcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCAoZSkgPT4ge1xuICAgICAgaWYgKCFpc1Jlc2l6aW5nKSByZXR1cm47XG4gICAgICBjb25zdCBkZWx0YVggPSBlLmNsaWVudFggLSBzdGFydFg7XG4gICAgICBjb25zdCBuZXdXaWR0aCA9IHN0YXJ0V2lkdGggKyBkZWx0YVg7XG4gICAgICBjb25zdCBtYXhXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoICogKENPTkZJRy5NQVhfV0lEVEhfUEVSQ0VOVCAvIDEwMCk7XG4gICAgICBpZiAobmV3V2lkdGggPj0gQ09ORklHLk1JTl9XSURUSCAmJiBuZXdXaWR0aCA8PSBtYXhXaWR0aCkge1xuICAgICAgICBjb25zdCB3aWR0aFBlcmNlbnQgPSAobmV3V2lkdGggLyB3aW5kb3cuaW5uZXJXaWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9IHdpZHRoUGVyY2VudCArICclJztcbiAgICAgICAgc2V0V2lkdGgod2lkdGhQZXJjZW50ICsgJyUnKTtcbiAgICAgICAgdXBkYXRlQm9keU1hcmdpbih3aWR0aFBlcmNlbnQgKyAnJScpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCAoKSA9PiB7XG4gICAgICBpZiAoaXNSZXNpemluZykge1xuICAgICAgICBpc1Jlc2l6aW5nID0gZmFsc2U7IGhhbmRsZS5jbGFzc0xpc3QucmVtb3ZlKCdyZXNpemluZycpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9ICcnO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnVzZXJTZWxlY3QgPSAnJztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBcbiAgZnVuY3Rpb24gaW5pdENvbnRyb2xzKGNvbnRhaW5lciwgY29udHJvbHMpIHtcbiAgICBjb25zdCBidXR0b25zID0gY29udHJvbHMucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uJyk7XG4gICAgY29uc3QgYnRuRnVsbHNjcmVlbiA9IGJ1dHRvbnNbMF07XG4gICAgY29uc3QgYnRuQ29sbGFwc2UgPSBidXR0b25zWzFdO1xuICAgIGJ0bkZ1bGxzY3JlZW4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgICAgaWYgKGN1cnJlbnRTdGF0ZSA9PT0gQ09ORklHLlNUQVRFX0ZVTExTQ1JFRU4pIHtcbiAgICAgICAgc2V0U3RhdGUoQ09ORklHLlNUQVRFX0RFRkFVTFQpO1xuICAgICAgICBjb250YWluZXIuc3R5bGUud2lkdGggPSBDT05GSUcuREVGQVVMVF9XSURUSDtcbiAgICAgICAgY29udHJvbHMuY2xhc3NMaXN0LnJlbW92ZSgnZnVsbHNjcmVlbicpO1xuICAgICAgICBidG5GdWxsc2NyZWVuLmlubmVySFRNTCA9ICfilqMnO1xuICAgICAgICBidG5GdWxsc2NyZWVuLnRpdGxlID0gJ0Z1bGxzY3JlZW4gKDEwMCUpJztcbiAgICAgICAgdXBkYXRlQm9keU1hcmdpbihDT05GSUcuREVGQVVMVF9XSURUSCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRTdGF0ZShDT05GSUcuU1RBVEVfRlVMTFNDUkVFTik7XG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9IENPTkZJRy5GVUxMU0NSRUVOX1dJRFRIO1xuICAgICAgICBjb250cm9scy5jbGFzc0xpc3QuYWRkKCdmdWxsc2NyZWVuJyk7XG4gICAgICAgIGJ0bkZ1bGxzY3JlZW4uaW5uZXJIVE1MID0gJ+KXpyc7XG4gICAgICAgIGJ0bkZ1bGxzY3JlZW4udGl0bGUgPSAnRGVmYXVsdCAoNDUlKSc7XG4gICAgICAgIHVwZGF0ZUJvZHlNYXJnaW4oQ09ORklHLkZVTExTQ1JFRU5fV0lEVEgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGJ0bkNvbGxhcHNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gZ2V0U3RhdGUoKTtcbiAgICAgIGlmIChjdXJyZW50U3RhdGUgPT09IENPTkZJRy5TVEFURV9DT0xMQVBTRUQpIHtcbiAgICAgICAgc2V0U3RhdGUoQ09ORklHLlNUQVRFX0RFRkFVTFQpO1xuICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnY29sbGFwc2VkJyk7XG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9IENPTkZJRy5ERUZBVUxUX1dJRFRIO1xuICAgICAgICBjb250cm9scy5jbGFzc0xpc3QucmVtb3ZlKCdmdWxsc2NyZWVuJyk7XG4gICAgICAgIGJ0bkNvbGxhcHNlLmlubmVySFRNTCA9ICfil4QnO1xuICAgICAgICBidG5Db2xsYXBzZS50aXRsZSA9ICdDb2xsYXBzZSc7XG4gICAgICAgIGJ0bkZ1bGxzY3JlZW4uY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gICAgICAgIGJ0bkZ1bGxzY3JlZW4uaW5uZXJIVE1MID0gJ+KWoyc7XG4gICAgICAgIGJ0bkZ1bGxzY3JlZW4udGl0bGUgPSAnRnVsbHNjcmVlbiAoMTAwJSknO1xuICAgICAgICB1cGRhdGVCb2R5TWFyZ2luKENPTkZJRy5ERUZBVUxUX1dJRFRIKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHdhc0Z1bGxzY3JlZW4gPSBjdXJyZW50U3RhdGUgPT09IENPTkZJRy5TVEFURV9GVUxMU0NSRUVOO1xuICAgICAgICBzZXRTdGF0ZShDT05GSUcuU1RBVEVfQ09MTEFQU0VEKTtcbiAgICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2NvbGxhcHNlZCcpO1xuICAgICAgICBpZiAod2FzRnVsbHNjcmVlbikge1xuICAgICAgICAgIGNvbnRyb2xzLmNsYXNzTGlzdC5yZW1vdmUoJ2Z1bGxzY3JlZW4nKTtcbiAgICAgICAgfVxuICAgICAgICBidG5GdWxsc2NyZWVuLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgICAgICBidG5Db2xsYXBzZS5pbm5lckhUTUwgPSAn4pa2JztcbiAgICAgICAgYnRuQ29sbGFwc2UudGl0bGUgPSAnRXhwYW5kJztcbiAgICAgICAgcmVtb3ZlQm9keU1hcmdpbigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIFxuICBmdW5jdGlvbiBpbml0KCkge1xuICAgIGlmICghZG9jdW1lbnQuYm9keSkge1xuICAgICAgc2V0VGltZW91dChpbml0LCAxMDApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygn8J+agCBJbml0aWFsaXppbmcgVkcgQ29kZXIgaWZyYW1lIGluamVjdGlvbi4uLicpO1xuICAgIGluamVjdFN0eWxlcygpO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGNyZWF0ZUNvbnRhaW5lcigpO1xuICAgIGNvbnN0IGlmcmFtZSA9IGNyZWF0ZUlmcmFtZSgpO1xuICAgIGNvbnN0IHJlc2l6ZUhhbmRsZSA9IGNyZWF0ZVJlc2l6ZUhhbmRsZSgpO1xuICAgIGNvbnN0IGNvbnRyb2xzID0gY3JlYXRlQ29udHJvbHMoKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQocmVzaXplSGFuZGxlKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY29udHJvbHMpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcbiAgICBpbml0UmVzaXplKGNvbnRhaW5lciwgcmVzaXplSGFuZGxlLCBjb250cm9scyk7XG4gICAgaW5pdENvbnRyb2xzKGNvbnRhaW5lciwgY29udHJvbHMpO1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGdldFN0YXRlKCk7XG4gICAgaWYgKGN1cnJlbnRTdGF0ZSAhPT0gQ09ORklHLlNUQVRFX0NPTExBUFNFRCkge1xuICAgICAgY29uc3Qgd2lkdGggPSBjdXJyZW50U3RhdGUgPT09IENPTkZJRy5TVEFURV9GVUxMU0NSRUVOID8gQ09ORklHLkZVTExTQ1JFRU5fV0lEVEggOiBnZXRXaWR0aCgpO1xuICAgICAgdXBkYXRlQm9keU1hcmdpbih3aWR0aCk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCfinIUgVkcgQ29kZXIgaWZyYW1lIGluamVjdGVkIHN1Y2Nlc3NmdWxseScpO1xuICB9XG4gIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaW5pdCk7XG4gIH0gZWxzZSB7XG4gICAgaW5pdCgpO1xuICB9XG59KSgpO1xuYDtcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0IHsgU2NyaXB0SW5qZWN0b3IgfSBmcm9tICcuL3NjcmlwdC1pbmplY3Rvcic7XG5pbXBvcnQgeyBpc0FJQ2hhdERvbWFpbiB9IGZyb20gJy4vdXRpbHMvYWktZG9tYWlucyc7XG5pbXBvcnQgeyBWR19DT0RFUl9JTkpFQ1RPUl9TQ1JJUFQgfSBmcm9tICcuL3V0aWxzL2luamVjdG9yLXNjcmlwdCc7XG5cbmNvbnN0IGFkZFNjcmlwdCA9IGFzeW5jIChzY3JpcHQ6IHN0cmluZywgYWN0aW9uVHlwZTogc3RyaW5nKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IFNjcmlwdEluamVjdG9yLmluamVjdFNjcmlwdChzY3JpcHQsIGFjdGlvblR5cGUpO1xuICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgY29uc29sZS5lcnJvcignQWxsIHNjcmlwdCBpbmplY3Rpb24gbWV0aG9kcyBmYWlsZWQgZm9yOicsIGFjdGlvblR5cGUpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdTY3JpcHQgaW5qZWN0aW9uIGVycm9yOicsIGVycm9yKTtcbiAgfVxufVxuLy8gV2FpdCBmb3IgRE9NIHRvIGJlIHJlYWR5IGJlZm9yZSBleGVjdXRpbmdcbmNvbnN0IHdhaXRGb3JET00gPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiByZXNvbHZlKCksIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIE11bHRpLWxheWVyIGRldGVjdGlvbiB0byBjaGVjayBpZiBjdXJyZW50IHBhZ2UgaXMgbG9hZGVkIGluc2lkZSBWRyBDb2RlcidzIGlmcmFtZVxuICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBuZXN0ZWQgY29udGV4dCAoc2hvdWxkIHNraXAgaW5qZWN0aW9uKVxuICovXG5jb25zdCBkZXRlY3RWR0NvZGVyQ29udGV4dCA9IGFzeW5jICgpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgLy8gTGF5ZXIgMTogVVJMIHBhcmFtZXRlciBjaGVjayAoZmFzdGVzdClcbiAgY29uc3QgdXJsUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgaWYgKHVybFBhcmFtcy5oYXMoJ3ZnX2NvZGVyX2NvbnRleHQnKSkge1xuICAgIGNvbnNvbGUubG9nKCfimqEgVkcgQ29kZXIgY29udGV4dCBkZXRlY3RlZDogVVJMIHBhcmFtZXRlcicpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIFxuICAvLyBMYXllciAyOiBSZWZlcnJlciBjaGVjayAoYmFja3VwKVxuICBjb25zdCByZWZlcnJlciA9IGRvY3VtZW50LnJlZmVycmVyO1xuICBpZiAocmVmZXJyZXIgJiYgKHJlZmVycmVyLmluY2x1ZGVzKCc6Njg2OCcpIHx8IHJlZmVycmVyLmluY2x1ZGVzKCd2Zy1jb2RlcicpKSkge1xuICAgIGNvbnNvbGUubG9nKCfimqEgVkcgQ29kZXIgY29udGV4dCBkZXRlY3RlZDogUmVmZXJyZXIgY29udGFpbnMgOjY4NjgnKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBcbiAgLy8gTGF5ZXIgMzogUG9zdE1lc3NhZ2UgcGluZyAobW9zdCByZWxpYWJsZSBmb3IgaWZyYW1lIGRldGVjdGlvbilcbiAgaWYgKHdpbmRvdy5zZWxmICE9PSB3aW5kb3cudG9wKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGlzVkdDb2RlciA9IGF3YWl0IG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoZmFsc2UpLCAyMDApO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50LmRhdGE/LnR5cGUgPT09ICdWR19DT0RFUl9QQVJFTlQnKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHsgdHlwZTogJ1ZHX0NPREVSX1BJTkcnIH0sICcqJyk7XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgaWYgKGlzVkdDb2Rlcikge1xuICAgICAgICBjb25zb2xlLmxvZygn4pqhIFZHIENvZGVyIGNvbnRleHQgZGV0ZWN0ZWQ6IFBvc3RNZXNzYWdlIGNvbmZpcm1hdGlvbicpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmxvZygnUG9zdE1lc3NhZ2UgZGV0ZWN0aW9uIGZhaWxlZCAoZXhwZWN0ZWQgZm9yIGNyb3NzLW9yaWdpbik6JywgZSk7XG4gICAgfVxuICB9XG4gIFxuICBjb25zb2xlLmxvZygn4pyFIE5vcm1hbCBjb250ZXh0IC0gbm90IGluc2lkZSBWRyBDb2RlciBpZnJhbWUnKTtcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuY29uc3QgaW5pdGlhbGl6ZUNvbnRyb2xsZXIgPSBhc3luYyAoKSA9PiB7XG4gIHRyeSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgaW4gVkcgQ29kZXIncyBpZnJhbWUgY29udGV4dFxuICAgIGNvbnN0IGlzVkdDb2Rlck5lc3RlZCA9IGF3YWl0IGRldGVjdFZHQ29kZXJDb250ZXh0KCk7XG4gICAgXG4gICAgaWYgKGlzVkdDb2Rlck5lc3RlZCkge1xuICAgICAgY29uc29sZS5sb2coJ/CfmqsgVkcgQ29kZXIgbmVzdGVkIGlmcmFtZSBjb250ZXh0IGRldGVjdGVkIC0gc2tpcHBpbmcgYWxsIHNjcmlwdCBpbmplY3Rpb25zJyk7XG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdWR19DT0RFUl9ORVNURUQnLCAndHJ1ZScpO1xuICAgICAgcmV0dXJuOyAvLyBFYXJseSBleGl0IC0gZG9uJ3QgaW5qZWN0IGFueSBzY3JpcHRzXG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIERPTSBpcyByZWFkeVxuICAgIGF3YWl0IHdhaXRGb3JET00oKTtcblxuICAgIGNvbnN0IGN1cnJlbnRIb3N0bmFtZSA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZS5yZXBsYWNlKC8oaHR0cHM/OlxcL1xcLyk/KHd3dy4pPy9pLCAnJyk7XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhbiBBSSBjaGF0IGRvbWFpbiAtIHVzZSBidW5kbGVkIGluamVjdG9yXG4gICAgaWYgKGlzQUlDaGF0RG9tYWluKGN1cnJlbnRIb3N0bmFtZSkpIHtcbiAgICAgIGNvbnNvbGUubG9nKCfwn6SWIEFJIGNoYXQgZG9tYWluIGRldGVjdGVkOicsIGN1cnJlbnRIb3N0bmFtZSk7XG4gICAgICBjb25zb2xlLmxvZygn8J+TpiBVc2luZyBidW5kbGVkIFZHIENvZGVyIGluamVjdG9yIChubyBGaXJlYmFzZSBuZWVkZWQpJyk7XG4gICAgICBcbiAgICAgIC8vIEV4ZWN1dGUgYnVuZGxlZCBpbmplY3RvciBzY3JpcHRcbiAgICAgIGF3YWl0IGFkZFNjcmlwdChWR19DT0RFUl9JTkpFQ1RPUl9TQ1JJUFQsICdWR19DT0RFUl9JTkpFQ1RPUicpO1xuICAgICAgcmV0dXJuOyAvLyBEb25lIC0gbm8gbmVlZCBmb3IgRmlyZWJhc2Ugc2NyaXB0XG4gICAgfVxuXG4gICAgLy8gRm9yIG5vbi1BSSBkb21haW5zLCBjb250aW51ZSB3aXRoIEZpcmViYXNlIHNjcmlwdCBsb2FkaW5nXG4gICAgY29uc3QgYWN0aW9uVHlwZSA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoXCJhY3Rpb25UeXBlXCIpIHx8IFwiTUFJTlwiO1xuICAgIGNvbnN0IGNhY2hlID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShhY3Rpb25UeXBlKTtcblxuICAgIGlmIChjYWNoZSkge1xuICAgICAgYXdhaXQgYWRkU2NyaXB0KGNhY2hlLCBhY3Rpb25UeXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2Uoe1xuICAgICAgICBhY3Rpb246IFwiQ09OVFJPTExFUlwiLFxuICAgICAgICBkb21haW46IGN1cnJlbnRIb3N0bmFtZSxcbiAgICAgICAgYWN0aW9uVHlwZTogYWN0aW9uVHlwZVxuICAgICAgfSwgYXN5bmMgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChjaHJvbWUucnVudGltZS5sYXN0RXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdSdW50aW1lIGVycm9yOicsIGNocm9tZS5ydW50aW1lLmxhc3RFcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5zY3JpcHQpIHtcbiAgICAgICAgICBjb25zdCBmdWxsU2NyaXB0ID0gYHZhciBjaHJvbWVJZCA9IFwiJHtjaHJvbWUucnVudGltZS5pZH1cIjsgJHtyZXNwb25zZS5zY3JpcHR9YDtcbiAgICAgICAgICBhd2FpdCBhZGRTY3JpcHQoZnVsbFNjcmlwdCwgYWN0aW9uVHlwZSk7XG4gICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShhY3Rpb25UeXBlLCBmdWxsU2NyaXB0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKCdDb250cm9sbGVyIGluaXRpYWxpemF0aW9uIGVycm9yOicsIGVycik7XG4gIH1cbn07XG5cbi8vIEluaXRpYWxpemUgY29udHJvbGxlclxuaW5pdGlhbGl6ZUNvbnRyb2xsZXIoKTtcbmNvbnN0IHNldHVwUmVtb3ZlRXh0ZW5zaW9uTGlzdGVuZXIgPSBhc3luYyAoKSA9PiB7XG4gIHRyeSB7XG4gICAgLy8gV2FpdCBmb3IgRE9NIGFuZCBib2R5IHRvIGJlIHJlYWR5XG4gICAgYXdhaXQgd2FpdEZvckRPTSgpO1xuXG4gICAgLy8gV2FpdCBmb3IgYm9keSBlbGVtZW50XG4gICAgY29uc3Qgd2FpdEZvckJvZHkgPSAoKTogUHJvbWlzZTxIVE1MQm9keUVsZW1lbnQ+ID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCBjaGVja0JvZHkgPSAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgYm9keSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKTtcbiAgICAgICAgICBpZiAoYm9keSkge1xuICAgICAgICAgICAgcmVzb2x2ZShib2R5IGFzIEhUTUxCb2R5RWxlbWVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoY2hlY2tCb2R5LCAxMDApO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY2hlY2tCb2R5KCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHdhaXRGb3JCb2R5KCk7XG5cbiAgICAvLyBjYWNoIGR1bmc6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKS5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnUkVNT1ZFX0VYVEVOU0lPTicsIHsgZGV0YWlsOiB7IGtleTogJ3ZhbHVlJyB9IH0pKTtcbiAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ1JFTU9WRV9FWFRFTlNJT04nLCBmdW5jdGlvbihldmVudDogYW55KSB7XG4gICAgICBjb25zb2xlLmxvZyhldmVudC5kZXRhaWwpOyAvLyB7IGtleTogJ3ZhbHVlJyB9XG4gICAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7YWN0aW9uOiBcIlJFTU9WRV9FWFRFTlNJT05cIiwgZGF0YTogZXZlbnQuZGV0YWlsfSwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChjaHJvbWUucnVudGltZS5sYXN0RXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdSdW50aW1lIGVycm9yOicsIGNocm9tZS5ydW50aW1lLmxhc3RFcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCd0dSBodXkgdGhhbmggY29uZycsIHJlc3BvbnNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKCdTZXR1cCByZW1vdmUgZXh0ZW5zaW9uIGxpc3RlbmVyIGVycm9yOicsIGVycik7XG4gIH1cbn07XG5cbi8vIFNldHVwIHJlbW92ZSBleHRlbnNpb24gbGlzdGVuZXJcbnNldHVwUmVtb3ZlRXh0ZW5zaW9uTGlzdGVuZXIoKTtcblxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==
|
|
666
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q1osT0FBTyxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsRUFBRSxHQUFHLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsRUFBQztBQUVGLGtDQUFrQztBQUNsQyw0QkFBNEIsRUFBRSxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vdmctY29kZXIvLi9jaHJvbWUvc3JjL3NjcmlwdC1pbmplY3Rvci50cyIsIndlYnBhY2s6Ly92Zy1jb2Rlci8uL2Nocm9tZS9zcmMvdXRpbHMvYWktZG9tYWlucy50cyIsIndlYnBhY2s6Ly92Zy1jb2Rlci8uL2Nocm9tZS9zcmMvdXRpbHMvaW5qZWN0b3Itc2NyaXB0LnRzIiwid2VicGFjazovL3ZnLWNvZGVyL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3ZnLWNvZGVyL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly92Zy1jb2Rlci93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3ZnLWNvZGVyL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vdmctY29kZXIvLi9jaHJvbWUvc3JjL2NvbnRyb2xsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQWx0ZXJuYXRpdmUgc2NyaXB0IGluamVjdGlvbiBtZXRob2RzIGZvciBDU1AtcmVzdHJpY3RlZCBlbnZpcm9ubWVudHNcblxuZXhwb3J0IGNsYXNzIFNjcmlwdEluamVjdG9yIHtcblxuICAvKipcbiAgICogRGV0ZWN0IGlmIHNpdGUgaGFzIHN0cmljdCBDU1AgdGhhdCBibG9ja3MgYmxvYi9kYXRhIFVSTHNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRldGVjdFN0cmljdENTUCgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgZm9yIENTUCBtZXRhIHRhZ3NcbiAgICAgIGNvbnN0IGNzcE1ldGFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbWV0YVtodHRwLWVxdWl2PVwiQ29udGVudC1TZWN1cml0eS1Qb2xpY3lcIl0nKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3NwTWV0YXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IGNzcE1ldGFzW2ldO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gbWV0YS5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKSB8fCAnJztcbiAgICAgICAgaWYgKGNvbnRlbnQuaW5jbHVkZXMoJ3NjcmlwdC1zcmMnKSAmJiAhY29udGVudC5pbmNsdWRlcygnYmxvYjonKSAmJiAhY29udGVudC5pbmNsdWRlcygnZGF0YTonKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGNvbW1vbiBzdHJpY3QgQ1NQIGRvbWFpbnNcbiAgICAgIGNvbnN0IHN0cmljdERvbWFpbnMgPSBbXG4gICAgICAgICdtaWRqb3VybmV5LmNvbScsXG4gICAgICAgICdvcGVuYWkuY29tJyxcbiAgICAgICAgJ2dpdGh1Yi5jb20nLFxuICAgICAgICAnZ29vZ2xlLmNvbScsXG4gICAgICAgICdnb29nbGV0YWdtYW5hZ2VyLmNvbScsXG4gICAgICAgICdmYWNlYm9vay5jb20nLFxuICAgICAgICAndHdpdHRlci5jb20nLFxuICAgICAgICAnbGlua2VkaW4uY29tJ1xuICAgICAgXTtcblxuICAgICAgY29uc3QgaG9zdG5hbWUgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBzdHJpY3REb21haW5zLnNvbWUoZG9tYWluID0+IGhvc3RuYW1lLmluY2x1ZGVzKGRvbWFpbikpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDU1AgZGV0ZWN0aW9uIGVycm9yOicsIGVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2FmZWx5IGdldCBoZWFkIGVsZW1lbnQgb3Igd2FpdCBmb3IgaXRcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldEhlYWRFbGVtZW50KCk6IFByb21pc2U8SFRNTEhlYWRFbGVtZW50PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCB0cnlHZXRIZWFkID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBoZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdO1xuICAgICAgICBpZiAoaGVhZCkge1xuICAgICAgICAgIHJlc29sdmUoaGVhZCBhcyBIVE1MSGVhZEVsZW1lbnQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG5vIGhlYWQsIHdhaXQgZm9yIERPTVxuICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHRyeUdldEhlYWQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBDcmVhdGUgaGVhZCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgY29uc3QgbmV3SGVhZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2hlYWQnKTtcbiAgICAgICAgICBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3SGVhZCk7XG4gICAgICAgICAgICByZXNvbHZlKG5ld0hlYWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBMYXN0IHJlc29ydDogd2FpdCBhIGJpdCBhbmQgdHJ5IGFnYWluXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHRyeUdldEhlYWQsIDEwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0cnlHZXRIZWFkKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIDE6IEJsb2IgVVJMIGluamVjdGlvbiAod29ya3MgaW4gbW9zdCBjYXNlcylcbiAgICovXG4gIHN0YXRpYyBhc3luYyBpbmplY3RWaWFCbG9iKHNjcmlwdDogc3RyaW5nLCBhY3Rpb25UeXBlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtzY3JpcHRdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JyB9KTtcbiAgICAgIGNvbnN0IGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXG4gICAgICBjb25zdCBzY3JpcHRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICBzY3JpcHRFbGVtZW50LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JztcbiAgICAgIHNjcmlwdEVsZW1lbnQuaWQgPSBhY3Rpb25UeXBlO1xuICAgICAgc2NyaXB0RWxlbWVudC5zcmMgPSBibG9iVXJsO1xuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2NyaXB0RWxlbWVudC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChibG9iVXJsKTtcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNjcmlwdEVsZW1lbnQub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGJsb2JVcmwpO1xuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaGVhZCA9IGF3YWl0IHRoaXMuZ2V0SGVhZEVsZW1lbnQoKTtcbiAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKHNjcmlwdEVsZW1lbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBnZXQgaGVhZCBlbGVtZW50OicsIGVycm9yKTtcbiAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGJsb2JVcmwpO1xuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignQmxvYiBpbmplY3Rpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIDI6IERhdGEgVVJMIGluamVjdGlvbiAoZmFsbGJhY2spXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW5qZWN0VmlhRGF0YVVybChzY3JpcHQ6IHN0cmluZywgYWN0aW9uVHlwZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGFVcmwgPSAnZGF0YTphcHBsaWNhdGlvbi9qYXZhc2NyaXB0O2Jhc2U2NCwnICsgYnRvYShzY3JpcHQpO1xuICAgICAgY29uc3Qgc2NyaXB0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgc2NyaXB0RWxlbWVudC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgICBzY3JpcHRFbGVtZW50LmlkID0gYWN0aW9uVHlwZSArICdfZGF0YSc7XG4gICAgICBzY3JpcHRFbGVtZW50LnNyYyA9IGRhdGFVcmw7XG5cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzY3JpcHRFbGVtZW50Lm9ubG9hZCA9ICgpID0+IHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIHNjcmlwdEVsZW1lbnQub25lcnJvciA9ICgpID0+IHJlc29sdmUoZmFsc2UpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaGVhZCA9IGF3YWl0IHRoaXMuZ2V0SGVhZEVsZW1lbnQoKTtcbiAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKHNjcmlwdEVsZW1lbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBnZXQgaGVhZCBlbGVtZW50IGZvciBkYXRhIFVSTDonLCBlcnJvcik7XG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdEYXRhIFVSTCBpbmplY3Rpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIDM6IFBvc3RNZXNzYWdlIGJyaWRnZSBpbmplY3Rpb25cbiAgICovXG4gIHN0YXRpYyBpbmplY3RWaWFQb3N0TWVzc2FnZShzY3JpcHQ6IHN0cmluZywgYWN0aW9uVHlwZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBDcmVhdGUgYSBicmlkZ2Ugc2NyaXB0IHRoYXQgbGlzdGVucyBmb3IgcG9zdE1lc3NhZ2VcbiAgICAgICAgY29uc3QgYnJpZGdlU2NyaXB0ID0gYFxuICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgIT09IHdpbmRvdyB8fCAhZXZlbnQuZGF0YS50eXBlIHx8IGV2ZW50LmRhdGEudHlwZSAhPT0gJ1ZFVEdPX1NDUklQVF9JTkpFQ1QnKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZ1bmMgPSBuZXcgRnVuY3Rpb24oZXZlbnQuZGF0YS5zY3JpcHQpO1xuICAgICAgICAgICAgICBmdW5jKCk7XG4gICAgICAgICAgICAgIHdpbmRvdy5wb3N0TWVzc2FnZSh7dHlwZTogJ1ZFVEdPX1NDUklQVF9TVUNDRVNTJywgYWN0aW9uVHlwZTogZXZlbnQuZGF0YS5hY3Rpb25UeXBlfSwgJyonKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Bvc3RNZXNzYWdlIHNjcmlwdCBleGVjdXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgICAgICAgd2luZG93LnBvc3RNZXNzYWdlKHt0eXBlOiAnVkVUR09fU0NSSVBUX0VSUk9SJywgYWN0aW9uVHlwZTogZXZlbnQuZGF0YS5hY3Rpb25UeXBlLCBlcnJvcjogZXJyb3IubWVzc2FnZX0sICcqJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIGA7XG4gICAgICAgIFxuICAgICAgICAvLyBGaXJzdCBpbmplY3QgdGhlIGJyaWRnZVxuICAgICAgICB0aGlzLmluamVjdFZpYUJsb2IoYnJpZGdlU2NyaXB0LCBhY3Rpb25UeXBlICsgJ19icmlkZ2UnKS50aGVuKChicmlkZ2VTdWNjZXNzKSA9PiB7XG4gICAgICAgICAgaWYgKGJyaWRnZVN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIC8vIExpc3RlbiBmb3IgcmVzcG9uc2VcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgIT09IHdpbmRvdyB8fCAhZXZlbnQuZGF0YS50eXBlKSByZXR1cm47XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS50eXBlID09PSAnVkVUR09fU0NSSVBUX1NVQ0NFU1MnICYmIGV2ZW50LmRhdGEuYWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgcmVzcG9uc2VIYW5kbGVyKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmRhdGEudHlwZSA9PT0gJ1ZFVEdPX1NDUklQVF9FUlJPUicgJiYgZXZlbnQuZGF0YS5hY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCByZXNwb25zZUhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHJlc3BvbnNlSGFuZGxlcik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFNlbmQgc2NyaXB0IHZpYSBwb3N0TWVzc2FnZVxuICAgICAgICAgICAgd2luZG93LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgdHlwZTogJ1ZFVEdPX1NDUklQVF9JTkpFQ1QnLFxuICAgICAgICAgICAgICBzY3JpcHQ6IHNjcmlwdCxcbiAgICAgICAgICAgICAgYWN0aW9uVHlwZTogYWN0aW9uVHlwZVxuICAgICAgICAgICAgfSwgJyonKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVGltZW91dCBhZnRlciA1IHNlY29uZHNcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHJlc3BvbnNlSGFuZGxlcik7XG4gICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgfSwgNTAwMCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdQb3N0TWVzc2FnZSBpbmplY3Rpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIDQ6IEJhY2tncm91bmQgc2NyaXB0IGluamVjdGlvbiB2aWEgY2hyb21lLnNjcmlwdGluZ1xuICAgKi9cbiAgc3RhdGljIGluamVjdFZpYUJhY2tncm91bmQoc2NyaXB0OiBzdHJpbmcsIGFjdGlvblR5cGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2Uoe1xuICAgICAgICAgIGFjdGlvbjogXCJJTkpFQ1RfU0NSSVBUXCIsXG4gICAgICAgICAgc2NyaXB0OiBzY3JpcHQsXG4gICAgICAgICAgYWN0aW9uVHlwZTogYWN0aW9uVHlwZVxuICAgICAgICB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAoY2hyb21lLnJ1bnRpbWUubGFzdEVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdCYWNrZ3JvdW5kIGluamVjdGlvbiBmYWlsZWQ6JywgY2hyb21lLnJ1bnRpbWUubGFzdEVycm9yKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlICYmIHJlc3BvbnNlLnN1Y2Nlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdCYWNrZ3JvdW5kIHNjcmlwdCBpbmplY3Rpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIDU6IERpcmVjdCBldmFsIGluIGNvbnRlbnQgc2NyaXB0IGNvbnRleHQgKGxhc3QgcmVzb3J0KVxuICAgKi9cbiAgc3RhdGljIGluamVjdFZpYUV2YWwoc2NyaXB0OiBzdHJpbmcsIGFjdGlvblR5cGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc29sZS5sb2coYEF0dGVtcHRpbmcgZGlyZWN0IGV2YWwgZm9yICR7YWN0aW9uVHlwZX1gKTtcblxuICAgICAgICAvLyBDcmVhdGUgaXNvbGF0ZWQgZnVuY3Rpb24gdG8gYXZvaWQgcG9sbHV0aW5nIGdsb2JhbCBzY29wZVxuICAgICAgICBjb25zdCBpc29sYXRlZEV4ZWN1dGlvbiA9IG5ldyBGdW5jdGlvbignc2NyaXB0JywgYFxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAke3NjcmlwdH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmFsIGV4ZWN1dGlvbiBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICBgKTtcblxuICAgICAgICBjb25zdCBzdWNjZXNzID0gaXNvbGF0ZWRFeGVjdXRpb24oc2NyaXB0KTtcbiAgICAgICAgcmVzb2x2ZShzdWNjZXNzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V2YWwgaW5qZWN0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSBhbGwgbWV0aG9kcyBpbiBzbWFydCBvcmRlciBiYXNlZCBvbiBDU1AgZGV0ZWN0aW9uXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW5qZWN0U2NyaXB0KHNjcmlwdDogc3RyaW5nLCBhY3Rpb25UeXBlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBoYXNTdHJpY3RDU1AgPSB0aGlzLmRldGVjdFN0cmljdENTUCgpO1xuXG4gICAgLy8gU21hcnQgbWV0aG9kIG9yZGVyaW5nIGJhc2VkIG9uIENTUCBkZXRlY3Rpb25cbiAgICBjb25zdCBtZXRob2RzID0gaGFzU3RyaWN0Q1NQID8gW1xuICAgICAgLy8gRm9yIHN0cmljdCBDU1Agc2l0ZXMsIHRyeSBiYWNrZ3JvdW5kIGluamVjdGlvbiBmaXJzdFxuICAgICAgKCkgPT4gdGhpcy5pbmplY3RWaWFCYWNrZ3JvdW5kKHNjcmlwdCwgYWN0aW9uVHlwZSksXG4gICAgICAoKSA9PiB0aGlzLmluamVjdFZpYUV2YWwoc2NyaXB0LCBhY3Rpb25UeXBlKSxcbiAgICAgICgpID0+IHRoaXMuaW5qZWN0VmlhUG9zdE1lc3NhZ2Uoc2NyaXB0LCBhY3Rpb25UeXBlKSxcbiAgICAgICgpID0+IHRoaXMuaW5qZWN0VmlhQmxvYihzY3JpcHQsIGFjdGlvblR5cGUpLFxuICAgICAgKCkgPT4gdGhpcy5pbmplY3RWaWFEYXRhVXJsKHNjcmlwdCwgYWN0aW9uVHlwZSlcbiAgICBdIDogW1xuICAgICAgLy8gRm9yIG5vcm1hbCBzaXRlcywgdHJ5IGJsb2IgZmlyc3QgKGZhc3Rlc3QpXG4gICAgICAoKSA9PiB0aGlzLmluamVjdFZpYUJsb2Ioc2NyaXB0LCBhY3Rpb25UeXBlKSxcbiAgICAgICgpID0+IHRoaXMuaW5qZWN0VmlhRGF0YVVybChzY3JpcHQsIGFjdGlvblR5cGUpLFxuICAgICAgKCkgPT4gdGhpcy5pbmplY3RWaWFCYWNrZ3JvdW5kKHNjcmlwdCwgYWN0aW9uVHlwZSksXG4gICAgICAoKSA9PiB0aGlzLmluamVjdFZpYUV2YWwoc2NyaXB0LCBhY3Rpb25UeXBlKSxcbiAgICAgICgpID0+IHRoaXMuaW5qZWN0VmlhUG9zdE1lc3NhZ2Uoc2NyaXB0LCBhY3Rpb25UeXBlKVxuICAgIF07XG5cbiAgICBjb25zb2xlLmxvZyhgSW5qZWN0aW5nIHNjcmlwdCBmb3IgJHthY3Rpb25UeXBlfSAoU3RyaWN0IENTUDogJHtoYXNTdHJpY3RDU1B9KWApO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBtZXRob2QgPSBtZXRob2RzW2ldO1xuICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IGhhc1N0cmljdENTUCA/XG4gICAgICAgIFsnQmFja2dyb3VuZCcsICdFdmFsJywgJ1Bvc3RNZXNzYWdlJywgJ0Jsb2InLCAnRGF0YVVSTCddW2ldIDpcbiAgICAgICAgWydCbG9iJywgJ0RhdGFVUkwnLCAnQmFja2dyb3VuZCcsICdFdmFsJywgJ1Bvc3RNZXNzYWdlJ11baV07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBUcnlpbmcgJHttZXRob2ROYW1lfSBpbmplY3Rpb24uLi5gKTtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IG1ldGhvZCgpO1xuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGDinIUgU2NyaXB0IGluamVjdGlvbiBzdWNjZXNzZnVsIHZpYSAke21ldGhvZE5hbWV9IGZvciAke2FjdGlvblR5cGV9YCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYOKdjCAke21ldGhvZE5hbWV9IGluamVjdGlvbiBmYWlsZWQgZm9yICR7YWN0aW9uVHlwZX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihg4p2MICR7bWV0aG9kTmFtZX0gaW5qZWN0aW9uIGVycm9yOmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmVycm9yKGDinYwgQWxsIGluamVjdGlvbiBtZXRob2RzIGZhaWxlZCBmb3IgJHthY3Rpb25UeXBlfWApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwiLy8gQUkgQ2hhdCBQcm92aWRlcnMgQ29uZmlndXJhdGlvblxuLy8gRG9tYWlucyBmb3IgYXV0b21hdGljIFZHIENvZGVyIGlmcmFtZSBpbmplY3Rpb25cblxuZXhwb3J0IGNvbnN0IEFJX0RPTUFJTlMgPSBbXG4gICdjaGF0Lm9wZW5haS5jb20nLCAgICAgICAgICAgLy8gQ2hhdEdQVCAob2xkIFVSTClcbiAgJ2NoYXRncHQuY29tJywgICAgICAgICAgICAgICAvLyBDaGF0R1BUIChuZXcgVVJMKVxuICAnZ2VtaW5pLmdvb2dsZS5jb20nLCAgICAgICAgIC8vIEdvb2dsZSBHZW1pbmlcbiAgJ2Fpc3R1ZGlvLmdvb2dsZS5jb20nLCAgICAgICAvLyBHb29nbGUgQUkgU3R1ZGlvXG4gICdjaGF0LmRlZXBzZWVrLmNvbScsICAgICAgICAgLy8gRGVlcFNlZWtcbiAgJ2tpbWkuY29tJywgICAgICAgICAgICAgICAgICAvLyBLaW1pIEFJXG4gICd3d3cua2ltaS5jb20nLCAgICAgICAgICAgICAvLyBLaW1pIEFJICh3d3cpXG4gICdncm9rLmNvbScsICAgICAgICAgICAgICAgICAgLy8gR3Jva1xuICAnY2xhdWRlLmFpJywgICAgICAgICAgICAgICAgIC8vIENsYXVkZSAoQW50aHJvcGljKVxuICAncG9lLmNvbScsICAgICAgICAgICAgICAgICAgIC8vIFBvZVxuICAncGVycGxleGl0eS5haScsICAgICAgICAgICAgLy8gUGVycGxleGl0eVxuICAnd3d3LnBlcnBsZXhpdHkuYWknLCAgICAgICAgLy8gUGVycGxleGl0eSAod3d3KVxuXTtcblxuLyoqXG4gKiBDaGVjayBpZiBkb21haW4gc2hvdWxkIGhhdmUgVkcgQ29kZXIgaWZyYW1lIGluamVjdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FJQ2hhdERvbWFpbihob3N0bmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNsZWFuSG9zdG5hbWUgPSBob3N0bmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL153d3dcXC4vLCAnJyk7XG4gIGNvbnNvbGUubG9nKCfwn5SNIENoZWNraW5nIEFJIGRvbWFpbjonLCBjbGVhbkhvc3RuYW1lKTtcbiAgXG4gIGNvbnN0IGlzTWF0Y2ggPSBBSV9ET01BSU5TLnNvbWUoZG9tYWluID0+IHtcbiAgICBjb25zdCBjbGVhbkRvbWFpbiA9IGRvbWFpbi50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL153d3dcXC4vLCAnJyk7XG4gICAgcmV0dXJuIGNsZWFuSG9zdG5hbWUgPT09IGNsZWFuRG9tYWluIHx8IGNsZWFuSG9zdG5hbWUuZW5kc1dpdGgoJy4nICsgY2xlYW5Eb21haW4pO1xuICB9KTtcbiAgXG4gIGNvbnNvbGUubG9nKCfwn46vIEFJIGRvbWFpbiBtYXRjaDonLCBpc01hdGNoKTtcbiAgcmV0dXJuIGlzTWF0Y2g7XG59XG4iLCIvLyBWRyBDb2RlciBTaGFkb3cgRE9NIEJ1bmRsZSBMb2FkZXJcbi8vIFRoaXMgc2NyaXB0IGZldGNoZXMgdGhlIGNvbXBpbGVkIGJ1bmRsZSBmcm9tIHRoZSBsb2NhbCBzZXJ2ZXIgYW5kIGV4ZWN1dGVzIGl0LlxuXG5leHBvcnQgY29uc3QgVkdfQ09ERVJfSU5KRUNUT1JfU0NSSVBUID0gYFxuKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG4gIFxuICBjb25zdCBDT05GSUcgPSB7XG4gICAgLy8gVHLhu48gdOG7m2kgZmlsZSBidW5kbGUgduG7q2EgYnVpbGRcbiAgICBCVU5ETEVfVVJMOiAnaHR0cDovL2xvY2FsaG9zdDo2ODY4L2Rpc3QvdmctY29kZXItYnVuZGxlLmpzJyxcbiAgICBDT05UQUlORVJfSUQ6ICd2Zy1jb2Rlci1zaGFkb3ctaG9zdCdcbiAgfTtcbiAgXG4gIC8vIDEuIEtp4buDbSB0cmEgbuG6v3UgxJHDoyBpbmplY3QgcuG7k2lcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKENPTkZJRy5DT05UQUlORVJfSUQpKSB7XG4gICAgY29uc29sZS5sb2coJ+KaoSBWRyBDb2RlciBhbHJlYWR5IGluamVjdGVkJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc29sZS5sb2coJ/CfmoAgTG9hZGluZyBWRyBDb2RlciBCdW5kbGUgZnJvbTonLCBDT05GSUcuQlVORExFX1VSTCk7XG5cbiAgLy8gMi4gVOG6oW8gU2NyaXB0IFRhZyDEkeG7gyBsb2FkIGJ1bmRsZVxuICAvLyBDw6FjaCBuw6B5IHThu5F0IGjGoW4gZmV0Y2grZXZhbCB2w6wgdOG6rW4gZOG7pW5nIGNhY2hlIHbDoCBkZWJ1ZyBk4buFIGjGoW5cbiAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gIHNjcmlwdC5zcmMgPSBDT05GSUcuQlVORExFX1VSTDtcbiAgc2NyaXB0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JztcbiAgc2NyaXB0LmFzeW5jID0gdHJ1ZTtcbiAgXG4gIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJ+KchSBWRyBDb2RlciBCdW5kbGUgTG9hZGVkIFN1Y2Nlc3NmdWxseScpO1xuICB9O1xuICBcbiAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcign4p2MIEZhaWxlZCB0byBsb2FkIFZHIENvZGVyIEJ1bmRsZS4gSXMgdGhlIHNlcnZlciBydW5uaW5nIGF0IHBvcnQgNjg2OD8nKTtcbiAgICAvLyBPcHRpb25hbDogU2hvdyBhIHZpc3VhbCBlcnJvciB0b2FzdCBvbiB0aGUgcGFnZVxuICAgIGNvbnN0IHRvYXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdG9hc3Quc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDsgdG9wOjIwcHg7IHJpZ2h0OjIwcHg7IGJhY2tncm91bmQ6I2ZmM2IzMDsgY29sb3I6d2hpdGU7IHBhZGRpbmc6MTBweCAyMHB4OyBib3JkZXItcmFkaXVzOjhweDsgei1pbmRleDo5OTk5OTk7IGZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7IGJveC1zaGFkb3c6MCA0cHggMTJweCByZ2JhKDAsMCwwLDAuMik7JztcbiAgICB0b2FzdC50ZXh0Q29udGVudCA9ICfimqDvuI8gVkcgQ29kZXIgQ29ubmVjdGlvbiBGYWlsZWQgKElzIFNlcnZlciBSdW5uaW5nPyknO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodG9hc3QpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdG9hc3QucmVtb3ZlKCksIDUwMDApO1xuICB9O1xuXG4gIC8vIDMuIEluamVjdCB2w6BvIEhlYWQgaG/hurdjIEJvZHlcbiAgKGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcblxufSkoKTtcbmA7XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImltcG9ydCB7IFNjcmlwdEluamVjdG9yIH0gZnJvbSAnLi9zY3JpcHQtaW5qZWN0b3InO1xuaW1wb3J0IHsgaXNBSUNoYXREb21haW4gfSBmcm9tICcuL3V0aWxzL2FpLWRvbWFpbnMnO1xuaW1wb3J0IHsgVkdfQ09ERVJfSU5KRUNUT1JfU0NSSVBUIH0gZnJvbSAnLi91dGlscy9pbmplY3Rvci1zY3JpcHQnO1xuXG5jb25zdCBhZGRTY3JpcHQgPSBhc3luYyAoc2NyaXB0OiBzdHJpbmcsIGFjdGlvblR5cGU6IHN0cmluZykgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBTY3JpcHRJbmplY3Rvci5pbmplY3RTY3JpcHQoc2NyaXB0LCBhY3Rpb25UeXBlKTtcbiAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0FsbCBzY3JpcHQgaW5qZWN0aW9uIG1ldGhvZHMgZmFpbGVkIGZvcjonLCBhY3Rpb25UeXBlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignU2NyaXB0IGluamVjdGlvbiBlcnJvcjonLCBlcnJvcik7XG4gIH1cbn1cbi8vIFdhaXQgZm9yIERPTSB0byBiZSByZWFkeSBiZWZvcmUgZXhlY3V0aW5nXG5jb25zdCB3YWl0Rm9yRE9NID0gKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4gcmVzb2x2ZSgpLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBNdWx0aS1sYXllciBkZXRlY3Rpb24gdG8gY2hlY2sgaWYgY3VycmVudCBwYWdlIGlzIGxvYWRlZCBpbnNpZGUgVkcgQ29kZXIncyBpZnJhbWVcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgbmVzdGVkIGNvbnRleHQgKHNob3VsZCBza2lwIGluamVjdGlvbilcbiAqL1xuY29uc3QgZGV0ZWN0VkdDb2RlckNvbnRleHQgPSBhc3luYyAoKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIC8vIExheWVyIDE6IFVSTCBwYXJhbWV0ZXIgY2hlY2sgKGZhc3Rlc3QpXG4gIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gIGlmICh1cmxQYXJhbXMuaGFzKCd2Z19jb2Rlcl9jb250ZXh0JykpIHtcbiAgICBjb25zb2xlLmxvZygn4pqhIFZHIENvZGVyIGNvbnRleHQgZGV0ZWN0ZWQ6IFVSTCBwYXJhbWV0ZXInKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBcbiAgLy8gTGF5ZXIgMjogUmVmZXJyZXIgY2hlY2sgKGJhY2t1cClcbiAgY29uc3QgcmVmZXJyZXIgPSBkb2N1bWVudC5yZWZlcnJlcjtcbiAgaWYgKHJlZmVycmVyICYmIChyZWZlcnJlci5pbmNsdWRlcygnOjY4NjgnKSB8fCByZWZlcnJlci5pbmNsdWRlcygndmctY29kZXInKSkpIHtcbiAgICBjb25zb2xlLmxvZygn4pqhIFZHIENvZGVyIGNvbnRleHQgZGV0ZWN0ZWQ6IFJlZmVycmVyIGNvbnRhaW5zIDo2ODY4Jyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgXG4gIC8vIExheWVyIDM6IFBvc3RNZXNzYWdlIHBpbmcgKG1vc3QgcmVsaWFibGUgZm9yIGlmcmFtZSBkZXRlY3Rpb24pXG4gIGlmICh3aW5kb3cuc2VsZiAhPT0gd2luZG93LnRvcCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpc1ZHQ29kZXIgPSBhd2FpdCBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKGZhbHNlKSwgMjAwKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgICAgIGlmIChldmVudC5kYXRhPy50eXBlID09PSAnVkdfQ09ERVJfUEFSRU5UJykge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7IHR5cGU6ICdWR19DT0RFUl9QSU5HJyB9LCAnKicpO1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGlmIChpc1ZHQ29kZXIpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ+KaoSBWRyBDb2RlciBjb250ZXh0IGRldGVjdGVkOiBQb3N0TWVzc2FnZSBjb25maXJtYXRpb24nKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coJ1Bvc3RNZXNzYWdlIGRldGVjdGlvbiBmYWlsZWQgKGV4cGVjdGVkIGZvciBjcm9zcy1vcmlnaW4pOicsIGUpO1xuICAgIH1cbiAgfVxuICBcbiAgY29uc29sZS5sb2coJ+KchSBOb3JtYWwgY29udGV4dCAtIG5vdCBpbnNpZGUgVkcgQ29kZXIgaWZyYW1lJyk7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmNvbnN0IGluaXRpYWxpemVDb250cm9sbGVyID0gYXN5bmMgKCkgPT4ge1xuICB0cnkge1xuICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIFZHIENvZGVyJ3MgaWZyYW1lIGNvbnRleHRcbiAgICBjb25zdCBpc1ZHQ29kZXJOZXN0ZWQgPSBhd2FpdCBkZXRlY3RWR0NvZGVyQ29udGV4dCgpO1xuICAgIFxuICAgIGlmIChpc1ZHQ29kZXJOZXN0ZWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKCfwn5qrIFZHIENvZGVyIG5lc3RlZCBpZnJhbWUgY29udGV4dCBkZXRlY3RlZCAtIHNraXBwaW5nIGFsbCBzY3JpcHQgaW5qZWN0aW9ucycpO1xuICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnVkdfQ09ERVJfTkVTVEVEJywgJ3RydWUnKTtcbiAgICAgIHJldHVybjsgLy8gRWFybHkgZXhpdCAtIGRvbid0IGluamVjdCBhbnkgc2NyaXB0c1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBET00gaXMgcmVhZHlcbiAgICBhd2FpdCB3YWl0Rm9yRE9NKCk7XG5cbiAgICBjb25zdCBjdXJyZW50SG9zdG5hbWUgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUucmVwbGFjZSgvKGh0dHBzPzpcXC9cXC8pPyh3d3cuKT8vaSwgJycpO1xuICAgIFxuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYW4gQUkgY2hhdCBkb21haW4gLSB1c2UgYnVuZGxlZCBpbmplY3RvclxuICAgIGlmIChpc0FJQ2hhdERvbWFpbihjdXJyZW50SG9zdG5hbWUpKSB7XG4gICAgICBjb25zb2xlLmxvZygn8J+kliBBSSBjaGF0IGRvbWFpbiBkZXRlY3RlZDonLCBjdXJyZW50SG9zdG5hbWUpO1xuICAgICAgY29uc29sZS5sb2coJ/Cfk6YgVXNpbmcgYnVuZGxlZCBWRyBDb2RlciBpbmplY3RvciAobm8gRmlyZWJhc2UgbmVlZGVkKScpO1xuICAgICAgXG4gICAgICAvLyBFeGVjdXRlIGJ1bmRsZWQgaW5qZWN0b3Igc2NyaXB0XG4gICAgICBhd2FpdCBhZGRTY3JpcHQoVkdfQ09ERVJfSU5KRUNUT1JfU0NSSVBULCAnVkdfQ09ERVJfSU5KRUNUT1InKTtcbiAgICAgIHJldHVybjsgLy8gRG9uZSAtIG5vIG5lZWQgZm9yIEZpcmViYXNlIHNjcmlwdFxuICAgIH1cblxuICAgIC8vIEZvciBub24tQUkgZG9tYWlucywgY29udGludWUgd2l0aCBGaXJlYmFzZSBzY3JpcHQgbG9hZGluZ1xuICAgIGNvbnN0IGFjdGlvblR5cGUgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KFwiYWN0aW9uVHlwZVwiKSB8fCBcIk1BSU5cIjtcbiAgICBjb25zdCBjYWNoZSA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oYWN0aW9uVHlwZSk7XG5cbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGF3YWl0IGFkZFNjcmlwdChjYWNoZSwgYWN0aW9uVHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHtcbiAgICAgICAgYWN0aW9uOiBcIkNPTlRST0xMRVJcIixcbiAgICAgICAgZG9tYWluOiBjdXJyZW50SG9zdG5hbWUsXG4gICAgICAgIGFjdGlvblR5cGU6IGFjdGlvblR5cGVcbiAgICAgIH0sIGFzeW5jIChyZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoY2hyb21lLnJ1bnRpbWUubGFzdEVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignUnVudGltZSBlcnJvcjonLCBjaHJvbWUucnVudGltZS5sYXN0RXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uuc2NyaXB0KSB7XG4gICAgICAgICAgY29uc3QgZnVsbFNjcmlwdCA9IGB2YXIgY2hyb21lSWQgPSBcIiR7Y2hyb21lLnJ1bnRpbWUuaWR9XCI7ICR7cmVzcG9uc2Uuc2NyaXB0fWA7XG4gICAgICAgICAgYXdhaXQgYWRkU2NyaXB0KGZ1bGxTY3JpcHQsIGFjdGlvblR5cGUpO1xuICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oYWN0aW9uVHlwZSwgZnVsbFNjcmlwdCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcignQ29udHJvbGxlciBpbml0aWFsaXphdGlvbiBlcnJvcjonLCBlcnIpO1xuICB9XG59O1xuXG4vLyBJbml0aWFsaXplIGNvbnRyb2xsZXJcbmluaXRpYWxpemVDb250cm9sbGVyKCk7XG5jb25zdCBzZXR1cFJlbW92ZUV4dGVuc2lvbkxpc3RlbmVyID0gYXN5bmMgKCkgPT4ge1xuICB0cnkge1xuICAgIC8vIFdhaXQgZm9yIERPTSBhbmQgYm9keSB0byBiZSByZWFkeVxuICAgIGF3YWl0IHdhaXRGb3JET00oKTtcblxuICAgIC8vIFdhaXQgZm9yIGJvZHkgZWxlbWVudFxuICAgIGNvbnN0IHdhaXRGb3JCb2R5ID0gKCk6IFByb21pc2U8SFRNTEJvZHlFbGVtZW50PiA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3QgY2hlY2tCb2R5ID0gKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5Jyk7XG4gICAgICAgICAgaWYgKGJvZHkpIHtcbiAgICAgICAgICAgIHJlc29sdmUoYm9keSBhcyBIVE1MQm9keUVsZW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGNoZWNrQm9keSwgMTAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNoZWNrQm9keSgpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCB3YWl0Rm9yQm9keSgpO1xuXG4gICAgLy8gY2FjaCBkdW5nOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ1JFTU9WRV9FWFRFTlNJT04nLCB7IGRldGFpbDogeyBrZXk6ICd2YWx1ZScgfSB9KSk7XG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdSRU1PVkVfRVhURU5TSU9OJywgZnVuY3Rpb24oZXZlbnQ6IGFueSkge1xuICAgICAgY29uc29sZS5sb2coZXZlbnQuZGV0YWlsKTsgLy8geyBrZXk6ICd2YWx1ZScgfVxuICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2Uoe2FjdGlvbjogXCJSRU1PVkVfRVhURU5TSU9OXCIsIGRhdGE6IGV2ZW50LmRldGFpbH0sIChyZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoY2hyb21lLnJ1bnRpbWUubGFzdEVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignUnVudGltZSBlcnJvcjonLCBjaHJvbWUucnVudGltZS5sYXN0RXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZygndHUgaHV5IHRoYW5oIGNvbmcnLCByZXNwb25zZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcignU2V0dXAgcmVtb3ZlIGV4dGVuc2lvbiBsaXN0ZW5lciBlcnJvcjonLCBlcnIpO1xuICB9XG59O1xuXG4vLyBTZXR1cCByZW1vdmUgZXh0ZW5zaW9uIGxpc3RlbmVyXG5zZXR1cFJlbW92ZUV4dGVuc2lvbkxpc3RlbmVyKCk7XG5cbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=
|