vg-coder-cli 2.0.24 → 2.0.26
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 +241 -29
- package/src/server/project-manager.js +353 -0
- package/src/server/terminal-manager.js +130 -3
- package/src/server/views/css/iframe.css +1 -0
- package/src/server/views/css/terminal.css +88 -0
- package/src/server/views/dashboard.css +391 -16
- package/src/server/views/dashboard.html +150 -19
- package/src/server/views/js/features/commands.js +230 -0
- 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 +280 -8
- package/src/server/views/js/main.js +65 -0
- package/src/server/views/js/utils/log-utils.js +164 -0
- package/src/server/views/js/utils/smart-copy-engine.js +283 -0
- package/src/server/views/vg-coder/controller.js +376 -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 +251 -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.23.tgz +0 -0
- package/vg-coder-cli-2.0.24.tgz +0 -0
|
@@ -319,6 +319,314 @@ 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 injectStyles() {
|
|
434
|
+
const style = document.createElement('style');
|
|
435
|
+
style.textContent = '#' + CONFIG.CONTAINER_ID + ' {' +
|
|
436
|
+
'position: fixed; top: 0; left: 0; bottom: 0;' +
|
|
437
|
+
'width: ' + getWidth() + ';' +
|
|
438
|
+
'background: #1a1a1a; z-index: ' + CONFIG.Z_INDEX + ';' +
|
|
439
|
+
'display: flex; flex-direction: column;' +
|
|
440
|
+
'box-shadow: 4px 0 12px rgba(0, 0, 0, 0.3);' +
|
|
441
|
+
'transition: width 0.3s ease, transform 0.3s ease;' +
|
|
442
|
+
'}' +
|
|
443
|
+
'#' + CONFIG.CONTAINER_ID + '.collapsed { transform: translateX(-100%); }' +
|
|
444
|
+
'#' + CONFIG.IFRAME_ID + ' {' +
|
|
445
|
+
'flex: 1; border: none; width: 100%; height: 100%; background: white;' +
|
|
446
|
+
'}' +
|
|
447
|
+
'#' + CONFIG.CONTROLS_ID + ' {' +
|
|
448
|
+
'position: absolute; top: 50%; right: -36px; transform: translateY(-50%);' +
|
|
449
|
+
'z-index: ' + (CONFIG.Z_INDEX + 1) + '; display: flex; flex-direction: column; gap: 4px;' +
|
|
450
|
+
'transition: right 0.3s ease;' +
|
|
451
|
+
'}' +
|
|
452
|
+
'#' + CONFIG.CONTROLS_ID + '.fullscreen {' +
|
|
453
|
+
'right: 12px;' +
|
|
454
|
+
'}' +
|
|
455
|
+
'#' + CONFIG.CONTROLS_ID + ' button {' +
|
|
456
|
+
'background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);' +
|
|
457
|
+
'color: white; border: none; border-radius: 0 6px 6px 0;' +
|
|
458
|
+
'padding: 8px 6px; cursor: pointer; font-size: 18px;' +
|
|
459
|
+
'box-shadow: -2px 2px 6px rgba(0, 0, 0, 0.2);' +
|
|
460
|
+
'transition: all 0.2s ease; width: 32px; height: 32px;' +
|
|
461
|
+
'display: flex; align-items: center; justify-content: center;' +
|
|
462
|
+
'}' +
|
|
463
|
+
'#' + CONFIG.CONTROLS_ID + ' button.hidden {' +
|
|
464
|
+
'display: none;' +
|
|
465
|
+
'}' +
|
|
466
|
+
'#' + CONFIG.CONTROLS_ID + ' button:hover {' +
|
|
467
|
+
'background: linear-gradient(135deg, #764ba2 0%, #667eea 100%);' +
|
|
468
|
+
'box-shadow: -3px 3px 8px rgba(0, 0, 0, 0.3);' +
|
|
469
|
+
'}' +
|
|
470
|
+
'#' + CONFIG.RESIZE_HANDLE_ID + ' {' +
|
|
471
|
+
'position: absolute; right: 0; top: 0; bottom: 0; width: 6px;' +
|
|
472
|
+
'cursor: ew-resize; background: transparent; transition: background 0.2s ease;' +
|
|
473
|
+
'}' +
|
|
474
|
+
'#' + CONFIG.RESIZE_HANDLE_ID + ':hover { background: rgba(102, 126, 234, 0.5); }' +
|
|
475
|
+
'#' + CONFIG.RESIZE_HANDLE_ID + '.resizing { background: rgba(102, 126, 234, 0.8); }';
|
|
476
|
+
document.head.appendChild(style);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
function createContainer() {
|
|
480
|
+
const container = document.createElement('div');
|
|
481
|
+
container.id = CONFIG.CONTAINER_ID;
|
|
482
|
+
const currentState = getState();
|
|
483
|
+
if (currentState === CONFIG.STATE_COLLAPSED) {
|
|
484
|
+
container.classList.add('collapsed');
|
|
485
|
+
} else if (currentState === CONFIG.STATE_FULLSCREEN) {
|
|
486
|
+
container.style.width = CONFIG.FULLSCREEN_WIDTH;
|
|
487
|
+
}
|
|
488
|
+
return container;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
function createIframe() {
|
|
492
|
+
const iframe = document.createElement('iframe');
|
|
493
|
+
iframe.id = CONFIG.IFRAME_ID;
|
|
494
|
+
iframe.src = CONFIG.VG_CODER_URL;
|
|
495
|
+
iframe.title = 'VG Coder Dashboard';
|
|
496
|
+
iframe.allow = 'clipboard-read; clipboard-write';
|
|
497
|
+
return iframe;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
function createResizeHandle() {
|
|
501
|
+
const handle = document.createElement('div');
|
|
502
|
+
handle.id = CONFIG.RESIZE_HANDLE_ID;
|
|
503
|
+
return handle;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
function createControls() {
|
|
507
|
+
const controls = document.createElement('div');
|
|
508
|
+
controls.id = CONFIG.CONTROLS_ID;
|
|
509
|
+
const currentState = getState();
|
|
510
|
+
if (currentState === CONFIG.STATE_FULLSCREEN) {
|
|
511
|
+
controls.classList.add('fullscreen');
|
|
512
|
+
}
|
|
513
|
+
const btnFullscreen = document.createElement('button');
|
|
514
|
+
btnFullscreen.innerHTML = currentState === CONFIG.STATE_FULLSCREEN ? '◧' : '▣';
|
|
515
|
+
btnFullscreen.title = currentState === CONFIG.STATE_FULLSCREEN ? 'Default (45%)' : 'Fullscreen (100%)';
|
|
516
|
+
if (currentState === CONFIG.STATE_COLLAPSED) {
|
|
517
|
+
btnFullscreen.classList.add('hidden');
|
|
518
|
+
}
|
|
519
|
+
const btnCollapse = document.createElement('button');
|
|
520
|
+
btnCollapse.innerHTML = currentState === CONFIG.STATE_COLLAPSED ? '▶' : '◄';
|
|
521
|
+
btnCollapse.title = currentState === CONFIG.STATE_COLLAPSED ? 'Expand' : 'Collapse';
|
|
522
|
+
controls.appendChild(btnFullscreen);
|
|
523
|
+
controls.appendChild(btnCollapse);
|
|
524
|
+
return controls;
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
function initResize(container, handle, controls) {
|
|
528
|
+
let isResizing = false, startX = 0, startWidth = 0;
|
|
529
|
+
handle.addEventListener('mousedown', (e) => {
|
|
530
|
+
isResizing = true; startX = e.clientX; startWidth = container.offsetWidth;
|
|
531
|
+
handle.classList.add('resizing');
|
|
532
|
+
document.body.style.cursor = 'ew-resize';
|
|
533
|
+
document.body.style.userSelect = 'none';
|
|
534
|
+
e.preventDefault();
|
|
535
|
+
});
|
|
536
|
+
document.addEventListener('mousemove', (e) => {
|
|
537
|
+
if (!isResizing) return;
|
|
538
|
+
const deltaX = e.clientX - startX;
|
|
539
|
+
const newWidth = startWidth + deltaX;
|
|
540
|
+
const maxWidth = window.innerWidth * (CONFIG.MAX_WIDTH_PERCENT / 100);
|
|
541
|
+
if (newWidth >= CONFIG.MIN_WIDTH && newWidth <= maxWidth) {
|
|
542
|
+
const widthPercent = (newWidth / window.innerWidth) * 100;
|
|
543
|
+
container.style.width = widthPercent + '%';
|
|
544
|
+
setWidth(widthPercent + '%');
|
|
545
|
+
}
|
|
546
|
+
});
|
|
547
|
+
document.addEventListener('mouseup', () => {
|
|
548
|
+
if (isResizing) {
|
|
549
|
+
isResizing = false; handle.classList.remove('resizing');
|
|
550
|
+
document.body.style.cursor = '';
|
|
551
|
+
document.body.style.userSelect = '';
|
|
552
|
+
}
|
|
553
|
+
});
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
function initControls(container, controls) {
|
|
557
|
+
const buttons = controls.querySelectorAll('button');
|
|
558
|
+
const btnFullscreen = buttons[0];
|
|
559
|
+
const btnCollapse = buttons[1];
|
|
560
|
+
btnFullscreen.addEventListener('click', () => {
|
|
561
|
+
const currentState = getState();
|
|
562
|
+
if (currentState === CONFIG.STATE_FULLSCREEN) {
|
|
563
|
+
setState(CONFIG.STATE_DEFAULT);
|
|
564
|
+
container.style.width = CONFIG.DEFAULT_WIDTH;
|
|
565
|
+
controls.classList.remove('fullscreen');
|
|
566
|
+
btnFullscreen.innerHTML = '▣';
|
|
567
|
+
btnFullscreen.title = 'Fullscreen (100%)';
|
|
568
|
+
} else {
|
|
569
|
+
setState(CONFIG.STATE_FULLSCREEN);
|
|
570
|
+
container.style.width = CONFIG.FULLSCREEN_WIDTH;
|
|
571
|
+
controls.classList.add('fullscreen');
|
|
572
|
+
btnFullscreen.innerHTML = '◧';
|
|
573
|
+
btnFullscreen.title = 'Default (45%)';
|
|
574
|
+
}
|
|
575
|
+
});
|
|
576
|
+
btnCollapse.addEventListener('click', () => {
|
|
577
|
+
const currentState = getState();
|
|
578
|
+
if (currentState === CONFIG.STATE_COLLAPSED) {
|
|
579
|
+
setState(CONFIG.STATE_DEFAULT);
|
|
580
|
+
container.classList.remove('collapsed');
|
|
581
|
+
container.style.width = CONFIG.DEFAULT_WIDTH;
|
|
582
|
+
controls.classList.remove('fullscreen');
|
|
583
|
+
btnCollapse.innerHTML = '◄';
|
|
584
|
+
btnCollapse.title = 'Collapse';
|
|
585
|
+
btnFullscreen.classList.remove('hidden');
|
|
586
|
+
btnFullscreen.innerHTML = '▣';
|
|
587
|
+
btnFullscreen.title = 'Fullscreen (100%)';
|
|
588
|
+
} else {
|
|
589
|
+
const wasFullscreen = currentState === CONFIG.STATE_FULLSCREEN;
|
|
590
|
+
setState(CONFIG.STATE_COLLAPSED);
|
|
591
|
+
container.classList.add('collapsed');
|
|
592
|
+
if (wasFullscreen) {
|
|
593
|
+
controls.classList.remove('fullscreen');
|
|
594
|
+
}
|
|
595
|
+
btnFullscreen.classList.add('hidden');
|
|
596
|
+
btnCollapse.innerHTML = '▶';
|
|
597
|
+
btnCollapse.title = 'Expand';
|
|
598
|
+
}
|
|
599
|
+
});
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
function init() {
|
|
603
|
+
if (!document.body) {
|
|
604
|
+
setTimeout(init, 100);
|
|
605
|
+
return;
|
|
606
|
+
}
|
|
607
|
+
console.log('🚀 Initializing VG Coder iframe injection...');
|
|
608
|
+
injectStyles();
|
|
609
|
+
const container = createContainer();
|
|
610
|
+
const iframe = createIframe();
|
|
611
|
+
const resizeHandle = createResizeHandle();
|
|
612
|
+
const controls = createControls();
|
|
613
|
+
container.appendChild(resizeHandle);
|
|
614
|
+
container.appendChild(iframe);
|
|
615
|
+
container.appendChild(controls);
|
|
616
|
+
document.body.appendChild(container);
|
|
617
|
+
initResize(container, resizeHandle, controls);
|
|
618
|
+
initControls(container, controls);
|
|
619
|
+
console.log('✅ VG Coder iframe injected successfully');
|
|
620
|
+
}
|
|
621
|
+
if (document.readyState === 'loading') {
|
|
622
|
+
document.addEventListener('DOMContentLoaded', init);
|
|
623
|
+
} else {
|
|
624
|
+
init();
|
|
625
|
+
}
|
|
626
|
+
})();
|
|
627
|
+
`;
|
|
628
|
+
|
|
629
|
+
|
|
322
630
|
/***/ })
|
|
323
631
|
|
|
324
632
|
/******/ });
|
|
@@ -385,6 +693,8 @@ var __webpack_exports__ = {};
|
|
|
385
693
|
\**********************************/
|
|
386
694
|
__webpack_require__.r(__webpack_exports__);
|
|
387
695
|
/* harmony import */ var _script_injector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./script-injector */ "./chrome/src/script-injector.ts");
|
|
696
|
+
/* harmony import */ var _utils_ai_domains__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/ai-domains */ "./chrome/src/utils/ai-domains.ts");
|
|
697
|
+
/* harmony import */ var _utils_injector_script__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/injector-script */ "./chrome/src/utils/injector-script.ts");
|
|
388
698
|
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
389
699
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
390
700
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -395,6 +705,8 @@ var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _argume
|
|
|
395
705
|
});
|
|
396
706
|
};
|
|
397
707
|
|
|
708
|
+
|
|
709
|
+
|
|
398
710
|
const addScript = (script, actionType) => __awaiter(void 0, void 0, void 0, function* () {
|
|
399
711
|
try {
|
|
400
712
|
const success = yield _script_injector__WEBPACK_IMPORTED_MODULE_0__.ScriptInjector.injectScript(script, actionType);
|
|
@@ -417,10 +729,72 @@ const waitForDOM = () => {
|
|
|
417
729
|
}
|
|
418
730
|
});
|
|
419
731
|
};
|
|
732
|
+
/**
|
|
733
|
+
* Multi-layer detection to check if current page is loaded inside VG Coder's iframe
|
|
734
|
+
* Returns true if this is a nested context (should skip injection)
|
|
735
|
+
*/
|
|
736
|
+
const detectVGCoderContext = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
737
|
+
// Layer 1: URL parameter check (fastest)
|
|
738
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
739
|
+
if (urlParams.has('vg_coder_context')) {
|
|
740
|
+
console.log('⚡ VG Coder context detected: URL parameter');
|
|
741
|
+
return true;
|
|
742
|
+
}
|
|
743
|
+
// Layer 2: Referrer check (backup)
|
|
744
|
+
const referrer = document.referrer;
|
|
745
|
+
if (referrer && (referrer.includes(':6868') || referrer.includes('vg-coder'))) {
|
|
746
|
+
console.log('⚡ VG Coder context detected: Referrer contains :6868');
|
|
747
|
+
return true;
|
|
748
|
+
}
|
|
749
|
+
// Layer 3: PostMessage ping (most reliable for iframe detection)
|
|
750
|
+
if (window.self !== window.top) {
|
|
751
|
+
try {
|
|
752
|
+
const isVGCoder = yield new Promise((resolve) => {
|
|
753
|
+
const timeout = setTimeout(() => resolve(false), 200);
|
|
754
|
+
const handler = (event) => {
|
|
755
|
+
var _a;
|
|
756
|
+
if (((_a = event.data) === null || _a === void 0 ? void 0 : _a.type) === 'VG_CODER_PARENT') {
|
|
757
|
+
clearTimeout(timeout);
|
|
758
|
+
window.removeEventListener('message', handler);
|
|
759
|
+
resolve(true);
|
|
760
|
+
}
|
|
761
|
+
};
|
|
762
|
+
window.addEventListener('message', handler);
|
|
763
|
+
window.parent.postMessage({ type: 'VG_CODER_PING' }, '*');
|
|
764
|
+
});
|
|
765
|
+
if (isVGCoder) {
|
|
766
|
+
console.log('⚡ VG Coder context detected: PostMessage confirmation');
|
|
767
|
+
return true;
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
catch (e) {
|
|
771
|
+
console.log('PostMessage detection failed (expected for cross-origin):', e);
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
console.log('✅ Normal context - not inside VG Coder iframe');
|
|
775
|
+
return false;
|
|
776
|
+
});
|
|
420
777
|
const initializeController = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
421
778
|
try {
|
|
779
|
+
// Check if we're in VG Coder's iframe context
|
|
780
|
+
const isVGCoderNested = yield detectVGCoderContext();
|
|
781
|
+
if (isVGCoderNested) {
|
|
782
|
+
console.log('🚫 VG Coder nested iframe context detected - skipping all script injections');
|
|
783
|
+
sessionStorage.setItem('VG_CODER_NESTED', 'true');
|
|
784
|
+
return; // Early exit - don't inject any scripts
|
|
785
|
+
}
|
|
422
786
|
// Ensure DOM is ready
|
|
423
787
|
yield waitForDOM();
|
|
788
|
+
const currentHostname = window.location.hostname.replace(/(https?:\/\/)?(www.)?/i, '');
|
|
789
|
+
// Check if this is an AI chat domain - use bundled injector
|
|
790
|
+
if ((0,_utils_ai_domains__WEBPACK_IMPORTED_MODULE_1__.isAIChatDomain)(currentHostname)) {
|
|
791
|
+
console.log('🤖 AI chat domain detected:', currentHostname);
|
|
792
|
+
console.log('📦 Using bundled VG Coder injector (no Firebase needed)');
|
|
793
|
+
// Execute bundled injector script
|
|
794
|
+
yield addScript(_utils_injector_script__WEBPACK_IMPORTED_MODULE_2__.VG_CODER_INJECTOR_SCRIPT, 'VG_CODER_INJECTOR');
|
|
795
|
+
return; // Done - no need for Firebase script
|
|
796
|
+
}
|
|
797
|
+
// For non-AI domains, continue with Firebase script loading
|
|
424
798
|
const actionType = new URL(window.location.href).searchParams.get("actionType") || "MAIN";
|
|
425
799
|
const cache = sessionStorage.getItem(actionType);
|
|
426
800
|
if (cache) {
|
|
@@ -429,7 +803,7 @@ const initializeController = () => __awaiter(void 0, void 0, void 0, function* (
|
|
|
429
803
|
else {
|
|
430
804
|
chrome.runtime.sendMessage({
|
|
431
805
|
action: "CONTROLLER",
|
|
432
|
-
domain:
|
|
806
|
+
domain: currentHostname,
|
|
433
807
|
actionType: actionType
|
|
434
808
|
}, (response) => __awaiter(void 0, void 0, void 0, function* () {
|
|
435
809
|
if (chrome.runtime.lastError) {
|
|
@@ -493,4 +867,4 @@ setupRemoveExtensionListener();
|
|
|
493
867
|
|
|
494
868
|
/******/ })()
|
|
495
869
|
;
|
|
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=
|
|
870
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDMUQsT0FBTztpQkFDUjtnQkFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzdDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7S0FDSjtJQUFDLE9BQU8sR0FBRyxFQUFFO1FBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsRUFBRSxHQUFHLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsRUFBQztBQUVGLGtDQUFrQztBQUNsQyw0QkFBNEIsRUFBRSxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vdmctY29kZXIvLi9jaHJvbWUvc3JjL3NjcmlwdC1pbmplY3Rvci50cyIsIndlYnBhY2s6Ly92Zy1jb2Rlci8uL2Nocm9tZS9zcmMvdXRpbHMvYWktZG9tYWlucy50cyIsIndlYnBhY2s6Ly92Zy1jb2Rlci8uL2Nocm9tZS9zcmMvdXRpbHMvaW5qZWN0b3Itc2NyaXB0LnRzIiwid2VicGFjazovL3ZnLWNvZGVyL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3ZnLWNvZGVyL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly92Zy1jb2Rlci93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3ZnLWNvZGVyL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vdmctY29kZXIvLi9jaHJvbWUvc3JjL2NvbnRyb2xsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQWx0ZXJuYXRpdmUgc2NyaXB0IGluamVjdGlvbiBtZXRob2RzIGZvciBDU1AtcmVzdHJpY3RlZCBlbnZpcm9ubWVudHNcblxuZXhwb3J0IGNsYXNzIFNjcmlwdEluamVjdG9yIHtcblxuICAvKipcbiAgICogRGV0ZWN0IGlmIHNpdGUgaGFzIHN0cmljdCBDU1AgdGhhdCBibG9ja3MgYmxvYi9kYXRhIFVSTHNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRldGVjdFN0cmljdENTUCgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgZm9yIENTUCBtZXRhIHRhZ3NcbiAgICAgIGNvbnN0IGNzcE1ldGFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbWV0YVtodHRwLWVxdWl2PVwiQ29udGVudC1TZWN1cml0eS1Qb2xpY3lcIl0nKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3NwTWV0YXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbWV0YSA9IGNzcE1ldGFzW2ldO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gbWV0YS5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKSB8fCAnJztcbiAgICAgICAgaWYgKGNvbnRlbnQuaW5jbHVkZXMoJ3NjcmlwdC1zcmMnKSAmJiAhY29udGVudC5pbmNsdWRlcygnYmxvYjonKSAmJiAhY29udGVudC5pbmNsdWRlcygnZGF0YTonKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGNvbW1vbiBzdHJpY3QgQ1NQIGRvbWFpbnNcbiAgICAgIGNvbnN0IHN0cmljdERvbWFpbnMgPSBbXG4gICAgICAgICdtaWRqb3VybmV5LmNvbScsXG4gICAgICAgICdvcGVuYWkuY29tJyxcbiAgICAgICAgJ2dpdGh1Yi5jb20nLFxuICAgICAgICAnZ29vZ2xlLmNvbScsXG4gICAgICAgICdnb29nbGV0YWdtYW5hZ2VyLmNvbScsXG4gICAgICAgICdmYWNlYm9vay5jb20nLFxuICAgICAgICAndHdpdHRlci5jb20nLFxuICAgICAgICAnbGlua2VkaW4uY29tJ1xuICAgICAgXTtcblxuICAgICAgY29uc3QgaG9zdG5hbWUgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBzdHJpY3REb21haW5zLnNvbWUoZG9tYWluID0+IGhvc3RuYW1lLmluY2x1ZGVzKGRvbWFpbikpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDU1AgZGV0ZWN0aW9uIGVycm9yOicsIGVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2FmZWx5IGdldCBoZWFkIGVsZW1lbnQgb3Igd2FpdCBmb3IgaXRcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldEhlYWRFbGVtZW50KCk6IFByb21pc2U8SFRNTEhlYWRFbGVtZW50PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCB0cnlHZXRIZWFkID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBoZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdO1xuICAgICAgICBpZiAoaGVhZCkge1xuICAgICAgICAgIHJlc29sdmUoaGVhZCBhcyBIVE1MSGVhZEVsZW1lbnQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG5vIGhlYWQsIHdhaXQgZm9yIERPTVxuICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHRyeUdldEhlYWQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBDcmVhdGUgaGVhZCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgY29uc3QgbmV3SGVhZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2hlYWQnKTtcbiAgICAgICAgICBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3SGVhZCk7XG4gICAgICAgICAgICByZXNvbHZlKG5ld0hlYWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBMYXN0IHJlc29ydDogd2FpdCBhIGJpdCBhbmQgdHJ5IGFnYWluXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHRyeUdldEhlYWQsIDEwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0cnlHZXRIZWFkKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIDE6IEJsb2IgVVJMIGluamVjdGlvbiAod29ya3MgaW4gbW9zdCBjYXNlcylcbiAgICovXG4gIHN0YXRpYyBhc3luYyBpbmplY3RWaWFCbG9iKHNjcmlwdDogc3RyaW5nLCBhY3Rpb25UeXBlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtzY3JpcHRdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JyB9KTtcbiAgICAgIGNvbnN0IGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXG4gICAgICBjb25zdCBzY3JpcHRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICBzY3JpcHRFbGVtZW50LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JztcbiAgICAgIHNjcmlwdEVsZW1lbnQuaWQgPSBhY3Rpb25UeXBlO1xuICAgICAgc2NyaXB0RWxlbWVudC5zcmMgPSBibG9iVXJsO1xuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2NyaXB0RWxlbWVudC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChibG9iVXJsKTtcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNjcmlwdEVsZW1lbnQub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGJsb2JVcmwpO1xuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaGVhZCA9IGF3YWl0IHRoaXMuZ2V0SGVhZEVsZW1lbnQoKTtcbiAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKHNjcmlwdEVsZW1lbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBnZXQgaGVhZCBlbGVtZW50OicsIGVycm9yKTtcbiAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGJsb2JVcmwpO1xuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignQmxvYiBpbmplY3Rpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIDI6IERhdGEgVVJMIGluamVjdGlvbiAoZmFsbGJhY2spXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW5qZWN0VmlhRGF0YVVybChzY3JpcHQ6IHN0cmluZywgYWN0aW9uVHlwZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGFVcmwgPSAnZGF0YTphcHBsaWNhdGlvbi9qYXZhc2NyaXB0O2Jhc2U2NCwnICsgYnRvYShzY3JpcHQpO1xuICAgICAgY29uc3Qgc2NyaXB0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgc2NyaXB0RWxlbWVudC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgICBzY3JpcHRFbGVtZW50LmlkID0gYWN0aW9uVHlwZSArICdfZGF0YSc7XG4gICAgICBzY3JpcHRFbGVtZW50LnNyYyA9IGRhdGFVcmw7XG5cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzY3JpcHRFbGVtZW50Lm9ubG9hZCA9ICgpID0+IHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIHNjcmlwdEVsZW1lbnQub25lcnJvciA9ICgpID0+IHJlc29sdmUoZmFsc2UpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaGVhZCA9IGF3YWl0IHRoaXMuZ2V0SGVhZEVsZW1lbnQoKTtcbiAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKHNjcmlwdEVsZW1lbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBnZXQgaGVhZCBlbGVtZW50IGZvciBkYXRhIFVSTDonLCBlcnJvcik7XG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdEYXRhIFVSTCBpbmplY3Rpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIDM6IFBvc3RNZXNzYWdlIGJyaWRnZSBpbmplY3Rpb25cbiAgICovXG4gIHN0YXRpYyBpbmplY3RWaWFQb3N0TWVzc2FnZShzY3JpcHQ6IHN0cmluZywgYWN0aW9uVHlwZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBDcmVhdGUgYSBicmlkZ2Ugc2NyaXB0IHRoYXQgbGlzdGVucyBmb3IgcG9zdE1lc3NhZ2VcbiAgICAgICAgY29uc3QgYnJpZGdlU2NyaXB0ID0gYFxuICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgIT09IHdpbmRvdyB8fCAhZXZlbnQuZGF0YS50eXBlIHx8IGV2ZW50LmRhdGEudHlwZSAhPT0gJ1ZFVEdPX1NDUklQVF9JTkpFQ1QnKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZ1bmMgPSBuZXcgRnVuY3Rpb24oZXZlbnQuZGF0YS5zY3JpcHQpO1xuICAgICAgICAgICAgICBmdW5jKCk7XG4gICAgICAgICAgICAgIHdpbmRvdy5wb3N0TWVzc2FnZSh7dHlwZTogJ1ZFVEdPX1NDUklQVF9TVUNDRVNTJywgYWN0aW9uVHlwZTogZXZlbnQuZGF0YS5hY3Rpb25UeXBlfSwgJyonKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Bvc3RNZXNzYWdlIHNjcmlwdCBleGVjdXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgICAgICAgd2luZG93LnBvc3RNZXNzYWdlKHt0eXBlOiAnVkVUR09fU0NSSVBUX0VSUk9SJywgYWN0aW9uVHlwZTogZXZlbnQuZGF0YS5hY3Rpb25UeXBlLCBlcnJvcjogZXJyb3IubWVzc2FnZX0sICcqJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIGA7XG4gICAgICAgIFxuICAgICAgICAvLyBGaXJzdCBpbmplY3QgdGhlIGJyaWRnZVxuICAgICAgICB0aGlzLmluamVjdFZpYUJsb2IoYnJpZGdlU2NyaXB0LCBhY3Rpb25UeXBlICsgJ19icmlkZ2UnKS50aGVuKChicmlkZ2VTdWNjZXNzKSA9PiB7XG4gICAgICAgICAgaWYgKGJyaWRnZVN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIC8vIExpc3RlbiBmb3IgcmVzcG9uc2VcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgIT09IHdpbmRvdyB8fCAhZXZlbnQuZGF0YS50eXBlKSByZXR1cm47XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS50eXBlID09PSAnVkVUR09fU0NSSVBUX1NVQ0NFU1MnICYmIGV2ZW50LmRhdGEuYWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgcmVzcG9uc2VIYW5kbGVyKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmRhdGEudHlwZSA9PT0gJ1ZFVEdPX1NDUklQVF9FUlJPUicgJiYgZXZlbnQuZGF0YS5hY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCByZXNwb25zZUhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHJlc3BvbnNlSGFuZGxlcik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFNlbmQgc2NyaXB0IHZpYSBwb3N0TWVzc2FnZVxuICAgICAgICAgICAgd2luZG93LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgdHlwZTogJ1ZFVEdPX1NDUklQVF9JTkpFQ1QnLFxuICAgICAgICAgICAgICBzY3JpcHQ6IHNjcmlwdCxcbiAgICAgICAgICAgICAgYWN0aW9uVHlwZTogYWN0aW9uVHlwZVxuICAgICAgICAgICAgfSwgJyonKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVGltZW91dCBhZnRlciA1IHNlY29uZHNcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHJlc3BvbnNlSGFuZGxlcik7XG4gICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgfSwgNTAwMCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdQb3N0TWVzc2FnZSBpbmplY3Rpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIDQ6IEJhY2tncm91bmQgc2NyaXB0IGluamVjdGlvbiB2aWEgY2hyb21lLnNjcmlwdGluZ1xuICAgKi9cbiAgc3RhdGljIGluamVjdFZpYUJhY2tncm91bmQoc2NyaXB0OiBzdHJpbmcsIGFjdGlvblR5cGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2Uoe1xuICAgICAgICAgIGFjdGlvbjogXCJJTkpFQ1RfU0NSSVBUXCIsXG4gICAgICAgICAgc2NyaXB0OiBzY3JpcHQsXG4gICAgICAgICAgYWN0aW9uVHlwZTogYWN0aW9uVHlwZVxuICAgICAgICB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAoY2hyb21lLnJ1bnRpbWUubGFzdEVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdCYWNrZ3JvdW5kIGluamVjdGlvbiBmYWlsZWQ6JywgY2hyb21lLnJ1bnRpbWUubGFzdEVycm9yKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlICYmIHJlc3BvbnNlLnN1Y2Nlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdCYWNrZ3JvdW5kIHNjcmlwdCBpbmplY3Rpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIDU6IERpcmVjdCBldmFsIGluIGNvbnRlbnQgc2NyaXB0IGNvbnRleHQgKGxhc3QgcmVzb3J0KVxuICAgKi9cbiAgc3RhdGljIGluamVjdFZpYUV2YWwoc2NyaXB0OiBzdHJpbmcsIGFjdGlvblR5cGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc29sZS5sb2coYEF0dGVtcHRpbmcgZGlyZWN0IGV2YWwgZm9yICR7YWN0aW9uVHlwZX1gKTtcblxuICAgICAgICAvLyBDcmVhdGUgaXNvbGF0ZWQgZnVuY3Rpb24gdG8gYXZvaWQgcG9sbHV0aW5nIGdsb2JhbCBzY29wZVxuICAgICAgICBjb25zdCBpc29sYXRlZEV4ZWN1dGlvbiA9IG5ldyBGdW5jdGlvbignc2NyaXB0JywgYFxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAke3NjcmlwdH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmFsIGV4ZWN1dGlvbiBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICBgKTtcblxuICAgICAgICBjb25zdCBzdWNjZXNzID0gaXNvbGF0ZWRFeGVjdXRpb24oc2NyaXB0KTtcbiAgICAgICAgcmVzb2x2ZShzdWNjZXNzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V2YWwgaW5qZWN0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSBhbGwgbWV0aG9kcyBpbiBzbWFydCBvcmRlciBiYXNlZCBvbiBDU1AgZGV0ZWN0aW9uXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW5qZWN0U2NyaXB0KHNjcmlwdDogc3RyaW5nLCBhY3Rpb25UeXBlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBoYXNTdHJpY3RDU1AgPSB0aGlzLmRldGVjdFN0cmljdENTUCgpO1xuXG4gICAgLy8gU21hcnQgbWV0aG9kIG9yZGVyaW5nIGJhc2VkIG9uIENTUCBkZXRlY3Rpb25cbiAgICBjb25zdCBtZXRob2RzID0gaGFzU3RyaWN0Q1NQID8gW1xuICAgICAgLy8gRm9yIHN0cmljdCBDU1Agc2l0ZXMsIHRyeSBiYWNrZ3JvdW5kIGluamVjdGlvbiBmaXJzdFxuICAgICAgKCkgPT4gdGhpcy5pbmplY3RWaWFCYWNrZ3JvdW5kKHNjcmlwdCwgYWN0aW9uVHlwZSksXG4gICAgICAoKSA9PiB0aGlzLmluamVjdFZpYUV2YWwoc2NyaXB0LCBhY3Rpb25UeXBlKSxcbiAgICAgICgpID0+IHRoaXMuaW5qZWN0VmlhUG9zdE1lc3NhZ2Uoc2NyaXB0LCBhY3Rpb25UeXBlKSxcbiAgICAgICgpID0+IHRoaXMuaW5qZWN0VmlhQmxvYihzY3JpcHQsIGFjdGlvblR5cGUpLFxuICAgICAgKCkgPT4gdGhpcy5pbmplY3RWaWFEYXRhVXJsKHNjcmlwdCwgYWN0aW9uVHlwZSlcbiAgICBdIDogW1xuICAgICAgLy8gRm9yIG5vcm1hbCBzaXRlcywgdHJ5IGJsb2IgZmlyc3QgKGZhc3Rlc3QpXG4gICAgICAoKSA9PiB0aGlzLmluamVjdFZpYUJsb2Ioc2NyaXB0LCBhY3Rpb25UeXBlKSxcbiAgICAgICgpID0+IHRoaXMuaW5qZWN0VmlhRGF0YVVybChzY3JpcHQsIGFjdGlvblR5cGUpLFxuICAgICAgKCkgPT4gdGhpcy5pbmplY3RWaWFCYWNrZ3JvdW5kKHNjcmlwdCwgYWN0aW9uVHlwZSksXG4gICAgICAoKSA9PiB0aGlzLmluamVjdFZpYUV2YWwoc2NyaXB0LCBhY3Rpb25UeXBlKSxcbiAgICAgICgpID0+IHRoaXMuaW5qZWN0VmlhUG9zdE1lc3NhZ2Uoc2NyaXB0LCBhY3Rpb25UeXBlKVxuICAgIF07XG5cbiAgICBjb25zb2xlLmxvZyhgSW5qZWN0aW5nIHNjcmlwdCBmb3IgJHthY3Rpb25UeXBlfSAoU3RyaWN0IENTUDogJHtoYXNTdHJpY3RDU1B9KWApO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBtZXRob2QgPSBtZXRob2RzW2ldO1xuICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IGhhc1N0cmljdENTUCA/XG4gICAgICAgIFsnQmFja2dyb3VuZCcsICdFdmFsJywgJ1Bvc3RNZXNzYWdlJywgJ0Jsb2InLCAnRGF0YVVSTCddW2ldIDpcbiAgICAgICAgWydCbG9iJywgJ0RhdGFVUkwnLCAnQmFja2dyb3VuZCcsICdFdmFsJywgJ1Bvc3RNZXNzYWdlJ11baV07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBUcnlpbmcgJHttZXRob2ROYW1lfSBpbmplY3Rpb24uLi5gKTtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IG1ldGhvZCgpO1xuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGDinIUgU2NyaXB0IGluamVjdGlvbiBzdWNjZXNzZnVsIHZpYSAke21ldGhvZE5hbWV9IGZvciAke2FjdGlvblR5cGV9YCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYOKdjCAke21ldGhvZE5hbWV9IGluamVjdGlvbiBmYWlsZWQgZm9yICR7YWN0aW9uVHlwZX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihg4p2MICR7bWV0aG9kTmFtZX0gaW5qZWN0aW9uIGVycm9yOmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmVycm9yKGDinYwgQWxsIGluamVjdGlvbiBtZXRob2RzIGZhaWxlZCBmb3IgJHthY3Rpb25UeXBlfWApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwiLy8gQUkgQ2hhdCBQcm92aWRlcnMgQ29uZmlndXJhdGlvblxuLy8gRG9tYWlucyBmb3IgYXV0b21hdGljIFZHIENvZGVyIGlmcmFtZSBpbmplY3Rpb25cblxuZXhwb3J0IGNvbnN0IEFJX0RPTUFJTlMgPSBbXG4gICdjaGF0Lm9wZW5haS5jb20nLCAgICAgICAgICAgLy8gQ2hhdEdQVCAob2xkIFVSTClcbiAgJ2NoYXRncHQuY29tJywgICAgICAgICAgICAgICAvLyBDaGF0R1BUIChuZXcgVVJMKVxuICAnZ2VtaW5pLmdvb2dsZS5jb20nLCAgICAgICAgIC8vIEdvb2dsZSBHZW1pbmlcbiAgJ2Fpc3R1ZGlvLmdvb2dsZS5jb20nLCAgICAgICAvLyBHb29nbGUgQUkgU3R1ZGlvXG4gICdjaGF0LmRlZXBzZWVrLmNvbScsICAgICAgICAgLy8gRGVlcFNlZWtcbiAgJ2tpbWkuY29tJywgICAgICAgICAgICAgICAgICAvLyBLaW1pIEFJXG4gICd3d3cua2ltaS5jb20nLCAgICAgICAgICAgICAvLyBLaW1pIEFJICh3d3cpXG4gICdncm9rLmNvbScsICAgICAgICAgICAgICAgICAgLy8gR3Jva1xuICAnY2xhdWRlLmFpJywgICAgICAgICAgICAgICAgIC8vIENsYXVkZSAoQW50aHJvcGljKVxuICAncG9lLmNvbScsICAgICAgICAgICAgICAgICAgIC8vIFBvZVxuICAncGVycGxleGl0eS5haScsICAgICAgICAgICAgLy8gUGVycGxleGl0eVxuICAnd3d3LnBlcnBsZXhpdHkuYWknLCAgICAgICAgLy8gUGVycGxleGl0eSAod3d3KVxuXTtcblxuLyoqXG4gKiBDaGVjayBpZiBkb21haW4gc2hvdWxkIGhhdmUgVkcgQ29kZXIgaWZyYW1lIGluamVjdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FJQ2hhdERvbWFpbihob3N0bmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNsZWFuSG9zdG5hbWUgPSBob3N0bmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL153d3dcXC4vLCAnJyk7XG4gIGNvbnNvbGUubG9nKCfwn5SNIENoZWNraW5nIEFJIGRvbWFpbjonLCBjbGVhbkhvc3RuYW1lKTtcbiAgXG4gIGNvbnN0IGlzTWF0Y2ggPSBBSV9ET01BSU5TLnNvbWUoZG9tYWluID0+IHtcbiAgICBjb25zdCBjbGVhbkRvbWFpbiA9IGRvbWFpbi50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL153d3dcXC4vLCAnJyk7XG4gICAgcmV0dXJuIGNsZWFuSG9zdG5hbWUgPT09IGNsZWFuRG9tYWluIHx8IGNsZWFuSG9zdG5hbWUuZW5kc1dpdGgoJy4nICsgY2xlYW5Eb21haW4pO1xuICB9KTtcbiAgXG4gIGNvbnNvbGUubG9nKCfwn46vIEFJIGRvbWFpbiBtYXRjaDonLCBpc01hdGNoKTtcbiAgcmV0dXJuIGlzTWF0Y2g7XG59XG4iLCIvLyBWRyBDb2RlciBJZnJhbWUgSW5qZWN0b3IgU2NyaXB0IChCdW5kbGVkIGZvciBFeHRlbnNpb24pXG4vLyBUd28tQnV0dG9uIFRvZ2dsZSB3aXRoIGhpZGRlbiBmdWxsc2NyZWVuIHdoZW4gY29sbGFwc2VkXG5cbmV4cG9ydCBjb25zdCBWR19DT0RFUl9JTkpFQ1RPUl9TQ1JJUFQgPSBgXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgXG4gIGNvbnN0IENPTkZJRyA9IHtcbiAgICBWR19DT0RFUl9VUkw6ICdodHRwOi8vbG9jYWxob3N0OjY4Njg/ZW1iZWRkZWQ9dHJ1ZScsXG4gICAgSUZSQU1FX0lEOiAndmctY29kZXItc2lkZS1pZnJhbWUnLFxuICAgIENPTlRBSU5FUl9JRDogJ3ZnLWNvZGVyLWNvbnRhaW5lcicsXG4gICAgQ09OVFJPTFNfSUQ6ICd2Zy1jb2Rlci1jb250cm9scycsXG4gICAgUkVTSVpFX0hBTkRMRV9JRDogJ3ZnLWNvZGVyLXJlc2l6ZS1oYW5kbGUnLFxuICAgIERFRkFVTFRfV0lEVEg6ICc0MjBweCcsXG4gICAgRlVMTFNDUkVFTl9XSURUSDogJzEwMCUnLFxuICAgIE1JTl9XSURUSDogMzAwLFxuICAgIE1BWF9XSURUSF9QRVJDRU5UOiA3MCxcbiAgICBTVEFURV9ERUZBVUxUOiAnZGVmYXVsdCcsXG4gICAgU1RBVEVfRlVMTFNDUkVFTjogJ2Z1bGxzY3JlZW4nLFxuICAgIFNUQVRFX0NPTExBUFNFRDogJ2NvbGxhcHNlZCcsXG4gICAgWl9JTkRFWDogOTk5OSxcbiAgICBTVE9SQUdFX0tFWV9XSURUSDogJ3ZnX2NvZGVyX3dpZHRoJyxcbiAgICBTVE9SQUdFX0tFWV9TVEFURTogJ3ZnX2NvZGVyX3N0YXRlJyxcbiAgfTtcbiAgXG4gIGlmIChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdWR19DT0RFUl9ORVNURUQnKSA9PT0gJ3RydWUnKSB7XG4gICAgY29uc29sZS5sb2coJ/CfmqsgVkcgQ29kZXIgaWZyYW1lIGluamVjdGlvbiBza2lwcGVkIC0gbmVzdGVkIGNvbnRleHQnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgXG4gIGlmICh3aW5kb3cuc2VsZiAhPT0gd2luZG93LnRvcCAmJiBkb2N1bWVudC5yZWZlcnJlci5pbmNsdWRlcygnOjY4NjgnKSkge1xuICAgIGNvbnNvbGUubG9nKCfwn5qrIFZHIENvZGVyIGlmcmFtZSBpbmplY3Rpb24gc2tpcHBlZCAtIHBhcmVudCBpcyA6Njg2OCcpO1xuICAgIHJldHVybjtcbiAgfVxuICBcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKENPTkZJRy5DT05UQUlORVJfSUQpKSB7XG4gICAgY29uc29sZS5sb2coJ+KaoO+4jyBWRyBDb2RlciBpZnJhbWUgYWxyZWFkeSBpbmplY3RlZCcpO1xuICAgIHJldHVybjtcbiAgfVxuICBcbiAgZnVuY3Rpb24gZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKENPTkZJRy5TVE9SQUdFX0tFWV9TVEFURSkgfHwgQ09ORklHLlNUQVRFX0RFRkFVTFQ7XG4gIH1cbiAgXG4gIGZ1bmN0aW9uIGdldFdpZHRoKCkge1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShDT05GSUcuU1RPUkFHRV9LRVlfV0lEVEgpIHx8IENPTkZJRy5ERUZBVUxUX1dJRFRIO1xuICB9XG4gIFxuICBmdW5jdGlvbiBzZXRTdGF0ZShzdGF0ZSkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKENPTkZJRy5TVE9SQUdFX0tFWV9TVEFURSwgc3RhdGUpO1xuICB9XG4gIFxuICBmdW5jdGlvbiBzZXRXaWR0aCh3aWR0aCkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKENPTkZJRy5TVE9SQUdFX0tFWV9XSURUSCwgd2lkdGgpO1xuICB9XG4gIFxuICBmdW5jdGlvbiBpbmplY3RTdHlsZXMoKSB7XG4gICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlLnRleHRDb250ZW50ID0gJyMnICsgQ09ORklHLkNPTlRBSU5FUl9JRCArICcgeycgK1xuICAgICAgJ3Bvc2l0aW9uOiBmaXhlZDsgdG9wOiAwOyBsZWZ0OiAwOyBib3R0b206IDA7JyArXG4gICAgICAnd2lkdGg6ICcgKyBnZXRXaWR0aCgpICsgJzsnICtcbiAgICAgICdiYWNrZ3JvdW5kOiAjMWExYTFhOyB6LWluZGV4OiAnICsgQ09ORklHLlpfSU5ERVggKyAnOycgK1xuICAgICAgJ2Rpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47JyArXG4gICAgICAnYm94LXNoYWRvdzogNHB4IDAgMTJweCByZ2JhKDAsIDAsIDAsIDAuMyk7JyArXG4gICAgICAndHJhbnNpdGlvbjogd2lkdGggMC4zcyBlYXNlLCB0cmFuc2Zvcm0gMC4zcyBlYXNlOycgK1xuICAgICAgJ30nICtcbiAgICAgICcjJyArIENPTkZJRy5DT05UQUlORVJfSUQgKyAnLmNvbGxhcHNlZCB7IHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7IH0nICtcbiAgICAgICcjJyArIENPTkZJRy5JRlJBTUVfSUQgKyAnIHsnICtcbiAgICAgICdmbGV4OiAxOyBib3JkZXI6IG5vbmU7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IGJhY2tncm91bmQ6IHdoaXRlOycgK1xuICAgICAgJ30nICtcbiAgICAgICcjJyArIENPTkZJRy5DT05UUk9MU19JRCArICcgeycgK1xuICAgICAgJ3Bvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiA1MCU7IHJpZ2h0OiAtMzZweDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpOycgK1xuICAgICAgJ3otaW5kZXg6ICcgKyAoQ09ORklHLlpfSU5ERVggKyAxKSArICc7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNHB4OycgK1xuICAgICAgJ3RyYW5zaXRpb246IHJpZ2h0IDAuM3MgZWFzZTsnICtcbiAgICAgICd9JyArXG4gICAgICAnIycgKyBDT05GSUcuQ09OVFJPTFNfSUQgKyAnLmZ1bGxzY3JlZW4geycgK1xuICAgICAgJ3JpZ2h0OiAxMnB4OycgK1xuICAgICAgJ30nICtcbiAgICAgICcjJyArIENPTkZJRy5DT05UUk9MU19JRCArICcgYnV0dG9uIHsnICtcbiAgICAgICdiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjNjY3ZWVhIDAlLCAjNzY0YmEyIDEwMCUpOycgK1xuICAgICAgJ2NvbG9yOiB3aGl0ZTsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiAwIDZweCA2cHggMDsnICtcbiAgICAgICdwYWRkaW5nOiA4cHggNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMThweDsnICtcbiAgICAgICdib3gtc2hhZG93OiAtMnB4IDJweCA2cHggcmdiYSgwLCAwLCAwLCAwLjIpOycgK1xuICAgICAgJ3RyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7IHdpZHRoOiAzMnB4OyBoZWlnaHQ6IDMycHg7JyArXG4gICAgICAnZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7JyArXG4gICAgICAnfScgK1xuICAgICAgJyMnICsgQ09ORklHLkNPTlRST0xTX0lEICsgJyBidXR0b24uaGlkZGVuIHsnICtcbiAgICAgICdkaXNwbGF5OiBub25lOycgK1xuICAgICAgJ30nICtcbiAgICAgICcjJyArIENPTkZJRy5DT05UUk9MU19JRCArICcgYnV0dG9uOmhvdmVyIHsnICtcbiAgICAgICdiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjNzY0YmEyIDAlLCAjNjY3ZWVhIDEwMCUpOycgK1xuICAgICAgJ2JveC1zaGFkb3c6IC0zcHggM3B4IDhweCByZ2JhKDAsIDAsIDAsIDAuMyk7JyArXG4gICAgICAnfScgK1xuICAgICAgJyMnICsgQ09ORklHLlJFU0laRV9IQU5ETEVfSUQgKyAnIHsnICtcbiAgICAgICdwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiAwOyB0b3A6IDA7IGJvdHRvbTogMDsgd2lkdGg6IDZweDsnICtcbiAgICAgICdjdXJzb3I6IGV3LXJlc2l6ZTsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4ycyBlYXNlOycgK1xuICAgICAgJ30nICtcbiAgICAgICcjJyArIENPTkZJRy5SRVNJWkVfSEFORExFX0lEICsgJzpob3ZlciB7IGJhY2tncm91bmQ6IHJnYmEoMTAyLCAxMjYsIDIzNCwgMC41KTsgfScgK1xuICAgICAgJyMnICsgQ09ORklHLlJFU0laRV9IQU5ETEVfSUQgKyAnLnJlc2l6aW5nIHsgYmFja2dyb3VuZDogcmdiYSgxMDIsIDEyNiwgMjM0LCAwLjgpOyB9JztcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgfVxuICBcbiAgZnVuY3Rpb24gY3JlYXRlQ29udGFpbmVyKCkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnRhaW5lci5pZCA9IENPTkZJRy5DT05UQUlORVJfSUQ7XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gZ2V0U3RhdGUoKTtcbiAgICBpZiAoY3VycmVudFN0YXRlID09PSBDT05GSUcuU1RBVEVfQ09MTEFQU0VEKSB7XG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnY29sbGFwc2VkJyk7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50U3RhdGUgPT09IENPTkZJRy5TVEFURV9GVUxMU0NSRUVOKSB7XG4gICAgICBjb250YWluZXIuc3R5bGUud2lkdGggPSBDT05GSUcuRlVMTFNDUkVFTl9XSURUSDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgfVxuICBcbiAgZnVuY3Rpb24gY3JlYXRlSWZyYW1lKCkge1xuICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgIGlmcmFtZS5pZCA9IENPTkZJRy5JRlJBTUVfSUQ7XG4gICAgaWZyYW1lLnNyYyA9IENPTkZJRy5WR19DT0RFUl9VUkw7XG4gICAgaWZyYW1lLnRpdGxlID0gJ1ZHIENvZGVyIERhc2hib2FyZCc7XG4gICAgaWZyYW1lLmFsbG93ID0gJ2NsaXBib2FyZC1yZWFkOyBjbGlwYm9hcmQtd3JpdGUnO1xuICAgIHJldHVybiBpZnJhbWU7XG4gIH1cbiAgXG4gIGZ1bmN0aW9uIGNyZWF0ZVJlc2l6ZUhhbmRsZSgpIHtcbiAgICBjb25zdCBoYW5kbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBoYW5kbGUuaWQgPSBDT05GSUcuUkVTSVpFX0hBTkRMRV9JRDtcbiAgICByZXR1cm4gaGFuZGxlO1xuICB9XG4gIFxuICBmdW5jdGlvbiBjcmVhdGVDb250cm9scygpIHtcbiAgICBjb25zdCBjb250cm9scyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnRyb2xzLmlkID0gQ09ORklHLkNPTlRST0xTX0lEO1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGdldFN0YXRlKCk7XG4gICAgaWYgKGN1cnJlbnRTdGF0ZSA9PT0gQ09ORklHLlNUQVRFX0ZVTExTQ1JFRU4pIHtcbiAgICAgIGNvbnRyb2xzLmNsYXNzTGlzdC5hZGQoJ2Z1bGxzY3JlZW4nKTtcbiAgICB9XG4gICAgY29uc3QgYnRuRnVsbHNjcmVlbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIGJ0bkZ1bGxzY3JlZW4uaW5uZXJIVE1MID0gY3VycmVudFN0YXRlID09PSBDT05GSUcuU1RBVEVfRlVMTFNDUkVFTiA/ICfil6cnIDogJ+KWoyc7XG4gICAgYnRuRnVsbHNjcmVlbi50aXRsZSA9IGN1cnJlbnRTdGF0ZSA9PT0gQ09ORklHLlNUQVRFX0ZVTExTQ1JFRU4gPyAnRGVmYXVsdCAoNDUlKScgOiAnRnVsbHNjcmVlbiAoMTAwJSknO1xuICAgIGlmIChjdXJyZW50U3RhdGUgPT09IENPTkZJRy5TVEFURV9DT0xMQVBTRUQpIHtcbiAgICAgIGJ0bkZ1bGxzY3JlZW4uY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgfVxuICAgIGNvbnN0IGJ0bkNvbGxhcHNlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgYnRuQ29sbGFwc2UuaW5uZXJIVE1MID0gY3VycmVudFN0YXRlID09PSBDT05GSUcuU1RBVEVfQ09MTEFQU0VEID8gJ+KWticgOiAn4peEJztcbiAgICBidG5Db2xsYXBzZS50aXRsZSA9IGN1cnJlbnRTdGF0ZSA9PT0gQ09ORklHLlNUQVRFX0NPTExBUFNFRCA/ICdFeHBhbmQnIDogJ0NvbGxhcHNlJztcbiAgICBjb250cm9scy5hcHBlbmRDaGlsZChidG5GdWxsc2NyZWVuKTtcbiAgICBjb250cm9scy5hcHBlbmRDaGlsZChidG5Db2xsYXBzZSk7XG4gICAgcmV0dXJuIGNvbnRyb2xzO1xuICB9XG4gIFxuICBmdW5jdGlvbiBpbml0UmVzaXplKGNvbnRhaW5lciwgaGFuZGxlLCBjb250cm9scykge1xuICAgIGxldCBpc1Jlc2l6aW5nID0gZmFsc2UsIHN0YXJ0WCA9IDAsIHN0YXJ0V2lkdGggPSAwO1xuICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZSkgPT4ge1xuICAgICAgaXNSZXNpemluZyA9IHRydWU7IHN0YXJ0WCA9IGUuY2xpZW50WDsgc3RhcnRXaWR0aCA9IGNvbnRhaW5lci5vZmZzZXRXaWR0aDtcbiAgICAgIGhhbmRsZS5jbGFzc0xpc3QuYWRkKCdyZXNpemluZycpO1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnZXctcmVzaXplJztcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUudXNlclNlbGVjdCA9ICdub25lJztcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCAoZSkgPT4ge1xuICAgICAgaWYgKCFpc1Jlc2l6aW5nKSByZXR1cm47XG4gICAgICBjb25zdCBkZWx0YVggPSBlLmNsaWVudFggLSBzdGFydFg7XG4gICAgICBjb25zdCBuZXdXaWR0aCA9IHN0YXJ0V2lkdGggKyBkZWx0YVg7XG4gICAgICBjb25zdCBtYXhXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoICogKENPTkZJRy5NQVhfV0lEVEhfUEVSQ0VOVCAvIDEwMCk7XG4gICAgICBpZiAobmV3V2lkdGggPj0gQ09ORklHLk1JTl9XSURUSCAmJiBuZXdXaWR0aCA8PSBtYXhXaWR0aCkge1xuICAgICAgICBjb25zdCB3aWR0aFBlcmNlbnQgPSAobmV3V2lkdGggLyB3aW5kb3cuaW5uZXJXaWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9IHdpZHRoUGVyY2VudCArICclJztcbiAgICAgICAgc2V0V2lkdGgod2lkdGhQZXJjZW50ICsgJyUnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgKCkgPT4ge1xuICAgICAgaWYgKGlzUmVzaXppbmcpIHtcbiAgICAgICAgaXNSZXNpemluZyA9IGZhbHNlOyBoYW5kbGUuY2xhc3NMaXN0LnJlbW92ZSgncmVzaXppbmcnKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0ID0gJyc7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgXG4gIGZ1bmN0aW9uIGluaXRDb250cm9scyhjb250YWluZXIsIGNvbnRyb2xzKSB7XG4gICAgY29uc3QgYnV0dG9ucyA9IGNvbnRyb2xzLnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbicpO1xuICAgIGNvbnN0IGJ0bkZ1bGxzY3JlZW4gPSBidXR0b25zWzBdO1xuICAgIGNvbnN0IGJ0bkNvbGxhcHNlID0gYnV0dG9uc1sxXTtcbiAgICBidG5GdWxsc2NyZWVuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gZ2V0U3RhdGUoKTtcbiAgICAgIGlmIChjdXJyZW50U3RhdGUgPT09IENPTkZJRy5TVEFURV9GVUxMU0NSRUVOKSB7XG4gICAgICAgIHNldFN0YXRlKENPTkZJRy5TVEFURV9ERUZBVUxUKTtcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gQ09ORklHLkRFRkFVTFRfV0lEVEg7XG4gICAgICAgIGNvbnRyb2xzLmNsYXNzTGlzdC5yZW1vdmUoJ2Z1bGxzY3JlZW4nKTtcbiAgICAgICAgYnRuRnVsbHNjcmVlbi5pbm5lckhUTUwgPSAn4pajJztcbiAgICAgICAgYnRuRnVsbHNjcmVlbi50aXRsZSA9ICdGdWxsc2NyZWVuICgxMDAlKSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRTdGF0ZShDT05GSUcuU1RBVEVfRlVMTFNDUkVFTik7XG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9IENPTkZJRy5GVUxMU0NSRUVOX1dJRFRIO1xuICAgICAgICBjb250cm9scy5jbGFzc0xpc3QuYWRkKCdmdWxsc2NyZWVuJyk7XG4gICAgICAgIGJ0bkZ1bGxzY3JlZW4uaW5uZXJIVE1MID0gJ+KXpyc7XG4gICAgICAgIGJ0bkZ1bGxzY3JlZW4udGl0bGUgPSAnRGVmYXVsdCAoNDUlKSc7XG4gICAgICB9XG4gICAgfSk7XG4gICAgYnRuQ29sbGFwc2UuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgICAgaWYgKGN1cnJlbnRTdGF0ZSA9PT0gQ09ORklHLlNUQVRFX0NPTExBUFNFRCkge1xuICAgICAgICBzZXRTdGF0ZShDT05GSUcuU1RBVEVfREVGQVVMVCk7XG4gICAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdjb2xsYXBzZWQnKTtcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gQ09ORklHLkRFRkFVTFRfV0lEVEg7XG4gICAgICAgIGNvbnRyb2xzLmNsYXNzTGlzdC5yZW1vdmUoJ2Z1bGxzY3JlZW4nKTtcbiAgICAgICAgYnRuQ29sbGFwc2UuaW5uZXJIVE1MID0gJ+KXhCc7XG4gICAgICAgIGJ0bkNvbGxhcHNlLnRpdGxlID0gJ0NvbGxhcHNlJztcbiAgICAgICAgYnRuRnVsbHNjcmVlbi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcbiAgICAgICAgYnRuRnVsbHNjcmVlbi5pbm5lckhUTUwgPSAn4pajJztcbiAgICAgICAgYnRuRnVsbHNjcmVlbi50aXRsZSA9ICdGdWxsc2NyZWVuICgxMDAlKSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB3YXNGdWxsc2NyZWVuID0gY3VycmVudFN0YXRlID09PSBDT05GSUcuU1RBVEVfRlVMTFNDUkVFTjtcbiAgICAgICAgc2V0U3RhdGUoQ09ORklHLlNUQVRFX0NPTExBUFNFRCk7XG4gICAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzZWQnKTtcbiAgICAgICAgaWYgKHdhc0Z1bGxzY3JlZW4pIHtcbiAgICAgICAgICBjb250cm9scy5jbGFzc0xpc3QucmVtb3ZlKCdmdWxsc2NyZWVuJyk7XG4gICAgICAgIH1cbiAgICAgICAgYnRuRnVsbHNjcmVlbi5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgYnRuQ29sbGFwc2UuaW5uZXJIVE1MID0gJ+KWtic7XG4gICAgICAgIGJ0bkNvbGxhcHNlLnRpdGxlID0gJ0V4cGFuZCc7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgXG4gIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgaWYgKCFkb2N1bWVudC5ib2R5KSB7XG4gICAgICBzZXRUaW1lb3V0KGluaXQsIDEwMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCfwn5qAIEluaXRpYWxpemluZyBWRyBDb2RlciBpZnJhbWUgaW5qZWN0aW9uLi4uJyk7XG4gICAgaW5qZWN0U3R5bGVzKCk7XG4gICAgY29uc3QgY29udGFpbmVyID0gY3JlYXRlQ29udGFpbmVyKCk7XG4gICAgY29uc3QgaWZyYW1lID0gY3JlYXRlSWZyYW1lKCk7XG4gICAgY29uc3QgcmVzaXplSGFuZGxlID0gY3JlYXRlUmVzaXplSGFuZGxlKCk7XG4gICAgY29uc3QgY29udHJvbHMgPSBjcmVhdGVDb250cm9scygpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChyZXNpemVIYW5kbGUpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChjb250cm9scyk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuICAgIGluaXRSZXNpemUoY29udGFpbmVyLCByZXNpemVIYW5kbGUsIGNvbnRyb2xzKTtcbiAgICBpbml0Q29udHJvbHMoY29udGFpbmVyLCBjb250cm9scyk7XG4gICAgY29uc29sZS5sb2coJ+KchSBWRyBDb2RlciBpZnJhbWUgaW5qZWN0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gIH1cbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBpbml0KTtcbiAgfSBlbHNlIHtcbiAgICBpbml0KCk7XG4gIH1cbn0pKCk7XG5gO1xuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJpbXBvcnQgeyBTY3JpcHRJbmplY3RvciB9IGZyb20gJy4vc2NyaXB0LWluamVjdG9yJztcbmltcG9ydCB7IGlzQUlDaGF0RG9tYWluIH0gZnJvbSAnLi91dGlscy9haS1kb21haW5zJztcbmltcG9ydCB7IFZHX0NPREVSX0lOSkVDVE9SX1NDUklQVCB9IGZyb20gJy4vdXRpbHMvaW5qZWN0b3Itc2NyaXB0JztcblxuY29uc3QgYWRkU2NyaXB0ID0gYXN5bmMgKHNjcmlwdDogc3RyaW5nLCBhY3Rpb25UeXBlOiBzdHJpbmcpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgU2NyaXB0SW5qZWN0b3IuaW5qZWN0U2NyaXB0KHNjcmlwdCwgYWN0aW9uVHlwZSk7XG4gICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdBbGwgc2NyaXB0IGluamVjdGlvbiBtZXRob2RzIGZhaWxlZCBmb3I6JywgYWN0aW9uVHlwZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1NjcmlwdCBpbmplY3Rpb24gZXJyb3I6JywgZXJyb3IpO1xuICB9XG59XG4vLyBXYWl0IGZvciBET00gdG8gYmUgcmVhZHkgYmVmb3JlIGV4ZWN1dGluZ1xuY29uc3Qgd2FpdEZvckRPTSA9ICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHJlc29sdmUoKSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfVxuICB9KTtcbn07XG5cbi8qKlxuICogTXVsdGktbGF5ZXIgZGV0ZWN0aW9uIHRvIGNoZWNrIGlmIGN1cnJlbnQgcGFnZSBpcyBsb2FkZWQgaW5zaWRlIFZHIENvZGVyJ3MgaWZyYW1lXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIG5lc3RlZCBjb250ZXh0IChzaG91bGQgc2tpcCBpbmplY3Rpb24pXG4gKi9cbmNvbnN0IGRldGVjdFZHQ29kZXJDb250ZXh0ID0gYXN5bmMgKCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAvLyBMYXllciAxOiBVUkwgcGFyYW1ldGVyIGNoZWNrIChmYXN0ZXN0KVxuICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICBpZiAodXJsUGFyYW1zLmhhcygndmdfY29kZXJfY29udGV4dCcpKSB7XG4gICAgY29uc29sZS5sb2coJ+KaoSBWRyBDb2RlciBjb250ZXh0IGRldGVjdGVkOiBVUkwgcGFyYW1ldGVyJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgXG4gIC8vIExheWVyIDI6IFJlZmVycmVyIGNoZWNrIChiYWNrdXApXG4gIGNvbnN0IHJlZmVycmVyID0gZG9jdW1lbnQucmVmZXJyZXI7XG4gIGlmIChyZWZlcnJlciAmJiAocmVmZXJyZXIuaW5jbHVkZXMoJzo2ODY4JykgfHwgcmVmZXJyZXIuaW5jbHVkZXMoJ3ZnLWNvZGVyJykpKSB7XG4gICAgY29uc29sZS5sb2coJ+KaoSBWRyBDb2RlciBjb250ZXh0IGRldGVjdGVkOiBSZWZlcnJlciBjb250YWlucyA6Njg2OCcpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIFxuICAvLyBMYXllciAzOiBQb3N0TWVzc2FnZSBwaW5nIChtb3N0IHJlbGlhYmxlIGZvciBpZnJhbWUgZGV0ZWN0aW9uKVxuICBpZiAod2luZG93LnNlbGYgIT09IHdpbmRvdy50b3ApIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaXNWR0NvZGVyID0gYXdhaXQgbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZShmYWxzZSksIDIwMCk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBoYW5kbGVyID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQuZGF0YT8udHlwZSA9PT0gJ1ZHX0NPREVSX1BBUkVOVCcpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoeyB0eXBlOiAnVkdfQ09ERVJfUElORycgfSwgJyonKTtcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBpZiAoaXNWR0NvZGVyKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCfimqEgVkcgQ29kZXIgY29udGV4dCBkZXRlY3RlZDogUG9zdE1lc3NhZ2UgY29uZmlybWF0aW9uJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdQb3N0TWVzc2FnZSBkZXRlY3Rpb24gZmFpbGVkIChleHBlY3RlZCBmb3IgY3Jvc3Mtb3JpZ2luKTonLCBlKTtcbiAgICB9XG4gIH1cbiAgXG4gIGNvbnNvbGUubG9nKCfinIUgTm9ybWFsIGNvbnRleHQgLSBub3QgaW5zaWRlIFZHIENvZGVyIGlmcmFtZScpO1xuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBpbml0aWFsaXplQ29udHJvbGxlciA9IGFzeW5jICgpID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBpbiBWRyBDb2RlcidzIGlmcmFtZSBjb250ZXh0XG4gICAgY29uc3QgaXNWR0NvZGVyTmVzdGVkID0gYXdhaXQgZGV0ZWN0VkdDb2RlckNvbnRleHQoKTtcbiAgICBcbiAgICBpZiAoaXNWR0NvZGVyTmVzdGVkKSB7XG4gICAgICBjb25zb2xlLmxvZygn8J+aqyBWRyBDb2RlciBuZXN0ZWQgaWZyYW1lIGNvbnRleHQgZGV0ZWN0ZWQgLSBza2lwcGluZyBhbGwgc2NyaXB0IGluamVjdGlvbnMnKTtcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ1ZHX0NPREVSX05FU1RFRCcsICd0cnVlJyk7XG4gICAgICByZXR1cm47IC8vIEVhcmx5IGV4aXQgLSBkb24ndCBpbmplY3QgYW55IHNjcmlwdHNcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgRE9NIGlzIHJlYWR5XG4gICAgYXdhaXQgd2FpdEZvckRPTSgpO1xuXG4gICAgY29uc3QgY3VycmVudEhvc3RuYW1lID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnJlcGxhY2UoLyhodHRwcz86XFwvXFwvKT8od3d3Lik/L2ksICcnKTtcbiAgICBcbiAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGFuIEFJIGNoYXQgZG9tYWluIC0gdXNlIGJ1bmRsZWQgaW5qZWN0b3JcbiAgICBpZiAoaXNBSUNoYXREb21haW4oY3VycmVudEhvc3RuYW1lKSkge1xuICAgICAgY29uc29sZS5sb2coJ/CfpJYgQUkgY2hhdCBkb21haW4gZGV0ZWN0ZWQ6JywgY3VycmVudEhvc3RuYW1lKTtcbiAgICAgIGNvbnNvbGUubG9nKCfwn5OmIFVzaW5nIGJ1bmRsZWQgVkcgQ29kZXIgaW5qZWN0b3IgKG5vIEZpcmViYXNlIG5lZWRlZCknKTtcbiAgICAgIFxuICAgICAgLy8gRXhlY3V0ZSBidW5kbGVkIGluamVjdG9yIHNjcmlwdFxuICAgICAgYXdhaXQgYWRkU2NyaXB0KFZHX0NPREVSX0lOSkVDVE9SX1NDUklQVCwgJ1ZHX0NPREVSX0lOSkVDVE9SJyk7XG4gICAgICByZXR1cm47IC8vIERvbmUgLSBubyBuZWVkIGZvciBGaXJlYmFzZSBzY3JpcHRcbiAgICB9XG5cbiAgICAvLyBGb3Igbm9uLUFJIGRvbWFpbnMsIGNvbnRpbnVlIHdpdGggRmlyZWJhc2Ugc2NyaXB0IGxvYWRpbmdcbiAgICBjb25zdCBhY3Rpb25UeXBlID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoUGFyYW1zLmdldChcImFjdGlvblR5cGVcIikgfHwgXCJNQUlOXCI7XG4gICAgY29uc3QgY2FjaGUgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGFjdGlvblR5cGUpO1xuXG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICBhd2FpdCBhZGRTY3JpcHQoY2FjaGUsIGFjdGlvblR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7XG4gICAgICAgIGFjdGlvbjogXCJDT05UUk9MTEVSXCIsXG4gICAgICAgIGRvbWFpbjogY3VycmVudEhvc3RuYW1lLFxuICAgICAgICBhY3Rpb25UeXBlOiBhY3Rpb25UeXBlXG4gICAgICB9LCBhc3luYyAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKGNocm9tZS5ydW50aW1lLmxhc3RFcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1J1bnRpbWUgZXJyb3I6JywgY2hyb21lLnJ1bnRpbWUubGFzdEVycm9yKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnNjcmlwdCkge1xuICAgICAgICAgIGNvbnN0IGZ1bGxTY3JpcHQgPSBgdmFyIGNocm9tZUlkID0gXCIke2Nocm9tZS5ydW50aW1lLmlkfVwiOyAke3Jlc3BvbnNlLnNjcmlwdH1gO1xuICAgICAgICAgIGF3YWl0IGFkZFNjcmlwdChmdWxsU2NyaXB0LCBhY3Rpb25UeXBlKTtcbiAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGFjdGlvblR5cGUsIGZ1bGxTY3JpcHQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0NvbnRyb2xsZXIgaW5pdGlhbGl6YXRpb24gZXJyb3I6JywgZXJyKTtcbiAgfVxufTtcblxuLy8gSW5pdGlhbGl6ZSBjb250cm9sbGVyXG5pbml0aWFsaXplQ29udHJvbGxlcigpO1xuY29uc3Qgc2V0dXBSZW1vdmVFeHRlbnNpb25MaXN0ZW5lciA9IGFzeW5jICgpID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBXYWl0IGZvciBET00gYW5kIGJvZHkgdG8gYmUgcmVhZHlcbiAgICBhd2FpdCB3YWl0Rm9yRE9NKCk7XG5cbiAgICAvLyBXYWl0IGZvciBib2R5IGVsZW1lbnRcbiAgICBjb25zdCB3YWl0Rm9yQm9keSA9ICgpOiBQcm9taXNlPEhUTUxCb2R5RWxlbWVudD4gPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoZWNrQm9keSA9ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpO1xuICAgICAgICAgIGlmIChib2R5KSB7XG4gICAgICAgICAgICByZXNvbHZlKGJvZHkgYXMgSFRNTEJvZHlFbGVtZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChjaGVja0JvZHksIDEwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjaGVja0JvZHkoKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBib2R5ID0gYXdhaXQgd2FpdEZvckJvZHkoKTtcblxuICAgIC8vIGNhY2ggZHVuZzogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdSRU1PVkVfRVhURU5TSU9OJywgeyBkZXRhaWw6IHsga2V5OiAndmFsdWUnIH0gfSkpO1xuICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignUkVNT1ZFX0VYVEVOU0lPTicsIGZ1bmN0aW9uKGV2ZW50OiBhbnkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGV2ZW50LmRldGFpbCk7IC8vIHsga2V5OiAndmFsdWUnIH1cbiAgICAgIGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHthY3Rpb246IFwiUkVNT1ZFX0VYVEVOU0lPTlwiLCBkYXRhOiBldmVudC5kZXRhaWx9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKGNocm9tZS5ydW50aW1lLmxhc3RFcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1J1bnRpbWUgZXJyb3I6JywgY2hyb21lLnJ1bnRpbWUubGFzdEVycm9yKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coJ3R1IGh1eSB0aGFuaCBjb25nJywgcmVzcG9uc2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1NldHVwIHJlbW92ZSBleHRlbnNpb24gbGlzdGVuZXIgZXJyb3I6JywgZXJyKTtcbiAgfVxufTtcblxuLy8gU2V0dXAgcmVtb3ZlIGV4dGVuc2lvbiBsaXN0ZW5lclxuc2V0dXBSZW1vdmVFeHRlbnNpb25MaXN0ZW5lcigpO1xuXG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9
|