@mnaoumov/obsidian-lib 5.2.0 → 5.2.1
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/dist/lib/cjs/components/plugin-notice-component.cjs +71 -3
- package/dist/lib/cjs/components/plugin-notice-component.d.cts +24 -1
- package/dist/lib/cjs/components/plugin-suggestion-component.cjs +4 -2
- package/dist/lib/cjs/css-class.cjs +2 -1
- package/dist/lib/cjs/css-class.d.cts +5 -0
- package/dist/lib/cjs/generated-during-build.cjs +2 -2
- package/dist/lib/esm/components/plugin-notice-component.d.mts +24 -1
- package/dist/lib/esm/components/plugin-notice-component.mjs +71 -3
- package/dist/lib/esm/components/plugin-suggestion-component.mjs +4 -2
- package/dist/lib/esm/css-class.d.mts +5 -0
- package/dist/lib/esm/css-class.mjs +2 -1
- package/dist/lib/esm/generated-during-build.mjs +2 -2
- package/dist/styles.css +7 -1
- package/package.json +1 -1
|
@@ -115,7 +115,8 @@ class PluginNoticeComponent extends ComponentEx {
|
|
|
115
115
|
/**
|
|
116
116
|
* Displays a notice message to the user.
|
|
117
117
|
*
|
|
118
|
-
* @param message - The message to display.
|
|
118
|
+
* @param message - The message to display. The notice shows the plugin name above it, so a leading
|
|
119
|
+
* `<plugin name>:` in the message is dropped rather than shown twice.
|
|
119
120
|
* @param options - The options for displaying the notice.
|
|
120
121
|
* @returns The notice object.
|
|
121
122
|
*/
|
|
@@ -338,7 +339,8 @@ class PluginNoticeComponent extends ComponentEx {
|
|
|
338
339
|
* @returns The {@link PluginNoticeComponentNoticeContent} holding the wrapped notice content.
|
|
339
340
|
*/
|
|
340
341
|
buildNoticeContent(params) {
|
|
341
|
-
const { getNotice,
|
|
342
|
+
const { getNotice, onCloseClick, requiresExplicitClose = false, shouldPrefixWithPluginName = true, shouldShowCloseButton = true } = params;
|
|
343
|
+
const message = this.stripPluginNamePrefix(params.message);
|
|
342
344
|
const fragment = createFragment();
|
|
343
345
|
const contentEl = fragment.createDiv();
|
|
344
346
|
addPluginCssClasses(contentEl, CssClass.PluginNoticeContent);
|
|
@@ -400,6 +402,21 @@ class PluginNoticeComponent extends ComponentEx {
|
|
|
400
402
|
getPermanentNotices() {
|
|
401
403
|
return getObsidianDevUtilsState(PERMANENT_NOTICES_STATE_KEY, /* @__PURE__ */ new Map()).value;
|
|
402
404
|
}
|
|
405
|
+
/**
|
|
406
|
+
* Measures a leading `<plugin name>:` in a message, together with the whitespace around the colon and
|
|
407
|
+
* after it.
|
|
408
|
+
*
|
|
409
|
+
* @param text - The message text.
|
|
410
|
+
* @returns The length of the prefix, or `0` when the text does not open with this plugin's name and a
|
|
411
|
+
* colon.
|
|
412
|
+
*/
|
|
413
|
+
getPluginNamePrefixLength(text) {
|
|
414
|
+
if (!this.pluginName || !text.startsWith(this.pluginName)) {
|
|
415
|
+
return 0;
|
|
416
|
+
}
|
|
417
|
+
const separatorMatch = /^\s*:\s*/.exec(text.slice(this.pluginName.length));
|
|
418
|
+
return separatorMatch ? this.pluginName.length + separatorMatch[0].length : 0;
|
|
419
|
+
}
|
|
403
420
|
/**
|
|
404
421
|
* Makes a notice hard to close: marks its outer element (so the CSS neutralizes its padding) and
|
|
405
422
|
* installs a capture-phase click guard that stops every click except on an interactive element (a
|
|
@@ -501,6 +518,43 @@ class PluginNoticeComponent extends ComponentEx {
|
|
|
501
518
|
}
|
|
502
519
|
return { contentEl, isNoticeOwned: true, notice: builtNotice };
|
|
503
520
|
}
|
|
521
|
+
/**
|
|
522
|
+
* Drops a leading `<plugin name>:` from a message. The notice already opens with the plugin name in its
|
|
523
|
+
* own styled header, so a message that repeats it reads as the name twice.
|
|
524
|
+
*
|
|
525
|
+
* A fragment is matched on its text, so a name wrapped in an element (such as inline code) still
|
|
526
|
+
* counts; the prefix is cut out of its text nodes, and an element it leaves empty is removed. The name
|
|
527
|
+
* is matched exactly, and only at the start: a message that merely mentions the name later is left
|
|
528
|
+
* alone.
|
|
529
|
+
*
|
|
530
|
+
* @param message - The message.
|
|
531
|
+
* @returns The message without the prefix. A fragment is changed in place and returned.
|
|
532
|
+
*/
|
|
533
|
+
stripPluginNamePrefix(message) {
|
|
534
|
+
if (typeof message === "string") {
|
|
535
|
+
return message.slice(this.getPluginNamePrefixLength(message));
|
|
536
|
+
}
|
|
537
|
+
let remainingLength = this.getPluginNamePrefixLength(message.textContent);
|
|
538
|
+
if (remainingLength === 0) {
|
|
539
|
+
return message;
|
|
540
|
+
}
|
|
541
|
+
for (const textNode of getTextNodes(message)) {
|
|
542
|
+
if (textNode.data.length > remainingLength) {
|
|
543
|
+
textNode.data = textNode.data.slice(remainingLength);
|
|
544
|
+
break;
|
|
545
|
+
}
|
|
546
|
+
remainingLength -= textNode.data.length;
|
|
547
|
+
let emptiedNode = textNode;
|
|
548
|
+
while (emptiedNode.parentElement?.childNodes.length === 1) {
|
|
549
|
+
emptiedNode = emptiedNode.parentElement;
|
|
550
|
+
}
|
|
551
|
+
emptiedNode.remove();
|
|
552
|
+
if (remainingLength === 0) {
|
|
553
|
+
break;
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
return message;
|
|
557
|
+
}
|
|
504
558
|
/**
|
|
505
559
|
* Wraps a notice's `hide` so the given callback runs the first time the notice is hidden — by the
|
|
506
560
|
* user, by a replacing notice, by its duration elapsing, or on unload. Does nothing when no callback
|
|
@@ -530,8 +584,22 @@ class PluginNoticeComponent extends ComponentEx {
|
|
|
530
584
|
});
|
|
531
585
|
}
|
|
532
586
|
}
|
|
587
|
+
function getTextNodes(node) {
|
|
588
|
+
const textNodes = [];
|
|
589
|
+
for (const childNode of node.childNodes) {
|
|
590
|
+
if (isTextNode(childNode)) {
|
|
591
|
+
textNodes.push(childNode);
|
|
592
|
+
} else {
|
|
593
|
+
textNodes.push(...getTextNodes(childNode));
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
return textNodes;
|
|
597
|
+
}
|
|
598
|
+
function isTextNode(node) {
|
|
599
|
+
return node.nodeType === Node.TEXT_NODE;
|
|
600
|
+
}
|
|
533
601
|
export {
|
|
534
602
|
PluginNoticeComponent,
|
|
535
603
|
PluginNoticeMode
|
|
536
604
|
};
|
|
537
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb21wb25lbnQgdGhhdCBtYW5hZ2VzIGRpc3BsYXlpbmcgbm90aWNlcyB0byB0aGUgdXNlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZhbHVlUHJvdmlkZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdmFsdWUtcHJvdmlkZXInO1xuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hcnJheSc7XG5pbXBvcnQgeyBpbnZva2VBc3luY1NhZmVseSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi92YWx1ZS1wcm92aWRlcic7XG5pbXBvcnQge1xuICBCdXR0b25Db21wb25lbnQsXG4gIE5vdGljZSxcbiAgc2V0SWNvblxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IGFwcGVuZENvZGVCbG9jayB9IGZyb20gJy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQgeyBhZGRQbHVnaW5Dc3NDbGFzc2VzIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1jb250ZXh0LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHsgTW9ua2V5QXJvdW5kQ29tcG9uZW50IH0gZnJvbSAnLi9tb25rZXktYXJvdW5kLWNvbXBvbmVudC50cyc7XG5cbmNvbnN0IFBFUk1BTkVOVF9OT1RJQ0VTX1NUQVRFX0tFWSA9ICdwbHVnaW4tbm90aWNlLWNvbXBvbmVudDpwZXJtYW5lbnQtbm90aWNlcyc7XG5jb25zdCBQRVJNQU5FTlRfTk9USUNFX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyA9IDA7XG5jb25zdCBERUZBVUxUX0RFTEFZX0JFRk9SRV9TSE9XX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbi8vIE9ic2lkaWFuJ3Mgb3duIGRlZmF1bHQgbm90aWNlIGR1cmF0aW9uLCBhcHBsaWVkIGJ5IHRoZSBgTm90aWNlYCBjb25zdHJ1Y3RvciB3aGVuIG5vbmUgaXMgZ2l2ZW4uIEl0IGlzXG4vLyByZXBlYXRlZCBoZXJlIGJlY2F1c2UgcmVzdGFydGluZyB0aGUgY291bnRkb3duIG9uIGFuIGFwcGVuZCBnb2VzIHRocm91Z2ggYHNldEF1dG9IaWRlYCwgd2hpY2ggdGFrZXMgYW5cbi8vIGV4cGxpY2l0IGR1cmF0aW9uIGFuZCBzbyBjYW5ub3QgZmFsbCBiYWNrIHRvIHRoYXQgZGVmYXVsdCBpdHNlbGYuXG5jb25zdCBPQlNJRElBTl9ERUZBVUxUX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMgPSA0MDAwO1xuXG4vLyBFbGVtZW50cyBhIHVzZXIgY2xpY2tzIHRvIGFjdCBvbiB0aGVtIHJhdGhlciB0aGFuIHRvIGRpc21pc3MgdGhlIG5vdGljZS4gQSBjbGljayBsYW5kaW5nIG9uIChvclxuLy8gaW5zaWRlKSBvbmUgb2YgdGhlc2UgaXMga2VwdCBmcm9tIGJ1YmJsaW5nIHRvIHRoZSBub3RpY2UsIHNvIHRoZSBub3RpY2Ugc3RheXMgb3Blbi5cbmNvbnN0IElOVEVSQUNUSVZFX0VMRU1FTlRfU0VMRUNUT1IgPSAnYSwgYnV0dG9uLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgbGFiZWwsIFtjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdLCBbcm9sZT1cImJ1dHRvblwiXSwgW3JvbGU9XCJsaW5rXCJdLCBbcm9sZT1cImNoZWNrYm94XCJdLCBbcm9sZT1cInRhYlwiXSwgW3JvbGU9XCJtZW51aXRlbVwiXSc7XG5cbi8qKlxuICogSG93IGEgbmV3IG5vdGljZSByZWxhdGVzIHRvIHRoZSBwbHVnaW4ncyBjdXJyZW50IG5vdGljZSDigJQgdGhlIG9uZSBvY2N1cHlpbmcgdGhlIHNpbmdsZSBwZXItcGx1Z2luXG4gKiBzbG90IHRoaXMgY29tcG9uZW50IGtlZXBzLlxuICpcbiAqIFJhdyBgbmV3IE5vdGljZSguLi4pYCBjYWxscyBhbHdheXMgcGlsZSB1cCwgd2hpY2ggaXMgcmFyZWx5IHdoYXQgYSBwbHVnaW4gd2FudHM6IHVzdWFsbHkgb25seSB0aGVcbiAqIGxhdGVzdCBtZXNzYWdlIG1hdHRlcnMuIFNvIHRoZSBzbG90IGV4aXN0cywgYW5kIHRoaXMgY2hvb3NlcyB3aGF0IGEgbmV3IG1lc3NhZ2UgZG9lcyB3aXRoIGl0LlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5Ob3RpY2VNb2RlIHtcbiAgLyoqXG4gICAqIEFkZHMgdGhlIG1lc3NhZ2UgdG8gdGhlIGN1cnJlbnQgbm90aWNlLCBzbyBib3RoIG1lc3NhZ2VzIHN0YXkgdmlzaWJsZSBpbiBhIHNpbmdsZSBub3RpY2Ug4oCUIGZvciBhXG4gICAqIHJ1bm5pbmcgYWNjb3VudCBvZiBhbiBvcGVyYXRpb24uIFRoZSBjb3VudGRvd24gcmVzdGFydHMsIHNvIGFuIGFwcGVuZGVkIG1lc3NhZ2UgaXMgcmVhZGFibGUgZm9yIGFcbiAgICogZnVsbCBkdXJhdGlvbiByYXRoZXIgdGhhbiBpbmhlcml0aW5nIHRoZSByZW1haW5zIG9mIHRoZSBjdXJyZW50IG9uZS5cbiAgICpcbiAgICogRmFsbHMgYmFjayB0byB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlfSB3aGVuIHRoZXJlIGlzIG5vIGN1cnJlbnQgbm90aWNlIG9uIHNjcmVlbiAoaXQgd2FzXG4gICAqIG5ldmVyIHNob3duLCBvciBpdCBoYXMgc2luY2UgYmVlbiBkaXNtaXNzZWQpLlxuICAgKi9cbiAgQXBwZW5kID0gJ2FwcGVuZCcsXG5cbiAgLyoqXG4gICAqIEhpZGVzIHRoZSBjdXJyZW50IG5vdGljZSBhbmQgc2hvd3MgdGhpcyBvbmUgaW4gaXRzIHBsYWNlLCBzbyBvbmx5IHRoZSBsYXRlc3QgbWVzc2FnZSBpcyBvbiBzY3JlZW4uXG4gICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQsIGFuZCB0aGUgcmVhc29uIHRoZSBzbG90IGV4aXN0cy5cbiAgICovXG4gIFJlcGxhY2UgPSAncmVwbGFjZScsXG5cbiAgLyoqXG4gICAqIFNob3dzIHRoZSBtZXNzYWdlIGFzIGl0cyBvd24gbm90aWNlLCBsZWF2aW5nIHRoZSBjdXJyZW50IG9uZSBhbG9uZTogYm90aCBhcmUgb24gc2NyZWVuLCBwaWxlZCB1cFxuICAgKiBsaWtlIHBsYWluIGBuZXcgTm90aWNlKC4uLilgIGNhbGxzLiBBIHNlcGFyYXRlIG5vdGljZSBuZXZlciByZXBsYWNlcywgYW5kIGlzIG5ldmVyIHJlcGxhY2VkIGJ5LCBhXG4gICAqIHNsb3Qgbm90aWNlOyBhbnkgbnVtYmVyIG9mIHRoZW0gY29leGlzdC4gVGhleSBhcmUgc3RpbGwgaGlkZGVuIHRvZ2V0aGVyIG9uIHVubG9hZC5cbiAgICovXG4gIFNlcGFyYXRlID0gJ3NlcGFyYXRlJ1xufVxuXG4vKipcbiAqIFRoZSBldmVudCBwYXNzZWQgdG8ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uQ2xvc2VDbGlja30gd2hlbiB0aGUgbm90aWNlJ3NcbiAqIGNsb3NlIChYKSBidXR0b24gaXMgY2xpY2tlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Ob3RpY2VDbG9zZUNsaWNrRXZlbnQge1xuICAvKipcbiAgICogQ2FuY2VscyB0aGUgY2xvc2UsIGxlYXZpbmcgdGhlIG5vdGljZSBvcGVuLlxuICAgKi9cbiAgY2FuY2VsOiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIEEgaGFuZGxlIHRvIGEgZGVsYXllZCBub3RpY2UgY3JlYXRlZCBieSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2VBZnRlckRlbGF5fS4gSXQgaXMgYVxuICoge0BsaW5rIERpc3Bvc2FibGV9IChzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIGB1c2luZ2ApIHRoYXQgYWxzbyBsZXRzIHRoZSBjb250ZW50IGJlIHVwZGF0ZWQgd2hpbGUgdGhlXG4gKiBub3RpY2UgaXMgc2hvd24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50RGVsYXllZE5vdGljZSBleHRlbmRzIERpc3Bvc2FibGUge1xuICAvKipcbiAgICogUmVwbGFjZXMgdGhpcyBoYW5kbGUncyBtZXNzYWdlLCByZS1hcHBseWluZyB0aGUgcGx1Z2luLW5hbWUgcHJlZml4LCB0aGUgaW50ZXJhY3RpdmUtY2xpY2sgZ3VhcmQsIGFuZFxuICAgKiB0aGUgQ2FuY2VsIGJ1dHRvbi4gVXNlZnVsIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MuIElmIHRoZSBkZWxheSBoYXMgbm90IGVsYXBzZWQgeWV0LCB0aGUgbmV3IGNvbnRlbnRcbiAgICogYmVjb21lcyB3aGF0IGlzIHNob3duIG9uY2UgaXQgZG9lcy5cbiAgICpcbiAgICogT25seSB0aGlzIGhhbmRsZSdzIG93biBtZXNzYWdlIGlzIHJld3JpdHRlbjogd2hlbiB0aGUgbm90aWNlIHdhcyBqb2luZWQgcmF0aGVyIHRoYW4gb3BlbmVkIChzZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zLm1vZGV9KSwgdGhlIG1lc3NhZ2VzIGFscmVhZHkgaW4gaXQgYXJlIGxlZnRcbiAgICogYWxvbmUuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZW50IC0gVGhlIG5ldyBub3RpY2UgY29udGVudC5cbiAgICovXG4gIHNldENvbnRlbnQ6IChjb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZUFmdGVyRGVsYXl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zIHtcbiAgLyoqXG4gICAqIFdoZW4gcHJvdmlkZWQsIGEgQ2FuY2VsIGJ1dHRvbiBpcyBhcHBlbmRlZCB0byB0aGUgbm90aWNlOyBjbGlja2luZyBpdCBhYm9ydHMgdGhpcyBjb250cm9sbGVyLiBXaGVuXG4gICAqIG9taXR0ZWQsIG5vIENhbmNlbCBidXR0b24gaXMgc2hvd24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydENvbnRyb2xsZXI/OiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IG9mIHRoZSBDYW5jZWwgYnV0dG9uIHNob3duIHdoZW4ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zLmFib3J0Q29udHJvbGxlcn1cbiAgICogaXMgcHJvdmlkZWQuIFdoZW4gb21pdHRlZCwgdGhlIGxvY2FsaXplZCBgQ2FuY2VsYCBsYWJlbCBpcyB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FuY2VsQnV0dG9uVGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGljZSBjb250ZW50LCByZXNvbHZlZCBsYXppbHkgb25seSBpZiB0aGUgZGVsYXkgZWxhcHNlcyDigJQgc28gYW4gb3BlcmF0aW9uIHRoYXQgZmluaXNoZXNcbiAgICogc29vbmVyIG5ldmVyIGJ1aWxkcyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IFZhbHVlUHJvdmlkZXI8RG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoZSBvcGVyYXRpb24gbXVzdCBydW4gYmVmb3JlIHRoZSBub3RpY2UgaXMgc2hvd24uIE9wZXJhdGlvbnMgdGhhdCBmaW5pc2ggc29vbmVyIG5ldmVyXG4gICAqIHNob3cgYSBub3RpY2UsIGF2b2lkaW5nIGEgZGlzdHJhY3RpbmcgZmxhc2guXG4gICAqXG4gICAqIEBkZWZhdWx0IGA1MDBgXG4gICAqL1xuICByZWFkb25seSBkZWxheUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhpcyBub3RpY2UgcmVsYXRlcyB0byB0aGUgcGx1Z2luJ3MgY3VycmVudCBub3RpY2Ug4oCUIHNlZSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZX0uXG4gICAqXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlfSBpcyB3b3J0aCBjb25zaWRlcmluZyBmb3IgYSBsb25nIG9wZXJhdGlvbjogb24gdGhlIGRlZmF1bHRcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZX0gdGhlIHByb2dyZXNzIG5vdGljZSB0YWtlcyB0aGUgc2hhcmVkIHNsb3QsIHNvIGFueSBvcmRpbmFyeSBub3RpY2VcbiAgICogcmFpc2VkIHdoaWxlIHRoZSBvcGVyYXRpb24gcnVucyBoaWRlcyBpdCwgYW5kIHRoZSBwcm9ncmVzcyB0aGUgdXNlciB3YXMgd2F0Y2hpbmcgZG9lcyBub3QgY29tZSBiYWNrLlxuICAgKlxuICAgKiBXaGljaGV2ZXIgbW9kZSBpcyB1c2VkLCB0aGUgcmV0dXJuZWQgaGFuZGxlIG93bnMgb25seSBJVFMgbWVzc2FnZTogdXBkYXRpbmcgdGhlIGNvbnRlbnQgcmV3cml0ZXNcbiAgICogdGhhdCBtZXNzYWdlIGFsb25lLCBhbmQgZGlzcG9zaW5nIHRha2VzIGF3YXkgb25seSB0aGF0IG1lc3NhZ2Ugd2hlbiB0aGUgbm90aWNlIHdhcyBhbHJlYWR5IG9uXG4gICAqIHNjcmVlbiAoYSBub3RpY2UgdGhpcyBoYW5kbGUgb3BlbmVkIGlzIGhpZGRlbiBhcyBhIHdob2xlKS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZX1cbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBQbHVnaW5Ob3RpY2VNb2RlO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgbm90aWNlIHNob3VsZCBzdGF5IHVudGlsIGl0IGlzIHJlcGxhY2VkLCB0aGUgcGx1Z2luIGlzIHJlbG9hZGVkLCBvciB0aGUgdXNlciBkaXNtaXNzZXMgaXQuXG4gICAqXG4gICAqIEEgcGVybWFuZW50IG5vdGljZSBpcyBzaG93biB3aXRoIGFuIGluZmluaXRlIGR1cmF0aW9uIGFuZCBpcyBub3QgaGlkZGVuIHdoZW4gdGhlIGNvbXBvbmVudCB1bmxvYWRzLCBzbyBpdCBjYW5cbiAgICogY29tbXVuaWNhdGUgc3RhdGUgdGhhdCBvdXRsaXZlcyB0aGUgcGx1Z2luIChlLmcuIGEgY2xlYW51cCB0aGF0IHJlcXVpcmVzIGEgcmVsb2FkKS4gVGhlcmUgaXMgYXQgbW9zdCBvbmUgcGVybWFuZW50XG4gICAqIG5vdGljZSBwZXIgcGx1Z2luOiBpdCBpcyBoaWRkZW4gYnkgdGhlIG5leHQge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlfSBjYWxsIGFuZCBkaXNtaXNzZWRcbiAgICogYXV0b21hdGljYWxseSB0aGUgbmV4dCB0aW1lIHRoZSBjb21wb25lbnQgbG9hZHMgKGkuZS4gd2hlbiB0aGUgcGx1Z2luIGlzIHJlLWVuYWJsZWQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc1Blcm1hbmVudD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhvdyB0aGlzIG5vdGljZSByZWxhdGVzIHRvIHRoZSBwbHVnaW4ncyBjdXJyZW50IG5vdGljZSDigJQgc2VlIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlfS5cbiAgICpcbiAgICogQSBwZXJtYW5lbnQgbm90aWNlIGNhbm5vdCBiZSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gKGl0IG5lZWRzIHRoZSBzaGFyZWQgc2xvdCBpdCBpc1xuICAgKiB0cmFja2VkIGluKSwgYW5kIGEgbm90aWNlIHRoYXQgZG9lcyBub3QgaGlkZSBvbiBjbGljayBtdXN0IGJlXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlfSAoc28gYSBsYXRlciBub3RpY2UgbmV2ZXIgc2lsZW50bHkgcmVwbGFjZXMgaXQpOyBlaXRoZXJcbiAgICogY29udHJhZGljdGlvbiB0aHJvd3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlJlcGxhY2V9LCBvciB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gd2hlblxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkSGlkZU9uQ2xpY2t9IGlzIGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBQbHVnaW5Ob3RpY2VNb2RlO1xuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGNsb3NlIChYKSBidXR0b24sIGJlZm9yZSB0aGUgbm90aWNlIGlzIGhpZGRlbi4gQ2FsbFxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50LmNhbmNlbH0gb24gdGhlIGV2ZW50IHRvIGNhbmNlbCB0aGUgY2xvc2UgYW5kIGtlZXAgdGhlIG5vdGljZVxuICAgKiBvcGVuIOKAlCBmb3IgZXhhbXBsZSBhZnRlciB5b3VyIG93biBjb25maXJtYXRpb24gZGVjbGluZXMuIEFuIGFzeW5jIGNhbGxiYWNrIGlzIGF3YWl0ZWQgYmVmb3JlIHRoZVxuICAgKiBub3RpY2UgaXMgaGlkZGVuLiBSdW5zIG9ubHkgd2hlbiBhIGNsb3NlIGJ1dHRvbiBpcyBzaG93biAoYm90aFxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkSGlkZU9uQ2xpY2t9IGA9IGZhbHNlYCBhbmRcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZFNob3dDbG9zZUJ1dHRvbn0gYXJlIHNldCkuXG4gICAqL1xuICByZWFkb25seSBvbkNsb3NlQ2xpY2s/OiAoZXZlbnQ6IFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPjtcblxuICAvKipcbiAgICogQSBjYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIG5vdGljZSBpcyBoaWRkZW4g4oCUIHdoZXRoZXIgYnkgdGhlIHVzZXIgY2xvc2luZyBpdCwgYnkgYSBsYXRlciByZXVzYWJsZVxuICAgKiBub3RpY2UgcmVwbGFjaW5nIGl0LCBieSBpdHMgZHVyYXRpb24gZWxhcHNpbmcsIG9yIG9uIGNvbXBvbmVudCB1bmxvYWQuIEl0IHJ1bnMgYXQgbW9zdCBvbmNlIHBlclxuICAgKiBub3RpY2UuIFRoZSB7QGxpbmsgUGx1Z2luTm90aWNlSGlkZUluZm99IGFyZ3VtZW50IGRpc3Rpbmd1aXNoZXMgYSB1c2VyIGNsb3NlICh0aGUgY2xvc2UgYnV0dG9uKSBmcm9tXG4gICAqIGEgcHJvZ3JhbW1hdGljIGhpZGUuIEFuIGFzeW5jIGNhbGxiYWNrIGlzIHJ1biBmaXJlLWFuZC1mb3JnZXQgKGl0cyByZWplY3Rpb24gc3VyZmFjZXMgdGhyb3VnaCB0aGVcbiAgICogYXN5bmMtZXJyb3IgcGlwZWxpbmUpLlxuICAgKi9cbiAgcmVhZG9ubHkgb25IaWRlPzogKGluZm86IFBsdWdpbk5vdGljZUhpZGVJbmZvKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNsaWNraW5nIHRoZSBub3RpY2UgaGlkZXMgaXQuIFdoZW4gYHRydWVgICh0aGUgZGVmYXVsdCksIHRoZSBub3RpY2UgZGlzbWlzc2VzIG9uIGNsaWNrIGxpa2VcbiAgICogYSBub3JtYWwgT2JzaWRpYW4gbm90aWNlLiBXaGVuIGBmYWxzZWAsIHRoZSBub3RpY2UgaXMgaGFyZCB0byBjbG9zZTogaXQgZG9lcyBub3QgZGlzbWlzcyBvbiBhbnkgc3RyYXlcbiAgICogY2xpY2ssIGFuZCBpbnN0ZWFkIHNob3dzIGEgY2xvc2UgKFgpIGJ1dHRvbiB0aGF0IGhpZGVzIGl0IGRpcmVjdGx5IChzZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZFNob3dDbG9zZUJ1dHRvbn0gYW5kXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5vbkNsb3NlQ2xpY2t9KS5cbiAgICpcbiAgICogQSBgc2hvdWxkSGlkZU9uQ2xpY2s6IGZhbHNlYCBub3RpY2UgaXMgc2hvd24gd2l0aCBhbiBpbmZpbml0ZSBkdXJhdGlvbiBhbmQgc3RhbmRzIG9uIGl0cyBvd25cbiAgICogKGltcGxpZXMge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGV9KSwgc28gYSBsYXRlciBub3RpY2UgbmV2ZXIgc2lsZW50bHkgcmVwbGFjZXMgaXQ7IHBhc3NpbmdcbiAgICogYW55IG90aGVyIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5tb2RlfSB0b2dldGhlciB3aXRoIGBzaG91bGRIaWRlT25DbGljazogZmFsc2VgXG4gICAqIHRocm93cy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRIaWRlT25DbGljaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNsb3NlIChYKSBidXR0b24gaXMgc2hvd24gb24gYSBoYXJkLXRvLWNsb3NlIG5vdGljZVxuICAgKiAoe0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZEhpZGVPbkNsaWNrfSBgPSBmYWxzZWApLiBXaGVuIGBmYWxzZWAsIG5vIGNsb3NlXG4gICAqIGJ1dHRvbiBpcyByZW5kZXJlZCBhbmQgdGhlIG5vdGljZSBjYW4gb25seSBiZSBoaWRkZW4gcHJvZ3JhbW1hdGljYWxseS4gSWdub3JlZCB1bmxlc3NcbiAgICogYHNob3VsZEhpZGVPbkNsaWNrYCBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dDbG9zZUJ1dHRvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGVzY3JpYmVzIHdoeSBhIG5vdGljZSB3YXMgaGlkZGVuLCBwYXNzZWQgdG8ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uSGlkZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlSGlkZUluZm8ge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgbm90aWNlIHdhcyBoaWRkZW4gYnkgdGhlIHVzZXIgY2xpY2tpbmcgaXRzIGNsb3NlIChYKSBidXR0b24gc3BlY2lmaWNhbGx5LiBBbHdheXMgaW1wbGllc1xuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlSGlkZUluZm8uaXNVc2VyQWN0aW9ufS5cbiAgICovXG4gIHJlYWRvbmx5IGlzQ2xvc2VCdXR0b25DbGlja2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBub3RpY2Ugd2FzIGhpZGRlbiBieSBhIHVzZXIgYWN0aW9uIOKAlCBjbGlja2luZyB0aGUgY2xvc2UgKFgpIGJ1dHRvbiwgb3IgY2xpY2tpbmcgYVxuICAgKiBkaXNtaXNzaWJsZSBub3RpY2UgdG8gZGlzbWlzcyBpdCDigJQgYXMgb3Bwb3NlZCB0byBwcm9ncmFtbWF0aWNhbGx5IChhIGxhdGVyIHJldXNhYmxlIG5vdGljZSByZXBsYWNpbmdcbiAgICogaXQsIGFuIGV4cGxpY2l0IGBoaWRlKClgLCB0aGUgZHVyYXRpb24gZWxhcHNpbmcsIG9yIGNvbXBvbmVudCB1bmxvYWQpLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNVc2VyQWN0aW9uOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kQ2xvc2VCdXR0b25QYXJhbXMge1xuICByZWFkb25seSBjb250ZW50RWw6IEhUTUxFbGVtZW50O1xuICByZWFkb25seSBnZXROb3RpY2U6ICgpID0+IE5vdGljZSB8IG51bGw7XG4gIHJlYWRvbmx5IG9uQ2xvc2VDbGljaz86IChldmVudDogUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50KSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kVG9DdXJyZW50Tm90aWNlUGFyYW1zIHtcbiAgcmVhZG9ubHkgZHVyYXRpb25Jbk1pbGxpc2Vjb25kczogbnVsbCB8IG51bWJlcjtcbiAgcmVhZG9ubHkgbWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbiAgcmVhZG9ubHkgb25IaWRlPzogKGluZm86IFBsdWdpbk5vdGljZUhpZGVJbmZvKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuICByZWFkb25seSBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGREZWxheWVkTm90aWNlTWVzc2FnZVBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcbiAgcmVhZG9ubHkgY2FuY2VsQnV0dG9uVGV4dD86IHN0cmluZztcbiAgcmVhZG9ubHkgY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgbm90aWNlIHRoaXMgY29udGVudCBiZWxvbmdzIHRvLCB1c2VkIGJ5IHRoZSBjbG9zZSBidXR0b24ncyBoYW5kbGVyLiBUaGUgbm90aWNlIGRvZXNcbiAgICogbm90IGV4aXN0IHlldCB3aGVuIHRoZSBjb250ZW50IGlzIGJ1aWx0LCBzbyBpdCBpcyByZXNvbHZlZCBsYXppbHkgYXQgY2xpY2sgdGltZS4gUmVxdWlyZWQgd2hlbiBhXG4gICAqIGNsb3NlIGJ1dHRvbiBpcyBzaG93bi5cbiAgICovXG4gIHJlYWRvbmx5IGdldE5vdGljZT86ICgpID0+IE5vdGljZSB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgYWZ0ZXIgdGhlIHBsdWdpbiBuYW1lIHByZWZpeC5cbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgY2xvc2UgYnV0dG9uIGlzIGNsaWNrZWQ7IG1heSBjYW5jZWwgdGhlIGNsb3NlLiBTZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uQ2xvc2VDbGlja30uXG4gICAqL1xuICByZWFkb25seSBvbkNsb3NlQ2xpY2s/OiAoZXZlbnQ6IFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbm90aWNlIGlzIGhhcmQgdG8gY2xvc2U6IHN0b3BzIGV2ZXJ5IGNsaWNrIGZyb20gZGlzbWlzc2luZyBpdCBhbmQsIHVubGVzcyBzdXBwcmVzc2VkIGJ5XG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZE5vdGljZUNvbnRlbnRQYXJhbXMuc2hvdWxkU2hvd0Nsb3NlQnV0dG9ufSwgYWRkcyBhIGNsb3NlIGJ1dHRvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZXNFeHBsaWNpdENsb3NlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbWVzc2FnZSBpcyBwcmVmaXhlZCB3aXRoIHRoZSBwbHVnaW4gbmFtZS4gT25seSBhIG1lc3NhZ2UgdGhhdCBvcGVucyBhIG5vdGljZSBpc1xuICAgKiBwcmVmaXhlZDsgYSBtZXNzYWdlIGFwcGVuZGVkIHRvIG9uZSBhbHJlYWR5IHNob3dpbmcgaXQgaXMgbm90LCBzbyB0aGUgbmFtZSBpcyBub3QgcmVwZWF0ZWQgb24gZXZlcnlcbiAgICogbGluZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuZGVyIHRoZSBjbG9zZSBidXR0b24gd2hlbiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGROb3RpY2VDb250ZW50UGFyYW1zLnJlcXVpcmVzRXhwbGljaXRDbG9zZX0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGJ1aWx0IG1lc3NhZ2U6IHRoZSB3cmFwcGVyIGVsZW1lbnQgaG9sZGluZyBpdCwgYW5kIHRoZSBmcmFnbWVudCB0aGF0IGVsZW1lbnQgc2l0cyBpbi5cbiAqXG4gKiBUaGUgZWxlbWVudCBpcyBoYW5kZWQgYmFjayBiZWNhdXNlIGEgbm90aWNlIGNhbiBob2xkIHNldmVyYWwgb2YgdGhlbSAoc2VlIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLkFwcGVuZH0pLFxuICogc28gd2hvZXZlciBvd25zIG9uZSBtZXNzYWdlIGhhcyB0byBiZSBhYmxlIHRvIHVwZGF0ZSBvciByZW1vdmUgZXhhY3RseSB0aGF0IG1lc3NhZ2UuIFRoZSByZWZlcmVuY2VcbiAqIHN0YXlzIHZhbGlkIG9uY2UgdGhlIGZyYWdtZW50IGlzIGhhbmRlZCB0byBgTm90aWNlYDogYXBwZW5kaW5nIGEgZnJhZ21lbnQgbW92ZXMgaXRzIGNoaWxkcmVuIHJhdGhlclxuICogdGhhbiBjb3B5aW5nIHRoZW0uXG4gKi9cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnROb3RpY2VDb250ZW50IHtcbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHdyYXBwaW5nIHRoaXMgbWVzc2FnZSBhbG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnRFbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBmcmFnbWVudCBob2xkaW5nIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnROb3RpY2VDb250ZW50LmNvbnRlbnRFbH0sIHJlYWR5IHRvIGhhbmQgdG8gYE5vdGljZWBcbiAgICogb3IgdG8gYXBwZW5kIGludG8gb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQ7XG59XG5cbi8qKlxuICogQSBtZXNzYWdlIHRoYXQgaGFzIGJlZW4gcHV0IG9uIHNjcmVlbiwgYW5kIHdoZXJlIGl0IGVuZGVkIHVwLlxuICovXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2Uge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgaG9sZGluZyB0aGlzIG1lc3NhZ2UgYWxvbmUsIGluc2lkZSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2Uubm90aWNlfS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnRFbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBtZXNzYWdlIGNyZWF0ZWQgdGhlIG5vdGljZSwgYXMgb3Bwb3NlZCB0byBqb2luaW5nIG9uZSB0aGF0IHdhcyBhbHJlYWR5IG9uIHNjcmVlbi5cbiAgICogT25seSB0aGUgY3JlYXRvciBtYXkgaGlkZSBpdDsgYSBqb2luZWQgbWVzc2FnZSBjYW4gbWVyZWx5IHJlbW92ZSBpdHNlbGYuXG4gICAqL1xuICByZWFkb25seSBpc05vdGljZU93bmVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90aWNlIHRoZSBtZXNzYWdlIGlzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgbm90aWNlOiBOb3RpY2U7XG59XG5cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlV2l0aER1cmF0aW9uUGFyYW1zIHtcbiAgcmVhZG9ubHkgZHVyYXRpb25Jbk1pbGxpc2Vjb25kczogbnVsbCB8IG51bWJlcjtcbiAgcmVhZG9ubHkgbWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kZTogUGx1Z2luTm90aWNlTW9kZTtcbiAgcmVhZG9ubHkgb25DbG9zZUNsaWNrOiAoKGV2ZW50OiBQbHVnaW5Ob3RpY2VDbG9zZUNsaWNrRXZlbnQpID0+IFByb21pc2FibGU8dm9pZD4pIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBvbkhpZGU6ICgoaW5mbzogUGx1Z2luTm90aWNlSGlkZUluZm8pID0+IFByb21pc2FibGU8dm9pZD4pIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSByZXF1aXJlc0V4cGxpY2l0Q2xvc2U6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFNob3dDbG9zZUJ1dHRvbjogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBNYW5hZ2VzIHNob3dpbmcgcGx1Z2luIG5vdGljZXMuIEJ5IGRlZmF1bHQgYSBuZXcgbm90aWNlIGhpZGVzIHRoZSBwcmV2aW91cyBvbmUsIHNvIG9ubHkgdGhlIGxhdGVzdFxuICogbWVzc2FnZSBpcyBvbiBzY3JlZW47IHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5tb2RlfSBjaG9vc2VzIG90aGVyd2lzZSDigJQgc2VlXG4gKiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZX0uXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIG5hbWUgKHNob3duIGFzIHByZWZpeCBpbiBub3RpY2VzKS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjbG9zZUJ1dHRvbkNsaWNrZWROb3RpY2VzID0gbmV3IFdlYWtTZXQ8Tm90aWNlPigpO1xuICBwcml2YXRlIG5vdGljZTogTm90aWNlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucyA9IG5ldyBTZXQ8KCkgPT4gdm9pZD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFuZGFsb25lTm90aWNlcyA9IG5ldyBTZXQ8Tm90aWNlPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJDbGlja2VkTm90aWNlcyA9IG5ldyBXZWFrU2V0PE5vdGljZT4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbHVnaW4gbm90aWNlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnBsdWdpbk5hbWUgPSBwYXJhbXMucGx1Z2luTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNtaXNzZXMgdGhlIHBlcm1hbmVudCBub3RpY2UgbGVmdCBvdmVyIGZyb20gYSBwcmV2aW91cyBsb2FkIChlLmcuIGEgcHJldmlvdXMgcGx1Z2luIHNlc3Npb24pIG9uIGxvYWQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuICAgIGNvbnN0IHBlcm1hbmVudE5vdGljZSA9IHRoaXMuZ2V0UGVybWFuZW50Tm90aWNlKCk7XG4gICAgcGVybWFuZW50Tm90aWNlPy5oaWRlKCk7XG4gICAgdGhpcy5zZXRQZXJtYW5lbnROb3RpY2UobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgdGhlIGN1cnJlbnQgbm90aWNlIG9uIHVubG9hZCwgdW5sZXNzIGl0IGlzIHRoZSBwZXJtYW5lbnQgbm90aWNlICh3aGljaCBpcyBtZWFudCB0byBvdXRsaXZlIHRoZSBwbHVnaW4pLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9udW5sb2FkKCk6IHZvaWQge1xuICAgIC8vIENhbmNlbCBhbnkgZGVsYXllZCBub3RpY2Ugd2hvc2UgdGltZXIgaGFzIG5vdCBmaXJlZCB5ZXQsIHNvIGl0IG5ldmVyIGFwcGVhcnMgYWZ0ZXIgdW5sb2FkLlxuICAgIGZvciAoY29uc3QgY2FuY2VsUGVuZGluZ1RpbWVyIG9mIHNuYXBzaG90KHRoaXMucGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucykpIHtcbiAgICAgIGNhbmNlbFBlbmRpbmdUaW1lcigpO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZXRQZXJtYW5lbnROb3RpY2UoKSAhPT0gdGhpcy5ub3RpY2UpIHtcbiAgICAgIHRoaXMubm90aWNlPy5oaWRlKCk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc3RhbmRhbG9uZU5vdGljZSBvZiB0aGlzLnN0YW5kYWxvbmVOb3RpY2VzKSB7XG4gICAgICBzdGFuZGFsb25lTm90aWNlLmhpZGUoKTtcbiAgICB9XG4gICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXlzIGEgbm90aWNlIG1lc3NhZ2UgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdG8gZGlzcGxheS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgZGlzcGxheWluZyB0aGUgbm90aWNlLlxuICAgKiBAcmV0dXJucyBUaGUgbm90aWNlIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBzaG93Tm90aWNlKG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcsIG9wdGlvbnM/OiBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucyk6IE5vdGljZSB7XG4gICAgY29uc3QgaXNQZXJtYW5lbnQgPSBvcHRpb25zPy5pc1Blcm1hbmVudCA/PyBmYWxzZTtcbiAgICBjb25zdCBzaG91bGRIaWRlT25DbGljayA9IG9wdGlvbnM/LnNob3VsZEhpZGVPbkNsaWNrID8/IHRydWU7XG4gICAgY29uc3QgcmVxdWlyZXNFeHBsaWNpdENsb3NlID0gIXNob3VsZEhpZGVPbkNsaWNrO1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zPy5tb2RlID8/IChyZXF1aXJlc0V4cGxpY2l0Q2xvc2UgPyBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlIDogUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlKTtcblxuICAgIGlmIChvcHRpb25zPy5tb2RlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5tb2RlICE9PSBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlICYmIHJlcXVpcmVzRXhwbGljaXRDbG9zZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIG5vdGljZSB0aGF0IGRvZXMgbm90IGhpZGUgb24gY2xpY2sgbXVzdCBiZSBzaG93biBpbiB0aGUgc2VwYXJhdGUgbW9kZS4nKTtcbiAgICB9XG4gICAgaWYgKG1vZGUgPT09IFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGUgJiYgaXNQZXJtYW5lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBwZXJtYW5lbnQgbm90aWNlIGNhbm5vdCBiZSBzaG93biBpbiB0aGUgc2VwYXJhdGUgbW9kZS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBkdXJhdGlvbkluTWlsbGlzZWNvbmRzID0gaXNQZXJtYW5lbnQgfHwgcmVxdWlyZXNFeHBsaWNpdENsb3NlID8gUEVSTUFORU5UX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMgOiBudWxsO1xuICAgIHJldHVybiB0aGlzLnNob3dOb3RpY2VXaXRoRHVyYXRpb24oe1xuICAgICAgZHVyYXRpb25Jbk1pbGxpc2Vjb25kcyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBtb2RlLFxuICAgICAgb25DbG9zZUNsaWNrOiBvcHRpb25zPy5vbkNsb3NlQ2xpY2ssXG4gICAgICBvbkhpZGU6IG9wdGlvbnM/Lm9uSGlkZSxcbiAgICAgIHJlcXVpcmVzRXhwbGljaXRDbG9zZSxcbiAgICAgIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQ6IGlzUGVybWFuZW50LFxuICAgICAgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uOiBvcHRpb25zPy5zaG91bGRTaG93Q2xvc2VCdXR0b24gPz8gdHJ1ZVxuICAgIH0pLm5vdGljZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG5vdGljZSBkZXNjcmliaW5nIGEgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiwgYnV0IG9ubHkgb25jZSB0aGUgb3BlcmF0aW9uIGhhcyBydW4gZm9yIGxvbmdlclxuICAgKiB0aGFuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5kZWxheUluTWlsbGlzZWNvbmRzfSDigJQgc28gb3BlcmF0aW9uc1xuICAgKiB0aGF0IGZpbmlzaCBzb29uZXIgbmV2ZXIgZmxhc2ggYSBub3RpY2UuIFRoZSBub3RpY2Ugc3RheXMgdW50aWwgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSBpc1xuICAgKiBkaXNwb3NlZCAod2hpY2ggYWxzbyBjYW5jZWxzIHRoZSBwZW5kaW5nIHRpbWVyIGlmIGl0IGhhcyBub3QgZmlyZWQgeWV0KSwgc28gaXQgY2FuIGJlIHVzZWQgd2l0aFxuICAgKiBgdXNpbmdgLiBXaGVuIGFuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9IGlzIGdpdmVuLCBhXG4gICAqIENhbmNlbCBidXR0b24gdGhhdCBhYm9ydHMgaXQgaXMgYXBwZW5kZWQgKGFuZCwgYmVpbmcgaW50ZXJhY3RpdmUsIGRvZXMgbm90IGRpc21pc3MgdGhlIG5vdGljZSkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIHVzaW5nIF9ub3RpY2UgPSBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZUFmdGVyRGVsYXkoe1xuICAgKiAgIGFib3J0Q29udHJvbGxlcixcbiAgICogICBjb250ZW50OiAoKSA9PiBidWlsZFByb2dyZXNzRnJhZ21lbnQoKVxuICAgKiB9KTtcbiAgICogYXdhaXQgcnVuT3BlcmF0aW9uKGFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnREZWxheWVkTm90aWNlfSB0aGF0IGhpZGVzIHRoZSBub3RpY2UgKG9yIGNhbmNlbHMgdGhlIHBlbmRpbmdcbiAgICogdGltZXIpIHdoZW4gZGlzcG9zZWQgYW5kIGxldHMgdGhlIGNvbnRlbnQgYmUgdXBkYXRlZCB3aGlsZSBpdCBpcyBzaG93bi5cbiAgICovXG4gIHB1YmxpYyBzaG93Tm90aWNlQWZ0ZXJEZWxheShwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zKTogUGx1Z2luTm90aWNlQ29tcG9uZW50RGVsYXllZE5vdGljZSB7XG4gICAgY29uc3QgbW9kZSA9IHBhcmFtcy5tb2RlID8/IFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZTtcbiAgICAvLyBXaGVyZSB0aGlzIG1lc3NhZ2UgZW5kZWQgdXA6IGEgbm90aWNlIG9mIGl0cyBvd24sIG9yIGEgY2h1bmsgaW5zaWRlIG9uZSB0aGF0IHdhcyBhbHJlYWR5IHVwLiBJdFxuICAgIC8vIGRlY2lkZXMgd2hhdCBgc2V0Q29udGVudGAgcmV3cml0ZXMgYW5kIHdoYXQgZGlzcG9zaW5nIHRha2VzIGF3YXkuXG4gICAgbGV0IHNob3duOiBudWxsIHwgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2UgPSBudWxsO1xuICAgIGxldCBpc0Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgbGV0IHRpbWVySWQgPSAwO1xuICAgIGxldCBjdXJyZW50Q29udGVudDogVmFsdWVQcm92aWRlcjxEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nPiA9IHBhcmFtcy5jb250ZW50O1xuXG4gICAgY29uc3QgY2FuY2VsUGVuZGluZ1RpbWVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgIHRoaXMucGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucy5kZWxldGUoY2FuY2VsUGVuZGluZ1RpbWVyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYnVpbGREZWxheWVkTWVzc2FnZSA9IChjb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCA9PlxuICAgICAgdGhpcy5idWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlUGFyYW1zPih7XG4gICAgICAgIGFib3J0Q29udHJvbGxlcjogcGFyYW1zLmFib3J0Q29udHJvbGxlcixcbiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogcGFyYW1zLmNhbmNlbEJ1dHRvblRleHQsXG4gICAgICAgIGNvbnRlbnRcbiAgICAgIH0pKTtcblxuICAgIHRpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjYW5jZWxQZW5kaW5nVGltZXIoKTtcbiAgICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gUmVzb2x2aW5nIHRoZSBjb250ZW50IGlzIGFzeW5jaHJvbm91cywgYW5kIHRoZSBvcGVyYXRpb24gdGhlIG5vdGljZSBkZXNjcmliZXMga2VlcHMgcnVubmluZ1xuICAgICAgICAvLyB3aGlsZSBpdCBoYXBwZW5zIOKAlCBzbyBgc2V0Q29udGVudGAgY2FuIGxhbmQgaW4gYmV0d2Vlbi4gSXQgY2Fubm90IHJld3JpdGUgYSBub3RpY2UgdGhhdCBkb2VzXG4gICAgICAgIC8vIG5vdCBleGlzdCB5ZXQsIHNvIHJlc29sdmUgYWdhaW4gd2hlbmV2ZXIgdGhhdCBoYXBwZW5zOiB0aGUgbm90aWNlIG11c3Qgb3BlbiB3aXRoIHRoZSBtZXNzYWdlXG4gICAgICAgIC8vIHRoZSBjYWxsZXIgbGFzdCBhc2tlZCBmb3IsIG5vdCB0aGUgb25lIHRoYXQgd2FzIGN1cnJlbnQgd2hlbiByZXNvbHV0aW9uIHN0YXJ0ZWQuXG4gICAgICAgIGxldCByZXF1ZXN0ZWRDb250ZW50OiBWYWx1ZVByb3ZpZGVyPERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc+O1xuICAgICAgICBsZXQgcmVzb2x2ZWRDb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgcmVxdWVzdGVkQ29udGVudCA9IGN1cnJlbnRDb250ZW50O1xuICAgICAgICAgIHJlc29sdmVkQ29udGVudCA9IGF3YWl0IHJlc29sdmVWYWx1ZShyZXF1ZXN0ZWRDb250ZW50LCB7fSk7XG4gICAgICAgICAgLy8gVGhlIGhhbmRsZSBtYXkgaGF2ZSBiZWVuIGRpc3Bvc2VkIHdoaWxlIHRoZSBjb250ZW50IHdhcyBiZWluZyByZXNvbHZlZDsgZG9uJ3Qgc2hvdyBhIHN0YWxlIG5vdGljZS5cbiAgICAgICAgICBpZiAoaXNEaXNwb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAocmVxdWVzdGVkQ29udGVudCAhPT0gY3VycmVudENvbnRlbnQpO1xuXG4gICAgICAgIHNob3duID0gdGhpcy5zaG93Tm90aWNlV2l0aER1cmF0aW9uKHtcbiAgICAgICAgICBkdXJhdGlvbkluTWlsbGlzZWNvbmRzOiBQRVJNQU5FTlRfTk9USUNFX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICBtZXNzYWdlOiBidWlsZERlbGF5ZWRNZXNzYWdlKHJlc29sdmVkQ29udGVudCksXG4gICAgICAgICAgbW9kZSxcbiAgICAgICAgICBvbkNsb3NlQ2xpY2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICBvbkhpZGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICByZXF1aXJlc0V4cGxpY2l0Q2xvc2U6IGZhbHNlLFxuICAgICAgICAgIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQ6IGZhbHNlLFxuICAgICAgICAgIHNob3VsZFNob3dDbG9zZUJ1dHRvbjogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sIHBhcmFtcy5kZWxheUluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfREVMQVlfQkVGT1JFX1NIT1dfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIHRoaXMucGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucy5hZGQoY2FuY2VsUGVuZGluZ1RpbWVyKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZXRDb250ZW50OiAoY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICBjdXJyZW50Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIGlmICghc2hvd24pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3dhcHMgVEhJUyBtZXNzYWdlJ3MgZWxlbWVudCBmb3IgYSBmcmVzaGx5IGJ1aWx0IG9uZSwgcmF0aGVyIHRoYW4gcmV3cml0aW5nIHRoZSB3aG9sZSBub3RpY2U6XG4gICAgICAgIC8vIFdoZW4gdGhlIGhhbmRsZSBqb2luZWQgYSBub3RpY2UgdGhhdCB3YXMgYWxyZWFkeSB1cCwgdGhlIG90aGVyIG1lc3NhZ2VzIGluIGl0IGFyZSBub3QgaXRzIHRvXG4gICAgICAgIC8vIG92ZXJ3cml0ZS4gUmVidWlsZGluZyBhbHNvIHJlLWFwcGxpZXMgdGhlIHByZWZpeCwgdGhlIGludGVyYWN0aXZlIGd1YXJkLCBhbmQgdGhlIENhbmNlbCBidXR0b24uXG4gICAgICAgIGNvbnN0IHJlYnVpbHQgPSB0aGlzLmJ1aWxkTm90aWNlQ29udGVudCh7XG4gICAgICAgICAgbWVzc2FnZTogYnVpbGREZWxheWVkTWVzc2FnZShjb250ZW50KSxcbiAgICAgICAgICBzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZTogc2hvd24uaXNOb3RpY2VPd25lZFxuICAgICAgICB9KTtcbiAgICAgICAgc2hvd24uY29udGVudEVsLnJlcGxhY2VXaXRoKHJlYnVpbHQuZnJhZ21lbnQpO1xuICAgICAgICBzaG93biA9IHsgLi4uc2hvd24sIGNvbnRlbnRFbDogcmVidWlsdC5jb250ZW50RWwgfTtcbiAgICAgIH0sXG4gICAgICBbU3ltYm9sLmRpc3Bvc2VdOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlzRGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICBjYW5jZWxQZW5kaW5nVGltZXIoKTtcbiAgICAgICAgaWYgKCFzaG93bikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBIG5vdGljZSB0aGlzIGhhbmRsZSBvcGVuZWQgZ29lcyBhd2F5IHdpdGggaXQ7IGEgbm90aWNlIGl0IG1lcmVseSBqb2luZWQgYmVsb25ncyB0byB3aG9ldmVyXG4gICAgICAgIC8vIG9wZW5lZCBpdCwgc28gb25seSB0aGlzIG1lc3NhZ2UgaXMgdGFrZW4gb3V0IG9mIGl0LlxuICAgICAgICBpZiAoc2hvd24uaXNOb3RpY2VPd25lZCkge1xuICAgICAgICAgIHNob3duLm5vdGljZS5oaWRlKCk7XG4gICAgICAgICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5kZWxldGUoc2hvd24ubm90aWNlKTtcbiAgICAgICAgICBpZiAodGhpcy5ub3RpY2UgPT09IHNob3duLm5vdGljZSkge1xuICAgICAgICAgICAgdGhpcy5ub3RpY2UgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93bi5jb250ZW50RWwucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBjbG9zZSAoWCkgYnV0dG9uIHRvIHRoZSBub3RpY2UgY29udGVudC4gQ2xpY2tpbmcgaXQgZmlyZXNcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudEFwcGVuZENsb3NlQnV0dG9uUGFyYW1zLm9uQ2xvc2VDbGlja30gKHdoaWNoIG1heSBjYW5jZWwgdGhlIGNsb3NlKTsgaWZcbiAgICogbm90IGNhbmNlbGxlZCwgaXQgaGlkZXMgdGhlIG5vdGljZSBhbmQgZHJvcHMgaXQgZnJvbSB0aGUgc3RhbmRhbG9uZS1ub3RpY2UgdHJhY2tpbmcgc2V0LiBUaGUgaGlkZSBpc1xuICAgKiBtYXJrZWQgYXMgYSBjbG9zZS1idXR0b24gY2xpY2sgc28ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uSGlkZX0gY2FuXG4gICAqIGRpc3Rpbmd1aXNoIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwcml2YXRlIGFwcGVuZENsb3NlQnV0dG9uKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kQ2xvc2VCdXR0b25QYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IGNvbnRlbnRFbCwgZ2V0Tm90aWNlLCBvbkNsb3NlQ2xpY2sgfSA9IHBhcmFtcztcbiAgICBjb25zdCBjbG9zZUJ1dHRvbkVsID0gY29udGVudEVsLmNyZWF0ZUVsKCdidXR0b24nLCB7XG4gICAgICBhdHRyOiB7ICdhcmlhLWxhYmVsJzogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLm5vdGljZXMuY2xvc2VBcmlhTGFiZWwpIH1cbiAgICB9KTtcbiAgICAvLyBSZXVzZSBPYnNpZGlhbidzIG1vZGFsIGNsb3NlLWJ1dHRvbiBjbGFzc2VzIHNvIHRoaXMgYnV0dG9uIG1hdGNoZXMgdGhlIG5hdGl2ZSBtb2RhbCBjbG9zZSBidXR0b25cbiAgICAvLyAobG9vayBhbmQgaG92ZXIpOyB0aGUgc3R5bGVzaGVldCBvbmx5IHBvc2l0aW9ucyBpdCBpbiB0aGUgbm90aWNlIGNvcm5lci5cbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGNsb3NlQnV0dG9uRWwsIENzc0NsYXNzLlBsdWdpbk5vdGljZUNsb3NlQnV0dG9uKTtcbiAgICBjbG9zZUJ1dHRvbkVsLmFkZENsYXNzZXMoW0Nzc0NsYXNzLkNsaWNrYWJsZUljb24sIENzc0NsYXNzLk1vZGFsSGVhZGVyQnV0dG9uXSk7XG4gICAgc2V0SWNvbihjbG9zZUJ1dHRvbkVsLCAneCcpO1xuICAgIGNsb3NlQnV0dG9uRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpbnZva2VBc3luY1NhZmVseShhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBpc0NhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgICBhd2FpdCBvbkNsb3NlQ2xpY2s/Lih7XG4gICAgICAgICAgY2FuY2VsOiAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gQ2FuIGJlIGNhbmNlbGxlZCBieSB0aGUgdXNlci5cbiAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vdGljZSA9IGVuc3VyZU5vbk51bGxhYmxlKGdldE5vdGljZSgpKTtcbiAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbkNsaWNrZWROb3RpY2VzLmFkZChub3RpY2UpO1xuICAgICAgICBub3RpY2UuaGlkZSgpO1xuICAgICAgICB0aGlzLnN0YW5kYWxvbmVOb3RpY2VzLmRlbGV0ZShub3RpY2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG1lc3NhZ2UgdG8gdGhlIG5vdGljZSBjdXJyZW50bHkgaW4gdGhlIHBlci1wbHVnaW4gc2xvdCwgc28gYm90aCBtZXNzYWdlcyBzdGF5IG9uIHNjcmVlbiBpbiBhXG4gICAqIHNpbmdsZSBub3RpY2UuXG4gICAqXG4gICAqIFRoZSBhcHBlbmRlZCBtZXNzYWdlIGNhcnJpZXMgbm8gcGx1Z2luLW5hbWUgcHJlZml4IOKAlCB0aGUgbm90aWNlIGFscmVhZHkgb3BlbnMgd2l0aCBvbmUsIGFuZFxuICAgKiByZXBlYXRpbmcgaXQgb24gZXZlcnkgbGluZSByZWFkcyBhcyBub2lzZS4gSXQgaXMgd3JhcHBlZCBsaWtlIGFueSBvdGhlciBub3RpY2UgY29udGVudCwgc28gYSBsaW5rIG9yXG4gICAqIGJ1dHRvbiBpbnNpZGUgaXQgc3RpbGwga2VlcHMgdGhlIG5vdGljZSBvcGVuIHdoZW4gY2xpY2tlZC5cbiAgICpcbiAgICogQXBwZW5kaW5nIHJlc3RhcnRzIHRoZSBub3RpY2UncyBjb3VudGRvd24gKHtAbGluayBOb3RpY2Uuc2V0QXV0b0hpZGV9KSwgc28gdGhlIG5ldyBtZXNzYWdlIGdldHMgYVxuICAgKiBmdWxsIGR1cmF0aW9uIGluc3RlYWQgb2YgaW5oZXJpdGluZyB3aGF0IHdhcyBsZWZ0IG9mIHRoZSBjdXJyZW50IG9uZSDigJQgYSBsaW5lIGFwcGVuZGVkIGEgbW9tZW50XG4gICAqIGJlZm9yZSB0aGUgbm90aWNlIGV4cGlyZXMgd291bGQgb3RoZXJ3aXNlIGZsYXNoIGFuZCB2YW5pc2guXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93bk5vdGljZX0gZGVzY3JpYmluZyB0aGUgam9pbmVkIG5vdGljZSwgb3IgYG51bGxgIHdoZW5cbiAgICogdGhlcmUgaXMgbm90aGluZyBvbiBzY3JlZW4gdG8gYXBwZW5kIHRvIOKAlCB0aGUgc2xvdCBpcyBlbXB0eSwgb3IgaXRzIG5vdGljZSBoYXMgc2luY2UgYmVlbiBkaXNtaXNzZWRcbiAgICog4oCUIGFuZCB0aGUgY2FsbGVyIHNob3VsZCBzaG93IGEgbmV3IG5vdGljZSBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBlbmRUb0N1cnJlbnROb3RpY2UocGFyYW1zOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRBcHBlbmRUb0N1cnJlbnROb3RpY2VQYXJhbXMpOiBudWxsIHwgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2Uge1xuICAgIGNvbnN0IHsgZHVyYXRpb25Jbk1pbGxpc2Vjb25kcywgbWVzc2FnZSwgb25IaWRlLCBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50IH0gPSBwYXJhbXM7XG4gICAgY29uc3QgY3VycmVudE5vdGljZSA9IHRoaXMubm90aWNlO1xuICAgIC8vIGBpc1Nob3duYCBpcyB0aGUgc2FtZSBjaGVjayBPYnNpZGlhbidzIG93biBgTm90aWNlLmhpZGVgIG1ha2VzIGJlZm9yZSBhbmltYXRpbmcgYSBub3RpY2UgYXdheSwgc29cbiAgICAvLyBpdCBpcyBleGFjdGx5IFwic3RpbGwgb24gc2NyZWVuXCI6IGEgbm90aWNlIHRoYXQgZXhwaXJlZCBvciB3YXMgZGlzbWlzc2VkIGhhcyBiZWVuIGRldGFjaGVkLlxuICAgIGlmICghY3VycmVudE5vdGljZT8uY29udGFpbmVyRWwuaXNTaG93bigpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvbnRlbnRFbCwgZnJhZ21lbnQgfSA9IHRoaXMuYnVpbGROb3RpY2VDb250ZW50KHsgbWVzc2FnZSwgc2hvdWxkUHJlZml4V2l0aFBsdWdpbk5hbWU6IGZhbHNlIH0pO1xuICAgIGN1cnJlbnROb3RpY2UubWVzc2FnZUVsLmFwcGVuZChmcmFnbWVudCk7XG4gICAgLy8gQSBgbnVsbGAgZHVyYXRpb24gbWVhbnMgXCJPYnNpZGlhbidzIG93biBkZWZhdWx0XCIsIHdoaWNoIG9ubHkgdGhlIGNvbnN0cnVjdG9yIGFwcGxpZXMg4oCUIHNvIHJlc3RhcnRcbiAgICAvLyB0aGUgY291bnRkb3duIHdpdGggdGhhdCBzYW1lIGRlZmF1bHQgcmF0aGVyIHRoYW4gbGVhdmluZyB0aGUgY3VycmVudCBvbmUgcnVubmluZy5cbiAgICBjdXJyZW50Tm90aWNlLnNldEF1dG9IaWRlKGR1cmF0aW9uSW5NaWxsaXNlY29uZHMgPz8gT0JTSURJQU5fREVGQVVMVF9OT1RJQ0VfRFVSQVRJT05fSU5fTUlMTElTRUNPTkRTKTtcbiAgICB0aGlzLndpcmVPbkhpZGUoY3VycmVudE5vdGljZSwgb25IaWRlKTtcbiAgICAvLyBPbmx5IGV2ZXIgcmVnaXN0ZXJzLCBuZXZlciBjbGVhcnM6IHRoZSBub3RpY2UgYmVpbmcgYXBwZW5kZWQgdG8gbWF5IGFscmVhZHkgYmUgdGhpcyBwbHVnaW4nc1xuICAgIC8vIHBlcm1hbmVudCBub3RpY2UsIGFuZCBhIGxhdGVyIGFwcGVuZGVkIG1lc3NhZ2UgaXMgbm8gcmVhc29uIHRvIGZvcmdldCB0aGF0LlxuICAgIGlmIChzaG91bGRSZWdpc3RlckFzUGVybWFuZW50KSB7XG4gICAgICB0aGlzLnNldFBlcm1hbmVudE5vdGljZShjdXJyZW50Tm90aWNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29udGVudEVsLCBpc05vdGljZU93bmVkOiBmYWxzZSwgbm90aWNlOiBjdXJyZW50Tm90aWNlIH07XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBtZXNzYWdlIGZvciBhIGRlbGF5ZWQgbm90aWNlOiB0aGUgcmVzb2x2ZWQgY29udGVudCwgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIENhbmNlbFxuICAgKiBidXR0b24gdGhhdCBhYm9ydHMgdGhlIHByb3ZpZGVkIGNvbnRyb2xsZXIgd2hlbiBjbGlja2VkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IGhvbGRpbmcgdGhlIGNvbnRlbnQgYW5kLCBpZiByZXF1ZXN0ZWQsIGEgQ2FuY2VsIGJ1dHRvbi5cbiAgICovXG4gIHByaXZhdGUgYnVpbGREZWxheWVkTm90aWNlTWVzc2FnZShwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkRGVsYXllZE5vdGljZU1lc3NhZ2VQYXJhbXMpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBjb25zdCB7IGFib3J0Q29udHJvbGxlciwgY2FuY2VsQnV0dG9uVGV4dCwgY29udGVudCB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmRUZXh0KGNvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmQoY29udGVudCk7XG4gICAgfVxuXG4gICAgaWYgKGFib3J0Q29udHJvbGxlcikge1xuICAgICAgLy8gYEJ1dHRvbkNvbXBvbmVudGAgcmVxdWlyZXMgYW4gYEhUTUxFbGVtZW50YCBwYXJlbnQsIHNvIGJ1aWxkIGl0IG9uIGEgdGhyb3dhd2F5XG4gICAgICAvLyBkZXRhY2hlZCBlbGVtZW50IGFuZCBtb3ZlIGl0cyBgYnV0dG9uRWxgIGludG8gdGhlIGZyYWdtZW50LlxuICAgICAgY29uc3QgY2FuY2VsQnV0dG9uID0gbmV3IEJ1dHRvbkNvbXBvbmVudChjcmVhdGVEaXYoKSk7XG4gICAgICBjYW5jZWxCdXR0b24uc2V0QnV0dG9uVGV4dChjYW5jZWxCdXR0b25UZXh0ID8/IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5idXR0b25zLmNhbmNlbCkpO1xuICAgICAgYWRkUGx1Z2luQ3NzQ2xhc3NlcyhjYW5jZWxCdXR0b24uYnV0dG9uRWwsIENzc0NsYXNzLkNhbmNlbEJ1dHRvbik7XG4gICAgICAvLyBUaGUgY2xpY2sgaXMgd2lyZWQgdmlhIGBhZGRFdmVudExpc3RlbmVyYCByYXRoZXIgdGhhbiBgQnV0dG9uQ29tcG9uZW50Lm9uQ2xpY2tgIHNvIGl0XG4gICAgICAvLyBidWJibGVzIHRocm91Z2ggdGhlIGludGVyYWN0aXZlLWVsZW1lbnQgZ3VhcmQgKGtlZXBpbmcgdGhlIG5vdGljZSBvcGVuKSBhbmQgc3RheXNcbiAgICAgIC8vIGRpcmVjdGx5IGV4ZXJjaXNhYmxlIHZpYSBhIGRpc3BhdGNoZWQgRE9NIGV2ZW50IGluIHVuaXQgdGVzdHMuXG4gICAgICBjYW5jZWxCdXR0b24uYnV0dG9uRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgfSk7XG4gICAgICBmcmFnbWVudC5hcHBlbmQoY2FuY2VsQnV0dG9uLmJ1dHRvbkVsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgbm90aWNlIGNvbnRlbnQgd3JhcHBlZCBpbiBhIGNvbnRhaW5lciB0aGF0IGtlZXBzIHRoZSBub3RpY2Ugb3BlbiB3aGVuIGFuIGludGVyYWN0aXZlXG4gICAqIGVsZW1lbnQgaW5zaWRlIGl0IGlzIGNsaWNrZWQuIE9ic2lkaWFuIGRpc21pc3NlcyBhIG5vdGljZSBvbiBhbnkgY2xpY2sgdGhhdCBidWJibGVzIHVwIHRvIGl0c1xuICAgKiBlbGVtZW50OyB0aGUgY29udGFpbmVyIGludGVyY2VwdHMgY2xpY2tzIG9yaWdpbmF0aW5nIG9uIGFuIGludGVyYWN0aXZlIGVsZW1lbnQgKGEgbGluaywgYnV0dG9uLFxuICAgKiBpbnB1dCwgZXRjLikgYW5kIHN0b3BzIHRoZW0gdGhlcmUsIHNvIHRoZSBlbGVtZW50J3Mgb3duIGhhbmRsZXIgc3RpbGwgcnVucyBidXQgdGhlIG5vdGljZSBzdGF5cy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudE5vdGljZUNvbnRlbnR9IGhvbGRpbmcgdGhlIHdyYXBwZWQgbm90aWNlIGNvbnRlbnQuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTm90aWNlQ29udGVudChwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcyk6IFBsdWdpbk5vdGljZUNvbXBvbmVudE5vdGljZUNvbnRlbnQge1xuICAgIGNvbnN0IHsgZ2V0Tm90aWNlLCBtZXNzYWdlLCBvbkNsb3NlQ2xpY2ssIHJlcXVpcmVzRXhwbGljaXRDbG9zZSA9IGZhbHNlLCBzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZSA9IHRydWUsIHNob3VsZFNob3dDbG9zZUJ1dHRvbiA9IHRydWUgfSA9IHBhcmFtcztcbiAgICBjb25zdCBmcmFnbWVudCA9IGNyZWF0ZUZyYWdtZW50KCk7XG4gICAgY29uc3QgY29udGVudEVsID0gZnJhZ21lbnQuY3JlYXRlRGl2KCk7XG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyhjb250ZW50RWwsIENzc0NsYXNzLlBsdWdpbk5vdGljZUNvbnRlbnQpO1xuICAgIGlmIChzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZSkge1xuICAgICAgY29udGVudEVsLmFwcGVuZCh0aGlzLmJ1aWxkUHJlZml4ZWRNZXNzYWdlKG1lc3NhZ2UpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgY29udGVudEVsLmFwcGVuZFRleHQobWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnRFbC5hcHBlbmQobWVzc2FnZSk7XG4gICAgfVxuICAgIGNvbnRlbnRFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgkZXZlbnQpID0+IHtcbiAgICAgIC8vIEEgaGFyZC10by1jbG9zZSBub3RpY2UgbXVzdCBub3QgZGlzbWlzcyBvbiBhbnkgc3RyYXkgY2xpY2s7IG9ubHkgaXRzIGNsb3NlIGJ1dHRvbiBtYXkgaGlkZSBpdC5cbiAgICAgIGlmIChyZXF1aXJlc0V4cGxpY2l0Q2xvc2UpIHtcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoJGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgJGV2ZW50LnRhcmdldC5jbG9zZXN0KElOVEVSQUNUSVZFX0VMRU1FTlRfU0VMRUNUT1IpKSB7XG4gICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChyZXF1aXJlc0V4cGxpY2l0Q2xvc2UgJiYgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uKSB7XG4gICAgICB0aGlzLmFwcGVuZENsb3NlQnV0dG9uKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQbHVnaW5Ob3RpY2VDb21wb25lbnRBcHBlbmRDbG9zZUJ1dHRvblBhcmFtcz4oe1xuICAgICAgICBjb250ZW50RWwsXG4gICAgICAgIGdldE5vdGljZTogZW5zdXJlTm9uTnVsbGFibGUoZ2V0Tm90aWNlKSxcbiAgICAgICAgb25DbG9zZUNsaWNrXG4gICAgICB9KSk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvbnRlbnRFbCwgZnJhZ21lbnQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIG5vdGljZSBjb250ZW50LCBwcmVmaXhpbmcgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgcGx1Z2luIG5hbWUgaW4gYSBzdHlsZWQgZWxlbWVudCBzbyBpdCBpc1xuICAgKiB2aXN1YWxseSBkaXN0aW5ndWlzaGVkIGZyb20gdGhlIG1lc3NhZ2UgYm9keS5cbiAgICpcbiAgICogVGhlIG5hbWUgaXMgcmVuZGVyZWQgYXMgaW5saW5lIGNvZGUsIHRoZSB3YXkgZXZlcnkgcGx1Z2luIG5hbWUgaW4gdGhlIFVJIGlzLCBpbnNpZGUgYSBzcGFuIHRoYXQga2VlcHNcbiAgICogdGhlIHByZWZpeCdzIG93biBsYXlvdXQgYW5kIGFjY2VudCBjb2xvci5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBkaXNwbGF5IGFmdGVyIHRoZSBwbHVnaW4gbmFtZSBwcmVmaXguXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IHdpdGggdGhlIHN0eWxlZCBwbHVnaW4gbmFtZSBwcmVmaXggZm9sbG93ZWQgYnkgdGhlIG1lc3NhZ2UuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUHJlZml4ZWRNZXNzYWdlKG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBjb25zdCBmcmFnbWVudCA9IGNyZWF0ZUZyYWdtZW50KCk7XG4gICAgY29uc3QgbmFtZUVsID0gY3JlYXRlU3BhbigpO1xuICAgIGFwcGVuZENvZGVCbG9jayhuYW1lRWwsIHRoaXMucGx1Z2luTmFtZSk7XG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3NlcyhuYW1lRWwsIENzc0NsYXNzLlBsdWdpbk5vdGljZU5hbWUpO1xuICAgIGZyYWdtZW50LmFwcGVuZChuYW1lRWwpO1xuICAgIGlmICghdGhpcy5fbG9hZGVkKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmRUZXh0KCcgKHVubG9hZGVkKScpO1xuICAgIH1cbiAgICBmcmFnbWVudC5hcHBlbmRUZXh0KCdcXG4nKTtcbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmRUZXh0KG1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmQobWVzc2FnZSk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGVybWFuZW50Tm90aWNlKCk6IE5vdGljZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmdldFBlcm1hbmVudE5vdGljZXMoKS5nZXQodGhpcy5wbHVnaW5OYW1lKSA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQZXJtYW5lbnROb3RpY2VzKCk6IE1hcDxzdHJpbmcsIE5vdGljZT4ge1xuICAgIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGU8TWFwPHN0cmluZywgTm90aWNlPj4oUEVSTUFORU5UX05PVElDRVNfU1RBVEVfS0VZLCBuZXcgTWFwPHN0cmluZywgTm90aWNlPigpKS52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBhIG5vdGljZSBoYXJkIHRvIGNsb3NlOiBtYXJrcyBpdHMgb3V0ZXIgZWxlbWVudCAoc28gdGhlIENTUyBuZXV0cmFsaXplcyBpdHMgcGFkZGluZykgYW5kXG4gICAqIGluc3RhbGxzIGEgY2FwdHVyZS1waGFzZSBjbGljayBndWFyZCB0aGF0IHN0b3BzIGV2ZXJ5IGNsaWNrIGV4Y2VwdCBvbiBhbiBpbnRlcmFjdGl2ZSBlbGVtZW50IChhXG4gICAqIGJ1dHRvbiwgbGluaywgdGhlIGNsb3NlIGJ1dHRvbiwgZXRjLikgZnJvbSByZWFjaGluZyBPYnNpZGlhbidzIG93biBkaXNtaXNzIGhhbmRsZXIg4oCUIHNvIGFuXG4gICAqIGludGVyYWN0aXZlIGNoaWxkJ3Mgb3duIGhhbmRsZXIgc3RpbGwgcnVucyB3aGlsZSBhIHN0cmF5IGNsaWNrIGNhbm5vdCBkaXNtaXNzIHRoZSBub3RpY2UuXG4gICAqXG4gICAqIEBwYXJhbSBub3RpY2UgLSBUaGUgbm90aWNlIHRvIGd1YXJkLlxuICAgKiBAcGFyYW0gcmVxdWlyZXNFeHBsaWNpdENsb3NlIC0gV2hldGhlciB0aGUgbm90aWNlIHJlcXVpcmVzIGV4cGxpY2l0IGNsb3NlOyB3aGVuIGBmYWxzZWAsIG5vdGhpbmcgaXNcbiAgICogaW5zdGFsbGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsRXhwbGljaXRDbG9zZUd1YXJkcyhub3RpY2U6IE5vdGljZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFyZXF1aXJlc0V4cGxpY2l0Q2xvc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVGhlIG91dGVyIGAubm90aWNlYCBlbGVtZW50IChgY29udGFpbmVyRWxgKSBjYXJyaWVzIE9ic2lkaWFuJ3MgZGlzbWlzcy1vbi1jbGljayBoYW5kbGVyIGFuZCB0aGVcbiAgICAvLyBwYWRkaW5nIGEgc3RyYXkgY2xpY2sgY291bGQgbGFuZCBvbjsgbWFyayBpdCBzbyB0aGUgc3R5bGVzaGVldCBkcm9wcyB0aGF0IHBhZGRpbmcuXG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyhub3RpY2UuY29udGFpbmVyRWwsIENzc0NsYXNzLlBsdWdpbk5vdGljZVJlcXVpcmVzRXhwbGljaXRDbG9zZSk7XG4gICAgLy8gU3RvcCBldmVyeSBjbGljayBvbiB0aGUgbm90aWNlIOKAlCBleGNlcHQgb24gYW4gaW50ZXJhY3RpdmUgZWxlbWVudCDigJQgZnJvbSByZWFjaGluZyBPYnNpZGlhbidzXG4gICAgLy8gZGlzbWlzcyBoYW5kbGVyLiBSZWdpc3RlcmVkIGluIHRoZSBjYXB0dXJlIHBoYXNlIG9uIHRoZSBvdXRlcm1vc3QgZWxlbWVudCBzbyBpdCBhbHdheXMgcnVucyBmaXJzdC5cbiAgICAvLyBMZXR0aW5nIGEgY2xpY2sgcmVhY2ggYW4gaW50ZXJhY3RpdmUgY2hpbGQgKGEgYnV0dG9uLCBsaW5rLCB0aGUgY2xvc2UgYnV0dG9uLCBldGMuKSBpcyB3aGF0IGtlZXBzXG4gICAgLy8gaXRzIG93biBoYW5kbGVyIHdvcmtpbmc7IHRoZSBidWJibGUtcGhhc2UgZ3VhcmQgb24gdGhlIGNvbnRlbnQgd3JhcHBlciB0aGVuIHN0b3BzIHRoYXQgY2xpY2sgZnJvbVxuICAgIC8vIGJ1YmJsaW5nIHVwIHRvIE9ic2lkaWFuJ3MgZGlzbWlzcyBoYW5kbGVyLCBzbyB0aGUgbm90aWNlIHN0aWxsIHN0YXlzIG9wZW4uXG4gICAgbm90aWNlLmNvbnRhaW5lckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCRldmVudCkgPT4ge1xuICAgICAgaWYgKCRldmVudC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmICRldmVudC50YXJnZXQuY2xvc2VzdChJTlRFUkFDVElWRV9FTEVNRU5UX1NFTEVDVE9SKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrcyBhIGNsaWNrIG9uIHRoZSBub3RpY2Ugc28ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uSGlkZX0gY2FuIHJlcG9ydCBhXG4gICAqIHVzZXIgZGlzbWlzc2FsLiBPYnNpZGlhbiBoaWRlcyBhIGRpc21pc3NpYmxlIG5vdGljZSBzeW5jaHJvbm91c2x5IGR1cmluZyB0aGUgY2xpY2ssIHNvIGFcbiAgICogY2FwdHVyZS1waGFzZSBsaXN0ZW5lciBtYXJrcyB0aGUgbm90aWNlIGJlZm9yZSB0aGF0IGhpZGUgcnVuczsgdGhlIG1hcmsgaXMgY2xlYXJlZCBhZnRlciB0aGUgZXZlbnRcbiAgICogc28gYSBsYXRlciBwcm9ncmFtbWF0aWMgaGlkZSBpcyBub3QgbWlzYXR0cmlidXRlZC4gQSBjbG9zZS1idXR0b24gY2xpY2sgaXMgdHJhY2tlZCBzZXBhcmF0ZWx5IChzZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudC5hcHBlbmRDbG9zZUJ1dHRvbn0pLlxuICAgKlxuICAgKiBAcGFyYW0gbm90aWNlIC0gVGhlIG5vdGljZSB0byB0cmFjay5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFVzZXJDbGlja1RyYWNraW5nKG5vdGljZTogTm90aWNlKTogdm9pZCB7XG4gICAgbm90aWNlLmNvbnRhaW5lckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgLy8gT2JzaWRpYW4gZGlzbWlzc2VzIGEgZGlzbWlzc2libGUgbm90aWNlIHN5bmNocm9ub3VzbHkgZHVyaW5nIHRoaXMgY2xpY2ssIHNvIG1hcmsgaXQgbm93IChiZWZvcmVcbiAgICAgIC8vIHRoYXQgaGlkZSBydW5zKSBhbmQgY2xlYXIgaXQgb24gdGhlIG5leHQgbWljcm90YXNrIOKAlCBhZnRlciBhbnkgc3luY2hyb25vdXMgZGlzbWlzcywgYnV0IGJlZm9yZSBhXG4gICAgICAvLyBsYXRlciBwcm9ncmFtbWF0aWMgaGlkZSwgc28gdGhhdCBoaWRlIGlzIG5vdCBtaXNhdHRyaWJ1dGVkIGFzIGEgdXNlciBhY3Rpb24uXG4gICAgICB0aGlzLnVzZXJDbGlja2VkTm90aWNlcy5hZGQobm90aWNlKTtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgdGhpcy51c2VyQ2xpY2tlZE5vdGljZXMuZGVsZXRlKG5vdGljZSk7XG4gICAgICB9KTtcbiAgICB9LCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldFBlcm1hbmVudE5vdGljZShub3RpY2U6IE5vdGljZSB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBtYXAgPSB0aGlzLmdldFBlcm1hbmVudE5vdGljZXMoKTtcbiAgICBpZiAobm90aWNlKSB7XG4gICAgICBtYXAuc2V0KHRoaXMucGx1Z2luTmFtZSwgbm90aWNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFwLmRlbGV0ZSh0aGlzLnBsdWdpbk5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG5vdGljZSB3aXRoIHRoZSBnaXZlbiBkdXJhdGlvbiwgcGxhY2luZyBpdCBhY2NvcmRpbmcgdG8gaXRzIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlfTogYVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlfSBub3RpY2UgdGFrZXMgdGhlIHBlci1wbHVnaW4gc2xvdCAoaGlkaW5nIHdoYXRldmVyIHdhcyBpbiBpdCwgYW5kXG4gICAqIG9wdGlvbmFsbHkgcmVnaXN0ZXJpbmcgYXMgdGhpcyBwbHVnaW4ncyBwZXJtYW5lbnQgbm90aWNlKSwgYW4ge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuQXBwZW5kfSBvbmVcbiAgICogam9pbnMgdGhlIG5vdGljZSBhbHJlYWR5IGluIHRoZSBzbG90LCBhbmQgYSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gb25lIGlzIHRyYWNrZWQgb24gaXRzXG4gICAqIG93biwgbGVhdmluZyB0aGUgc2xvdCB1bnRvdWNoZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93bk5vdGljZX0gZGVzY3JpYmluZyB3aGVyZSB0aGUgbWVzc2FnZSBlbmRlZCB1cC5cbiAgICovXG4gIHByaXZhdGUgc2hvd05vdGljZVdpdGhEdXJhdGlvbihwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VXaXRoRHVyYXRpb25QYXJhbXMpOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93bk5vdGljZSB7XG4gICAgY29uc3QgeyBkdXJhdGlvbkluTWlsbGlzZWNvbmRzLCBtZXNzYWdlLCBtb2RlLCBvbkNsb3NlQ2xpY2ssIG9uSGlkZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlLCBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50LCBzaG91bGRTaG93Q2xvc2VCdXR0b24gfSA9IHBhcmFtcztcbiAgICAvLyBPYnNpZGlhbidzIGBOb3RpY2VgIHRyZWF0cyBhbiBvbWl0dGVkIGR1cmF0aW9uIGFzIGl0cyBkZWZhdWx0LCBzbyBtYXAgdGhlIGBudWxsYCBcIm5vIGV4cGxpY2l0XG4gICAgLy8gZHVyYXRpb25cIiB2YWx1ZSB0byBgdW5kZWZpbmVkYC5cbiAgICBjb25zdCBub3RpY2VEdXJhdGlvbkluTWlsbGlzZWNvbmRzID0gZHVyYXRpb25Jbk1pbGxpc2Vjb25kcyA/PyB1bmRlZmluZWQ7XG5cbiAgICBpZiAobW9kZSA9PT0gUGx1Z2luTm90aWNlTW9kZS5BcHBlbmQpIHtcbiAgICAgIGNvbnN0IGFwcGVuZGVkTm90aWNlID0gdGhpcy5hcHBlbmRUb0N1cnJlbnROb3RpY2Uobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBsdWdpbk5vdGljZUNvbXBvbmVudEFwcGVuZFRvQ3VycmVudE5vdGljZVBhcmFtcz4oe1xuICAgICAgICBkdXJhdGlvbkluTWlsbGlzZWNvbmRzLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBvbkhpZGUsXG4gICAgICAgIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnRcbiAgICAgIH0pKTtcbiAgICAgIGlmIChhcHBlbmRlZE5vdGljZSkge1xuICAgICAgICByZXR1cm4gYXBwZW5kZWROb3RpY2U7XG4gICAgICB9XG4gICAgICAvLyBOb3RoaW5nIG9uIHNjcmVlbiB0byBhcHBlbmQgdG8sIHNvIHRoaXMgbWVzc2FnZSBiZWNvbWVzIHRoZSBzbG90J3Mgbm90aWNlIGluc3RlYWQuXG4gICAgfVxuXG4gICAgY29uc3QgaGFzQ2xvc2VCdXR0b24gPSByZXF1aXJlc0V4cGxpY2l0Q2xvc2UgJiYgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uO1xuICAgIC8vIFRoZSBjbG9zZSBidXR0b24ncyBjbGljayBoYW5kbGVyIG5lZWRzIHRoZSBgTm90aWNlYCwgd2hpY2ggZG9lcyBub3QgZXhpc3QgdW50aWwgaXQgaXMgYnVpbHQgZnJvbVxuICAgIC8vIHRoaXMgY29udGVudDsgY2FwdHVyZSBpdCBsYXppbHkgdmlhIGEgaG9sZGVyIHJlc29sdmVkIGF0IGNsaWNrIHRpbWUuIFRoZSBnZXR0ZXIgaXMgY3JlYXRlZCBvbmx5XG4gICAgLy8gd2hlbiBhIGNsb3NlIGJ1dHRvbiBpcyBzaG93bi5cbiAgICBsZXQgYnVpbHROb3RpY2U6IE5vdGljZSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IHsgY29udGVudEVsLCBmcmFnbWVudCB9ID0gdGhpcy5idWlsZE5vdGljZUNvbnRlbnQobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcz4oe1xuICAgICAgZ2V0Tm90aWNlOiBoYXNDbG9zZUJ1dHRvbiA/ICgpOiBOb3RpY2UgfCBudWxsID0+IGJ1aWx0Tm90aWNlIDogdW5kZWZpbmVkLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIG9uQ2xvc2VDbGljayxcbiAgICAgIHJlcXVpcmVzRXhwbGljaXRDbG9zZSxcbiAgICAgIHNob3VsZFNob3dDbG9zZUJ1dHRvblxuICAgIH0pKTtcblxuICAgIGlmIChtb2RlID09PSBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlKSB7XG4gICAgICBidWlsdE5vdGljZSA9IG5ldyBOb3RpY2UoZnJhZ21lbnQsIG5vdGljZUR1cmF0aW9uSW5NaWxsaXNlY29uZHMpO1xuICAgICAgdGhpcy5pbnN0YWxsRXhwbGljaXRDbG9zZUd1YXJkcyhidWlsdE5vdGljZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlKTtcbiAgICAgIHRoaXMuaW5zdGFsbFVzZXJDbGlja1RyYWNraW5nKGJ1aWx0Tm90aWNlKTtcbiAgICAgIHRoaXMud2lyZU9uSGlkZShidWlsdE5vdGljZSwgb25IaWRlKTtcbiAgICAgIHRoaXMuc3RhbmRhbG9uZU5vdGljZXMuYWRkKGJ1aWx0Tm90aWNlKTtcbiAgICAgIHJldHVybiB7IGNvbnRlbnRFbCwgaXNOb3RpY2VPd25lZDogdHJ1ZSwgbm90aWNlOiBidWlsdE5vdGljZSB9O1xuICAgIH1cblxuICAgIHRoaXMubm90aWNlPy5oaWRlKCk7XG4gICAgYnVpbHROb3RpY2UgPSBuZXcgTm90aWNlKGZyYWdtZW50LCBub3RpY2VEdXJhdGlvbkluTWlsbGlzZWNvbmRzKTtcbiAgICB0aGlzLm5vdGljZSA9IGJ1aWx0Tm90aWNlO1xuICAgIHRoaXMuaW5zdGFsbEV4cGxpY2l0Q2xvc2VHdWFyZHMoYnVpbHROb3RpY2UsIHJlcXVpcmVzRXhwbGljaXRDbG9zZSk7XG4gICAgdGhpcy5pbnN0YWxsVXNlckNsaWNrVHJhY2tpbmcoYnVpbHROb3RpY2UpO1xuICAgIHRoaXMud2lyZU9uSGlkZShidWlsdE5vdGljZSwgb25IaWRlKTtcblxuICAgIGlmIChzaG91bGRSZWdpc3RlckFzUGVybWFuZW50KSB7XG4gICAgICB0aGlzLnNldFBlcm1hbmVudE5vdGljZShidWlsdE5vdGljZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0UGVybWFuZW50Tm90aWNlKG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb250ZW50RWwsIGlzTm90aWNlT3duZWQ6IHRydWUsIG5vdGljZTogYnVpbHROb3RpY2UgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwcyBhIG5vdGljZSdzIGBoaWRlYCBzbyB0aGUgZ2l2ZW4gY2FsbGJhY2sgcnVucyB0aGUgZmlyc3QgdGltZSB0aGUgbm90aWNlIGlzIGhpZGRlbiDigJQgYnkgdGhlXG4gICAqIHVzZXIsIGJ5IGEgcmVwbGFjaW5nIG5vdGljZSwgYnkgaXRzIGR1cmF0aW9uIGVsYXBzaW5nLCBvciBvbiB1bmxvYWQuIERvZXMgbm90aGluZyB3aGVuIG5vIGNhbGxiYWNrXG4gICAqIGlzIGdpdmVuLlxuICAgKlxuICAgKiBAcGFyYW0gbm90aWNlIC0gVGhlIG5vdGljZSB3aG9zZSBgaGlkZWAgdG8gd3JhcC5cbiAgICogQHBhcmFtIG9uSGlkZSAtIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugb24gdGhlIGZpcnN0IGhpZGUsIG9yIGB1bmRlZmluZWRgIHRvIHNraXAgd3JhcHBpbmcuXG4gICAqL1xuICBwcml2YXRlIHdpcmVPbkhpZGUobm90aWNlOiBOb3RpY2UsIG9uSGlkZTogKChpbmZvOiBQbHVnaW5Ob3RpY2VIaWRlSW5mbykgPT4gUHJvbWlzYWJsZTx2b2lkPikgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIW9uSGlkZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSdW4gYG9uSGlkZWAgdGhlIGZpcnN0IHRpbWUgdGhlIG5vdGljZSBpcyBoaWRkZW4uIEEgYG9uY2VgIHBhdGNoIG9uIGBoaWRlYCBpbnRlcmNlcHRzIGV4YWN0bHkgb25lXG4gICAgLy8gY2FsbCB0aGVuIHVuaW5zdGFsbHMgaXRzZWxmICh1bmxvYWRpbmcgdGhpcyBkZWRpY2F0ZWQgY29tcG9uZW50KSwgc28gdGhlcmUgaXMgbm8gbWFudWFsXG4gICAgLy8gc2luZ2xlLWZpcmUgYm9va2tlZXBpbmcgYW5kIG5vIGxpbmdlcmluZyBwYXRjaCBvbiB0aGUgdHJhbnNpZW50IG5vdGljZS4gVGhlIHVzZXItY2xvc2UgZmxhZ3Mgd2VyZVxuICAgIC8vIHNldCBiZWZvcmUgYGhpZGUoKWAgd2FzIGludm9rZWQgKHNlZSBgYXBwZW5kQ2xvc2VCdXR0b25gIC8gYGluc3RhbGxVc2VyQ2xpY2tUcmFja2luZ2ApLCBzbyB0aGV5XG4gICAgLy8gc3RpbGwgaG9sZCB3aGVuIHJlYWQgaGVyZSBhZnRlciBgZmFsbGJhY2soKWAuXG4gICAgY29uc3QgcGF0Y2hDb21wb25lbnQgPSBuZXcgTW9ua2V5QXJvdW5kQ29tcG9uZW50KCk7XG4gICAgcGF0Y2hDb21wb25lbnQubG9hZCgpO1xuICAgIHBhdGNoQ29tcG9uZW50LnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgJG9iamVjdDogbm90aWNlLFxuICAgICAgbWV0aG9kTmFtZTogJ2hpZGUnLFxuICAgICAgb25jZTogdHJ1ZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2sgfSkgPT4ge1xuICAgICAgICBmYWxsYmFjaygpO1xuICAgICAgICBjb25zdCBpc0Nsb3NlQnV0dG9uQ2xpY2tlZCA9IHRoaXMuY2xvc2VCdXR0b25DbGlja2VkTm90aWNlcy5oYXMobm90aWNlKTtcbiAgICAgICAgY29uc3QgaXNVc2VyQWN0aW9uID0gaXNDbG9zZUJ1dHRvbkNsaWNrZWQgfHwgdGhpcy51c2VyQ2xpY2tlZE5vdGljZXMuaGFzKG5vdGljZSk7XG4gICAgICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBvbkhpZGUoeyBpc0Nsb3NlQnV0dG9uQ2xpY2tlZCwgaXNVc2VyQWN0aW9uIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVVBLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsbUNBQW1DO0FBQzVDLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsb0JBQW9CO0FBQzdCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsdUJBQXVCO0FB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
|
|
605
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb21wb25lbnQgdGhhdCBtYW5hZ2VzIGRpc3BsYXlpbmcgbm90aWNlcyB0byB0aGUgdXNlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZhbHVlUHJvdmlkZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdmFsdWUtcHJvdmlkZXInO1xuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hcnJheSc7XG5pbXBvcnQgeyBpbnZva2VBc3luY1NhZmVseSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi92YWx1ZS1wcm92aWRlcic7XG5pbXBvcnQge1xuICBCdXR0b25Db21wb25lbnQsXG4gIE5vdGljZSxcbiAgc2V0SWNvblxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IGFwcGVuZENvZGVCbG9jayB9IGZyb20gJy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQgeyBhZGRQbHVnaW5Dc3NDbGFzc2VzIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1jb250ZXh0LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHsgTW9ua2V5QXJvdW5kQ29tcG9uZW50IH0gZnJvbSAnLi9tb25rZXktYXJvdW5kLWNvbXBvbmVudC50cyc7XG5cbmNvbnN0IFBFUk1BTkVOVF9OT1RJQ0VTX1NUQVRFX0tFWSA9ICdwbHVnaW4tbm90aWNlLWNvbXBvbmVudDpwZXJtYW5lbnQtbm90aWNlcyc7XG5jb25zdCBQRVJNQU5FTlRfTk9USUNFX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyA9IDA7XG5jb25zdCBERUZBVUxUX0RFTEFZX0JFRk9SRV9TSE9XX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbi8vIE9ic2lkaWFuJ3Mgb3duIGRlZmF1bHQgbm90aWNlIGR1cmF0aW9uLCBhcHBsaWVkIGJ5IHRoZSBgTm90aWNlYCBjb25zdHJ1Y3RvciB3aGVuIG5vbmUgaXMgZ2l2ZW4uIEl0IGlzXG4vLyByZXBlYXRlZCBoZXJlIGJlY2F1c2UgcmVzdGFydGluZyB0aGUgY291bnRkb3duIG9uIGFuIGFwcGVuZCBnb2VzIHRocm91Z2ggYHNldEF1dG9IaWRlYCwgd2hpY2ggdGFrZXMgYW5cbi8vIGV4cGxpY2l0IGR1cmF0aW9uIGFuZCBzbyBjYW5ub3QgZmFsbCBiYWNrIHRvIHRoYXQgZGVmYXVsdCBpdHNlbGYuXG5jb25zdCBPQlNJRElBTl9ERUZBVUxUX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMgPSA0MDAwO1xuXG4vLyBFbGVtZW50cyBhIHVzZXIgY2xpY2tzIHRvIGFjdCBvbiB0aGVtIHJhdGhlciB0aGFuIHRvIGRpc21pc3MgdGhlIG5vdGljZS4gQSBjbGljayBsYW5kaW5nIG9uIChvclxuLy8gaW5zaWRlKSBvbmUgb2YgdGhlc2UgaXMga2VwdCBmcm9tIGJ1YmJsaW5nIHRvIHRoZSBub3RpY2UsIHNvIHRoZSBub3RpY2Ugc3RheXMgb3Blbi5cbmNvbnN0IElOVEVSQUNUSVZFX0VMRU1FTlRfU0VMRUNUT1IgPSAnYSwgYnV0dG9uLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgbGFiZWwsIFtjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdLCBbcm9sZT1cImJ1dHRvblwiXSwgW3JvbGU9XCJsaW5rXCJdLCBbcm9sZT1cImNoZWNrYm94XCJdLCBbcm9sZT1cInRhYlwiXSwgW3JvbGU9XCJtZW51aXRlbVwiXSc7XG5cbi8qKlxuICogSG93IGEgbmV3IG5vdGljZSByZWxhdGVzIHRvIHRoZSBwbHVnaW4ncyBjdXJyZW50IG5vdGljZSDigJQgdGhlIG9uZSBvY2N1cHlpbmcgdGhlIHNpbmdsZSBwZXItcGx1Z2luXG4gKiBzbG90IHRoaXMgY29tcG9uZW50IGtlZXBzLlxuICpcbiAqIFJhdyBgbmV3IE5vdGljZSguLi4pYCBjYWxscyBhbHdheXMgcGlsZSB1cCwgd2hpY2ggaXMgcmFyZWx5IHdoYXQgYSBwbHVnaW4gd2FudHM6IHVzdWFsbHkgb25seSB0aGVcbiAqIGxhdGVzdCBtZXNzYWdlIG1hdHRlcnMuIFNvIHRoZSBzbG90IGV4aXN0cywgYW5kIHRoaXMgY2hvb3NlcyB3aGF0IGEgbmV3IG1lc3NhZ2UgZG9lcyB3aXRoIGl0LlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5Ob3RpY2VNb2RlIHtcbiAgLyoqXG4gICAqIEFkZHMgdGhlIG1lc3NhZ2UgdG8gdGhlIGN1cnJlbnQgbm90aWNlLCBzbyBib3RoIG1lc3NhZ2VzIHN0YXkgdmlzaWJsZSBpbiBhIHNpbmdsZSBub3RpY2Ug4oCUIGZvciBhXG4gICAqIHJ1bm5pbmcgYWNjb3VudCBvZiBhbiBvcGVyYXRpb24uIFRoZSBjb3VudGRvd24gcmVzdGFydHMsIHNvIGFuIGFwcGVuZGVkIG1lc3NhZ2UgaXMgcmVhZGFibGUgZm9yIGFcbiAgICogZnVsbCBkdXJhdGlvbiByYXRoZXIgdGhhbiBpbmhlcml0aW5nIHRoZSByZW1haW5zIG9mIHRoZSBjdXJyZW50IG9uZS5cbiAgICpcbiAgICogRmFsbHMgYmFjayB0byB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlfSB3aGVuIHRoZXJlIGlzIG5vIGN1cnJlbnQgbm90aWNlIG9uIHNjcmVlbiAoaXQgd2FzXG4gICAqIG5ldmVyIHNob3duLCBvciBpdCBoYXMgc2luY2UgYmVlbiBkaXNtaXNzZWQpLlxuICAgKi9cbiAgQXBwZW5kID0gJ2FwcGVuZCcsXG5cbiAgLyoqXG4gICAqIEhpZGVzIHRoZSBjdXJyZW50IG5vdGljZSBhbmQgc2hvd3MgdGhpcyBvbmUgaW4gaXRzIHBsYWNlLCBzbyBvbmx5IHRoZSBsYXRlc3QgbWVzc2FnZSBpcyBvbiBzY3JlZW4uXG4gICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQsIGFuZCB0aGUgcmVhc29uIHRoZSBzbG90IGV4aXN0cy5cbiAgICovXG4gIFJlcGxhY2UgPSAncmVwbGFjZScsXG5cbiAgLyoqXG4gICAqIFNob3dzIHRoZSBtZXNzYWdlIGFzIGl0cyBvd24gbm90aWNlLCBsZWF2aW5nIHRoZSBjdXJyZW50IG9uZSBhbG9uZTogYm90aCBhcmUgb24gc2NyZWVuLCBwaWxlZCB1cFxuICAgKiBsaWtlIHBsYWluIGBuZXcgTm90aWNlKC4uLilgIGNhbGxzLiBBIHNlcGFyYXRlIG5vdGljZSBuZXZlciByZXBsYWNlcywgYW5kIGlzIG5ldmVyIHJlcGxhY2VkIGJ5LCBhXG4gICAqIHNsb3Qgbm90aWNlOyBhbnkgbnVtYmVyIG9mIHRoZW0gY29leGlzdC4gVGhleSBhcmUgc3RpbGwgaGlkZGVuIHRvZ2V0aGVyIG9uIHVubG9hZC5cbiAgICovXG4gIFNlcGFyYXRlID0gJ3NlcGFyYXRlJ1xufVxuXG4vKipcbiAqIFRoZSBldmVudCBwYXNzZWQgdG8ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uQ2xvc2VDbGlja30gd2hlbiB0aGUgbm90aWNlJ3NcbiAqIGNsb3NlIChYKSBidXR0b24gaXMgY2xpY2tlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Ob3RpY2VDbG9zZUNsaWNrRXZlbnQge1xuICAvKipcbiAgICogQ2FuY2VscyB0aGUgY2xvc2UsIGxlYXZpbmcgdGhlIG5vdGljZSBvcGVuLlxuICAgKi9cbiAgY2FuY2VsOiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIEEgaGFuZGxlIHRvIGEgZGVsYXllZCBub3RpY2UgY3JlYXRlZCBieSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2VBZnRlckRlbGF5fS4gSXQgaXMgYVxuICoge0BsaW5rIERpc3Bvc2FibGV9IChzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIGB1c2luZ2ApIHRoYXQgYWxzbyBsZXRzIHRoZSBjb250ZW50IGJlIHVwZGF0ZWQgd2hpbGUgdGhlXG4gKiBub3RpY2UgaXMgc2hvd24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50RGVsYXllZE5vdGljZSBleHRlbmRzIERpc3Bvc2FibGUge1xuICAvKipcbiAgICogUmVwbGFjZXMgdGhpcyBoYW5kbGUncyBtZXNzYWdlLCByZS1hcHBseWluZyB0aGUgcGx1Z2luLW5hbWUgcHJlZml4LCB0aGUgaW50ZXJhY3RpdmUtY2xpY2sgZ3VhcmQsIGFuZFxuICAgKiB0aGUgQ2FuY2VsIGJ1dHRvbi4gVXNlZnVsIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MuIElmIHRoZSBkZWxheSBoYXMgbm90IGVsYXBzZWQgeWV0LCB0aGUgbmV3IGNvbnRlbnRcbiAgICogYmVjb21lcyB3aGF0IGlzIHNob3duIG9uY2UgaXQgZG9lcy5cbiAgICpcbiAgICogT25seSB0aGlzIGhhbmRsZSdzIG93biBtZXNzYWdlIGlzIHJld3JpdHRlbjogd2hlbiB0aGUgbm90aWNlIHdhcyBqb2luZWQgcmF0aGVyIHRoYW4gb3BlbmVkIChzZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zLm1vZGV9KSwgdGhlIG1lc3NhZ2VzIGFscmVhZHkgaW4gaXQgYXJlIGxlZnRcbiAgICogYWxvbmUuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZW50IC0gVGhlIG5ldyBub3RpY2UgY29udGVudC5cbiAgICovXG4gIHNldENvbnRlbnQ6IChjb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZUFmdGVyRGVsYXl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zIHtcbiAgLyoqXG4gICAqIFdoZW4gcHJvdmlkZWQsIGEgQ2FuY2VsIGJ1dHRvbiBpcyBhcHBlbmRlZCB0byB0aGUgbm90aWNlOyBjbGlja2luZyBpdCBhYm9ydHMgdGhpcyBjb250cm9sbGVyLiBXaGVuXG4gICAqIG9taXR0ZWQsIG5vIENhbmNlbCBidXR0b24gaXMgc2hvd24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydENvbnRyb2xsZXI/OiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IG9mIHRoZSBDYW5jZWwgYnV0dG9uIHNob3duIHdoZW4ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zLmFib3J0Q29udHJvbGxlcn1cbiAgICogaXMgcHJvdmlkZWQuIFdoZW4gb21pdHRlZCwgdGhlIGxvY2FsaXplZCBgQ2FuY2VsYCBsYWJlbCBpcyB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FuY2VsQnV0dG9uVGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGljZSBjb250ZW50LCByZXNvbHZlZCBsYXppbHkgb25seSBpZiB0aGUgZGVsYXkgZWxhcHNlcyDigJQgc28gYW4gb3BlcmF0aW9uIHRoYXQgZmluaXNoZXNcbiAgICogc29vbmVyIG5ldmVyIGJ1aWxkcyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IFZhbHVlUHJvdmlkZXI8RG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoZSBvcGVyYXRpb24gbXVzdCBydW4gYmVmb3JlIHRoZSBub3RpY2UgaXMgc2hvd24uIE9wZXJhdGlvbnMgdGhhdCBmaW5pc2ggc29vbmVyIG5ldmVyXG4gICAqIHNob3cgYSBub3RpY2UsIGF2b2lkaW5nIGEgZGlzdHJhY3RpbmcgZmxhc2guXG4gICAqXG4gICAqIEBkZWZhdWx0IGA1MDBgXG4gICAqL1xuICByZWFkb25seSBkZWxheUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhpcyBub3RpY2UgcmVsYXRlcyB0byB0aGUgcGx1Z2luJ3MgY3VycmVudCBub3RpY2Ug4oCUIHNlZSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZX0uXG4gICAqXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlfSBpcyB3b3J0aCBjb25zaWRlcmluZyBmb3IgYSBsb25nIG9wZXJhdGlvbjogb24gdGhlIGRlZmF1bHRcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZX0gdGhlIHByb2dyZXNzIG5vdGljZSB0YWtlcyB0aGUgc2hhcmVkIHNsb3QsIHNvIGFueSBvcmRpbmFyeSBub3RpY2VcbiAgICogcmFpc2VkIHdoaWxlIHRoZSBvcGVyYXRpb24gcnVucyBoaWRlcyBpdCwgYW5kIHRoZSBwcm9ncmVzcyB0aGUgdXNlciB3YXMgd2F0Y2hpbmcgZG9lcyBub3QgY29tZSBiYWNrLlxuICAgKlxuICAgKiBXaGljaGV2ZXIgbW9kZSBpcyB1c2VkLCB0aGUgcmV0dXJuZWQgaGFuZGxlIG93bnMgb25seSBJVFMgbWVzc2FnZTogdXBkYXRpbmcgdGhlIGNvbnRlbnQgcmV3cml0ZXNcbiAgICogdGhhdCBtZXNzYWdlIGFsb25lLCBhbmQgZGlzcG9zaW5nIHRha2VzIGF3YXkgb25seSB0aGF0IG1lc3NhZ2Ugd2hlbiB0aGUgbm90aWNlIHdhcyBhbHJlYWR5IG9uXG4gICAqIHNjcmVlbiAoYSBub3RpY2UgdGhpcyBoYW5kbGUgb3BlbmVkIGlzIGhpZGRlbiBhcyBhIHdob2xlKS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZX1cbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBQbHVnaW5Ob3RpY2VNb2RlO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgbm90aWNlIHNob3VsZCBzdGF5IHVudGlsIGl0IGlzIHJlcGxhY2VkLCB0aGUgcGx1Z2luIGlzIHJlbG9hZGVkLCBvciB0aGUgdXNlciBkaXNtaXNzZXMgaXQuXG4gICAqXG4gICAqIEEgcGVybWFuZW50IG5vdGljZSBpcyBzaG93biB3aXRoIGFuIGluZmluaXRlIGR1cmF0aW9uIGFuZCBpcyBub3QgaGlkZGVuIHdoZW4gdGhlIGNvbXBvbmVudCB1bmxvYWRzLCBzbyBpdCBjYW5cbiAgICogY29tbXVuaWNhdGUgc3RhdGUgdGhhdCBvdXRsaXZlcyB0aGUgcGx1Z2luIChlLmcuIGEgY2xlYW51cCB0aGF0IHJlcXVpcmVzIGEgcmVsb2FkKS4gVGhlcmUgaXMgYXQgbW9zdCBvbmUgcGVybWFuZW50XG4gICAqIG5vdGljZSBwZXIgcGx1Z2luOiBpdCBpcyBoaWRkZW4gYnkgdGhlIG5leHQge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlfSBjYWxsIGFuZCBkaXNtaXNzZWRcbiAgICogYXV0b21hdGljYWxseSB0aGUgbmV4dCB0aW1lIHRoZSBjb21wb25lbnQgbG9hZHMgKGkuZS4gd2hlbiB0aGUgcGx1Z2luIGlzIHJlLWVuYWJsZWQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc1Blcm1hbmVudD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhvdyB0aGlzIG5vdGljZSByZWxhdGVzIHRvIHRoZSBwbHVnaW4ncyBjdXJyZW50IG5vdGljZSDigJQgc2VlIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlfS5cbiAgICpcbiAgICogQSBwZXJtYW5lbnQgbm90aWNlIGNhbm5vdCBiZSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gKGl0IG5lZWRzIHRoZSBzaGFyZWQgc2xvdCBpdCBpc1xuICAgKiB0cmFja2VkIGluKSwgYW5kIGEgbm90aWNlIHRoYXQgZG9lcyBub3QgaGlkZSBvbiBjbGljayBtdXN0IGJlXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlfSAoc28gYSBsYXRlciBub3RpY2UgbmV2ZXIgc2lsZW50bHkgcmVwbGFjZXMgaXQpOyBlaXRoZXJcbiAgICogY29udHJhZGljdGlvbiB0aHJvd3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlJlcGxhY2V9LCBvciB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gd2hlblxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkSGlkZU9uQ2xpY2t9IGlzIGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBQbHVnaW5Ob3RpY2VNb2RlO1xuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGNsb3NlIChYKSBidXR0b24sIGJlZm9yZSB0aGUgbm90aWNlIGlzIGhpZGRlbi4gQ2FsbFxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50LmNhbmNlbH0gb24gdGhlIGV2ZW50IHRvIGNhbmNlbCB0aGUgY2xvc2UgYW5kIGtlZXAgdGhlIG5vdGljZVxuICAgKiBvcGVuIOKAlCBmb3IgZXhhbXBsZSBhZnRlciB5b3VyIG93biBjb25maXJtYXRpb24gZGVjbGluZXMuIEFuIGFzeW5jIGNhbGxiYWNrIGlzIGF3YWl0ZWQgYmVmb3JlIHRoZVxuICAgKiBub3RpY2UgaXMgaGlkZGVuLiBSdW5zIG9ubHkgd2hlbiBhIGNsb3NlIGJ1dHRvbiBpcyBzaG93biAoYm90aFxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkSGlkZU9uQ2xpY2t9IGA9IGZhbHNlYCBhbmRcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZFNob3dDbG9zZUJ1dHRvbn0gYXJlIHNldCkuXG4gICAqL1xuICByZWFkb25seSBvbkNsb3NlQ2xpY2s/OiAoZXZlbnQ6IFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPjtcblxuICAvKipcbiAgICogQSBjYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIG5vdGljZSBpcyBoaWRkZW4g4oCUIHdoZXRoZXIgYnkgdGhlIHVzZXIgY2xvc2luZyBpdCwgYnkgYSBsYXRlciByZXVzYWJsZVxuICAgKiBub3RpY2UgcmVwbGFjaW5nIGl0LCBieSBpdHMgZHVyYXRpb24gZWxhcHNpbmcsIG9yIG9uIGNvbXBvbmVudCB1bmxvYWQuIEl0IHJ1bnMgYXQgbW9zdCBvbmNlIHBlclxuICAgKiBub3RpY2UuIFRoZSB7QGxpbmsgUGx1Z2luTm90aWNlSGlkZUluZm99IGFyZ3VtZW50IGRpc3Rpbmd1aXNoZXMgYSB1c2VyIGNsb3NlICh0aGUgY2xvc2UgYnV0dG9uKSBmcm9tXG4gICAqIGEgcHJvZ3JhbW1hdGljIGhpZGUuIEFuIGFzeW5jIGNhbGxiYWNrIGlzIHJ1biBmaXJlLWFuZC1mb3JnZXQgKGl0cyByZWplY3Rpb24gc3VyZmFjZXMgdGhyb3VnaCB0aGVcbiAgICogYXN5bmMtZXJyb3IgcGlwZWxpbmUpLlxuICAgKi9cbiAgcmVhZG9ubHkgb25IaWRlPzogKGluZm86IFBsdWdpbk5vdGljZUhpZGVJbmZvKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNsaWNraW5nIHRoZSBub3RpY2UgaGlkZXMgaXQuIFdoZW4gYHRydWVgICh0aGUgZGVmYXVsdCksIHRoZSBub3RpY2UgZGlzbWlzc2VzIG9uIGNsaWNrIGxpa2VcbiAgICogYSBub3JtYWwgT2JzaWRpYW4gbm90aWNlLiBXaGVuIGBmYWxzZWAsIHRoZSBub3RpY2UgaXMgaGFyZCB0byBjbG9zZTogaXQgZG9lcyBub3QgZGlzbWlzcyBvbiBhbnkgc3RyYXlcbiAgICogY2xpY2ssIGFuZCBpbnN0ZWFkIHNob3dzIGEgY2xvc2UgKFgpIGJ1dHRvbiB0aGF0IGhpZGVzIGl0IGRpcmVjdGx5IChzZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZFNob3dDbG9zZUJ1dHRvbn0gYW5kXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5vbkNsb3NlQ2xpY2t9KS5cbiAgICpcbiAgICogQSBgc2hvdWxkSGlkZU9uQ2xpY2s6IGZhbHNlYCBub3RpY2UgaXMgc2hvd24gd2l0aCBhbiBpbmZpbml0ZSBkdXJhdGlvbiBhbmQgc3RhbmRzIG9uIGl0cyBvd25cbiAgICogKGltcGxpZXMge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGV9KSwgc28gYSBsYXRlciBub3RpY2UgbmV2ZXIgc2lsZW50bHkgcmVwbGFjZXMgaXQ7IHBhc3NpbmdcbiAgICogYW55IG90aGVyIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5tb2RlfSB0b2dldGhlciB3aXRoIGBzaG91bGRIaWRlT25DbGljazogZmFsc2VgXG4gICAqIHRocm93cy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRIaWRlT25DbGljaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNsb3NlIChYKSBidXR0b24gaXMgc2hvd24gb24gYSBoYXJkLXRvLWNsb3NlIG5vdGljZVxuICAgKiAoe0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZEhpZGVPbkNsaWNrfSBgPSBmYWxzZWApLiBXaGVuIGBmYWxzZWAsIG5vIGNsb3NlXG4gICAqIGJ1dHRvbiBpcyByZW5kZXJlZCBhbmQgdGhlIG5vdGljZSBjYW4gb25seSBiZSBoaWRkZW4gcHJvZ3JhbW1hdGljYWxseS4gSWdub3JlZCB1bmxlc3NcbiAgICogYHNob3VsZEhpZGVPbkNsaWNrYCBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dDbG9zZUJ1dHRvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGVzY3JpYmVzIHdoeSBhIG5vdGljZSB3YXMgaGlkZGVuLCBwYXNzZWQgdG8ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uSGlkZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlSGlkZUluZm8ge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgbm90aWNlIHdhcyBoaWRkZW4gYnkgdGhlIHVzZXIgY2xpY2tpbmcgaXRzIGNsb3NlIChYKSBidXR0b24gc3BlY2lmaWNhbGx5LiBBbHdheXMgaW1wbGllc1xuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlSGlkZUluZm8uaXNVc2VyQWN0aW9ufS5cbiAgICovXG4gIHJlYWRvbmx5IGlzQ2xvc2VCdXR0b25DbGlja2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBub3RpY2Ugd2FzIGhpZGRlbiBieSBhIHVzZXIgYWN0aW9uIOKAlCBjbGlja2luZyB0aGUgY2xvc2UgKFgpIGJ1dHRvbiwgb3IgY2xpY2tpbmcgYVxuICAgKiBkaXNtaXNzaWJsZSBub3RpY2UgdG8gZGlzbWlzcyBpdCDigJQgYXMgb3Bwb3NlZCB0byBwcm9ncmFtbWF0aWNhbGx5IChhIGxhdGVyIHJldXNhYmxlIG5vdGljZSByZXBsYWNpbmdcbiAgICogaXQsIGFuIGV4cGxpY2l0IGBoaWRlKClgLCB0aGUgZHVyYXRpb24gZWxhcHNpbmcsIG9yIGNvbXBvbmVudCB1bmxvYWQpLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNVc2VyQWN0aW9uOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kQ2xvc2VCdXR0b25QYXJhbXMge1xuICByZWFkb25seSBjb250ZW50RWw6IEhUTUxFbGVtZW50O1xuICByZWFkb25seSBnZXROb3RpY2U6ICgpID0+IE5vdGljZSB8IG51bGw7XG4gIHJlYWRvbmx5IG9uQ2xvc2VDbGljaz86IChldmVudDogUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50KSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kVG9DdXJyZW50Tm90aWNlUGFyYW1zIHtcbiAgcmVhZG9ubHkgZHVyYXRpb25Jbk1pbGxpc2Vjb25kczogbnVsbCB8IG51bWJlcjtcbiAgcmVhZG9ubHkgbWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbiAgcmVhZG9ubHkgb25IaWRlPzogKGluZm86IFBsdWdpbk5vdGljZUhpZGVJbmZvKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuICByZWFkb25seSBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGREZWxheWVkTm90aWNlTWVzc2FnZVBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcbiAgcmVhZG9ubHkgY2FuY2VsQnV0dG9uVGV4dD86IHN0cmluZztcbiAgcmVhZG9ubHkgY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgbm90aWNlIHRoaXMgY29udGVudCBiZWxvbmdzIHRvLCB1c2VkIGJ5IHRoZSBjbG9zZSBidXR0b24ncyBoYW5kbGVyLiBUaGUgbm90aWNlIGRvZXNcbiAgICogbm90IGV4aXN0IHlldCB3aGVuIHRoZSBjb250ZW50IGlzIGJ1aWx0LCBzbyBpdCBpcyByZXNvbHZlZCBsYXppbHkgYXQgY2xpY2sgdGltZS4gUmVxdWlyZWQgd2hlbiBhXG4gICAqIGNsb3NlIGJ1dHRvbiBpcyBzaG93bi5cbiAgICovXG4gIHJlYWRvbmx5IGdldE5vdGljZT86ICgpID0+IE5vdGljZSB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgYWZ0ZXIgdGhlIHBsdWdpbiBuYW1lIHByZWZpeC5cbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgY2xvc2UgYnV0dG9uIGlzIGNsaWNrZWQ7IG1heSBjYW5jZWwgdGhlIGNsb3NlLiBTZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uQ2xvc2VDbGlja30uXG4gICAqL1xuICByZWFkb25seSBvbkNsb3NlQ2xpY2s/OiAoZXZlbnQ6IFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbm90aWNlIGlzIGhhcmQgdG8gY2xvc2U6IHN0b3BzIGV2ZXJ5IGNsaWNrIGZyb20gZGlzbWlzc2luZyBpdCBhbmQsIHVubGVzcyBzdXBwcmVzc2VkIGJ5XG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZE5vdGljZUNvbnRlbnRQYXJhbXMuc2hvdWxkU2hvd0Nsb3NlQnV0dG9ufSwgYWRkcyBhIGNsb3NlIGJ1dHRvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZXNFeHBsaWNpdENsb3NlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbWVzc2FnZSBpcyBwcmVmaXhlZCB3aXRoIHRoZSBwbHVnaW4gbmFtZS4gT25seSBhIG1lc3NhZ2UgdGhhdCBvcGVucyBhIG5vdGljZSBpc1xuICAgKiBwcmVmaXhlZDsgYSBtZXNzYWdlIGFwcGVuZGVkIHRvIG9uZSBhbHJlYWR5IHNob3dpbmcgaXQgaXMgbm90LCBzbyB0aGUgbmFtZSBpcyBub3QgcmVwZWF0ZWQgb24gZXZlcnlcbiAgICogbGluZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuZGVyIHRoZSBjbG9zZSBidXR0b24gd2hlbiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGROb3RpY2VDb250ZW50UGFyYW1zLnJlcXVpcmVzRXhwbGljaXRDbG9zZX0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGJ1aWx0IG1lc3NhZ2U6IHRoZSB3cmFwcGVyIGVsZW1lbnQgaG9sZGluZyBpdCwgYW5kIHRoZSBmcmFnbWVudCB0aGF0IGVsZW1lbnQgc2l0cyBpbi5cbiAqXG4gKiBUaGUgZWxlbWVudCBpcyBoYW5kZWQgYmFjayBiZWNhdXNlIGEgbm90aWNlIGNhbiBob2xkIHNldmVyYWwgb2YgdGhlbSAoc2VlIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLkFwcGVuZH0pLFxuICogc28gd2hvZXZlciBvd25zIG9uZSBtZXNzYWdlIGhhcyB0byBiZSBhYmxlIHRvIHVwZGF0ZSBvciByZW1vdmUgZXhhY3RseSB0aGF0IG1lc3NhZ2UuIFRoZSByZWZlcmVuY2VcbiAqIHN0YXlzIHZhbGlkIG9uY2UgdGhlIGZyYWdtZW50IGlzIGhhbmRlZCB0byBgTm90aWNlYDogYXBwZW5kaW5nIGEgZnJhZ21lbnQgbW92ZXMgaXRzIGNoaWxkcmVuIHJhdGhlclxuICogdGhhbiBjb3B5aW5nIHRoZW0uXG4gKi9cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnROb3RpY2VDb250ZW50IHtcbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHdyYXBwaW5nIHRoaXMgbWVzc2FnZSBhbG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnRFbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBmcmFnbWVudCBob2xkaW5nIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnROb3RpY2VDb250ZW50LmNvbnRlbnRFbH0sIHJlYWR5IHRvIGhhbmQgdG8gYE5vdGljZWBcbiAgICogb3IgdG8gYXBwZW5kIGludG8gb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQ7XG59XG5cbi8qKlxuICogQSBtZXNzYWdlIHRoYXQgaGFzIGJlZW4gcHV0IG9uIHNjcmVlbiwgYW5kIHdoZXJlIGl0IGVuZGVkIHVwLlxuICovXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2Uge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgaG9sZGluZyB0aGlzIG1lc3NhZ2UgYWxvbmUsIGluc2lkZSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2Uubm90aWNlfS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnRFbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBtZXNzYWdlIGNyZWF0ZWQgdGhlIG5vdGljZSwgYXMgb3Bwb3NlZCB0byBqb2luaW5nIG9uZSB0aGF0IHdhcyBhbHJlYWR5IG9uIHNjcmVlbi5cbiAgICogT25seSB0aGUgY3JlYXRvciBtYXkgaGlkZSBpdDsgYSBqb2luZWQgbWVzc2FnZSBjYW4gbWVyZWx5IHJlbW92ZSBpdHNlbGYuXG4gICAqL1xuICByZWFkb25seSBpc05vdGljZU93bmVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90aWNlIHRoZSBtZXNzYWdlIGlzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgbm90aWNlOiBOb3RpY2U7XG59XG5cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlV2l0aER1cmF0aW9uUGFyYW1zIHtcbiAgcmVhZG9ubHkgZHVyYXRpb25Jbk1pbGxpc2Vjb25kczogbnVsbCB8IG51bWJlcjtcbiAgcmVhZG9ubHkgbWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kZTogUGx1Z2luTm90aWNlTW9kZTtcbiAgcmVhZG9ubHkgb25DbG9zZUNsaWNrOiAoKGV2ZW50OiBQbHVnaW5Ob3RpY2VDbG9zZUNsaWNrRXZlbnQpID0+IFByb21pc2FibGU8dm9pZD4pIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBvbkhpZGU6ICgoaW5mbzogUGx1Z2luTm90aWNlSGlkZUluZm8pID0+IFByb21pc2FibGU8dm9pZD4pIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSByZXF1aXJlc0V4cGxpY2l0Q2xvc2U6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFNob3dDbG9zZUJ1dHRvbjogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBNYW5hZ2VzIHNob3dpbmcgcGx1Z2luIG5vdGljZXMuIEJ5IGRlZmF1bHQgYSBuZXcgbm90aWNlIGhpZGVzIHRoZSBwcmV2aW91cyBvbmUsIHNvIG9ubHkgdGhlIGxhdGVzdFxuICogbWVzc2FnZSBpcyBvbiBzY3JlZW47IHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5tb2RlfSBjaG9vc2VzIG90aGVyd2lzZSDigJQgc2VlXG4gKiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZX0uXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIG5hbWUgKHNob3duIGFzIHByZWZpeCBpbiBub3RpY2VzKS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjbG9zZUJ1dHRvbkNsaWNrZWROb3RpY2VzID0gbmV3IFdlYWtTZXQ8Tm90aWNlPigpO1xuICBwcml2YXRlIG5vdGljZTogTm90aWNlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucyA9IG5ldyBTZXQ8KCkgPT4gdm9pZD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFuZGFsb25lTm90aWNlcyA9IG5ldyBTZXQ8Tm90aWNlPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJDbGlja2VkTm90aWNlcyA9IG5ldyBXZWFrU2V0PE5vdGljZT4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbHVnaW4gbm90aWNlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnBsdWdpbk5hbWUgPSBwYXJhbXMucGx1Z2luTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNtaXNzZXMgdGhlIHBlcm1hbmVudCBub3RpY2UgbGVmdCBvdmVyIGZyb20gYSBwcmV2aW91cyBsb2FkIChlLmcuIGEgcHJldmlvdXMgcGx1Z2luIHNlc3Npb24pIG9uIGxvYWQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuICAgIGNvbnN0IHBlcm1hbmVudE5vdGljZSA9IHRoaXMuZ2V0UGVybWFuZW50Tm90aWNlKCk7XG4gICAgcGVybWFuZW50Tm90aWNlPy5oaWRlKCk7XG4gICAgdGhpcy5zZXRQZXJtYW5lbnROb3RpY2UobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgdGhlIGN1cnJlbnQgbm90aWNlIG9uIHVubG9hZCwgdW5sZXNzIGl0IGlzIHRoZSBwZXJtYW5lbnQgbm90aWNlICh3aGljaCBpcyBtZWFudCB0byBvdXRsaXZlIHRoZSBwbHVnaW4pLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9udW5sb2FkKCk6IHZvaWQge1xuICAgIC8vIENhbmNlbCBhbnkgZGVsYXllZCBub3RpY2Ugd2hvc2UgdGltZXIgaGFzIG5vdCBmaXJlZCB5ZXQsIHNvIGl0IG5ldmVyIGFwcGVhcnMgYWZ0ZXIgdW5sb2FkLlxuICAgIGZvciAoY29uc3QgY2FuY2VsUGVuZGluZ1RpbWVyIG9mIHNuYXBzaG90KHRoaXMucGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucykpIHtcbiAgICAgIGNhbmNlbFBlbmRpbmdUaW1lcigpO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZXRQZXJtYW5lbnROb3RpY2UoKSAhPT0gdGhpcy5ub3RpY2UpIHtcbiAgICAgIHRoaXMubm90aWNlPy5oaWRlKCk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc3RhbmRhbG9uZU5vdGljZSBvZiB0aGlzLnN0YW5kYWxvbmVOb3RpY2VzKSB7XG4gICAgICBzdGFuZGFsb25lTm90aWNlLmhpZGUoKTtcbiAgICB9XG4gICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXlzIGEgbm90aWNlIG1lc3NhZ2UgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdG8gZGlzcGxheS4gVGhlIG5vdGljZSBzaG93cyB0aGUgcGx1Z2luIG5hbWUgYWJvdmUgaXQsIHNvIGEgbGVhZGluZ1xuICAgKiBgPHBsdWdpbiBuYW1lPjpgIGluIHRoZSBtZXNzYWdlIGlzIGRyb3BwZWQgcmF0aGVyIHRoYW4gc2hvd24gdHdpY2UuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGRpc3BsYXlpbmcgdGhlIG5vdGljZS5cbiAgICogQHJldHVybnMgVGhlIG5vdGljZSBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgc2hvd05vdGljZShtZXNzYWdlOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nLCBvcHRpb25zPzogUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMpOiBOb3RpY2Uge1xuICAgIGNvbnN0IGlzUGVybWFuZW50ID0gb3B0aW9ucz8uaXNQZXJtYW5lbnQgPz8gZmFsc2U7XG4gICAgY29uc3Qgc2hvdWxkSGlkZU9uQ2xpY2sgPSBvcHRpb25zPy5zaG91bGRIaWRlT25DbGljayA/PyB0cnVlO1xuICAgIGNvbnN0IHJlcXVpcmVzRXhwbGljaXRDbG9zZSA9ICFzaG91bGRIaWRlT25DbGljaztcbiAgICBjb25zdCBtb2RlID0gb3B0aW9ucz8ubW9kZSA/PyAocmVxdWlyZXNFeHBsaWNpdENsb3NlID8gUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZSA6IFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZSk7XG5cbiAgICBpZiAob3B0aW9ucz8ubW9kZSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMubW9kZSAhPT0gUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZSAmJiByZXF1aXJlc0V4cGxpY2l0Q2xvc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBub3RpY2UgdGhhdCBkb2VzIG5vdCBoaWRlIG9uIGNsaWNrIG11c3QgYmUgc2hvd24gaW4gdGhlIHNlcGFyYXRlIG1vZGUuJyk7XG4gICAgfVxuICAgIGlmIChtb2RlID09PSBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlICYmIGlzUGVybWFuZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgcGVybWFuZW50IG5vdGljZSBjYW5ub3QgYmUgc2hvd24gaW4gdGhlIHNlcGFyYXRlIG1vZGUuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZHVyYXRpb25Jbk1pbGxpc2Vjb25kcyA9IGlzUGVybWFuZW50IHx8IHJlcXVpcmVzRXhwbGljaXRDbG9zZSA/IFBFUk1BTkVOVF9OT1RJQ0VfRFVSQVRJT05fSU5fTUlMTElTRUNPTkRTIDogbnVsbDtcbiAgICByZXR1cm4gdGhpcy5zaG93Tm90aWNlV2l0aER1cmF0aW9uKHtcbiAgICAgIGR1cmF0aW9uSW5NaWxsaXNlY29uZHMsXG4gICAgICBtZXNzYWdlLFxuICAgICAgbW9kZSxcbiAgICAgIG9uQ2xvc2VDbGljazogb3B0aW9ucz8ub25DbG9zZUNsaWNrLFxuICAgICAgb25IaWRlOiBvcHRpb25zPy5vbkhpZGUsXG4gICAgICByZXF1aXJlc0V4cGxpY2l0Q2xvc2UsXG4gICAgICBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50OiBpc1Blcm1hbmVudCxcbiAgICAgIHNob3VsZFNob3dDbG9zZUJ1dHRvbjogb3B0aW9ucz8uc2hvdWxkU2hvd0Nsb3NlQnV0dG9uID8/IHRydWVcbiAgICB9KS5ub3RpY2U7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSBub3RpY2UgZGVzY3JpYmluZyBhIGxvbmctcnVubmluZyBvcGVyYXRpb24sIGJ1dCBvbmx5IG9uY2UgdGhlIG9wZXJhdGlvbiBoYXMgcnVuIGZvciBsb25nZXJcbiAgICogdGhhbiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZUFmdGVyRGVsYXlQYXJhbXMuZGVsYXlJbk1pbGxpc2Vjb25kc30g4oCUIHNvIG9wZXJhdGlvbnNcbiAgICogdGhhdCBmaW5pc2ggc29vbmVyIG5ldmVyIGZsYXNoIGEgbm90aWNlLiBUaGUgbm90aWNlIHN0YXlzIHVudGlsIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZX0gaXNcbiAgICogZGlzcG9zZWQgKHdoaWNoIGFsc28gY2FuY2VscyB0aGUgcGVuZGluZyB0aW1lciBpZiBpdCBoYXMgbm90IGZpcmVkIHlldCksIHNvIGl0IGNhbiBiZSB1c2VkIHdpdGhcbiAgICogYHVzaW5nYC4gV2hlbiBhbiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZUFmdGVyRGVsYXlQYXJhbXMuYWJvcnRDb250cm9sbGVyfSBpcyBnaXZlbiwgYVxuICAgKiBDYW5jZWwgYnV0dG9uIHRoYXQgYWJvcnRzIGl0IGlzIGFwcGVuZGVkIChhbmQsIGJlaW5nIGludGVyYWN0aXZlLCBkb2VzIG5vdCBkaXNtaXNzIHRoZSBub3RpY2UpLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiB1c2luZyBfbm90aWNlID0gcGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2VBZnRlckRlbGF5KHtcbiAgICogICBhYm9ydENvbnRyb2xsZXIsXG4gICAqICAgY29udGVudDogKCkgPT4gYnVpbGRQcm9ncmVzc0ZyYWdtZW50KClcbiAgICogfSk7XG4gICAqIGF3YWl0IHJ1bk9wZXJhdGlvbihhYm9ydENvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50RGVsYXllZE5vdGljZX0gdGhhdCBoaWRlcyB0aGUgbm90aWNlIChvciBjYW5jZWxzIHRoZSBwZW5kaW5nXG4gICAqIHRpbWVyKSB3aGVuIGRpc3Bvc2VkIGFuZCBsZXRzIHRoZSBjb250ZW50IGJlIHVwZGF0ZWQgd2hpbGUgaXQgaXMgc2hvd24uXG4gICAqL1xuICBwdWJsaWMgc2hvd05vdGljZUFmdGVyRGVsYXkocGFyYW1zOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcyk6IFBsdWdpbk5vdGljZUNvbXBvbmVudERlbGF5ZWROb3RpY2Uge1xuICAgIGNvbnN0IG1vZGUgPSBwYXJhbXMubW9kZSA/PyBQbHVnaW5Ob3RpY2VNb2RlLlJlcGxhY2U7XG4gICAgLy8gV2hlcmUgdGhpcyBtZXNzYWdlIGVuZGVkIHVwOiBhIG5vdGljZSBvZiBpdHMgb3duLCBvciBhIGNodW5rIGluc2lkZSBvbmUgdGhhdCB3YXMgYWxyZWFkeSB1cC4gSXRcbiAgICAvLyBkZWNpZGVzIHdoYXQgYHNldENvbnRlbnRgIHJld3JpdGVzIGFuZCB3aGF0IGRpc3Bvc2luZyB0YWtlcyBhd2F5LlxuICAgIGxldCBzaG93bjogbnVsbCB8IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3duTm90aWNlID0gbnVsbDtcbiAgICBsZXQgaXNEaXNwb3NlZCA9IGZhbHNlO1xuICAgIGxldCB0aW1lcklkID0gMDtcbiAgICBsZXQgY3VycmVudENvbnRlbnQ6IFZhbHVlUHJvdmlkZXI8RG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZz4gPSBwYXJhbXMuY29udGVudDtcblxuICAgIGNvbnN0IGNhbmNlbFBlbmRpbmdUaW1lciA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgICB0aGlzLnBlbmRpbmdUaW1lckNhbmNlbGxhdGlvbnMuZGVsZXRlKGNhbmNlbFBlbmRpbmdUaW1lcik7XG4gICAgfTtcblxuICAgIGNvbnN0IGJ1aWxkRGVsYXllZE1lc3NhZ2UgPSAoY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZyk6IERvY3VtZW50RnJhZ21lbnQgPT5cbiAgICAgIHRoaXMuYnVpbGREZWxheWVkTm90aWNlTWVzc2FnZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGREZWxheWVkTm90aWNlTWVzc2FnZVBhcmFtcz4oe1xuICAgICAgICBhYm9ydENvbnRyb2xsZXI6IHBhcmFtcy5hYm9ydENvbnRyb2xsZXIsXG4gICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6IHBhcmFtcy5jYW5jZWxCdXR0b25UZXh0LFxuICAgICAgICBjb250ZW50XG4gICAgICB9KSk7XG5cbiAgICB0aW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY2FuY2VsUGVuZGluZ1RpbWVyKCk7XG4gICAgICBpbnZva2VBc3luY1NhZmVseShhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIFJlc29sdmluZyB0aGUgY29udGVudCBpcyBhc3luY2hyb25vdXMsIGFuZCB0aGUgb3BlcmF0aW9uIHRoZSBub3RpY2UgZGVzY3JpYmVzIGtlZXBzIHJ1bm5pbmdcbiAgICAgICAgLy8gd2hpbGUgaXQgaGFwcGVucyDigJQgc28gYHNldENvbnRlbnRgIGNhbiBsYW5kIGluIGJldHdlZW4uIEl0IGNhbm5vdCByZXdyaXRlIGEgbm90aWNlIHRoYXQgZG9lc1xuICAgICAgICAvLyBub3QgZXhpc3QgeWV0LCBzbyByZXNvbHZlIGFnYWluIHdoZW5ldmVyIHRoYXQgaGFwcGVuczogdGhlIG5vdGljZSBtdXN0IG9wZW4gd2l0aCB0aGUgbWVzc2FnZVxuICAgICAgICAvLyB0aGUgY2FsbGVyIGxhc3QgYXNrZWQgZm9yLCBub3QgdGhlIG9uZSB0aGF0IHdhcyBjdXJyZW50IHdoZW4gcmVzb2x1dGlvbiBzdGFydGVkLlxuICAgICAgICBsZXQgcmVxdWVzdGVkQ29udGVudDogVmFsdWVQcm92aWRlcjxEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nPjtcbiAgICAgICAgbGV0IHJlc29sdmVkQ29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbiAgICAgICAgZG8ge1xuICAgICAgICAgIHJlcXVlc3RlZENvbnRlbnQgPSBjdXJyZW50Q29udGVudDtcbiAgICAgICAgICByZXNvbHZlZENvbnRlbnQgPSBhd2FpdCByZXNvbHZlVmFsdWUocmVxdWVzdGVkQ29udGVudCwge30pO1xuICAgICAgICAgIC8vIFRoZSBoYW5kbGUgbWF5IGhhdmUgYmVlbiBkaXNwb3NlZCB3aGlsZSB0aGUgY29udGVudCB3YXMgYmVpbmcgcmVzb2x2ZWQ7IGRvbid0IHNob3cgYSBzdGFsZSBub3RpY2UuXG4gICAgICAgICAgaWYgKGlzRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKHJlcXVlc3RlZENvbnRlbnQgIT09IGN1cnJlbnRDb250ZW50KTtcblxuICAgICAgICBzaG93biA9IHRoaXMuc2hvd05vdGljZVdpdGhEdXJhdGlvbih7XG4gICAgICAgICAgZHVyYXRpb25Jbk1pbGxpc2Vjb25kczogUEVSTUFORU5UX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgbWVzc2FnZTogYnVpbGREZWxheWVkTWVzc2FnZShyZXNvbHZlZENvbnRlbnQpLFxuICAgICAgICAgIG1vZGUsXG4gICAgICAgICAgb25DbG9zZUNsaWNrOiB1bmRlZmluZWQsXG4gICAgICAgICAgb25IaWRlOiB1bmRlZmluZWQsXG4gICAgICAgICAgcmVxdWlyZXNFeHBsaWNpdENsb3NlOiBmYWxzZSxcbiAgICAgICAgICBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50OiBmYWxzZSxcbiAgICAgICAgICBzaG91bGRTaG93Q2xvc2VCdXR0b246IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LCBwYXJhbXMuZGVsYXlJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0RFTEFZX0JFRk9SRV9TSE9XX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICB0aGlzLnBlbmRpbmdUaW1lckNhbmNlbGxhdGlvbnMuYWRkKGNhbmNlbFBlbmRpbmdUaW1lcik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2V0Q29udGVudDogKGNvbnRlbnQ6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgY3VycmVudENvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICBpZiAoIXNob3duKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFN3YXBzIFRISVMgbWVzc2FnZSdzIGVsZW1lbnQgZm9yIGEgZnJlc2hseSBidWlsdCBvbmUsIHJhdGhlciB0aGFuIHJld3JpdGluZyB0aGUgd2hvbGUgbm90aWNlOlxuICAgICAgICAvLyBXaGVuIHRoZSBoYW5kbGUgam9pbmVkIGEgbm90aWNlIHRoYXQgd2FzIGFscmVhZHkgdXAsIHRoZSBvdGhlciBtZXNzYWdlcyBpbiBpdCBhcmUgbm90IGl0cyB0b1xuICAgICAgICAvLyBvdmVyd3JpdGUuIFJlYnVpbGRpbmcgYWxzbyByZS1hcHBsaWVzIHRoZSBwcmVmaXgsIHRoZSBpbnRlcmFjdGl2ZSBndWFyZCwgYW5kIHRoZSBDYW5jZWwgYnV0dG9uLlxuICAgICAgICBjb25zdCByZWJ1aWx0ID0gdGhpcy5idWlsZE5vdGljZUNvbnRlbnQoe1xuICAgICAgICAgIG1lc3NhZ2U6IGJ1aWxkRGVsYXllZE1lc3NhZ2UoY29udGVudCksXG4gICAgICAgICAgc2hvdWxkUHJlZml4V2l0aFBsdWdpbk5hbWU6IHNob3duLmlzTm90aWNlT3duZWRcbiAgICAgICAgfSk7XG4gICAgICAgIHNob3duLmNvbnRlbnRFbC5yZXBsYWNlV2l0aChyZWJ1aWx0LmZyYWdtZW50KTtcbiAgICAgICAgc2hvd24gPSB7IC4uLnNob3duLCBjb250ZW50RWw6IHJlYnVpbHQuY29udGVudEVsIH07XG4gICAgICB9LFxuICAgICAgW1N5bWJvbC5kaXNwb3NlXTogKCk6IHZvaWQgPT4ge1xuICAgICAgICBpc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgY2FuY2VsUGVuZGluZ1RpbWVyKCk7XG4gICAgICAgIGlmICghc2hvd24pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gQSBub3RpY2UgdGhpcyBoYW5kbGUgb3BlbmVkIGdvZXMgYXdheSB3aXRoIGl0OyBhIG5vdGljZSBpdCBtZXJlbHkgam9pbmVkIGJlbG9uZ3MgdG8gd2hvZXZlclxuICAgICAgICAvLyBvcGVuZWQgaXQsIHNvIG9ubHkgdGhpcyBtZXNzYWdlIGlzIHRha2VuIG91dCBvZiBpdC5cbiAgICAgICAgaWYgKHNob3duLmlzTm90aWNlT3duZWQpIHtcbiAgICAgICAgICBzaG93bi5ub3RpY2UuaGlkZSgpO1xuICAgICAgICAgIHRoaXMuc3RhbmRhbG9uZU5vdGljZXMuZGVsZXRlKHNob3duLm5vdGljZSk7XG4gICAgICAgICAgaWYgKHRoaXMubm90aWNlID09PSBzaG93bi5ub3RpY2UpIHtcbiAgICAgICAgICAgIHRoaXMubm90aWNlID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvd24uY29udGVudEVsLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGEgY2xvc2UgKFgpIGJ1dHRvbiB0byB0aGUgbm90aWNlIGNvbnRlbnQuIENsaWNraW5nIGl0IGZpcmVzXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRBcHBlbmRDbG9zZUJ1dHRvblBhcmFtcy5vbkNsb3NlQ2xpY2t9ICh3aGljaCBtYXkgY2FuY2VsIHRoZSBjbG9zZSk7IGlmXG4gICAqIG5vdCBjYW5jZWxsZWQsIGl0IGhpZGVzIHRoZSBub3RpY2UgYW5kIGRyb3BzIGl0IGZyb20gdGhlIHN0YW5kYWxvbmUtbm90aWNlIHRyYWNraW5nIHNldC4gVGhlIGhpZGUgaXNcbiAgICogbWFya2VkIGFzIGEgY2xvc2UtYnV0dG9uIGNsaWNrIHNvIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5vbkhpZGV9IGNhblxuICAgKiBkaXN0aW5ndWlzaCBpdC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBlbmRDbG9zZUJ1dHRvbihwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudEFwcGVuZENsb3NlQnV0dG9uUGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3QgeyBjb250ZW50RWwsIGdldE5vdGljZSwgb25DbG9zZUNsaWNrIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgY2xvc2VCdXR0b25FbCA9IGNvbnRlbnRFbC5jcmVhdGVFbCgnYnV0dG9uJywge1xuICAgICAgYXR0cjogeyAnYXJpYS1sYWJlbCc6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5ub3RpY2VzLmNsb3NlQXJpYUxhYmVsKSB9XG4gICAgfSk7XG4gICAgLy8gUmV1c2UgT2JzaWRpYW4ncyBtb2RhbCBjbG9zZS1idXR0b24gY2xhc3NlcyBzbyB0aGlzIGJ1dHRvbiBtYXRjaGVzIHRoZSBuYXRpdmUgbW9kYWwgY2xvc2UgYnV0dG9uXG4gICAgLy8gKGxvb2sgYW5kIGhvdmVyKTsgdGhlIHN0eWxlc2hlZXQgb25seSBwb3NpdGlvbnMgaXQgaW4gdGhlIG5vdGljZSBjb3JuZXIuXG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3NlcyhjbG9zZUJ1dHRvbkVsLCBDc3NDbGFzcy5QbHVnaW5Ob3RpY2VDbG9zZUJ1dHRvbik7XG4gICAgY2xvc2VCdXR0b25FbC5hZGRDbGFzc2VzKFtDc3NDbGFzcy5DbGlja2FibGVJY29uLCBDc3NDbGFzcy5Nb2RhbEhlYWRlckJ1dHRvbl0pO1xuICAgIHNldEljb24oY2xvc2VCdXR0b25FbCwgJ3gnKTtcbiAgICBjbG9zZUJ1dHRvbkVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCRldmVudCkgPT4ge1xuICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaW52b2tlQXN5bmNTYWZlbHkoYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgaXNDYW5jZWxsZWQgPSBmYWxzZTtcbiAgICAgICAgYXdhaXQgb25DbG9zZUNsaWNrPy4oe1xuICAgICAgICAgIGNhbmNlbDogKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIENhbiBiZSBjYW5jZWxsZWQgYnkgdGhlIHVzZXIuXG4gICAgICAgIGlmIChpc0NhbmNlbGxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBub3RpY2UgPSBlbnN1cmVOb25OdWxsYWJsZShnZXROb3RpY2UoKSk7XG4gICAgICAgIHRoaXMuY2xvc2VCdXR0b25DbGlja2VkTm90aWNlcy5hZGQobm90aWNlKTtcbiAgICAgICAgbm90aWNlLmhpZGUoKTtcbiAgICAgICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5kZWxldGUobm90aWNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBtZXNzYWdlIHRvIHRoZSBub3RpY2UgY3VycmVudGx5IGluIHRoZSBwZXItcGx1Z2luIHNsb3QsIHNvIGJvdGggbWVzc2FnZXMgc3RheSBvbiBzY3JlZW4gaW4gYVxuICAgKiBzaW5nbGUgbm90aWNlLlxuICAgKlxuICAgKiBUaGUgYXBwZW5kZWQgbWVzc2FnZSBjYXJyaWVzIG5vIHBsdWdpbi1uYW1lIHByZWZpeCDigJQgdGhlIG5vdGljZSBhbHJlYWR5IG9wZW5zIHdpdGggb25lLCBhbmRcbiAgICogcmVwZWF0aW5nIGl0IG9uIGV2ZXJ5IGxpbmUgcmVhZHMgYXMgbm9pc2UuIEl0IGlzIHdyYXBwZWQgbGlrZSBhbnkgb3RoZXIgbm90aWNlIGNvbnRlbnQsIHNvIGEgbGluayBvclxuICAgKiBidXR0b24gaW5zaWRlIGl0IHN0aWxsIGtlZXBzIHRoZSBub3RpY2Ugb3BlbiB3aGVuIGNsaWNrZWQuXG4gICAqXG4gICAqIEFwcGVuZGluZyByZXN0YXJ0cyB0aGUgbm90aWNlJ3MgY291bnRkb3duICh7QGxpbmsgTm90aWNlLnNldEF1dG9IaWRlfSksIHNvIHRoZSBuZXcgbWVzc2FnZSBnZXRzIGFcbiAgICogZnVsbCBkdXJhdGlvbiBpbnN0ZWFkIG9mIGluaGVyaXRpbmcgd2hhdCB3YXMgbGVmdCBvZiB0aGUgY3VycmVudCBvbmUg4oCUIGEgbGluZSBhcHBlbmRlZCBhIG1vbWVudFxuICAgKiBiZWZvcmUgdGhlIG5vdGljZSBleHBpcmVzIHdvdWxkIG90aGVyd2lzZSBmbGFzaCBhbmQgdmFuaXNoLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2V9IGRlc2NyaWJpbmcgdGhlIGpvaW5lZCBub3RpY2UsIG9yIGBudWxsYCB3aGVuXG4gICAqIHRoZXJlIGlzIG5vdGhpbmcgb24gc2NyZWVuIHRvIGFwcGVuZCB0byDigJQgdGhlIHNsb3QgaXMgZW1wdHksIG9yIGl0cyBub3RpY2UgaGFzIHNpbmNlIGJlZW4gZGlzbWlzc2VkXG4gICAqIOKAlCBhbmQgdGhlIGNhbGxlciBzaG91bGQgc2hvdyBhIG5ldyBub3RpY2UgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgYXBwZW5kVG9DdXJyZW50Tm90aWNlKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kVG9DdXJyZW50Tm90aWNlUGFyYW1zKTogbnVsbCB8IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3duTm90aWNlIHtcbiAgICBjb25zdCB7IGR1cmF0aW9uSW5NaWxsaXNlY29uZHMsIG1lc3NhZ2UsIG9uSGlkZSwgc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudCB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGN1cnJlbnROb3RpY2UgPSB0aGlzLm5vdGljZTtcbiAgICAvLyBgaXNTaG93bmAgaXMgdGhlIHNhbWUgY2hlY2sgT2JzaWRpYW4ncyBvd24gYE5vdGljZS5oaWRlYCBtYWtlcyBiZWZvcmUgYW5pbWF0aW5nIGEgbm90aWNlIGF3YXksIHNvXG4gICAgLy8gaXQgaXMgZXhhY3RseSBcInN0aWxsIG9uIHNjcmVlblwiOiBhIG5vdGljZSB0aGF0IGV4cGlyZWQgb3Igd2FzIGRpc21pc3NlZCBoYXMgYmVlbiBkZXRhY2hlZC5cbiAgICBpZiAoIWN1cnJlbnROb3RpY2U/LmNvbnRhaW5lckVsLmlzU2hvd24oKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb250ZW50RWwsIGZyYWdtZW50IH0gPSB0aGlzLmJ1aWxkTm90aWNlQ29udGVudCh7IG1lc3NhZ2UsIHNob3VsZFByZWZpeFdpdGhQbHVnaW5OYW1lOiBmYWxzZSB9KTtcbiAgICBjdXJyZW50Tm90aWNlLm1lc3NhZ2VFbC5hcHBlbmQoZnJhZ21lbnQpO1xuICAgIC8vIEEgYG51bGxgIGR1cmF0aW9uIG1lYW5zIFwiT2JzaWRpYW4ncyBvd24gZGVmYXVsdFwiLCB3aGljaCBvbmx5IHRoZSBjb25zdHJ1Y3RvciBhcHBsaWVzIOKAlCBzbyByZXN0YXJ0XG4gICAgLy8gdGhlIGNvdW50ZG93biB3aXRoIHRoYXQgc2FtZSBkZWZhdWx0IHJhdGhlciB0aGFuIGxlYXZpbmcgdGhlIGN1cnJlbnQgb25lIHJ1bm5pbmcuXG4gICAgY3VycmVudE5vdGljZS5zZXRBdXRvSGlkZShkdXJhdGlvbkluTWlsbGlzZWNvbmRzID8/IE9CU0lESUFOX0RFRkFVTFRfTk9USUNFX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyk7XG4gICAgdGhpcy53aXJlT25IaWRlKGN1cnJlbnROb3RpY2UsIG9uSGlkZSk7XG4gICAgLy8gT25seSBldmVyIHJlZ2lzdGVycywgbmV2ZXIgY2xlYXJzOiB0aGUgbm90aWNlIGJlaW5nIGFwcGVuZGVkIHRvIG1heSBhbHJlYWR5IGJlIHRoaXMgcGx1Z2luJ3NcbiAgICAvLyBwZXJtYW5lbnQgbm90aWNlLCBhbmQgYSBsYXRlciBhcHBlbmRlZCBtZXNzYWdlIGlzIG5vIHJlYXNvbiB0byBmb3JnZXQgdGhhdC5cbiAgICBpZiAoc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudCkge1xuICAgICAgdGhpcy5zZXRQZXJtYW5lbnROb3RpY2UoY3VycmVudE5vdGljZSk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvbnRlbnRFbCwgaXNOb3RpY2VPd25lZDogZmFsc2UsIG5vdGljZTogY3VycmVudE5vdGljZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgbWVzc2FnZSBmb3IgYSBkZWxheWVkIG5vdGljZTogdGhlIHJlc29sdmVkIGNvbnRlbnQsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSBDYW5jZWxcbiAgICogYnV0dG9uIHRoYXQgYWJvcnRzIHRoZSBwcm92aWRlZCBjb250cm9sbGVyIHdoZW4gY2xpY2tlZC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEb2N1bWVudEZyYWdtZW50fSBob2xkaW5nIHRoZSBjb250ZW50IGFuZCwgaWYgcmVxdWVzdGVkLCBhIENhbmNlbCBidXR0b24uXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRGVsYXllZE5vdGljZU1lc3NhZ2UocGFyYW1zOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlUGFyYW1zKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgY29uc3QgeyBhYm9ydENvbnRyb2xsZXIsIGNhbmNlbEJ1dHRvblRleHQsIGNvbnRlbnQgfSA9IHBhcmFtcztcbiAgICBjb25zdCBmcmFnbWVudCA9IGNyZWF0ZUZyYWdtZW50KCk7XG4gICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dChjb250ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kKGNvbnRlbnQpO1xuICAgIH1cblxuICAgIGlmIChhYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgIC8vIGBCdXR0b25Db21wb25lbnRgIHJlcXVpcmVzIGFuIGBIVE1MRWxlbWVudGAgcGFyZW50LCBzbyBidWlsZCBpdCBvbiBhIHRocm93YXdheVxuICAgICAgLy8gZGV0YWNoZWQgZWxlbWVudCBhbmQgbW92ZSBpdHMgYGJ1dHRvbkVsYCBpbnRvIHRoZSBmcmFnbWVudC5cbiAgICAgIGNvbnN0IGNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b25Db21wb25lbnQoY3JlYXRlRGl2KCkpO1xuICAgICAgY2FuY2VsQnV0dG9uLnNldEJ1dHRvblRleHQoY2FuY2VsQnV0dG9uVGV4dCA/PyB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMuYnV0dG9ucy5jYW5jZWwpKTtcbiAgICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoY2FuY2VsQnV0dG9uLmJ1dHRvbkVsLCBDc3NDbGFzcy5DYW5jZWxCdXR0b24pO1xuICAgICAgLy8gVGhlIGNsaWNrIGlzIHdpcmVkIHZpYSBgYWRkRXZlbnRMaXN0ZW5lcmAgcmF0aGVyIHRoYW4gYEJ1dHRvbkNvbXBvbmVudC5vbkNsaWNrYCBzbyBpdFxuICAgICAgLy8gYnViYmxlcyB0aHJvdWdoIHRoZSBpbnRlcmFjdGl2ZS1lbGVtZW50IGd1YXJkIChrZWVwaW5nIHRoZSBub3RpY2Ugb3BlbikgYW5kIHN0YXlzXG4gICAgICAvLyBkaXJlY3RseSBleGVyY2lzYWJsZSB2aWEgYSBkaXNwYXRjaGVkIERPTSBldmVudCBpbiB1bml0IHRlc3RzLlxuICAgICAgY2FuY2VsQnV0dG9uLmJ1dHRvbkVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIH0pO1xuICAgICAgZnJhZ21lbnQuYXBwZW5kKGNhbmNlbEJ1dHRvbi5idXR0b25FbCk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIG5vdGljZSBjb250ZW50IHdyYXBwZWQgaW4gYSBjb250YWluZXIgdGhhdCBrZWVwcyB0aGUgbm90aWNlIG9wZW4gd2hlbiBhbiBpbnRlcmFjdGl2ZVxuICAgKiBlbGVtZW50IGluc2lkZSBpdCBpcyBjbGlja2VkLiBPYnNpZGlhbiBkaXNtaXNzZXMgYSBub3RpY2Ugb24gYW55IGNsaWNrIHRoYXQgYnViYmxlcyB1cCB0byBpdHNcbiAgICogZWxlbWVudDsgdGhlIGNvbnRhaW5lciBpbnRlcmNlcHRzIGNsaWNrcyBvcmlnaW5hdGluZyBvbiBhbiBpbnRlcmFjdGl2ZSBlbGVtZW50IChhIGxpbmssIGJ1dHRvbixcbiAgICogaW5wdXQsIGV0Yy4pIGFuZCBzdG9wcyB0aGVtIHRoZXJlLCBzbyB0aGUgZWxlbWVudCdzIG93biBoYW5kbGVyIHN0aWxsIHJ1bnMgYnV0IHRoZSBub3RpY2Ugc3RheXMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnROb3RpY2VDb250ZW50fSBob2xkaW5nIHRoZSB3cmFwcGVkIG5vdGljZSBjb250ZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE5vdGljZUNvbnRlbnQocGFyYW1zOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZE5vdGljZUNvbnRlbnRQYXJhbXMpOiBQbHVnaW5Ob3RpY2VDb21wb25lbnROb3RpY2VDb250ZW50IHtcbiAgICBjb25zdCB7IGdldE5vdGljZSwgb25DbG9zZUNsaWNrLCByZXF1aXJlc0V4cGxpY2l0Q2xvc2UgPSBmYWxzZSwgc2hvdWxkUHJlZml4V2l0aFBsdWdpbk5hbWUgPSB0cnVlLCBzaG91bGRTaG93Q2xvc2VCdXR0b24gPSB0cnVlIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuc3RyaXBQbHVnaW5OYW1lUHJlZml4KHBhcmFtcy5tZXNzYWdlKTtcbiAgICBjb25zdCBmcmFnbWVudCA9IGNyZWF0ZUZyYWdtZW50KCk7XG4gICAgY29uc3QgY29udGVudEVsID0gZnJhZ21lbnQuY3JlYXRlRGl2KCk7XG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyhjb250ZW50RWwsIENzc0NsYXNzLlBsdWdpbk5vdGljZUNvbnRlbnQpO1xuICAgIGlmIChzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZSkge1xuICAgICAgY29udGVudEVsLmFwcGVuZCh0aGlzLmJ1aWxkUHJlZml4ZWRNZXNzYWdlKG1lc3NhZ2UpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgY29udGVudEVsLmFwcGVuZFRleHQobWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnRFbC5hcHBlbmQobWVzc2FnZSk7XG4gICAgfVxuICAgIGNvbnRlbnRFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgkZXZlbnQpID0+IHtcbiAgICAgIC8vIEEgaGFyZC10by1jbG9zZSBub3RpY2UgbXVzdCBub3QgZGlzbWlzcyBvbiBhbnkgc3RyYXkgY2xpY2s7IG9ubHkgaXRzIGNsb3NlIGJ1dHRvbiBtYXkgaGlkZSBpdC5cbiAgICAgIGlmIChyZXF1aXJlc0V4cGxpY2l0Q2xvc2UpIHtcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoJGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgJGV2ZW50LnRhcmdldC5jbG9zZXN0KElOVEVSQUNUSVZFX0VMRU1FTlRfU0VMRUNUT1IpKSB7XG4gICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChyZXF1aXJlc0V4cGxpY2l0Q2xvc2UgJiYgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uKSB7XG4gICAgICB0aGlzLmFwcGVuZENsb3NlQnV0dG9uKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQbHVnaW5Ob3RpY2VDb21wb25lbnRBcHBlbmRDbG9zZUJ1dHRvblBhcmFtcz4oe1xuICAgICAgICBjb250ZW50RWwsXG4gICAgICAgIGdldE5vdGljZTogZW5zdXJlTm9uTnVsbGFibGUoZ2V0Tm90aWNlKSxcbiAgICAgICAgb25DbG9zZUNsaWNrXG4gICAgICB9KSk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvbnRlbnRFbCwgZnJhZ21lbnQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIG5vdGljZSBjb250ZW50LCBwcmVmaXhpbmcgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgcGx1Z2luIG5hbWUgaW4gYSBzdHlsZWQgZWxlbWVudCBzbyBpdCBpc1xuICAgKiB2aXN1YWxseSBkaXN0aW5ndWlzaGVkIGZyb20gdGhlIG1lc3NhZ2UgYm9keS5cbiAgICpcbiAgICogVGhlIG5hbWUgaXMgcmVuZGVyZWQgYXMgaW5saW5lIGNvZGUsIHRoZSB3YXkgZXZlcnkgcGx1Z2luIG5hbWUgaW4gdGhlIFVJIGlzLCBpbnNpZGUgYSBzcGFuIHRoYXQga2VlcHNcbiAgICogdGhlIHByZWZpeCdzIG93biBsYXlvdXQgYW5kIGFjY2VudCBjb2xvci5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBkaXNwbGF5IGFmdGVyIHRoZSBwbHVnaW4gbmFtZSBwcmVmaXguXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IHdpdGggdGhlIHN0eWxlZCBwbHVnaW4gbmFtZSBwcmVmaXggZm9sbG93ZWQgYnkgdGhlIG1lc3NhZ2UuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUHJlZml4ZWRNZXNzYWdlKG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBjb25zdCBmcmFnbWVudCA9IGNyZWF0ZUZyYWdtZW50KCk7XG4gICAgY29uc3QgbmFtZUVsID0gY3JlYXRlU3BhbigpO1xuICAgIGFwcGVuZENvZGVCbG9jayhuYW1lRWwsIHRoaXMucGx1Z2luTmFtZSk7XG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3NlcyhuYW1lRWwsIENzc0NsYXNzLlBsdWdpbk5vdGljZU5hbWUpO1xuICAgIGZyYWdtZW50LmFwcGVuZChuYW1lRWwpO1xuICAgIGlmICghdGhpcy5fbG9hZGVkKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmRUZXh0KCcgKHVubG9hZGVkKScpO1xuICAgIH1cbiAgICBmcmFnbWVudC5hcHBlbmRUZXh0KCdcXG4nKTtcbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmRUZXh0KG1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmQobWVzc2FnZSk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGVybWFuZW50Tm90aWNlKCk6IE5vdGljZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmdldFBlcm1hbmVudE5vdGljZXMoKS5nZXQodGhpcy5wbHVnaW5OYW1lKSA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQZXJtYW5lbnROb3RpY2VzKCk6IE1hcDxzdHJpbmcsIE5vdGljZT4ge1xuICAgIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGU8TWFwPHN0cmluZywgTm90aWNlPj4oUEVSTUFORU5UX05PVElDRVNfU1RBVEVfS0VZLCBuZXcgTWFwPHN0cmluZywgTm90aWNlPigpKS52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZWFzdXJlcyBhIGxlYWRpbmcgYDxwbHVnaW4gbmFtZT46YCBpbiBhIG1lc3NhZ2UsIHRvZ2V0aGVyIHdpdGggdGhlIHdoaXRlc3BhY2UgYXJvdW5kIHRoZSBjb2xvbiBhbmRcbiAgICogYWZ0ZXIgaXQuXG4gICAqXG4gICAqIEBwYXJhbSB0ZXh0IC0gVGhlIG1lc3NhZ2UgdGV4dC5cbiAgICogQHJldHVybnMgVGhlIGxlbmd0aCBvZiB0aGUgcHJlZml4LCBvciBgMGAgd2hlbiB0aGUgdGV4dCBkb2VzIG5vdCBvcGVuIHdpdGggdGhpcyBwbHVnaW4ncyBuYW1lIGFuZCBhXG4gICAqIGNvbG9uLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRQbHVnaW5OYW1lUHJlZml4TGVuZ3RoKHRleHQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLnBsdWdpbk5hbWUgfHwgIXRleHQuc3RhcnRzV2l0aCh0aGlzLnBsdWdpbk5hbWUpKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc3Qgc2VwYXJhdG9yTWF0Y2ggPSAvXlxccyo6XFxzKi8uZXhlYyh0ZXh0LnNsaWNlKHRoaXMucGx1Z2luTmFtZS5sZW5ndGgpKTtcbiAgICByZXR1cm4gc2VwYXJhdG9yTWF0Y2ggPyB0aGlzLnBsdWdpbk5hbWUubGVuZ3RoICsgc2VwYXJhdG9yTWF0Y2hbMF0ubGVuZ3RoIDogMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBhIG5vdGljZSBoYXJkIHRvIGNsb3NlOiBtYXJrcyBpdHMgb3V0ZXIgZWxlbWVudCAoc28gdGhlIENTUyBuZXV0cmFsaXplcyBpdHMgcGFkZGluZykgYW5kXG4gICAqIGluc3RhbGxzIGEgY2FwdHVyZS1waGFzZSBjbGljayBndWFyZCB0aGF0IHN0b3BzIGV2ZXJ5IGNsaWNrIGV4Y2VwdCBvbiBhbiBpbnRlcmFjdGl2ZSBlbGVtZW50IChhXG4gICAqIGJ1dHRvbiwgbGluaywgdGhlIGNsb3NlIGJ1dHRvbiwgZXRjLikgZnJvbSByZWFjaGluZyBPYnNpZGlhbidzIG93biBkaXNtaXNzIGhhbmRsZXIg4oCUIHNvIGFuXG4gICAqIGludGVyYWN0aXZlIGNoaWxkJ3Mgb3duIGhhbmRsZXIgc3RpbGwgcnVucyB3aGlsZSBhIHN0cmF5IGNsaWNrIGNhbm5vdCBkaXNtaXNzIHRoZSBub3RpY2UuXG4gICAqXG4gICAqIEBwYXJhbSBub3RpY2UgLSBUaGUgbm90aWNlIHRvIGd1YXJkLlxuICAgKiBAcGFyYW0gcmVxdWlyZXNFeHBsaWNpdENsb3NlIC0gV2hldGhlciB0aGUgbm90aWNlIHJlcXVpcmVzIGV4cGxpY2l0IGNsb3NlOyB3aGVuIGBmYWxzZWAsIG5vdGhpbmcgaXNcbiAgICogaW5zdGFsbGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsRXhwbGljaXRDbG9zZUd1YXJkcyhub3RpY2U6IE5vdGljZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFyZXF1aXJlc0V4cGxpY2l0Q2xvc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVGhlIG91dGVyIGAubm90aWNlYCBlbGVtZW50IChgY29udGFpbmVyRWxgKSBjYXJyaWVzIE9ic2lkaWFuJ3MgZGlzbWlzcy1vbi1jbGljayBoYW5kbGVyIGFuZCB0aGVcbiAgICAvLyBwYWRkaW5nIGEgc3RyYXkgY2xpY2sgY291bGQgbGFuZCBvbjsgbWFyayBpdCBzbyB0aGUgc3R5bGVzaGVldCBkcm9wcyB0aGF0IHBhZGRpbmcuXG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyhub3RpY2UuY29udGFpbmVyRWwsIENzc0NsYXNzLlBsdWdpbk5vdGljZVJlcXVpcmVzRXhwbGljaXRDbG9zZSk7XG4gICAgLy8gU3RvcCBldmVyeSBjbGljayBvbiB0aGUgbm90aWNlIOKAlCBleGNlcHQgb24gYW4gaW50ZXJhY3RpdmUgZWxlbWVudCDigJQgZnJvbSByZWFjaGluZyBPYnNpZGlhbidzXG4gICAgLy8gZGlzbWlzcyBoYW5kbGVyLiBSZWdpc3RlcmVkIGluIHRoZSBjYXB0dXJlIHBoYXNlIG9uIHRoZSBvdXRlcm1vc3QgZWxlbWVudCBzbyBpdCBhbHdheXMgcnVucyBmaXJzdC5cbiAgICAvLyBMZXR0aW5nIGEgY2xpY2sgcmVhY2ggYW4gaW50ZXJhY3RpdmUgY2hpbGQgKGEgYnV0dG9uLCBsaW5rLCB0aGUgY2xvc2UgYnV0dG9uLCBldGMuKSBpcyB3aGF0IGtlZXBzXG4gICAgLy8gaXRzIG93biBoYW5kbGVyIHdvcmtpbmc7IHRoZSBidWJibGUtcGhhc2UgZ3VhcmQgb24gdGhlIGNvbnRlbnQgd3JhcHBlciB0aGVuIHN0b3BzIHRoYXQgY2xpY2sgZnJvbVxuICAgIC8vIGJ1YmJsaW5nIHVwIHRvIE9ic2lkaWFuJ3MgZGlzbWlzcyBoYW5kbGVyLCBzbyB0aGUgbm90aWNlIHN0aWxsIHN0YXlzIG9wZW4uXG4gICAgbm90aWNlLmNvbnRhaW5lckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCRldmVudCkgPT4ge1xuICAgICAgaWYgKCRldmVudC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmICRldmVudC50YXJnZXQuY2xvc2VzdChJTlRFUkFDVElWRV9FTEVNRU5UX1NFTEVDVE9SKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrcyBhIGNsaWNrIG9uIHRoZSBub3RpY2Ugc28ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uSGlkZX0gY2FuIHJlcG9ydCBhXG4gICAqIHVzZXIgZGlzbWlzc2FsLiBPYnNpZGlhbiBoaWRlcyBhIGRpc21pc3NpYmxlIG5vdGljZSBzeW5jaHJvbm91c2x5IGR1cmluZyB0aGUgY2xpY2ssIHNvIGFcbiAgICogY2FwdHVyZS1waGFzZSBsaXN0ZW5lciBtYXJrcyB0aGUgbm90aWNlIGJlZm9yZSB0aGF0IGhpZGUgcnVuczsgdGhlIG1hcmsgaXMgY2xlYXJlZCBhZnRlciB0aGUgZXZlbnRcbiAgICogc28gYSBsYXRlciBwcm9ncmFtbWF0aWMgaGlkZSBpcyBub3QgbWlzYXR0cmlidXRlZC4gQSBjbG9zZS1idXR0b24gY2xpY2sgaXMgdHJhY2tlZCBzZXBhcmF0ZWx5IChzZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudC5hcHBlbmRDbG9zZUJ1dHRvbn0pLlxuICAgKlxuICAgKiBAcGFyYW0gbm90aWNlIC0gVGhlIG5vdGljZSB0byB0cmFjay5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFVzZXJDbGlja1RyYWNraW5nKG5vdGljZTogTm90aWNlKTogdm9pZCB7XG4gICAgbm90aWNlLmNvbnRhaW5lckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgLy8gT2JzaWRpYW4gZGlzbWlzc2VzIGEgZGlzbWlzc2libGUgbm90aWNlIHN5bmNocm9ub3VzbHkgZHVyaW5nIHRoaXMgY2xpY2ssIHNvIG1hcmsgaXQgbm93IChiZWZvcmVcbiAgICAgIC8vIHRoYXQgaGlkZSBydW5zKSBhbmQgY2xlYXIgaXQgb24gdGhlIG5leHQgbWljcm90YXNrIOKAlCBhZnRlciBhbnkgc3luY2hyb25vdXMgZGlzbWlzcywgYnV0IGJlZm9yZSBhXG4gICAgICAvLyBsYXRlciBwcm9ncmFtbWF0aWMgaGlkZSwgc28gdGhhdCBoaWRlIGlzIG5vdCBtaXNhdHRyaWJ1dGVkIGFzIGEgdXNlciBhY3Rpb24uXG4gICAgICB0aGlzLnVzZXJDbGlja2VkTm90aWNlcy5hZGQobm90aWNlKTtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgdGhpcy51c2VyQ2xpY2tlZE5vdGljZXMuZGVsZXRlKG5vdGljZSk7XG4gICAgICB9KTtcbiAgICB9LCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldFBlcm1hbmVudE5vdGljZShub3RpY2U6IE5vdGljZSB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBtYXAgPSB0aGlzLmdldFBlcm1hbmVudE5vdGljZXMoKTtcbiAgICBpZiAobm90aWNlKSB7XG4gICAgICBtYXAuc2V0KHRoaXMucGx1Z2luTmFtZSwgbm90aWNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFwLmRlbGV0ZSh0aGlzLnBsdWdpbk5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG5vdGljZSB3aXRoIHRoZSBnaXZlbiBkdXJhdGlvbiwgcGxhY2luZyBpdCBhY2NvcmRpbmcgdG8gaXRzIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlfTogYVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlfSBub3RpY2UgdGFrZXMgdGhlIHBlci1wbHVnaW4gc2xvdCAoaGlkaW5nIHdoYXRldmVyIHdhcyBpbiBpdCwgYW5kXG4gICAqIG9wdGlvbmFsbHkgcmVnaXN0ZXJpbmcgYXMgdGhpcyBwbHVnaW4ncyBwZXJtYW5lbnQgbm90aWNlKSwgYW4ge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuQXBwZW5kfSBvbmVcbiAgICogam9pbnMgdGhlIG5vdGljZSBhbHJlYWR5IGluIHRoZSBzbG90LCBhbmQgYSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gb25lIGlzIHRyYWNrZWQgb24gaXRzXG4gICAqIG93biwgbGVhdmluZyB0aGUgc2xvdCB1bnRvdWNoZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93bk5vdGljZX0gZGVzY3JpYmluZyB3aGVyZSB0aGUgbWVzc2FnZSBlbmRlZCB1cC5cbiAgICovXG4gIHByaXZhdGUgc2hvd05vdGljZVdpdGhEdXJhdGlvbihwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VXaXRoRHVyYXRpb25QYXJhbXMpOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93bk5vdGljZSB7XG4gICAgY29uc3QgeyBkdXJhdGlvbkluTWlsbGlzZWNvbmRzLCBtZXNzYWdlLCBtb2RlLCBvbkNsb3NlQ2xpY2ssIG9uSGlkZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlLCBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50LCBzaG91bGRTaG93Q2xvc2VCdXR0b24gfSA9IHBhcmFtcztcbiAgICAvLyBPYnNpZGlhbidzIGBOb3RpY2VgIHRyZWF0cyBhbiBvbWl0dGVkIGR1cmF0aW9uIGFzIGl0cyBkZWZhdWx0LCBzbyBtYXAgdGhlIGBudWxsYCBcIm5vIGV4cGxpY2l0XG4gICAgLy8gZHVyYXRpb25cIiB2YWx1ZSB0byBgdW5kZWZpbmVkYC5cbiAgICBjb25zdCBub3RpY2VEdXJhdGlvbkluTWlsbGlzZWNvbmRzID0gZHVyYXRpb25Jbk1pbGxpc2Vjb25kcyA/PyB1bmRlZmluZWQ7XG5cbiAgICBpZiAobW9kZSA9PT0gUGx1Z2luTm90aWNlTW9kZS5BcHBlbmQpIHtcbiAgICAgIGNvbnN0IGFwcGVuZGVkTm90aWNlID0gdGhpcy5hcHBlbmRUb0N1cnJlbnROb3RpY2Uobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBsdWdpbk5vdGljZUNvbXBvbmVudEFwcGVuZFRvQ3VycmVudE5vdGljZVBhcmFtcz4oe1xuICAgICAgICBkdXJhdGlvbkluTWlsbGlzZWNvbmRzLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBvbkhpZGUsXG4gICAgICAgIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnRcbiAgICAgIH0pKTtcbiAgICAgIGlmIChhcHBlbmRlZE5vdGljZSkge1xuICAgICAgICByZXR1cm4gYXBwZW5kZWROb3RpY2U7XG4gICAgICB9XG4gICAgICAvLyBOb3RoaW5nIG9uIHNjcmVlbiB0byBhcHBlbmQgdG8sIHNvIHRoaXMgbWVzc2FnZSBiZWNvbWVzIHRoZSBzbG90J3Mgbm90aWNlIGluc3RlYWQuXG4gICAgfVxuXG4gICAgY29uc3QgaGFzQ2xvc2VCdXR0b24gPSByZXF1aXJlc0V4cGxpY2l0Q2xvc2UgJiYgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uO1xuICAgIC8vIFRoZSBjbG9zZSBidXR0b24ncyBjbGljayBoYW5kbGVyIG5lZWRzIHRoZSBgTm90aWNlYCwgd2hpY2ggZG9lcyBub3QgZXhpc3QgdW50aWwgaXQgaXMgYnVpbHQgZnJvbVxuICAgIC8vIHRoaXMgY29udGVudDsgY2FwdHVyZSBpdCBsYXppbHkgdmlhIGEgaG9sZGVyIHJlc29sdmVkIGF0IGNsaWNrIHRpbWUuIFRoZSBnZXR0ZXIgaXMgY3JlYXRlZCBvbmx5XG4gICAgLy8gd2hlbiBhIGNsb3NlIGJ1dHRvbiBpcyBzaG93bi5cbiAgICBsZXQgYnVpbHROb3RpY2U6IE5vdGljZSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IHsgY29udGVudEVsLCBmcmFnbWVudCB9ID0gdGhpcy5idWlsZE5vdGljZUNvbnRlbnQobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcz4oe1xuICAgICAgZ2V0Tm90aWNlOiBoYXNDbG9zZUJ1dHRvbiA/ICgpOiBOb3RpY2UgfCBudWxsID0+IGJ1aWx0Tm90aWNlIDogdW5kZWZpbmVkLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIG9uQ2xvc2VDbGljayxcbiAgICAgIHJlcXVpcmVzRXhwbGljaXRDbG9zZSxcbiAgICAgIHNob3VsZFNob3dDbG9zZUJ1dHRvblxuICAgIH0pKTtcblxuICAgIGlmIChtb2RlID09PSBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlKSB7XG4gICAgICBidWlsdE5vdGljZSA9IG5ldyBOb3RpY2UoZnJhZ21lbnQsIG5vdGljZUR1cmF0aW9uSW5NaWxsaXNlY29uZHMpO1xuICAgICAgdGhpcy5pbnN0YWxsRXhwbGljaXRDbG9zZUd1YXJkcyhidWlsdE5vdGljZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlKTtcbiAgICAgIHRoaXMuaW5zdGFsbFVzZXJDbGlja1RyYWNraW5nKGJ1aWx0Tm90aWNlKTtcbiAgICAgIHRoaXMud2lyZU9uSGlkZShidWlsdE5vdGljZSwgb25IaWRlKTtcbiAgICAgIHRoaXMuc3RhbmRhbG9uZU5vdGljZXMuYWRkKGJ1aWx0Tm90aWNlKTtcbiAgICAgIHJldHVybiB7IGNvbnRlbnRFbCwgaXNOb3RpY2VPd25lZDogdHJ1ZSwgbm90aWNlOiBidWlsdE5vdGljZSB9O1xuICAgIH1cblxuICAgIHRoaXMubm90aWNlPy5oaWRlKCk7XG4gICAgYnVpbHROb3RpY2UgPSBuZXcgTm90aWNlKGZyYWdtZW50LCBub3RpY2VEdXJhdGlvbkluTWlsbGlzZWNvbmRzKTtcbiAgICB0aGlzLm5vdGljZSA9IGJ1aWx0Tm90aWNlO1xuICAgIHRoaXMuaW5zdGFsbEV4cGxpY2l0Q2xvc2VHdWFyZHMoYnVpbHROb3RpY2UsIHJlcXVpcmVzRXhwbGljaXRDbG9zZSk7XG4gICAgdGhpcy5pbnN0YWxsVXNlckNsaWNrVHJhY2tpbmcoYnVpbHROb3RpY2UpO1xuICAgIHRoaXMud2lyZU9uSGlkZShidWlsdE5vdGljZSwgb25IaWRlKTtcblxuICAgIGlmIChzaG91bGRSZWdpc3RlckFzUGVybWFuZW50KSB7XG4gICAgICB0aGlzLnNldFBlcm1hbmVudE5vdGljZShidWlsdE5vdGljZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0UGVybWFuZW50Tm90aWNlKG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb250ZW50RWwsIGlzTm90aWNlT3duZWQ6IHRydWUsIG5vdGljZTogYnVpbHROb3RpY2UgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcm9wcyBhIGxlYWRpbmcgYDxwbHVnaW4gbmFtZT46YCBmcm9tIGEgbWVzc2FnZS4gVGhlIG5vdGljZSBhbHJlYWR5IG9wZW5zIHdpdGggdGhlIHBsdWdpbiBuYW1lIGluIGl0c1xuICAgKiBvd24gc3R5bGVkIGhlYWRlciwgc28gYSBtZXNzYWdlIHRoYXQgcmVwZWF0cyBpdCByZWFkcyBhcyB0aGUgbmFtZSB0d2ljZS5cbiAgICpcbiAgICogQSBmcmFnbWVudCBpcyBtYXRjaGVkIG9uIGl0cyB0ZXh0LCBzbyBhIG5hbWUgd3JhcHBlZCBpbiBhbiBlbGVtZW50IChzdWNoIGFzIGlubGluZSBjb2RlKSBzdGlsbFxuICAgKiBjb3VudHM7IHRoZSBwcmVmaXggaXMgY3V0IG91dCBvZiBpdHMgdGV4dCBub2RlcywgYW5kIGFuIGVsZW1lbnQgaXQgbGVhdmVzIGVtcHR5IGlzIHJlbW92ZWQuIFRoZSBuYW1lXG4gICAqIGlzIG1hdGNoZWQgZXhhY3RseSwgYW5kIG9ubHkgYXQgdGhlIHN0YXJ0OiBhIG1lc3NhZ2UgdGhhdCBtZXJlbHkgbWVudGlvbnMgdGhlIG5hbWUgbGF0ZXIgaXMgbGVmdFxuICAgKiBhbG9uZS5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZS5cbiAgICogQHJldHVybnMgVGhlIG1lc3NhZ2Ugd2l0aG91dCB0aGUgcHJlZml4LiBBIGZyYWdtZW50IGlzIGNoYW5nZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBzdHJpcFBsdWdpbk5hbWVQcmVmaXgobWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZyk6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBtZXNzYWdlLnNsaWNlKHRoaXMuZ2V0UGx1Z2luTmFtZVByZWZpeExlbmd0aChtZXNzYWdlKSk7XG4gICAgfVxuXG4gICAgbGV0IHJlbWFpbmluZ0xlbmd0aCA9IHRoaXMuZ2V0UGx1Z2luTmFtZVByZWZpeExlbmd0aChtZXNzYWdlLnRleHRDb250ZW50KTtcbiAgICBpZiAocmVtYWluaW5nTGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHRleHROb2RlIG9mIGdldFRleHROb2RlcyhtZXNzYWdlKSkge1xuICAgICAgaWYgKHRleHROb2RlLmRhdGEubGVuZ3RoID4gcmVtYWluaW5nTGVuZ3RoKSB7XG4gICAgICAgIHRleHROb2RlLmRhdGEgPSB0ZXh0Tm9kZS5kYXRhLnNsaWNlKHJlbWFpbmluZ0xlbmd0aCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmVtYWluaW5nTGVuZ3RoIC09IHRleHROb2RlLmRhdGEubGVuZ3RoO1xuICAgICAgLy8gQ2xpbWIgdG8gdGhlIG91dGVybW9zdCBlbGVtZW50IGhvbGRpbmcgbm90aGluZyBidXQgdGhpcyB0ZXh0LCBzbyBubyBlbXB0eSB3cmFwcGVyIGlzIGxlZnQgYmVoaW5kLlxuICAgICAgLy8gQSBub2RlIGRpcmVjdGx5IGluIHRoZSBmcmFnbWVudCBoYXMgbm8gcGFyZW50IGVsZW1lbnQsIHdoaWNoIGlzIHdoZXJlIHRoZSBjbGltYiBzdG9wcy5cbiAgICAgIGxldCBlbXB0aWVkTm9kZTogQ2hpbGROb2RlID0gdGV4dE5vZGU7XG4gICAgICB3aGlsZSAoZW1wdGllZE5vZGUucGFyZW50RWxlbWVudD8uY2hpbGROb2Rlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZW1wdGllZE5vZGUgPSBlbXB0aWVkTm9kZS5wYXJlbnRFbGVtZW50O1xuICAgICAgfVxuICAgICAgZW1wdGllZE5vZGUucmVtb3ZlKCk7XG4gICAgICBpZiAocmVtYWluaW5nTGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwcyBhIG5vdGljZSdzIGBoaWRlYCBzbyB0aGUgZ2l2ZW4gY2FsbGJhY2sgcnVucyB0aGUgZmlyc3QgdGltZSB0aGUgbm90aWNlIGlzIGhpZGRlbiDigJQgYnkgdGhlXG4gICAqIHVzZXIsIGJ5IGEgcmVwbGFjaW5nIG5vdGljZSwgYnkgaXRzIGR1cmF0aW9uIGVsYXBzaW5nLCBvciBvbiB1bmxvYWQuIERvZXMgbm90aGluZyB3aGVuIG5vIGNhbGxiYWNrXG4gICAqIGlzIGdpdmVuLlxuICAgKlxuICAgKiBAcGFyYW0gbm90aWNlIC0gVGhlIG5vdGljZSB3aG9zZSBgaGlkZWAgdG8gd3JhcC5cbiAgICogQHBhcmFtIG9uSGlkZSAtIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugb24gdGhlIGZpcnN0IGhpZGUsIG9yIGB1bmRlZmluZWRgIHRvIHNraXAgd3JhcHBpbmcuXG4gICAqL1xuICBwcml2YXRlIHdpcmVPbkhpZGUobm90aWNlOiBOb3RpY2UsIG9uSGlkZTogKChpbmZvOiBQbHVnaW5Ob3RpY2VIaWRlSW5mbykgPT4gUHJvbWlzYWJsZTx2b2lkPikgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIW9uSGlkZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSdW4gYG9uSGlkZWAgdGhlIGZpcnN0IHRpbWUgdGhlIG5vdGljZSBpcyBoaWRkZW4uIEEgYG9uY2VgIHBhdGNoIG9uIGBoaWRlYCBpbnRlcmNlcHRzIGV4YWN0bHkgb25lXG4gICAgLy8gY2FsbCB0aGVuIHVuaW5zdGFsbHMgaXRzZWxmICh1bmxvYWRpbmcgdGhpcyBkZWRpY2F0ZWQgY29tcG9uZW50KSwgc28gdGhlcmUgaXMgbm8gbWFudWFsXG4gICAgLy8gc2luZ2xlLWZpcmUgYm9va2tlZXBpbmcgYW5kIG5vIGxpbmdlcmluZyBwYXRjaCBvbiB0aGUgdHJhbnNpZW50IG5vdGljZS4gVGhlIHVzZXItY2xvc2UgZmxhZ3Mgd2VyZVxuICAgIC8vIHNldCBiZWZvcmUgYGhpZGUoKWAgd2FzIGludm9rZWQgKHNlZSBgYXBwZW5kQ2xvc2VCdXR0b25gIC8gYGluc3RhbGxVc2VyQ2xpY2tUcmFja2luZ2ApLCBzbyB0aGV5XG4gICAgLy8gc3RpbGwgaG9sZCB3aGVuIHJlYWQgaGVyZSBhZnRlciBgZmFsbGJhY2soKWAuXG4gICAgY29uc3QgcGF0Y2hDb21wb25lbnQgPSBuZXcgTW9ua2V5QXJvdW5kQ29tcG9uZW50KCk7XG4gICAgcGF0Y2hDb21wb25lbnQubG9hZCgpO1xuICAgIHBhdGNoQ29tcG9uZW50LnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgJG9iamVjdDogbm90aWNlLFxuICAgICAgbWV0aG9kTmFtZTogJ2hpZGUnLFxuICAgICAgb25jZTogdHJ1ZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2sgfSkgPT4ge1xuICAgICAgICBmYWxsYmFjaygpO1xuICAgICAgICBjb25zdCBpc0Nsb3NlQnV0dG9uQ2xpY2tlZCA9IHRoaXMuY2xvc2VCdXR0b25DbGlja2VkTm90aWNlcy5oYXMobm90aWNlKTtcbiAgICAgICAgY29uc3QgaXNVc2VyQWN0aW9uID0gaXNDbG9zZUJ1dHRvbkNsaWNrZWQgfHwgdGhpcy51c2VyQ2xpY2tlZE5vdGljZXMuaGFzKG5vdGljZSk7XG4gICAgICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBvbkhpZGUoeyBpc0Nsb3NlQnV0dG9uQ2xpY2tlZCwgaXNVc2VyQWN0aW9uIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3RzIHRoZSB0ZXh0IG5vZGVzIHVuZGVyIGEgbm9kZSwgaW4gZG9jdW1lbnQgb3JkZXIuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byB3YWxrLlxuICogQHJldHVybnMgVGhlIHRleHQgbm9kZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFRleHROb2Rlcyhub2RlOiBOb2RlKTogVGV4dFtdIHtcbiAgY29uc3QgdGV4dE5vZGVzOiBUZXh0W10gPSBbXTtcbiAgZm9yIChjb25zdCBjaGlsZE5vZGUgb2Ygbm9kZS5jaGlsZE5vZGVzKSB7XG4gICAgaWYgKGlzVGV4dE5vZGUoY2hpbGROb2RlKSkge1xuICAgICAgdGV4dE5vZGVzLnB1c2goY2hpbGROb2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dE5vZGVzLnB1c2goLi4uZ2V0VGV4dE5vZGVzKGNoaWxkTm9kZSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGV4dE5vZGVzO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbm9kZSBpcyBhIHRleHQgbm9kZS4gSXQgcmVhZHMgdGhlIG5vZGUgdHlwZSByYXRoZXIgdGhhbiBgaW5zdGFuY2VvZiBUZXh0YCwgd2hpY2ggaXNcbiAqIGZhbHNlIGZvciBhIG5vZGUgZnJvbSBhIHBvcG91dCB3aW5kb3cncyByZWFsbS5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgbm9kZSBpcyBhIHRleHQgbm9kZS5cbiAqL1xuZnVuY3Rpb24gaXNUZXh0Tm9kZShub2RlOiBOb2RlKTogbm9kZSBpcyBUZXh0IHtcbiAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVVBLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsbUNBQW1DO0FBQzVDLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsb0JBQW9CO0FBQzdCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsU0FBUztBQUNsQixTQUFTLGdDQUFnQztBQUN6QyxTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLG1CQUFtQjtBQUM1QixTQUFTLDZCQUE2QjtBQUV0QyxNQUFNLDhCQUE4QjtBQUNwQyxNQUFNLDRDQUE0QztBQUNsRCxNQUFNLDRDQUE0QztBQUlsRCxNQUFNLG1EQUFtRDtBQUl6RCxNQUFNLCtCQUErQjtBQVM5QixJQUFLLG1CQUFMLGtCQUFLQSxzQkFBTDtBQVNMLEVBQUFBLGtCQUFBLFlBQVM7QUFN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
|
|
@@ -158,7 +158,9 @@ class PluginSuggestionComponent extends ComponentEx {
|
|
|
158
158
|
}
|
|
159
159
|
const fragment = createFragment((fragmentEl) => {
|
|
160
160
|
appendTextOrFragmentClone(fragmentEl.createDiv(), this.reason);
|
|
161
|
-
const buttonsEl = fragmentEl.createDiv(
|
|
161
|
+
const buttonsEl = fragmentEl.createDiv({
|
|
162
|
+
cls: [CssClass.LibraryName, CssClass.LegacyLibraryName, CssClass.PluginSuggestionNoticeButtons]
|
|
163
|
+
});
|
|
162
164
|
new ButtonComponent(buttonsEl).setButtonText(this.getActionButtonText(state)).setCta().onClick(convertAsyncToSync(async () => {
|
|
163
165
|
await this.installAndEnableSuggestedPlugin();
|
|
164
166
|
}));
|
|
@@ -173,4 +175,4 @@ export {
|
|
|
173
175
|
PluginSuggestionComponent,
|
|
174
176
|
SuggestedPluginState
|
|
175
177
|
};
|
|
176
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BsdWdpbi1zdWdnZXN0aW9uLWNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29tcG9uZW50IHRoYXQgc3VnZ2VzdHMgaW5zdGFsbGluZyBhbm90aGVyIGNvbW11bml0eSBwbHVnaW4gdGhlIGhvc3QgcGx1Z2luIG5lZWRzIGluIG9yZGVyIHRvIG9mZmVyXG4gKiBzb21lIG9mIGl0cyBiZWhhdmlvci5cbiAqXG4gKiBBIHN1Z2dlc3Rpb24gaXMgbm90IGEgZGVwZW5kZW5jeSDigJQgYnV0IGEgZGVwZW5kZW5jeSBpcyBub3cgYSB0aGluZyB0aGlzIGxpYnJhcnkgSEFTLCBzbyB0aGUgY2hvaWNlXG4gKiBiZXR3ZWVuIHRoZW0gaXMgYSByZWFsIG9uZS4gVXNlIGEgc3VnZ2VzdGlvbiB3aGVuIHRoZSBvdGhlciBwbHVnaW4gQUREUyBzb21ldGhpbmc6IHRoZSBob3N0IGtlZXBzXG4gKiB3b3JraW5nIHdpdGhvdXQgaXQsIHNpbXBseSB1bmFibGUgdG8gb2ZmZXIgd2hhdGV2ZXIgdGhhdCBwbHVnaW4gb3ducywgYW5kIHRoaXMgY29tcG9uZW50IGFza3Mgb25jZVxuICogd2hldGhlciB0aGUgdXNlciB3b3VsZCBsaWtlIGl0IGluc3RhbGxlZC4gVXNlIGBQbHVnaW5HYXRlQ29tcG9uZW50YCB3aGVuIHRoZSBob3N0J3MgYWR2ZXJ0aXNlZFxuICogYmVoYXZpb3IgaXMgbm90IHRoZXJlIGF0IGFsbCB3aXRob3V0IHRoZSBvdGhlciBwbHVnaW4uXG4gKlxuICogVGhpcyBmaWxlIHVzZWQgdG8gYXJndWUgdGhlIHN0cm9uZ2VyIHBvc2l0aW9uIOKAlCB0aGF0IHJlcXVpcmluZyBhbm90aGVyIHBsdWdpbiBzaG91bGQgbm90IGV4aXN0LCBiZWNhdXNlXG4gKiBcImludmVudGluZyBvbmUgYnkgcmVmdXNpbmcgdG8gbG9hZCB3b3VsZCBwdW5pc2ggdGhlIHVzZXIgZm9yIHNvbWV0aGluZyB0aGV5IG5ldmVyIGFncmVlZCB0b1wiLiBUaGF0IHdhc1xuICogd3JvbmcgYWJvdXQgd2hpY2ggb3B0aW9uIHB1bmlzaGVzIHRoZSB1c2VyLCBhbmQgdGhlIGNvdW50ZXItY2FzZSBpcyB3b3J0aCBrZWVwaW5nIHJhdGhlciB0aGFuIHF1aWV0bHlcbiAqIGRlbGV0aW5nLiBBIGxvYWQtYmVhcmluZyBwbHVnaW4gdGhlIHVzZXIgY2Fubm90IGlkZW50aWZ5IGlzIG5vdCBhIG5ldXRyYWwgb3V0Y29tZTogbW9udGhzIGxhdGVyIHRoZXlcbiAqIG1lZXQgaXQgaW4gdGhlaXIgcGx1Z2luIGxpc3QsIG5vdGhpbmcgaW4gT2JzaWRpYW4ncyBtYW5pZmVzdCBmb3JtYXQgc2F5cyBhbnl0aGluZyBkZXBlbmRzIG9uIGl0LCB0aGV5XG4gKiByZW1vdmUgaXQsIGFuZCB0aGUgZGFtYWdlIHN1cmZhY2VzIHdlZWtzIGFmdGVyIHRoYXQgd2l0aCBubyB3YXkgdG8gY29ubmVjdCB0aGUgdHdvLiBCZXNpZGUgdGhhdCwgYVxuICogbWFuZGF0b3J5IGRlcGVuZGVuY3kgdGhhdCBzdGF5cyBlbmFibGVkLWJ1dC1pbmVydCwgbmFtZXMgd2hhdCBpdCBpcyB3YWl0aW5nIGZvciwgaW5zdGFsbHMgaXQgaW4gb25lXG4gKiBjbGljayBhbmQgcmVzdW1lcyB3aXRob3V0IGEgcmVzdGFydCBpcyBub3QgYSBwdW5pc2htZW50IOKAlCBpdCBpcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiwgZGVsaXZlcmVkIHdoaWxlXG4gKiB0aGUgdXNlciBjYW4gc3RpbGwgYWN0IG9uIGl0LlxuICpcbiAqIFRoZSBhc2sgaXMgc3VyZmFjZWQgdHdpY2UsIGRlbGliZXJhdGVseSwgYmVjYXVzZSB0aGUgdHdvIHBsYWNlbWVudHMgYW5zd2VyIGRpZmZlcmVudCBxdWVzdGlvbnM6XG4gKiBhIG5vdGljZSBvbiBsb2FkIChcInlvdSBhcmUgbWlzc2luZyBzb21ldGhpbmcgeW91IHByb2JhYmx5IHdhbnRcIikgYW5kIGEgc2V0dGluZ3MtdGFiIGJhbm5lciAoXCJ0aGVcbiAqIHNldHRpbmdzIHlvdSBjYW1lIGxvb2tpbmcgZm9yIGxpdmUgaW4gYW5vdGhlciBwbHVnaW5cIikuIERlY2xpbmluZyBzaWxlbmNlcyBvbmx5IHRoZSBub3RpY2Ug4oCUIGEgdXNlclxuICogd2hvIG9wZW5zIHRoZSBzZXR0aW5ncyB0YWIgaXMgYXNraW5nIGFib3V0IHRoZSBmZWF0dXJlIHJpZ2h0IHRoZW4sIHNvIHRoZSBiYW5uZXIgc3RheXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBjb252ZXJ0QXN5bmNUb1N5bmMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXN5bmMnO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk5vdGljZUNvbXBvbmVudCB9IGZyb20gJy4vcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2UgfSBmcm9tICcuL3BsdWdpbi1zZXR0aW5ncy1jb21wb25lbnQudHMnO1xuXG5pbXBvcnQgeyBDc3NDbGFzcyB9IGZyb20gJy4uL2Nzcy1jbGFzcy50cyc7XG5pbXBvcnQgeyBhcHBlbmRUZXh0T3JGcmFnbWVudENsb25lIH0gZnJvbSAnLi4vaHRtbC1lbGVtZW50LnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHtcbiAgZ2V0SW5zdGFsbGVkUGx1Z2luU3RhdGUsXG4gIGluc3RhbGxBbmRFbmFibGVQbHVnaW4sXG4gIEluc3RhbGxlZFBsdWdpblN0YXRlXG59IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4taW5zdGFsbC1zdGF0ZS50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IENhbGxiYWNrTGF5b3V0UmVhZHlDb21wb25lbnQgfSBmcm9tICcuL2xheW91dC1yZWFkeS1jb21wb25lbnQudHMnO1xuXG4vKipcbiAqIEhvdyB0aGUgc3VnZ2VzdGVkIHBsdWdpbiBpcyBjdXJyZW50bHkgcHJlc2VudCBpbiB0aGUgdmF1bHQuXG4gKlxuICogVGhlIHNhbWUgdGhyZWUgc3RhdGVzIGEgbWFuZGF0b3J5IGRlcGVuZGVuY3kgaXMgaW4sIHNvIHRoaXMgaXMge0BsaW5rIEluc3RhbGxlZFBsdWdpblN0YXRlfSB1bmRlciB0aGVcbiAqIG5hbWUgdGhpcyBjb21wb25lbnQgaGFzIGFsd2F5cyB1c2VkIOKAlCBvbmUgZW51bSwgc28gYSBjYWxsZXIgaG9sZGluZyBhIHN0YXRlIGZyb20gZWl0aGVyIGNvbXBvbmVudCBjYW5cbiAqIGNvbXBhcmUgaXQgYWdhaW5zdCBlaXRoZXIgbmFtZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFN1Z2dlc3RlZFBsdWdpblN0YXRlID0gSW5zdGFsbGVkUGx1Z2luU3RhdGU7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBQbHVnaW5TdWdnZXN0aW9uQ29tcG9uZW50fSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TdWdnZXN0aW9uQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB1c2VyIGhhcyBhbHJlYWR5IGRlY2xpbmVkIHRoaXMgc3VnZ2VzdGlvbi5cbiAgICpcbiAgICogU3RvcmFnZSBiZWxvbmdzIHRvIHRoZSBob3N0IHBsdWdpbiAodHlwaWNhbGx5IG9uZSBvZiBpdHMgc2V0dGluZ3MpLCBiZWNhdXNlIHRoaXMgY29tcG9uZW50IGhhcyBub1xuICAgKiBgZGF0YS5qc29uYCBvZiBpdHMgb3duIGFuZCBhIGRlY2xpbmUgaGFzIHRvIG91dGxpdmUgYSByZWxvYWQuXG4gICAqXG4gICAqIE9ubHkgZXZlciBjYWxsZWQgb25jZSB7QGxpbmsgcGx1Z2luU2V0dGluZ3NDb21wb25lbnR9IHJlcG9ydHMgaXRzIHNldHRpbmdzIGxvYWRlZCwgc28gYW4gaW1wbGVtZW50YXRpb25cbiAgICogcmVhZGluZyBhIHNldHRpbmcgaXMgZ3VhcmFudGVlZCB0byByZWFkIHRoZSBzdG9yZWQgdmFsdWUgcmF0aGVyIHRoYW4gaXRzIGRlZmF1bHQuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBzdWdnZXN0aW9uIGhhcyBiZWVuIGRlY2xpbmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNTdWdnZXN0aW9uRGVjbGluZWQ6ICgpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBub3RpY2UgY29tcG9uZW50IG9mIHRoZSBwbHVnaW4gbWFraW5nIHRoZSBzdWdnZXN0aW9uLCB1c2VkIHRvIHNob3cgdGhlIHN1Z2dlc3Rpb24gYW5kIGl0c1xuICAgKiBvdXRjb21lLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5ncyBjb21wb25lbnQgaG9sZGluZyB3aGF0ZXZlciB7QGxpbmsgaXNTdWdnZXN0aW9uRGVjbGluZWR9IHJlYWRzLlxuICAgKlxuICAgKiBUYWtlbiBhcyBhIHdob2xlIGNvbXBvbmVudCByYXRoZXIgdGhhbiBhcyBhIGJhcmUgXCJyZWFkeVwiIGZsYWcgc28gdGhlIGhvc3QgY2Fubm90IGZvcmdldCB0byB3aXJlIHRoZVxuICAgKiB3YWl0OiB0aGUgbm90aWNlIGlzIGRlY2lkZWQgb25seSBhZnRlciB0aGlzIGNvbXBvbmVudCBoYXMgcmVhZCBgZGF0YS5qc29uYC4gU2VlXG4gICAqIHtAbGluayBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2Uud2hlbkxvYWRlZEZyb21GaWxlfSBmb3Igd2h5IHRoZSByZWFkIGNhbm5vdCBzaW1wbHkgaGFwcGVuIGF0XG4gICAqIGxheW91dC1yZWFkeS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpblNldHRpbmdzQ29tcG9uZW50OiBQaWNrPFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZTxvYmplY3Q+LCAnd2hlbkxvYWRlZEZyb21GaWxlJz47XG5cbiAgLyoqXG4gICAqIFRoZSBsb2NhbGl6ZWQgc2VudGVuY2UgZXhwbGFpbmluZyB3aGF0IHRoZSBob3N0IHBsdWdpbiBjYW5ub3QgZG8gd2l0aG91dCB0aGUgc3VnZ2VzdGVkIHBsdWdpbi4gVGhlXG4gICAqIGhvc3QgcGx1Z2luIG93bnMgdGhpcyBzdHJpbmc6IG9ubHkgaXQga25vd3Mgd2hpY2ggb2YgaXRzIGZlYXR1cmVzIGFyZSBhZmZlY3RlZC5cbiAgICpcbiAgICogUGFzcyBhIHtAbGluayBEb2N1bWVudEZyYWdtZW50fSB0byBtYXJrIHVwIHBhcnQgb2YgdGhlIHNlbnRlbmNlLCBzdWNoIGFzIGEgcGx1Z2luIG5hbWUgcmVuZGVyZWQgYXNcbiAgICogY29kZS4gRWFjaCByZW5kZXIgYXBwZW5kcyBhIGZyZXNoIGNsb25lIG9mIGl0LCBiZWNhdXNlIHRoZSBub3RpY2UgYW5kIHRoZSBiYW5uZXIgZWFjaCBuZWVkIHRoZWlyIG93blxuICAgKiBjb3B5IGFuZCBhcHBlbmRpbmcgYSBmcmFnbWVudCBlbXB0aWVzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVhc29uOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZWNvcmRzIHRoZSB1c2VyJ3MgYW5zd2VyIHRvIHRoZSBzdWdnZXN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gaXNEZWNsaW5lZCAtIGB0cnVlYCB3aGVuIHRoZSB1c2VyIGRlY2xpbmVkLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGFuc3dlciBpcyBwZXJzaXN0ZWQuXG4gICAqL1xuICByZWFkb25seSBzZXRTdWdnZXN0aW9uRGVjbGluZWQ6IChpc0RlY2xpbmVkOiBib29sZWFuKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIHN1Z2dlc3RlZCBwbHVnaW4sIGFzIGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnkuXG4gICAqL1xuICByZWFkb25seSBzdWdnZXN0ZWRQbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSBzdWdnZXN0ZWQgcGx1Z2luLCBzaG93biB0byB0aGUgdXNlci5cbiAgICovXG4gIHJlYWRvbmx5IHN1Z2dlc3RlZFBsdWdpbk5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBIb3cgdGhlIHN1Z2dlc3RlZCBwbHVnaW4gaXMgY3VycmVudGx5IHByZXNlbnQgaW4gdGhlIHZhdWx0LlxuICovXG5leHBvcnQgdHlwZSBTdWdnZXN0ZWRQbHVnaW5TdGF0ZSA9IEluc3RhbGxlZFBsdWdpblN0YXRlO1xuXG4vKipcbiAqIFN1Z2dlc3RzIGluc3RhbGxpbmcgYW5vdGhlciBjb21tdW5pdHkgcGx1Z2luLCB2aWEgYSBsb2FkLXRpbWUgbm90aWNlIGFuZCBhIHNldHRpbmdzLXRhYiBiYW5uZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5TdWdnZXN0aW9uQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzU3VnZ2VzdGlvbkRlY2xpbmVkOiAoKSA9PiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpblNldHRpbmdzQ29tcG9uZW50OiBQaWNrPFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZTxvYmplY3Q+LCAnd2hlbkxvYWRlZEZyb21GaWxlJz47XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVhc29uOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldFN1Z2dlc3Rpb25EZWNsaW5lZDogKGlzRGVjbGluZWQ6IGJvb2xlYW4pID0+IFByb21pc2FibGU8dm9pZD47XG4gIHByaXZhdGUgcmVhZG9ubHkgc3VnZ2VzdGVkUGx1Z2luSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzdWdnZXN0ZWRQbHVnaW5OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBsdWdpblN1Z2dlc3Rpb25Db21wb25lbnR9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBQbHVnaW5TdWdnZXN0aW9uQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudDtcbiAgICB0aGlzLnJlYXNvbiA9IHBhcmFtcy5yZWFzb247XG4gICAgdGhpcy5zdWdnZXN0ZWRQbHVnaW5JZCA9IHBhcmFtcy5zdWdnZXN0ZWRQbHVnaW5JZDtcbiAgICB0aGlzLnN1Z2dlc3RlZFBsdWdpbk5hbWUgPSBwYXJhbXMuc3VnZ2VzdGVkUGx1Z2luTmFtZTtcbiAgICB0aGlzLmlzU3VnZ2VzdGlvbkRlY2xpbmVkID0gcGFyYW1zLmlzU3VnZ2VzdGlvbkRlY2xpbmVkO1xuICAgIHRoaXMuc2V0U3VnZ2VzdGlvbkRlY2xpbmVkID0gcGFyYW1zLnNldFN1Z2dlc3Rpb25EZWNsaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBob3cgdGhlIHN1Z2dlc3RlZCBwbHVnaW4gaXMgY3VycmVudGx5IHByZXNlbnQgaW4gdGhlIHZhdWx0LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIFN1Z2dlc3RlZFBsdWdpblN0YXRlfS5cbiAgICovXG4gIHB1YmxpYyBnZXRTdWdnZXN0ZWRQbHVnaW5TdGF0ZSgpOiBTdWdnZXN0ZWRQbHVnaW5TdGF0ZSB7XG4gICAgcmV0dXJuIGdldEluc3RhbGxlZFBsdWdpblN0YXRlKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5JZDogdGhpcy5zdWdnZXN0ZWRQbHVnaW5JZFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGxzICh3aGVuIG5lZWRlZCkgYW5kIGVuYWJsZXMgdGhlIHN1Z2dlc3RlZCBwbHVnaW4sIHJlcG9ydGluZyB0aGUgb3V0Y29tZSBhcyBhIG5vdGljZS5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBwbHVnaW4gaXMgZW5hYmxlZCwgb3Igb25jZSB0aGUgZmFpbHVyZSBoYXMgYmVlblxuICAgKiByZXBvcnRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbnN0YWxsQW5kRW5hYmxlU3VnZ2VzdGVkUGx1Z2luKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmdldFN1Z2dlc3RlZFBsdWdpblN0YXRlKCkgPT09IFN1Z2dlc3RlZFBsdWdpblN0YXRlLkVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBpbnN0YWxsQW5kRW5hYmxlUGx1Z2luKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5JZDogdGhpcy5zdWdnZXN0ZWRQbHVnaW5JZCxcbiAgICAgIHBsdWdpbk5hbWU6IHRoaXMuc3VnZ2VzdGVkUGx1Z2luTmFtZSxcbiAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnRcbiAgICB9KTtcblxuICAgIC8vIE9ubHkgYWZ0ZXIgdGhlIGluc3RhbGwgYWN0dWFsbHkgc3VjY2VlZGVkIOKAlCBgaW5zdGFsbEFuZEVuYWJsZVBsdWdpbmAgcmV0aHJvd3Mgb24gZmFpbHVyZSwgc28gYVxuICAgIC8vIGZhaWxlZCBhdHRlbXB0IGxlYXZlcyBhIHByZXZpb3VzIGRlY2xpbmUgc3RhbmRpbmcgcmF0aGVyIHRoYW4gc2lsZW50bHkgY2xlYXJpbmcgaXQuXG4gICAgYXdhaXQgdGhpcy5zZXRTdWdnZXN0aW9uRGVjbGluZWQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBjb21wb25lbnQsIHNob3dpbmcgdGhlIHN1Z2dlc3Rpb24gbm90aWNlIG9uY2UgdGhlIGxheW91dCBpcyByZWFkeSBBTkQgdGhlIGhvc3QncyBzZXR0aW5nc1xuICAgKiBoYXZlIGJlZW4gcmVhZCBmcm9tIGRpc2suXG4gICAqXG4gICAqIEJvdGggd2FpdHMgbWF0dGVyLCBhbmQgbmVpdGhlciBpbXBsaWVzIHRoZSBvdGhlcjpcbiAgICpcbiAgICogLSBMYXlvdXQtcmVhZHksIGJlY2F1c2UgcGx1Z2lucyBsb2FkIGluIGFuIHVuc3BlY2lmaWVkIG9yZGVyLCBzbyB0aGUgc3VnZ2VzdGVkIHBsdWdpbiBtYXkgd2VsbCBiZVxuICAgKiAgIGVuYWJsZWQgYSBtb21lbnQgYWZ0ZXIgdGhpcyBvbmUuIENoZWNraW5nIGVhcmxpZXIgd291bGQgc3VnZ2VzdCBpbnN0YWxsaW5nIHNvbWV0aGluZyB0aGUgdXNlclxuICAgKiAgIGFscmVhZHkgaGFzLlxuICAgKiAtIFNldHRpbmdzLWxvYWRlZCwgYmVjYXVzZSB7QGxpbmsgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zLmlzU3VnZ2VzdGlvbkRlY2xpbmVkfVxuICAgKiAgIHJlYWRzIGEgc2V0dGluZyBvZiB0aGUgaG9zdCwgYW5kIHRoZSBob3N0J3Mgc2V0dGluZ3MgY29tcG9uZW50IGlzIGEgU0lCTElORyB3aG9zZSBvd24gYXN5bmMgbG9hZCBpc1xuICAgKiAgIHN0aWxsIGluIGZsaWdodCBoZXJlLiBPbiBhIGxheW91dCB0aGF0IGlzIGFscmVhZHkgcmVhZHkg4oCUIGEgcnVudGltZSBlbmFibGUgZnJvbSB0aGUgQ29tbXVuaXR5XG4gICAqICAgUGx1Z2lucyB0YWIsIG9yIGEgcmUtZW5hYmxlIGFmdGVyIGFuIHVwZGF0ZSDigJQgdGhlIGxheW91dC1yZWFkeSBjYWxsYmFjayBmaXJlcyBpbW1lZGlhdGVseSwgc28gdGhlXG4gICAqICAgcmVhZCB3b3VsZCBzZWUgdGhlIGRlZmF1bHQgYGZhbHNlYCBhbmQgYXNrIGFnYWluIGEgdXNlciB3aG8gaGFzIGFscmVhZHkgZGVjbGluZWQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHRoaXMuYWRkQ2hpbGQoXG4gICAgICBuZXcgQ2FsbGJhY2tMYXlvdXRSZWFkeUNvbXBvbmVudCh0aGlzLmFwcCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnBsdWdpblNldHRpbmdzQ29tcG9uZW50LndoZW5Mb2FkZWRGcm9tRmlsZSgpO1xuICAgICAgICBpZiAodGhpcy5pc1VubG9hZGVkKCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNob3dTdWdnZXN0aW9uTm90aWNlKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgc3VnZ2VzdGlvbiBiYW5uZXIgaW50byBhIHNldHRpbmdzLXRhYiBjb250YWluZXIsIHdpdGggYSBidXR0b24gdGhhdCBpbnN0YWxscyBhbmQgZW5hYmxlc1xuICAgKiB0aGUgc3VnZ2VzdGVkIHBsdWdpbi5cbiAgICpcbiAgICogUmVuZGVycyBub3RoaW5nIHdoZW4gdGhlIHN1Z2dlc3RlZCBwbHVnaW4gaXMgYWxyZWFkeSBlbmFibGVkLiBVbmxpa2UgdGhlIG5vdGljZSwgdGhlIGJhbm5lciBpZ25vcmVzIGFcbiAgICogcHJldmlvdXMgZGVjbGluZSDigJQgdGhlIHVzZXIgaXMgbG9va2luZyBhdCB0aGVzZSBzZXR0aW5ncyByaWdodCBub3csIHdoaWNoIGlzIGEgZnJlc2hlciBzaWduYWwgdGhhbiBhblxuICAgKiBhbnN3ZXIgdGhleSBnYXZlIGVhcmxpZXIuXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXJFbCAtIFRoZSBlbGVtZW50IHRvIHJlbmRlciB0aGUgYmFubmVyIGludG8uXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyQmFubmVyKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZXRTdWdnZXN0ZWRQbHVnaW5TdGF0ZSgpO1xuICAgIGlmIChzdGF0ZSA9PT0gU3VnZ2VzdGVkUGx1Z2luU3RhdGUuRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJhbm5lckVsID0gY29udGFpbmVyRWwuY3JlYXRlRGl2KHtcbiAgICAgIGNsczogW0Nzc0NsYXNzLkxpYnJhcnlOYW1lLCBDc3NDbGFzcy5MZWdhY3lMaWJyYXJ5TmFtZSwgQ3NzQ2xhc3MuUGx1Z2luU3VnZ2VzdGlvbkJhbm5lcl1cbiAgICB9KTtcbiAgICBhcHBlbmRUZXh0T3JGcmFnbWVudENsb25lKGJhbm5lckVsLmNyZWF0ZURpdigpLCB0aGlzLnJlYXNvbik7XG5cbiAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgLnNldEJ1dHRvblRleHQodGhpcy5nZXRBY3Rpb25CdXR0b25UZXh0KHN0YXRlKSlcbiAgICAgIC5zZXRDdGEoKVxuICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbnN0YWxsQW5kRW5hYmxlU3VnZ2VzdGVkUGx1Z2luKCk7XG4gICAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGdldEFjdGlvbkJ1dHRvblRleHQoc3RhdGU6IFN1Z2dlc3RlZFBsdWdpblN0YXRlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdCgoJCkgPT5cbiAgICAgIHN0YXRlID09PSBTdWdnZXN0ZWRQbHVnaW5TdGF0ZS5JbnN0YWxsZWRCdXREaXNhYmxlZFxuICAgICAgICA/ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5TdWdnZXN0aW9uLmVuYWJsZVxuICAgICAgICA6ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5TdWdnZXN0aW9uLmluc3RhbGxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93U3VnZ2VzdGlvbk5vdGljZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2V0U3VnZ2VzdGVkUGx1Z2luU3RhdGUoKTtcbiAgICBpZiAoc3RhdGUgPT09IFN1Z2dlc3RlZFBsdWdpblN0YXRlLkVuYWJsZWQgfHwgdGhpcy5pc1N1Z2dlc3Rpb25EZWNsaW5lZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgoZnJhZ21lbnRFbCkgPT4ge1xuICAgICAgYXBwZW5kVGV4dE9yRnJhZ21lbnRDbG9uZShmcmFnbWVudEVsLmNyZWF0ZURpdigpLCB0aGlzLnJlYXNvbik7XG4gICAgICBjb25zdCBidXR0b25zRWwgPSBmcmFnbWVudEVsLmNyZWF0ZURpdigpO1xuXG4gICAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJ1dHRvbnNFbClcbiAgICAgICAgLnNldEJ1dHRvblRleHQodGhpcy5nZXRBY3Rpb25CdXR0b25UZXh0KHN0YXRlKSlcbiAgICAgICAgLnNldEN0YSgpXG4gICAgICAgIC5vbkNsaWNrKGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5pbnN0YWxsQW5kRW5hYmxlU3VnZ2VzdGVkUGx1Z2luKCk7XG4gICAgICAgIH0pKTtcblxuICAgICAgbmV3IEJ1dHRvbkNvbXBvbmVudChidXR0b25zRWwpXG4gICAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5TdWdnZXN0aW9uLm5vdE5vdykpXG4gICAgICAgIC5vbkNsaWNrKGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXRTdWdnZXN0aW9uRGVjbGluZWQodHJ1ZSk7XG4gICAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UoZnJhZ21lbnQsIHsgc2hvdWxkSGlkZU9uQ2xpY2s6IGZhbHNlIH0pO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0JBLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsdUJBQXVCO0FBS2hDLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsaUNBQWlDO0FBQzFDLFNBQVMsU0FBUztBQUNsQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLG1CQUFtQjtBQUM1QixTQUFTLG9DQUFvQztBQVN0QyxNQUFNLHVCQUF1QjtBQTZFN0IsTUFBTSxrQ0FBa0MsWUFBWTtBQUFBLEVBQ3hDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9WLFlBQVksUUFBb0Q7QUFDckUsVUFBTTtBQUNOLFNBQUssTUFBTSxPQUFPO0FBQ2xCLFNBQUssd0JBQXdCLE9BQU87QUFDcEMsU0FBSywwQkFBMEIsT0FBTztBQUN0QyxTQUFLLFNBQVMsT0FBTztBQUNyQixTQUFLLG9CQUFvQixPQUFPO0FBQ2hDLFNBQUssc0JBQXNCLE9BQU87QUFDbEMsU0FBSyx1QkFBdUIsT0FBTztBQUNuQyxTQUFLLHdCQUF3QixPQUFPO0FBQUEsRUFDdEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTywwQkFBZ0Q7QUFDckQsV0FBTyx3QkFBd0I7QUFBQSxNQUM3QixLQUFLLEtBQUs7QUFBQSxNQUNWLFVBQVUsS0FBSztBQUFBLElBQ2pCLENBQUM7QUFBQSxFQUNIO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxNQUFhLGtDQUFpRDtBQUM1RCxRQUFJLEtBQUssd0JBQXdCLE1BQU0scUJBQXFCLFNBQVM7QUFDbkU7QUFBQSxJQUNGO0FBRUEsVUFBTSx1QkFBdUI7QUFBQSxNQUMzQixLQUFLLEtBQUs7QUFBQSxNQUNWLFVBQVUsS0FBSztBQUFBLE1BQ2YsWUFBWSxLQUFLO0FBQUEsTUFDakIsdUJBQXVCLEtBQUs7QUFBQSxJQUM5QixDQUFDO0FBSUQsVUFBTSxLQUFLLHNCQUFzQixLQUFLO0FBQUEsRUFDeEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWlCZ0IsU0FBZTtBQUM3QixTQUFLO0FBQUEsTUFDSCxJQUFJLDZCQUE2QixLQUFLLEtBQUssWUFBWTtBQUNyRCxjQUFNLEtBQUssd0JBQXdCLG1CQUFtQjtBQUN0RCxZQUFJLEtBQUssV0FBVyxHQUFHO0FBQ3JCO0FBQUEsUUFDRjtBQUVBLGFBQUsscUJBQXFCO0FBQUEsTUFDNUIsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVlPLGFBQWEsYUFBZ0M7QUFDbEQsVUFBTSxRQUFRLEtBQUssd0JBQXdCO0FBQzNDLFFBQUksVUFBVSxxQkFBcUIsU0FBUztBQUMxQztBQUFBLElBQ0Y7QUFFQSxVQUFNLFdBQVcsWUFBWSxVQUFVO0FBQUEsTUFDckMsS0FBSyxDQUFDLFNBQVMsYUFBYSxTQUFTLG1CQUFtQixTQUFTLHNCQUFzQjtBQUFBLElBQ3pGLENBQUM7QUFDRCw4QkFBMEIsU0FBUyxVQUFVLEdBQUcsS0FBSyxNQUFNO0FBRTNELFFBQUksZ0JBQWdCLFFBQVEsRUFDekIsY0FBYyxLQUFLLG9CQUFvQixLQUFLLENBQUMsRUFDN0MsT0FBTyxFQUNQLFFBQVEsbUJBQW1CLFlBQVk7QUFDdEMsWUFBTSxLQUFLLGdDQUFnQztBQUFBLElBQzdDLENBQUMsQ0FBQztBQUFBLEVBQ047QUFBQSxFQUVRLG9CQUFvQixPQUFxQztBQUMvRCxXQUFPO0FBQUEsTUFBRSxDQUFDLE1BQ1IsVUFBVSxxQkFBcUIsdUJBQzNCLEVBQUUsaUJBQWlCLGlCQUFpQixTQUNwQyxFQUFFLGlCQUFpQixpQkFBaUI7QUFBQSxJQUMxQztBQUFBLEVBQ0Y7QUFBQSxFQUVRLHVCQUE2QjtBQUNuQyxVQUFNLFFBQVEsS0FBSyx3QkFBd0I7QUFDM0MsUUFBSSxVQUFVLHFCQUFxQixXQUFXLEtBQUsscUJBQXFCLEdBQUc7QUFDekU7QUFBQSxJQUNGO0FBRUEsVUFBTSxXQUFXLGVBQWUsQ0FBQyxlQUFlO0FBQzlDLGdDQUEwQixXQUFXLFVBQVUsR0FBRyxLQUFLLE1BQU07QUFDN0QsWUFBTSxZQUFZLFdBQVcsVUFBVTtBQUV2QyxVQUFJLGdCQUFnQixTQUFTLEVBQzFCLGNBQWMsS0FBSyxvQkFBb0IsS0FBSyxDQUFDLEVBQzdDLE9BQU8sRUFDUCxRQUFRLG1CQUFtQixZQUFZO0FBQ3RDLGNBQU0sS0FBSyxnQ0FBZ0M7QUFBQSxNQUM3QyxDQUFDLENBQUM7QUFFSixVQUFJLGdCQUFnQixTQUFTLEVBQzFCLGNBQWMsRUFBRSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsaUJBQWlCLE1BQU0sQ0FBQyxFQUNsRSxRQUFRLG1CQUFtQixZQUFZO0FBQ3RDLGNBQU0sS0FBSyxzQkFBc0IsSUFBSTtBQUFBLE1BQ3ZDLENBQUMsQ0FBQztBQUFBLElBQ04sQ0FBQztBQUVELFNBQUssc0JBQXNCLFdBQVcsVUFBVSxFQUFFLG1CQUFtQixNQUFNLENBQUM7QUFBQSxFQUM5RTtBQUNGOyIsIm5hbWVzIjpbXX0=
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BsdWdpbi1zdWdnZXN0aW9uLWNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29tcG9uZW50IHRoYXQgc3VnZ2VzdHMgaW5zdGFsbGluZyBhbm90aGVyIGNvbW11bml0eSBwbHVnaW4gdGhlIGhvc3QgcGx1Z2luIG5lZWRzIGluIG9yZGVyIHRvIG9mZmVyXG4gKiBzb21lIG9mIGl0cyBiZWhhdmlvci5cbiAqXG4gKiBBIHN1Z2dlc3Rpb24gaXMgbm90IGEgZGVwZW5kZW5jeSDigJQgYnV0IGEgZGVwZW5kZW5jeSBpcyBub3cgYSB0aGluZyB0aGlzIGxpYnJhcnkgSEFTLCBzbyB0aGUgY2hvaWNlXG4gKiBiZXR3ZWVuIHRoZW0gaXMgYSByZWFsIG9uZS4gVXNlIGEgc3VnZ2VzdGlvbiB3aGVuIHRoZSBvdGhlciBwbHVnaW4gQUREUyBzb21ldGhpbmc6IHRoZSBob3N0IGtlZXBzXG4gKiB3b3JraW5nIHdpdGhvdXQgaXQsIHNpbXBseSB1bmFibGUgdG8gb2ZmZXIgd2hhdGV2ZXIgdGhhdCBwbHVnaW4gb3ducywgYW5kIHRoaXMgY29tcG9uZW50IGFza3Mgb25jZVxuICogd2hldGhlciB0aGUgdXNlciB3b3VsZCBsaWtlIGl0IGluc3RhbGxlZC4gVXNlIGBQbHVnaW5HYXRlQ29tcG9uZW50YCB3aGVuIHRoZSBob3N0J3MgYWR2ZXJ0aXNlZFxuICogYmVoYXZpb3IgaXMgbm90IHRoZXJlIGF0IGFsbCB3aXRob3V0IHRoZSBvdGhlciBwbHVnaW4uXG4gKlxuICogVGhpcyBmaWxlIHVzZWQgdG8gYXJndWUgdGhlIHN0cm9uZ2VyIHBvc2l0aW9uIOKAlCB0aGF0IHJlcXVpcmluZyBhbm90aGVyIHBsdWdpbiBzaG91bGQgbm90IGV4aXN0LCBiZWNhdXNlXG4gKiBcImludmVudGluZyBvbmUgYnkgcmVmdXNpbmcgdG8gbG9hZCB3b3VsZCBwdW5pc2ggdGhlIHVzZXIgZm9yIHNvbWV0aGluZyB0aGV5IG5ldmVyIGFncmVlZCB0b1wiLiBUaGF0IHdhc1xuICogd3JvbmcgYWJvdXQgd2hpY2ggb3B0aW9uIHB1bmlzaGVzIHRoZSB1c2VyLCBhbmQgdGhlIGNvdW50ZXItY2FzZSBpcyB3b3J0aCBrZWVwaW5nIHJhdGhlciB0aGFuIHF1aWV0bHlcbiAqIGRlbGV0aW5nLiBBIGxvYWQtYmVhcmluZyBwbHVnaW4gdGhlIHVzZXIgY2Fubm90IGlkZW50aWZ5IGlzIG5vdCBhIG5ldXRyYWwgb3V0Y29tZTogbW9udGhzIGxhdGVyIHRoZXlcbiAqIG1lZXQgaXQgaW4gdGhlaXIgcGx1Z2luIGxpc3QsIG5vdGhpbmcgaW4gT2JzaWRpYW4ncyBtYW5pZmVzdCBmb3JtYXQgc2F5cyBhbnl0aGluZyBkZXBlbmRzIG9uIGl0LCB0aGV5XG4gKiByZW1vdmUgaXQsIGFuZCB0aGUgZGFtYWdlIHN1cmZhY2VzIHdlZWtzIGFmdGVyIHRoYXQgd2l0aCBubyB3YXkgdG8gY29ubmVjdCB0aGUgdHdvLiBCZXNpZGUgdGhhdCwgYVxuICogbWFuZGF0b3J5IGRlcGVuZGVuY3kgdGhhdCBzdGF5cyBlbmFibGVkLWJ1dC1pbmVydCwgbmFtZXMgd2hhdCBpdCBpcyB3YWl0aW5nIGZvciwgaW5zdGFsbHMgaXQgaW4gb25lXG4gKiBjbGljayBhbmQgcmVzdW1lcyB3aXRob3V0IGEgcmVzdGFydCBpcyBub3QgYSBwdW5pc2htZW50IOKAlCBpdCBpcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiwgZGVsaXZlcmVkIHdoaWxlXG4gKiB0aGUgdXNlciBjYW4gc3RpbGwgYWN0IG9uIGl0LlxuICpcbiAqIFRoZSBhc2sgaXMgc3VyZmFjZWQgdHdpY2UsIGRlbGliZXJhdGVseSwgYmVjYXVzZSB0aGUgdHdvIHBsYWNlbWVudHMgYW5zd2VyIGRpZmZlcmVudCBxdWVzdGlvbnM6XG4gKiBhIG5vdGljZSBvbiBsb2FkIChcInlvdSBhcmUgbWlzc2luZyBzb21ldGhpbmcgeW91IHByb2JhYmx5IHdhbnRcIikgYW5kIGEgc2V0dGluZ3MtdGFiIGJhbm5lciAoXCJ0aGVcbiAqIHNldHRpbmdzIHlvdSBjYW1lIGxvb2tpbmcgZm9yIGxpdmUgaW4gYW5vdGhlciBwbHVnaW5cIikuIERlY2xpbmluZyBzaWxlbmNlcyBvbmx5IHRoZSBub3RpY2Ug4oCUIGEgdXNlclxuICogd2hvIG9wZW5zIHRoZSBzZXR0aW5ncyB0YWIgaXMgYXNraW5nIGFib3V0IHRoZSBmZWF0dXJlIHJpZ2h0IHRoZW4sIHNvIHRoZSBiYW5uZXIgc3RheXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBjb252ZXJ0QXN5bmNUb1N5bmMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXN5bmMnO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk5vdGljZUNvbXBvbmVudCB9IGZyb20gJy4vcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2UgfSBmcm9tICcuL3BsdWdpbi1zZXR0aW5ncy1jb21wb25lbnQudHMnO1xuXG5pbXBvcnQgeyBDc3NDbGFzcyB9IGZyb20gJy4uL2Nzcy1jbGFzcy50cyc7XG5pbXBvcnQgeyBhcHBlbmRUZXh0T3JGcmFnbWVudENsb25lIH0gZnJvbSAnLi4vaHRtbC1lbGVtZW50LnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHtcbiAgZ2V0SW5zdGFsbGVkUGx1Z2luU3RhdGUsXG4gIGluc3RhbGxBbmRFbmFibGVQbHVnaW4sXG4gIEluc3RhbGxlZFBsdWdpblN0YXRlXG59IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4taW5zdGFsbC1zdGF0ZS50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IENhbGxiYWNrTGF5b3V0UmVhZHlDb21wb25lbnQgfSBmcm9tICcuL2xheW91dC1yZWFkeS1jb21wb25lbnQudHMnO1xuXG4vKipcbiAqIEhvdyB0aGUgc3VnZ2VzdGVkIHBsdWdpbiBpcyBjdXJyZW50bHkgcHJlc2VudCBpbiB0aGUgdmF1bHQuXG4gKlxuICogVGhlIHNhbWUgdGhyZWUgc3RhdGVzIGEgbWFuZGF0b3J5IGRlcGVuZGVuY3kgaXMgaW4sIHNvIHRoaXMgaXMge0BsaW5rIEluc3RhbGxlZFBsdWdpblN0YXRlfSB1bmRlciB0aGVcbiAqIG5hbWUgdGhpcyBjb21wb25lbnQgaGFzIGFsd2F5cyB1c2VkIOKAlCBvbmUgZW51bSwgc28gYSBjYWxsZXIgaG9sZGluZyBhIHN0YXRlIGZyb20gZWl0aGVyIGNvbXBvbmVudCBjYW5cbiAqIGNvbXBhcmUgaXQgYWdhaW5zdCBlaXRoZXIgbmFtZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFN1Z2dlc3RlZFBsdWdpblN0YXRlID0gSW5zdGFsbGVkUGx1Z2luU3RhdGU7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBQbHVnaW5TdWdnZXN0aW9uQ29tcG9uZW50fSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TdWdnZXN0aW9uQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB1c2VyIGhhcyBhbHJlYWR5IGRlY2xpbmVkIHRoaXMgc3VnZ2VzdGlvbi5cbiAgICpcbiAgICogU3RvcmFnZSBiZWxvbmdzIHRvIHRoZSBob3N0IHBsdWdpbiAodHlwaWNhbGx5IG9uZSBvZiBpdHMgc2V0dGluZ3MpLCBiZWNhdXNlIHRoaXMgY29tcG9uZW50IGhhcyBub1xuICAgKiBgZGF0YS5qc29uYCBvZiBpdHMgb3duIGFuZCBhIGRlY2xpbmUgaGFzIHRvIG91dGxpdmUgYSByZWxvYWQuXG4gICAqXG4gICAqIE9ubHkgZXZlciBjYWxsZWQgb25jZSB7QGxpbmsgcGx1Z2luU2V0dGluZ3NDb21wb25lbnR9IHJlcG9ydHMgaXRzIHNldHRpbmdzIGxvYWRlZCwgc28gYW4gaW1wbGVtZW50YXRpb25cbiAgICogcmVhZGluZyBhIHNldHRpbmcgaXMgZ3VhcmFudGVlZCB0byByZWFkIHRoZSBzdG9yZWQgdmFsdWUgcmF0aGVyIHRoYW4gaXRzIGRlZmF1bHQuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBzdWdnZXN0aW9uIGhhcyBiZWVuIGRlY2xpbmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNTdWdnZXN0aW9uRGVjbGluZWQ6ICgpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBub3RpY2UgY29tcG9uZW50IG9mIHRoZSBwbHVnaW4gbWFraW5nIHRoZSBzdWdnZXN0aW9uLCB1c2VkIHRvIHNob3cgdGhlIHN1Z2dlc3Rpb24gYW5kIGl0c1xuICAgKiBvdXRjb21lLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5ncyBjb21wb25lbnQgaG9sZGluZyB3aGF0ZXZlciB7QGxpbmsgaXNTdWdnZXN0aW9uRGVjbGluZWR9IHJlYWRzLlxuICAgKlxuICAgKiBUYWtlbiBhcyBhIHdob2xlIGNvbXBvbmVudCByYXRoZXIgdGhhbiBhcyBhIGJhcmUgXCJyZWFkeVwiIGZsYWcgc28gdGhlIGhvc3QgY2Fubm90IGZvcmdldCB0byB3aXJlIHRoZVxuICAgKiB3YWl0OiB0aGUgbm90aWNlIGlzIGRlY2lkZWQgb25seSBhZnRlciB0aGlzIGNvbXBvbmVudCBoYXMgcmVhZCBgZGF0YS5qc29uYC4gU2VlXG4gICAqIHtAbGluayBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2Uud2hlbkxvYWRlZEZyb21GaWxlfSBmb3Igd2h5IHRoZSByZWFkIGNhbm5vdCBzaW1wbHkgaGFwcGVuIGF0XG4gICAqIGxheW91dC1yZWFkeS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpblNldHRpbmdzQ29tcG9uZW50OiBQaWNrPFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZTxvYmplY3Q+LCAnd2hlbkxvYWRlZEZyb21GaWxlJz47XG5cbiAgLyoqXG4gICAqIFRoZSBsb2NhbGl6ZWQgc2VudGVuY2UgZXhwbGFpbmluZyB3aGF0IHRoZSBob3N0IHBsdWdpbiBjYW5ub3QgZG8gd2l0aG91dCB0aGUgc3VnZ2VzdGVkIHBsdWdpbi4gVGhlXG4gICAqIGhvc3QgcGx1Z2luIG93bnMgdGhpcyBzdHJpbmc6IG9ubHkgaXQga25vd3Mgd2hpY2ggb2YgaXRzIGZlYXR1cmVzIGFyZSBhZmZlY3RlZC5cbiAgICpcbiAgICogUGFzcyBhIHtAbGluayBEb2N1bWVudEZyYWdtZW50fSB0byBtYXJrIHVwIHBhcnQgb2YgdGhlIHNlbnRlbmNlLCBzdWNoIGFzIGEgcGx1Z2luIG5hbWUgcmVuZGVyZWQgYXNcbiAgICogY29kZS4gRWFjaCByZW5kZXIgYXBwZW5kcyBhIGZyZXNoIGNsb25lIG9mIGl0LCBiZWNhdXNlIHRoZSBub3RpY2UgYW5kIHRoZSBiYW5uZXIgZWFjaCBuZWVkIHRoZWlyIG93blxuICAgKiBjb3B5IGFuZCBhcHBlbmRpbmcgYSBmcmFnbWVudCBlbXB0aWVzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVhc29uOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZWNvcmRzIHRoZSB1c2VyJ3MgYW5zd2VyIHRvIHRoZSBzdWdnZXN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gaXNEZWNsaW5lZCAtIGB0cnVlYCB3aGVuIHRoZSB1c2VyIGRlY2xpbmVkLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGFuc3dlciBpcyBwZXJzaXN0ZWQuXG4gICAqL1xuICByZWFkb25seSBzZXRTdWdnZXN0aW9uRGVjbGluZWQ6IChpc0RlY2xpbmVkOiBib29sZWFuKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIHN1Z2dlc3RlZCBwbHVnaW4sIGFzIGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnkuXG4gICAqL1xuICByZWFkb25seSBzdWdnZXN0ZWRQbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSBzdWdnZXN0ZWQgcGx1Z2luLCBzaG93biB0byB0aGUgdXNlci5cbiAgICovXG4gIHJlYWRvbmx5IHN1Z2dlc3RlZFBsdWdpbk5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBIb3cgdGhlIHN1Z2dlc3RlZCBwbHVnaW4gaXMgY3VycmVudGx5IHByZXNlbnQgaW4gdGhlIHZhdWx0LlxuICovXG5leHBvcnQgdHlwZSBTdWdnZXN0ZWRQbHVnaW5TdGF0ZSA9IEluc3RhbGxlZFBsdWdpblN0YXRlO1xuXG4vKipcbiAqIFN1Z2dlc3RzIGluc3RhbGxpbmcgYW5vdGhlciBjb21tdW5pdHkgcGx1Z2luLCB2aWEgYSBsb2FkLXRpbWUgbm90aWNlIGFuZCBhIHNldHRpbmdzLXRhYiBiYW5uZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5TdWdnZXN0aW9uQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzU3VnZ2VzdGlvbkRlY2xpbmVkOiAoKSA9PiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpblNldHRpbmdzQ29tcG9uZW50OiBQaWNrPFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZTxvYmplY3Q+LCAnd2hlbkxvYWRlZEZyb21GaWxlJz47XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVhc29uOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldFN1Z2dlc3Rpb25EZWNsaW5lZDogKGlzRGVjbGluZWQ6IGJvb2xlYW4pID0+IFByb21pc2FibGU8dm9pZD47XG4gIHByaXZhdGUgcmVhZG9ubHkgc3VnZ2VzdGVkUGx1Z2luSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzdWdnZXN0ZWRQbHVnaW5OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBsdWdpblN1Z2dlc3Rpb25Db21wb25lbnR9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBQbHVnaW5TdWdnZXN0aW9uQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudDtcbiAgICB0aGlzLnJlYXNvbiA9IHBhcmFtcy5yZWFzb247XG4gICAgdGhpcy5zdWdnZXN0ZWRQbHVnaW5JZCA9IHBhcmFtcy5zdWdnZXN0ZWRQbHVnaW5JZDtcbiAgICB0aGlzLnN1Z2dlc3RlZFBsdWdpbk5hbWUgPSBwYXJhbXMuc3VnZ2VzdGVkUGx1Z2luTmFtZTtcbiAgICB0aGlzLmlzU3VnZ2VzdGlvbkRlY2xpbmVkID0gcGFyYW1zLmlzU3VnZ2VzdGlvbkRlY2xpbmVkO1xuICAgIHRoaXMuc2V0U3VnZ2VzdGlvbkRlY2xpbmVkID0gcGFyYW1zLnNldFN1Z2dlc3Rpb25EZWNsaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBob3cgdGhlIHN1Z2dlc3RlZCBwbHVnaW4gaXMgY3VycmVudGx5IHByZXNlbnQgaW4gdGhlIHZhdWx0LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIFN1Z2dlc3RlZFBsdWdpblN0YXRlfS5cbiAgICovXG4gIHB1YmxpYyBnZXRTdWdnZXN0ZWRQbHVnaW5TdGF0ZSgpOiBTdWdnZXN0ZWRQbHVnaW5TdGF0ZSB7XG4gICAgcmV0dXJuIGdldEluc3RhbGxlZFBsdWdpblN0YXRlKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5JZDogdGhpcy5zdWdnZXN0ZWRQbHVnaW5JZFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGxzICh3aGVuIG5lZWRlZCkgYW5kIGVuYWJsZXMgdGhlIHN1Z2dlc3RlZCBwbHVnaW4sIHJlcG9ydGluZyB0aGUgb3V0Y29tZSBhcyBhIG5vdGljZS5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBwbHVnaW4gaXMgZW5hYmxlZCwgb3Igb25jZSB0aGUgZmFpbHVyZSBoYXMgYmVlblxuICAgKiByZXBvcnRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbnN0YWxsQW5kRW5hYmxlU3VnZ2VzdGVkUGx1Z2luKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmdldFN1Z2dlc3RlZFBsdWdpblN0YXRlKCkgPT09IFN1Z2dlc3RlZFBsdWdpblN0YXRlLkVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBpbnN0YWxsQW5kRW5hYmxlUGx1Z2luKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5JZDogdGhpcy5zdWdnZXN0ZWRQbHVnaW5JZCxcbiAgICAgIHBsdWdpbk5hbWU6IHRoaXMuc3VnZ2VzdGVkUGx1Z2luTmFtZSxcbiAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnRcbiAgICB9KTtcblxuICAgIC8vIE9ubHkgYWZ0ZXIgdGhlIGluc3RhbGwgYWN0dWFsbHkgc3VjY2VlZGVkIOKAlCBgaW5zdGFsbEFuZEVuYWJsZVBsdWdpbmAgcmV0aHJvd3Mgb24gZmFpbHVyZSwgc28gYVxuICAgIC8vIGZhaWxlZCBhdHRlbXB0IGxlYXZlcyBhIHByZXZpb3VzIGRlY2xpbmUgc3RhbmRpbmcgcmF0aGVyIHRoYW4gc2lsZW50bHkgY2xlYXJpbmcgaXQuXG4gICAgYXdhaXQgdGhpcy5zZXRTdWdnZXN0aW9uRGVjbGluZWQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBjb21wb25lbnQsIHNob3dpbmcgdGhlIHN1Z2dlc3Rpb24gbm90aWNlIG9uY2UgdGhlIGxheW91dCBpcyByZWFkeSBBTkQgdGhlIGhvc3QncyBzZXR0aW5nc1xuICAgKiBoYXZlIGJlZW4gcmVhZCBmcm9tIGRpc2suXG4gICAqXG4gICAqIEJvdGggd2FpdHMgbWF0dGVyLCBhbmQgbmVpdGhlciBpbXBsaWVzIHRoZSBvdGhlcjpcbiAgICpcbiAgICogLSBMYXlvdXQtcmVhZHksIGJlY2F1c2UgcGx1Z2lucyBsb2FkIGluIGFuIHVuc3BlY2lmaWVkIG9yZGVyLCBzbyB0aGUgc3VnZ2VzdGVkIHBsdWdpbiBtYXkgd2VsbCBiZVxuICAgKiAgIGVuYWJsZWQgYSBtb21lbnQgYWZ0ZXIgdGhpcyBvbmUuIENoZWNraW5nIGVhcmxpZXIgd291bGQgc3VnZ2VzdCBpbnN0YWxsaW5nIHNvbWV0aGluZyB0aGUgdXNlclxuICAgKiAgIGFscmVhZHkgaGFzLlxuICAgKiAtIFNldHRpbmdzLWxvYWRlZCwgYmVjYXVzZSB7QGxpbmsgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zLmlzU3VnZ2VzdGlvbkRlY2xpbmVkfVxuICAgKiAgIHJlYWRzIGEgc2V0dGluZyBvZiB0aGUgaG9zdCwgYW5kIHRoZSBob3N0J3Mgc2V0dGluZ3MgY29tcG9uZW50IGlzIGEgU0lCTElORyB3aG9zZSBvd24gYXN5bmMgbG9hZCBpc1xuICAgKiAgIHN0aWxsIGluIGZsaWdodCBoZXJlLiBPbiBhIGxheW91dCB0aGF0IGlzIGFscmVhZHkgcmVhZHkg4oCUIGEgcnVudGltZSBlbmFibGUgZnJvbSB0aGUgQ29tbXVuaXR5XG4gICAqICAgUGx1Z2lucyB0YWIsIG9yIGEgcmUtZW5hYmxlIGFmdGVyIGFuIHVwZGF0ZSDigJQgdGhlIGxheW91dC1yZWFkeSBjYWxsYmFjayBmaXJlcyBpbW1lZGlhdGVseSwgc28gdGhlXG4gICAqICAgcmVhZCB3b3VsZCBzZWUgdGhlIGRlZmF1bHQgYGZhbHNlYCBhbmQgYXNrIGFnYWluIGEgdXNlciB3aG8gaGFzIGFscmVhZHkgZGVjbGluZWQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHRoaXMuYWRkQ2hpbGQoXG4gICAgICBuZXcgQ2FsbGJhY2tMYXlvdXRSZWFkeUNvbXBvbmVudCh0aGlzLmFwcCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnBsdWdpblNldHRpbmdzQ29tcG9uZW50LndoZW5Mb2FkZWRGcm9tRmlsZSgpO1xuICAgICAgICBpZiAodGhpcy5pc1VubG9hZGVkKCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNob3dTdWdnZXN0aW9uTm90aWNlKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgc3VnZ2VzdGlvbiBiYW5uZXIgaW50byBhIHNldHRpbmdzLXRhYiBjb250YWluZXIsIHdpdGggYSBidXR0b24gdGhhdCBpbnN0YWxscyBhbmQgZW5hYmxlc1xuICAgKiB0aGUgc3VnZ2VzdGVkIHBsdWdpbi5cbiAgICpcbiAgICogUmVuZGVycyBub3RoaW5nIHdoZW4gdGhlIHN1Z2dlc3RlZCBwbHVnaW4gaXMgYWxyZWFkeSBlbmFibGVkLiBVbmxpa2UgdGhlIG5vdGljZSwgdGhlIGJhbm5lciBpZ25vcmVzIGFcbiAgICogcHJldmlvdXMgZGVjbGluZSDigJQgdGhlIHVzZXIgaXMgbG9va2luZyBhdCB0aGVzZSBzZXR0aW5ncyByaWdodCBub3csIHdoaWNoIGlzIGEgZnJlc2hlciBzaWduYWwgdGhhbiBhblxuICAgKiBhbnN3ZXIgdGhleSBnYXZlIGVhcmxpZXIuXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXJFbCAtIFRoZSBlbGVtZW50IHRvIHJlbmRlciB0aGUgYmFubmVyIGludG8uXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyQmFubmVyKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZXRTdWdnZXN0ZWRQbHVnaW5TdGF0ZSgpO1xuICAgIGlmIChzdGF0ZSA9PT0gU3VnZ2VzdGVkUGx1Z2luU3RhdGUuRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJhbm5lckVsID0gY29udGFpbmVyRWwuY3JlYXRlRGl2KHtcbiAgICAgIGNsczogW0Nzc0NsYXNzLkxpYnJhcnlOYW1lLCBDc3NDbGFzcy5MZWdhY3lMaWJyYXJ5TmFtZSwgQ3NzQ2xhc3MuUGx1Z2luU3VnZ2VzdGlvbkJhbm5lcl1cbiAgICB9KTtcbiAgICBhcHBlbmRUZXh0T3JGcmFnbWVudENsb25lKGJhbm5lckVsLmNyZWF0ZURpdigpLCB0aGlzLnJlYXNvbik7XG5cbiAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgLnNldEJ1dHRvblRleHQodGhpcy5nZXRBY3Rpb25CdXR0b25UZXh0KHN0YXRlKSlcbiAgICAgIC5zZXRDdGEoKVxuICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbnN0YWxsQW5kRW5hYmxlU3VnZ2VzdGVkUGx1Z2luKCk7XG4gICAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGdldEFjdGlvbkJ1dHRvblRleHQoc3RhdGU6IFN1Z2dlc3RlZFBsdWdpblN0YXRlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdCgoJCkgPT5cbiAgICAgIHN0YXRlID09PSBTdWdnZXN0ZWRQbHVnaW5TdGF0ZS5JbnN0YWxsZWRCdXREaXNhYmxlZFxuICAgICAgICA/ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5TdWdnZXN0aW9uLmVuYWJsZVxuICAgICAgICA6ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5TdWdnZXN0aW9uLmluc3RhbGxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93U3VnZ2VzdGlvbk5vdGljZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2V0U3VnZ2VzdGVkUGx1Z2luU3RhdGUoKTtcbiAgICBpZiAoc3RhdGUgPT09IFN1Z2dlc3RlZFBsdWdpblN0YXRlLkVuYWJsZWQgfHwgdGhpcy5pc1N1Z2dlc3Rpb25EZWNsaW5lZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgoZnJhZ21lbnRFbCkgPT4ge1xuICAgICAgYXBwZW5kVGV4dE9yRnJhZ21lbnRDbG9uZShmcmFnbWVudEVsLmNyZWF0ZURpdigpLCB0aGlzLnJlYXNvbik7XG4gICAgICBjb25zdCBidXR0b25zRWwgPSBmcmFnbWVudEVsLmNyZWF0ZURpdih7XG4gICAgICAgIGNsczogW0Nzc0NsYXNzLkxpYnJhcnlOYW1lLCBDc3NDbGFzcy5MZWdhY3lMaWJyYXJ5TmFtZSwgQ3NzQ2xhc3MuUGx1Z2luU3VnZ2VzdGlvbk5vdGljZUJ1dHRvbnNdXG4gICAgICB9KTtcblxuICAgICAgbmV3IEJ1dHRvbkNvbXBvbmVudChidXR0b25zRWwpXG4gICAgICAgIC5zZXRCdXR0b25UZXh0KHRoaXMuZ2V0QWN0aW9uQnV0dG9uVGV4dChzdGF0ZSkpXG4gICAgICAgIC5zZXRDdGEoKVxuICAgICAgICAub25DbGljayhjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMuaW5zdGFsbEFuZEVuYWJsZVN1Z2dlc3RlZFBsdWdpbigpO1xuICAgICAgICB9KSk7XG5cbiAgICAgIG5ldyBCdXR0b25Db21wb25lbnQoYnV0dG9uc0VsKVxuICAgICAgICAuc2V0QnV0dG9uVGV4dCh0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucGx1Z2luU3VnZ2VzdGlvbi5ub3ROb3cpKVxuICAgICAgICAub25DbGljayhjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMuc2V0U3VnZ2VzdGlvbkRlY2xpbmVkKHRydWUpO1xuICAgICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKGZyYWdtZW50LCB7IHNob3VsZEhpZGVPbkNsaWNrOiBmYWxzZSB9KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQStCQSxTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLHVCQUF1QjtBQUtoQyxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLGlDQUFpQztBQUMxQyxTQUFTLFNBQVM7QUFDbEI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxtQkFBbUI7QUFDNUIsU0FBUyxvQ0FBb0M7QUFTdEMsTUFBTSx1QkFBdUI7QUE2RTdCLE1BQU0sa0NBQWtDLFlBQVk7QUFBQSxFQUN4QztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVixZQUFZLFFBQW9EO0FBQ3JFLFVBQU07QUFDTixTQUFLLE1BQU0sT0FBTztBQUNsQixTQUFLLHdCQUF3QixPQUFPO0FBQ3BD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
|
|
@@ -192,6 +192,11 @@ export declare enum CssClass {
|
|
|
192
192
|
* A CSS class for the banner a plugin-suggestion renders into a settings tab.
|
|
193
193
|
*/
|
|
194
194
|
PluginSuggestionBanner = "plugin-suggestion-banner",
|
|
195
|
+
/**
|
|
196
|
+
* A CSS class for the row of buttons in a plugin-suggestion notice, which spaces the action button apart from
|
|
197
|
+
* the decline button.
|
|
198
|
+
*/
|
|
199
|
+
PluginSuggestionNoticeButtons = "plugin-suggestion-notice-buttons",
|
|
195
200
|
/**
|
|
196
201
|
* A CSS class for the popover.
|
|
197
202
|
*/
|