vg-coder-cli 2.0.25 → 2.0.27
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/.vg/tree-state.json +1 -7
- package/package.json +1 -1
- package/src/index.js +36 -0
- package/src/server/api-server.js +167 -31
- package/src/server/project-manager.js +353 -0
- package/src/server/terminal-manager.js +31 -3
- package/src/server/views/css/iframe.css +1 -0
- package/src/server/views/dashboard.css +138 -30
- package/src/server/views/dashboard.html +94 -11
- package/src/server/views/js/features/commands.js +3 -1
- package/src/server/views/js/features/iframe-manager.js +6 -2
- package/src/server/views/js/features/project-switcher.js +153 -0
- package/src/server/views/js/features/terminal.js +44 -6
- package/src/server/views/js/main.js +61 -0
- package/src/server/views/vg-coder/controller.js +397 -2
- package/vetgo-auto/chrome/src/controller.ts +75 -1
- package/vetgo-auto/chrome/src/utils/ai-domains.ts +33 -0
- package/vetgo-auto/chrome/src/utils/injector-script.ts +272 -0
- package/vetgo-auto/vg-coder.zip +0 -0
- package/vg-coder-cli-2.0.26.tgz +0 -0
- package/vg-coder-cli-2.0.27.tgz +0 -0
- package/vg-coder-cli-2.0.23.tgz +0 -0
- package/vg-coder-cli-2.0.24.tgz +0 -0
- package/vg-coder-cli-2.0.25.tgz +0 -0
|
@@ -319,6 +319,335 @@ class ScriptInjector {
|
|
|
319
319
|
}
|
|
320
320
|
|
|
321
321
|
|
|
322
|
+
/***/ }),
|
|
323
|
+
|
|
324
|
+
/***/ "./chrome/src/utils/ai-domains.ts":
|
|
325
|
+
/*!****************************************!*\
|
|
326
|
+
!*** ./chrome/src/utils/ai-domains.ts ***!
|
|
327
|
+
\****************************************/
|
|
328
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
329
|
+
|
|
330
|
+
__webpack_require__.r(__webpack_exports__);
|
|
331
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
332
|
+
/* harmony export */ AI_DOMAINS: () => (/* binding */ AI_DOMAINS),
|
|
333
|
+
/* harmony export */ isAIChatDomain: () => (/* binding */ isAIChatDomain)
|
|
334
|
+
/* harmony export */ });
|
|
335
|
+
// AI Chat Providers Configuration
|
|
336
|
+
// Domains for automatic VG Coder iframe injection
|
|
337
|
+
const AI_DOMAINS = [
|
|
338
|
+
'chat.openai.com',
|
|
339
|
+
'chatgpt.com',
|
|
340
|
+
'gemini.google.com',
|
|
341
|
+
'aistudio.google.com',
|
|
342
|
+
'chat.deepseek.com',
|
|
343
|
+
'kimi.com',
|
|
344
|
+
'www.kimi.com',
|
|
345
|
+
'grok.com',
|
|
346
|
+
'claude.ai',
|
|
347
|
+
'poe.com',
|
|
348
|
+
'perplexity.ai',
|
|
349
|
+
'www.perplexity.ai', // Perplexity (www)
|
|
350
|
+
];
|
|
351
|
+
/**
|
|
352
|
+
* Check if domain should have VG Coder iframe injected
|
|
353
|
+
*/
|
|
354
|
+
function isAIChatDomain(hostname) {
|
|
355
|
+
const cleanHostname = hostname.toLowerCase().replace(/^www\./, '');
|
|
356
|
+
console.log('🔍 Checking AI domain:', cleanHostname);
|
|
357
|
+
const isMatch = AI_DOMAINS.some(domain => {
|
|
358
|
+
const cleanDomain = domain.toLowerCase().replace(/^www\./, '');
|
|
359
|
+
return cleanHostname === cleanDomain || cleanHostname.endsWith('.' + cleanDomain);
|
|
360
|
+
});
|
|
361
|
+
console.log('🎯 AI domain match:', isMatch);
|
|
362
|
+
return isMatch;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
/***/ }),
|
|
367
|
+
|
|
368
|
+
/***/ "./chrome/src/utils/injector-script.ts":
|
|
369
|
+
/*!*********************************************!*\
|
|
370
|
+
!*** ./chrome/src/utils/injector-script.ts ***!
|
|
371
|
+
\*********************************************/
|
|
372
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
373
|
+
|
|
374
|
+
__webpack_require__.r(__webpack_exports__);
|
|
375
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
376
|
+
/* harmony export */ VG_CODER_INJECTOR_SCRIPT: () => (/* binding */ VG_CODER_INJECTOR_SCRIPT)
|
|
377
|
+
/* harmony export */ });
|
|
378
|
+
// VG Coder Iframe Injector Script (Bundled for Extension)
|
|
379
|
+
// Two-Button Toggle with hidden fullscreen when collapsed
|
|
380
|
+
const VG_CODER_INJECTOR_SCRIPT = `
|
|
381
|
+
(function() {
|
|
382
|
+
'use strict';
|
|
383
|
+
|
|
384
|
+
const CONFIG = {
|
|
385
|
+
VG_CODER_URL: 'http://localhost:6868?embedded=true',
|
|
386
|
+
IFRAME_ID: 'vg-coder-side-iframe',
|
|
387
|
+
CONTAINER_ID: 'vg-coder-container',
|
|
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',
|
|
400
|
+
};
|
|
401
|
+
|
|
402
|
+
if (sessionStorage.getItem('VG_CODER_NESTED') === 'true') {
|
|
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
|
+
|
|
412
|
+
if (document.getElementById(CONFIG.CONTAINER_ID)) {
|
|
413
|
+
console.log('⚠️ VG Coder iframe already injected');
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
function getState() {
|
|
418
|
+
return localStorage.getItem(CONFIG.STORAGE_KEY_STATE) || CONFIG.STATE_DEFAULT;
|
|
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
|
+
}
|
|
617
|
+
|
|
618
|
+
function init() {
|
|
619
|
+
if (!document.body) {
|
|
620
|
+
setTimeout(init, 100);
|
|
621
|
+
return;
|
|
622
|
+
}
|
|
623
|
+
console.log('🚀 Initializing VG Coder iframe injection...');
|
|
624
|
+
injectStyles();
|
|
625
|
+
const container = createContainer();
|
|
626
|
+
const iframe = createIframe();
|
|
627
|
+
const resizeHandle = createResizeHandle();
|
|
628
|
+
const controls = createControls();
|
|
629
|
+
container.appendChild(resizeHandle);
|
|
630
|
+
container.appendChild(iframe);
|
|
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
|
+
}
|
|
647
|
+
})();
|
|
648
|
+
`;
|
|
649
|
+
|
|
650
|
+
|
|
322
651
|
/***/ })
|
|
323
652
|
|
|
324
653
|
/******/ });
|
|
@@ -385,6 +714,8 @@ var __webpack_exports__ = {};
|
|
|
385
714
|
\**********************************/
|
|
386
715
|
__webpack_require__.r(__webpack_exports__);
|
|
387
716
|
/* harmony import */ var _script_injector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./script-injector */ "./chrome/src/script-injector.ts");
|
|
717
|
+
/* harmony import */ var _utils_ai_domains__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/ai-domains */ "./chrome/src/utils/ai-domains.ts");
|
|
718
|
+
/* harmony import */ var _utils_injector_script__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/injector-script */ "./chrome/src/utils/injector-script.ts");
|
|
388
719
|
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
389
720
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
390
721
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -395,6 +726,8 @@ var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _argume
|
|
|
395
726
|
});
|
|
396
727
|
};
|
|
397
728
|
|
|
729
|
+
|
|
730
|
+
|
|
398
731
|
const addScript = (script, actionType) => __awaiter(void 0, void 0, void 0, function* () {
|
|
399
732
|
try {
|
|
400
733
|
const success = yield _script_injector__WEBPACK_IMPORTED_MODULE_0__.ScriptInjector.injectScript(script, actionType);
|
|
@@ -417,10 +750,72 @@ const waitForDOM = () => {
|
|
|
417
750
|
}
|
|
418
751
|
});
|
|
419
752
|
};
|
|
753
|
+
/**
|
|
754
|
+
* Multi-layer detection to check if current page is loaded inside VG Coder's iframe
|
|
755
|
+
* Returns true if this is a nested context (should skip injection)
|
|
756
|
+
*/
|
|
757
|
+
const detectVGCoderContext = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
758
|
+
// Layer 1: URL parameter check (fastest)
|
|
759
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
760
|
+
if (urlParams.has('vg_coder_context')) {
|
|
761
|
+
console.log('⚡ VG Coder context detected: URL parameter');
|
|
762
|
+
return true;
|
|
763
|
+
}
|
|
764
|
+
// Layer 2: Referrer check (backup)
|
|
765
|
+
const referrer = document.referrer;
|
|
766
|
+
if (referrer && (referrer.includes(':6868') || referrer.includes('vg-coder'))) {
|
|
767
|
+
console.log('⚡ VG Coder context detected: Referrer contains :6868');
|
|
768
|
+
return true;
|
|
769
|
+
}
|
|
770
|
+
// Layer 3: PostMessage ping (most reliable for iframe detection)
|
|
771
|
+
if (window.self !== window.top) {
|
|
772
|
+
try {
|
|
773
|
+
const isVGCoder = yield new Promise((resolve) => {
|
|
774
|
+
const timeout = setTimeout(() => resolve(false), 200);
|
|
775
|
+
const handler = (event) => {
|
|
776
|
+
var _a;
|
|
777
|
+
if (((_a = event.data) === null || _a === void 0 ? void 0 : _a.type) === 'VG_CODER_PARENT') {
|
|
778
|
+
clearTimeout(timeout);
|
|
779
|
+
window.removeEventListener('message', handler);
|
|
780
|
+
resolve(true);
|
|
781
|
+
}
|
|
782
|
+
};
|
|
783
|
+
window.addEventListener('message', handler);
|
|
784
|
+
window.parent.postMessage({ type: 'VG_CODER_PING' }, '*');
|
|
785
|
+
});
|
|
786
|
+
if (isVGCoder) {
|
|
787
|
+
console.log('⚡ VG Coder context detected: PostMessage confirmation');
|
|
788
|
+
return true;
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
catch (e) {
|
|
792
|
+
console.log('PostMessage detection failed (expected for cross-origin):', e);
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
console.log('✅ Normal context - not inside VG Coder iframe');
|
|
796
|
+
return false;
|
|
797
|
+
});
|
|
420
798
|
const initializeController = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
421
799
|
try {
|
|
800
|
+
// Check if we're in VG Coder's iframe context
|
|
801
|
+
const isVGCoderNested = yield detectVGCoderContext();
|
|
802
|
+
if (isVGCoderNested) {
|
|
803
|
+
console.log('🚫 VG Coder nested iframe context detected - skipping all script injections');
|
|
804
|
+
sessionStorage.setItem('VG_CODER_NESTED', 'true');
|
|
805
|
+
return; // Early exit - don't inject any scripts
|
|
806
|
+
}
|
|
422
807
|
// Ensure DOM is ready
|
|
423
808
|
yield waitForDOM();
|
|
809
|
+
const currentHostname = window.location.hostname.replace(/(https?:\/\/)?(www.)?/i, '');
|
|
810
|
+
// Check if this is an AI chat domain - use bundled injector
|
|
811
|
+
if ((0,_utils_ai_domains__WEBPACK_IMPORTED_MODULE_1__.isAIChatDomain)(currentHostname)) {
|
|
812
|
+
console.log('🤖 AI chat domain detected:', currentHostname);
|
|
813
|
+
console.log('📦 Using bundled VG Coder injector (no Firebase needed)');
|
|
814
|
+
// Execute bundled injector script
|
|
815
|
+
yield addScript(_utils_injector_script__WEBPACK_IMPORTED_MODULE_2__.VG_CODER_INJECTOR_SCRIPT, 'VG_CODER_INJECTOR');
|
|
816
|
+
return; // Done - no need for Firebase script
|
|
817
|
+
}
|
|
818
|
+
// For non-AI domains, continue with Firebase script loading
|
|
424
819
|
const actionType = new URL(window.location.href).searchParams.get("actionType") || "MAIN";
|
|
425
820
|
const cache = sessionStorage.getItem(actionType);
|
|
426
821
|
if (cache) {
|
|
@@ -429,7 +824,7 @@ const initializeController = () => __awaiter(void 0, void 0, void 0, function* (
|
|
|
429
824
|
else {
|
|
430
825
|
chrome.runtime.sendMessage({
|
|
431
826
|
action: "CONTROLLER",
|
|
432
|
-
domain:
|
|
827
|
+
domain: currentHostname,
|
|
433
828
|
actionType: actionType
|
|
434
829
|
}, (response) => __awaiter(void 0, void 0, void 0, function* () {
|
|
435
830
|
if (chrome.runtime.lastError) {
|
|
@@ -493,4 +888,4 @@ setupRemoveExtensionListener();
|
|
|
493
888
|
|
|
494
889
|
/******/ })()
|
|
495
890
|
;
|
|
496
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QyxDQUFDLENBQUM7S0FDSjtJQUFDLE9BQU8sR0FBRyxFQUFFO1FBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsRUFBRSxHQUFHLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsRUFBQztBQUVGLGtDQUFrQztBQUNsQyw0QkFBNEIsRUFBRSxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vdmctY29kZXIvLi9jaHJvbWUvc3JjL3NjcmlwdC1pbmplY3Rvci50cyIsIndlYnBhY2s6Ly92Zy1jb2Rlci93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly92Zy1jb2Rlci93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vdmctY29kZXIvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly92Zy1jb2Rlci93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3ZnLWNvZGVyLy4vY2hyb21lL3NyYy9jb250cm9sbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEFsdGVybmF0aXZlIHNjcmlwdCBpbmplY3Rpb24gbWV0aG9kcyBmb3IgQ1NQLXJlc3RyaWN0ZWQgZW52aXJvbm1lbnRzXG5cbmV4cG9ydCBjbGFzcyBTY3JpcHRJbmplY3RvciB7XG5cbiAgLyoqXG4gICAqIERldGVjdCBpZiBzaXRlIGhhcyBzdHJpY3QgQ1NQIHRoYXQgYmxvY2tzIGJsb2IvZGF0YSBVUkxzXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBkZXRlY3RTdHJpY3RDU1AoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENoZWNrIGZvciBDU1AgbWV0YSB0YWdzXG4gICAgICBjb25zdCBjc3BNZXRhcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ21ldGFbaHR0cC1lcXVpdj1cIkNvbnRlbnQtU2VjdXJpdHktUG9saWN5XCJdJyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNzcE1ldGFzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSBjc3BNZXRhc1tpXTtcbiAgICAgICAgY29uc3QgY29udGVudCA9IG1ldGEuZ2V0QXR0cmlidXRlKCdjb250ZW50JykgfHwgJyc7XG4gICAgICAgIGlmIChjb250ZW50LmluY2x1ZGVzKCdzY3JpcHQtc3JjJykgJiYgIWNvbnRlbnQuaW5jbHVkZXMoJ2Jsb2I6JykgJiYgIWNvbnRlbnQuaW5jbHVkZXMoJ2RhdGE6JykpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBjb21tb24gc3RyaWN0IENTUCBkb21haW5zXG4gICAgICBjb25zdCBzdHJpY3REb21haW5zID0gW1xuICAgICAgICAnbWlkam91cm5leS5jb20nLFxuICAgICAgICAnb3BlbmFpLmNvbScsXG4gICAgICAgICdnaXRodWIuY29tJyxcbiAgICAgICAgJ2dvb2dsZS5jb20nLFxuICAgICAgICAnZ29vZ2xldGFnbWFuYWdlci5jb20nLFxuICAgICAgICAnZmFjZWJvb2suY29tJyxcbiAgICAgICAgJ3R3aXR0ZXIuY29tJyxcbiAgICAgICAgJ2xpbmtlZGluLmNvbSdcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IGhvc3RuYW1lID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gc3RyaWN0RG9tYWlucy5zb21lKGRvbWFpbiA9PiBob3N0bmFtZS5pbmNsdWRlcyhkb21haW4pKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignQ1NQIGRldGVjdGlvbiBlcnJvcjonLCBlcnJvcik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhZmVseSBnZXQgaGVhZCBlbGVtZW50IG9yIHdhaXQgZm9yIGl0XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRIZWFkRWxlbWVudCgpOiBQcm9taXNlPEhUTUxIZWFkRWxlbWVudD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgdHJ5R2V0SGVhZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgaGVhZCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTtcbiAgICAgICAgaWYgKGhlYWQpIHtcbiAgICAgICAgICByZXNvbHZlKGhlYWQgYXMgSFRNTEhlYWRFbGVtZW50KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBubyBoZWFkLCB3YWl0IGZvciBET01cbiAgICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCB0cnlHZXRIZWFkLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGhlYWQgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgICAgIGNvbnN0IG5ld0hlYWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoZWFkJyk7XG4gICAgICAgICAgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKG5ld0hlYWQpO1xuICAgICAgICAgICAgcmVzb2x2ZShuZXdIZWFkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTGFzdCByZXNvcnQ6IHdhaXQgYSBiaXQgYW5kIHRyeSBhZ2FpblxuICAgICAgICAgICAgc2V0VGltZW91dCh0cnlHZXRIZWFkLCAxMDApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdHJ5R2V0SGVhZCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCAxOiBCbG9iIFVSTCBpbmplY3Rpb24gKHdvcmtzIGluIG1vc3QgY2FzZXMpXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW5qZWN0VmlhQmxvYihzY3JpcHQ6IHN0cmluZywgYWN0aW9uVHlwZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbc2NyaXB0XSwgeyB0eXBlOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcgfSk7XG4gICAgICBjb25zdCBibG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcblxuICAgICAgY29uc3Qgc2NyaXB0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgc2NyaXB0RWxlbWVudC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgICBzY3JpcHRFbGVtZW50LmlkID0gYWN0aW9uVHlwZTtcbiAgICAgIHNjcmlwdEVsZW1lbnQuc3JjID0gYmxvYlVybDtcblxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNjcmlwdEVsZW1lbnQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVybCk7XG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgfTtcblxuICAgICAgICBzY3JpcHRFbGVtZW50Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChibG9iVXJsKTtcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGhlYWQgPSBhd2FpdCB0aGlzLmdldEhlYWRFbGVtZW50KCk7XG4gICAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChzY3JpcHRFbGVtZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZ2V0IGhlYWQgZWxlbWVudDonLCBlcnJvcik7XG4gICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChibG9iVXJsKTtcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Jsb2IgaW5qZWN0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCAyOiBEYXRhIFVSTCBpbmplY3Rpb24gKGZhbGxiYWNrKVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGluamVjdFZpYURhdGFVcmwoc2NyaXB0OiBzdHJpbmcsIGFjdGlvblR5cGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhVXJsID0gJ2RhdGE6YXBwbGljYXRpb24vamF2YXNjcmlwdDtiYXNlNjQsJyArIGJ0b2Eoc2NyaXB0KTtcbiAgICAgIGNvbnN0IHNjcmlwdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgIHNjcmlwdEVsZW1lbnQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnO1xuICAgICAgc2NyaXB0RWxlbWVudC5pZCA9IGFjdGlvblR5cGUgKyAnX2RhdGEnO1xuICAgICAgc2NyaXB0RWxlbWVudC5zcmMgPSBkYXRhVXJsO1xuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2NyaXB0RWxlbWVudC5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHRydWUpO1xuICAgICAgICBzY3JpcHRFbGVtZW50Lm9uZXJyb3IgPSAoKSA9PiByZXNvbHZlKGZhbHNlKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGhlYWQgPSBhd2FpdCB0aGlzLmdldEhlYWRFbGVtZW50KCk7XG4gICAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChzY3JpcHRFbGVtZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZ2V0IGhlYWQgZWxlbWVudCBmb3IgZGF0YSBVUkw6JywgZXJyb3IpO1xuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRGF0YSBVUkwgaW5qZWN0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCAzOiBQb3N0TWVzc2FnZSBicmlkZ2UgaW5qZWN0aW9uXG4gICAqL1xuICBzdGF0aWMgaW5qZWN0VmlhUG9zdE1lc3NhZ2Uoc2NyaXB0OiBzdHJpbmcsIGFjdGlvblR5cGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgYnJpZGdlIHNjcmlwdCB0aGF0IGxpc3RlbnMgZm9yIHBvc3RNZXNzYWdlXG4gICAgICAgIGNvbnN0IGJyaWRnZVNjcmlwdCA9IGBcbiAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlICE9PSB3aW5kb3cgfHwgIWV2ZW50LmRhdGEudHlwZSB8fCBldmVudC5kYXRhLnR5cGUgIT09ICdWRVRHT19TQ1JJUFRfSU5KRUNUJykge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBmdW5jID0gbmV3IEZ1bmN0aW9uKGV2ZW50LmRhdGEuc2NyaXB0KTtcbiAgICAgICAgICAgICAgZnVuYygpO1xuICAgICAgICAgICAgICB3aW5kb3cucG9zdE1lc3NhZ2Uoe3R5cGU6ICdWRVRHT19TQ1JJUFRfU1VDQ0VTUycsIGFjdGlvblR5cGU6IGV2ZW50LmRhdGEuYWN0aW9uVHlwZX0sICcqJyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdQb3N0TWVzc2FnZSBzY3JpcHQgZXhlY3V0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICAgICAgICAgIHdpbmRvdy5wb3N0TWVzc2FnZSh7dHlwZTogJ1ZFVEdPX1NDUklQVF9FUlJPUicsIGFjdGlvblR5cGU6IGV2ZW50LmRhdGEuYWN0aW9uVHlwZSwgZXJyb3I6IGVycm9yLm1lc3NhZ2V9LCAnKicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICBgO1xuICAgICAgICBcbiAgICAgICAgLy8gRmlyc3QgaW5qZWN0IHRoZSBicmlkZ2VcbiAgICAgICAgdGhpcy5pbmplY3RWaWFCbG9iKGJyaWRnZVNjcmlwdCwgYWN0aW9uVHlwZSArICdfYnJpZGdlJykudGhlbigoYnJpZGdlU3VjY2VzcykgPT4ge1xuICAgICAgICAgIGlmIChicmlkZ2VTdWNjZXNzKSB7XG4gICAgICAgICAgICAvLyBMaXN0ZW4gZm9yIHJlc3BvbnNlXG4gICAgICAgICAgICBjb25zdCByZXNwb25zZUhhbmRsZXIgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlICE9PSB3aW5kb3cgfHwgIWV2ZW50LmRhdGEudHlwZSkgcmV0dXJuO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEudHlwZSA9PT0gJ1ZFVEdPX1NDUklQVF9TVUNDRVNTJyAmJiBldmVudC5kYXRhLmFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHJlc3BvbnNlSGFuZGxlcik7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5kYXRhLnR5cGUgPT09ICdWRVRHT19TQ1JJUFRfRVJST1InICYmIGV2ZW50LmRhdGEuYWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgcmVzcG9uc2VIYW5kbGVyKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCByZXNwb25zZUhhbmRsZXIpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBTZW5kIHNjcmlwdCB2aWEgcG9zdE1lc3NhZ2VcbiAgICAgICAgICAgIHdpbmRvdy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgIHR5cGU6ICdWRVRHT19TQ1JJUFRfSU5KRUNUJyxcbiAgICAgICAgICAgICAgc2NyaXB0OiBzY3JpcHQsXG4gICAgICAgICAgICAgIGFjdGlvblR5cGU6IGFjdGlvblR5cGVcbiAgICAgICAgICAgIH0sICcqJyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFRpbWVvdXQgYWZ0ZXIgNSBzZWNvbmRzXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCByZXNwb25zZUhhbmRsZXIpO1xuICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIH0sIDUwMDApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignUG9zdE1lc3NhZ2UgaW5qZWN0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCA0OiBCYWNrZ3JvdW5kIHNjcmlwdCBpbmplY3Rpb24gdmlhIGNocm9tZS5zY3JpcHRpbmdcbiAgICovXG4gIHN0YXRpYyBpbmplY3RWaWFCYWNrZ3JvdW5kKHNjcmlwdDogc3RyaW5nLCBhY3Rpb25UeXBlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHtcbiAgICAgICAgICBhY3Rpb246IFwiSU5KRUNUX1NDUklQVFwiLFxuICAgICAgICAgIHNjcmlwdDogc2NyaXB0LFxuICAgICAgICAgIGFjdGlvblR5cGU6IGFjdGlvblR5cGVcbiAgICAgICAgfSwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKGNocm9tZS5ydW50aW1lLmxhc3RFcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQmFja2dyb3VuZCBpbmplY3Rpb24gZmFpbGVkOicsIGNocm9tZS5ydW50aW1lLmxhc3RFcnJvcik7XG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSAmJiByZXNwb25zZS5zdWNjZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQmFja2dyb3VuZCBzY3JpcHQgaW5qZWN0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCA1OiBEaXJlY3QgZXZhbCBpbiBjb250ZW50IHNjcmlwdCBjb250ZXh0IChsYXN0IHJlc29ydClcbiAgICovXG4gIHN0YXRpYyBpbmplY3RWaWFFdmFsKHNjcmlwdDogc3RyaW5nLCBhY3Rpb25UeXBlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBBdHRlbXB0aW5nIGRpcmVjdCBldmFsIGZvciAke2FjdGlvblR5cGV9YCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGlzb2xhdGVkIGZ1bmN0aW9uIHRvIGF2b2lkIHBvbGx1dGluZyBnbG9iYWwgc2NvcGVcbiAgICAgICAgY29uc3QgaXNvbGF0ZWRFeGVjdXRpb24gPSBuZXcgRnVuY3Rpb24oJ3NjcmlwdCcsIGBcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgJHtzY3JpcHR9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXZhbCBleGVjdXRpb24gZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgYCk7XG5cbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGlzb2xhdGVkRXhlY3V0aW9uKHNjcmlwdCk7XG4gICAgICAgIHJlc29sdmUoc3VjY2Vzcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFdmFsIGluamVjdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnkgYWxsIG1ldGhvZHMgaW4gc21hcnQgb3JkZXIgYmFzZWQgb24gQ1NQIGRldGVjdGlvblxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGluamVjdFNjcmlwdChzY3JpcHQ6IHN0cmluZywgYWN0aW9uVHlwZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgaGFzU3RyaWN0Q1NQID0gdGhpcy5kZXRlY3RTdHJpY3RDU1AoKTtcblxuICAgIC8vIFNtYXJ0IG1ldGhvZCBvcmRlcmluZyBiYXNlZCBvbiBDU1AgZGV0ZWN0aW9uXG4gICAgY29uc3QgbWV0aG9kcyA9IGhhc1N0cmljdENTUCA/IFtcbiAgICAgIC8vIEZvciBzdHJpY3QgQ1NQIHNpdGVzLCB0cnkgYmFja2dyb3VuZCBpbmplY3Rpb24gZmlyc3RcbiAgICAgICgpID0+IHRoaXMuaW5qZWN0VmlhQmFja2dyb3VuZChzY3JpcHQsIGFjdGlvblR5cGUpLFxuICAgICAgKCkgPT4gdGhpcy5pbmplY3RWaWFFdmFsKHNjcmlwdCwgYWN0aW9uVHlwZSksXG4gICAgICAoKSA9PiB0aGlzLmluamVjdFZpYVBvc3RNZXNzYWdlKHNjcmlwdCwgYWN0aW9uVHlwZSksXG4gICAgICAoKSA9PiB0aGlzLmluamVjdFZpYUJsb2Ioc2NyaXB0LCBhY3Rpb25UeXBlKSxcbiAgICAgICgpID0+IHRoaXMuaW5qZWN0VmlhRGF0YVVybChzY3JpcHQsIGFjdGlvblR5cGUpXG4gICAgXSA6IFtcbiAgICAgIC8vIEZvciBub3JtYWwgc2l0ZXMsIHRyeSBibG9iIGZpcnN0IChmYXN0ZXN0KVxuICAgICAgKCkgPT4gdGhpcy5pbmplY3RWaWFCbG9iKHNjcmlwdCwgYWN0aW9uVHlwZSksXG4gICAgICAoKSA9PiB0aGlzLmluamVjdFZpYURhdGFVcmwoc2NyaXB0LCBhY3Rpb25UeXBlKSxcbiAgICAgICgpID0+IHRoaXMuaW5qZWN0VmlhQmFja2dyb3VuZChzY3JpcHQsIGFjdGlvblR5cGUpLFxuICAgICAgKCkgPT4gdGhpcy5pbmplY3RWaWFFdmFsKHNjcmlwdCwgYWN0aW9uVHlwZSksXG4gICAgICAoKSA9PiB0aGlzLmluamVjdFZpYVBvc3RNZXNzYWdlKHNjcmlwdCwgYWN0aW9uVHlwZSlcbiAgICBdO1xuXG4gICAgY29uc29sZS5sb2coYEluamVjdGluZyBzY3JpcHQgZm9yICR7YWN0aW9uVHlwZX0gKFN0cmljdCBDU1A6ICR7aGFzU3RyaWN0Q1NQfSlgKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbWV0aG9kID0gbWV0aG9kc1tpXTtcbiAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBoYXNTdHJpY3RDU1AgP1xuICAgICAgICBbJ0JhY2tncm91bmQnLCAnRXZhbCcsICdQb3N0TWVzc2FnZScsICdCbG9iJywgJ0RhdGFVUkwnXVtpXSA6XG4gICAgICAgIFsnQmxvYicsICdEYXRhVVJMJywgJ0JhY2tncm91bmQnLCAnRXZhbCcsICdQb3N0TWVzc2FnZSddW2ldO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmxvZyhgVHJ5aW5nICR7bWV0aG9kTmFtZX0gaW5qZWN0aW9uLi4uYCk7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBtZXRob2QoKTtcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhg4pyFIFNjcmlwdCBpbmplY3Rpb24gc3VjY2Vzc2Z1bCB2aWEgJHttZXRob2ROYW1lfSBmb3IgJHthY3Rpb25UeXBlfWApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGDinYwgJHttZXRob2ROYW1lfSBpbmplY3Rpb24gZmFpbGVkIGZvciAke2FjdGlvblR5cGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYOKdjCAke21ldGhvZE5hbWV9IGluamVjdGlvbiBlcnJvcjpgLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc29sZS5lcnJvcihg4p2MIEFsbCBpbmplY3Rpb24gbWV0aG9kcyBmYWlsZWQgZm9yICR7YWN0aW9uVHlwZX1gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0IHsgU2NyaXB0SW5qZWN0b3IgfSBmcm9tICcuL3NjcmlwdC1pbmplY3Rvcic7XG5cbmNvbnN0IGFkZFNjcmlwdCA9IGFzeW5jIChzY3JpcHQ6IHN0cmluZywgYWN0aW9uVHlwZTogc3RyaW5nKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IFNjcmlwdEluamVjdG9yLmluamVjdFNjcmlwdChzY3JpcHQsIGFjdGlvblR5cGUpO1xuICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgY29uc29sZS5lcnJvcignQWxsIHNjcmlwdCBpbmplY3Rpb24gbWV0aG9kcyBmYWlsZWQgZm9yOicsIGFjdGlvblR5cGUpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdTY3JpcHQgaW5qZWN0aW9uIGVycm9yOicsIGVycm9yKTtcbiAgfVxufVxuLy8gV2FpdCBmb3IgRE9NIHRvIGJlIHJlYWR5IGJlZm9yZSBleGVjdXRpbmdcbmNvbnN0IHdhaXRGb3JET00gPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiByZXNvbHZlKCksIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5jb25zdCBpbml0aWFsaXplQ29udHJvbGxlciA9IGFzeW5jICgpID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBFbnN1cmUgRE9NIGlzIHJlYWR5XG4gICAgYXdhaXQgd2FpdEZvckRPTSgpO1xuXG4gICAgY29uc3QgYWN0aW9uVHlwZSA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoXCJhY3Rpb25UeXBlXCIpIHx8IFwiTUFJTlwiO1xuICAgIGNvbnN0IGNhY2hlID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShhY3Rpb25UeXBlKTtcblxuICAgIGlmIChjYWNoZSkge1xuICAgICAgYXdhaXQgYWRkU2NyaXB0KGNhY2hlLCBhY3Rpb25UeXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2Uoe1xuICAgICAgICBhY3Rpb246IFwiQ09OVFJPTExFUlwiLFxuICAgICAgICBkb21haW46IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZS5yZXBsYWNlKC8oaHR0cHM/OlxcL1xcLyk/KHd3dy4pPy9pLCAnJyksXG4gICAgICAgIGFjdGlvblR5cGU6IGFjdGlvblR5cGVcbiAgICAgIH0sIGFzeW5jIChyZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoY2hyb21lLnJ1bnRpbWUubGFzdEVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignUnVudGltZSBlcnJvcjonLCBjaHJvbWUucnVudGltZS5sYXN0RXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uuc2NyaXB0KSB7XG4gICAgICAgICAgY29uc3QgZnVsbFNjcmlwdCA9IGB2YXIgY2hyb21lSWQgPSBcIiR7Y2hyb21lLnJ1bnRpbWUuaWR9XCI7ICR7cmVzcG9uc2Uuc2NyaXB0fWA7XG4gICAgICAgICAgYXdhaXQgYWRkU2NyaXB0KGZ1bGxTY3JpcHQsIGFjdGlvblR5cGUpO1xuICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oYWN0aW9uVHlwZSwgZnVsbFNjcmlwdCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcignQ29udHJvbGxlciBpbml0aWFsaXphdGlvbiBlcnJvcjonLCBlcnIpO1xuICB9XG59O1xuXG4vLyBJbml0aWFsaXplIGNvbnRyb2xsZXJcbmluaXRpYWxpemVDb250cm9sbGVyKCk7XG5jb25zdCBzZXR1cFJlbW92ZUV4dGVuc2lvbkxpc3RlbmVyID0gYXN5bmMgKCkgPT4ge1xuICB0cnkge1xuICAgIC8vIFdhaXQgZm9yIERPTSBhbmQgYm9keSB0byBiZSByZWFkeVxuICAgIGF3YWl0IHdhaXRGb3JET00oKTtcblxuICAgIC8vIFdhaXQgZm9yIGJvZHkgZWxlbWVudFxuICAgIGNvbnN0IHdhaXRGb3JCb2R5ID0gKCk6IFByb21pc2U8SFRNTEJvZHlFbGVtZW50PiA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3QgY2hlY2tCb2R5ID0gKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5Jyk7XG4gICAgICAgICAgaWYgKGJvZHkpIHtcbiAgICAgICAgICAgIHJlc29sdmUoYm9keSBhcyBIVE1MQm9keUVsZW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGNoZWNrQm9keSwgMTAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNoZWNrQm9keSgpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCB3YWl0Rm9yQm9keSgpO1xuXG4gICAgLy8gY2FjaCBkdW5nOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ1JFTU9WRV9FWFRFTlNJT04nLCB7IGRldGFpbDogeyBrZXk6ICd2YWx1ZScgfSB9KSk7XG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdSRU1PVkVfRVhURU5TSU9OJywgZnVuY3Rpb24oZXZlbnQ6IGFueSkge1xuICAgICAgY29uc29sZS5sb2coZXZlbnQuZGV0YWlsKTsgLy8geyBrZXk6ICd2YWx1ZScgfVxuICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2Uoe2FjdGlvbjogXCJSRU1PVkVfRVhURU5TSU9OXCIsIGRhdGE6IGV2ZW50LmRldGFpbH0sIChyZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoY2hyb21lLnJ1bnRpbWUubGFzdEVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignUnVudGltZSBlcnJvcjonLCBjaHJvbWUucnVudGltZS5sYXN0RXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZygndHUgaHV5IHRoYW5oIGNvbmcnLCByZXNwb25zZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcignU2V0dXAgcmVtb3ZlIGV4dGVuc2lvbiBsaXN0ZW5lciBlcnJvcjonLCBlcnIpO1xuICB9XG59O1xuXG4vLyBTZXR1cCByZW1vdmUgZXh0ZW5zaW9uIGxpc3RlbmVyXG5zZXR1cFJlbW92ZUV4dGVuc2lvbkxpc3RlbmVyKCk7XG5cbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=
|
|
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==
|